From 7ab0e3623e342566a036b71b847b629e26ee56e1 Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Sun, 31 Mar 2019 22:19:42 +0300 Subject: [PATCH 1/1] improved bind command and co --- src/game/g_console.pas | 312 +++++++++++++++++++++-------------------- src/game/g_game.pas | 224 +++++++++-------------------- src/game/g_main.pas | 11 +- 3 files changed, 238 insertions(+), 309 deletions(-) diff --git a/src/game/g_console.pas b/src/game/g_console.pas index ecc6677..21b056f 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -22,33 +22,20 @@ uses utils; // for SSArray const - ACTION_MOVEUP = 1; - ACTION_MOVEDOWN = 2; - ACTION_MOVELEFT = 3; - ACTION_MOVERIGHT = 4; - ACTION_SPEED = 5; + ACTION_JUMP = 0; + ACTION_MOVELEFT = 1; + ACTION_MOVERIGHT = 2; + ACTION_LOOKDOWN = 3; + ACTION_LOOKUP = 4; + ACTION_ATTACK = 5; ACTION_SCORES = 6; - ACTION_LOOKDOWN = 7; - ACTION_LOOKUP = 8; - ACTION_ATTACK = 9; - ACTION_ACTIVATE = 10; - ACTION_STRAFE = 11; - ACTION_WEAPNEXT = 12; - ACTION_WEAPPREV = 13; - ACTION_WEAP1 = 14; - ACTION_WEAP2 = 15; - ACTION_WEAP3 = 16; - ACTION_WEAP4 = 17; - ACTION_WEAP5 = 18; - ACTION_WEAP6 = 19; - ACTION_WEAP7 = 20; - ACTION_WEAP8 = 21; - ACTION_WEAP9 = 22; - ACTION_WEAP10 = 23; - ACTION_WEAP11 = 24; - - LAST_ACTION = ACTION_WEAP11; - MAX_ACTION_WEAP = ACTION_WEAP11 - ACTION_WEAP1 + 1; + ACTION_ACTIVATE = 7; + ACTION_STRAFE = 8; + ACTION_WEAPNEXT = 9; + ACTION_WEAPPREV = 10; + + FIRST_ACTION = ACTION_JUMP; + LAST_ACTION = ACTION_WEAPPREV; procedure g_Console_Init (); procedure g_Console_Update (); @@ -62,6 +49,8 @@ procedure g_Console_Clear (); function g_Console_CommandBlacklisted (C: AnsiString): Boolean; procedure g_Console_ReadConfig (filename: String); +function g_Console_Interactive: Boolean; +function g_Console_Action (action: Integer): Boolean; procedure g_Console_ProcessBind (key: Integer; down: Boolean); procedure conwriteln (const s: AnsiString; show: Boolean=false); @@ -85,9 +74,8 @@ var gChatShow: Boolean = false; gChatTeam: Boolean = false; gAllowConsoleMessages: Boolean = true; - gChatEnter: Boolean = true; gJustChatted: Boolean = false; // ÷òîáû àäìèí â èíòåðå ÷àòÿñü íå ïðîìàòûâàë ñòàòèñòèêó - gPlayerAction: Array [0..1, 0..LAST_ACTION] of Boolean; // [player, action] + gPlayerAction, gDefaultAction: Array [0..1, 0..LAST_ACTION] of Boolean; // [player, action] implementation @@ -112,6 +100,8 @@ type ptr: Pointer; // various data msg: AnsiString; // message for var changes cheat: Boolean; + action: Integer; // >= 0 for action commands + player: Integer; // used for action commands end; TAlias = record @@ -147,10 +137,11 @@ var Msg: AnsiString; Time: Word; end; + + bindDown, bindProcess: Boolean; gInputBinds: Array [0..e_MaxInputKeys - 1] of record - cmd: AnsiString + commands: SSArray; end; - bindDown, bindProcess: Boolean; // poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks @@ -280,6 +271,8 @@ begin cp.ptr := pvar; cp.msg := amsg; cp.cheat := acheat; + cp.action := -1; + cp.player := -1; end; @@ -299,6 +292,8 @@ begin cp.ptr := pvar; cp.msg := amsg; cp.cheat := acheat; + cp.action := -1; + cp.player := -1; end; @@ -372,6 +367,8 @@ begin cp.ptr := pv; cp.msg := amsg; cp.cheat := acheat; + cp.action := -1; + cp.player := -1; end; @@ -607,25 +604,6 @@ begin Whitelist[a] := LowerCase(cmd); end; -procedure AddCommand(cmd: AnsiString; proc: TCmdProc; ahelp: AnsiString=''; ahidden: Boolean=false; acheat: Boolean=false); -var - a: Integer; - cp: PCommand; -begin - SetLength(commands, Length(commands)+1); - a := High(commands); - cp := @commands[a]; - cp.cmd := LowerCase(cmd); - cp.proc := proc; - cp.procEx := nil; - cp.help := ahelp; - cp.hidden := ahidden; - cp.ptr := nil; - cp.msg := ''; - cp.cheat := acheat; -end; - - procedure segfault (p: SSArray); var pp: PByte = nil; @@ -633,9 +611,8 @@ begin pp^ := 0; end; - procedure BindCommands (p: SSArray); - var cmd, key, act: AnsiString; i: Integer; + var cmd, key, act: AnsiString; i, j: Integer; begin cmd := LowerCase(p[0]); case cmd of @@ -644,16 +621,22 @@ begin if Length(p) = 3 then begin key := LowerCase(p[1]); - act := p[2]; i := 0; while (i < e_MaxInputKeys) and (key <> LowerCase(e_KeyNames[i])) do inc(i); if i < e_MaxInputKeys then - gInputBinds[i].cmd := act + gInputBinds[i].commands := ParseAlias(p[2]) end; 'bindlist': for i := 0 to e_MaxInputKeys - 1 do - if gInputBinds[i].cmd <> '' then - g_Console_Add(LowerCase(e_KeyNames[i]) + ' "' + gInputBinds[i].cmd + '"'); + 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 + '"') + end + end; 'unbind': // unbind if Length(p) = 2 then @@ -662,102 +645,78 @@ begin i := 0; while (i < e_MaxInputKeys) and (key <> LowerCase(e_KeyNames[i])) do inc(i); if i < e_MaxInputKeys then - gInputBinds[i].cmd := '' + gInputBinds[i].commands := nil end; 'unbindall': for i := 0 to e_MaxInputKeys - 1 do - gInputBinds[i].cmd := ''; + 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(IntToStr(i) + ': ' + LowerCase(e_KeyNames[i])); + g_Console_Add(LowerCase(e_KeyNames[i])); end end; - -procedure KeyActionCommands (p: SSArray); - var cmd: AnsiString; val: Boolean; player, action, offset: Integer; +procedure AddCommand(cmd: AnsiString; proc: TCmdProc; ahelp: AnsiString=''; ahidden: Boolean=false; acheat: Boolean=false); +var + a: Integer; + cp: PCommand; begin - // syntax: ("+" | "-") ["p" digit "_"] Command - cmd := LowerCase(p[0]); + SetLength(commands, Length(commands)+1); + a := High(commands); + cp := @commands[a]; + cp.cmd := LowerCase(cmd); + cp.proc := proc; + cp.procEx := nil; + cp.help := ahelp; + cp.hidden := ahidden; + cp.ptr := nil; + cp.msg := ''; + cp.cheat := acheat; + cp.action := -1; + cp.player := -1; +end; - if cmd[1] = '+' then - val := (not bindProcess) or (bindProcess and bindDown) - else if cmd[1] = '-' then - val := bindProcess and bindDown - else - Exit; +procedure AddAction (cmd: AnsiString; action: Integer; help: AnsiString = ''; hidden: Boolean = False; cheat: Boolean = False); + const + PrefixList: array [0..1] of AnsiString = ('+', '-'); + PlayerList: array [0..1] of Integer = (1, 2); + var + s: AnsiString; + i: Integer; - player := 0; - offset := 2; - if (Length(cmd) >= 4) and (cmd[2] = 'p') and (cmd[3] >= '1') and (cmd[3] <= '9') and (cmd[4] = '_') then + procedure NewAction (cmd: AnsiString; player: Integer); + var cp: PCommand; begin - player := ord(cmd[3]) - ord('1') - 1; - offset := 5; + SetLength(commands, Length(commands) + 1); + cp := @commands[High(commands)]; + cp.cmd := LowerCase(cmd); + cp.proc := nil; + cp.procEx := nil; + cp.help := help; + cp.hidden := hidden; + cp.ptr := nil; + cp.msg := ''; + cp.cheat := cheat; + cp.action := action; + cp.player := player; end; - case Copy(cmd, offset) of - 'moveup': action := ACTION_MOVEUP; - 'movedown': action := ACTION_MOVEDOWN; - 'moveleft': action := ACTION_MOVELEFT; - 'moveright': action := ACTION_MOVERIGHT; - 'speed': action := ACTION_SPEED; - 'scores': action := ACTION_SCORES; - 'lookup': action := ACTION_LOOKUP; - 'lookdown': action := ACTION_LOOKDOWN; - 'attack': action := ACTION_ATTACK; - 'activate': action := ACTION_ACTIVATE; - 'strafe': action := ACTION_STRAFE; - 'weapnext': action := ACTION_WEAPNEXT; - 'weapprev': action := ACTION_WEAPPREV; - else - Exit - end; - - gPlayerAction[player, action] := val; -end; - -procedure ActionCommands (p: SSArray); - var cmd: AnsiString; i, player, offset, action: Integer; begin - cmd := LowerCase(p[0]); - - player := 0; - offset := 1; - if (Length(cmd) >= 3) and (cmd[1] = 'p') and (cmd[2] >= '1') and (cmd[2] <= '9') and (cmd[3] = '_') then + ASSERT(action >= 0); + ASSERT(action <= LAST_ACTION); + for s in PrefixList do begin - player := ord(cmd[2]) - ord('1') - 1; - offset := 4; - end; - - case Copy(cmd, offset) of - 'weapnext': action := ACTION_WEAPNEXT; - 'weapprev': action := ACTION_WEAPPREV; - 'weapon': - if Length(p) = 2 then - begin - i := StrToInt(p[1]); - if (i > 0) and (i <= MAX_ACTION_WEAP) then - action := ACTION_WEAP1 + i - 1 - else - Exit - end - else - Exit; - end; - - gPlayerAction[player, action] := bindDown; + NewAction(s + cmd, 0); + for i in PlayerList do + NewAction(s + 'p' + IntToStr(i) + '_' + cmd, i - 1) + end end; procedure g_Console_Init(); - const - PrefixList: array [0..1] of AnsiString = ('+', '-'); - PlayerList: array [0..2] of AnsiString = ('', 'p1_', 'p2_'); - KeyActionList: array [0..12] of AnsiString = ('moveup', 'movedown', 'moveleft', 'moveright', 'speed', 'scores', 'lookup', 'lookdown', 'attack', 'activate', 'strafe', 'weapnext', 'weapprev'); - ActionList: array [0..2] of AnsiString = ('weapnext', 'weapprev', 'weapon'); var a: Integer; - s0, s1, s2: AnsiString; begin g_Texture_CreateWAD(ID, GameWAD+':TEXTURES\CONSOLE'); Cons_Y := -(gScreenHeight div 2); @@ -781,14 +740,17 @@ begin AddCommand('unbindall', BindCommands); AddCommand('bindkeys', BindCommands); - for s0 in PrefixList do - for s1 in PlayerList do - for s2 in KeyActionList do - AddCommand(s0 + s1 + s2, KeyActionCommands); - - for s1 in PlayerList do - for s2 in ActionList do - AddCommand(s1 + s2, ActionCommands); + AddAction('jump', ACTION_JUMP); + AddAction('moveleft', ACTION_MOVELEFT); + AddAction('moveright', ACTION_MOVERIGHT); + AddAction('lookup', ACTION_LOOKUP); + AddAction('lookdown', ACTION_LOOKDOWN); + AddAction('attack', ACTION_ATTACK); + AddAction('scores', ACTION_SCORES); + AddAction('activate', ACTION_ACTIVATE); + AddAction('strafe', ACTION_STRAFE); + AddAction('weapnext', ACTION_WEAPNEXT); + AddAction('weapprev', ACTION_WEAPPREV); AddCommand('clear', ConsoleCommands, 'clear console'); AddCommand('clearhistory', ConsoleCommands); @@ -889,6 +851,12 @@ begin AddCommand('vote', GameCommands); AddCommand('clientlist', GameCommands); AddCommand('event', GameCommands); + AddCommand('screenshot', GameCommands); + AddCommand('togglechat', GameCommands); + AddCommand('toggleteamchat', GameCommands); + AddCommand('weapon', GameCommands); + AddCommand('p1_weapon', GameCommands); + AddCommand('p2_weapon', GameCommands); AddCommand('god', GameCheats); AddCommand('notarget', GameCheats); @@ -927,11 +895,11 @@ begin WhitelistCommand('g_scorelimit'); WhitelistCommand('g_timelimit'); - g_Console_Add(Format(_lc[I_CONSOLE_WELCOME], [GAME_VERSION])); - g_Console_Add(''); - g_Console_ReadConfig(GameDir + '/dfconfig.cfg'); g_Console_ReadConfig(GameDir + '/autoexec.cfg'); + + g_Console_Add(Format(_lc[I_CONSOLE_WELCOME], [GAME_VERSION])); + g_Console_Add(''); end; procedure g_Console_Update(); @@ -1118,7 +1086,7 @@ end; procedure g_Console_Switch(); begin - if gChatShow then Exit; + gChatShow := False; gConsoleShow := not gConsoleShow; Cons_Shown := True; g_Touch_ShowKeyboard(gConsoleShow or gChatShow); @@ -1126,12 +1094,10 @@ end; procedure g_Console_Chat_Switch(Team: Boolean = False); begin - if gConsoleShow then Exit; if not g_Game_IsNet then Exit; + gConsoleShow := False; gChatShow := not gChatShow; gChatTeam := Team; - if gChatShow then - gChatEnter := False; Line := ''; CPos := 1; g_Touch_ShowKeyboard(gConsoleShow or gChatShow); @@ -1139,8 +1105,8 @@ end; procedure g_Console_Char(C: AnsiChar); begin - if gChatShow and (not gChatEnter) then - Exit; +// if gChatShow then +// Exit; Insert(C, Line, CPos); CPos := CPos + 1; end; @@ -1587,30 +1553,70 @@ begin begin if commands[i].cmd = LowerCase(Arr[0]) then 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 *) + exit + end; + if assigned(commands[i].procEx) then begin commands[i].procEx(@commands[i], Arr); - exit; + exit end; if assigned(commands[i].proc) then begin commands[i].proc(Arr); - exit; - end; - end; + exit + end + end end; g_Console_Add(Format(_lc[I_CONSOLE_UNKNOWN], [Arr[0]])); end; +function g_Console_Interactive: Boolean; +begin + Result := not bindProcess +end; + +function g_Console_Action (action: Integer): Boolean; + var i, len: Integer; +begin + ASSERT(action >= 0); + ASSERT(action <= LAST_ACTION); + i := 0; + len := Length(gPlayerAction); + while (i < len) and (not gPlayerAction[i, action]) do inc(i); + Result := i < len +end; + procedure g_Console_ProcessBind (key: Integer; down: Boolean); + var i: Integer; begin - if (key >= 0) and (key < e_MaxInputKeys) and (gInputBinds[key].cmd <> '') then + if (not gChatShow) and (not gConsoleShow) and (key >= 0) and (key < e_MaxInputKeys) and (gInputBinds[key].commands <> nil) then begin bindDown := down; bindProcess := True; - g_Console_Process(gInputBinds[key].cmd, True); + for i := 0 to High(gInputBinds[key].commands) do + g_Console_Process(gInputBinds[key].commands[i], True); bindProcess := False; end end; @@ -1634,7 +1640,7 @@ begin while (i <= len) and (s[i] <= ' ') do inc(i); (* skip comments *) if (i <= len) and ((s[i] <> '#') and ((i + 1 > len) or (s[i] <> '/') or (s[i + 1] <> '/'))) then - g_Console_Process(s) + g_Console_Process(s, True) end end; CloseFile(f) diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 5205699..06afe8e 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -381,6 +381,7 @@ uses var hasPBarGfx: Boolean = false; + nextQueueWeapon: Array [0..1] of Integer = (-1, -1); // [player] // ////////////////////////////////////////////////////////////////////////// // @@ -567,7 +568,6 @@ var FPSCounter, UPSCounter: Word; FPSTime, UPSTime: LongWord; DataLoaded: Boolean = False; - LastScreenShot: Int64; IsDrawStat: Boolean = False; CustomStat: TEndCustomGameStat; SingleStat: TEndSingleGameStat; @@ -1315,7 +1315,6 @@ begin gPauseMain := false; gPauseHolmes := false; gTime := 0; - LastScreenShot := 0; {e_MouseInfo.Accel := 1.0;} @@ -1501,87 +1500,7 @@ retry: goto retry; end; -function isKeyPressed (key1: Word; key2: Word): Boolean; -begin - if (key1 <> 0) and e_KeyPressed(key1) then begin result := true; exit; end; - if (key2 <> 0) and e_KeyPressed(key2) then begin result := true; exit; end; - result := false; -end; - -procedure processPlayerControls (plr: TPlayer; var ctrl: TPlayerControl; var MoveButton: Byte; p2hack: Boolean=false); -var - time: Word; - strafeDir: Byte; - i: Integer; -begin - if (plr = nil) then exit; - if (p2hack) then time := 1000 else time := 1; - strafeDir := MoveButton shr 4; - MoveButton := MoveButton and $0F; - with ctrl do - begin - if isKeyPressed(KeyLeft, KeyLeft2) and (not isKeyPressed(KeyRight, KeyRight2)) then MoveButton := 1 // Íàæàòà òîëüêî "Âëåâî" - else if (not isKeyPressed(KeyLeft, KeyLeft2)) and isKeyPressed(KeyRight, KeyRight2) then MoveButton := 2 // Íàæàòà òîëüêî "Âïðàâî" - else if (not isKeyPressed(KeyLeft, KeyLeft2)) and (not isKeyPressed(KeyRight, KeyRight2)) then MoveButton := 0; // Íå íàæàòû íè "Âëåâî", íè "Âïðàâî" - - // Ñåé÷àñ èëè ðàíüøå áûëè íàæàòû "Âëåâî"/"Âïðàâî" => ïåðåäàåì èãðîêó: - if MoveButton = 1 then plr.PressKey(KEY_LEFT, time) - else if MoveButton = 2 then plr.PressKey(KEY_RIGHT, time); - - // if we have "strafe" key, turn off old strafe mechanics - if isKeyPressed(KeyStrafe, KeyStrafe2) then - begin - // new strafe mechanics - if (strafeDir = 0) then strafeDir := MoveButton; // start strafing - // now set direction according to strafe (reversed) - if (strafeDir = 2) then plr.SetDirection(TDirection.D_LEFT) - else if (strafeDir = 1) then plr.SetDirection(TDirection.D_RIGHT); - end - else - begin - strafeDir := 0; // not strafing anymore - // Ðàíüøå áûëà íàæàòà "Âïðàâî", à ñåé÷àñ "Âëåâî" => áåæèì âïðàâî, ñìîòðèì âëåâî: - if (MoveButton = 2) and isKeyPressed(KeyLeft, KeyLeft2) then plr.SetDirection(TDirection.D_LEFT) - // Ðàíüøå áûëà íàæàòà "Âëåâî", à ñåé÷àñ "Âïðàâî" => áåæèì âëåâî, ñìîòðèì âïðàâî: - else if (MoveButton = 1) and isKeyPressed(KeyRight, KeyRight2) then plr.SetDirection(TDirection.D_RIGHT) - // ×òî-òî áûëî íàæàòî è íå èçìåíèëîñü => êóäà áåæèì, òóäà è ñìîòðèì: - else if MoveButton <> 0 then plr.SetDirection(TDirection(MoveButton-1)); - end; - - // fix movebutton state - MoveButton := MoveButton or (strafeDir shl 4); - - // Îñòàëüíûå êëàâèøè: - if isKeyPressed(KeyJump, KeyJump2) then plr.PressKey(KEY_JUMP, time); - if isKeyPressed(KeyUp, KeyUp2) then plr.PressKey(KEY_UP, time); - if isKeyPressed(KeyDown, KeyDown2) then plr.PressKey(KEY_DOWN, time); - if isKeyPressed(KeyFire, KeyFire2) then plr.PressKey(KEY_FIRE); - if isKeyPressed(KeyNextWeapon, KeyNextWeapon2) then plr.PressKey(KEY_NEXTWEAPON); - if isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2) then plr.PressKey(KEY_PREVWEAPON); - if isKeyPressed(KeyOpen, KeyOpen2) then plr.PressKey(KEY_OPEN); - - for i := 0 to High(KeyWeapon) do - if isKeyPressed(KeyWeapon[i], KeyWeapon2[i]) then - plr.QueueWeaponSwitch(i); // all choices are passed there, and god will take the best - end; - - // HACK: add dynlight here - if gwin_k8_enable_light_experiments then - begin - if e_KeyPressed(IK_F8) and gGameOn and (not gConsoleShow) and (g_ActiveWindow = nil) then - begin - g_playerLight := true; - end; - if e_KeyPressed(IK_F9) and gGameOn and (not gConsoleShow) and (g_ActiveWindow = nil) then - begin - g_playerLight := false; - end; - end; - - if gwin_has_stencil and g_playerLight then g_AddDynLight(plr.GameX+32, plr.GameY+40, 128, 1, 1, 0, 0.6); -end; - -procedure ProcessPlayerControls2 (plr: TPlayer; p: Integer; var MoveButton: Byte); +procedure ProcessPlayerControls (plr: TPlayer; p: Integer; var MoveButton: Byte); var time: Word; strafeDir: Byte; @@ -1634,7 +1553,7 @@ begin MoveButton := MoveButton or (strafeDir shl 4); // Îñòàëüíûå êëàâèøè: - if gPlayerAction[p, ACTION_MOVEUP] then plr.PressKey(KEY_JUMP, time); + if gPlayerAction[p, ACTION_JUMP] then plr.PressKey(KEY_JUMP, time); if gPlayerAction[p, ACTION_LOOKUP] then plr.PressKey(KEY_UP, time); if gPlayerAction[p, ACTION_LOOKDOWN] then plr.PressKey(KEY_DOWN, time); if gPlayerAction[p, ACTION_ATTACK] then plr.PressKey(KEY_FIRE); @@ -1642,17 +1561,11 @@ begin if gPlayerAction[p, ACTION_WEAPPREV] then plr.PressKey(KEY_PREVWEAPON); if gPlayerAction[p, ACTION_ACTIVATE] then plr.PressKey(KEY_OPEN); - if gPlayerAction[p, ACTION_WEAP1] then plr.QueueWeaponSwitch(WEAPON_KASTET); - if gPlayerAction[p, ACTION_WEAP2] then plr.QueueWeaponSwitch(WEAPON_SAW); - if gPlayerAction[p, ACTION_WEAP3] then plr.QueueWeaponSwitch(WEAPON_PISTOL); - if gPlayerAction[p, ACTION_WEAP4] then plr.QueueWeaponSwitch(WEAPON_SHOTGUN1); - if gPlayerAction[p, ACTION_WEAP5] then plr.QueueWeaponSwitch(WEAPON_SHOTGUN2); - if gPlayerAction[p, ACTION_WEAP6] then plr.QueueWeaponSwitch(WEAPON_CHAINGUN); - if gPlayerAction[p, ACTION_WEAP7] then plr.QueueWeaponSwitch(WEAPON_ROCKETLAUNCHER); - if gPlayerAction[p, ACTION_WEAP8] then plr.QueueWeaponSwitch(WEAPON_PLASMA); - if gPlayerAction[p, ACTION_WEAP9] then plr.QueueWeaponSwitch(WEAPON_BFG); - if gPlayerAction[p, ACTION_WEAP10] then plr.QueueWeaponSwitch(WEAPON_SUPERPULEMET); - if gPlayerAction[p, ACTION_WEAP11] then plr.QueueWeaponSwitch(WEAPON_FLAMETHROWER); + if nextQueueWeapon[p] >= 0 then + begin + plr.QueueWeaponSwitch(nextQueueWeapon[p]); + nextQueueWeapon[p] := -1 + end; // HACK: add dynlight here if gwin_k8_enable_light_experiments then @@ -1848,31 +1761,9 @@ begin g_Serverlist_Control(slCurrent, slTable); end; - if g_Game_IsNet then - if not gConsoleShow then - if not gChatShow then - begin - if g_ActiveWindow = nil then - begin - if e_KeyPressed(gGameControls.GameControls.Chat) or e_KeyPressed(VK_CHAT) then - g_Console_Chat_Switch(False) - else if (e_KeyPressed(gGameControls.GameControls.TeamChat) or e_KeyPressed(VK_TEAM)) and - (gGameSettings.GameMode in [GM_TDM, GM_CTF]) then - g_Console_Chat_Switch(True); - end; - end else - if not gChatEnter then - if (not e_KeyPressed(gGameControls.GameControls.Chat)) - and (not e_KeyPressed(gGameControls.GameControls.TeamChat)) - and (not e_KeyPressed(VK_CHAT)) - and (not e_KeyPressed(VK_TEAM)) then - gChatEnter := True; - // Ñòàòèñòèêà ïî Tab: if gGameOn then - IsDrawStat := (not gConsoleShow) and (not gChatShow) and - (gGameSettings.GameType <> GT_SINGLE) and - (e_KeyPressed(gGameControls.GameControls.Stat) or e_KeyPressed(VK_STATUS)); + IsDrawStat := (not gConsoleShow) and (not gChatShow) and (gGameSettings.GameType <> GT_SINGLE) and g_Console_Action(ACTION_SCORES); // Èãðà èäåò: if gGameOn and not gPause and (gState <> STATE_FOLD) then @@ -1947,10 +1838,8 @@ begin if gPlayer2 <> nil then gPlayer2.ReleaseKeys(); if (not gConsoleShow) and (not gChatShow) and (g_ActiveWindow = nil) then begin - //processPlayerControls(gPlayer1, gGameControls.P1Control, P1MoveButton); - //processPlayerControls(gPlayer2, gGameControls.P2Control, P2MoveButton, true); - ProcessPlayerControls2(gPlayer1, 0, P1MoveButton); - ProcessPlayerControls2(gPlayer2, 1, P2MoveButton); + ProcessPlayerControls(gPlayer1, 0, P1MoveButton); + ProcessPlayerControls(gPlayer2, 1, P2MoveButton); end // if not console else begin @@ -1965,8 +1854,7 @@ begin begin if not gSpectKeyPress then begin - if isKeyPressed(gGameControls.P1Control.KeyJump, gGameControls.P1Control.KeyJump2) - and (not gSpectAuto) then + if gPlayerAction[0, ACTION_JUMP] and (not gSpectAuto) then begin // switch spect mode case gSpectMode of @@ -1980,21 +1868,21 @@ begin if (gSpectMode = SPECT_MAPVIEW) and (not gSpectAuto) then begin - if isKeyPressed(gGameControls.P1Control.KeyLeft, gGameControls.P1Control.KeyLeft2) then + if gPlayerAction[0, ACTION_MOVELEFT] then gSpectX := Max(gSpectX - gSpectStep, 0); - if isKeyPressed(gGameControls.P1Control.KeyRight, gGameControls.P1Control.KeyRight2) then + if gPlayerAction[0, ACTION_MOVERIGHT] then gSpectX := Min(gSpectX + gSpectStep, gMapInfo.Width - gScreenWidth); - if isKeyPressed(gGameControls.P1Control.KeyUp, gGameControls.P1Control.KeyUp2) then + if gPlayerAction[0, ACTION_LOOKUP] then gSpectY := Max(gSpectY - gSpectStep, 0); - if isKeyPressed(gGameControls.P1Control.KeyDown, gGameControls.P1Control.KeyDown2) then + if gPlayerAction[0, ACTION_LOOKDOWN] then gSpectY := Min(gSpectY + gSpectStep, gMapInfo.Height - gScreenHeight); - if isKeyPressed(gGameControls.P1Control.KeyPrevWeapon, gGameControls.P1Control.KeyPrevWeapon2) then + if gPlayerAction[0, ACTION_WEAPPREV] then begin // decrease step if gSpectStep > 4 then gSpectStep := gSpectStep shr 1; gSpectKeyPress := True; end; - if isKeyPressed(gGameControls.P1Control.KeyNextWeapon, gGameControls.P1Control.KeyNextWeapon2) then + if gPlayerAction[0, ACTION_WEAPNEXT] then begin // increase step if gSpectStep < 64 then gSpectStep := gSpectStep shl 1; @@ -2004,44 +1892,44 @@ begin if (gSpectMode = SPECT_PLAYERS) and (not gSpectAuto) then begin - if isKeyPressed(gGameControls.P1Control.KeyUp, gGameControls.P1Control.KeyUp2) then + if gPlayerAction[0, ACTION_LOOKUP] then begin // add second view gSpectViewTwo := True; gSpectKeyPress := True; end; - if isKeyPressed(gGameControls.P1Control.KeyDown, gGameControls.P1Control.KeyDown2) then + if gPlayerAction[0, ACTION_LOOKDOWN] then begin // remove second view gSpectViewTwo := False; gSpectKeyPress := True; end; - if isKeyPressed(gGameControls.P1Control.KeyLeft, gGameControls.P1Control.KeyLeft2) then + if gPlayerAction[0, ACTION_MOVELEFT] then begin // prev player (view 1) gSpectPID1 := GetActivePlayerID_Prev(gSpectPID1); gSpectKeyPress := True; end; - if isKeyPressed(gGameControls.P1Control.KeyRight, gGameControls.P1Control.KeyRight2) then + if gPlayerAction[0, ACTION_MOVERIGHT] then begin // next player (view 1) gSpectPID1 := GetActivePlayerID_Next(gSpectPID1); gSpectKeyPress := True; end; - if isKeyPressed(gGameControls.P1Control.KeyPrevWeapon, gGameControls.P1Control.KeyPrevWeapon2) then + if gPlayerAction[0, ACTION_WEAPPREV] then begin // prev player (view 2) gSpectPID2 := GetActivePlayerID_Prev(gSpectPID2); gSpectKeyPress := True; end; - if isKeyPressed(gGameControls.P1Control.KeyNextWeapon, gGameControls.P1Control.KeyNextWeapon2) then + if gPlayerAction[0, ACTION_WEAPNEXT] then begin // next player (view 2) gSpectPID2 := GetActivePlayerID_Next(gSpectPID2); gSpectKeyPress := True; end; end; - if isKeyPressed(gGameControls.P1Control.KeyFire, gGameControls.P1Control.KeyFire2) then + if gPlayerAction[0, ACTION_ATTACK] then begin if (gSpectMode = SPECT_STATS) and (not gSpectAuto) then begin @@ -2060,14 +1948,14 @@ begin end; end else - if (not isKeyPressed(gGameControls.P1Control.KeyJump, gGameControls.P1Control.KeyJump2)) and - (not isKeyPressed(gGameControls.P1Control.KeyFire, gGameControls.P1Control.KeyFire2)) and - (not isKeyPressed(gGameControls.P1Control.KeyLeft, gGameControls.P1Control.KeyLeft2)) and - (not isKeyPressed(gGameControls.P1Control.KeyRight, gGameControls.P1Control.KeyRight2)) and - (not isKeyPressed(gGameControls.P1Control.KeyUp, gGameControls.P1Control.KeyUp2)) and - (not isKeyPressed(gGameControls.P1Control.KeyDown, gGameControls.P1Control.KeyDown2)) and - (not isKeyPressed(gGameControls.P1Control.KeyPrevWeapon, gGameControls.P1Control.KeyPrevWeapon2)) and - (not isKeyPressed(gGameControls.P1Control.KeyNextWeapon, gGameControls.P1Control.KeyNextWeapon2)) then + if (not gPlayerAction[0, ACTION_JUMP]) and + (not gPlayerAction[0, ACTION_ATTACK]) and + (not gPlayerAction[0, ACTION_MOVELEFT]) and + (not gPlayerAction[0, ACTION_MOVERIGHT]) and + (not gPlayerAction[0, ACTION_LOOKUP]) and + (not gPlayerAction[0, ACTION_LOOKDOWN]) and + (not gPlayerAction[0, ACTION_WEAPPREV]) and + (not gPlayerAction[0, ACTION_WEAPNEXT]) then gSpectKeyPress := False; if gSpectAuto then @@ -2242,14 +2130,6 @@ begin end; end; -// Äåëàåì ñêðèíøîò (íå ÷àùå 200 ìèëëèñåêóíä): - if e_KeyPressed(gGameControls.GameControls.TakeScreenshot) or e_KeyPressed(VK_PRINTSCR) then - if (GetTimer()-LastScreenShot) > 200000 div 1000 then - begin - g_TakeScreenShot(); - LastScreenShot := GetTimer(); - end; - // Ãîðÿ÷àÿ êëàâèøà äëÿ âûçîâà ìåíþ âûõîäà èç èãðû (F10): if e_KeyPressed(IK_F10) and gGameOn and @@ -2617,7 +2497,7 @@ begin g_ProcessMessages(); - if e_KeyPressed(IK_TAB) or e_KeyPressed(VK_STATUS) then + if g_Console_Action(ACTION_SCORES) then begin if not gStatsPressed then begin @@ -6931,6 +6811,42 @@ begin end; end; end + else if cmd = 'screenshot' then + begin + g_TakeScreenShot() + end + else if cmd = 'togglechat' then + begin + g_Console_Chat_Switch(False); + gSkipFirstChar := not g_Console_Interactive() + end + else if cmd = 'toggleteamchat' then + begin + if gGameSettings.GameMode in [GM_TDM, GM_CTF] then + begin + g_Console_Chat_Switch(True); + gSkipFirstChar := not g_Console_Interactive() + end + end + else if cmd = 'weapon' then + begin + if Length(p) = 2 then + begin + a := WP_FIRST + StrToInt(p[1]) - 1; + if (a >= WP_FIRST) and (a <= WP_LAST) then + nextQueueWeapon[0] := a + end + end + else if (cmd = 'p1_weapon') or (cmd = 'p2_weapon') then + begin + if Length(p) = 2 then + begin + a := WP_FIRST + StrToInt(p[1]) - 1; + b := ord(cmd[2]) - ord('1'); + if (a >= WP_FIRST) and (a <= WP_LAST) then + nextQueueWeapon[b] := a + end + end // Êîìàíäû Ñâîåé èãðû: else if gGameSettings.GameType in [GT_CUSTOM, GT_SERVER, GT_CLIENT] then begin diff --git a/src/game/g_main.pas b/src/game/g_main.pas index c789caf..ccad27b 100644 --- a/src/game/g_main.pas +++ b/src/game/g_main.pas @@ -32,7 +32,7 @@ var MapsDir: string; ModelsDir: string; GameWAD: string; - + gSkipFirstChar: Boolean; (* hack for console/chat input *) implementation @@ -496,7 +496,8 @@ begin IK_BACKQUOTE, VK_CONSOLE: // <`/~/¨/¸>: begin - g_Console_Switch(); + if not gChatShow then + g_Console_Switch() end; IK_ESCAPE, VK_ESCAPE: // : @@ -588,6 +589,12 @@ var Msg: g_gui.TMessage; a: Integer; begin + if gSkipFirstChar then + begin + gSkipFirstChar := False; + Exit + end; + if (not gChatShow) and ((C = '`') or (C = '~') or (C = '¸') or (C = '¨')) then Exit; if gConsoleShow or gChatShow then -- 2.29.2