diff --git a/CMakeLists.txt b/CMakeLists.txt index 5411e6e..bb6aca1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -261,3 +261,4 @@ target_include_directories(${EXECUTABLE_NAME} PRIVATE ${ZLIB_INCLUDE_DIRS}) add_subdirectory("third_party/sdl2") target_link_libraries(${EXECUTABLE_NAME} ${SDL2_LIBRARIES}) target_include_directories(${EXECUTABLE_NAME} PRIVATE ${SDL2_INCLUDE_DIRS}) +add_definitions(-DSDL_MAIN_HANDLED) \ No newline at end of file diff --git a/src/character_selector.cc b/src/character_selector.cc index 3ad27ab..22141d1 100644 --- a/src/character_selector.cc +++ b/src/character_selector.cc @@ -246,6 +246,10 @@ bool characterSelectorWindowInit() int characterSelectorWindowX = (screenGetWidth() - CS_WINDOW_WIDTH) / 2; int characterSelectorWindowY = (screenGetHeight() - CS_WINDOW_HEIGHT) / 2; + CacheEntry* backgroundFrmHandle; + int backgroundFid; + unsigned char* backgroundFrmData; + gCharacterSelectorWindow = windowCreate(characterSelectorWindowX, characterSelectorWindowY, CS_WINDOW_WIDTH, CS_WINDOW_HEIGHT, _colorTable[0], 0); if (gCharacterSelectorWindow == -1) { goto err; @@ -256,9 +260,8 @@ bool characterSelectorWindowInit() goto err; } - CacheEntry* backgroundFrmHandle; - int backgroundFid = buildFid(6, 174, 0, 0, 0); - unsigned char* backgroundFrmData = artLockFrameData(backgroundFid, 0, 0, &backgroundFrmHandle); + backgroundFid = buildFid(6, 174, 0, 0, 0); + backgroundFrmData = artLockFrameData(backgroundFid, 0, 0, &backgroundFrmHandle); if (backgroundFrmData == NULL) { goto err; } diff --git a/src/color.cc b/src/color.cc index bac5c2d..75f81e8 100644 --- a/src/color.cc +++ b/src/color.cc @@ -354,7 +354,7 @@ void _setMixTableColor(int a1) } // 0x4C78E4 -bool colorPaletteLoad(char* path) +bool colorPaletteLoad(const char* path) { if (gColorFileNameMangler != NULL) { path = gColorFileNameMangler(path); diff --git a/src/color.h b/src/color.h index 0ad16c7..9ddf65d 100644 --- a/src/color.h +++ b/src/color.h @@ -5,7 +5,7 @@ #include -typedef char*(ColorFileNameManger)(char*); +typedef const char*(ColorFileNameManger)(const char*); typedef void(ColorTransitionCallback)(); typedef int(ColorPaletteFileOpenProc)(const char* path, int mode); @@ -54,7 +54,7 @@ void _setSystemPaletteEntries(unsigned char* a1, int a2, int a3); void _setIntensityTableColor(int a1); void _setIntensityTables(); void _setMixTableColor(int a1); -bool colorPaletteLoad(char* path); +bool colorPaletteLoad(const char* path); char* _colorError(); void _buildBlendTable(unsigned char* ptr, unsigned char ch); void _rebuildColorBlendTables(); diff --git a/src/db.cc b/src/db.cc index b00d767..5a54d8d 100644 --- a/src/db.cc +++ b/src/db.cc @@ -599,6 +599,19 @@ int fileWriteUInt32List(File* stream, unsigned int* arr, int count) return fileWriteInt32List(stream, (int*)arr, count); } +std::vector fileNameList(const fs::path& path, const std::regex& pattern) +{ + std::vector result; + fs::directory_iterator di(path); + + std::for_each(begin(di), end(di), [&](const fs::directory_entry& de) { + const fs::path& p(de.path()); + if (std::regex_match(p.string(), pattern)) + result.push_back(p); + }); + return result; +} + // 0x4C6628 int fileNameListInit(const char* pattern, char*** fileNameListPtr, int a3, int a4) { diff --git a/src/db.h b/src/db.h index 6d4ce6e..857f95f 100644 --- a/src/db.h +++ b/src/db.h @@ -4,8 +4,13 @@ #include "memory_defs.h" #include "xfile.h" +#include +#include +#include #include +namespace fs = std::filesystem; + typedef XFile File; typedef void FileReadProgressHandler(); typedef char* StrdupProc(const char* string); @@ -69,6 +74,7 @@ int fileWriteUInt16List(File* stream, unsigned short* arr, int count); int fileWriteInt32List(File* stream, int* arr, int count); int _db_fwriteLongCount(File* stream, int* arr, int count); int fileWriteUInt32List(File* stream, unsigned int* arr, int count); +std::vector fileNameList(const fs::path& path, const std::regex& pattern); int fileNameListInit(const char* pattern, char*** fileNames, int a3, int a4); void fileNameListFree(char*** fileNames, int a2); void _db_register_mem(MallocProc* mallocProc, StrdupProc* strdupProc, FreeProc* freeProc); diff --git a/src/file_find.cc b/src/file_find.cc index 59c3f13..bc8363a 100644 --- a/src/file_find.cc +++ b/src/file_find.cc @@ -47,7 +47,7 @@ bool fileFindNext(DirectoryFileFindData* findData) // 0x4E63CC bool findFindClose(DirectoryFileFindData* findData) { -#if defined(_MSC_VER) +#if defined(_MSC_VER) || defined(__MINGW32__) FindClose(findData->hFind); #else if (closedir(findData->dir) != 0) { diff --git a/src/game_dialog.cc b/src/game_dialog.cc index 01e5caa..2c9b2c7 100644 --- a/src/game_dialog.cc +++ b/src/game_dialog.cc @@ -1539,6 +1539,11 @@ int gameDialogSetReviewOptionText(const char* string) // 0x446288 int _gdProcessInit() { + int upBtn; + int downBtn; + int optionsWindowX; + int optionsWindowY; + int fid; int replyWindowX = (screenGetWidth() - GAME_DIALOG_WINDOW_WIDTH) / 2 + GAME_DIALOG_REPLY_WINDOW_X; @@ -1549,7 +1554,7 @@ int _gdProcessInit() } // Top part of the reply window - scroll up. - int upBtn = buttonCreate(gGameDialogReplyWindow, 1, 1, 377, 28, -1, -1, KEY_ARROW_UP, -1, NULL, NULL, NULL, 32); + upBtn = buttonCreate(gGameDialogReplyWindow, 1, 1, 377, 28, -1, -1, KEY_ARROW_UP, -1, NULL, NULL, NULL, 32); if (upBtn == -1) { goto err_1; } @@ -1558,7 +1563,7 @@ int _gdProcessInit() buttonSetMouseCallbacks(upBtn, _reply_arrow_up, _reply_arrow_restore, 0, 0); // Bottom part of the reply window - scroll down. - int downBtn = buttonCreate(gGameDialogReplyWindow, 1, 29, 377, 28, -1, -1, KEY_ARROW_DOWN, -1, NULL, NULL, NULL, 32); + downBtn = buttonCreate(gGameDialogReplyWindow, 1, 29, 377, 28, -1, -1, KEY_ARROW_DOWN, -1, NULL, NULL, NULL, 32); if (downBtn == -1) { goto err_1; } @@ -1566,8 +1571,8 @@ int _gdProcessInit() buttonSetCallbacks(downBtn, _gsound_red_butt_press, _gsound_red_butt_release); buttonSetMouseCallbacks(downBtn, _reply_arrow_down, _reply_arrow_restore, 0, 0); - int optionsWindowX = (screenGetWidth() - GAME_DIALOG_WINDOW_WIDTH) / 2 + GAME_DIALOG_OPTIONS_WINDOW_X; - int optionsWindowY = (screenGetHeight() - GAME_DIALOG_WINDOW_HEIGHT) / 2 + GAME_DIALOG_OPTIONS_WINDOW_Y; + optionsWindowX = (screenGetWidth() - GAME_DIALOG_WINDOW_WIDTH) / 2 + GAME_DIALOG_OPTIONS_WINDOW_X; + optionsWindowY = (screenGetHeight() - GAME_DIALOG_WINDOW_HEIGHT) / 2 + GAME_DIALOG_OPTIONS_WINDOW_Y; gGameDialogOptionsWindow = windowCreate(optionsWindowX, optionsWindowY, GAME_DIALOG_OPTIONS_WINDOW_WIDTH, GAME_DIALOG_OPTIONS_WINDOW_HEIGHT, 256, WINDOW_FLAG_0x04); if (gGameDialogOptionsWindow == -1) { goto err_2; diff --git a/src/game_movie.cc b/src/game_movie.cc index 8dd2ca3..8bce85e 100644 --- a/src/game_movie.cc +++ b/src/game_movie.cc @@ -46,7 +46,7 @@ const char* gMovieFileNames[MOVIE_COUNT] = { }; // 0x518DE4 -char* gMoviePaletteFilePaths[MOVIE_COUNT] = { +const char* gMoviePaletteFilePaths[MOVIE_COUNT] = { NULL, "art\\cuts\\introsub.pal", "art\\cuts\\eldersub.pal", @@ -209,7 +209,7 @@ int gameMoviePlay(int movie, int flags) int oldTextColor; int oldFont; if (subtitlesEnabled) { - char* subtitlesPaletteFilePath; + const char* subtitlesPaletteFilePath; if (gMoviePaletteFilePaths[movie] != NULL) { subtitlesPaletteFilePath = gMoviePaletteFilePaths[movie]; } else { diff --git a/src/game_movie.h b/src/game_movie.h index 7ca8cb0..a85bad9 100644 --- a/src/game_movie.h +++ b/src/game_movie.h @@ -35,7 +35,7 @@ typedef enum GameMovie { extern const float flt_50352A; extern const char* gMovieFileNames[MOVIE_COUNT]; -extern char* gMoviePaletteFilePaths[MOVIE_COUNT]; +extern const char* gMoviePaletteFilePaths[MOVIE_COUNT]; extern bool gGameMovieIsPlaying; extern bool gGameMovieFaded; diff --git a/src/loadsave.cc b/src/loadsave.cc index a67d93f..440bc52 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -40,12 +40,15 @@ #include "word_wrap.h" #include "world_map.h" +#include +#include +#include #include #include #include #include -#include +namespace fs = std::filesystem; #define LS_WINDOW_WIDTH 640 #define LS_WINDOW_HEIGHT 480 @@ -2632,36 +2635,21 @@ int _EraseSave() { debugPrint("\nLOADSAVE: Erasing save(bad) slot...\n"); - sprintf(_gmpath, "%s\\%s\\%s%.2d\\", _patches, "SAVEGAME", "SLOT", _slot_cursor + 1); - strcpy(_str0, _gmpath); - strcat(_str0, "SAVE.DAT"); - remove(_str0); + std::stringstream slot; + slot << "SLOT" << std::setw(2) << std::setfill( '0') << _slot_cursor + 1; - sprintf(_gmpath, "%s\\%s%.2d\\", "SAVEGAME", "SLOT", _slot_cursor + 1); - sprintf(_str0, "%s*.%s", _gmpath, "SAV"); + // TODO: What's _patches value? Needs to be optimized. + fs::path savePath(fs::path(_patches) / fs::path("SAVEGAME") / fs::path(slot.str())); - char** fileList; - int fileListLength = fileNameListInit(_str0, &fileList, 0, 0); - if (fileListLength == -1) { + fs::remove(fs::path(savePath).append("SAVE.DAT")); + + std::vector fileList = fileNameList(savePath, std::regex("^.+\\.SAV$")); + if (fileList.empty()) return -1; - } - sprintf(_gmpath, "%s\\%s\\%s%.2d\\", _patches, "SAVEGAME", "SLOT", _slot_cursor + 1); - for (int index = fileListLength - 1; index >= 0; index--) { - strcpy(_str0, _gmpath); - strcat(_str0, fileList[index]); - remove(_str0); - } - - fileNameListFree(&fileList, 0); - - sprintf(_gmpath, "%s\\%s\\%s%.2d\\", _patches, "SAVEGAME", "SLOT", _slot_cursor + 1); - - char* v1 = _strmfe(_str1, "AUTOMAP.DB", "SAV"); - strcpy(_str0, _gmpath); - strcat(_str0, v1); - - remove(_str0); + std::for_each(fileList.begin(), fileList.end(), [] (const fs::path& p) { + fs::remove(p); + }); return 0; } diff --git a/src/mmx.cc b/src/mmx.cc index 205bffb..27f9edc 100644 --- a/src/mmx.cc +++ b/src/mmx.cc @@ -9,6 +9,9 @@ // 0x4E08A0 bool mmxIsSupported() { +#if defined(__MINGW32__) + return false; +#else int v1; // TODO: There are other ways to determine MMX using FLAGS register. @@ -22,6 +25,7 @@ bool mmxIsSupported() } return v1 != 0; +#endif } // 0x4E0DB0 diff --git a/src/object.cc b/src/object.cc index 55d68fd..ee25871 100644 --- a/src/object.cc +++ b/src/object.cc @@ -260,6 +260,9 @@ char _obj_seen[5001]; // 0x488780 int objectsInit(unsigned char* buf, int width, int height, int pitch) { + int dudeFid; + int eggFid; + memset(_obj_seen, 0, 5001); dword_639D98 = width + 320; _updateAreaPixelBounds = -320; @@ -308,7 +311,7 @@ int objectsInit(unsigned char* buf, int width, int height, int pitch) gObjectsWindowBufferSize = height * width; gObjectsWindowPitch = pitch; - int dudeFid = buildFid(1, _art_vault_guy_num, 0, 0, 0); + dudeFid = buildFid(1, _art_vault_guy_num, 0, 0, 0); objectCreateWithFidPid(&gDude, dudeFid, 0x1000000); gDude->flags |= OBJECT_FLAG_0x400; @@ -322,7 +325,7 @@ int objectsInit(unsigned char* buf, int width, int height, int pitch) exit(1); } - int eggFid = buildFid(6, 2, 0, 0, 0); + eggFid = buildFid(6, 2, 0, 0, 0); objectCreateWithFidPid(&gEgg, eggFid, -1); gEgg->flags |= OBJECT_FLAG_0x400; gEgg->flags |= OBJECT_TEMPORARY; diff --git a/src/win32.h b/src/win32.h index 45056cd..a06853c 100644 --- a/src/win32.h +++ b/src/win32.h @@ -6,6 +6,7 @@ #include #include +#include #define DIRECTSOUND_VERSION 0x0300 #include