diff --git a/Source/control.cpp b/Source/control.cpp index 863c2f22e..789627e6f 100644 --- a/Source/control.cpp +++ b/Source/control.cpp @@ -544,30 +544,34 @@ void control_update_life_mana() void InitControlPan() { - pBtmBuff.emplace(GetMainPanel().size.width, (GetMainPanel().size.height + 16) * (IsChatAvailable() ? 2 : 1)); - pManaBuff.emplace(88, 88); - pLifeBuff.emplace(88, 88); - - LoadCharPanel(); - LoadSpellIcons(); - { - const OwnedCelSprite sprite = LoadCel("CtrlPan\\Panel8.CEL", GetMainPanel().size.width); - CelDrawUnsafeTo(*pBtmBuff, { 0, (GetMainPanel().size.height + 16) - 1 }, CelSprite { sprite }, 0); - } - { - const Point bulbsPosition { 0, 87 }; - const OwnedCelSprite statusPanel = LoadCel("CtrlPan\\P8Bulbs.CEL", 88); - CelDrawUnsafeTo(*pLifeBuff, bulbsPosition, CelSprite { statusPanel }, 0); - CelDrawUnsafeTo(*pManaBuff, bulbsPosition, CelSprite { statusPanel }, 1); + if (!HeadlessMode) { + pBtmBuff.emplace(GetMainPanel().size.width, (GetMainPanel().size.height + 16) * (IsChatAvailable() ? 2 : 1)); + pManaBuff.emplace(88, 88); + pLifeBuff.emplace(88, 88); + + LoadCharPanel(); + LoadSpellIcons(); + { + const OwnedCelSprite sprite = LoadCel("CtrlPan\\Panel8.CEL", GetMainPanel().size.width); + CelDrawUnsafeTo(*pBtmBuff, { 0, (GetMainPanel().size.height + 16) - 1 }, CelSprite { sprite }, 0); + } + { + const Point bulbsPosition { 0, 87 }; + const OwnedCelSprite statusPanel = LoadCel("CtrlPan\\P8Bulbs.CEL", 88); + CelDrawUnsafeTo(*pLifeBuff, bulbsPosition, CelSprite { statusPanel }, 0); + CelDrawUnsafeTo(*pManaBuff, bulbsPosition, CelSprite { statusPanel }, 1); + } } talkflag = false; if (IsChatAvailable()) { - { - const OwnedCelSprite sprite = LoadCel("CtrlPan\\TalkPanl.CEL", GetMainPanel().size.width); - CelDrawUnsafeTo(*pBtmBuff, { 0, (GetMainPanel().size.height + 16) * 2 - 1 }, CelSprite { sprite }, 0); + if (!HeadlessMode) { + { + const OwnedCelSprite sprite = LoadCel("CtrlPan\\TalkPanl.CEL", GetMainPanel().size.width); + CelDrawUnsafeTo(*pBtmBuff, { 0, (GetMainPanel().size.height + 16) * 2 - 1 }, CelSprite { sprite }, 0); + } + multiButtons = LoadCel("CtrlPan\\P8But2.CEL", 33); + talkButtons = LoadCel("CtrlPan\\TalkButt.CEL", 61); } - multiButtons = LoadCel("CtrlPan\\P8But2.CEL", 33); - talkButtons = LoadCel("CtrlPan\\TalkButt.CEL", 61); sgbPlrTalkTbl = 0; TalkMessage[0] = '\0'; for (bool &whisper : WhisperList) @@ -575,20 +579,23 @@ void InitControlPan() for (bool &talkButtonDown : TalkButtonsDown) talkButtonDown = false; } - LoadMainPanel(); panelflag = false; lvlbtndown = false; - pPanelButtons = LoadCel("CtrlPan\\Panel8bu.CEL", 71); + if (!HeadlessMode) { + LoadMainPanel(); + pPanelButtons = LoadCel("CtrlPan\\Panel8bu.CEL", 71); + pChrButtons = LoadCel("Data\\CharBut.CEL", 41); + } ClearPanBtn(); if (!IsChatAvailable()) PanelButtonIndex = 6; else PanelButtonIndex = 8; - pChrButtons = LoadCel("Data\\CharBut.CEL", 41); + if (!HeadlessMode) + pDurIcons = LoadCel("Items\\DurIcons.CEL", 32); for (bool &buttonEnabled : chrbtn) buttonEnabled = false; chrbtnactive = false; - pDurIcons = LoadCel("Items\\DurIcons.CEL", 32); InfoString = {}; ClearPanel(); drawhpflag = true; @@ -598,9 +605,11 @@ void InitControlPan() sbooktab = 0; sbookflag = false; - InitSpellBook(); - pQLogCel = LoadCel("Data\\Quest.CEL", static_cast(SidePanelSize.width)); - pGBoxBuff = LoadCel("CtrlPan\\Golddrop.cel", 261); + if (!HeadlessMode) { + InitSpellBook(); + pQLogCel = LoadCel("Data\\Quest.CEL", static_cast(SidePanelSize.width)); + pGBoxBuff = LoadCel("CtrlPan\\Golddrop.cel", 261); + } CloseGoldDrop(); dropGoldValue = 0; initialDropGoldValue = 0; @@ -608,7 +617,8 @@ void InitControlPan() CalculatePanelAreas(); - InitModifierHints(); + if (!HeadlessMode) + InitModifierHints(); } void DrawCtrlPan(const Surface &out) diff --git a/Source/diablo.cpp b/Source/diablo.cpp index c81c3ddd9..41999e9d1 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -693,20 +693,16 @@ void GameEventHandler(uint32_t uMsg, int32_t wParam, int32_t lParam) if (gbIsMultiplayer) pfile_write_hero(); nthread_ignore_mutex(true); - if (!HeadlessMode) { - PaletteFadeOut(8); - sound_stop(); - } + PaletteFadeOut(8); + sound_stop(); LastMouseButtonAction = MouseActionType::None; sgbMouseDown = CLICK_NONE; ShowProgress((interface_mode)uMsg); force_redraw = 255; - if (!HeadlessMode) { - DrawAndBlit(); - LoadPWaterPalette(); - if (gbRunGame) - PaletteFadeIn(8); - } + DrawAndBlit(); + LoadPWaterPalette(); + if (gbRunGame) + PaletteFadeIn(8); nthread_ignore_mutex(false); gbGameLoopStartup = true; return; @@ -729,13 +725,11 @@ void RunGameLoop(interface_mode uMsg) gbRunGame = true; gbProcessPlayers = true; gbRunGameResult = true; - if (!HeadlessMode) { - force_redraw = 255; - DrawAndBlit(); - LoadPWaterPalette(); - PaletteFadeIn(8); - force_redraw = 255; - } + force_redraw = 255; + DrawAndBlit(); + LoadPWaterPalette(); + PaletteFadeIn(8); + force_redraw = 255; gbGameLoopStartup = true; nthread_ignore_mutex(false); @@ -804,13 +798,11 @@ void RunGameLoop(interface_mode uMsg) sfile_write_stash(); } - if (!HeadlessMode) { - PaletteFadeOut(8); - NewCursor(CURSOR_NONE); - ClearScreenBuffer(); - force_redraw = 255; - scrollrt_draw_game_screen(); - } + PaletteFadeOut(8); + NewCursor(CURSOR_NONE); + ClearScreenBuffer(); + force_redraw = 255; + scrollrt_draw_game_screen(); previousHandler = SetEventHandler(previousHandler); assert(HeadlessMode || previousHandler == GameEventHandler); FreeGame(); @@ -2101,13 +2093,18 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir) IncProgress(); if (firstflag) { - InitInv(); - InitStash(); - InitQuestText(); - InitInfoBoxGfx(); + CloseInventory(); + drawsbarflag = false; + qtextflag = false; + if (!HeadlessMode) { + InitInv(); + InitStash(); + InitQuestText(); + InitInfoBoxGfx(); + InitHelp(); + } InitStores(); InitAutomapOnce(); - InitHelp(); } SetRndSeed(glSeedTbl[currlevel]); @@ -2143,8 +2140,9 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir) if (leveltype != DTYPE_TOWN) { GetLevelMTypes(); InitThemes(); - LoadAllGFX(); - } else { + if (!HeadlessMode) + LoadAllGFX(); + } else if (!HeadlessMode) { IncProgress(); #if !defined(USE_SDL1) && !defined(__vita__) InitVirtualGamepadGFX(renderer); @@ -2249,11 +2247,13 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir) InitGolems(); InitMonsters(); IncProgress(); + if (!HeadlessMode) { #if !defined(USE_SDL1) && !defined(__vita__) - InitVirtualGamepadGFX(renderer); + InitVirtualGamepadGFX(renderer); #endif - InitMissileGFX(gbIsHellfire); - IncProgress(); + InitMissileGFX(gbIsHellfire); + IncProgress(); + } InitCorpses(); IncProgress(); LoadLevelSOLData(); diff --git a/Source/engine/demomode.cpp b/Source/engine/demomode.cpp index c79a70d4b..7a8bdd899 100644 --- a/Source/engine/demomode.cpp +++ b/Source/engine/demomode.cpp @@ -296,7 +296,7 @@ void NotifyGameLoopEnd() CreateDemoReference = false; } - if (IsRunning()) { + if (IsRunning() && !HeadlessMode) { float seconds = (SDL_GetTicks() - StartTime) / 1000.0f; SDL_Log("%d frames, %.2f seconds: %.1f fps", LogicTick, seconds, LogicTick / seconds); gbRunGameResult = false; diff --git a/Source/engine/dx.cpp b/Source/engine/dx.cpp index 80f575612..13abf1337 100644 --- a/Source/engine/dx.cpp +++ b/Source/engine/dx.cpp @@ -157,6 +157,9 @@ void BltFast(SDL_Rect *srcRect, SDL_Rect *dstRect) void Blit(SDL_Surface *src, SDL_Rect *srcRect, SDL_Rect *dstRect) { + if (HeadlessMode) + return; + SDL_Surface *dst = GetOutputSurface(); #ifndef USE_SDL1 if (SDL_BlitSurface(src, srcRect, dst, dstRect) < 0) @@ -207,6 +210,9 @@ void Blit(SDL_Surface *src, SDL_Rect *srcRect, SDL_Rect *dstRect) void RenderPresent() { + if (HeadlessMode) + return; + SDL_Surface *surface = GetOutputSurface(); if (!gbActive) { diff --git a/Source/engine/palette.cpp b/Source/engine/palette.cpp index 616227937..dd9430ac4 100644 --- a/Source/engine/palette.cpp +++ b/Source/engine/palette.cpp @@ -176,6 +176,9 @@ void CycleColorsReverse(int from, int to) void palette_update(int first, int ncolor) { + if (HeadlessMode) + return; + assert(Palette); if (SDLC_SetSurfaceAndPaletteColors(PalSurface, Palette.get(), system_palette, first, ncolor) < 0) { ErrSdl(); @@ -206,6 +209,9 @@ void LoadPalette(const char *pszFileName, bool blend /*= true*/) { assert(pszFileName); + if (HeadlessMode) + return; + struct Color { uint8_t r; uint8_t g; @@ -238,6 +244,9 @@ void LoadPalette(const char *pszFileName, bool blend /*= true*/) void LoadRndLvlPal(dungeon_type l) { + if (HeadlessMode) + return; + if (l == DTYPE_TOWN) { LoadPalette("Levels\\TownData\\Town.pal"); return; @@ -293,6 +302,9 @@ int UpdateGamma(int gamma) void SetFadeLevel(int fadeval) { + if (HeadlessMode) + return; + for (int i = 0; i < 256; i++) { system_palette[i].r = (fadeval * logical_palette[i].r) / 256; system_palette[i].g = (fadeval * logical_palette[i].g) / 256; @@ -311,6 +323,9 @@ void BlackPalette() void PaletteFadeIn(int fr) { + if (HeadlessMode) + return; + ApplyGamma(logical_palette, orig_palette, 256); const uint32_t tc = SDL_GetTicks(); @@ -334,7 +349,7 @@ void PaletteFadeIn(int fr) void PaletteFadeOut(int fr) { - if (!sgbFadedIn) + if (!sgbFadedIn || HeadlessMode) return; const uint32_t tc = SDL_GetTicks(); diff --git a/Source/engine/render/scrollrt.cpp b/Source/engine/render/scrollrt.cpp index a664334a9..6db50af9d 100644 --- a/Source/engine/render/scrollrt.cpp +++ b/Source/engine/render/scrollrt.cpp @@ -1560,6 +1560,9 @@ extern SDL_Surface *PalSurface; void ClearScreenBuffer() { + if (HeadlessMode) + return; + assert(PalSurface != nullptr); SDL_FillRect(PalSurface, nullptr, 0); } @@ -1652,6 +1655,9 @@ void EnableFrameCount() void scrollrt_draw_game_screen() { + if (HeadlessMode) + return; + int hgt = 0; if (force_redraw == 255) { @@ -1676,7 +1682,7 @@ void scrollrt_draw_game_screen() void DrawAndBlit() { - if (!gbRunGame) { + if (!gbRunGame || HeadlessMode) { return; } diff --git a/Source/gmenu.cpp b/Source/gmenu.cpp index abf4c8e6d..a46214eae 100644 --- a/Source/gmenu.cpp +++ b/Source/gmenu.cpp @@ -190,6 +190,10 @@ void gmenu_init_menu() gmenu_current_option = nullptr; sgCurrentMenuIdx = 0; mouseNavigation = false; + + if (HeadlessMode) + return; + if (gbIsHellfire) sgpLogo = LoadCel("Data\\hf_logo3.CEL", 430); else diff --git a/Source/inv.cpp b/Source/inv.cpp index 38f135595..a3769ed1a 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -1077,9 +1077,6 @@ void InitInv() pInvCels = LoadCel(!gbIsSpawn ? "Data\\Inv\\Inv_Sor.CEL" : "Data\\Inv\\Inv.CEL", static_cast(SidePanelSize.width)); break; } - - CloseInventory(); - drawsbarflag = false; } void DrawInv(const Surface &out) diff --git a/Source/items.cpp b/Source/items.cpp index f62d6038d..57892c6cf 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -3771,6 +3771,9 @@ void DrawUniqueInfo(const Surface &out) void PrintItemDetails(const Item &item) { + if (HeadlessMode) + return; + if (item._iClass == ICLASS_WEAPON) { if (item._iMinDam == item._iMaxDam) { if (item._iMaxDur == DUR_INDESTRUCTIBLE) @@ -3809,6 +3812,9 @@ void PrintItemDetails(const Item &item) void PrintItemDur(const Item &item) { + if (HeadlessMode) + return; + if (item._iClass == ICLASS_WEAPON) { if (item._iMinDam == item._iMaxDam) { if (item._iMaxDur == DUR_INDESTRUCTIBLE) diff --git a/Source/minitext.cpp b/Source/minitext.cpp index edb539645..04e32943c 100644 --- a/Source/minitext.cpp +++ b/Source/minitext.cpp @@ -127,7 +127,6 @@ void FreeQuestText() void InitQuestText() { pTextBoxCels = LoadCel("Data\\TextBox.CEL", 591); - qtextflag = false; } void InitQTextMsg(_speech_id m) diff --git a/Source/misdat.cpp b/Source/misdat.cpp index 12d4e13ae..0a5dc0046 100644 --- a/Source/misdat.cpp +++ b/Source/misdat.cpp @@ -248,6 +248,9 @@ void MissileFileData::LoadGFX() void InitMissileGFX(bool loadHellfireGraphics) { + if (HeadlessMode) + return; + for (size_t mi = 0; MissileSpriteData[mi].animFAmt != 0; mi++) { if (!loadHellfireGraphics && mi > MFILE_SCBSEXPD) break; diff --git a/Source/monster.cpp b/Source/monster.cpp index 60e415525..63ba56a4f 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -3612,11 +3612,13 @@ void InitMonsterGFX(size_t monsterTypeIndex) }; std::array animOffsets; - monster.animData = MultiFileLoader {}( - numAnims, - FileNameWithCharAffixGenerator({ "Monsters\\", monsterData.GraphicType }, ".CL2", Animletter), - animOffsets.data(), - hasAnim); + if (HeadlessMode) { + monster.animData = MultiFileLoader {}( + numAnims, + FileNameWithCharAffixGenerator({ "Monsters\\", monsterData.GraphicType }, ".CL2", Animletter), + animOffsets.data(), + hasAnim); + } for (unsigned animIndex = 0; animIndex < numAnims; animIndex++) { AnimStruct &anim = monster.anims[animIndex]; @@ -3630,6 +3632,9 @@ void InitMonsterGFX(size_t monsterTypeIndex) anim.rate = monsterData.Rate[animIndex]; anim.width = width; + if (HeadlessMode) + continue; + byte *cl2Data = &monster.animData[animOffsets[animIndex]]; if (IsDirectionalAnim(monster, animIndex)) { CelGetDirectionFrames(cl2Data, anim.celSpritesForDirections.data()); @@ -3642,6 +3647,9 @@ void InitMonsterGFX(size_t monsterTypeIndex) monster.data = &monsterData; + if (HeadlessMode) + return; + if (monsterData.TransFile != nullptr) { InitMonsterTRN(monster); } diff --git a/Source/objects.cpp b/Source/objects.cpp index b31924be4..6a248db86 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -766,15 +766,17 @@ void SetupObject(Object &object, Point position, _object_id ot) object_graphic_id ofi = objectData.ofindex; object.position = position; - const auto &found = std::find(std::begin(ObjFileList), std::end(ObjFileList), ofi); - if (found == std::end(ObjFileList)) { - LogCritical("Unable to find object_graphic_id {} in list of objects to load, level generation error.", ofi); - return; - } + if (!HeadlessMode) { + const auto &found = std::find(std::begin(ObjFileList), std::end(ObjFileList), ofi); + if (found == std::end(ObjFileList)) { + LogCritical("Unable to find object_graphic_id {} in list of objects to load, level generation error.", ofi); + return; + } - const int j = std::distance(std::begin(ObjFileList), found); + const int j = std::distance(std::begin(ObjFileList), found); - object._oAnimData = pObjCels[j].get(); + object._oAnimData = pObjCels[j].get(); + } object._oAnimFlag = objectData.oAnimFlag; if (object._oAnimFlag) { object._oAnimDelay = objectData.oAnimDelay; @@ -4077,6 +4079,9 @@ bool IsItemBlockingObjectAtPosition(Point position) void LoadLevelObjects(bool filesLoaded[65]) { + if (HeadlessMode) + return; + for (const ObjectData objectData : AllObjects) { if (leveltype == objectData.olvltype) { filesLoaded[objectData.ofindex] = true; @@ -5171,15 +5176,18 @@ void SyncObjectAnim(Object &object) { object_graphic_id index = AllObjects[object._otype].ofindex; - const auto &found = std::find(std::begin(ObjFileList), std::end(ObjFileList), index); - if (found == std::end(ObjFileList)) { - LogCritical("Unable to find object_graphic_id {} in list of objects to load, level generation error.", index); - return; - } + if (!HeadlessMode) { + const auto &found = std::find(std::begin(ObjFileList), std::end(ObjFileList), index); + if (found == std::end(ObjFileList)) { + LogCritical("Unable to find object_graphic_id {} in list of objects to load, level generation error.", index); + return; + } + + const int i = std::distance(std::begin(ObjFileList), found); - const int i = std::distance(std::begin(ObjFileList), found); + object._oAnimData = pObjCels[i].get(); + } - object._oAnimData = pObjCels[i].get(); switch (object._otype) { case OBJ_L1LDOOR: case OBJ_L1RDOOR: diff --git a/Source/player.cpp b/Source/player.cpp index 79fb6d84b..cbedaac52 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -375,7 +375,7 @@ void SetPlayerGPtrs(const char *path, std::unique_ptr &data, std::array< { data = nullptr; data = LoadFileInMem(path); - if (data == nullptr && HeadlessMode) + if (data == nullptr) return; const byte *directionFrames[8]; @@ -2182,6 +2182,9 @@ Player *PlayerAtPosition(Point position) void LoadPlrGFX(Player &player, player_graphic graphic) { + if (HeadlessMode) + return; + auto &animationData = player.AnimationData[static_cast(graphic)]; if (animationData.RawData != nullptr) return; @@ -2298,6 +2301,9 @@ void LoadPlrGFX(Player &player, player_graphic graphic) void InitPlayerGFX(Player &player) { + if (HeadlessMode) + return; + ResetPlayerGFX(player); if (player._pHitPoints >> 6 == 0) {