(* * Hedgewars, a free turn based strategy game * Copyright (c) 2004-2019 Andrey Korotaev <unC0Rr@gmail.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *)unit uKeyNames;interfaceuses uConsts;type TKeyNames = array [0..cKeyMaxIndex] of string[15];procedure populateKeyNames(var KeyArray: TKeyNames);// procedure generateKeyNames(); // DEBUG (see below)implementationuses uPhysFSLayer, uUtils, uVariables, uTypes, uConsole;procedure populateKeyNames(var KeyArray: TKeyNames);var f: PfsFile; l, keyname, tmp: shortstring; i, scancode: LongInt;begin(* KeyArray is a mapping from SDL scancodes to Hedgewars key identifiers. Hedgewars key identifiers are strings with a maximum length of 15 and are used internally to identify keys in the engine and in settings.ini.*)(* Key identifiers are read from an RFC 4180-compliant CSV file.- 1st column: SDL scancode- 2nd column: Hedgewars key ID *)if pfsExists(cPathz[ptMisc]+'/keys.csv') then begin f:= pfsOpenRead(cPathz[ptMisc]+'/keys.csv'); l:= ''; pfsReadLn(f, l); while (not pfsEOF(f)) and (l <> '') do begin tmp:= ''; i:= 1; while (i <= length(l)) and (l[i] <> ',') do begin tmp:= tmp + l[i]; inc(i) end; scancode:= StrToInt(tmp); if i < length(l) then begin keyname:= copy(l, i + 1, length(l) - i); if (keyname[1] = '"') and (keyname[length(keyname)] = '"') then keyname:= copy(keyname, 2, length(keyname) - 2) else keyname:= copy(keyname, 1, length(keyname) - 1); end; pfsReadLn(f, l); KeyArray[scancode]:= keyname; end; pfsClose(f) endelse begin WriteLnToConsole('misc/keys.csv file not found'); AddFileLog('misc/keys.csv file not found'); halt(haltStartupError); end;// generateKeyNames(); // DEBUG (see below)end;(*The Hedgewars key identifiers were obtained with the following algorithm:Basically:- For each SDL scancode, do: - Take the printable SDL scancode key name (with SDL_GetScancodeName) - Replace spaces with underscores - Lowercase it - Cap string length to 15 characters- Manually fix duplicatesSee also:https://wiki.libsdl.org/SDLScancodeLookuphttps://wiki.libsdl.org/SDL_ScancodeNOTE: For compability reasons, existing identifiers should not be renamed.*)(* DEBUG Uncomment this to generate a list of key names in CSV format (RFC 4180) and print it out on console. Don't forget to fix duplicates! *)(*procedure generateKeyNames();var i, t: LongInt;s, s2: shortstring;begin for i := 0 to cKeyMaxIndex - 5 do begin s := shortstring(SDL_GetScancodeName(TSDL_Scancode(i))); for t := 1 to Length(s) do if s[t] = ' ' then s[t] := '_'; s2:= copy(s, 1, 15); if s2 = '"' then WriteLnToConsole(IntToStr(i)+',"\""') else if s2 <> '' then WriteLnToConsole(IntToStr(i)+',"'+LowerCase(s2)+'"'); end;end;*)end.