diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index ff94b2860bfff29e190216ace14f71de42feffa8..854938698fc7b37b254f7b58c4541d5a9bb3f39f 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
- (* Copyright (C) Doom 2D: Forever Developers
+(* Copyright (C) Doom 2D: Forever Developers
*
* 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
gRC_FullScreen, gRC_Maximized: Boolean;
gLanguageChange: Boolean = False;
gDebugMode: Boolean = False;
- g_debug_Sounds: Boolean = False;
- g_debug_Frames: Boolean = False;
- g_debug_WinMsgs: Boolean = False;
g_debug_MonsterOff: Boolean = False;
g_debug_BotAIOff: Byte = 0;
- g_debug_HealthBar: Boolean = False;
- g_Debug_Player: Boolean = False;
gCoopMonstersKilled: Word = 0;
gCoopSecretsFound: Word = 0;
gCoopTotalMonstersKilled: Word = 0;
procedure ClearDebugCvars();
begin
- g_debug_Sounds := False;
- g_debug_Frames := False;
- g_debug_WinMsgs := False;
g_debug_MonsterOff := False;
g_debug_BotAIOff := 0;
- g_debug_HealthBar := False;
- g_Debug_Player := False;
end;
function g_Game_ModeToText(Mode: Byte): string;
var
reliableUpdate: Boolean;
+ rSpectX0, rSpectY0: Integer;
+ rSpectX1, rSpectY1: Integer;
begin
g_ResetDynlights();
framePool.reset();
// process weapon switch queue
end; // if server
- // Наблюдатель
+ // Spectator
+
+ {$IFDEF ENABLE_RENDER}
+ r_Render_GetSpectatorLimits(rSpectX0, rSpectY0, rSpectX1, rSpectY1);
+ {$ELSE}
+ rSpectX0 := 0; rSpectY0 := 0;
+ rSpectX1 := gMapInfo.Width - 1; rSpectY1 := gMapInfo.Height - 1;
+ {$ENDIF}
+
if (gPlayer1 = nil) and (gPlayer2 = nil)
and (not gConsoleShow) and (not gChatShow)
{$IFDEF ENABLE_MENU}
if (gSpectMode = SPECT_MAPVIEW)
and (not gSpectAuto) then
begin
- if gPlayerAction[0, ACTION_MOVELEFT] then
- gSpectX := Max(gSpectX - gSpectStep, 0);
- if gPlayerAction[0, ACTION_MOVERIGHT] then
- gSpectX := Min(gSpectX + gSpectStep, gMapInfo.Width - gScreenWidth);
- if gPlayerAction[0, ACTION_LOOKUP] then
- gSpectY := Max(gSpectY - gSpectStep, 0);
- if gPlayerAction[0, ACTION_LOOKDOWN] then
- gSpectY := Min(gSpectY + gSpectStep, gMapInfo.Height - gScreenHeight);
+ if gPlayerAction[0, ACTION_MOVELEFT] then gSpectX := gSpectX - gSpectStep;
+ if gPlayerAction[0, ACTION_MOVERIGHT] then gSpectX := gSpectX + gSpectStep;
+ if gPlayerAction[0, ACTION_LOOKUP] then gSpectY := gSpectY - gSpectStep;
+ if gPlayerAction[0, ACTION_LOOKDOWN] then gSpectY := gSpectY + gSpectStep;
if gWeaponAction[0, WP_PREV] then
begin
// decrease step
begin
if gSpectMode = SPECT_MAPVIEW then
begin
- i := Min(Max(gSpectX + gSpectAutoStepX, 0), gMapInfo.Width - gScreenWidth);
+ i := Min(Max(gSpectX + gSpectAutoStepX, rSpectX0), rSpectX1);
if i = gSpectX then
gSpectAutoNext := gTime
else
gSpectX := i;
- i := Min(Max(gSpectY + gSpectAutoStepY, 0), gMapInfo.Height - gScreenHeight);
+ i := Min(Max(gSpectY + gSpectAutoStepY, rSpectY0), rSpectY1);
if i = gSpectY then
gSpectAutoNext := gTime
else
case gSpectMode of
SPECT_MAPVIEW:
begin
- gSpectX := Random(gMapInfo.Width - gScreenWidth);
- gSpectY := Random(gMapInfo.Height - gScreenHeight);
+ gSpectX := rSpectX0 + Random(rSpectX1 - rSpectX0);
+ gSpectY := rSpectY0 + Random(rSpectY1 - rSpectY0);
gSpectAutoStepX := Random(9) - 4;
gSpectAutoStepY := Random(9) - 4;
- if ((gSpectX < 800) and (gSpectAutoStepX < 0)) or
- ((gSpectX > gMapInfo.Width - gScreenWidth - 800) and (gSpectAutoStepX > 0)) then
+ if ((gSpectX < rSpectX0) and (gSpectAutoStepX < 0)) or
+ ((gSpectX > rSpectX1) and (gSpectAutoStepX > 0)) then
gSpectAutoStepX := gSpectAutoStepX * -1;
- if ((gSpectY < 800) and (gSpectAutoStepY < 0)) or
- ((gSpectY > gMapInfo.Height - gScreenHeight - 800) and (gSpectAutoStepY > 0)) then
+ if ((gSpectY < rSpectY0) and (gSpectAutoStepY < 0)) or
+ ((gSpectY > rSpectY1) and (gSpectAutoStepY > 0)) then
gSpectAutoStepY := gSpectAutoStepY * -1;
end;
SPECT_PLAYERS:
end;
end;
end;
+
+ if gSpectMode = SPECT_MAPVIEW then
+ begin
+ gSpectX := Max(gSpectX, rSpectX0);
+ gSpectX := Min(gSpectX, rSpectX1);
+ gSpectY := Max(gSpectY, rSpectY0);
+ gSpectY := Min(gSpectY, rSpectY1);
+ end;
end;
(* spectator state check from render *)
- if (gPlayer1 = nil) and (gPlayer2 = nil) and (gSpectMode = SPECT_NONE) then
- gSpectMode := SPECT_STATS;
+ if (gPlayer1 = nil) and (gPlayer2 = nil) then
+ begin
+ (* no local players -> automatically enable to spectator mode *)
+ if gSpectMode = SPECT_NONE then gSpectMode := SPECT_STATS;
+ end
+ else
+ begin
+ (* at least one local player -> automatically disable spectator mode *)
+ gSpectMode := SPECT_NONE;
+ end;
if IsActivePlayer(g_Player_Get(gSpectPID1)) = false then
gSpectPID1 := GetActivePlayerID_Next();
g_Console_Add(Format('gScreenWidth = %d, gScreenHeight = %d', [gScreenWidth, gScreenHeight]));
g_Console_Add(Format('gScreenWidth = %d, gScreenHeight = %d', [gScreenWidth, gScreenHeight]));
end
- else if cmd = 'd_sounds' then
- begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
- g_Debug_Sounds := (P[1][1] = '1');
-
- g_Console_Add(Format('d_sounds is %d', [Byte(g_Debug_Sounds)]));
- end
- else if cmd = 'd_frames' then
- begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
- g_Debug_Frames := (P[1][1] = '1');
-
- g_Console_Add(Format('d_frames is %d', [Byte(g_Debug_Frames)]));
- end
- else if cmd = 'd_winmsg' then
- begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
- g_Debug_WinMsgs := (P[1][1] = '1');
-
- g_Console_Add(Format('d_winmsg is %d', [Byte(g_Debug_WinMsgs)]));
- end
else if (cmd = 'd_monoff') and not g_Game_IsNet then
begin
if (Length(P) > 1) and
end;
end;
end
- else if (cmd = 'd_health') then
- begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
- g_debug_HealthBar := (P[1][1] = '1');
-
- g_Console_Add(Format('d_health is %d', [Byte(g_debug_HealthBar)]));
- end
- else if (cmd = 'd_player') then
- begin
- if (Length(P) > 1) and
- ((P[1] = '1') or (P[1] = '0')) then
- g_debug_Player := (P[1][1] = '1');
-
- g_Console_Add(Format(cmd + ' is %d', [Byte(g_Debug_Player)]));
- end
else if (cmd = 'd_mem') then
begin
PrintHeapStats();
conRegVar('pf_coldet', @g_profile_collision, 'draw collision detection profiles', 'coldet profiles');
conRegVar('pf_los', @g_profile_los, 'draw monster LOS profiles', 'monster LOS profiles');
- conRegVar('r_sq_draw', @gdbg_map_use_accel_render, 'accelerated spatial queries in rendering', 'accelerated rendering');
conRegVar('cd_sq_enabled', @gdbg_map_use_accel_coldet, 'accelerated spatial queries in map coldet', 'accelerated map coldet');
conRegVar('mon_sq_enabled', @gmon_debug_use_sqaccel, 'accelerated spatial queries for monsters', 'accelerated monster coldet');
conRegVar('wtrace_sq_enabled', @gwep_debug_fast_trace, 'accelerated spatial queries for weapon hitscan trace', 'accelerated weapon hitscan');