diff --git a/src/game/g_console.pas b/src/game/g_console.pas
index 3c1603744276a18bd6bc36a39cf877a81f636657..729bf956f956201f4c7a3787d9e1e59e4cdb98b4 100644 (file)
--- a/src/game/g_console.pas
+++ b/src/game/g_console.pas
+(* 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *)
+{$INCLUDE ../shared/a_modes.inc}
unit g_console;
interface
uses
g_textures, g_main, e_graphics, e_input, g_game,
- SysUtils, g_basic, g_options, WADEDITOR, Math,
- g_menu, g_language, g_net, g_netmsg;
+ SysUtils, g_basic, g_options, wadreader, Math,
+ g_menu, g_language, g_net, g_netmsg, e_log, conbuf;
type
TCmdProc = procedure (P: SArray);
Cons_Shown: Boolean; // Ðèñîâàòü ëè êîíñîëü?
Line: String;
CPos: Word;
- ConsoleHistory: SArray;
+ //ConsoleHistory: SArray;
CommandHistory: SArray;
Whitelist: SArray;
Commands: Array of TCommand;
Aliases: Array of TAlias;
CmdIndex: Word;
- Offset: Word;
+ conSkipLines: Integer = 0;
MsgArray: Array [0..4] of record
Msg: String;
Time: Word;
var
a: Integer;
begin
+ Result := '';
for a := 1 to Length(Str) do
if (a = Length(Str)) or (Str[a+1] = ';') then
begin
F: TextFile;
begin
Cmd := LowerCase(P[0]);
+ s := '';
if Cmd = 'clear' then
begin
- ConsoleHistory := nil;
+ //ConsoleHistory := nil;
+ cbufClear();
+ conSkipLines := 0;
for a := 0 to High(MsgArray) do
with MsgArray[a] do
if Cmd = 'dump' then
begin
+ (*
if ConsoleHistory <> nil then
begin
if Length(P) > 1 then
g_Console_Add(Format(_lc[I_CONSOLE_DUMPED], [s]));
{$I+}
end;
+ *)
end;
if Cmd = 'exec' then
AddCommand('d_player', DebugCommands);
AddCommand('d_joy', DebugCommands);
+ AddCommand('pf_draw_frame', ProfilerCommands);
+ AddCommand('pf_update_frame', ProfilerCommands);
+ AddCommand('pf_coldet', ProfilerCommands);
+ AddCommand('r_sq_draw', ProfilerCommands);
+ AddCommand('r_sq_use_grid', ProfilerCommands);
+ AddCommand('r_sq_use_tree', ProfilerCommands);
+ AddCommand('dbg_sq_coldet', ProfilerCommands);
+
+ AddCommand('t_dump_node_queries', ProfilerCommands);
+
+ AddCommand('sq_use_grid', ProfilerCommands);
+ AddCommand('sq_use_tree', ProfilerCommands);
+
AddCommand('p1_name', GameCVars);
AddCommand('p2_name', GameCVars);
AddCommand('p1_color', GameCVars);
AddCommand('clientlist', GameCommands);
AddCommand('event', GameCommands);
+ AddCommand('god', GameCheats);
+ AddCommand('notarget', GameCheats);
+ AddCommand('give', GameCheats); // "exit" too ;-)
+ AddCommand('open', GameCheats);
+ AddCommand('fly', GameCheats);
+ AddCommand('noclip', GameCheats);
+ AddCommand('speedy', GameCheats);
+ AddCommand('jumpy', GameCheats);
+ AddCommand('noreload', GameCheats);
+ AddCommand('aimline', GameCheats);
+ AddCommand('automap', GameCheats);
+
WhitelistCommand('say');
WhitelistCommand('tell');
WhitelistCommand('overtime');
end;
end;
+
+procedure drawConsoleText ();
+var
+ CWidth, CHeight: Byte;
+ ty: Integer;
+ sp, ep: LongWord;
+ skip: Integer;
+
+ procedure putLine (sp, ep: LongWord);
+ var
+ p: LongWord;
+ wdt, cw: Integer;
+ begin
+ p := sp;
+ wdt := 0;
+ while p <> ep do
+ begin
+ cw := e_TextureFontCharWidth(cbufAt(p), gStdFont);
+ if wdt+cw > gScreenWidth-8 then break;
+ //e_TextureFontPrintChar(X, Y: Integer; Ch: Char; FontID: DWORD; Shadow: Boolean = False);
+ Inc(wdt, cw);
+ cbufNext(p);
+ end;
+ if p <> ep then putLine(p, ep); // do rest of the line first
+ // now print our part
+ if skip = 0 then
+ begin
+ ep := p;
+ p := sp;
+ wdt := 2;
+ while p <> ep do
+ begin
+ cw := e_TextureFontCharWidth(cbufAt(p), gStdFont);
+ e_TextureFontPrintCharEx(wdt, ty, cbufAt(p), gStdFont);
+ Inc(wdt, cw);
+ cbufNext(p);
+ end;
+ Dec(ty, CHeight);
+ end
+ else
+ begin
+ Dec(skip);
+ end;
+ end;
+
+begin
+ e_TextureFontGetSize(gStdFont, CWidth, CHeight);
+ ty := (gScreenHeight div 2)-4-2*CHeight-Abs(Cons_Y);
+ skip := conSkipLines;
+ cbufLastLine(sp, ep);
+ repeat
+ putLine(sp, ep);
+ if ty+CHeight <= 0 then break;
+ until not cbufLineUp(sp, ep);
+end;
+
procedure g_Console_Draw();
var
CWidth, CHeight: Byte;
mfW, mfH: Word;
- a, b, c, d: Integer;
+ a, b: Integer;
begin
e_TextureFontGetSize(gStdFont, CWidth, CHeight);
e_DrawSize(ID, 0, Cons_Y, Alpha, False, False, gScreenWidth, gScreenHeight div 2);
e_TextureFontPrint(0, Cons_Y+(gScreenHeight div 2)-CHeight-4, '> '+Line, gStdFont);
+ drawConsoleText();
+ (*
if ConsoleHistory <> nil then
begin
b := 0;
c := c + 1;
end;
end;
+ *)
e_TextureFontPrint((CPos+1)*CWidth, Cons_Y+(gScreenHeight div 2)-21, '_', gStdFont);
end;
IK_DELETE:
if (Length(Line) > 0) and (CPos <= Length(Line)) then
Delete(Line, CPos, 1);
- IK_LEFT:
+ IK_LEFT, IK_KPLEFT:
if CPos > 1 then
CPos := CPos - 1;
- IK_RIGHT:
+ IK_RIGHT, IK_KPRIGHT:
if CPos <= Length(Line) then
CPos := CPos + 1;
- IK_RETURN:
+ IK_RETURN, IK_KPRETURN:
begin
if Cons_Shown then
g_Console_Process(Line)
IK_TAB:
if not gChatShow then
Complete();
- IK_DOWN:
+ IK_DOWN, IK_KPDOWN:
if not gChatShow then
if (CommandHistory <> nil) and
(CmdIndex < Length(CommandHistory)) then
Line := CommandHistory[CmdIndex];
CPos := Length(Line) + 1;
end;
- IK_UP:
+ IK_UP, IK_KPUP:
if not gChatShow then
if (CommandHistory <> nil) and
(CmdIndex <= Length(CommandHistory)) then
Line := CommandHistory[CmdIndex];
Cpos := Length(Line) + 1;
end;
- IK_PAGEUP: // PgUp
- if not gChatShow then
- IncMax(OffSet, Length(ConsoleHistory)-1);
- IK_PAGEDN: // PgDown
- if not gChatShow then
- DecMin(OffSet, 0);
- IK_HOME:
+ IK_PAGEUP, IK_KPPAGEUP: // PgUp
+ if not gChatShow then Inc(conSkipLines);
+ IK_PAGEDN, IK_KPPAGEDN: // PgDown
+ if not gChatShow and (conSkipLines > 0) then Dec(conSkipLines);
+ IK_HOME, IK_KPHOME:
CPos := 1;
- IK_END:
+ IK_END, IK_KPEND:
CPos := Length(Line) + 1;
end;
end;
var
a, b: Integer;
begin
+ Result := '';
if Str[1] = '"' then
begin
for b := 1 to Length(Str) do
end;
end;
-procedure g_Console_Add(L: String; Show: Boolean = False);
-var
- a: Integer;
-begin
- // Âûâîä ñòðîê ñ ïåðåíîñàìè ïî î÷åðåäè
- while Pos(#10, L) > 0 do
- begin
- g_Console_Add(Copy(L, 1, Pos(#10, L) - 1), Show);
- Delete(L, 1, Pos(#10, L));
- end;
-
- SetLength(ConsoleHistory, Length(ConsoleHistory)+1);
- ConsoleHistory[High(ConsoleHistory)] := L;
-
- Show := Show and gAllowConsoleMessages;
+procedure g_Console_Add (L: string; Show: Boolean=false);
- if Show and gShowMessages then
+ procedure conmsg (s: AnsiString);
+ var
+ a: Integer;
begin
+ if length(s) = 0 then exit;
for a := 0 to High(MsgArray) do
+ begin
with MsgArray[a] do
+ begin
if Time = 0 then
begin
- Msg := L;
+ Msg := s;
Time := MsgTime;
- Exit;
+ exit;
end;
-
- for a := 0 to High(MsgArray)-1 do
- MsgArray[a] := MsgArray[a+1];
-
+ end;
+ end;
+ for a := 0 to High(MsgArray)-1 do MsgArray[a] := MsgArray[a+1];
with MsgArray[High(MsgArray)] do
begin
Msg := L;
Time := MsgTime;
end;
end;
+
+var
+ f: Integer;
+begin
+ // put it to console
+ cbufPut(L);
+ if (length(L) = 0) or ((L[length(L)] <> #10) and (L[length(L)] <> #13)) then cbufPut(#10);
+
+ // now show 'em out of console too
+ Show := Show and gAllowConsoleMessages;
+ if Show and gShowMessages then
+ begin
+ // Âûâîä ñòðîê ñ ïåðåíîñàìè ïî î÷åðåäè
+ while length(L) > 0 do
+ begin
+ f := Pos(#10, L);
+ if f <= 0 then f := length(L)+1;
+ conmsg(Copy(L, 1, f-1));
+ Delete(L, 1, f);
+ end;
+ end;
+
+ //SetLength(ConsoleHistory, Length(ConsoleHistory)+1);
+ //ConsoleHistory[High(ConsoleHistory)] := L;
+
+ (*
+{$IFDEF HEADLESS}
+ e_WriteLog('CON: ' + L, MSG_NOTIFY);
+{$ENDIF}
+ *)
end;
procedure g_Console_Clear();
begin
- ConsoleHistory := nil;
- Offset := 0;
+ //ConsoleHistory := nil;
+ cbufClear();
+ conSkipLines := 0;
end;
procedure AddToHistory(L: String);
if Trim(L) = '' then
Exit;
+ conSkipLines := 0; // "unscroll"
+
+ if L = 'goobers' then
+ begin
+ Line := '';
+ CPos := 1;
+ gCheats := true;
+ g_Console_Add('Your memory serves you well.');
+ exit;
+ end;
+
if not Quiet then
begin
g_Console_Add('> '+L);