X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=f4882b6bdbc95b4069ef439cf192f1da7cb0a4a9;hb=02e6aa22f21119c1a329e7b5321b94bf9fe9d4d7;hp=6a26b044dc0aed035326e0e24f0fd61009f8b426;hpb=5e0a71e1d35a9037be80c8912060a913d0e98b18;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 6a26b04..f4882b6 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -19,8 +19,10 @@ unit g_game; 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 @@ -102,6 +104,7 @@ function g_Game_GetFirstMap(WAD: String): String; 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; @@ -229,7 +232,8 @@ var 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; @@ -324,34 +328,42 @@ var g_rlayer_water: Boolean = true; g_rlayer_fore: Boolean = true; - g_dbg_scale: Single = 1.0; - procedure g_ResetDynlights (); 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 uses - g_textures, g_main, g_window, g_menu, + e_texture, g_textures, g_main, g_window, g_menu, 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; @@ -852,8 +864,9 @@ begin MH_SEND_GameEvent(NET_EV_MAPEND, Byte(gMissionFailed)); // Ñòîï èãðà: - gPause := False; - gGameOn := False; + gPauseMain := false; + gPauseHolmes := false; + gGameOn := false; g_Game_StopAllSounds(False); @@ -1260,8 +1273,9 @@ begin until FindNext(SR) <> 0; FindClose(SR); - gGameOn := False; - gPause := False; + gGameOn := false; + gPauseMain := false; + gPauseHolmes := false; gTime := 0; LastScreenShot := 0; @@ -2736,7 +2750,7 @@ begin //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; @@ -2750,17 +2764,17 @@ begin (* * light rendering: (INVALID!) * glStencilFunc(GL_EQUAL, 0, $ff); - * clear depth buffer - * renderAmbientQuad() * for each light: + * glClear(GL_STENCIL_BUFFER_BIT); * glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); * draw shadow volume into stencil buffer * glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); // modify color buffer * glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // don't modify stencil buffer * turn off blending - * draw quad with light alpha + * draw color-less quad with light alpha (WARNING! don't touch color!) * glEnable(GL_BLEND); - * gl.glBlendFunc(GL_DST_ALPHA, GL_ONE); + * glBlendFunc(GL_DST_ALPHA, GL_ONE); + * draw all geometry up to and including walls (with alpha-testing, probably) -- this does lighting *) wassc := (glIsEnabled(GL_SCISSOR_TEST) <> 0); @@ -2912,6 +2926,7 @@ begin if setTransMatrix then begin + //if (g_dbg_scale <> 1.0) then glTranslatef(0.0, -0.375/2, 0); glScalef(g_dbg_scale, g_dbg_scale, 1.0); glTranslatef(-sX, -sY, 0); end; @@ -2940,6 +2955,7 @@ begin 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); @@ -3341,7 +3357,7 @@ begin 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); @@ -4251,7 +4267,8 @@ begin end; gExit := 0; - gPause := False; + gPauseMain := false; + gPauseHolmes := false; gTime := 0; NetTimeToUpdate := 1; NetTimeToReliable := 0; @@ -5166,6 +5183,19 @@ begin end; end; +procedure PrintHeapStats(); +var + hs: TFPCHeapStatus; +begin + hs := GetFPCHeapStatus(); + e_LogWriteLn ('v===== heap status =====v'); + e_LogWriteFln('max heap size = %d k', [hs.MaxHeapSize div 1024]); + e_LogWriteFln('max heap used = %d k', [hs.MaxHeapUsed div 1024]); + e_LogWriteFln('cur heap size = %d k', [hs.CurrHeapSize div 1024]); + e_LogWriteFln('cur heap used = %d k', [hs.CurrHeapUsed div 1024]); + e_LogWriteFln('cur heap free = %d k', [hs.CurrHeapFree div 1024]); + e_LogWriteLn ('^=======================^'); +end; procedure DebugCommands(P: SArray); var @@ -5175,7 +5205,7 @@ var mon: TMonster; begin // Êîìàíäû îòëàäî÷íîãî ðåæèìà: - if gDebugMode then + if {gDebugMode}conIsCheatsEnabled then begin cmd := LowerCase(P[0]); if cmd = 'd_window' then @@ -5239,6 +5269,7 @@ begin 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); @@ -5257,7 +5288,17 @@ begin 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 @@ -5281,6 +5322,10 @@ begin begin for a := 1 to 8 do g_Console_Add(e_JoystickStateToString(a)); + end + else if (cmd = 'd_mem') then + begin + PrintHeapStats(); end; end else @@ -5294,8 +5339,7 @@ var 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; @@ -5529,7 +5573,7 @@ begin 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 @@ -6527,19 +6571,31 @@ begin 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); @@ -7168,5 +7224,8 @@ begin conRegVar('dbg_holmes', @g_holmes_enabled, 'enable/disable Holmes', 'Holmes', true); - conRegVar('dbg_scale', @g_dbg_scale, 0.01, 5.0, 'experimental deBUG scale mode', '', 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.