X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_console.pas;h=53f1c4f1a9998d3c328b2f8fd29be4c4a52e720c;hb=f3c92492a1f66c593df0c41f304abb1ea3510445;hp=63454eb1cb52dbf1ad6b6014a971926559679f5b;hpb=2f4ef61a594006d1da7ec293ab72502d5d6ba241;p=d2df-sdl.git diff --git a/src/game/g_console.pas b/src/game/g_console.pas index 63454eb..53f1c4f 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -115,8 +115,6 @@ type const - Step = 32; - Alpha = 25; MsgTime = 144; MaxScriptRecursion = 16; @@ -128,7 +126,8 @@ var RecursionLimitHit: Boolean = False; Cons_Y: SmallInt; ConsoleHeight: Single; - Cons_Shown: Boolean; // Ðèñîâàòü ëè êîíñîëü? + Cons_Shown: Boolean; // draw console + InputReady: Boolean; // allow text input in console/chat Line: AnsiString; CPos: Word; //ConsoleHistory: SSArray; @@ -147,28 +146,37 @@ var down, up: SSArray; end; menu_toggled: BOOLEAN; (* hack for menu controls *) + ChatTop: BOOLEAN; + ConsoleStep: Single; + ConsoleTrans: Single; procedure g_Console_Switch; begin - if gConsoleShow or Cons_Shown or gChatShow then - g_Touch_ShowKeyboard(False); + 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); end; procedure g_Console_Chat_Switch (Team: Boolean = False); begin - if gConsoleShow or Cons_Shown or gChatShow then - g_Touch_ShowKeyboard(False); 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); end; // poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks @@ -722,12 +730,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; @@ -796,6 +802,7 @@ begin gConsoleShow := False; gChatShow := False; Cons_Shown := False; + InputReady := False; CPos := 1; for a := 0 to High(MsgArray) do @@ -979,41 +986,29 @@ begin 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 - //  ïðîöåññå îòêðûòèÿ: - if gConsoleShow and (Cons_Y < 0) then - Cons_Y := Cons_Y+Step; - - //  ïðîöåññå çàêðûòèÿ: - if (not gConsoleShow) and (Cons_Y > -Floor(gScreenHeight * ConsoleHeight)) then - Cons_Y := Cons_Y-Step; - - // Open chat - if gChatShow then + Step := Max(1, Round(Floor(gScreenHeight * ConsoleHeight) * ConsoleStep)); + if gConsoleShow then begin - Cons_Y := -Floor(gScreenHeight * ConsoleHeight); - Cons_Shown := False; - g_Touch_ShowKeyboard(True); - end; - - // Îêîí÷àòåëüíî îòêðûëàñü: - if Cons_Y > 0 then + (* Open animation *) + Cons_Y := Min(Cons_Y + Step, 0); + InputReady := True + end + else begin - Cons_Y := 0; - g_Touch_ShowKeyboard(True); + (* Close animation *) + Cons_Y := Max(Cons_Y - Step, -Floor(gScreenHeight * ConsoleHeight)); + Cons_Shown := Cons_Y > -Floor(gScreenHeight * ConsoleHeight); + InputReady := False end; - // Îêîí÷àòåëüíî çàêðûëàñü: - if Cons_Y <= -Floor(gScreenHeight * ConsoleHeight) then - begin - Cons_Y := -Floor(gScreenHeight * ConsoleHeight); - Cons_Shown := False; - end; + if gChatShow then + InputReady := True end; a := 0; @@ -1101,37 +1096,40 @@ procedure g_Console_Draw(); var CWidth, CHeight: Byte; mfW, mfH: Word; - a, b: Integer; + 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, CHeight*a, MsgArray[a].Msg, - gStdFont, True); + e_TextureFontPrintFmt(0, offset_y + CHeight * a, MsgArray[a].Msg, gStdFont, True); - if not Cons_Shown then + if gChatShow then begin - if gChatShow then + if ChatTop then + offset_y := 0 + else + offset_y := gScreenHeight - CHeight - 1; + if gChatTeam then begin - if gChatTeam then - begin - e_TextureFontPrintEx(0, gScreenHeight - CHeight - 1, 'say team> ' + Line, - gStdFont, 255, 255, 255, 1, True); - e_TextureFontPrintEx((CPos + 9)*CWidth, gScreenHeight - CHeight - 1, '_', - gStdFont, 255, 255, 255, 1, True); - end - else - begin - e_TextureFontPrintEx(0, gScreenHeight - CHeight - 1, 'say> ' + Line, - gStdFont, 255, 255, 255, 1, True); - e_TextureFontPrintEx((CPos + 4)*CWidth, gScreenHeight - CHeight - 1, '_', - gStdFont, 255, 255, 255, 1, True); - end; - end; - Exit; + 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); @@ -1141,7 +1139,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(); @@ -1170,8 +1168,11 @@ end; procedure g_Console_Char(C: AnsiChar); begin - Insert(C, Line, CPos); - CPos := CPos + 1; + if InputReady and (gConsoleShow or gChatShow) then + begin + Insert(C, Line, CPos); + CPos := CPos + 1; + end end; @@ -1339,7 +1340,8 @@ begin Line := ''; CPos := 1; gJustChatted := True; - g_Console_Chat_Switch + g_Console_Chat_Switch; + InputReady := False; end; end; IK_TAB: @@ -1905,10 +1907,17 @@ begin 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} - ConsoleHeight := 0.35 + ChatTop := True; + ConsoleHeight := 0.35; {$ELSE} - ConsoleHeight := 0.5 + ChatTop := False; + ConsoleHeight := 0.5; {$ENDIF} + ConsoleTrans := 0.1; + ConsoleStep := 0.07; end.