diff --git a/docs/tr2/progress.svg b/docs/tr2/progress.svg index 380f01d4a..edd8a09d2 100644 --- a/docs/tr2/progress.svg +++ b/docs/tr2/progress.svg @@ -69,10 +69,10 @@ Tomb2.exe progress according to the physical function order: -80.55% (1002) · 17.04% (212) · 0% (0) · 2.41% (30) +80.63% (1003) · 16.96% (211) · 0% (0) · 2.41% (30) - - + + @@ -1052,7 +1052,7 @@ BOOL __cdecl S_LoadLevelFile(LPCTSTR file_name, int32_t level_num, GAMEFLOW_LEVEL_TYPE level_type); void __cdecl S_UnloadLevelFile(void); void __cdecl S_AdjustTexelCoordinates(void); -BOOL __cdecl S_ReloadLevelGraphics(BOOL reload_palettes, BOOL reload_tex_pages); +BOOL __cdecl S_ReloadLevelGraphics(BOOL reload_palettes, BOOL reload_tex_pages); BOOL __cdecl GF_ReadStringTable(DWORD count, char **string_table, char **string_buf, LPDWORD buf_size, HANDLE handle); BOOL __cdecl GF_LoadFromFile(const char *file_name); bool __cdecl PlayFMV(const char *file_name); @@ -1324,10 +1324,10 @@ Tomb2.exe progress according to the function sizes: -82.42% · 17.25% · 0% · 0.33% +82.48% · 17.20% · 0% · 0.33% - - + + @@ -1783,7 +1783,7 @@ void __cdecl EmberEmitter_Control(int16_t item_num); void __cdecl Window_Smash(int16_t item_num); bool __cdecl S_Audio_Sample_DSoundBufferTest(void); -BOOL __cdecl S_ReloadLevelGraphics(BOOL reload_palettes, BOOL reload_tex_pages); +BOOL __cdecl S_ReloadLevelGraphics(BOOL reload_palettes, BOOL reload_tex_pages); void __thiscall SE_LoadBitmapResource(BITMAP_RESOURCE *bmpRsrc, LPCTSTR lpName); void __cdecl Splash(ITEM *item); int32_t __cdecl Inv_GetItemOption(GAME_OBJECT_ID object_id); diff --git a/docs/tr2/progress.txt b/docs/tr2/progress.txt index 74335c7b5..e86c1d170 100644 --- a/docs/tr2/progress.txt +++ b/docs/tr2/progress.txt @@ -3967,7 +3967,7 @@ typedef enum { 0x0044B4B0 0x0018 +R BOOL __cdecl S_LoadLevelFile(LPCTSTR file_name, int32_t level_num, GAMEFLOW_LEVEL_TYPE level_type); 0x0044B4D0 0x002A +R void __cdecl S_UnloadLevelFile(void); 0x0044B500 0x0014 +R void __cdecl S_AdjustTexelCoordinates(void); -0x0044B520 0x00C4 -R BOOL __cdecl S_ReloadLevelGraphics(BOOL reload_palettes, BOOL reload_tex_pages); +0x0044B520 0x00C4 +R BOOL __cdecl S_ReloadLevelGraphics(BOOL reload_palettes, BOOL reload_tex_pages); 0x0044B5F0 0x00C6 + BOOL __cdecl GF_ReadStringTable(DWORD count, char **string_table, char **string_buf, LPDWORD buf_size, HANDLE handle); 0x0044B6C0 0x06D1 + BOOL __cdecl GF_LoadFromFile(const char *file_name); 0x0044BDA0 0x006B +R bool __cdecl PlayFMV(const char *file_name); diff --git a/src/tr2/decomp/decomp.h b/src/tr2/decomp/decomp.h index 50b8d6811..cd6f3f038 100644 --- a/src/tr2/decomp/decomp.h +++ b/src/tr2/decomp/decomp.h @@ -210,3 +210,4 @@ void __cdecl S_AdjustTexelCoordinates(void); BOOL __cdecl S_LoadLevelFile( const char *file_name, int32_t level_num, GAMEFLOW_LEVEL_TYPE level_type); void __cdecl S_UnloadLevelFile(void); +BOOL __cdecl S_ReloadLevelGraphics(bool reload_palettes, bool reload_tex_pages); diff --git a/src/tr2/decomp/decomp2.c b/src/tr2/decomp/decomp2.c index 3d2c78f64..69162b403 100644 --- a/src/tr2/decomp/decomp2.c +++ b/src/tr2/decomp/decomp2.c @@ -1,10 +1,13 @@ #include "decomp/decomp.h" #include "game/background.h" #include "game/hwr.h" +#include "game/inventory/common.h" #include "game/level.h" #include "global/funcs.h" #include "global/vars.h" +#include + int32_t __cdecl CreateTexturePage( const int32_t width, const int32_t height, LPDIRECTDRAWPALETTE palette) { @@ -563,3 +566,38 @@ void __cdecl S_UnloadLevelFile(void) memset(g_TexturePageBuffer8, 0, sizeof(uint8_t *) * MAX_TEXTURE_PAGES); g_TextureInfoCount = 0; } + +BOOL __cdecl S_ReloadLevelGraphics( + const bool reload_palettes, const bool reload_tex_pages) +{ + if (g_LevelFileName[0] != '\0') { + VFILE *const file = VFile_CreateFromPath(g_LevelFileName); + if (file == NULL) { + return false; + } + + if (reload_palettes && g_SavedAppSettings.render_mode == RM_SOFTWARE) { + VFile_SetPos(file, g_LevelFilePalettesOffset); + Level_LoadPalettes(file); + + VFile_SetPos(file, g_LevelFileDepthQOffset); + Level_LoadDepthQ(file); + } + + if (reload_tex_pages) { + if (g_SavedAppSettings.render_mode == RM_HARDWARE) { + HWR_FreeTexturePages(); + } + VFile_SetPos(file, g_LevelFileTexPagesOffset); + Level_LoadTexturePages(file); + } + + VFile_Close(file); + } + + if (reload_palettes) { + Inv_InitColors(); + } + + return true; +} diff --git a/src/tr2/game/level.c b/src/tr2/game/level.c index f28b95030..ed4f97e87 100644 --- a/src/tr2/game/level.c +++ b/src/tr2/game/level.c @@ -16,12 +16,10 @@ #include #include #include -#include #include static void M_LoadFromFile(const char *file_name, int32_t level_num); -static void __cdecl M_LoadTexturePages(VFILE *file); static void __cdecl M_LoadRooms(VFILE *file); static void __cdecl M_LoadMeshBase(VFILE *file); static void __cdecl M_LoadMeshes(VFILE *file); @@ -36,8 +34,6 @@ static void __cdecl M_LoadStaticObjects(VFILE *file); static void __cdecl M_LoadTextures(VFILE *file); static void __cdecl M_LoadSprites(VFILE *file); static void __cdecl M_LoadItems(VFILE *file); -static void __cdecl M_LoadDepthQ(VFILE *file); -static void __cdecl M_LoadPalettes(VFILE *file); static void __cdecl M_LoadCameras(VFILE *file); static void __cdecl M_LoadSoundEffects(VFILE *file); static void __cdecl M_LoadBoxes(VFILE *file); @@ -47,7 +43,7 @@ static void __cdecl M_LoadDemo(VFILE *file); static void __cdecl M_LoadSamples(VFILE *file); static void M_CompleteSetup(void); -static void __cdecl M_LoadTexturePages(VFILE *const file) +void __cdecl Level_LoadTexturePages(VFILE *const file) { BENCHMARK *const benchmark = Benchmark_Start(); char *base = NULL; @@ -401,7 +397,6 @@ static void __cdecl M_LoadTextures(VFILE *const file) LOG_INFO("textures: %d", num_textures); if (num_textures > MAX_TEXTURES) { Shell_ExitSystem("Too many textures"); - return; } g_TextureInfoCount = num_textures; @@ -513,7 +508,7 @@ static void __cdecl M_LoadItems(VFILE *const file) Benchmark_End(benchmark, NULL); } -static void __cdecl M_LoadDepthQ(VFILE *const file) +void __cdecl Level_LoadDepthQ(VFILE *const file) { BENCHMARK *const benchmark = Benchmark_Start(); for (int32_t i = 0; i < 32; i++) { @@ -558,7 +553,7 @@ static void __cdecl M_LoadDepthQ(VFILE *const file) Benchmark_End(benchmark, NULL); } -static void __cdecl M_LoadPalettes(VFILE *const file) +void __cdecl Level_LoadPalettes(VFILE *const file) { BENCHMARK *const benchmark = Benchmark_Start(); VFile_Read(file, g_GamePalette8, sizeof(RGB_888) * 256); @@ -847,10 +842,10 @@ static void M_LoadFromFile(const char *const file_name, const int32_t level_num) } g_LevelFilePalettesOffset = VFile_GetPos(file); - M_LoadPalettes(file); + Level_LoadPalettes(file); g_LevelFileTexPagesOffset = VFile_GetPos(file); - M_LoadTexturePages(file); + Level_LoadTexturePages(file); VFile_Skip(file, 4); M_LoadRooms(file); @@ -887,7 +882,7 @@ static void M_LoadFromFile(const char *const file_name, const int32_t level_num) M_LoadItems(file); g_LevelFileDepthQOffset = VFile_GetPos(file); - M_LoadDepthQ(file); + Level_LoadDepthQ(file); M_LoadCinematic(file); M_LoadDemo(file); M_LoadSamples(file); diff --git a/src/tr2/game/level.h b/src/tr2/game/level.h index 52f672419..a79a15279 100644 --- a/src/tr2/game/level.h +++ b/src/tr2/game/level.h @@ -2,4 +2,10 @@ #include "global/types.h" +#include + +void __cdecl Level_LoadPalettes(VFILE *file); +void __cdecl Level_LoadTexturePages(VFILE *file); +void __cdecl Level_LoadDepthQ(VFILE *file); + bool __cdecl Level_Load(const char *file_name, int32_t level_num); diff --git a/src/tr2/global/funcs.h b/src/tr2/global/funcs.h index 84ec947b8..037987ffe 100644 --- a/src/tr2/global/funcs.h +++ b/src/tr2/global/funcs.h @@ -135,7 +135,6 @@ #define GiantYeti_Control ((void __cdecl (*)(int16_t item_num))0x00443050) #define Yeti_Control ((void __cdecl (*)(int16_t item_num))0x00443350) #define ReadFileSync ((BOOL __cdecl (*)(HANDLE handle, LPVOID lpBuffer, DWORD nBytesToRead, LPDWORD lpnBytesRead, LPOVERLAPPED lpOverlapped))0x004498D0) -#define S_ReloadLevelGraphics ((BOOL __cdecl (*)(BOOL reload_palettes, BOOL reload_tex_pages))0x0044B520) #define GetValidLevelsList ((void __cdecl (*)(REQUEST_INFO *req))0x0044C9D0) #define CalculateWibbleTable ((void __cdecl (*)(void))0x0044D780) #define S_GetObjectBounds ((int32_t __cdecl (*)(const BOUNDS_16 *bounds))0x00450CC0) diff --git a/src/tr2/inject_exec.c b/src/tr2/inject_exec.c index 132ac3957..992550e5e 100644 --- a/src/tr2/inject_exec.c +++ b/src/tr2/inject_exec.c @@ -248,6 +248,7 @@ static void M_DecompGeneral(const bool enable) INJECT(enable, 0x0044B4B0, S_LoadLevelFile); INJECT(enable, 0x0044B4D0, S_UnloadLevelFile); INJECT(enable, 0x0044B500, S_AdjustTexelCoordinates); + INJECT(enable, 0x0044B520, S_ReloadLevelGraphics); INJECT(enable, 0x0044C1D0, S_FindColor); INJECT(enable, 0x0044C200, S_DrawScreenLine); INJECT(enable, 0x0044C240, S_DrawScreenBox);