X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_console.pas;h=2e3b6838e6f0bf7d51f8e1e863e49d5340031bb6;hb=a2ba3b4f4ea42350560a7670f3be97a55f6d3ab5;hp=1caeaf87b99ef93936c42993d7916567e3fab5d8;hpb=3fa3726fe9bf1c40052f2002e6b8b7f0337e1a68;p=d2df-sdl.git diff --git a/src/game/g_console.pas b/src/game/g_console.pas index 1caeaf8..2e3b683 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -34,10 +34,19 @@ uses FIRST_ACTION = ACTION_JUMP; LAST_ACTION = ACTION_STRAFE; + var (* private state *) + Line: AnsiString; + CPos: Word; + conSkipLines: Integer; + MsgArray: Array [0..4] of record + Msg: AnsiString; + Time: Word; + end; + procedure g_Console_Init; -procedure g_Console_SysInit; +procedure g_Console_Initialize; +procedure g_Console_Finalize; procedure g_Console_Update; -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); @@ -93,13 +102,30 @@ var implementation uses - g_textures, g_main, e_graphics, e_input, g_game, g_gfx, g_player, g_items, - SysUtils, g_basic, g_options, Math, g_touch, e_res, - g_menu, g_gui, g_language, g_net, g_netmsg, e_log, conbuf, g_weapons, + {$IFDEF ENABLE_MENU} + g_gui, g_menu, + {$ENDIF} + {$IFDEF ENABLE_TOUCH} + g_system, + {$ENDIF} + {$IFDEF ENABLE_GFX} + g_gfx, + {$ENDIF} + {$IFDEF ENABLE_GIBS} + g_gibs, + {$ENDIF} + {$IFDEF ENABLE_SHELLS} + g_shells, + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + g_corpses, + {$ENDIF} + e_input, g_game, g_player, g_items, + SysUtils, g_basic, g_options, Math, e_res, + g_language, g_net, g_netmsg, e_log, conbuf, g_weapons, Keyboard; const - autoexecScript = 'autoexec.cfg'; configComment = 'generated by doom2d, do not modify'; type @@ -131,67 +157,47 @@ const MsgTime = 144; MaxScriptRecursion = 16; - DEBUG_STRING = 'DEBUG MODE'; - var - ID: DWORD; RecursionDepth: Word = 0; RecursionLimitHit: Boolean = False; - Cons_Y: SmallInt; - ConsoleHeight: Single; - Cons_Shown: Boolean; // draw console InputReady: Boolean; // allow text input in console/chat - Line: AnsiString; - CPos: Word; //ConsoleHistory: SSArray; CommandHistory: SSArray; Whitelist: SSArray; commands: Array of TCommand = nil; Aliases: Array of TAlias = nil; CmdIndex: Word; - conSkipLines: Integer = 0; - MsgArray: Array [0..4] of record - Msg: AnsiString; - Time: Word; - end; gInputBinds: Array [0..e_MaxInputKeys - 1] of record rep: Boolean; down, up: SSArray; end; + menu_toggled: BOOLEAN; (* hack for menu controls *) - ChatTop: BOOLEAN; - ConsoleStep: Single; - ConsoleTrans: Single; ConsoleStdIn: Boolean; - 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; InputReady := False; - g_Touch_ShowKeyboard(gConsoleShow or gChatShow); + {$IFDEF ENABLE_TOUCH} + sys_ShowKeyboard(gConsoleShow or gChatShow); + {$ENDIF} 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; - Cons_Shown := True; InputReady := False; Line := ''; CPos := 1; - g_Touch_ShowKeyboard(gConsoleShow or gChatShow); + {$IFDEF ENABLE_TOUCH} + sys_ShowKeyboard(gConsoleShow or gChatShow); + {$ENDIF} end; // poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks @@ -885,10 +891,12 @@ begin 'unbindall': for i := 0 to e_MaxInputKeys - 1 do g_Console_BindKey(i, ''); +{$IFDEF ENABLE_TOUCH} 'showkeyboard': - g_Touch_ShowKeyboard(True); + sys_ShowKeyboard(True); 'hidekeyboard': - g_Touch_ShowKeyboard(False); + sys_ShowKeyboard(False); +{$ENDIF} 'togglemenu': begin if gConsoleShow then @@ -896,7 +904,9 @@ begin else if gChatShow then g_Console_Chat_Switch else + begin KeyPress(VK_ESCAPE); + end; menu_toggled := True end; 'toggleconsole': @@ -987,13 +997,11 @@ begin end; end; -procedure g_Console_SysInit; +procedure g_Console_Initialize; var a: Integer; begin - Cons_Y := -Floor(gScreenHeight * ConsoleHeight); gConsoleShow := False; gChatShow := False; - Cons_Shown := False; InputReady := False; CPos := 1; @@ -1041,13 +1049,10 @@ begin AddCommand('version', ConsoleCommands); AddCommand('d_window', DebugCommands); - AddCommand('d_sounds', DebugCommands); - AddCommand('d_frames', DebugCommands); AddCommand('d_winmsg', DebugCommands); AddCommand('d_monoff', DebugCommands); AddCommand('d_botoff', DebugCommands); AddCommand('d_monster', DebugCommands); - AddCommand('d_health', DebugCommands); AddCommand('d_player', DebugCommands); AddCommand('d_joy', DebugCommands); AddCommand('d_mem', DebugCommands); @@ -1249,13 +1254,19 @@ begin g_Console_ResetBinds; g_Console_ReadConfig(gConfigScript); - g_Console_ReadConfig(autoexecScript); +// g_Console_ReadConfig(autoexecScript); + g_Console_ReadConfig('autoexec.cfg'); + gParsingBinds := False; end; +procedure g_Console_Finalize; +begin + +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(''); {$IFDEF HEADLESS} @@ -1269,33 +1280,13 @@ end; procedure g_Console_Update; var - a, b, Step: Integer; + a, b: Integer; begin {$IFDEF HEADLESS} if ConsoleStdIn then ReadStdIn(); {$ENDIF} - - if Cons_Shown then - begin - Step := Max(1, Round(Floor(gScreenHeight * ConsoleHeight) * ConsoleStep)); - if gConsoleShow then - begin - (* Open animation *) - Cons_Y := Min(Cons_Y + Step, 0); - InputReady := True - end - else - begin - (* 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; + InputReady := gConsoleShow or gChatShow; a := 0; while a <= High(MsgArray) do @@ -1322,138 +1313,6 @@ begin 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 := Floor(gScreenHeight * ConsoleHeight) - 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(MessagesOnly: Boolean = False); -var - CWidth, CHeight: Byte; - mfW, mfH: Word; - a, b, offset_y: Integer; -begin - e_TextureFontGetSize(gStdFont, CWidth, CHeight); - - if ChatTop and gChatShow then - offset_y := CHeight - else - offset_y := 0; - - for a := 0 to High(MsgArray) do - 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 - offset_y := 0 - else - offset_y := gScreenHeight - CHeight - 1; - if gChatTeam then - begin - e_TextureFontPrintEx(0, offset_y, 'say team> ' + Line, gStdFont, 255, 255, 255, 1, True); - e_TextureFontPrintEx((CPos + 9) * CWidth, offset_y, '_', gStdFont, 255, 255, 255, 1, True); - end - else - begin - e_TextureFontPrintEx(0, offset_y, 'say> ' + Line, gStdFont, 255, 255, 255, 1, True); - e_TextureFontPrintEx((CPos + 4) * CWidth, offset_y, '_', gStdFont, 255, 255, 255, 1, True); - end - end; - - if not Cons_Shown then - Exit; - - if gDebugMode then - begin - e_CharFont_GetSize(gMenuFont, DEBUG_STRING, mfW, mfH); - a := (gScreenWidth - 2*mfW) div 2; - b := Cons_Y + (Floor(gScreenHeight * ConsoleHeight) - 2 * mfH) div 2; - e_CharFont_PrintEx(gMenuFont, a div 2, b div 2, DEBUG_STRING, - _RGB(128, 0, 0), 2.0); - end; - - 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(); - (* - if ConsoleHistory <> nil then - begin - b := 0; - if CHeight > 0 then - if Length(ConsoleHistory) > (Floor(gScreenHeight * ConsoleHeight) div CHeight) - 1 then - b := Length(ConsoleHistory) - (Floor(gScreenHeight * ConsoleHeight) div CHeight) + 1; - - b := Max(b-Offset, 0); - d := Max(High(ConsoleHistory)-Offset, 0); - - c := 2; - for a := d downto b do - begin - e_TextureFontPrintFmt(0, Floor(gScreenHeight * ConsoleHeight) - 4 - c * CHeight - Abs(Cons_Y), ConsoleHistory[a], gStdFont, True); - c := c + 1; - end; - end; - *) - - e_TextureFontPrint((CPos + 1) * CWidth, Cons_Y + Floor(gScreenHeight * ConsoleHeight) - 21, '_', gStdFont); -end; - procedure g_Console_Char(C: AnsiChar); begin if InputReady and (gConsoleShow or gChatShow) then @@ -1763,12 +1622,6 @@ begin //SetLength(ConsoleHistory, Length(ConsoleHistory)+1); //ConsoleHistory[High(ConsoleHistory)] := L; - - (* -{$IFDEF HEADLESS} - e_WriteLog('CON: ' + L, MSG_NOTIFY); -{$ENDIF} - *) end; @@ -1938,7 +1791,7 @@ end; procedure g_Console_BindKey (key: Integer; down: AnsiString; up: AnsiString = ''; rep: Boolean = False); begin - //e_LogWritefln('bind "%s" "%s" <%s>', [LowerCase(e_KeyNames[key]), cmd, key]); + // e_LogWritefln('bind "%s" "%s" "%s" <%s>', [LowerCase(e_KeyNames[key]), down, up, key]); ASSERT(key >= 0); ASSERT(key < e_MaxInputKeys); if key > 0 then @@ -2007,15 +1860,23 @@ begin end; function BindsAllowed (key: Integer): Boolean; + var grab, active: Boolean; begin Result := False; - if (not g_GUIGrabInput) and (key >= 0) and (key < e_MaxInputKeys) and ((gInputBinds[key].down <> nil) or (gInputBinds[key].up <> nil)) then + {$IFDEF DISABLE_MENU} + grab := False; + active := False; + {$ELSE} + grab := g_GUIGrabInput; + active := g_ActiveWindow <> nil; + {$ENDIF} + if (not grab) and (key >= 0) and (key < e_MaxInputKeys) and ((gInputBinds[key].down <> nil) or (gInputBinds[key].up <> nil)) then begin if gChatShow then Result := g_Console_MatchBind(key, 'togglemenu') or g_Console_MatchBind(key, 'showkeyboard') or g_Console_MatchBind(key, 'hidekeyboard') - else if gConsoleShow or (g_ActiveWindow <> nil) or (gGameSettings.GameType = GT_NONE) then + else if gConsoleShow or active or (gGameSettings.GameType = GT_NONE) then Result := g_Console_MatchBind(key, 'togglemenu') or g_Console_MatchBind(key, 'toggleconsole') or g_Console_MatchBind(key, 'showkeyboard') or @@ -2043,9 +1904,14 @@ begin end; procedure g_Console_ProcessBindRepeat (key: Integer); - var i: Integer; + var i: Integer; active: Boolean; begin - if gConsoleShow or gChatShow or (g_ActiveWindow <> nil) then + {$IFDEF DISABLE_MENU} + active := False; + {$ELSE} + active := g_ActiveWindow <> nil; + {$ENDIF} + if gConsoleShow or gChatShow or active then begin KeyPress(key); // key repeat in menus and shit Exit; @@ -2187,6 +2053,7 @@ procedure g_Console_WriteConfig (filename: String); end; begin + // e_LogWritefln('g_Console_WriteConfig: %s', [filename]); AssignFile(f, filename); Rewrite(f); WriteLn(f, '// ' + configComment); @@ -2220,10 +2087,18 @@ begin WriteLn(f, 'sv_public ', IfThen(NetUseMaster, 1, 0)); // game settings - WriteLn(f, 'g_max_particles ', g_GFX_GetMax()); - WriteLn(f, 'g_max_shells ', g_Shells_GetMax()); - WriteLn(f, 'g_max_gibs ', g_Gibs_GetMax()); - WriteLn(f, 'g_max_corpses ', g_Corpses_GetMax()); + {$IFDEF ENABLE_GFX} + WriteLn(f, 'g_max_particles ', g_GFX_GetMax()); + {$ENDIF} + {$IFDEF ENABLE_SHELLS} + WriteLn(f, 'g_max_shells ', g_Shells_GetMax()); + {$ENDIF} + {$IFDEF ENABLE_GIBS} + WriteLn(f, 'g_max_gibs ', g_Gibs_GetMax()); + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + WriteLn(f, 'g_max_corpses ', g_Corpses_GetMax()); + {$ENDIF} WriteLn(f, 'g_force_model ', g_Force_Model_Get()); WriteLn(f, 'g_force_model_name ', g_Forced_Model_GetName()); WriteLn(f, 'sv_intertime ', gDefInterTime); @@ -2348,20 +2223,7 @@ end; procedure Init; var i: Integer; begin - 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'); conRegVar('console_stdin', @ConsoleStdIn, 'enable reading commands from stdin', 'enable reading commands from stdin'); -{$IFDEF ANDROID} - ChatTop := True; - ConsoleHeight := 0.35; -{$ELSE} - ChatTop := False; - ConsoleHeight := 0.5; -{$ENDIF} - ConsoleTrans := 0.1; - ConsoleStep := 0.07; {$IFDEF HEADLESS} ConsoleStdIn := True; {$ELSE}