X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_console.pas;h=59174bf3b66b96ae71fbc637e92b984657e93662;hb=7e9bc1301ecf92dd4c78bb613828839fbd9b0393;hp=388b4524d97d6108a536d865614ce2e383b70614;hpb=228d34465e847f7953a4b2a9e6a32c3b5d2316ae;p=d2df-sdl.git diff --git a/src/game/g_console.pas b/src/game/g_console.pas index 388b452..59174bf 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -52,8 +52,8 @@ procedure g_Console_WriteConfig (filename: String); function g_Console_Interactive: Boolean; function g_Console_Action (action: Integer): Boolean; -function g_Console_FindBind (n: Integer; cmd: AnsiString): Integer; -procedure g_Console_BindKey (key: Integer; cmd: AnsiString); +function g_Console_FindBind (n: Integer; down: AnsiString; up: AnsiString = ''): Integer; +procedure g_Console_BindKey (key: Integer; down: AnsiString; up: AnsiString = ''); procedure g_Console_ProcessBind (key: Integer; down: Boolean); procedure g_Console_ResetBinds; @@ -79,7 +79,7 @@ var gChatTeam: Boolean = false; gAllowConsoleMessages: Boolean = true; gJustChatted: Boolean = false; // ÷òîáû àäìèí â èíòåðå ÷àòÿñü íå ïðîìàòûâàë ñòàòèñòèêó - gPlayerAction, gDefaultAction: Array [0..1, 0..LAST_ACTION] of Boolean; // [player, action] + gPlayerAction: Array [0..1, 0..LAST_ACTION] of Boolean; // [player, action] implementation @@ -142,9 +142,8 @@ var Time: Word; end; - bindDown, bindProcess: Boolean; gInputBinds: Array [0..e_MaxInputKeys - 1] of record - commands: SSArray; + down, up: SSArray; end; @@ -618,32 +617,46 @@ begin pp^ := 0; end; +function GetCommandString (p: SSArray): AnsiString; + var i: Integer; +begin + result := ''; + if Length(p) >= 1 then + begin + result := p[0]; + for i := 1 to High(p) do + result := result + '; ' + p[i] + end +end; + procedure BindCommands (p: SSArray); - var cmd, key, act: AnsiString; i, j: Integer; + var cmd, key: AnsiString; i: Integer; begin cmd := LowerCase(p[0]); case cmd of 'bind': - // bind - if Length(p) = 3 then + // bind [down [up]] + if Length(p) >= 2 then begin - key := LowerCase(p[1]); i := 0; + key := LowerCase(p[1]); while (i < e_MaxInputKeys) and (key <> LowerCase(e_KeyNames[i])) do inc(i); if i < e_MaxInputKeys then - g_Console_BindKey(i, p[2]) - end; - 'bindlist': - for i := 0 to e_MaxInputKeys - 1 do - begin - if gInputBinds[i].commands <> nil then begin - act := gInputBinds[i].commands[0]; - for j := 1 to High(gInputBinds[i].commands) do - act := act + ' ;' + gInputBinds[i].commands[j]; - g_Console_Add('"' + LowerCase(e_KeyNames[i]) + '" "' + act + '"') + if Length(p) = 2 then + g_Console_Add('"' + e_KeyNames[i] + '" = "' + GetCommandString(gInputBinds[i].down) + '" "' + GetCommandString(gInputBinds[i].up) + '"') + else if Length(p) >= 4 then + g_Console_BindKey(i, p[2], p[3]) + else + g_Console_BindKey(i, p[2], '') end - end; + end + else + g_Console_Add('bind [up action]'); + 'bindlist': + for i := 0 to e_MaxInputKeys - 1 do + if (gInputBinds[i].down <> nil) or (gInputBinds[i].up <> nil) then + g_Console_Add(e_KeyNames[i] + ' "' + GetCommandString(gInputBinds[i].down) + '" "' + GetCommandString(gInputBinds[i].up) + '"'); 'unbind': // unbind if Length(p) = 2 then @@ -653,15 +666,16 @@ begin while (i < e_MaxInputKeys) and (key <> LowerCase(e_KeyNames[i])) do inc(i); if i < e_MaxInputKeys then g_Console_BindKey(i, '') - end; + end + else + g_Console_Add('unbind '); 'unbindall': for i := 0 to e_MaxInputKeys - 1 do - if gInputBinds[i].commands <> nil then - gInputBinds[i].commands := nil; - 'bindkeys': - for i := 0 to e_MaxInputKeys - 1 do - if e_KeyNames[i] <> '' then - g_Console_Add(LowerCase(e_KeyNames[i])); + g_Console_BindKey(i, ''); + 'showkeyboard': + g_Touch_ShowKeyboard(True); + 'hidekeyboard': + g_Touch_ShowKeyboard(False); end end; @@ -745,7 +759,8 @@ begin AddCommand('bindlist', BindCommands); AddCommand('unbind', BindCommands); AddCommand('unbindall', BindCommands); - AddCommand('bindkeys', BindCommands); + AddCommand('showkeyboard', BindCommands); + AddCommand('hidekeyboard', BindCommands); AddCommand('clear', ConsoleCommands, 'clear console'); AddCommand('clearhistory', ConsoleCommands); @@ -1248,13 +1263,13 @@ begin IK_DELETE: if (Length(Line) > 0) and (CPos <= Length(Line)) then Delete(Line, CPos, 1); - IK_LEFT, IK_KPLEFT, VK_LEFT: + IK_LEFT, IK_KPLEFT, VK_LEFT, JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT: if CPos > 1 then CPos := CPos - 1; - IK_RIGHT, IK_KPRIGHT, VK_RIGHT: + IK_RIGHT, IK_KPRIGHT, VK_RIGHT, JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT: if CPos <= Length(Line) then CPos := CPos + 1; - IK_RETURN, IK_KPRETURN, VK_OPEN, VK_FIRE: + IK_RETURN, IK_KPRETURN, VK_OPEN, VK_FIRE, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK: begin if Cons_Shown then g_Console_Process(Line) @@ -1291,7 +1306,7 @@ begin IK_TAB: if not gChatShow then Complete(); - IK_DOWN, IK_KPDOWN, VK_DOWN: + IK_DOWN, IK_KPDOWN, VK_DOWN, JOY0_DOWN, JOY1_DOWN, JOY2_DOWN, JOY3_DOWN: if not gChatShow then if (CommandHistory <> nil) and (CmdIndex < Length(CommandHistory)) then @@ -1301,7 +1316,7 @@ begin Line := CommandHistory[CmdIndex]; CPos := Length(Line) + 1; end; - IK_UP, IK_KPUP, VK_UP: + IK_UP, IK_KPUP, VK_UP, JOY0_UP, JOY1_UP, JOY2_UP, JOY3_UP: if not gChatShow then if (CommandHistory <> nil) and (CmdIndex <= Length(CommandHistory)) then @@ -1311,9 +1326,9 @@ begin Line := CommandHistory[CmdIndex]; Cpos := Length(Line) + 1; end; - IK_PAGEUP, IK_KPPAGEUP, VK_PREV: // PgUp + IK_PAGEUP, IK_KPPAGEUP, VK_PREV, JOY0_PREV, JOY1_PREV, JOY2_PREV, JOY3_PREV: // PgUp if not gChatShow then Inc(conSkipLines); - IK_PAGEDN, IK_KPPAGEDN, VK_NEXT: // PgDown + IK_PAGEDN, IK_KPPAGEDN, VK_NEXT, JOY0_NEXT, JOY1_NEXT, JOY2_NEXT, JOY3_NEXT: // PgDown if not gChatShow and (conSkipLines > 0) then Dec(conSkipLines); IK_HOME, IK_KPHOME: CPos := 1; @@ -1563,26 +1578,9 @@ begin begin if commands[i].action >= 0 then begin - if bindProcess then - begin - if bindDown then - gPlayerAction[commands[i].player, commands[i].action] := commands[i].cmd[1] = '+' - else - gPlayerAction[commands[i].player, commands[i].action] := gDefaultAction[commands[i].player, commands[i].action] - end - else - begin - gPlayerAction[commands[i].player, commands[i].action] := commands[i].cmd[1] = '+'; - gDefaultAction[commands[i].player, commands[i].action] := commands[i].cmd[1] = '+' - end; - exit - end - else if bindProcess and not bindDown then - begin - (* command is not action, so do not execute it again after button release *) + gPlayerAction[commands[i].player, commands[i].action] := commands[i].cmd[1] = '+'; exit end; - if assigned(commands[i].procEx) then begin commands[i].procEx(@commands[i], Arr); @@ -1602,32 +1600,52 @@ end; function g_Console_Interactive: Boolean; begin - Result := not bindProcess + Result := gConsoleShow end; -procedure g_Console_BindKey (key: Integer; cmd: AnsiString); +procedure g_Console_BindKey (key: Integer; down: AnsiString; up: AnsiString = ''); begin //e_LogWritefln('bind "%s" "%s" <%s>', [LowerCase(e_KeyNames[key]), cmd, key]); ASSERT(key >= 0); ASSERT(key < e_MaxInputKeys); if key > 0 then - gInputBinds[key].commands := ParseAlias(cmd) + begin + gInputBinds[key].down := ParseAlias(down); + gInputBinds[key].up := ParseAlias(up) + end end; -function g_Console_FindBind (n: Integer; cmd: AnsiString): Integer; +function g_Console_FindBind (n: Integer; down: AnsiString; up: AnsiString = ''): Integer; var i: Integer; + + function EqualsCommandLists (a, b: SSArray): Boolean; + var i, len: Integer; + begin + result := False; + len := Length(a); + if len = Length(b) then + begin + i := 0; + while (i < len) and (a[i] = b[i]) do inc(i); + if i >= len then + result := True + end + end; + begin ASSERT(n >= 1); result := 0; if commands = nil then Exit; i := 0; - cmd := LowerCase(cmd); while (n >= 1) and (i < e_MaxInputKeys) do begin - if (Length(gInputBinds[i].commands) = 1) and (gInputBinds[i].commands[0] = cmd) then + if EqualsCommandLists(ParseAlias(down), gInputBinds[i].down) then begin - result := i; - dec(n) + if EqualsCommandLists(ParseAlias(up), gInputBinds[i].up) then + begin + result := i; + dec(n) + end end; inc(i) end; @@ -1649,13 +1667,14 @@ end; procedure g_Console_ProcessBind (key: Integer; down: Boolean); var i: Integer; begin - if (not gChatShow) and (not gConsoleShow) and (key >= 0) and (key < e_MaxInputKeys) and (gInputBinds[key].commands <> nil) then + if (not gChatShow) and (not gConsoleShow) and (key >= 0) and (key < e_MaxInputKeys) and ((gInputBinds[key].down <> nil) or (gInputBinds[key].up <> nil)) then begin - bindDown := down; - bindProcess := True; - for i := 0 to High(gInputBinds[key].commands) do - g_Console_Process(gInputBinds[key].commands[i], True); - bindProcess := False; + if down then + for i := 0 to High(gInputBinds[key].down) do + g_Console_Process(gInputBinds[key].down[i], True) + else + for i := 0 to High(gInputBinds[key].up) do + g_Console_Process(gInputBinds[key].up[i], True) end end; @@ -1663,18 +1682,18 @@ procedure g_Console_ResetBinds; var i: Integer; begin for i := 0 to e_MaxInputKeys - 1 do - g_Console_BindKey(i, ''); - - g_Console_BindKey(IK_A, '+p1_moveleft'); - g_Console_BindKey(IK_D, '+p1_moveright'); - g_Console_BindKey(IK_W, '+p1_lookup'); - g_Console_BindKey(IK_S, '+p1_lookdown'); - g_Console_BindKey(IK_SPACE, '+p1_jump'); - g_Console_BindKey(IK_H, '+p1_attack'); - g_Console_BindKey(IK_J, '+p1_activate'); - g_Console_BindKey(IK_E, '+p1_weapnext'); - g_Console_BindKey(IK_Q, '+p1_weapprev'); - g_Console_BindKey(IK_ALT, '+p1_strafe'); + g_Console_BindKey(i, '', ''); + + g_Console_BindKey(IK_A, '+p1_moveleft', '-p1_moveleft'); + g_Console_BindKey(IK_D, '+p1_moveright', '-p1_moveright'); + g_Console_BindKey(IK_W, '+p1_lookup', '-p1_lookup'); + g_Console_BindKey(IK_S, '+p1_lookdown', '-p1_lookdown'); + g_Console_BindKey(IK_SPACE, '+p1_jump', '-p1_jump'); + g_Console_BindKey(IK_H, '+p1_attack', '-p1_attack'); + g_Console_BindKey(IK_J, '+p1_activate', '-p1_activate'); + g_Console_BindKey(IK_E, '+p1_weapnext', '-p1_weapnext'); + g_Console_BindKey(IK_Q, '+p1_weapprev', '-p1_weapprev'); + g_Console_BindKey(IK_ALT, '+p1_strafe', '-p1_strafe'); g_Console_BindKey(IK_1, 'p1_weapon 1'); g_Console_BindKey(IK_2, 'p1_weapon 2'); g_Console_BindKey(IK_3, 'p1_weapon 3'); @@ -1689,35 +1708,37 @@ begin g_Console_BindKey(IK_T, 'togglechat'); g_Console_BindKey(IK_Y, 'toggleteamchat'); g_Console_BindKey(IK_F11, 'screenshot'); - g_Console_BindKey(IK_TAB, '+p1_scores'); + g_Console_BindKey(IK_TAB, '+p1_scores', '-p1_scores'); g_Console_BindKey(IK_PAUSE, 'pause'); g_Console_BindKey(IK_F1, 'vote'); (* for i := 0 to e_MaxJoys - 1 do *) for i := 0 to 1 do begin - g_Console_BindKey(e_JoyAxisToKey(i, 0, 0), '+p' + IntToStr(i mod 2 + 1) + '_moveleft'); - g_Console_BindKey(e_JoyAxisToKey(i, 0, 1), '+p' + IntToStr(i mod 2 + 1) + '_moveright'); - g_Console_BindKey(e_JoyAxisToKey(i, 1, 0), '+p' + IntToStr(i mod 2 + 1) + '_lookup'); - g_Console_BindKey(e_JoyAxisToKey(i, 1, 1), '+p' + IntToStr(i mod 2 + 1) + '_lookdown'); - g_Console_BindKey(e_JoyButtonToKey(i, 2), '+p' + IntToStr(i mod 2 + 1) + '_jump'); - g_Console_BindKey(e_JoyButtonToKey(i, 0), '+p' + IntToStr(i mod 2 + 1) + '_attack'); - g_Console_BindKey(e_JoyButtonToKey(i, 3), '+p' + IntToStr(i mod 2 + 1) + '_activate'); - g_Console_BindKey(e_JoyButtonToKey(i, 1), '+p' + IntToStr(i mod 2 + 1) + '_weapnext'); - g_Console_BindKey(e_JoyButtonToKey(i, 4), '+p' + IntToStr(i mod 2 + 1) + '_weapprev'); - g_Console_BindKey(e_JoyButtonToKey(i, 7), '+p' + IntToStr(i mod 2 + 1) + '_strafe'); + g_Console_BindKey(e_JoyAxisToKey(i, 0, AX_MINUS), '+p' + IntToStr(i mod 2 + 1) + '_moveleft', '-p' + IntToStr(i mod 2 + 1) + '_moveleft'); + g_Console_BindKey(e_JoyAxisToKey(i, 0, AX_PLUS), '+p' + IntToStr(i mod 2 + 1) + '_moveright', '-p' + IntToStr(i mod 2 + 1) + '_moveright'); + g_Console_BindKey(e_JoyAxisToKey(i, 1, AX_MINUS), '+p' + IntToStr(i mod 2 + 1) + '_lookup', '-p' + IntToStr(i mod 2 + 1) + '_lookup'); + g_Console_BindKey(e_JoyAxisToKey(i, 1, AX_PLUS), '+p' + IntToStr(i mod 2 + 1) + '_lookdown', '-p' + IntToStr(i mod 2 + 1) + '_lookdown'); + g_Console_BindKey(e_JoyButtonToKey(i, 2), '+p' + IntToStr(i mod 2 + 1) + '_jump', '-p' + IntToStr(i mod 2 + 1) + '_jump'); + g_Console_BindKey(e_JoyButtonToKey(i, 0), '+p' + IntToStr(i mod 2 + 1) + '_attack', '-p' + IntToStr(i mod 2 + 1) + '_attack'); + g_Console_BindKey(e_JoyButtonToKey(i, 3), '+p' + IntToStr(i mod 2 + 1) + '_activate', '-p' + IntToStr(i mod 2 + 1) + '_activate'); + g_Console_BindKey(e_JoyButtonToKey(i, 1), '+p' + IntToStr(i mod 2 + 1) + '_weapnext', '-p' + IntToStr(i mod 2 + 1) + '_weapnext'); + g_Console_BindKey(e_JoyButtonToKey(i, 4), '+p' + IntToStr(i mod 2 + 1) + '_weapprev', '-p' + IntToStr(i mod 2 + 1) + '_weapprev'); + g_Console_BindKey(e_JoyButtonToKey(i, 7), '+p' + IntToStr(i mod 2 + 1) + '_strafe', '-p' + IntToStr(i mod 2 + 1) + '_strafe'); end; - g_Console_BindKey(VK_LEFT, '+moveleft'); - g_Console_BindKey(VK_RIGHT, '+moveright'); - g_Console_BindKey(VK_UP, '+lookup'); - g_Console_BindKey(VK_DOWN, '+lookdown'); - g_Console_BindKey(VK_JUMP, '+jump'); - g_Console_BindKey(VK_FIRE, '+attack'); - g_Console_BindKey(VK_OPEN, '+activate'); - g_Console_BindKey(VK_NEXT, '+weapnext'); - g_Console_BindKey(VK_PREV, '+weapprev'); - g_Console_BindKey(VK_STRAFE, '+strafe'); + g_Console_BindKey(VK_LSTRAFE, '+moveleft; +strafe', '-moveleft; -strafe'); + g_Console_BindKey(VK_RSTRAFE, '+moveright; +strafe', '-moveright; -strafe'); + g_Console_BindKey(VK_LEFT, '+moveleft', '-moveleft'); + g_Console_BindKey(VK_RIGHT, '+moveright', '-moveright'); + g_Console_BindKey(VK_UP, '+lookup', '-lookup'); + g_Console_BindKey(VK_DOWN, '+lookdown', '-lookdown'); + g_Console_BindKey(VK_JUMP, '+jump', '-jump'); + g_Console_BindKey(VK_FIRE, '+attack', '-attack'); + g_Console_BindKey(VK_OPEN, '+activate', '-activate'); + g_Console_BindKey(VK_NEXT, '+weapnext', '-weapnext'); + g_Console_BindKey(VK_PREV, '+weapprev', '-weapprev'); + g_Console_BindKey(VK_STRAFE, '+strafe', '-strafe'); g_Console_BindKey(VK_0, 'weapon 1'); g_Console_BindKey(VK_1, 'weapon 2'); g_Console_BindKey(VK_2, 'weapon 3'); @@ -1732,7 +1753,9 @@ begin g_Console_BindKey(VK_CHAT, 'togglechat'); g_Console_BindKey(VK_TEAM, 'toggleteamchat'); g_Console_BindKey(VK_PRINTSCR, 'screenshot'); - g_Console_BindKey(VK_STATUS, '+scores'); + g_Console_BindKey(VK_STATUS, '+scores', '-scores'); + g_Console_BindKey(VK_SHOWKBD, 'showkeyboard'); + g_Console_BindKey(VK_HIDEKBD, 'hidekeyboard'); // VK_CONSOLE // VK_ESCAPE @@ -1764,22 +1787,15 @@ begin end; procedure g_Console_WriteConfig (filename: String); - var f: TextFile; i, j: Integer; act: AnsiString; + var f: TextFile; i, j: Integer; begin AssignFile(f, filename); Rewrite(f); WriteLn(f, '// generated by doom2d, do not modify'); WriteLn(f, 'unbindall'); for i := 0 to e_MaxInputKeys - 1 do - begin - if Length(gInputBinds[i].commands) > 0 then - begin - act := gInputBinds[i].commands[0]; - for j := 1 to High(gInputBinds[i].commands) do - act := act + '; ' + gInputBinds[i].commands[j]; - WriteLn(f, 'bind "', LowerCase(e_KeyNames[i]), '" "', act, '"') - end - end; + if (Length(gInputBinds[i].down) > 0) or (Length(gInputBinds[i].up) > 0) then + WriteLn(f, 'bind ', e_KeyNames[i], ' "', GetCommandString(gInputBinds[i].down), '" "', GetCommandString(gInputBinds[i].up), '"'); for i := 0 to High(commands) do begin if not commands[i].cheat then