X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_console.pas;h=9a8fd1188eb6c3269a040c4253d8000cac2082d4;hb=16342bee09fa001d05697571124e48a93cd35f2c;hp=35f86b6ec63b27cdc9408d4e36bd84416cc111c2;hpb=bbbeedfda9dba4529b0a7eac50ebbdb20cfbedb0;p=d2df-sdl.git diff --git a/src/game/g_console.pas b/src/game/g_console.pas index 35f86b6..9a8fd11 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -2,8 +2,7 @@ * * 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, either version 3 of the License, or - * (at your option) any later version. + * the Free Software Foundation, version 3 of the License ONLY. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -37,9 +36,19 @@ uses FIRST_ACTION = ACTION_JUMP; LAST_ACTION = ACTION_WEAPPREV; + var (* private state *) + Line: AnsiString; + CPos: Word; + conSkipLines: Integer; + MsgArray: Array [0..4] of record + Msg: AnsiString; + Time: Word; + end; + procedure g_Console_Init; +procedure g_Console_Initialize; +procedure g_Console_Finalize; procedure g_Console_Update; -procedure g_Console_Draw; procedure g_Console_Char (C: AnsiChar); procedure g_Console_Control (K: Word); procedure g_Console_Process (L: AnsiString; quiet: Boolean=false); @@ -56,6 +65,7 @@ function g_Console_MatchBind (key: Integer; down: AnsiString; up: 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_ProcessBindRepeat (key: Integer); procedure g_Console_ResetBinds; procedure conwriteln (const s: AnsiString; show: Boolean=false); @@ -64,6 +74,9 @@ procedure conwritefln (const s: AnsiString; args: array of const; show: Boolean= procedure conRegVar (const conname: AnsiString; pvar: PBoolean; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; procedure conRegVar (const conname: AnsiString; pvar: PSingle; amin, amax: Single; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; procedure conRegVar (const conname: AnsiString; pvar: PInteger; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; +procedure conRegVar (const conname: AnsiString; pvar: PWord; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; +procedure conRegVar (const conname: AnsiString; pvar: PCardinal; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; +procedure conRegVar (const conname: AnsiString; pvar: PAnsiString; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; // <0: no arg; 0/1: true/false function conGetBoolArg (p: SSArray; idx: Integer): Integer; @@ -71,6 +84,8 @@ function conGetBoolArg (p: SSArray; idx: Integer): Integer; // poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks function conParseFloat (var res: Single; const s: AnsiString): Boolean; +const + defaultConfigScript = 'dfconfig.cfg'; var gConsoleShow: Boolean = false; // True - êîíñîëü îòêðûòà èëè îòêðûâàåòñÿ @@ -78,16 +93,31 @@ var gChatTeam: Boolean = false; gAllowConsoleMessages: Boolean = true; gJustChatted: Boolean = false; // ÷òîáû àäìèí â èíòåðå ÷àòÿñü íå ïðîìàòûâàë ñòàòèñòèêó - gParsingBinds: Boolean = false; // íå ïåðåñîõðàíÿòü êîíôèã âî âðåìÿ ïàðñèíãà + gParsingBinds: Boolean = true; // íå ïåðåñîõðàíÿòü êîíôèã âî âðåìÿ ïàðñèíãà gPlayerAction: Array [0..1, 0..LAST_ACTION] of Boolean; // [player, action] + gConfigScript: string = defaultConfigScript; implementation uses - g_textures, g_main, e_graphics, e_input, g_game, - SysUtils, g_basic, g_options, Math, g_touch, - g_menu, g_gui, g_language, g_net, g_netmsg, e_log, conbuf; + {$IFDEF ENABLE_MENU} + g_gui, g_menu, + {$ENDIF} + {$IFDEF ENABLE_TOUCH} + g_system, + {$ENDIF} + {$IFDEF ENABLE_GFX} + g_gfx, + {$ENDIF} + {$IFDEF ENABLE_GIBS} + g_gibs, + {$ENDIF} + g_textures, e_input, g_game, g_player, g_items, + SysUtils, g_basic, g_options, Math, e_res, + g_language, g_net, g_netmsg, e_log, conbuf; +const + configComment = 'generated by doom2d, do not modify'; type PCommand = ^TCommand; @@ -115,46 +145,35 @@ type const - Step = 32; - Alpha = 25; MsgTime = 144; MaxScriptRecursion = 16; - DEBUG_STRING = 'DEBUG MODE'; - var - ID: DWORD; RecursionDepth: Word = 0; RecursionLimitHit: Boolean = False; - Cons_Y: SmallInt; - Cons_Shown: Boolean; // Ðèñîâàòü ëè êîíñîëü? - Line: AnsiString; - CPos: Word; + InputReady: Boolean; // allow text input in console/chat //ConsoleHistory: SSArray; CommandHistory: SSArray; Whitelist: SSArray; commands: Array of TCommand = nil; Aliases: Array of TAlias = nil; CmdIndex: Word; - conSkipLines: Integer = 0; - MsgArray: Array [0..4] of record - Msg: AnsiString; - Time: Word; - end; gInputBinds: Array [0..e_MaxInputKeys - 1] of record + rep: Boolean; down, up: SSArray; end; - menu_toggled: BOOLEAN; (* hack for menu controls *) - gSkipFirstChar: Boolean; (* hack for console/chat input *) + menu_toggled: BOOLEAN; (* hack for menu controls *) procedure g_Console_Switch; begin gChatShow := False; gConsoleShow := not gConsoleShow; - Cons_Shown := True; - g_Touch_ShowKeyboard(gConsoleShow or gChatShow); + InputReady := False; + {$IFDEF ENABLE_TOUCH} + sys_ShowKeyboard(gConsoleShow or gChatShow); + {$ENDIF} end; procedure g_Console_Chat_Switch (Team: Boolean = False); @@ -163,9 +182,12 @@ begin gConsoleShow := False; gChatShow := not gChatShow; gChatTeam := Team; + InputReady := False; Line := ''; CPos := 1; - g_Touch_ShowKeyboard(gConsoleShow or gChatShow); + {$IFDEF ENABLE_TOUCH} + sys_ShowKeyboard(gConsoleShow or gChatShow); + {$ENDIF} end; // poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks @@ -271,6 +293,68 @@ begin end; +procedure wordVarHandler (me: PCommand; p: SSArray); +var + old: Integer; +begin + if (Length(p) <> 2) then + begin + conwritefln('%s %d', [me.cmd, PInteger(me.ptr)^]); + end + else + begin + try + old := PWord(me.ptr)^; + PWord(me.ptr)^ := min($FFFF, StrToDWord(p[1])); + if PWord(me.ptr)^ <> old then + g_Console_WriteGameConfig(); + except + conwritefln('invalid word value: "%s"', [p[1]]); + end; + end; +end; + + +procedure dwordVarHandler (me: PCommand; p: SSArray); +var + old: Integer; +begin + if (Length(p) <> 2) then + begin + conwritefln('%s %d', [me.cmd, PInteger(me.ptr)^]); + end + else + begin + try + old := PCardinal(me.ptr)^; + PCardinal(me.ptr)^ := StrToDWord(p[1]); + if PCardinal(me.ptr)^ <> old then + g_Console_WriteGameConfig(); + except + conwritefln('invalid dword value: "%s"', [p[1]]); + end; + end; +end; + + +procedure strVarHandler (me: PCommand; p: SSArray); +var + old: AnsiString; +begin + if (Length(p) <> 2) then + begin + conwritefln('%s %s', [me.cmd, QuoteStr(PAnsiString(me.ptr)^)]); + end + else + begin + old := PAnsiString(me.ptr)^; + PAnsiString(me.ptr)^ := p[1]; + if PAnsiString(me.ptr)^ <> old then + g_Console_WriteGameConfig(); + end; +end; + + procedure conRegVar (const conname: AnsiString; pvar: PBoolean; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; var f: Integer; @@ -313,6 +397,68 @@ begin end; +procedure conRegVar (const conname: AnsiString; pvar: PWord; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; +var + f: Integer; + cp: PCommand; +begin + f := Length(commands); + SetLength(commands, f+1); + cp := @commands[f]; + cp.cmd := LowerCase(conname); + cp.proc := nil; + cp.procEx := wordVarHandler; + cp.help := ahelp; + cp.hidden := ahidden; + cp.ptr := pvar; + cp.msg := amsg; + cp.cheat := acheat; + cp.action := -1; + cp.player := -1; +end; + + +procedure conRegVar (const conname: AnsiString; pvar: PCardinal; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; +var + f: Integer; + cp: PCommand; +begin + f := Length(commands); + SetLength(commands, f+1); + cp := @commands[f]; + cp.cmd := LowerCase(conname); + cp.proc := nil; + cp.procEx := dwordVarHandler; + cp.help := ahelp; + cp.hidden := ahidden; + cp.ptr := pvar; + cp.msg := amsg; + cp.cheat := acheat; + cp.action := -1; + cp.player := -1; +end; + + +procedure conRegVar (const conname: AnsiString; pvar: PAnsiString; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload; +var + f: Integer; + cp: PCommand; +begin + f := Length(commands); + SetLength(commands, f+1); + cp := @commands[f]; + cp.cmd := LowerCase(conname); + cp.proc := nil; + cp.procEx := strVarHandler; + cp.help := ahelp; + cp.hidden := ahidden; + cp.ptr := pvar; + cp.msg := amsg; + cp.cheat := acheat; + cp.action := -1; + cp.player := -1; +end; + // ////////////////////////////////////////////////////////////////////////// // type PVarSingle = ^TVarSingle; @@ -530,7 +676,7 @@ begin begin // exec if Length(p) = 2 then - g_Console_ReadConfig(GameDir + '/' + p[1]) + g_Console_ReadConfig(p[1]) else g_Console_Add('exec