diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index d1ffd7ade5d35568897b3a5b825e0ec55a682da4..ab843d3c8ca2892df532db9d556978f4e22a7539 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
interface
uses
- g_basic, g_player, e_graphics, Classes, g_res_downloader,
- SysUtils, g_sound, g_gui, MAPDEF, wadreader, md5, xprofiler;
+ SysUtils, Classes,
+ MAPDEF,
+ g_basic, g_player, e_graphics, g_res_downloader,
+ g_sound, g_gui, wadreader, md5, xprofiler;
type
TGameSettings = record
function g_Game_GetNextMap(): String;
procedure g_Game_NextLevel();
procedure g_Game_Pause(Enable: Boolean);
+procedure g_Game_HolmesPause(Enable: Boolean);
procedure g_Game_InGameMenu(Show: Boolean);
function g_Game_IsWatchedPlayer(UID: Word): Boolean;
function g_Game_IsWatchedTeam(Team: Byte): Boolean;
gServInterTime: Byte = 0;
gGameStartTime: LongWord = 0;
gTotalMonsters: Integer = 0;
- gPause: Boolean;
+ gPauseMain: Boolean = false;
+ gPauseHolmes: Boolean = false;
gShowTime: Boolean = True;
gShowFPS: Boolean = False;
gShowGoals: Boolean = True;
procedure g_AddDynLight (x, y, radius: Integer; r, g, b, a: Single);
procedure g_DynLightExplosion (x, y, radius: Integer; r, g, b: Single);
-function conIsCheatsEnabled (): Boolean;
+function conIsCheatsEnabled (): Boolean; inline;
+function gPause (): Boolean; inline;
implementation
e_input, e_log, g_console, g_items, g_map, g_panel,
g_playermodel, g_gfx, g_options, g_weapons, Math,
g_triggers, g_monsters, e_sound, CONFIG,
- BinEditor, g_language, g_net, SDL,
+ g_language, g_net, SDL,
ENet, e_msg, g_netmsg, g_netmaster, GL, GLExt,
utils, sfs, g_holmes;
// ////////////////////////////////////////////////////////////////////////// //
-function conIsCheatsEnabled (): Boolean;
+function gPause (): Boolean; inline; begin result := gPauseMain or gPauseHolmes; end;
+
+
+// ////////////////////////////////////////////////////////////////////////// //
+function conIsCheatsEnabled (): Boolean; inline;
begin
result := false;
- if (not gGameOn) or (not gCheats) or ((gGameSettings.GameType <> GT_SINGLE) and
- (gGameSettings.GameMode <> GM_COOP) and (not gDebugMode)) or g_Game_IsNet then exit;
+ if g_Game_IsNet then exit;
+ if not gDebugMode then
+ begin
+ //if not gCheats then exit;
+ if not (gGameSettings.GameType in [GT_SINGLE, GT_CUSTOM]) then exit;
+ if not (gGameSettings.GameMode in [GM_COOP, GM_SINGLE]) then exit;
+ end;
result := true;
end;
MH_SEND_GameEvent(NET_EV_MAPEND, Byte(gMissionFailed));
// Ñòîï èãðà:
- gPause := False;
- gGameOn := False;
+ gPauseMain := false;
+ gPauseHolmes := false;
+ gGameOn := false;
g_Game_StopAllSounds(False);
if FindFirst(ModelsDir+'*.wad', faAnyFile, SR) = 0 then
repeat
if not g_PlayerModel_Load(ModelsDir+SR.Name) then
- e_WriteLog(Format('Error loading model %s', [SR.Name]), MSG_WARNING);
+ e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning);
until FindNext(SR) <> 0;
FindClose(SR);
if FindFirst(ModelsDir+'*.pk3', faAnyFile, SR) = 0 then
repeat
if not g_PlayerModel_Load(ModelsDir+SR.Name) then
- e_WriteLog(Format('Error loading model %s', [SR.Name]), MSG_WARNING);
+ e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning);
until FindNext(SR) <> 0;
FindClose(SR);
if FindFirst(ModelsDir+'*.zip', faAnyFile, SR) = 0 then
repeat
if not g_PlayerModel_Load(ModelsDir+SR.Name) then
- e_WriteLog(Format('Error loading model %s', [SR.Name]), MSG_WARNING);
+ e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning);
until FindNext(SR) <> 0;
FindClose(SR);
- gGameOn := False;
- gPause := False;
+ gGameOn := false;
+ gPauseMain := false;
+ gPauseHolmes := false;
gTime := 0;
LastScreenShot := 0;
// new strafe mechanics
if (strafeDir = 0) then strafeDir := MoveButton; // start strafing
// now set direction according to strafe (reversed)
- if (strafeDir = 2) then plr.SetDirection(D_LEFT)
- else if (strafeDir = 1) then plr.SetDirection(D_RIGHT);
+ if (strafeDir = 2) then plr.SetDirection(TDirection.D_LEFT)
+ else if (strafeDir = 1) then plr.SetDirection(TDirection.D_RIGHT);
end
else
begin
strafeDir := 0; // not strafing anymore
// Ðàíüøå áûëà íàæàòà "Âïðàâî", à ñåé÷àñ "Âëåâî" => áåæèì âïðàâî, ñìîòðèì âëåâî:
- if (MoveButton = 2) and isKeyPressed(KeyLeft, KeyLeft2) then plr.SetDirection(D_LEFT)
+ if (MoveButton = 2) and isKeyPressed(KeyLeft, KeyLeft2) then plr.SetDirection(TDirection.D_LEFT)
// Ðàíüøå áûëà íàæàòà "Âëåâî", à ñåé÷àñ "Âïðàâî" => áåæèì âëåâî, ñìîòðèì âïðàâî:
- else if (MoveButton = 1) and isKeyPressed(KeyRight, KeyRight2) then plr.SetDirection(D_RIGHT)
+ else if (MoveButton = 1) and isKeyPressed(KeyRight, KeyRight2) then plr.SetDirection(TDirection.D_RIGHT)
// ×òî-òî áûëî íàæàòî è íå èçìåíèëîñü => êóäà áåæèì, òóäà è ñìîòðèì:
else if MoveButton <> 0 then plr.SetDirection(TDirection(MoveButton-1));
end;
// Íóæíî ñìåíèòü ðàçðåøåíèå:
if gResolutionChange then
begin
- e_WriteLog('Changing resolution', MSG_NOTIFY);
+ e_WriteLog('Changing resolution', TMsgType.Notify);
g_Game_ChangeResolution(gRC_Width, gRC_Height, gRC_FullScreen, gRC_Maximized);
gResolutionChange := False;
end;
begin
if DataLoaded then Exit;
- e_WriteLog('Loading game data...', MSG_NOTIFY);
+ e_WriteLog('Loading game data...', TMsgType.Notify);
g_Texture_CreateWADEx('NOTEXTURE', GameWAD+':TEXTURES\NOTEXTURE');
g_Texture_CreateWADEx('TEXTURE_PLAYER_HUD', GameWAD+':TEXTURES\HUD');
g_Weapon_FreeData();
g_Monsters_FreeData();
- e_WriteLog('Releasing game data...', MSG_NOTIFY);
+ e_WriteLog('Releasing game data...', TMsgType.Notify);
g_Texture_Delete('NOTEXTURE');
g_Texture_Delete('TEXTURE_PLAYER_HUD');
//TODO: lights should be in separate grid, i think
// but on the other side: grid may be slower for dynlights, as their lifetime is short
- if (not g_playerLight) or (not gwin_has_stencil) or (g_dynLightCount < 1) then exit;
+ if (not gwin_k8_enable_light_experiments) or (not gwin_has_stencil) or (g_dynLightCount < 1) then exit;
// rendering mode
//ambColor := gCurrentMap['light_ambient'].rgba;
drawOther('corpses', @g_Player_DrawCorpses);
drawPanelType('*wall', PANEL_WALL, g_rlayer_wall);
drawOther('monsters', @g_Monsters_Draw);
+ drawOther('itemdrop', @g_Items_DrawDrop);
drawPanelType('*door', PANEL_CLOSEDOOR, g_rlayer_door);
drawOther('gfx', @g_GFX_Draw);
drawOther('flags', @g_Map_DrawFlags);
//glTranslatef(a, b+p.IncCam, 0);
- if (p = gPlayer1) then g_Holmes_plrViewSize(sWidth, sHeight);
+ //if (p = gPlayer1) and (g_dbg_scale >= 1.0) then g_Holmes_plrViewSize(sWidth, sHeight);
+ //conwritefln('OLD: (%s,%s)-(%s,%s)', [sX, sY, sWidth, sHeight]);
fixViewportForScale();
+ //conwritefln(' (%s,%s)-(%s,%s)', [sX, sY, sWidth, sHeight]);
p.viewPortX := sX;
p.viewPortY := sY;
p.viewPortW := sWidth;
p.viewPortH := sHeight;
- if (p = gPlayer1) then g_Holmes_plrViewPos(sX, sY);
+ if (p = gPlayer1) then
+ begin
+ g_Holmes_plrViewPos(sX, sY);
+ g_Holmes_plrViewSize(sWidth, sHeight);
+ end;
renderMapInternal(-c, -d, true);
end;
end;
- if gPause and gGameOn and (g_ActiveWindow = nil) then
+ if gPauseMain and gGameOn and (g_ActiveWindow = nil) then
begin
//e_DrawFillQuad(0, 0, gScreenWidth-1, gScreenHeight-1, 48, 48, 48, 180);
e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
procedure g_FatalError(Text: String);
begin
g_Console_Add(Format(_lc[I_FATAL_ERROR], [Text]), True);
- e_WriteLog(Format(_lc[I_FATAL_ERROR], [Text]), MSG_WARNING);
+ e_WriteLog(Format(_lc[I_FATAL_ERROR], [Text]), TMsgType.Warning);
gExit := EXIT_SIMPLE;
end;
procedure g_SimpleError(Text: String);
begin
g_Console_Add(Format(_lc[I_SIMPLE_ERROR], [Text]), True);
- e_WriteLog(Format(_lc[I_SIMPLE_ERROR], [Text]), MSG_WARNING);
+ e_WriteLog(Format(_lc[I_SIMPLE_ERROR], [Text]), TMsgType.Warning);
end;
procedure g_Game_SetupScreenSize();
begin
g_Game_Free();
- e_WriteLog('Starting singleplayer game...', MSG_NOTIFY);
+ e_WriteLog('Starting singleplayer game...', TMsgType.Notify);
g_Game_ClearLoading();
begin
g_Game_Free();
- e_WriteLog('Starting custom game...', MSG_NOTIFY);
+ e_WriteLog('Starting custom game...', TMsgType.Notify);
g_Game_ClearLoading();
begin
g_Game_Free();
- e_WriteLog('Starting net game (server)...', MSG_NOTIFY);
+ e_WriteLog('Starting net game (server)...', TMsgType.Notify);
g_Game_ClearLoading();
g_Game_Free();
State := 0;
- e_WriteLog('Starting net game (client)...', MSG_NOTIFY);
- e_WriteLog('NET: Trying to connect to ' + Addr + ':' + IntToStr(Port) + '...', MSG_NOTIFY);
+ e_WriteLog('Starting net game (client)...', TMsgType.Notify);
+ e_WriteLog('NET: Trying to connect to ' + Addr + ':' + IntToStr(Port) + '...', TMsgType.Notify);
g_Game_ClearLoading();
g_Player_Init();
NetState := NET_STATE_GAME;
MC_SEND_FullStateRequest;
- e_WriteLog('NET: Connection successful.', MSG_NOTIFY);
+ e_WriteLog('NET: Connection successful.', TMsgType.Notify);
end;
procedure g_Game_SaveOptions();
end;
gExit := 0;
- gPause := False;
+ gPauseMain := false;
+ gPauseHolmes := false;
gTime := 0;
NetTimeToUpdate := 1;
NetTimeToReliable := 0;
mon: TMonster;
begin
// Êîìàíäû îòëàäî÷íîãî ðåæèìà:
- if gDebugMode then
+ if {gDebugMode}conIsCheatsEnabled then
begin
cmd := LowerCase(P[0]);
if cmd = 'd_window' then
g_Console_Add('ID | Name');
for b := MONSTER_DEMON to MONSTER_MAN do
g_Console_Add(Format('%2d | %s', [b, g_Mons_NameByTypeId(b)]));
+ conwriteln('behav. num'#10'normal 0'#10'killer 1'#10'maniac 2'#10'insane 3'#10'cannibal 4'#10'good 5');
end else
begin
a := StrToIntDef(P[1], 0);
gPlayer1.Direction, True);
end;
if (Length(P) > 2) and (mon <> nil) then
- mon.MonsterBehaviour := Min(Max(StrToIntDef(P[2], BH_NORMAL), BH_NORMAL), BH_GOOD);
+ begin
+ if (CompareText(P[2], 'normal') = 0) then mon.MonsterBehaviour := BH_NORMAL
+ else if (CompareText(P[2], 'killer') = 0) then mon.MonsterBehaviour := BH_KILLER
+ else if (CompareText(P[2], 'maniac') = 0) then mon.MonsterBehaviour := BH_MANIAC
+ else if (CompareText(P[2], 'insane') = 0) then mon.MonsterBehaviour := BH_INSANE
+ else if (CompareText(P[2], 'cannibal') = 0) then mon.MonsterBehaviour := BH_CANNIBAL
+ else if (CompareText(P[2], 'good') = 0) then mon.MonsterBehaviour := BH_GOOD
+ else if (CompareText(P[2], 'friend') = 0) then mon.MonsterBehaviour := BH_GOOD
+ else if (CompareText(P[2], 'friendly') = 0) then mon.MonsterBehaviour := BH_GOOD
+ else mon.MonsterBehaviour := Min(Max(StrToIntDef(P[2], BH_NORMAL), BH_NORMAL), BH_GOOD);
+ end;
end;
end;
end
f, a: Integer;
plr: TPlayer;
begin
- if (not gGameOn) or (not gCheats) or ((gGameSettings.GameType <> GT_SINGLE) and
- (gGameSettings.GameMode <> GM_COOP) and (not gDebugMode)) or g_Game_IsNet then
+ if (not gGameOn) or (not conIsCheatsEnabled) then
begin
g_Console_Add('not available');
exit;
else if cmd = 'pause' then
begin
if (g_ActiveWindow = nil) then
- g_Game_Pause(not gPause);
+ g_Game_Pause(not gPauseMain);
end
else if cmd = 'endgame' then
gExit := EXIT_SIMPLE
end;
end;
-procedure g_Game_Pause(Enable: Boolean);
+procedure g_Game_Pause (Enable: Boolean);
+var
+ oldPause: Boolean;
begin
- if not gGameOn then
- Exit;
+ if not gGameOn then exit;
- if gPause = Enable then
- Exit;
+ if not (gGameSettings.GameType in [GT_SINGLE, GT_CUSTOM]) then exit;
- if not (gGameSettings.GameType in [GT_SINGLE, GT_CUSTOM]) then
- Exit;
+ oldPause := gPause;
+ gPauseMain := Enable;
- gPause := Enable;
- g_Game_PauseAllSounds(Enable);
+ if (gPause <> oldPause) then g_Game_PauseAllSounds(gPause);
+end;
+
+procedure g_Game_HolmesPause (Enable: Boolean);
+var
+ oldPause: Boolean;
+begin
+ if not gGameOn then exit;
+ if not (gGameSettings.GameType in [GT_SINGLE, GT_CUSTOM]) then exit;
+
+ oldPause := gPause;
+ gPauseHolmes := Enable;
+
+ if (gPause <> oldPause) then g_Game_PauseAllSounds(gPause);
end;
procedure g_Game_PauseAllSounds(Enable: Boolean);
if (s <> '') then
begin
gMapToDelete := MapsDir + map;
- e_WriteLog('"--testdelete" is deprecated, use --tempdelete.', MSG_FATALERROR);
+ e_WriteLog('"--testdelete" is deprecated, use --tempdelete.', TMsgType.Fatal);
Halt(1);
end;
Reset(F);
if IOResult <> 0 then
begin
- e_WriteLog(Format(_lc[I_SIMPLE_ERROR], ['Failed to read file: ' + s]), MSG_WARNING);
+ e_WriteLog(Format(_lc[I_SIMPLE_ERROR], ['Failed to read file: ' + s]), TMsgType.Warning);
g_Console_Add(Format(_lc[I_CONSOLE_ERROR_READ], [s]));
CloseFile(F);
Exit;
end;
- e_WriteLog('Executing script: ' + s, MSG_NOTIFY);
+ e_WriteLog('Executing script: ' + s, TMsgType.Notify);
g_Console_Add(Format(_lc[I_CONSOLE_EXEC], [s]));
while not EOF(F) do
ReadLn(F, s);
if IOResult <> 0 then
begin
- e_WriteLog(Format(_lc[I_SIMPLE_ERROR], ['Failed to read file: ' + s]), MSG_WARNING);
+ e_WriteLog(Format(_lc[I_SIMPLE_ERROR], ['Failed to read file: ' + s]), TMsgType.Warning);
g_Console_Add(Format(_lc[I_CONSOLE_ERROR_READ], [s]));
CloseFile(F);
Exit;
conRegVar('dbg_holmes', @g_holmes_enabled, 'enable/disable Holmes', 'Holmes', true);
conRegVar('dbg_scale', @g_dbg_scale, 0.01, 100.0, 'experimental deBUG scale mode', '', false);
+
+ conRegVar('light_enabled', @gwin_k8_enable_light_experiments, 'enable/disable dynamic lighting', 'lighting');
+ conRegVar('light_player_halo', @g_playerLight, 'enable/disable player halo', 'player light halo');
end.