X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_console.pas;h=b62a7e186c920d98b873e8c6eaebcd6f26d0292c;hb=0944e70467355a7771d42015b6e548050e6fa3b7;hp=e0f401deeade15964e5c93c103ecebfa6065088c;hpb=98ad2c936a61bb810453f3552d7ed273eeaeaef3;p=d2df-sdl.git diff --git a/src/game/g_console.pas b/src/game/g_console.pas index e0f401d..b62a7e1 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -43,6 +43,9 @@ procedure g_Console_Chat_Switch (team: Boolean=false); procedure conRegVar (const conname: AnsiString; pvar: PBoolean; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false); overload; procedure conRegVar (const conname: AnsiString; pvar: PSingle; amin, amax: Single; const ahelp: AnsiString; const amsg: AnsiString; acheat: 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; + var gConsoleShow: Boolean = false; // True - êîíñîëü îòêðûòà èëè îòêðûâàåòñÿ @@ -113,6 +116,45 @@ var end; +// poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks +function conParseFloat (var res: Single; const s: AnsiString): Boolean; +var + pos: Integer = 1; + frac: Single = 1; + slen: Integer; +begin + result := false; + res := 0; + slen := Length(s); + while (slen > 0) and (s[slen] <= ' ') do Dec(slen); + while (pos <= slen) and (s[pos] <= ' ') do Inc(pos); + if (pos > slen) then exit; + if (slen-pos = 1) and (s[pos] = '.') then exit; // single dot + // integral part + while (pos <= slen) do + begin + if (s[pos] < '0') or (s[pos] > '9') then break; + res := res*10+Byte(s[pos])-48; + Inc(pos); + end; + if (pos <= slen) then + begin + // must be a dot + if (s[pos] <> '.') then exit; + Inc(pos); + while (pos <= slen) do + begin + if (s[pos] < '0') or (s[pos] > '9') then break; + frac := frac/10; + res += frac*(Byte(s[pos])-48); + Inc(pos); + end; + end; + if (pos <= slen) then exit; // oops + result := true; +end; + + // ////////////////////////////////////////////////////////////////////////// // // <0: no arg; 0/1: true/false; 666: toggle function conGetBoolArg (p: SArray; idx: Integer): Integer; @@ -137,9 +179,9 @@ procedure boolVarHandler (me: PCommand; p: SArray); begin case conGetBoolArg(p, 1) of -1: begin end; - 0: if conIsCheatsEnabled then flag := false else begin conwriteln('not available'); exit; end; - 1: if conIsCheatsEnabled then flag := true else begin conwriteln('not available'); exit; end; - 666: if conIsCheatsEnabled then flag := not flag else begin conwriteln('not available'); exit; 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 flag then conwritefln('%s: tan', [msg]) else conwritefln('%s: ona', [msg]); end; @@ -178,43 +220,6 @@ type procedure singleVarHandler (me: PCommand; p: SArray); - // poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks - function parseFloat (var res: Single; const s: AnsiString): Boolean; - var - pos: Integer = 1; - frac: Single = 1; - slen: Integer; - begin - result := false; - res := 0; - slen := Length(s); - while (slen > 0) and (s[slen] <= ' ') do Dec(slen); - while (pos <= slen) and (s[pos] <= ' ') do Inc(pos); - if (pos > slen) then exit; - if (slen-pos = 1) and (s[pos] = '.') then exit; // single dot - // integral part - while (pos <= slen) do - begin - if (s[pos] < '0') or (s[pos] > '9') then break; - res := res*10+Byte(s[pos])-48; - Inc(pos); - end; - if (pos <= slen) then - begin - // must be a dot - if (s[pos] <> '.') then exit; - Inc(pos); - while (pos <= slen) do - begin - if (s[pos] < '0') or (s[pos] > '9') then break; - frac := frac/10; - res += frac*(Byte(s[pos])-48); - Inc(pos); - end; - end; - if (pos <= slen) then exit; // oops - result := true; - end; var pv: PVarSingle; nv: Single; @@ -228,7 +233,7 @@ begin pv := PVarSingle(me.ptr); if (Length(p) = 2) then begin - if not conIsCheatsEnabled then begin conwriteln('not available'); exit; end; + if me.cheat and (not conIsCheatsEnabled) then begin conwriteln('not available'); exit; end; if (CompareText(p[1], 'default') = 0) or (CompareText(p[1], 'def') = 0) or (CompareText(p[1], 'd') = 0) or (CompareText(p[1], 'off') = 0) or (CompareText(p[1], 'ona') = 0) then @@ -237,7 +242,7 @@ begin end else begin - if not parseFloat(nv, p[1]) then + if not conParseFloat(nv, p[1]) then begin conwritefln('%s: ''%s'' doesn''t look like a floating number', [p[0], p[1]]); exit; @@ -556,6 +561,15 @@ begin cp.cheat := acheat; end; + +procedure segfault (p: SArray); +var + pp: PByte = nil; +begin + pp^ := 0; +end; + + procedure g_Console_Init(); var a: Integer; @@ -574,6 +588,8 @@ begin Time := 0; end; + AddCommand('segfault', segfault, 'make segfault'); + AddCommand('clear', ConsoleCommands, 'clear console'); AddCommand('clearhistory', ConsoleCommands); AddCommand('showhistory', ConsoleCommands); @@ -1377,4 +1393,5 @@ begin g_Console_Add(Format(_lc[I_CONSOLE_UNKNOWN], [Arr[0]])); end; + end.