diff --git a/src/game/g_console.pas b/src/game/g_console.pas
index b62a7e186c920d98b873e8c6eaebcd6f26d0292c..7b68cce099b4130ca24d2a779501b32caecef2be 100644 (file)
--- a/src/game/g_console.pas
+++ b/src/game/g_console.pas
-(* 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
*
* 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
interface
uses
interface
uses
- wadreader; // for SArray
+ utils; // for SSArray
procedure g_Console_Init ();
procedure g_Console_Update ();
procedure g_Console_Init ();
procedure g_Console_Update ();
procedure conwritefln (const s: AnsiString; args: array of const; show: Boolean=false);
// <0: no arg; 0/1: true/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 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;
+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;
// poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks
function conParseFloat (var res: Single; const s: AnsiString): Boolean;
uses
g_textures, g_main, e_graphics, e_input, g_game,
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;
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;
TCommand = record
cmd: AnsiString;
TAlias = record
name: AnsiString;
TAlias = record
name: AnsiString;
- commands: SArray;
+ commands: SSArray;
end;
end;
Cons_Shown: Boolean; // Ðèñîâàòü ëè êîíñîëü?
Line: AnsiString;
CPos: Word;
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;
commands: Array of TCommand = nil;
Aliases: Array of TAlias = nil;
CmdIndex: Word;
// ////////////////////////////////////////////////////////////////////////// //
// <0: no arg; 0/1: true/false; 666: toggle
// ////////////////////////////////////////////////////////////////////////// //
// <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;
begin
if (idx < 0) or (idx > High(p)) then begin result := -1; exit; end;
result := 0;
end;
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
procedure binaryFlag (var flag: Boolean; msg: AnsiString);
begin
if (Length(p) > 2) then
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;
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]);
+ 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
end;
end;
begin
end;
end;
-procedure conRegVar (const conname: AnsiString; pvar: PBoolean; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false); overload;
+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;
cp: PCommand;
var
f: Integer;
cp: PCommand;
cp.proc := nil;
cp.procEx := boolVarHandler;
cp.help := ahelp;
cp.proc := nil;
cp.procEx := boolVarHandler;
cp.help := ahelp;
- cp.hidden := false;
+ cp.hidden := ahidden;
+ cp.ptr := pvar;
+ cp.msg := amsg;
+ cp.cheat := acheat;
+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;
cp.ptr := pvar;
cp.msg := amsg;
cp.cheat := acheat;
end;
end;
-procedure singleVarHandler (me: PCommand; p: SArray);
+procedure singleVarHandler (me: PCommand; p: SSArray);
var
pv: PVarSingle;
nv: Single;
var
pv: PVarSingle;
nv: Single;
begin
if (Length(p) > 2) then
begin
begin
if (Length(p) > 2) then
begin
- conwritefln('too many arguments to ''%s''', [p[0]]);
+ conwritefln('too many arguments to ''%s''', [me.cmd]);
exit;
end;
pv := PVarSingle(me.ptr);
exit;
end;
pv := PVarSingle(me.ptr);
begin
if not conParseFloat(nv, p[1]) then
begin
begin
if not conParseFloat(nv, p[1]) then
begin
- conwritefln('%s: ''%s'' doesn''t look like a floating number', [p[0], p[1]]);
+ conwritefln('%s: ''%s'' doesn''t look like a floating number', [me.cmd, p[1]]);
exit;
end;
if (nv < pv.min) then nv := pv.min;
exit;
end;
if (nv < pv.min) then nv := pv.min;
end;
end;
msg := me.msg;
end;
end;
msg := me.msg;
- if (Length(msg) = 0) then msg := p[0] else msg += ':';
+ if (Length(msg) = 0) then msg := me.cmd else msg += ':';
conwritefln('%s %s', [msg, pv.val^]);
end;
conwritefln('%s %s', [msg, pv.val^]);
end;
-procedure conRegVar (const conname: AnsiString; pvar: PSingle; amin, amax: Single; 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; ahidden: Boolean=false); overload;
var
f: Integer;
cp: PCommand;
pv: PVarSingle;
begin
var
f: Integer;
cp: PCommand;
pv: PVarSingle;
begin
- GetMem(pv, sizeof(pv^));
+ GetMem(pv, sizeof(TVarSingle));
pv.val := pvar;
pv.min := amin;
pv.max := amax;
pv.val := pvar;
pv.min := amin;
pv.max := amax;
cp.proc := nil;
cp.procEx := singleVarHandler;
cp.help := ahelp;
cp.proc := nil;
cp.procEx := singleVarHandler;
cp.help := ahelp;
- cp.hidden := false;
+ cp.hidden := ahidden;
cp.ptr := pv;
cp.msg := amsg;
cp.cheat := acheat;
cp.ptr := pv;
cp.msg := amsg;
cp.cheat := acheat;
end;
end;
end;
end;
-function ParseAlias(Str: AnsiString): SArray;
+function ParseAlias(Str: AnsiString): SSArray;
begin
Result := nil;
begin
Result := nil;
end;
end;
end;
end;
-procedure ConsoleCommands(p: SArray);
+procedure ConsoleCommands(p: SSArray);
var
cmd, s: AnsiString;
a, b: Integer;
var
cmd, s: AnsiString;
a, b: Integer;
g_Console_Add('exec <script file>');
end;
g_Console_Add('exec <script file>');
end;
+ if (cmd = 'ver') or (cmd = 'version') then
+ begin
+ conwriteln('Doom 2D: Forever v. ' + GAME_VERSION);
+ conwritefln('Net protocol v. %d', [NET_PROTOCOL_VER]);
+ conwritefln('Build date: %s at %s', [GAME_BUILDDATE, GAME_BUILDTIME]);
+ end;
+
if cmd = 'alias' then
begin
// alias [alias_name] [commands]
if cmd = 'alias' then
begin
// alias [alias_name] [commands]
end;
end;
-procedure segfault (p: SArray);
+procedure segfault (p: SSArray);
var
pp: PByte = nil;
begin
var
pp: PByte = nil;
begin
AddCommand('exec', ConsoleCommands);
AddCommand('alias', ConsoleCommands);
AddCommand('call', ConsoleCommands);
AddCommand('exec', ConsoleCommands);
AddCommand('alias', ConsoleCommands);
AddCommand('call', ConsoleCommands);
+ AddCommand('ver', ConsoleCommands);
+ AddCommand('version', ConsoleCommands);
AddCommand('d_window', DebugCommands);
AddCommand('d_sounds', DebugCommands);
AddCommand('d_window', DebugCommands);
AddCommand('d_sounds', DebugCommands);
AddCommand('d_health', DebugCommands);
AddCommand('d_player', DebugCommands);
AddCommand('d_joy', DebugCommands);
AddCommand('d_health', DebugCommands);
AddCommand('d_player', DebugCommands);
AddCommand('d_joy', DebugCommands);
+ AddCommand('d_mem', DebugCommands);
AddCommand('p1_name', GameCVars);
AddCommand('p2_name', GameCVars);
AddCommand('p1_name', GameCVars);
AddCommand('p2_name', GameCVars);
if gChatShow then Exit;
gConsoleShow := not gConsoleShow;
Cons_Shown := True;
if gChatShow then Exit;
gConsoleShow := not gConsoleShow;
Cons_Shown := True;
+ g_Touch_ShowKeyboard(gConsoleShow or gChatShow);
end;
procedure g_Console_Chat_Switch(Team: Boolean = False);
end;
procedure g_Console_Chat_Switch(Team: Boolean = False);
gChatEnter := False;
Line := '';
CPos := 1;
gChatEnter := False;
Line := '';
CPos := 1;
+ g_Touch_ShowKeyboard(gConsoleShow or gChatShow);
end;
procedure g_Console_Char(C: AnsiChar);
end;
procedure g_Console_Char(C: AnsiChar);
g_Console_Add('');
for i := 0 to High(commands) do
begin
g_Console_Add('');
for i := 0 to High(commands) do
begin
- if not commands[i].hidden then
+ // hidden commands are hidden when cheats aren't enabled
+ if commands[i].hidden and not conIsCheatsEnabled then continue;
+ if (Length(commands[i].help) > 0) then
begin
begin
- if (Length(commands[i].help) > 0) then
- begin
- g_Console_Add(' '+commands[i].cmd+' -- '+commands[i].help);
- end
- else
- begin
- g_Console_Add(' '+commands[i].cmd);
- end;
+ g_Console_Add(' '+commands[i].cmd+' -- '+commands[i].help);
+ end
+ else
+ begin
+ g_Console_Add(' '+commands[i].cmd);
end;
end;
exit;
end;
end;
exit;
ll := Copy(ll, 0, Length(ll)-1);
for i := 0 to High(commands) do
begin
ll := Copy(ll, 0, Length(ll)-1);
for i := 0 to High(commands) do
begin
- if commands[i].hidden then continue;
+ // hidden commands are hidden when cheats aren't enabled
+ if commands[i].hidden and not conIsCheatsEnabled then continue;
if (commands[i].cmd = ll) then
begin
if (Length(commands[i].help) > 0) then
if (commands[i].cmd = ll) then
begin
if (Length(commands[i].help) > 0) then
tused := 0;
for i := 0 to High(commands) do
begin
tused := 0;
for i := 0 to High(commands) do
begin
- if commands[i].hidden then continue;
+ // hidden commands are hidden when cheats aren't enabled
+ if commands[i].hidden and not conIsCheatsEnabled then continue;
cmd := commands[i].cmd;
if (Length(cmd) >= Length(ll)) and (ll = Copy(cmd, 0, Length(ll))) then
begin
cmd := commands[i].cmd;
if (Length(cmd) >= Length(ll)) and (ll = Copy(cmd, 0, Length(ll))) then
begin
IK_DELETE:
if (Length(Line) > 0) and (CPos <= Length(Line)) then
Delete(Line, CPos, 1);
IK_DELETE:
if (Length(Line) > 0) and (CPos <= Length(Line)) then
Delete(Line, CPos, 1);
- IK_LEFT, IK_KPLEFT:
+ IK_LEFT, IK_KPLEFT, VK_LEFT:
if CPos > 1 then
CPos := CPos - 1;
if CPos > 1 then
CPos := CPos - 1;
- IK_RIGHT, IK_KPRIGHT:
+ IK_RIGHT, IK_KPRIGHT, VK_RIGHT:
if CPos <= Length(Line) then
CPos := CPos + 1;
if CPos <= Length(Line) then
CPos := CPos + 1;
- IK_RETURN, IK_KPRETURN:
+ IK_RETURN, IK_KPRETURN, VK_OPEN, VK_FIRE:
begin
if Cons_Shown then
g_Console_Process(Line)
begin
if Cons_Shown then
g_Console_Process(Line)
CPos := 1;
gChatShow := False;
gJustChatted := True;
CPos := 1;
gChatShow := False;
gJustChatted := True;
+ g_Touch_ShowKeyboard(gConsoleShow or gChatShow);
end;
end;
IK_TAB:
if not gChatShow then
Complete();
end;
end;
IK_TAB:
if not gChatShow then
Complete();
- IK_DOWN, IK_KPDOWN:
+ IK_DOWN, IK_KPDOWN, VK_DOWN:
if not gChatShow then
if (CommandHistory <> nil) and
(CmdIndex < Length(CommandHistory)) then
if not gChatShow then
if (CommandHistory <> nil) and
(CmdIndex < Length(CommandHistory)) then
Line := CommandHistory[CmdIndex];
CPos := Length(Line) + 1;
end;
Line := CommandHistory[CmdIndex];
CPos := Length(Line) + 1;
end;
- IK_UP, IK_KPUP:
+ IK_UP, IK_KPUP, VK_UP:
if not gChatShow then
if (CommandHistory <> nil) and
(CmdIndex <= Length(CommandHistory)) then
if not gChatShow then
if (CommandHistory <> nil) and
(CmdIndex <= Length(CommandHistory)) then
Line := CommandHistory[CmdIndex];
Cpos := Length(Line) + 1;
end;
Line := CommandHistory[CmdIndex];
Cpos := Length(Line) + 1;
end;
- IK_PAGEUP, IK_KPPAGEUP: // PgUp
+ IK_PAGEUP, IK_KPPAGEUP, VK_PREV: // PgUp
if not gChatShow then Inc(conSkipLines);
if not gChatShow then Inc(conSkipLines);
- IK_PAGEDN, IK_KPPAGEDN: // PgDown
+ IK_PAGEDN, IK_KPPAGEDN, VK_NEXT: // PgDown
if not gChatShow and (conSkipLines > 0) then Dec(conSkipLines);
IK_HOME, IK_KPHOME:
CPos := 1;
if not gChatShow and (conSkipLines > 0) then Dec(conSkipLines);
IK_HOME, IK_KPHOME:
CPos := 1;
end;
end;
end;
end;
-function ParseString(Str: AnsiString): SArray;
+function ParseString(Str: AnsiString): SSArray;
begin
Result := nil;
begin
Result := nil;
function g_Console_CommandBlacklisted(C: AnsiString): Boolean;
var
function g_Console_CommandBlacklisted(C: AnsiString): Boolean;
var
- Arr: SArray;
+ Arr: SSArray;
i: Integer;
begin
Result := True;
i: Integer;
begin
Result := True;
procedure g_Console_Process(L: AnsiString; quiet: Boolean = False);
var
procedure g_Console_Process(L: AnsiString; quiet: Boolean = False);
var
- Arr: SArray;
+ Arr: SSArray;
i: Integer;
begin
Arr := nil;
i: Integer;
begin
Arr := nil;