diff --git a/src/game/g_console.pas b/src/game/g_console.pas
index 4898bfb113ed2dacad7e59213b5cfaf464dcf02e..fcabed7ba667ec84613f3e80cb698ddcfbaac5f5 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/>.
+ *)
+{$MODE DELPHI}
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;
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('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;
Cpos := Length(Line) + 1;
end;
IK_PAGEUP, IK_KPPAGEUP: // PgUp
- if not gChatShow then
- IncMax(OffSet, Length(ConsoleHistory)-1);
+ if not gChatShow then Inc(conSkipLines);
IK_PAGEDN, IK_KPPAGEDN: // PgDown
- if not gChatShow then
- DecMin(OffSet, 0);
+ if not gChatShow and (conSkipLines > 0) then Dec(conSkipLines);
IK_HOME, IK_KPHOME:
CPos := 1;
IK_END, IK_KPEND:
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);