# HG changeset patch # User Xeli # Date 1335618232 -7200 # Node ID a61458a8148017d32592d6aac32be35bb35b770f # Parent 4c2dd25630a7de1d757dc6d98220d1e79bd1ea0f changed uKeys to uInputHandler to better reflect its function diff -r 4c2dd25630a7 -r a61458a81480 hedgewars/CMakeLists.txt --- a/hedgewars/CMakeLists.txt Sun Apr 29 14:00:35 2012 +0200 +++ b/hedgewars/CMakeLists.txt Sat Apr 28 15:03:52 2012 +0200 @@ -35,7 +35,7 @@ uGears.pas uGearsRender.pas uIO.pas - uKeys.pas + uInputHandler.pas uLand.pas uLandGenMaze.pas uLandGraphics.pas diff -r 4c2dd25630a7 -r a61458a81480 hedgewars/PascalExports.pas --- a/hedgewars/PascalExports.pas Sun Apr 29 14:00:35 2012 +0200 +++ b/hedgewars/PascalExports.pas Sat Apr 28 15:03:52 2012 +0200 @@ -28,7 +28,7 @@ * http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl *) interface -uses uTypes, uConsts, uVariables, GLunit, uKeys, uSound, uAmmos, uUtils, uCommands; +uses uTypes, uConsts, uVariables, GLunit, uInputHandler, uSound, uAmmos, uUtils, uCommands; {$INCLUDE "config.inc"} procedure HW_versionInfo(netProto: PLongInt; versionStr: PPChar); cdecl; export; @@ -118,7 +118,7 @@ procedure HW_allKeysUp; cdecl; export; begin // set all keys to released - uKeys.initModule; + uInputHandler.initModule; end; procedure HW_walkLeft; cdecl; export; diff -r 4c2dd25630a7 -r a61458a81480 hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Sun Apr 29 14:00:35 2012 +0200 +++ b/hedgewars/hwengine.pas Sat Apr 28 15:03:52 2012 +0200 @@ -29,7 +29,7 @@ program hwengine; {$ENDIF} -uses SDLh, uMisc, uConsole, uGame, uConsts, uLand, uAmmos, uVisualGears, uGears, uStore, uWorld, uKeys, uSound, +uses SDLh, uMisc, uConsole, uGame, uConsts, uLand, uAmmos, uVisualGears, uGears, uStore, uWorld, uInputHandler, uSound, uScript, uTeams, uStats, uIO, uLocale, uChat, uAI, uAIMisc, uRandom, uLandTexture, uCollisions, sysutils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted {$IFDEF SDL13}, uTouch{$ENDIF}{$IFDEF ANDROID}, GLUnit{$ENDIF}; @@ -449,7 +449,7 @@ //uFloat does not need initialization //uGame does not need initialization uGears.initModule; - uKeys.initModule; + uInputHandler.initModule; //uLandGraphics does not need initialization //uLandObjects does not need initialization //uLandTemplates does not need initialization @@ -485,7 +485,7 @@ uLandTexture.freeModule; //uLandObjects does not need to be freed //uLandGraphics does not need to be freed - uKeys.freeModule; //stub + uInputHandler.freeModule; //stub uGears.freeModule; //uGame does not need to be freed //uFloat does not need to be freed diff -r 4c2dd25630a7 -r a61458a81480 hedgewars/uChat.pas --- a/hedgewars/uChat.pas Sun Apr 29 14:00:35 2012 +0200 +++ b/hedgewars/uChat.pas Sat Apr 28 15:03:52 2012 +0200 @@ -31,7 +31,7 @@ procedure KeyPressChat(Key: Longword); implementation -uses SDLh, uKeys, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO; +uses SDLh, uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO; const MaxStrIndex = 27; diff -r 4c2dd25630a7 -r a61458a81480 hedgewars/uGame.pas --- a/hedgewars/uGame.pas Sun Apr 29 14:00:35 2012 +0200 +++ b/hedgewars/uGame.pas Sat Apr 28 15:03:52 2012 +0200 @@ -26,7 +26,7 @@ //////////////////// implementation //////////////////// -uses uKeys, uTeams, uIO, uAI, uGears, uSound, uMobile, uVisualGears, uTypes, uVariables{$IFDEF SDL13}, uTouch{$ENDIF}; +uses uInputHandler, uTeams, uIO, uAI, uGears, uSound, uMobile, uVisualGears, uTypes, uVariables{$IFDEF SDL13}, uTouch{$ENDIF}; procedure DoGameTick(Lag: LongInt); var i: LongInt; diff -r 4c2dd25630a7 -r a61458a81480 hedgewars/uInputHandler.pas --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hedgewars/uInputHandler.pas Sat Apr 28 15:03:52 2012 +0200 @@ -0,0 +1,485 @@ +(* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2004-2012 Andrey Korotaev + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + *) + +{$INCLUDE "options.inc"} + +unit uInputHandler; +interface +uses SDLh, uTypes; + +procedure initModule; +procedure freeModule; + +function KeyNameToCode(name: shortstring): word; +procedure ProcessKbd; +procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean); +procedure ProcessKey(event: TSDL_KeyboardEvent); +procedure ResetKbd; +procedure FreezeEnterKey; +procedure InitKbdKeyTable; + +procedure SetBinds(var binds: TBinds); +procedure SetDefaultBinds; + +procedure ControllerInit; +procedure ControllerClose; +procedure ControllerAxisEvent(joy, axis: Byte; value: Integer); +procedure ControllerHatEvent(joy, hat, value: Byte); +procedure ControllerButtonEvent(joy, button: Byte; pressed: Boolean); + +implementation +uses uConsole, uCommands, uMisc, uVariables, uConsts, uUtils, uDebug; + +var tkbd, tkbdn: TKeyboardState; + quitKeyCode: Byte; + KeyNames: array [0..cKeyMaxIndex] of string[15]; + + +function KeyNameToCode(name: shortstring): word; +var code: Word; +begin + name:= LowerCase(name); + code:= cKeyMaxIndex; + while (code > 0) and (KeyNames[code] <> name) do dec(code); + KeyNameToCode:= code; +end; + +procedure ProcessKbd; +var i, j, k: LongInt; + s: shortstring; + Trusted: boolean; + pkbd: PByteArray; +begin + +// move cursor/camera +// TODO: Scale on screen dimensions and/or axis value (game controller)? +//TODO what is this for? +movecursor(5 * CursorMovementX, 5 * CursorMovementY); + + +{$IFNDEF MOBILE} + +//TODO reimplement +// Controller(s) +k:= j; // should we test k for hitting the limit? sounds rather unlikely to ever reach it +for j:= 0 to Pred(ControllerNumControllers) do + begin + for i:= 0 to Pred(ControllerNumAxes[j]) do + begin + if ControllerAxes[j][i] > 20000 then + tkbdn[k + 0]:= 1 + else + tkbdn[k + 0]:= 0; + if ControllerAxes[j][i] < -20000 then + tkbdn[k + 1]:= 1 + else + tkbdn[k + 1]:= 0; + inc(k, 2); + end; + for i:= 0 to Pred(ControllerNumHats[j]) do + begin + tkbdn[k + 0]:= ControllerHats[j][i] and SDL_HAT_UP; + tkbdn[k + 1]:= ControllerHats[j][i] and SDL_HAT_RIGHT; + tkbdn[k + 2]:= ControllerHats[j][i] and SDL_HAT_DOWN; + tkbdn[k + 3]:= ControllerHats[j][i] and SDL_HAT_LEFT; + inc(k, 4); + end; + for i:= 0 to Pred(ControllerNumButtons[j]) do + begin + tkbdn[k]:= ControllerButtons[j][i]; + inc(k, 1); + end; + end; +{$ENDIF} + +end; + + +procedure ProcessKey(code: LongInt; KeyDown: boolean); +var + Trusted: boolean; + s : string; +begin +hideAmmoMenu:= false; +Trusted:= (CurrentTeam <> nil) + and (not CurrentTeam^.ExtDriven) + and (CurrentHedgehog^.BotLevel = 0); + +tkbdn[code]:= ord(KeyDown); + +// ctrl/cmd + q to close engine and frontend +if(KeyDown and (code = quitKeyCode)) then + begin +{$IFDEF DARWIN} + if ((tkbdn[KeyNameToCode('left_meta')] = 1) or (tkbdn[KeyNameToCode('right_meta')] = 1)) then +{$ELSE} + if ((tkbdn[KeyNameToCode('left_ctrl')] = 1) or (tkbdn[KeyNameToCode('right_ctrl')] = 1)) then +{$ENDIF} + ParseCommand('halt', true); + end; + +if CurrentBinds[code][0] <> #0 then + begin + if (code > 3) and (tkbdn[code] <> 0) and not ((CurrentBinds[code] = 'put') or (CurrentBinds[code] = 'ammomenu') or (CurrentBinds[code] = '+cur_u') or (CurrentBinds[code] = '+cur_d') or (CurrentBinds[code] = '+cur_l') or (CurrentBinds[code] = '+cur_r')) then hideAmmoMenu:= true; + if (tkbd[code] = 0) and (tkbdn[code] <> 0) then + begin + ParseCommand(CurrentBinds[code], Trusted); + if (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) and (ReadyTimeLeft > 1) then + ParseCommand('gencmd R', true) + end + else if (CurrentBinds[code][1] = '+') and (tkbdn[code] = 0) and (tkbd[code] <> 0) then + begin + s:= CurrentBinds[code]; + s[1]:= '-'; + ParseCommand(s, Trusted); + if (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) and (ReadyTimeLeft > 1) then + ParseCommand('gencmd R', true) + end; + tkbd[code]:= tkbdn[code] + end + +end; + +procedure ProcessKey(event: TSDL_KeyboardEvent); +begin + ProcessKey(event.keysym.sym, event.type_ = SDL_KEYDOWN); +end; + +procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean); +begin +case event.button of + SDL_BUTTON_LEFT: + ProcessKey(KeyNameToCode('mousel'), ButtonDown); + SDL_BUTTON_MIDDLE: + ProcessKey(KeyNameToCode('mousem'), ButtonDown); + SDL_BUTTON_RIGHT: + ProcessKey(KeyNameToCode('mouser'), ButtonDown); + SDL_BUTTON_WHEELDOWN: + ProcessKey(KeyNameToCode('wheeldown'), ButtonDown); + SDL_BUTTON_WHEELUP: + ProcessKey(KeyNameToCode('wheelup'), ButtonDown); + end; +end; + +procedure ResetKbd; +var j, k, t: LongInt; + i: LongInt; + pkbd: PByteArray; +begin + +k:= SDL_GetMouseState(nil, nil); +pkbd:=SDL_GetKeyState(@j); + +//TryDo(j < cKeyMaxIndex, 'SDL keys number is more than expected (' + IntToStr(j) + ')', true); + +for i:= 1 to pred(j) do + tkbdn[i]:= pkbd^[i]; + +{$IFNDEF MOBILE} +// Controller(s) +k:= j; // should we test k for hitting the limit? sounds rather unlikely to ever reach it +for j:= 0 to Pred(ControllerNumControllers) do + begin + for i:= 0 to Pred(ControllerNumAxes[j]) do + begin + if ControllerAxes[j][i] > 20000 then + tkbdn[k + 0]:= 1 + else + tkbdn[k + 0]:= 0; + if ControllerAxes[j][i] < -20000 then + tkbdn[k + 1]:= 1 + else + tkbdn[k + 1]:= 0; + inc(k, 2); + end; + for i:= 0 to Pred(ControllerNumHats[j]) do + begin + tkbdn[k + 0]:= ControllerHats[j][i] and SDL_HAT_UP; + tkbdn[k + 1]:= ControllerHats[j][i] and SDL_HAT_RIGHT; + tkbdn[k + 2]:= ControllerHats[j][i] and SDL_HAT_DOWN; + tkbdn[k + 3]:= ControllerHats[j][i] and SDL_HAT_LEFT; + inc(k, 4); + end; + for i:= 0 to Pred(ControllerNumButtons[j]) do + begin + tkbdn[k]:= ControllerButtons[j][i]; + inc(k, 1); + end; + end; +{$ENDIF} + +// what is this final loop for? +for t:= 0 to cKeyMaxIndex do + tkbd[t]:= tkbdn[t] +end; + +procedure InitKbdKeyTable; +var i, j, k, t: LongInt; + s: string[15]; +begin +//TODO in sdl13 this overrides some values (A and B) change indices to some other values at the back perhaps? +KeyNames[1]:= 'mousel'; +KeyNames[2]:= 'mousem'; +KeyNames[3]:= 'mouser'; +KeyNames[4]:= 'wheelup'; +KeyNames[5]:= 'wheeldown'; + +for i:= 6 to cKeyMaxIndex do + begin +{$IFDEF SDL13} + s:= shortstring(SDL_GetScancodeName(i)); +{$ELSE} + s:= shortstring(sdl_getkeyname(i)); +{$ENDIF} + WriteToConsole(IntToStr(i) + ': ' + s + ' ' + IntToStr(cKeyMaxIndex)); + if s = 'unknown key' then KeyNames[i]:= '' + else + begin + for t:= 1 to Length(s) do + if s[t] = ' ' then + s[t]:= '_'; + KeyNames[i]:= LowerCase(s) + end; + end; + +quitKeyCode:= KeyNameToCode('q'); + +// get the size of keyboard array +SDL_GetKeyState(@k); + +// Controller(s) +for j:= 0 to Pred(ControllerNumControllers) do + begin + for i:= 0 to Pred(ControllerNumAxes[j]) do + begin + keynames[k + 0]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'u'; + keynames[k + 1]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'd'; + inc(k, 2); + end; + for i:= 0 to Pred(ControllerNumHats[j]) do + begin + keynames[k + 0]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'u'; + keynames[k + 1]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'r'; + keynames[k + 2]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'd'; + keynames[k + 3]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'l'; + inc(k, 4); + end; + for i:= 0 to Pred(ControllerNumButtons[j]) do + begin + keynames[k]:= 'j' + IntToStr(j) + 'b' + IntToStr(i); + inc(k, 1); + end; + end; + +DefaultBinds[KeyNameToCode('escape')]:= 'quit'; +DefaultBinds[KeyNameToCode('grave')]:= 'history'; +DefaultBinds[KeyNameToCode('delete')]:= 'rotmask'; + +//numpad +//DefaultBinds[265]:= '+volup'; +//DefaultBinds[256]:= '+voldown'; + +DefaultBinds[KeyNameToCode('0')]:= '+volup'; +DefaultBinds[KeyNameToCode('9')]:= '+voldown'; +DefaultBinds[KeyNameToCode('c')]:= 'capture'; +DefaultBinds[KeyNameToCode('h')]:= 'findhh'; +DefaultBinds[KeyNameToCode('p')]:= 'pause'; +DefaultBinds[KeyNameToCode('s')]:= '+speedup'; +DefaultBinds[KeyNameToCode('t')]:= 'chat'; +DefaultBinds[KeyNameToCode('y')]:= 'confirm'; + +DefaultBinds[KeyNameToCode('mousem')]:= 'zoomreset'; +DefaultBinds[KeyNameToCode('wheelup')]:= 'zoomout'; +DefaultBinds[KeyNameToCode('wheeldown')]:= 'zoomin'; + +DefaultBinds[KeyNameToCode('f12')]:= 'fullscr'; + + +DefaultBinds[KeyNameToCode('mousel')]:= '/put'; +DefaultBinds[KeyNameToCode('mouser')]:= 'ammomenu'; +DefaultBinds[KeyNameToCode('backspace')]:= 'hjump'; +DefaultBinds[KeyNameToCode('tab')]:= 'switch'; +DefaultBinds[KeyNameToCode('return')]:= 'ljump'; +DefaultBinds[KeyNameToCode('space')]:= '+attack'; +DefaultBinds[KeyNameToCode('up')]:= '+up'; +DefaultBinds[KeyNameToCode('down')]:= '+down'; +DefaultBinds[KeyNameToCode('left')]:= '+left'; +DefaultBinds[KeyNameToCode('right')]:= '+right'; +DefaultBinds[KeyNameToCode('left_shift')]:= '+precise'; + +for i:= 1 to 10 do DefaultBinds[KeyNameToCode('f'+IntToStr(i))]:= 'slot '+IntToStr(i); +for i:= 1 to 5 do DefaultBinds[KeyNameToCode(IntToStr(i))]:= 'timer '+IntToStr(i); + +SetDefaultBinds(); +end; + +procedure SetBinds(var binds: TBinds); +begin +{$IFDEF MOBILE} + binds:= binds; // avoid hint + CurrentBinds:= DefaultBinds; +{$ELSE} + CurrentBinds:= binds; +{$ENDIF} +end; + +procedure SetDefaultBinds; +begin + CurrentBinds:= DefaultBinds; +end; + +procedure FreezeEnterKey; +begin + tkbd[3]:= 1; + tkbd[13]:= 1; + tkbd[27]:= 1; + tkbd[271]:= 1; +end; + +var Controller: array [0..5] of PSDL_Joystick; + +procedure ControllerInit; +var i, j: Integer; +begin +ControllerEnabled:= 0; +{$IFDEF MOBILE} +exit; // joystick subsystem disabled on iPhone +{$ENDIF} + +SDL_InitSubSystem(SDL_INIT_JOYSTICK); +ControllerNumControllers:= SDL_NumJoysticks(); + +if ControllerNumControllers > 6 then + ControllerNumControllers:= 6; + +WriteLnToConsole('Number of game controllers: ' + IntToStr(ControllerNumControllers)); + +if ControllerNumControllers > 0 then + begin + for j:= 0 to pred(ControllerNumControllers) do + begin + WriteLnToConsole('Using game controller: ' + SDL_JoystickName(j)); + Controller[j]:= SDL_JoystickOpen(j); + if Controller[j] = nil then + WriteLnToConsole('* Failed to open game controller!') + else + begin + ControllerNumAxes[j]:= SDL_JoystickNumAxes(Controller[j]); + //ControllerNumBalls[j]:= SDL_JoystickNumBalls(Controller[j]); + ControllerNumHats[j]:= SDL_JoystickNumHats(Controller[j]); + ControllerNumButtons[j]:= SDL_JoystickNumButtons(Controller[j]); + WriteLnToConsole('* Number of axes: ' + IntToStr(ControllerNumAxes[j])); + //WriteLnToConsole('* Number of balls: ' + IntToStr(ControllerNumBalls[j])); + WriteLnToConsole('* Number of hats: ' + IntToStr(ControllerNumHats[j])); + WriteLnToConsole('* Number of buttons: ' + IntToStr(ControllerNumButtons[j])); + ControllerEnabled:= 1; + + if ControllerNumAxes[j] > 20 then + ControllerNumAxes[j]:= 20; + //if ControllerNumBalls[j] > 20 then ControllerNumBalls[j]:= 20; + + if ControllerNumHats[j] > 20 then + ControllerNumHats[j]:= 20; + + if ControllerNumButtons[j] > 20 then + ControllerNumButtons[j]:= 20; + + // reset all buttons/axes + for i:= 0 to pred(ControllerNumAxes[j]) do + ControllerAxes[j][i]:= 0; + (*for i:= 0 to pred(ControllerNumBalls[j]) do + begin + ControllerBalls[j][i][0]:= 0; + ControllerBalls[j][i][1]:= 0; + end;*) + for i:= 0 to pred(ControllerNumHats[j]) do + ControllerHats[j][i]:= SDL_HAT_CENTERED; + for i:= 0 to pred(ControllerNumButtons[j]) do + ControllerButtons[j][i]:= 0; + end; + end; + // enable event generation/controller updating + SDL_JoystickEventState(1); + end +else + WriteLnToConsole('Not using any game controller'); +end; + +procedure ControllerClose; +var j: Integer; +begin + if ControllerEnabled > 0 then + for j:= 0 to pred(ControllerNumControllers) do + SDL_JoystickClose(Controller[j]); +end; + +procedure ControllerAxisEvent(joy, axis: Byte; value: Integer); +begin + ControllerAxes[joy][axis]:= value; +end; + +procedure ControllerHatEvent(joy, hat, value: Byte); +begin + ControllerHats[joy][hat]:= value; +end; + +procedure ControllerButtonEvent(joy, button: Byte; pressed: Boolean); +begin + if pressed then + ControllerButtons[joy][button]:= 1 + else + ControllerButtons[joy][button]:= 0; +end; + +procedure initModule; +begin + wheelUp:= false; + wheelDown:= false; +{$IFDEF HWLIBRARY} + // this function is called by HW_allKeysUp so be careful + + // mouse emulation + leftClick:= false; + middleClick:= false; + rightClick:= false; + + // arrow key emulation + upKey:= false; + downKey:= false; + rightKey:= false; + leftKey:= false; + preciseKey:= false; + + // action key emulation + backspaceKey:= false; + spaceKey:= false; + enterKey:= false; + tabKey:= false; + + // other key emulation + chatAction:= false; + pauseAction:= false; +{$ENDIF} +end; + +procedure freeModule; +begin + +end; + +end. diff -r 4c2dd25630a7 -r a61458a81480 hedgewars/uKeys.pas --- a/hedgewars/uKeys.pas Sun Apr 29 14:00:35 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,485 +0,0 @@ -(* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2004-2012 Andrey Korotaev - * - * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - *) - -{$INCLUDE "options.inc"} - -unit uKeys; -interface -uses SDLh, uTypes; - -procedure initModule; -procedure freeModule; - -function KeyNameToCode(name: shortstring): word; -procedure ProcessKbd; -procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean); -procedure ProcessKey(event: TSDL_KeyboardEvent); -procedure ResetKbd; -procedure FreezeEnterKey; -procedure InitKbdKeyTable; - -procedure SetBinds(var binds: TBinds); -procedure SetDefaultBinds; - -procedure ControllerInit; -procedure ControllerClose; -procedure ControllerAxisEvent(joy, axis: Byte; value: Integer); -procedure ControllerHatEvent(joy, hat, value: Byte); -procedure ControllerButtonEvent(joy, button: Byte; pressed: Boolean); - -implementation -uses uConsole, uCommands, uMisc, uVariables, uConsts, uUtils, uDebug; - -var tkbd, tkbdn: TKeyboardState; - quitKeyCode: Byte; - KeyNames: array [0..cKeyMaxIndex] of string[15]; - - -function KeyNameToCode(name: shortstring): word; -var code: Word; -begin - name:= LowerCase(name); - code:= cKeyMaxIndex; - while (code > 0) and (KeyNames[code] <> name) do dec(code); - KeyNameToCode:= code; -end; - -procedure ProcessKbd; -var i, j, k: LongInt; - s: shortstring; - Trusted: boolean; - pkbd: PByteArray; -begin - -// move cursor/camera -// TODO: Scale on screen dimensions and/or axis value (game controller)? -//TODO what is this for? -movecursor(5 * CursorMovementX, 5 * CursorMovementY); - - -{$IFNDEF MOBILE} - -//TODO reimplement -// Controller(s) -k:= j; // should we test k for hitting the limit? sounds rather unlikely to ever reach it -for j:= 0 to Pred(ControllerNumControllers) do - begin - for i:= 0 to Pred(ControllerNumAxes[j]) do - begin - if ControllerAxes[j][i] > 20000 then - tkbdn[k + 0]:= 1 - else - tkbdn[k + 0]:= 0; - if ControllerAxes[j][i] < -20000 then - tkbdn[k + 1]:= 1 - else - tkbdn[k + 1]:= 0; - inc(k, 2); - end; - for i:= 0 to Pred(ControllerNumHats[j]) do - begin - tkbdn[k + 0]:= ControllerHats[j][i] and SDL_HAT_UP; - tkbdn[k + 1]:= ControllerHats[j][i] and SDL_HAT_RIGHT; - tkbdn[k + 2]:= ControllerHats[j][i] and SDL_HAT_DOWN; - tkbdn[k + 3]:= ControllerHats[j][i] and SDL_HAT_LEFT; - inc(k, 4); - end; - for i:= 0 to Pred(ControllerNumButtons[j]) do - begin - tkbdn[k]:= ControllerButtons[j][i]; - inc(k, 1); - end; - end; -{$ENDIF} - -end; - - -procedure ProcessKey(code: LongInt; KeyDown: boolean); -var - Trusted: boolean; - s : string; -begin -hideAmmoMenu:= false; -Trusted:= (CurrentTeam <> nil) - and (not CurrentTeam^.ExtDriven) - and (CurrentHedgehog^.BotLevel = 0); - -tkbdn[code]:= ord(KeyDown); - -// ctrl/cmd + q to close engine and frontend -if(KeyDown and (code = quitKeyCode)) then - begin -{$IFDEF DARWIN} - if ((tkbdn[KeyNameToCode('left_meta')] = 1) or (tkbdn[KeyNameToCode('right_meta')] = 1)) then -{$ELSE} - if ((tkbdn[KeyNameToCode('left_ctrl')] = 1) or (tkbdn[KeyNameToCode('right_ctrl')] = 1)) then -{$ENDIF} - ParseCommand('halt', true); - end; - -if CurrentBinds[code][0] <> #0 then - begin - if (code > 3) and (tkbdn[code] <> 0) and not ((CurrentBinds[code] = 'put') or (CurrentBinds[code] = 'ammomenu') or (CurrentBinds[code] = '+cur_u') or (CurrentBinds[code] = '+cur_d') or (CurrentBinds[code] = '+cur_l') or (CurrentBinds[code] = '+cur_r')) then hideAmmoMenu:= true; - if (tkbd[code] = 0) and (tkbdn[code] <> 0) then - begin - ParseCommand(CurrentBinds[code], Trusted); - if (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) and (ReadyTimeLeft > 1) then - ParseCommand('gencmd R', true) - end - else if (CurrentBinds[code][1] = '+') and (tkbdn[code] = 0) and (tkbd[code] <> 0) then - begin - s:= CurrentBinds[code]; - s[1]:= '-'; - ParseCommand(s, Trusted); - if (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) and (ReadyTimeLeft > 1) then - ParseCommand('gencmd R', true) - end; - tkbd[code]:= tkbdn[code] - end - -end; - -procedure ProcessKey(event: TSDL_KeyboardEvent); -begin - ProcessKey(event.keysym.sym, event.type_ = SDL_KEYDOWN); -end; - -procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean); -begin -case event.button of - SDL_BUTTON_LEFT: - ProcessKey(KeyNameToCode('mousel'), ButtonDown); - SDL_BUTTON_MIDDLE: - ProcessKey(KeyNameToCode('mousem'), ButtonDown); - SDL_BUTTON_RIGHT: - ProcessKey(KeyNameToCode('mouser'), ButtonDown); - SDL_BUTTON_WHEELDOWN: - ProcessKey(KeyNameToCode('wheeldown'), ButtonDown); - SDL_BUTTON_WHEELUP: - ProcessKey(KeyNameToCode('wheelup'), ButtonDown); - end; -end; - -procedure ResetKbd; -var j, k, t: LongInt; - i: LongInt; - pkbd: PByteArray; -begin - -k:= SDL_GetMouseState(nil, nil); -pkbd:=SDL_GetKeyState(@j); - -//TryDo(j < cKeyMaxIndex, 'SDL keys number is more than expected (' + IntToStr(j) + ')', true); - -for i:= 1 to pred(j) do - tkbdn[i]:= pkbd^[i]; - -{$IFNDEF MOBILE} -// Controller(s) -k:= j; // should we test k for hitting the limit? sounds rather unlikely to ever reach it -for j:= 0 to Pred(ControllerNumControllers) do - begin - for i:= 0 to Pred(ControllerNumAxes[j]) do - begin - if ControllerAxes[j][i] > 20000 then - tkbdn[k + 0]:= 1 - else - tkbdn[k + 0]:= 0; - if ControllerAxes[j][i] < -20000 then - tkbdn[k + 1]:= 1 - else - tkbdn[k + 1]:= 0; - inc(k, 2); - end; - for i:= 0 to Pred(ControllerNumHats[j]) do - begin - tkbdn[k + 0]:= ControllerHats[j][i] and SDL_HAT_UP; - tkbdn[k + 1]:= ControllerHats[j][i] and SDL_HAT_RIGHT; - tkbdn[k + 2]:= ControllerHats[j][i] and SDL_HAT_DOWN; - tkbdn[k + 3]:= ControllerHats[j][i] and SDL_HAT_LEFT; - inc(k, 4); - end; - for i:= 0 to Pred(ControllerNumButtons[j]) do - begin - tkbdn[k]:= ControllerButtons[j][i]; - inc(k, 1); - end; - end; -{$ENDIF} - -// what is this final loop for? -for t:= 0 to cKeyMaxIndex do - tkbd[t]:= tkbdn[t] -end; - -procedure InitKbdKeyTable; -var i, j, k, t: LongInt; - s: string[15]; -begin -//TODO in sdl13 this overrides some values (A and B) change indices to some other values at the back perhaps? -KeyNames[1]:= 'mousel'; -KeyNames[2]:= 'mousem'; -KeyNames[3]:= 'mouser'; -KeyNames[4]:= 'wheelup'; -KeyNames[5]:= 'wheeldown'; - -for i:= 6 to cKeyMaxIndex do - begin -{$IFDEF SDL13} - s:= shortstring(SDL_GetScancodeName(i)); -{$ELSE} - s:= shortstring(sdl_getkeyname(i)); -{$ENDIF} - WriteToConsole(IntToStr(i) + ': ' + s + ' ' + IntToStr(cKeyMaxIndex)); - if s = 'unknown key' then KeyNames[i]:= '' - else - begin - for t:= 1 to Length(s) do - if s[t] = ' ' then - s[t]:= '_'; - KeyNames[i]:= LowerCase(s) - end; - end; - -quitKeyCode:= KeyNameToCode('q'); - -// get the size of keyboard array -SDL_GetKeyState(@k); - -// Controller(s) -for j:= 0 to Pred(ControllerNumControllers) do - begin - for i:= 0 to Pred(ControllerNumAxes[j]) do - begin - keynames[k + 0]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'u'; - keynames[k + 1]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'd'; - inc(k, 2); - end; - for i:= 0 to Pred(ControllerNumHats[j]) do - begin - keynames[k + 0]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'u'; - keynames[k + 1]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'r'; - keynames[k + 2]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'd'; - keynames[k + 3]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'l'; - inc(k, 4); - end; - for i:= 0 to Pred(ControllerNumButtons[j]) do - begin - keynames[k]:= 'j' + IntToStr(j) + 'b' + IntToStr(i); - inc(k, 1); - end; - end; - -DefaultBinds[KeyNameToCode('escape')]:= 'quit'; -DefaultBinds[KeyNameToCode('grave')]:= 'history'; -DefaultBinds[KeyNameToCode('delete')]:= 'rotmask'; - -//numpad -//DefaultBinds[265]:= '+volup'; -//DefaultBinds[256]:= '+voldown'; - -DefaultBinds[KeyNameToCode('0')]:= '+volup'; -DefaultBinds[KeyNameToCode('9')]:= '+voldown'; -DefaultBinds[KeyNameToCode('c')]:= 'capture'; -DefaultBinds[KeyNameToCode('h')]:= 'findhh'; -DefaultBinds[KeyNameToCode('p')]:= 'pause'; -DefaultBinds[KeyNameToCode('s')]:= '+speedup'; -DefaultBinds[KeyNameToCode('t')]:= 'chat'; -DefaultBinds[KeyNameToCode('y')]:= 'confirm'; - -DefaultBinds[KeyNameToCode('mousem')]:= 'zoomreset'; -DefaultBinds[KeyNameToCode('wheelup')]:= 'zoomout'; -DefaultBinds[KeyNameToCode('wheeldown')]:= 'zoomin'; - -DefaultBinds[KeyNameToCode('f12')]:= 'fullscr'; - - -DefaultBinds[KeyNameToCode('mousel')]:= '/put'; -DefaultBinds[KeyNameToCode('mouser')]:= 'ammomenu'; -DefaultBinds[KeyNameToCode('backspace')]:= 'hjump'; -DefaultBinds[KeyNameToCode('tab')]:= 'switch'; -DefaultBinds[KeyNameToCode('return')]:= 'ljump'; -DefaultBinds[KeyNameToCode('space')]:= '+attack'; -DefaultBinds[KeyNameToCode('up')]:= '+up'; -DefaultBinds[KeyNameToCode('down')]:= '+down'; -DefaultBinds[KeyNameToCode('left')]:= '+left'; -DefaultBinds[KeyNameToCode('right')]:= '+right'; -DefaultBinds[KeyNameToCode('left_shift')]:= '+precise'; - -for i:= 1 to 10 do DefaultBinds[KeyNameToCode('f'+IntToStr(i))]:= 'slot '+IntToStr(i); -for i:= 1 to 5 do DefaultBinds[KeyNameToCode(IntToStr(i))]:= 'timer '+IntToStr(i); - -SetDefaultBinds(); -end; - -procedure SetBinds(var binds: TBinds); -begin -{$IFDEF MOBILE} - binds:= binds; // avoid hint - CurrentBinds:= DefaultBinds; -{$ELSE} - CurrentBinds:= binds; -{$ENDIF} -end; - -procedure SetDefaultBinds; -begin - CurrentBinds:= DefaultBinds; -end; - -procedure FreezeEnterKey; -begin - tkbd[3]:= 1; - tkbd[13]:= 1; - tkbd[27]:= 1; - tkbd[271]:= 1; -end; - -var Controller: array [0..5] of PSDL_Joystick; - -procedure ControllerInit; -var i, j: Integer; -begin -ControllerEnabled:= 0; -{$IFDEF MOBILE} -exit; // joystick subsystem disabled on iPhone -{$ENDIF} - -SDL_InitSubSystem(SDL_INIT_JOYSTICK); -ControllerNumControllers:= SDL_NumJoysticks(); - -if ControllerNumControllers > 6 then - ControllerNumControllers:= 6; - -WriteLnToConsole('Number of game controllers: ' + IntToStr(ControllerNumControllers)); - -if ControllerNumControllers > 0 then - begin - for j:= 0 to pred(ControllerNumControllers) do - begin - WriteLnToConsole('Using game controller: ' + SDL_JoystickName(j)); - Controller[j]:= SDL_JoystickOpen(j); - if Controller[j] = nil then - WriteLnToConsole('* Failed to open game controller!') - else - begin - ControllerNumAxes[j]:= SDL_JoystickNumAxes(Controller[j]); - //ControllerNumBalls[j]:= SDL_JoystickNumBalls(Controller[j]); - ControllerNumHats[j]:= SDL_JoystickNumHats(Controller[j]); - ControllerNumButtons[j]:= SDL_JoystickNumButtons(Controller[j]); - WriteLnToConsole('* Number of axes: ' + IntToStr(ControllerNumAxes[j])); - //WriteLnToConsole('* Number of balls: ' + IntToStr(ControllerNumBalls[j])); - WriteLnToConsole('* Number of hats: ' + IntToStr(ControllerNumHats[j])); - WriteLnToConsole('* Number of buttons: ' + IntToStr(ControllerNumButtons[j])); - ControllerEnabled:= 1; - - if ControllerNumAxes[j] > 20 then - ControllerNumAxes[j]:= 20; - //if ControllerNumBalls[j] > 20 then ControllerNumBalls[j]:= 20; - - if ControllerNumHats[j] > 20 then - ControllerNumHats[j]:= 20; - - if ControllerNumButtons[j] > 20 then - ControllerNumButtons[j]:= 20; - - // reset all buttons/axes - for i:= 0 to pred(ControllerNumAxes[j]) do - ControllerAxes[j][i]:= 0; - (*for i:= 0 to pred(ControllerNumBalls[j]) do - begin - ControllerBalls[j][i][0]:= 0; - ControllerBalls[j][i][1]:= 0; - end;*) - for i:= 0 to pred(ControllerNumHats[j]) do - ControllerHats[j][i]:= SDL_HAT_CENTERED; - for i:= 0 to pred(ControllerNumButtons[j]) do - ControllerButtons[j][i]:= 0; - end; - end; - // enable event generation/controller updating - SDL_JoystickEventState(1); - end -else - WriteLnToConsole('Not using any game controller'); -end; - -procedure ControllerClose; -var j: Integer; -begin - if ControllerEnabled > 0 then - for j:= 0 to pred(ControllerNumControllers) do - SDL_JoystickClose(Controller[j]); -end; - -procedure ControllerAxisEvent(joy, axis: Byte; value: Integer); -begin - ControllerAxes[joy][axis]:= value; -end; - -procedure ControllerHatEvent(joy, hat, value: Byte); -begin - ControllerHats[joy][hat]:= value; -end; - -procedure ControllerButtonEvent(joy, button: Byte; pressed: Boolean); -begin - if pressed then - ControllerButtons[joy][button]:= 1 - else - ControllerButtons[joy][button]:= 0; -end; - -procedure initModule; -begin - wheelUp:= false; - wheelDown:= false; -{$IFDEF HWLIBRARY} - // this function is called by HW_allKeysUp so be careful - - // mouse emulation - leftClick:= false; - middleClick:= false; - rightClick:= false; - - // arrow key emulation - upKey:= false; - downKey:= false; - rightKey:= false; - leftKey:= false; - preciseKey:= false; - - // action key emulation - backspaceKey:= false; - spaceKey:= false; - enterKey:= false; - tabKey:= false; - - // other key emulation - chatAction:= false; - pauseAction:= false; -{$ENDIF} -end; - -procedure freeModule; -begin - -end; - -end. diff -r 4c2dd25630a7 -r a61458a81480 hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Sun Apr 29 14:00:35 2012 +0200 +++ b/hedgewars/uTeams.pas Sat Apr 28 15:03:52 2012 +0200 @@ -20,7 +20,7 @@ unit uTeams; interface -uses uConsts, uKeys, uGears, uRandom, uFloat, uStats, uVisualGears, uCollisions, GLunit, uSound, uTypes, uWorld; +uses uConsts, uInputHandler, uGears, uRandom, uFloat, uStats, uVisualGears, uCollisions, GLunit, uSound, uTypes, uWorld; procedure initModule; procedure freeModule;