diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 5f6437d2108..e50b62433bd 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -788,11 +788,8 @@ void GameEventHandler(const SDL_Event &event, uint16_t modState) #endif default: if (IsCustomEvent(event.type)) { - if (gbIsMultiplayer) { - Log("IsCustomEvent({}) = true", event.type); - Log("pfile_write_hero"); + if (gbIsMultiplayer) pfile_write_hero(); - } nthread_ignore_mutex(true); PaletteFadeOut(8); sound_stop(); @@ -912,7 +909,6 @@ void RunGameLoop(interface_mode uMsg) demo::NotifyGameLoopEnd(); if (gbIsMultiplayer) { - Log("gbRunGame = {}, pfile_write_hero(/*writeGameData=*/false)", gbRunGame); pfile_write_hero(/*writeGameData=*/false); sfile_write_stash(); } @@ -2849,7 +2845,6 @@ void DisableInputEventHandler(const SDL_Event &event, uint16_t modState) void LoadGameLevel(bool firstflag, lvl_entry lvldir) { - Log("LoadGameLevel(firstflag = {}, lvldir = {})", firstflag, static_cast(lvldir)); _music_id neededTrack = GetLevelMusic(leveltype); ClearFloatingNumbers(); diff --git a/Source/interfac.cpp b/Source/interfac.cpp index 51ed9b1f7b7..601473e5d2b 100644 --- a/Source/interfac.cpp +++ b/Source/interfac.cpp @@ -73,7 +73,6 @@ Cutscenes GetCutSceneFromLevelType(dungeon_type type) Cutscenes PickCutscene(interface_mode uMsg) { - Log("MyPlayer->plrlevel = {}", MyPlayer->plrlevel); switch (uMsg) { case WM_DIABLOADGAME: case WM_DIABNEWGAME: @@ -352,7 +351,6 @@ void ShowProgress(interface_mode uMsg) case WM_DIABNEXTLVL: IncProgress(); if (!gbIsMultiplayer) { - Log("pfile_save_level()"); pfile_save_level(); } else { DeltaSaveLevel(); @@ -363,14 +361,12 @@ void ShowProgress(interface_mode uMsg) currlevel = myPlayer.plrlevel; leveltype = GetLevelType(currlevel); IncProgress(); - Log("LoadGameLevel(false, ENTRY_MAIN)"); LoadGameLevel(false, ENTRY_MAIN); IncProgress(); break; case WM_DIABPREVLVL: IncProgress(); if (!gbIsMultiplayer) { - Log("pfile_save_level()"); pfile_save_level(); } else { DeltaSaveLevel(); @@ -381,7 +377,6 @@ void ShowProgress(interface_mode uMsg) leveltype = GetLevelType(currlevel); assert(myPlayer.isOnActiveLevel()); IncProgress(); - Log("LoadGameLevel(false, ENTRY_PREV)"); LoadGameLevel(false, ENTRY_PREV); IncProgress(); break; diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 772f555cfa1..71a811f89c8 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -179,8 +179,6 @@ class SaveHelper { , m_buffer_(new std::byte[codec_get_encoded_len(bufferLen)]) , m_capacity_(bufferLen) { - Log("SaveHelper instantiated: this(mpqWriter, \"{}\", {})", szFileName, bufferLen); - Log("SaveHelper allocated byte array of {} bytes", codec_get_encoded_len(bufferLen)); } bool IsValid(size_t len = 1) @@ -226,12 +224,9 @@ class SaveHelper { ~SaveHelper() { - // const auto encodedLen = m_cur_; const auto encodedLen = codec_get_encoded_len(m_cur_); const char *const password = pfile_get_password(); - Log("codec_encode(m_buffer_.get(), {}, {}, \"{}\")", m_cur_, encodedLen, password); codec_encode(m_buffer_.get(), m_cur_, encodedLen, password); - Log("~SaveHelper WriteFile(\"{}\", m_buffer_.get(), {})", m_szFileName_, encodedLen); m_mpqWriter.WriteFile(m_szFileName_, m_buffer_.get(), encodedLen); } }; @@ -1839,7 +1834,6 @@ void LoadLevelSeeds() void SaveLevel(SaveWriter &saveWriter, LevelConversionData *levelConversionData) { - Log("SaveLevel(SaveWriter &saveWriter, LevelConversionData *levelConversionData)"); Player &myPlayer = *MyPlayer; DoUnVision(myPlayer.position.tile, myPlayer._pLightRad); // fix for vision staying on the level @@ -1849,7 +1843,6 @@ void SaveLevel(SaveWriter &saveWriter, LevelConversionData *levelConversionData) char szName[MaxMpqPathSize]; GetTempLevelNames(szName); - Log("SaveHelper file(saveWriter, \"{}\", 256 * 1024)", szName); SaveHelper file(saveWriter, szName, 256 * 1024); if (leveltype != DTYPE_TOWN) { @@ -1920,18 +1913,11 @@ void SaveLevel(SaveWriter &saveWriter, LevelConversionData *levelConversionData) void LoadLevel(LevelConversionData *levelConversionData) { - Log("LoadLevel"); char szName[MaxMpqPathSize]; std::optional archive = OpenSaveArchive(gSaveNumber); - Log("OpenSaveArchive({})", gSaveNumber); GetTempLevelNames(szName); - Log("szName = '{}'", szName); - Log("!archive = {}", !archive); - Log("!archive->HasFile(\"{}\") = {}", szName, !archive->HasFile(szName)); - if (!archive || !archive->HasFile(szName)) { - Log("{} not found in archive, calling GetPermLevelNames(\"{}\")", szName, szName); + if (!archive || !archive->HasFile(szName)) GetPermLevelNames(szName); - } LoadHelper file(std::move(archive), szName); if (!file.IsValid()) app_fatal(_("Unable to open save file archive")); @@ -2237,8 +2223,12 @@ size_t HotkeysSize(size_t nHotkeys = NumHotkeys) void LoadHotkeys() { +#ifdef __DREAMCAST____ // hotkeys => htks to get around VMU filename size limits LoadHelper file(OpenSaveArchive(gSaveNumber), "htks"); +#else + LoadHelper file(OpenSaveArchive(gSaveNumber), "hotkeys"); +#endif if (!file.IsValid()) return; @@ -2280,8 +2270,12 @@ void LoadHotkeys() void SaveHotkeys(SaveWriter &saveWriter, const Player &player) { +#ifdef __DREAMCAST____ // hotkeys => htks to get around VMU filename size limits SaveHelper file(saveWriter, "htks", HotkeysSize()); +#else + SaveHelper file(saveWriter, "hotkeys", HotkeysSize()); +#endif // Write the number of spell hotkeys file.WriteLE(static_cast(NumHotkeys)); @@ -2301,8 +2295,12 @@ void SaveHotkeys(SaveWriter &saveWriter, const Player &player) void LoadHeroItems(Player &player) { +#ifdef __DREAMCAST____ // heroitems => hitms to get around VMU filename size limits LoadHelper file(OpenSaveArchive(gSaveNumber), "hitms"); +#else + LoadHelper file(OpenSaveArchive(gSaveNumber), "heroitems"); +#endif if (!file.IsValid()) return; @@ -2368,7 +2366,6 @@ void RemoveEmptyInventory(Player &player) void LoadGame(bool firstflag) { - Log("LoadGame(firstflag = {})", firstflag); FreeGameMem(); LoadHelper file(OpenSaveArchive(gSaveNumber), "game"); @@ -2389,7 +2386,6 @@ void LoadGame(bool firstflag) giNumberOfSmithPremiumItems = 6; } - Log("pfile_remove_temp_files"); pfile_remove_temp_files(); setlevel = file.NextBool8(); @@ -2419,16 +2415,13 @@ void LoadGame(bool firstflag) Player &myPlayer = *MyPlayer; - Log("LoadPlayer(file, myPlayer);"); LoadPlayer(file, myPlayer); if (sgGameInitInfo.nDifficulty < DIFF_NORMAL || sgGameInitInfo.nDifficulty > DIFF_HELL) sgGameInitInfo.nDifficulty = DIFF_NORMAL; - Log("LoadQuests {}", giNumberQuests); for (int i = 0; i < giNumberQuests; i++) LoadQuest(&file, i); - Log("LoadPortals", MAXPORTAL); for (int i = 0; i < MAXPORTAL; i++) LoadPortal(&file, i); @@ -2437,7 +2430,6 @@ void LoadGame(bool firstflag) RemoveEmptyInventory(myPlayer); } - Log("LoadGameLevel"); LoadGameLevel(firstflag, ENTRY_LOAD); SetPlrAnims(myPlayer); SyncPlrAnim(myPlayer); @@ -2454,7 +2446,6 @@ void LoadGame(bool firstflag) if (leveltype != DTYPE_TOWN) { for (unsigned &monsterId : ActiveMonsters) monsterId = file.NextBE(); - Log("LoadMonsters {}", ActiveMonsterCount); for (size_t i = 0; i < ActiveMonsterCount; i++) LoadMonster(&file, Monsters[ActiveMonsters[i]]); for (size_t i = 0; i < ActiveMonsterCount; i++) @@ -2463,7 +2454,6 @@ void LoadGame(bool firstflag) file.Skip(MaxMissilesForSaveGame); // Skip AvailableMissiles file.Skip(MaxMissilesForSaveGame); - Log("LoadMissiles {}", tmpNummissiles); for (int i = 0; i < tmpNummissiles; i++) LoadMissile(&file); // For petrified monsters, the data in missile.var1 must be used to @@ -2587,12 +2577,15 @@ void LoadGame(bool firstflag) gbIsHellfireSaveGame = gbIsHellfire; } -// todo restore saving of inventory body void SaveHeroItems(SaveWriter &saveWriter, Player &player) { size_t itemCount = static_cast(NUM_INVLOC) + InventoryGridCells + MaxBeltItems; // 7 + 40 + 8 = 55 +#ifdef __DREAMCAST____ // heroitems => hitms to get around VMU filename size limits SaveHelper file(saveWriter, "hitms", itemCount * (gbIsHellfire ? HellfireItemSaveSize : DiabloItemSaveSize) + sizeof(uint8_t)); // 55 * 368 + 1 = 20241 bytes +#else + SaveHelper file(saveWriter, "heroitems", itemCount * (gbIsHellfire ? HellfireItemSaveSize : DiabloItemSaveSize) + sizeof(uint8_t)); +#endif file.WriteLE(gbIsHellfire ? 1 : 0); @@ -2641,7 +2634,6 @@ void SaveStash(SaveWriter &stashWriter) } }; - Log("Saving {} pages of stash", pagesToSave.size()); // Current stash size is 100 pages. Will definitely fit in a 32 bit value. file.WriteLE(static_cast(pagesToSave.size())); for (const auto &page : pagesToSave) { @@ -2649,7 +2641,6 @@ void SaveStash(SaveWriter &stashWriter) for (const auto &row : Stash.stashGrids[page]) { for (uint16_t cell : row) { file.WriteLE(cell); - Log("\t\tSaving stash item {}", cell); } } } @@ -2657,7 +2648,6 @@ void SaveStash(SaveWriter &stashWriter) // 100 pages of 100 items is still only 10 000, as with the page count will definitely fit in 32 bits even in the worst case. file.WriteLE(static_cast(Stash.stashList.size())); for (const Item &item : Stash.stashList) { - Log("SaveItem(file, item)"); SaveItem(file, item); } @@ -2666,7 +2656,6 @@ void SaveStash(SaveWriter &stashWriter) void SaveGameData(SaveWriter &saveWriter) { - Log("SaveHelper file(saveWriter, \"game\", 320 * 1024)"); SaveHelper file(saveWriter, "game", 320 * 1024); if (gbIsSpawn && !gbIsHellfire) @@ -2832,7 +2821,6 @@ void SaveGameData(SaveWriter &saveWriter) void SaveGame() { - Log("SaveGame()"); gbValidSaveFile = true; pfile_write_hero(/*writeGameData=*/true); sfile_write_stash(); diff --git a/Source/pfile.cpp b/Source/pfile.cpp index 775d0e571cd..0cd66dcadbf 100644 --- a/Source/pfile.cpp +++ b/Source/pfile.cpp @@ -54,6 +54,7 @@ namespace devilution { bool gbValidSaveFile; +#ifdef __DREAMCAST__ void listdir(const char *dir, int depth) { file_t d = fs_open(dir, O_RDONLY | O_DIR); @@ -74,6 +75,7 @@ void listdir(const char *dir, int depth) fs_close(d); printf("============ %s ============\n\n\n", dir); } +#endif namespace { /** List of character names for the character selection screen. */ @@ -84,13 +86,18 @@ std::string GetSavePath(uint32_t saveNum, std::string_view savePrefix = {}) // shorter names to get around VMU filename size limits return StrCat(paths::PrefPath(), savePrefix, gbIsSpawn +#ifdef __DREAMCAST__ ? (gbIsMultiplayer ? "M" : "S") : (gbIsMultiplayer ? "m" : "s"), +#else + ? (gbIsMultiplayer ? "share_" : "spawn_") + : (gbIsMultiplayer ? "multi_" : "single_"), +#endif saveNum, #ifdef UNPACKED_SAVES #ifdef __DREAMCAST__ - // flatten directory structure for easier fs_ramdisk_* usage - // for example, /ram/spawn_sv/hero would become /ram/spawn_sv_hero + // flatten directory structure for VMU filesystem compatibility + // for example, /vmu/spawn_sv/hero would become /vmu/spawn_sv_hero gbIsHellfire ? "_hsv" DIRECTORY_SEPARATOR_STR : "_sv_" #else @@ -156,14 +163,9 @@ void RenameTempToPerm(SaveWriter &saveWriter) [[maybe_unused]] bool result = GetPermSaveNames(dwIndex, szPerm); // DO NOT PUT DIRECTLY INTO ASSERT! assert(result); dwIndex++; - Log("GetPermSaveNames({}, \"{}\")", dwIndex, szTemp); if (saveWriter.HasFile(szTemp)) { - Log("saveWriter.HasFile(\"{}\") = true", szTemp); - if (saveWriter.HasFile(szPerm)) { - Log("saveWriter.HasFile(\"{}\") = true => RemoveHashEntry", szPerm); + if (saveWriter.HasFile(szPerm)) saveWriter.RemoveHashEntry(szPerm); - } - Log("saveWriter.RenameFile(\"{}\", {})", szTemp, szPerm); saveWriter.RenameFile(szTemp, szPerm); } } @@ -176,7 +178,6 @@ bool ReadHero(SaveReader &archive, PlayerPack *pPack) auto buf = ReadArchive(archive, "hero", &read); if (buf == nullptr) { - Log("ReadArchive(archive, \"hero\", {}) = false", read); return false; } @@ -185,12 +186,14 @@ bool ReadHero(SaveReader &archive, PlayerPack *pPack) memcpy(pPack, buf.get(), sizeof(*pPack)); ret = true; } + +#ifdef __DREAMCAST__ Log("{} == sizeof(*pPack) ({}) = {}", read, sizeof(*pPack), read == sizeof(*pPack)); Log("Read player {}", pPack->pName); // Log("\tpHPBase = {}", pPack->pHPBase); - listdir("/ram", 0); listdir("/vmu/a1", 0); +#endif return ret; } @@ -200,13 +203,9 @@ void EncodeHero(SaveWriter &saveWriter, const PlayerPack *pack) size_t packedLen = codec_get_encoded_len(sizeof(*pack)); std::unique_ptr packed { new std::byte[packedLen] }; - Log("memcpy(packed.get(), pack, {})", sizeof(*pack)); memcpy(packed.get(), pack, sizeof(*pack)); codec_encode(packed.get(), sizeof(*pack), packedLen, pfile_get_password()); - Log("Saving player {}", pack->pName); - // Log("\tpHPBase = {}", pack->pHPBase); - bool result = saveWriter.WriteFile("hero", packed.get(), packedLen /* sizeof(*pack) */); - Log("saveWriter.WriteFile(\"hero\", packed.get(), {}) = {}", packedLen, result); + saveWriter.WriteFile("hero", packed.get(), packedLen); } SaveWriter GetSaveWriter(uint32_t saveNum) @@ -292,8 +291,8 @@ std::optional CreateSaveReader(std::string &&path) #ifdef UNPACKED_SAVES #ifdef __DREAMCAST__ Log("\tAttempting to load save file {}", path); - // no notion of directories in ramdisk, so /ram/spawn_0_sv/ doesn't exist - // instead, we check for /ram/spawn_0_sv_hero which was previously created + // no notion of directories in vmu, so /vmu/spawn_0_sv/ doesn't exist + // instead, we check for /vmu/spawn_0_sv_hero which was previously created std::string heroFile = path + "hero"; if (!FileExists(heroFile)) { Log("\tFailed ):"); @@ -811,12 +810,9 @@ std::unique_ptr ReadArchive(SaveReader &archive, const char *pszNam int32_t error; std::size_t length; - Log("ReadArchive(archive, \"{}\", {})", pszName, *pdwLen); - Log("ReadArchive 0"); std::unique_ptr result = archive.ReadFile(pszName, length, error); if (error != 0) { Log("ReadArchive 0 error = {}", error); - app_fatal("ReadArchive 0 = " + error); return nullptr; } @@ -824,15 +820,8 @@ std::unique_ptr ReadArchive(SaveReader &archive, const char *pszNam std::size_t decodedLength = codec_decode(result.get(), length, pfile_get_password()); if (decodedLength == 0) { Log("ReadArchive nullptr"); - app_fatal("decodedLength = 0"); return nullptr; } - if (strcmp(pszName, "hero") == 0) { - PlayerPack pPack; - memcpy(&pPack, result.get(), decodedLength); - Log("ReadArchive player {}", pPack.pName); - // Log("\tpHPBase = {}", pPack.pHPBase); - } Log("ReadArchive 2"); if (pdwLen != nullptr) @@ -867,7 +856,6 @@ void pfile_write_hero_demo(int demo) HeroCompareResult pfile_compare_hero_demo(int demo, bool logDetails) { - Log("pfile_compare_hero_demo({}, {})", demo, logDetails); std::string referenceSavePath = GetSavePath(gSaveNumber, StrCat("demo_", demo, "_reference_")); if (!FileExists(referenceSavePath.c_str())) @@ -906,13 +894,9 @@ bool pfile_ui_set_hero_infos(bool (*uiAddHeroInfo)(_uiheroinfo *)) if (archive) { PlayerPack pkplr; if (ReadHero(*archive, &pkplr)) { - Log("ReadHero OK"); - Log("Player {}", pkplr.pName); - // Log("Player {}, HP = {}", pkplr.pName, pkplr.pHPBase); _uiheroinfo uihero; uihero.saveNumber = i; strcpy(hero_names[i], pkplr.pName); - Log("hero_names[{}] = {}", i, pkplr.pName); bool hasSaveGame = ArchiveContainsGame(*archive); if (hasSaveGame) pkplr.bIsHellfire = gbIsHellfireSaveGame ? 1 : 0; @@ -926,9 +910,6 @@ bool pfile_ui_set_hero_infos(bool (*uiAddHeroInfo)(_uiheroinfo *)) Game2UiPlayer(player, &uihero, hasSaveGame); uiAddHeroInfo(&uihero); - } else { - Log("ReadHero(*archive, &pkplr) failed"); - app_fatal("ReadHero(*archive, &pkplr) failed"); } } } @@ -1003,13 +984,17 @@ void pfile_read_player_from_save(uint32_t saveNum, Player &player) { std::optional archive = OpenSaveArchive(saveNum); if (!archive) { +#ifdef __DREAMCAST__ listdir("/ram", 0); listdir("/vmu/a1", 0); +#endif app_fatal(_("Unable to open archive")); } if (!ReadHero(*archive, &pkplr)) { +#ifdef __DREAMCAST__ listdir("/ram", 0); listdir("/vmu/a1", 0); +#endif app_fatal(_("Unable to load character")); } @@ -1055,10 +1040,15 @@ void pfile_update(bool forceSave) return; Uint32 tick = SDL_GetTicks(); +#ifdef __DREAMCAST__ // 600000 instead of 60000 // 60000 ms is too frequent for the VMU, the game hangs too often and too long if (!forceSave && tick - prevTick <= 600000) return; +#else + if (!forceSave && tick - prevTick <= 60000) + return; +#endif Log("pfile_update({})", forceSave); prevTick = tick; diff --git a/Source/pfile.h b/Source/pfile.h index 27c794dfc9e..da520a00d2b 100644 --- a/Source/pfile.h +++ b/Source/pfile.h @@ -19,7 +19,11 @@ namespace devilution { +#ifdef __DREAMCAST____ #define MAX_CHARACTERS 1 // todo restore me to 99 +#else +#define MAX_CHARACTERS 99 +#endif extern bool gbValidSaveFile; @@ -28,7 +32,6 @@ struct SaveReader { explicit SaveReader(std::string &&dir) : dir_(std::move(dir)) { - Log("new SaveReader(\"{}\");", dir); } const std::string &dir() const @@ -51,7 +54,6 @@ struct SaveWriter { explicit SaveWriter(std::string &&dir) : dir_(std::move(dir)) { - Log("new SaveWriter(\"{}\");", dir); } bool WriteFile(const char *filename, const std::byte *data, size_t size); diff --git a/Source/utils/file_util.cpp b/Source/utils/file_util.cpp index 805a14bc79b..0a0114ed976 100644 --- a/Source/utils/file_util.cpp +++ b/Source/utils/file_util.cpp @@ -108,6 +108,7 @@ bool FileExists(const char *path) return true; #elif defined(__DREAMCAST__) // ramdisk access doesn't work with SDL_RWFromFile or std::filesystem::exists + // todo check to see if this is needed with vmu fs int file = fs_open(path, O_RDONLY); if (file != -1) { fs_close(file); @@ -327,6 +328,7 @@ bool TruncateFile(const char *path, off_t size) fs_unlink(path); file_t fh = fs_open(path, O_WRONLY); int result = fs_write(fh, contents, size); + fs_close(fh); free(contents); return result != -1; }