diff --git a/src/game/g_console.pas b/src/game/g_console.pas
index 11170326ca66b02c8f09a200297df5e7e6263e86..8b25d01e0903c6313fffdca6f7a2d6af9a2f8f7e 100644 (file)
--- a/src/game/g_console.pas
+++ b/src/game/g_console.pas
Cons_Y: SmallInt;
ConsoleHeight: Single;
Cons_Shown: Boolean; // Ðèñîâàòü ëè êîíñîëü?
+ InputReady: Boolean;
Line: AnsiString;
CPos: Word;
//ConsoleHistory: SSArray;
down, up: SSArray;
end;
menu_toggled: BOOLEAN; (* hack for menu controls *)
+ ChatTop: BOOLEAN;
procedure g_Console_Switch;
begin
- if gConsoleShow or Cons_Shown or gChatShow then
- g_Touch_ShowKeyboard(False);
+ if gConsoleShow then
+ Cons_Y := Max(Cons_Y, -Floor(gScreenHeight * ConsoleHeight))
+ else
+ Cons_Y := Min(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;
+ if gConsoleShow then
+ Cons_Y := Max(Cons_Y, -Floor(gScreenHeight * ConsoleHeight))
+ else
+ Cons_Y := Min(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
'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;
gConsoleShow := False;
gChatShow := False;
Cons_Shown := False;
+ InputReady := False;
CPos := 1;
for a := 0 to High(MsgArray) do
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
+ 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);
+ if Cons_Y >= 0 then
+ InputReady := True
+ end
+ else
begin
- Cons_Y := 0;
- g_Touch_ShowKeyboard(True);
+ (* Close animation *)
+ Cons_Y := Max(Cons_Y - Step, -Floor(gScreenHeight * ConsoleHeight));
+ if Cons_Y <= -Floor(gScreenHeight * ConsoleHeight) then
+ begin
+ Cons_Shown := False;
+ InputReady := False
+ end
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;
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);
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;
Line := '';
CPos := 1;
gJustChatted := True;
- g_Console_Chat_Switch
+ g_Console_Chat_Switch;
+ InputReady := False;
end;
end;
IK_TAB:
Result := g_Console_MatchBind(key, 'togglemenu') or
g_Console_MatchBind(key, 'showkeyboard') or
g_Console_MatchBind(key, 'hidekeyboard')
- else if (gGameSettings.GameType <> GT_NONE) and not gConsoleShow then
- Result := True
- else (* if CONSOLE or MENU then *)
+ else if gConsoleShow or (g_ActiveWindow <> nil) 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
g_Console_MatchBind(key, 'hidekeyboard')
+ else (* in game *)
+ Result := True
end
end;
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');
{$IFDEF ANDROID}
+ ChatTop := True;
ConsoleHeight := 0.35
{$ELSE}
+ ChatTop := False;
ConsoleHeight := 0.5
{$ENDIF}
end.