DEADSOFTWARE

read dfconfig.cfg before init
[d2df-sdl.git] / src / game / g_console.pas
index 53f1c4f1a9998d3c328b2f8fd29be4c4a52e720c..4141f27aeb4b6f66d7f2809559ec52fa42c7e184 100644 (file)
@@ -2,8 +2,7 @@
  *
  * 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.
+ * the Free Software Foundation, version 3 of the License ONLY.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -38,8 +37,9 @@ uses
     LAST_ACTION = ACTION_WEAPPREV;
 
 procedure g_Console_Init;
+procedure g_Console_SysInit;
 procedure g_Console_Update;
-procedure g_Console_Draw;
+procedure g_Console_Draw (MessagesOnly: Boolean = False);
 procedure g_Console_Char (C: AnsiChar);
 procedure g_Console_Control (K: Word);
 procedure g_Console_Process (L: AnsiString; quiet: Boolean=false);
@@ -64,6 +64,7 @@ procedure conwritefln (const s: AnsiString; args: array of const; show: Boolean=
 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;
+procedure conRegVar (const conname: AnsiString; pvar: PAnsiString; const ahelp: AnsiString; const amsg: AnsiString; acheat: Boolean=false; ahidden: Boolean=false); overload;
 
 // <0: no arg; 0/1: true/false
 function conGetBoolArg (p: SSArray; idx: Integer): Integer;
@@ -282,6 +283,24 @@ begin
 end;
 
 
+procedure strVarHandler (me: PCommand; p: SSArray);
+var
+  old: AnsiString;
+begin
+  if (Length(p) <> 2) then
+  begin
+    conwritefln('%s %s', [me.cmd, QuoteStr(PAnsiString(me.ptr)^)]);
+  end
+  else
+  begin
+    old := PAnsiString(me.ptr)^;
+    PAnsiString(me.ptr)^ := p[1];
+    if PAnsiString(me.ptr)^ <> old then
+      g_Console_WriteGameConfig();
+  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;
@@ -324,6 +343,26 @@ begin
 end;
 
 
+procedure conRegVar (const conname: AnsiString; pvar: PAnsiString; 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 := strVarHandler;
+  cp.help := ahelp;
+  cp.hidden := ahidden;
+  cp.ptr := pvar;
+  cp.msg := amsg;
+  cp.cheat := acheat;
+  cp.action := -1;
+  cp.player := -1;
+end;
+
 // ////////////////////////////////////////////////////////////////////////// //
 type
   PVarSingle = ^TVarSingle;
@@ -793,11 +832,9 @@ begin
   end
 end;
 
-procedure g_Console_Init();
-  var
-    a: Integer;
+procedure g_Console_SysInit;
+  var a: Integer;
 begin
-  g_Texture_CreateWAD(ID, GameWAD+':TEXTURES\CONSOLE');
   Cons_Y := -Floor(gScreenHeight * ConsoleHeight);
   gConsoleShow := False;
   gChatShow := False;
@@ -981,7 +1018,11 @@ begin
   g_Console_ReadConfig(GameDir + '/dfconfig.cfg');
   g_Console_ReadConfig(GameDir + '/autoexec.cfg');
   gParsingBinds := False;
+end;
 
+procedure g_Console_Init;
+begin
+  g_Texture_CreateWAD(ID, GameWAD+':TEXTURES\CONSOLE');
   g_Console_Add(Format(_lc[I_CONSOLE_WELCOME], [GAME_VERSION]));
   g_Console_Add('');
 end;
@@ -1092,7 +1133,7 @@ begin
   until not cbufLineUp(sp, ep);
 end;
 
-procedure g_Console_Draw();
+procedure g_Console_Draw(MessagesOnly: Boolean = False);
 var
   CWidth, CHeight: Byte;
   mfW, mfH: Word;
@@ -1109,6 +1150,8 @@ begin
     if MsgArray[a].Time > 0 then
       e_TextureFontPrintFmt(0, offset_y + CHeight * a, MsgArray[a].Msg, gStdFont, True);
 
+  if MessagesOnly then Exit;
+
   if gChatShow then
   begin
     if ChatTop then
@@ -1376,7 +1419,7 @@ begin
     IK_END, IK_KPEND:
       CPos := Length(Line) + 1;
     IK_A..IK_Z, IK_SPACE, IK_SHIFT, IK_RSHIFT, IK_CAPSLOCK, IK_LBRACKET, IK_RBRACKET,
-    IK_SEMICOLON, IK_QUOTE, IK_BACKSLASH, IK_SLASH, IK_COMMA, IK_DOT, IK_EQUALS,
+    IK_SEMICOLON, IK_QUOTE, IK_BACKSLASH, IK_SLASH, IK_COMMA, IK_DOT, (*IK_EQUALS,*)
     IK_0, IK_1, IK_2, IK_3, IK_4, IK_5, IK_6, IK_7, IK_8, IK_9, IK_MINUS, IK_EQUALS:
       (* see TEXTINPUT event *)
   end
@@ -1894,6 +1937,13 @@ begin
       begin
         WriteLn(f, commands[i].cmd, ' ', PVarSingle(commands[i].ptr).val^:0:6)
       end
+      else if @commands[i].procEx = @strVarHandler then
+      begin
+        if Length(PAnsiString(commands[i].ptr)^) = 0 then
+          WriteLn(f, commands[i].cmd, ' ""')
+        else
+          WriteLn(f, commands[i].cmd, ' ', QuoteStr(PAnsiString(commands[i].ptr)^))
+      end
     end
   end;
   CloseFile(f)