X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_console.pas;h=4141f27aeb4b6f66d7f2809559ec52fa42c7e184;hb=0f52924bd95347684a7635a9843802364b6d9712;hp=033a46827d5a3312a6b062fa335d37446edc5038;hpb=6a9364772aa1d92cf10886b5d1cec54d557bcada;p=d2df-sdl.git diff --git a/src/game/g_console.pas b/src/game/g_console.pas index 033a468..4141f27 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -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; @@ -115,8 +116,6 @@ type const - Step = 32; - Alpha = 25; MsgTime = 144; MaxScriptRecursion = 16; @@ -128,8 +127,8 @@ var RecursionLimitHit: Boolean = False; Cons_Y: SmallInt; ConsoleHeight: Single; - Cons_Shown: Boolean; // Ðèñîâàòü ëè êîíñîëü? - InputReady: Boolean; + Cons_Shown: Boolean; // draw console + InputReady: Boolean; // allow text input in console/chat Line: AnsiString; CPos: Word; //ConsoleHistory: SSArray; @@ -149,10 +148,15 @@ var end; menu_toggled: BOOLEAN; (* hack for menu controls *) ChatTop: BOOLEAN; + ConsoleStep: Single; + ConsoleTrans: Single; procedure g_Console_Switch; begin + Cons_Y := Min(0, Max(Cons_Y, -Floor(gScreenHeight * ConsoleHeight))); + if Cons_Shown = False then + Cons_Y := -Floor(gScreenHeight * ConsoleHeight); gChatShow := False; gConsoleShow := not gConsoleShow; Cons_Shown := True; @@ -163,6 +167,9 @@ end; procedure g_Console_Chat_Switch (Team: Boolean = False); begin if not g_Game_IsNet then Exit; + Cons_Y := Min(0, Max(Cons_Y, -Floor(gScreenHeight * ConsoleHeight))); + if Cons_Shown = False then + Cons_Y := -Floor(gScreenHeight * ConsoleHeight); gConsoleShow := False; gChatShow := not gChatShow; gChatTeam := Team; @@ -276,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; @@ -318,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; @@ -724,12 +769,10 @@ begin 'toggleconsole': g_Console_Switch; 'togglechat': - if not gConsoleShow and (g_ActiveWindow = nil) then - g_Console_Chat_Switch; + g_Console_Chat_Switch; 'toggleteamchat': if gGameSettings.GameMode in [GM_TDM, GM_CTF] then - if not gConsoleShow and (g_ActiveWindow = nil) then - g_Console_Chat_Switch(True); + g_Console_Chat_Switch(True); end end; @@ -789,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; @@ -977,48 +1018,38 @@ 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; -procedure g_Console_Update(); +procedure g_Console_Update; var - a, b: Integer; + a, b, Step: Integer; begin if Cons_Shown then begin - (* Open animation *) - if gConsoleShow and (Cons_Y < 0) then - Cons_Y := Cons_Y+Step; - - (* Colse animation *) - if (not gConsoleShow) and (Cons_Y > -Floor(gScreenHeight * ConsoleHeight)) then - Cons_Y := Cons_Y-Step; - - if gChatShow then - begin - (* End open chat animation. Do not show console *) - Cons_Y := -Floor(gScreenHeight * ConsoleHeight); - Cons_Shown := False; - InputReady := True; - end - else - if Cons_Y >= 0 then + Step := Max(1, Round(Floor(gScreenHeight * ConsoleHeight) * ConsoleStep)); + if gConsoleShow then begin - (* End open animation *) - Cons_Y := 0; - Cons_Shown := True; - InputReady := True; + (* Open animation *) + Cons_Y := Min(Cons_Y + Step, 0); + InputReady := True end else - if Cons_Y <= -Floor(gScreenHeight * ConsoleHeight) then begin - (* End close animation *) - Cons_Y := -Floor(gScreenHeight * ConsoleHeight); - Cons_Shown := False; - InputReady := False; + (* Close animation *) + Cons_Y := Max(Cons_Y - Step, -Floor(gScreenHeight * ConsoleHeight)); + Cons_Shown := Cons_Y > -Floor(gScreenHeight * ConsoleHeight); + InputReady := False end; + + if gChatShow then + InputReady := True end; a := 0; @@ -1102,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; @@ -1119,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 @@ -1149,7 +1182,7 @@ begin _RGB(128, 0, 0), 2.0); end; - e_DrawSize(ID, 0, Cons_Y, Alpha, False, False, gScreenWidth, Floor(gScreenHeight * ConsoleHeight)); + e_DrawSize(ID, 0, Cons_Y, Round(ConsoleTrans * 255), False, False, gScreenWidth, Floor(gScreenHeight * ConsoleHeight)); e_TextureFontPrint(0, Cons_Y + Floor(gScreenHeight * ConsoleHeight) - CHeight - 4, '> ' + Line, gStdFont); drawConsoleText(); @@ -1386,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 @@ -1904,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) @@ -1919,11 +1959,15 @@ end; initialization conRegVar('chat_at_top', @ChatTop, 'draw chat at top border', 'draw chat at top border'); conRegVar('console_height', @ConsoleHeight, 0.0, 1.0, 'set console size', 'set console size'); + conRegVar('console_trans', @ConsoleTrans, 0.0, 1.0, 'set console transparency', 'set console transparency'); + conRegVar('console_step', @ConsoleStep, 0.0, 1.0, 'set console animation speed', 'set console animation speed'); {$IFDEF ANDROID} ChatTop := True; - ConsoleHeight := 0.35 + ConsoleHeight := 0.35; {$ELSE} ChatTop := False; - ConsoleHeight := 0.5 + ConsoleHeight := 0.5; {$ENDIF} + ConsoleTrans := 0.1; + ConsoleStep := 0.07; end.