X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_console.pas;h=f91bc624495dbbf29073904eb7ede60a3be7d8b7;hb=7fff36f90fbb1fb0f5a8cdc8d3c49a5dc2ee67b8;hp=19c83b6f67c7c5ddc5269a838c295bc7643ff246;hpb=69e1c288d6d270abd835cde8a87e818d0298799f;p=d2df-sdl.git diff --git a/src/game/g_console.pas b/src/game/g_console.pas index 19c83b6..f91bc62 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -1,4 +1,4 @@ -(* Copyright (C) DooM 2D:Forever Developers +(* Copyright (C) Doom 2D: Forever Developers * * 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 @@ -19,7 +19,7 @@ unit g_console; interface uses - wadreader; // for SArray + utils; // for SSArray procedure g_Console_Init (); procedure g_Console_Update (); @@ -36,12 +36,13 @@ procedure conwriteln (const s: AnsiString; show: Boolean=false); procedure conwritefln (const s: AnsiString; args: array of const; show: Boolean=false); // <0: no arg; 0/1: true/false -function conGetBoolArg (p: SArray; idx: Integer): Integer; +function conGetBoolArg (p: SSArray; idx: Integer): Integer; procedure g_Console_Chat_Switch (team: Boolean=false); 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; // poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks function conParseFloat (var res: Single; const s: AnsiString): Boolean; @@ -60,15 +61,15 @@ implementation uses g_textures, g_main, e_graphics, e_input, g_game, - SysUtils, g_basic, g_options, Math, - g_menu, g_language, g_net, g_netmsg, e_log, conbuf, utils; + SysUtils, g_basic, g_options, Math, g_touch, + g_menu, g_language, g_net, g_netmsg, e_log, conbuf; type PCommand = ^TCommand; - TCmdProc = procedure (p: SArray); - TCmdProcEx = procedure (me: PCommand; p: SArray); + TCmdProc = procedure (p: SSArray); + TCmdProcEx = procedure (me: PCommand; p: SSArray); TCommand = record cmd: AnsiString; @@ -83,7 +84,7 @@ type TAlias = record name: AnsiString; - commands: SArray; + commands: SSArray; end; @@ -103,9 +104,9 @@ var Cons_Shown: Boolean; // Ðèñîâàòü ëè êîíñîëü? Line: AnsiString; CPos: Word; - //ConsoleHistory: SArray; - CommandHistory: SArray; - Whitelist: SArray; + //ConsoleHistory: SSArray; + CommandHistory: SSArray; + Whitelist: SSArray; commands: Array of TCommand = nil; Aliases: Array of TAlias = nil; CmdIndex: Word; @@ -157,7 +158,7 @@ end; // ////////////////////////////////////////////////////////////////////////// // // <0: no arg; 0/1: true/false; 666: toggle -function conGetBoolArg (p: SArray; idx: Integer): Integer; +function conGetBoolArg (p: SSArray; idx: Integer): Integer; begin if (idx < 0) or (idx > High(p)) then begin result := -1; exit; end; result := 0; @@ -168,7 +169,7 @@ begin end; -procedure boolVarHandler (me: PCommand; p: SArray); +procedure boolVarHandler (me: PCommand; p: SSArray); procedure binaryFlag (var flag: Boolean; msg: AnsiString); begin if (Length(p) > 2) then @@ -192,6 +193,41 @@ begin end; +procedure intVarHandler (me: PCommand; p: SSArray); + procedure binaryFlag (var flag: Boolean; msg: AnsiString); + begin + if (Length(p) > 2) then + begin + conwritefln('too many arguments to ''%s''', [p[0]]); + end + else + begin + case conGetBoolArg(p, 1) of + -1: begin end; + 0: if not me.cheat or conIsCheatsEnabled then flag := false else begin conwriteln('not available'); exit; end; + 1: if not me.cheat or conIsCheatsEnabled then flag := true else begin conwriteln('not available'); exit; end; + 666: if not me.cheat or conIsCheatsEnabled then flag := not flag else begin conwriteln('not available'); exit; end; + end; + if (Length(msg) = 0) then msg := p[0] else msg += ':'; + if flag then conwritefln('%s tan', [msg]) else conwritefln('%s ona', [msg]); + end; + end; +begin + if (Length(p) <> 2) then + begin + conwritefln('%s %d', [me.cmd, PInteger(me.ptr)^]); + end + else + begin + try + PInteger(me.ptr)^ := StrToInt(p[1]); + except + conwritefln('invalid integer value: "%s"', [p[1]]); + end; + 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; @@ -211,6 +247,25 @@ begin end; +procedure conRegVar (const conname: AnsiString; pvar: PInteger; 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 := intVarHandler; + cp.help := ahelp; + cp.hidden := ahidden; + cp.ptr := pvar; + cp.msg := amsg; + cp.cheat := acheat; +end; + + // ////////////////////////////////////////////////////////////////////////// // type PVarSingle = ^TVarSingle; @@ -220,7 +275,7 @@ type end; -procedure singleVarHandler (me: PCommand; p: SArray); +procedure singleVarHandler (me: PCommand; p: SSArray); var pv: PVarSingle; nv: Single; @@ -265,7 +320,7 @@ var cp: PCommand; pv: PVarSingle; begin - GetMem(pv, sizeof(pv^)); + GetMem(pv, sizeof(TVarSingle)); pv.val := pvar; pv.min := amin; pv.max := amax; @@ -300,7 +355,7 @@ begin end; end; -function ParseAlias(Str: AnsiString): SArray; +function ParseAlias(Str: AnsiString): SSArray; begin Result := nil; @@ -316,7 +371,7 @@ begin end; end; -procedure ConsoleCommands(p: SArray); +procedure ConsoleCommands(p: SSArray); var cmd, s: AnsiString; a, b: Integer; @@ -469,6 +524,13 @@ begin g_Console_Add('exec