X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fgame%2Fg_console.pas;h=64b08642029b320c93a0377ae8a56526b94eb821;hp=7caa3ba142386b5eac3b72d0a977f6d529218cc3;hb=51998d817120cd3833df7bae3d355642fd4abde5;hpb=0e101bd452c40da601236aaa2dd4106be47ddce1 diff --git a/src/game/g_console.pas b/src/game/g_console.pas index 7caa3ba..64b0864 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -30,13 +30,12 @@ uses ACTION_SCORES = 6; ACTION_ACTIVATE = 7; ACTION_STRAFE = 8; - ACTION_WEAPNEXT = 9; - ACTION_WEAPPREV = 10; FIRST_ACTION = ACTION_JUMP; - LAST_ACTION = ACTION_WEAPPREV; + LAST_ACTION = ACTION_STRAFE; procedure g_Console_Init; +procedure g_Console_SysInit; procedure g_Console_Update; procedure g_Console_Draw (MessagesOnly: Boolean = False); procedure g_Console_Char (C: AnsiChar); @@ -53,8 +52,9 @@ function g_Console_Interactive: Boolean; function g_Console_Action (action: Integer): Boolean; function g_Console_MatchBind (key: Integer; down: AnsiString; up: AnsiString = ''): Boolean; function g_Console_FindBind (n: Integer; down: AnsiString; up: AnsiString = ''): Integer; -procedure g_Console_BindKey (key: Integer; down: AnsiString; up: AnsiString = ''); +procedure g_Console_BindKey (key: Integer; down: AnsiString; up: AnsiString = ''; rep: Boolean = False); 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); @@ -63,6 +63,8 @@ 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 @@ -71,6 +73,12 @@ 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 + {$IFDEF HEADLESS} + defaultConfigScript = 'dfserver.cfg'; + {$ELSE} + defaultConfigScript = 'dfconfig.cfg'; + {$ENDIF} var gConsoleShow: Boolean = false; // True - êîíñîëü îòêðûòà èëè îòêðûâàåòñÿ @@ -80,14 +88,18 @@ var gJustChatted: 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; + g_textures, g_main, e_graphics, e_input, g_game, g_gfx, g_player, g_items, + SysUtils, g_basic, g_options, Math, g_touch, e_res, + g_menu, g_gui, g_language, g_net, g_netmsg, e_log, conbuf, g_weapons; +const + autoexecScript = 'autoexec.cfg'; + configComment = 'generated by doom2d, do not modify'; type PCommand = ^TCommand; @@ -143,6 +155,7 @@ var end; gInputBinds: Array [0..e_MaxInputKeys - 1] of record + rep: Boolean; down, up: SSArray; end; menu_toggled: BOOLEAN; (* hack for menu controls *) @@ -282,6 +295,50 @@ 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; @@ -342,6 +399,48 @@ 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; @@ -579,7 +678,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