X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=69c12409394213a367cff2e2da5ad6d95ce50769;hb=bb931202515154fd56edaa5657d0f69f1cce0e75;hp=17c9fdafbd775d156abebd401148926d16b8f4a3;hpb=c7f0b67e60e7e48d12889ad331ee5d24d289a81e;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 17c9fda..69c1240 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -17,12 +17,15 @@ unit g_game; interface -uses - SysUtils, Classes, - MAPDEF, - g_base, g_basic, g_player, r_graphics, g_res_downloader, - g_sound, g_gui, utils, md5, mempool, xprofiler, - g_touch, g_weapons; + uses + {$IFDEF ENABLE_MENU} + g_gui, + {$ENDIF} + SysUtils, Classes, MAPDEF, + g_base, g_basic, g_player, g_res_downloader, + g_sound, utils, md5, mempool, xprofiler, + g_weapons + ; type TGameSettings = record @@ -110,7 +113,6 @@ 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; procedure g_Game_Message(Msg: String; Time: Word); @@ -125,7 +127,9 @@ procedure g_Game_Announce_KillCombo(Param: Integer); procedure g_Game_Announce_BodyKill(SpawnerUID: Word); procedure g_Game_StartVote(Command, Initiator: string); procedure g_Game_CheckVote; -procedure g_TakeScreenShot(Filename: string = ''); +{$IFDEF ENABLE_RENDER} + procedure g_TakeScreenShot(Filename: string = ''); +{$ENDIF} procedure g_FatalError(Text: String); procedure g_SimpleError(Text: String); function g_Game_IsTestMap(): Boolean; @@ -146,8 +150,14 @@ function IsActivePlayer(p: TPlayer): Boolean; function GetActivePlayerID_Next(Skip: Integer = -1): Integer; procedure SortGameStat(var stat: TPlayerStatArray); -procedure KeyPress (K: Word); -procedure CharPress (C: AnsiChar); + +{$IFDEF ENABLE_MENU} + procedure g_Game_InGameMenu(Show: Boolean); +{$ENDIF} +{$IFNDEF HEADLESS} + procedure CharPress (C: AnsiChar); +{$ENDIF} + procedure KeyPress (K: Word); { procedure SetWinPause(Enable: Boolean); } @@ -170,8 +180,6 @@ const GM_COOP = 4; GM_SINGLE = 5; - MESSAGE_DIKEY = WM_USER + 1; - EXIT_QUIT = 1; EXIT_SIMPLE = 2; EXIT_RESTART = 3; @@ -434,16 +442,37 @@ function gPause (): Boolean; inline; implementation uses -{$IFDEF ENABLE_HOLMES} - g_holmes, -{$ENDIF} - e_res, g_window, g_menu, r_render, r_gfx, - e_input, e_log, g_console, r_console, g_items, g_map, g_panel, - g_playermodel, g_gfx, g_options, Math, + {$IFDEF ENABLE_HOLMES} + g_holmes, + {$ENDIF} + {$IFDEF ENABLE_MENU} + g_menu, + {$ENDIF} + {$IFDEF ENABLE_GFX} + g_gfx, + {$ENDIF} + {$IFDEF ENABLE_GIBS} + g_gibs, + {$ENDIF} + {$IFDEF ENABLE_SHELLS} + g_shells, + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + g_corpses, + {$ENDIF} + {$IFDEF ENABLE_RENDER} + r_render, + {$ENDIF} + {$IFNDEF HEADLESS} + g_system, + {$ENDIF} + e_res, g_window, + e_input, e_log, g_console, g_items, g_map, g_panel, + g_playermodel, g_options, Math, g_triggers, g_monsters, e_sound, CONFIG, g_language, g_net, g_phys, ENet, e_msg, g_netmsg, g_netmaster, - sfs, wadreader, g_system, r_playermodel; + sfs, wadreader; var charbuff: packed array [0..15] of AnsiChar = ( @@ -685,13 +714,10 @@ Cheated: end; +{$IFDEF ENABLE_MENU} procedure KeyPress (K: Word); -{$IFNDEF HEADLESS} -var - Msg: g_gui.TMessage; -{$ENDIF} + var Msg: g_gui.TMessage; begin -{$IFNDEF HEADLESS} case K of VK_ESCAPE: // : begin @@ -764,31 +790,48 @@ begin end; end; end; -{$ENDIF} end; - -procedure CharPress (C: AnsiChar); -var - Msg: g_gui.TMessage; - a: Integer; -begin - if gConsoleShow or gChatShow then - begin - g_Console_Char(C) - end - else if (g_ActiveWindow <> nil) then +{$ELSE} + procedure KeyPress (K: Word); begin - Msg.Msg := WM_CHAR; - Msg.WParam := Ord(C); - g_ActiveWindow.OnMessage(Msg); - end - else + gJustChatted := False; + if gConsoleShow or gChatShow then + begin + g_Console_Control(K); + end + end; +{$ENDIF} + +{$IFNDEF HEADLESS} + procedure CharPress (C: AnsiChar); + {$IFDEF ENABLE_MENU} + var Msg: g_gui.TMessage; + {$ENDIF} + var a: Integer; begin - for a := 0 to 14 do charbuff[a] := charbuff[a+1]; - charbuff[15] := upcase1251(C); - Cheat(); + if gConsoleShow or gChatShow then + begin + g_Console_Char(C); + end + {$IFDEF ENABLE_MENU} + else if g_ActiveWindow <> nil then + begin + Msg.Msg := WM_CHAR; + Msg.WParam := Ord(C); + g_ActiveWindow.OnMessage(Msg); + end + {$ENDIF} + else + begin + for a := 0 to 14 do + begin + charbuff[a] := charbuff[a + 1]; + end; + charbuff[15] := upcase1251(C); + Cheat; + end; end; -end; +{$ENDIF} // ////////////////////////////////////////////////////////////////////////// // @@ -887,7 +930,6 @@ var UPSTime: LongWord; DataLoaded: Boolean = False; MessageTime: Word; - MessageLineLength: Integer = 80; MapList: SSArray = nil; MapIndex: Integer = -1; InterReadyTime: Integer = -1; @@ -1226,7 +1268,10 @@ begin MessageText := ''; EndingGameCounter := 0; + +{$IFDEF ENABLE_MENU} g_ActiveWindow := nil; +{$ENDIF} gLMSRespawn := LMS_RESPAWN_NONE; gLMSRespawnTime := 0; @@ -1235,20 +1280,23 @@ begin EXIT_SIMPLE: // Выход через меню или конец теста begin g_Game_Free(); - if gMapOnce then - begin // Это был тест - g_Game_Quit(); - end + begin // Это был тест + g_Game_Quit(); + end else - begin // Выход в главное меню + begin // Выход в главное меню + {$IFDEF DISABLE_MENU} + gState := STATE_MENU; // ??? + {$ELSE} gMusic.SetByName('MUSIC_MENU'); gMusic.Play(); if gState <> STATE_SLIST then begin g_GUI_ShowWindow('MainMenu'); gState := STATE_MENU; - end else + end + else begin // Обновляем список серверов slReturnPressed := True; @@ -1261,9 +1309,9 @@ begin slWaitStr := _lc[I_NET_SLIST_ERROR]; g_Serverlist_GenerateTable(slCurrent, slTable); end; - - g_Game_ExecuteEvent('ongameend'); - end; + {$ENDIF} + g_Game_ExecuteEvent('ongameend'); + end; end; EXIT_RESTART: // Начать уровень сначала @@ -1435,7 +1483,16 @@ begin g_Map_Free(freeTextures); g_Player_Free(); - g_Player_RemoveAllCorpses(); + + {$IFDEF ENABLE_GIBS} + g_Gibs_RemoveAll; + {$ENDIF} + {$IFDEF ENALBE_SHELLS} + g_Shells_RemoveAll; + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + g_Corpses_RemoveAll; + {$ENDIF} gGameSettings.GameType := GT_NONE; if gGameSettings.GameMode = GM_SINGLE then @@ -1633,6 +1690,7 @@ begin end end; +{$IFDEF ENABLE_MENU} // HACK: add dynlight here if gwin_k8_enable_light_experiments then begin @@ -1647,6 +1705,7 @@ begin end; if gwin_has_stencil and g_playerLight then g_AddDynLight(plr.GameX+32, plr.GameY+40, 128, 1, 1, 0, 0.6); +{$ENDIF} end; // HACK: don't have a "key was pressed" function @@ -1669,12 +1728,14 @@ begin end; procedure g_Game_Update(); -var - Msg: g_gui.TMessage; - Time: Int64; - a: Byte; - w: Word; - i, b: Integer; + var + {$IFDEF ENABLE_MENU} + Msg: g_gui.TMessage; + w: Word; + {$ENDIF} + Time: Int64; + a: Byte; + i, b: Integer; function sendMonsPos (mon: TMonster): Boolean; begin @@ -1722,7 +1783,6 @@ begin // no need to, as we'll do it in event handler // Обновляем консоль (движение и сообщения): - r_Console_Update; g_Console_Update(); if (NetMode = NET_NONE) and (g_Game_IsNet) and (gGameOn or (gState in [STATE_FOLD, STATE_INTERCUSTOM])) then @@ -1762,7 +1822,9 @@ begin e_KeyPressed(JOY2_ATTACK) or e_KeyPressed(JOY3_ATTACK) ) and (not gJustChatted) and (not gConsoleShow) and (not gChatShow) +{$IFDEF ENABLE_MENU} and (g_ActiveWindow = nil) +{$ENDIF} ) or (g_Game_IsNet and ((gInterTime > gInterEndTime) or ((gInterReadyCount >= NetClientCount) and (NetClientCount > 0)))) ) @@ -1781,9 +1843,11 @@ begin begin // Выход в главное меню: g_Game_Free; +{$IFDEF ENABLE_MENU} g_GUI_ShowWindow('MainMenu'); gMusic.SetByName('MUSIC_MENU'); gMusic.Play(); +{$ENDIF} gState := STATE_MENU; end else begin @@ -1809,7 +1873,9 @@ begin e_KeyPressed(JOY2_ATTACK) or e_KeyPressed(JOY3_ATTACK) ) and (not gJustChatted) and (not gConsoleShow) and (not gChatShow) +{$IFDEF ENABLE_MENU} and (g_ActiveWindow = nil) +{$ENDIF} ) then begin @@ -1944,7 +2010,11 @@ begin // Обрабатываем клавиши игроков: if gPlayer1 <> nil then gPlayer1.ReleaseKeys(); if gPlayer2 <> nil then gPlayer2.ReleaseKeys(); +{$IFDEF DISABLE_MENU} + if (not gConsoleShow) and (not gChatShow) then +{$ELSE} if (not gConsoleShow) and (not gChatShow) and (g_ActiveWindow = nil) then +{$ENDIF} begin ProcessPlayerControls(gPlayer1, 0, P1MoveButton); ProcessPlayerControls(gPlayer2, 1, P2MoveButton); @@ -1957,8 +2027,12 @@ begin end; // if server // Наблюдатель - if (gPlayer1 = nil) and (gPlayer2 = nil) and - (not gConsoleShow) and (not gChatShow) and (g_ActiveWindow = nil) then + if (gPlayer1 = nil) and (gPlayer2 = nil) + and (not gConsoleShow) and (not gChatShow) +{$IFDEF ENABLE_MENU} + and (g_ActiveWindow = nil) +{$ENDIF} + then begin if not gSpectKeyPress then begin @@ -2121,10 +2195,19 @@ begin g_Triggers_Update(); g_Weapon_Update(); g_Monsters_Update(); - g_GFX_Update(); - r_GFX_Update; + {$IFDEF ENABLE_GFX} + g_GFX_Update; + {$ENDIF} g_Player_UpdateAll(); - g_Player_UpdatePhysicalObjects(); + {$IFDEF ENABLE_GIBS} + g_Gibs_Update; + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + g_Corpses_Update; + {$ENDIF} + {$IFDEF ENABLE_SHELLS} + g_Shells_Update; + {$ENDIF} // server: send newly spawned monsters unconditionally if (gGameSettings.GameType = GT_SERVER) then @@ -2203,6 +2286,7 @@ begin end; // if gameOn ... // Активно окно интерфейса - передаем клавиши ему: +{$IFDEF ENABLE_MENU} if g_ActiveWindow <> nil then begin w := e_GetFirstKeyPressed(); @@ -2221,8 +2305,10 @@ begin // Нужно сменить разрешение: if gResolutionChange then begin - e_WriteLog('Changing resolution', TMsgType.Notify); - r_Render_Apply; + {$IFNDEF HEADLESS} + e_WriteLog('Changing resolution', TMsgType.Notify); + r_Render_Apply; + {$ENDIF} gResolutionChange := False; g_ActiveWindow := nil; end; @@ -2233,9 +2319,7 @@ begin //e_WriteLog('Read language file', MSG_NOTIFY); //g_Language_Load(DataDir + gLanguage + '.txt'); g_Language_Set(gLanguage); -{$IFNDEF HEADLESS} g_Menu_Reset(); -{$ENDIF} gLanguageChange := False; end; end; @@ -2248,6 +2332,7 @@ begin begin KeyPress(IK_F10); end; +{$ENDIF} Time := GetTickCount64() {div 1000}; @@ -2468,7 +2553,10 @@ begin g_Game_DeleteTestMap(); gExit := EXIT_QUIT; - sys_RequestQuit; + + {$IFNDEF HEADLESS} + sys_RequestQuit; + {$ENDIF} end; procedure g_Game_FreeData(); @@ -3213,7 +3301,16 @@ var nws: AnsiString; begin g_Map_Free((Map <> gCurrentMapFileName) and (oldMapPath <> gCurrentMapFileName)); - g_Player_RemoveAllCorpses(); + + {$IFDEF ENABLE_GIBS} + g_Gibs_RemoveAll; + {$ENDIF} + {$IFDEF ENALBE_SHELLS} + g_Shells_RemoveAll; + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + g_Corpses_RemoveAll; + {$ENDIF} if (not g_Game_IsClient) and (gSwitchGameMode <> gGameSettings.GameMode) and @@ -3282,14 +3379,18 @@ begin begin //result := g_Map_Load(gGameSettings.WAD + ':\' + ResName); result := g_Map_Load(NewWAD+':\'+ResName); - r_Render_LoadTextures; + {$IFDEF ENABLE_RENDER} + r_Render_LoadTextures; + {$ENDIF} end; if Result then begin g_Player_ResetAll(Force or gLastMap, gGameSettings.GameType = GT_SINGLE); gState := STATE_NONE; - g_ActiveWindow := nil; + {$IFDEF ENABLE_MENU} + g_ActiveWindow := nil; + {$ENDIF} gGameOn := True; DisableCheats(); @@ -3534,7 +3635,16 @@ begin Exit; end; - g_Player_RemoveAllCorpses; + {$IFDEF ENABLE_GIBS} + g_Gibs_RemoveAll; + {$ENDIF} + {$IFDEF ENALBE_SHELLS} + g_Shells_RemoveAll; + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + g_Corpses_RemoveAll; + {$ENDIF} + g_Game_Message(_lc[I_MESSAGE_LMS_START], 144); if g_Game_IsNet then MH_SEND_GameEvent(NET_EV_LMS_START); @@ -3885,12 +3995,18 @@ begin begin if Length(p) = 2 then begin - a := Max(0, StrToInt(p[1])); - g_GFX_SetMax(a) + {$IFDEF ENABLE_GFX} + a := Max(0, StrToInt(p[1])); + g_GFX_SetMax(a) + {$ENDIF} end else if Length(p) = 1 then begin - e_LogWritefln('%s', [g_GFX_GetMax()]) + {$IFDEF ENABLE_GFX} + e_LogWritefln('%s', [g_GFX_GetMax()]) + {$ELSE} + e_LogWritefln('%s', [0]) + {$ENDIF} end else begin @@ -3901,12 +4017,18 @@ begin begin if Length(p) = 2 then begin - a := Max(0, StrToInt(p[1])); - g_Shells_SetMax(a) + {$IFDEF ENABLE_SHELLS} + a := Max(0, StrToInt(p[1])); + g_Shells_SetMax(a) + {$ENDIF} end else if Length(p) = 1 then begin - e_LogWritefln('%s', [g_Shells_GetMax()]) + {$IFDEF ENABLE_SHELLS} + e_LogWritefln('%s', [g_Shells_GetMax()]) + {$ELSE} + e_LogWritefln('%s', [0]) + {$ENDIF} end else begin @@ -3917,12 +4039,18 @@ begin begin if Length(p) = 2 then begin - a := Max(0, StrToInt(p[1])); - g_Gibs_SetMax(a) + {$IFDEF ENABLE_GIBS} + a := Max(0, StrToInt(p[1])); + g_Gibs_SetMax(a) + {$ENDIF} end else if Length(p) = 1 then begin - e_LogWritefln('%s', [g_Gibs_GetMax()]) + {$IFDEF ENABLE_GIBS} + e_LogWritefln('%s', [g_Gibs_GetMax()]) + {$ELSE} + e_LogWritefln('%s', [0]) + {$ENDIF} end else begin @@ -3933,12 +4061,18 @@ begin begin if Length(p) = 2 then begin - a := Max(0, StrToInt(p[1])); - g_Corpses_SetMax(a) + {$IFDEF ENABLE_CORPSES} + a := Max(0, StrToInt(p[1])); + g_Corpses_SetMax(a) + {$ENDIF} end else if Length(p) = 1 then begin - e_LogWritefln('%s', [g_Corpses_GetMax()]) + {$IFDEF ENABLE_CORPSES} + e_LogWritefln('%s', [g_Corpses_GetMax()]) + {$ELSE} + e_LogWritefln('%s', [0]) + {$ENDIF} end else begin @@ -4520,8 +4654,12 @@ begin chstr := ''; if cmd = 'pause' then begin - if (g_ActiveWindow = nil) then + {$IFDEF ENABLE_MENU} + if (g_ActiveWindow = nil) then + g_Game_Pause(not gPauseMain); + {$ELSE} g_Game_Pause(not gPauseMain); + {$ENDIF} end else if cmd = 'endgame' then gExit := EXIT_SIMPLE @@ -5452,7 +5590,9 @@ begin end else if cmd = 'screenshot' then begin - g_TakeScreenShot() + {$IFDEF ENABLE_RENDER} + g_TakeScreenShot; + {$ENDIF} end else if cmd = 'weapon' then begin @@ -5689,8 +5829,10 @@ begin g_Game_Free(); g_Game_Quit(); end; +{$IFDEF ENABLE_RENDER} 'r_reset': - r_Render_Apply; + r_Render_Apply; +{$ENDIF} 'r_maxfps': begin if Length(p) = 2 then @@ -5736,36 +5878,30 @@ begin end; end; +{$IFDEF ENABLE_RENDER} procedure g_TakeScreenShot(Filename: string = ''); - var s: TStream; t: TDateTime; dir, date, name: String; + var t: TDateTime; dir, date, name: String; begin - if e_NoGraphics then Exit; - try - dir := e_GetWriteableDir(ScreenshotDirs); + if e_NoGraphics then + Exit; - if Filename = '' then - begin - t := Now; - DateTimeToString(date, 'yyyy-mm-dd-hh-nn-ss', t); - Filename := 'screenshot-' + date; - end; - - name := e_CatPath(dir, Filename + '.png'); - s := createDiskFile(name); - try - e_MakeScreenshot(s, gScreenWidth, gScreenHeight); - s.Free; - g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [name])) - except - g_Console_Add(Format(_lc[I_CONSOLE_ERROR_WRITE], [name])); - s.Free; - DeleteFile(name) - end - except - g_Console_Add('oh shit, i can''t create screenshot!') - end + dir := e_GetWriteableDir(ScreenshotDirs); + if Filename = '' then + begin + t := Now; + DateTimeToString(date, 'yyyy-mm-dd-hh-nn-ss', t); + Filename := 'screenshot-' + date; + end; + + name := e_CatPath(dir, Filename + '.png'); + if r_Render_WriteScreenShot(name) then + g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [name])) + else + g_Console_Add(Format(_lc[I_CONSOLE_ERROR_WRITE], [name])); end; +{$ENDIF} +{$IFDEF ENABLE_MENU} procedure g_Game_InGameMenu(Show: Boolean); begin if (g_ActiveWindow = nil) and Show then @@ -5796,6 +5932,7 @@ begin g_Game_Pause(False); end; end; +{$ENDIF} procedure g_Game_Pause (Enable: Boolean); var @@ -5939,12 +6076,11 @@ begin end; end; -procedure g_Game_Message(Msg: string; Time: Word); -begin - MessageLineLength := (gScreenWidth - 204) div e_CharFont_GetMaxWidth(gMenuFont); - MessageText := b_Text_Wrap(b_Text_Format(Msg), MessageLineLength); - MessageTime := Time; -end; + procedure g_Game_Message (Msg: string; Time: Word); + begin + MessageText := Msg; + MessageTime := Time; + end; procedure g_Game_ChatSound(Text: String; Taunt: Boolean = True); const @@ -6245,7 +6381,9 @@ begin PBarWasHere := false; end; - g_ActiveWindow := nil; + {$IFDEF ENABLE_MENU} + g_ActiveWindow := nil; + {$ENDIF} ProcessLoading(true); end; @@ -6527,8 +6665,10 @@ begin 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'); +{$IFDEF ENABLE_GFX} conRegVar('pr_enabled', @gpart_dbg_enabled, 'enable/disable particles', 'particles'); conRegVar('pr_phys_enabled', @gpart_dbg_phys_enabled, 'enable/disable particle physics', 'particle physics'); +{$ENDIF} conRegVar('los_enabled', @gmon_dbg_los_enabled, 'enable/disable monster LOS calculations', 'monster LOS', true); conRegVar('mon_think', @gmon_debug_think, 'enable/disable monster thinking', 'monster thinking', true);