diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ae4663cec..b12ad4810b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,8 +27,8 @@ if(REC2_MATCHING) set(CMAKE_C_FLAGS "/W3 /GX /DWIN32 /D_WINDOWS") set(CMAKE_C_FLAGS_DEBUG "/Gm /Od /D_DEBUG /MLd") - set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /DNDEBUG /ML") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "/O2 /Ob2 /DNDEBUG /ML") + set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /G5 /DNDEBUG /ML") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "/O2 /Ob2 /G5 /DNDEBUG /ML") set(CMAKE_C_FLAGS_MINSIZEREL "/Os /DNDEBUG /ML") set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}") diff --git a/src/carma2/common/frontend.c b/src/carma2/common/frontend.c index 9d93a13e0d..bdb1453ad6 100644 --- a/src/carma2/common/frontend.c +++ b/src/carma2/common/frontend.c @@ -2410,7 +2410,7 @@ void C2_HOOK_FASTCALL KillAPOactor(br_actor* pActor) { } // FUNCTION: CARMA2_HW 0x00518fa0 -void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pKey, char* pRepl) { +void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pMeta, const char* pRepl) { size_t len_text; size_t len_repl; size_t i; @@ -2419,7 +2419,7 @@ void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pKey, char* pRepl) { len_repl = strlen(pRepl); for (i = 0; i < len_text; i++) { - if (pText[i] == '@' && pText[i + 1] == pKey) { + if (pText[i] == '@' && pText[i + 1] == pMeta) { memmove(&pText[i + len_repl], &pText[i + 2], len_text - i - 1); memcpy(&pText[i], pRepl, len_repl); i += len_repl; @@ -2429,17 +2429,17 @@ void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pKey, char* pRepl) { } // FUNCTION: CARMA2_HW 0x00519040 -void C2_HOOK_FASTCALL MungeMetaCharactersChar(char* pText, char pKey, char pChar) { +void C2_HOOK_FASTCALL MungeMetaCharactersChar(char* pText, char pMeta, char pChar) { - MungeMetaCharacters(pText, pKey, &pChar); + MungeMetaCharacters(pText, pMeta, &pChar); } // FUNCTION: CARMA2_HW 0x005190f0 -void C2_HOOK_FASTCALL MungeMetaCharactersNum(char* pText, char pKey, int pNum) { +void C2_HOOK_FASTCALL MungeMetaCharactersNum(char* pText, char pMeta, int pNum) { char text[16]; sprintf(text, "%d", pNum); - MungeMetaCharacters(pText, pKey, text); + MungeMetaCharacters(pText, pMeta, text); } void C2_HOOK_FASTCALL DrPixelmapRectangleCopyPossibleLock(br_pixelmap* dst, br_int_32 dx, br_int_32 dy, br_pixelmap* src, br_int_32 sx, br_int_32 sy, br_int_32 w, br_int_32 h) { diff --git a/src/carma2/common/frontend.h b/src/carma2/common/frontend.h index 982c63b2b4..6c7e82ee62 100644 --- a/src/carma2/common/frontend.h +++ b/src/carma2/common/frontend.h @@ -164,11 +164,11 @@ br_actor* C2_HOOK_FASTCALL CreateAPOactor(void); void C2_HOOK_FASTCALL KillAPOactor(br_actor* pActor); -void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pKey, char* pRepl); +void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pMeta, const char* pRepl); -void C2_HOOK_FASTCALL MungeMetaCharactersChar(char* pText, char pKey, char pChar); +void C2_HOOK_FASTCALL MungeMetaCharactersChar(char* pText, char pMeta, char pChar); -void C2_HOOK_FASTCALL MungeMetaCharactersNum(char* pText, char pKey, int pNum); +void C2_HOOK_FASTCALL MungeMetaCharactersNum(char* pText, char pMeta, int pNum); void C2_HOOK_FASTCALL DrPixelmapRectangleCopyPossibleLock(br_pixelmap* dst, br_int_32 dx, br_int_32 dy, br_pixelmap* src, br_int_32 sx, br_int_32 sy, br_int_32 w, br_int_32 h); @@ -204,4 +204,4 @@ void C2_HOOK_FASTCALL SelectThisItemIn(tFrontend_spec* pFrontend, int pGroup, in int C2_HOOK_FASTCALL WhichItemIsSelectedIn(tFrontend_spec* pFrontend, int pGroup); -#endif //REC2_FRONTEND_H \ No newline at end of file +#endif //REC2_FRONTEND_H diff --git a/src/carma2/common/globvars.c b/src/carma2/common/globvars.c index c3c4048e91..776cbfcce4 100644 --- a/src/carma2/common/globvars.c +++ b/src/carma2/common/globvars.c @@ -157,7 +157,7 @@ int gMap_view; // GLOBAL: CARMA2_HW 0x0074cadc -int gScreen_lock_often; +int gLock_often; // GLOBAL: CARMA2_HW 0x0074ca0c int gShadow_workaround; diff --git a/src/carma2/common/globvars.h b/src/carma2/common/globvars.h index 4dea72d96d..e092e81998 100644 --- a/src/carma2/common/globvars.h +++ b/src/carma2/common/globvars.h @@ -54,7 +54,7 @@ extern char gQuick_time_movie_path_stub[256]; extern int gNet_last_game_type; extern int gMap_view; -extern int gScreen_lock_often; +extern int gLock_often; extern int gShadow_workaround; extern int gEnable_texture_interpolation; extern int gEnable_texture_antialiasing; diff --git a/src/carma2/newcommon/17-world2.c b/src/carma2/newcommon/17-world2.c index fa4c08e0d4..b1e780c667 100644 --- a/src/carma2/newcommon/17-world2.c +++ b/src/carma2/newcommon/17-world2.c @@ -92,12 +92,9 @@ void C2_HOOK_FASTCALL RevealStoredTransparentTextures(tBrender_storage* pStorage int i; for (i = 0; i < pStorage->materials_count; i++) { - br_pixelmap* colour_map; - - colour_map = pStorage->materialProps[i]; - if (colour_map != NULL && DRPixelmapHasZeros(colour_map)) { - pStorage->materials[i]->colour_map = colour_map; + if (pStorage->materialProps[i] != NULL && DRPixelmapHasZeros(pStorage->materialProps[i])) { + pStorage->materials[i]->colour_map = pStorage->materialProps[i]; pStorage->materialProps[i] = NULL; pStorage->materials[i]->flags |= BR_MATF_PRELIT; BrMaterialUpdate(pStorage->materials[i], BR_MATU_ALL); diff --git a/src/carma2/newcommon/18-graphics2.c b/src/carma2/newcommon/18-graphics2.c index a8f0dd93d5..1c5bdc6c11 100644 --- a/src/carma2/newcommon/18-graphics2.c +++ b/src/carma2/newcommon/18-graphics2.c @@ -62,13 +62,97 @@ br_pixelmap* gPalette_0074a5fc; // GLOBAL: CARMA2_HW 0x0074a670 br_pixelmap* gPalette_0074a670; -// DRSetPaletteEntries +// GLOBAL: CARMA2_HW 0x0074cf04 +int gPalette_changed; + +// GLOBAL: CARMA2_HW 0x006923c0 +int gPalette_munged; + +// GLOBAL: CARMA2_HW 0x0074a680 +char* gCurrent_palette_pixels; + +// GLOBAL: CARMA2_HW 0x006923c8 +int gFaded_palette; + +// GLOBAL: CARMA2_HW 0x0074a678 +br_pixelmap* gCurrent_palette; + +// GLOBAL: CARMA2_HW 0x006923ac +br_pixelmap* gOrig_render_palette; + +// GLOBAL: CARMA2_HW 0x0074a67c +br_pixelmap* gFlic_palette; + +// GLOBAL: CARMA2_HW 0x006923b8 +br_colour* gScratch_pixels; + +// GLOBAL: CARMA2_HW 0x006923a8 +br_pixelmap* gScratch_palette; + +// GLOBAL: CARMA2_HW 0x0074a660 +br_pixelmap* gMini_map_glowing_line_palettes[3]; + +// GLOBAL: CARMA2_HW 0x0074a5fc +br_pixelmap* gPalette_0074a5fc; + +// GLOBAL: CARMA2_HW 0x0074a600 +br_pixelmap* gPalette_0074a600; + +// GLOBAL: CARMA2_HW 0x0074a604 +br_pixelmap* gPalette_0074a604; -// DRSetPalette3 +// GLOBAL: CARMA2_HW 0x0074a66c +br_pixelmap* gPalette_0074a66c; + +// GLOBAL: CARMA2_HW 0x0074a670 +br_pixelmap* gPalette_0074a670; + +// FUNCTION: CARMA2_HW 0x004b4fd0 +void C2_HOOK_FASTCALL DRSetPaletteEntries(br_pixelmap* pThe_palette, int pFirst_colour, int pCount) { + + if (!pFirst_colour) { + ((br_int_32*)pThe_palette->pixels)[0] = 0; + } + memcpy(gCurrent_palette_pixels + 4 * pFirst_colour, (char*)pThe_palette->pixels + 4 * pFirst_colour, 4 * pCount); + gPalette_changed = 0; + if (!gFaded_palette) { + PDSetPaletteEntries(pThe_palette, pFirst_colour, pCount); + } + gPalette_munged = 1; +} -// DRSetPalette2 +void C2_HOOK_FASTCALL DRSetPalette3(br_pixelmap* pThe_palette, int pSet_current_palette) { -// DRSetPalette + if (pSet_current_palette) { + memcpy(gCurrent_palette_pixels, pThe_palette->pixels, 256 * sizeof(br_colour)); + } + gPalette_changed = 0; + if (!gFaded_palette) { + PDSetPalette(pThe_palette); + } + if (pThe_palette != gRender_palette) { + gPalette_munged |= 0x1; + } +} + +void C2_HOOK_FASTCALL DRSetPalette2(br_pixelmap* pThe_palette, int pSet_current_palette) { + + ((br_int_32*)pThe_palette->pixels)[0] = 0; + if (pSet_current_palette) { + memcpy(gCurrent_palette_pixels, pThe_palette->pixels, 256 * sizeof(br_colour)); + } + gPalette_changed = 0; + if (!gFaded_palette) { + PDSetPalette(pThe_palette); + } + gPalette_munged |= pThe_palette != gRender_palette; +} + +// FUNCTION: CARMA2_HW 0x004b5030 +void C2_HOOK_FASTCALL DRSetPalette(br_pixelmap* pThe_palette) { + + DRSetPalette2(pThe_palette, 1); +} // FUNCTION: CARMA2_HW 0x004b5090 void C2_HOOK_FASTCALL InitializePalettes(void) { diff --git a/src/carma2/newcommon/18-graphics2.h b/src/carma2/newcommon/18-graphics2.h index 72a6f1a205..67c2575fb8 100644 --- a/src/carma2/newcommon/18-graphics2.h +++ b/src/carma2/newcommon/18-graphics2.h @@ -8,13 +8,13 @@ extern int gNoTransients; extern br_pixelmap* gRender_palette; extern int gDim_amount; -// DRSetPaletteEntries +extern void C2_HOOK_FASTCALL DRSetPaletteEntries(br_pixelmap* pThe_palette, int pFirst_colour, int pCount); -// DRSetPalette3 +extern void C2_HOOK_FASTCALL DRSetPalette3(br_pixelmap* pThe_palette, int pSet_current_palette); -// DRSetPalette2 +extern void C2_HOOK_FASTCALL DRSetPalette2(br_pixelmap* pThe_palette, int pSet_current_palette); -// DRSetPalette +extern void C2_HOOK_FASTCALL DRSetPalette(br_pixelmap* pThe_palette); extern void C2_HOOK_FASTCALL InitializePalettes(void); diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index b152f38b58..1c41702063 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -3,13 +3,16 @@ #include "01-network.h" #include "02-init.h" #include "18-graphics2.h" +#include "40-main.h" +#include "42-input.h" +#include "44-mainmenu.h" #include "63-loading3.h" #include "69-sound.h" #include "70-packfile.h" #include "globvars.h" #include "platform.h" - #include "c2_string.h" + #include @@ -52,9 +55,34 @@ void C2_HOOK_FASTCALL Uppercaseificate(char* dest, const char* src) { dest[len] = '\0'; } -// CheckQuit +// FUNCTION: CARMA2_HW 0x005134b0 +int C2_HOOK_FASTCALL CheckQuit(void) { + int result; + + // GLOBAL: CARMA2_HW 0x006abee0 + static int active; + + result = 0; + if (!active) { + if (KeyIsDown(1) && KeyIsDown(7)) { + active = 1; + do { + } while (AnyKeyDown()); + result = 1; + if (DoVerifyQuit(1)) { + QuitGame(); + } + active = 0; + } + } + return result; +} + +// FUNCTION: CARMA2_HW 0x00513510 +double C2_HOOK_FASTCALL sqr(double pN) { -// sqr + return pN * pN; +} // FUNCTION: CARMA2_HW 0x00513520 int C2_HOOK_FASTCALL IRandomBetween(int pA, int pB) { @@ -235,13 +263,64 @@ intptr_t C2_HOOK_FASTCALL DRActorEnumRecurse(br_actor* pActor, br_actor_enum_cbf return 0; } -// CompareActorID +// FUNCTION: CARMA2_HW 0x005147b0 +intptr_t C2_HOOK_CDECL CompareActorID(br_actor* pActor, void* pArg) { -// DRActorFindRecurse + if (pActor->identifier != NULL && strcmp(pActor->identifier, (const char*)pArg) == 0) { + return (intptr_t)pActor; + } else { + return 0; + } +} + +// FUNCTION: CARMA2_HW 0x00514730 +br_actor* C2_HOOK_FASTCALL DRActorFindRecurse(br_actor* pSearch_root, const char* pName) { + + return (br_actor*)DRActorEnumRecurse(pSearch_root, CompareActorID, (void*)pName); +} + +// FUNCTION: CARMA2_HW 0x00514800 +br_uint_32 C2_HOOK_FASTCALL DRActorEnumRecurseWithMat(br_actor* pActor, br_material* pMat, recurse_with_mat_cbfn* pCall_back, void* pArg) { + br_uint_32 result; -// DRActorEnumRecurseWithMat + if (pActor->material != NULL) { + pMat = pActor->material; + } + result = pCall_back(pActor, pMat, pArg); + if (result != 0) { + return result; + } + for (pActor = pActor->children; pActor != NULL; pActor = pActor->next) { + result = DRActorEnumRecurseWithMat(pActor, pMat, pCall_back, pArg); + if (result != 0) { + return result; + } + } + return 0; +} -// DRActorEnumRecurseWithTrans +// FUNCTION: CARMA2_HW 0x00514850 +br_uint_32 C2_HOOK_FASTCALL DRActorEnumRecurseWithTrans(br_actor* pActor, br_matrix34* pMatrix, recurse_with_trans_cbfn* pCall_back, void* pArg) { + br_uint_32 result; + br_matrix34 combined_transform; + + if (pMatrix == NULL) { + BrMatrix34Copy(&combined_transform, &pActor->t.t.mat); + } else { + BrMatrix34Mul(&combined_transform, pMatrix, &pActor->t.t.mat); + } + result = pCall_back(pActor, &combined_transform, pArg); + if (result != 0) { + return result; + } + for (pActor = pActor->children; pActor != NULL; pActor = pActor->next) { + result = DRActorEnumRecurseWithTrans(pActor, &combined_transform, pCall_back, pArg); + if (result != 0) { + return result; + } + } + return 0; +} // DRActorEnumRecurseWithSnart @@ -297,13 +376,56 @@ void C2_HOOK_FASTCALL PossibleService(void) { } } -// DRMatrix34TApplyP +// FUNCTION: CARMA2_HW 0x00515610 +void C2_HOOK_FASTCALL DRMatrix34TApplyP(br_vector3* pA, const br_vector3* pB, const br_matrix34* pC) { + br_scalar t1; + br_scalar t2; + br_scalar t3; + + t1 = pB->v[0] - pC->m[3][0]; + t2 = pB->v[1] - pC->m[3][1]; + t3 = pB->v[2] - pC->m[3][2]; + + pA->v[0] = pC->m[0][2] * t3 + pC->m[0][0] * t1 + pC->m[0][1] * t2; + pA->v[1] = pC->m[1][2] * t3 + pC->m[1][0] * t1 + pC->m[1][1] * t2; + pA->v[2] = pC->m[2][2] * t3 + pC->m[2][0] * t1 + pC->m[2][1] * t2; +} // DRPixelmapRectangleCopy // NormalSideOfPlane -// DRMaterialClone +// FUNCTION: CARMA2_HW 0x00515780 +br_material* C2_HOOK_FASTCALL DRMaterialClone(br_material* pMaterial, int pSet_identifier) { + br_material* the_material; + char s[256]; + int version; + + // GLOBAL: CARMA2_HW 0x006abefc + static int gVersion_suffix; + + the_material = BrMaterialAllocate(NULL); + the_material->flags = pMaterial->flags; + the_material->ka = pMaterial->ka; + the_material->kd = pMaterial->kd; + the_material->ks = pMaterial->ks; + the_material->power = pMaterial->power; + the_material->colour = pMaterial->colour; + the_material->index_base = pMaterial->index_base; + the_material->index_range = pMaterial->index_range; + the_material->index_shade = pMaterial->index_shade; + the_material->index_blend = pMaterial->index_blend; + the_material->colour_map = pMaterial->colour_map; + memcpy(&the_material->map_transform, &pMaterial->map_transform, sizeof(the_material->map_transform)); + if (pSet_identifier) { + version = gVersion_suffix++; + sprintf(s, "%s(%d)", pMaterial->identifier, version); + the_material->identifier = BrResAllocate(the_material, strlen(s) + 1, BR_MEMORY_STRING); + strcpy(the_material->identifier, s); + } + BrMaterialAdd(the_material); + return the_material; +} // FUNCTION: CARMA2_HW 0x00515870 int C2_HOOK_FASTCALL DRStricmp(const char* p1, const char* p2) { @@ -553,17 +675,98 @@ void C2_HOOK_FASTCALL WhitenVertexRGB(br_model** pModels, int pCount) { // GetBlenficatiousnessOfMaterial -// MungeCommas +// FUNCTION: CARMA2_HW 0x00518f20 +char* C2_HOOK_FASTCALL MungeCommas(int pValue) { + // GLOBAL: CARMA2_HW 0x006b5f20 + static char result_buffer[32]; + char buffer[32]; + int len; + int get_pos; + int put_pos; + int remaining; -// MungeMetaCharacters + sprintf(buffer, "%i", pValue); + len = (int)strlen(buffer); + for (get_pos = 0, put_pos = 0, remaining = len; get_pos < len; get_pos++, put_pos++, remaining--) { -// MungeMetaCharactersChar + if (remaining % 3 == 0 && get_pos != 0) { + result_buffer[put_pos] = gMisc_strings[294][0]; + put_pos++; + } + result_buffer[put_pos] = buffer[get_pos]; + } + result_buffer[put_pos] = '\0'; + return result_buffer; +} -// MungeMetaCharactersNum +// FUNCTION: CARMA2_HW 0x00518fa0 +void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pMeta, const char* pRepl) { + int len_text; + int len_repl; + int i; -// DrPixelmapRectangleCopyPossibleLock + len_text = strlen(pText); + len_repl = strlen(pRepl); -// PixelmapSwapByteOrder + for (i = 0; i < len_text; i++) { + if (pText[i] == '@' && pText[i + 1] == pMeta) { + memmove(&pText[i + len_repl], &pText[i + 2], len_text - i - 1); + memcpy(&pText[i], pRepl, len_repl); + i += len_repl; + len_text += len_repl - 2; + } + } +} + +// FUNCTION: CARMA2_HW 0x00519040 +void C2_HOOK_FASTCALL MungeMetaCharactersChar(char* pText, char pMeta, char pChar) { + char repl[2]; + + repl[1] = '\0'; + repl[0] = pChar; + MungeMetaCharacters(pText, pMeta, repl); +} + +// FUNCTION: CARMA2_HW 0x005190f0 +void C2_HOOK_FASTCALL MungeMetaCharactersNum(char* pText, char pMeta, int pNum) { + char text[16]; + + sprintf(text, "%d", pNum); + MungeMetaCharacters(pText, pMeta, text); +} + +void C2_HOOK_FASTCALL DrPixelmapRectangleCopyPossibleLock(br_pixelmap* dst, br_int_32 dx, br_int_32 dy, br_pixelmap* src, br_int_32 sx, br_int_32 sy, br_int_32 w, br_int_32 h) { + + if (gLock_often) { + PossibleUnlock(0); + } + BrPixelmapRectangleCopy(dst, dx, dy, src, sx, sy, w, h); + if (gLock_often) { + PossibleUnlock(0); + } +} + +// FUNCTION: CARMA2_HW 0x005191f0 +void C2_HOOK_FASTCALL PixelmapSwapByteOrder(br_pixelmap* pMap) { + +#if 0 // FIXME: introduce endian.h-like rec2_endian.h header + br_uint_16 y; + br_uint_8* row_ptr; + br_colour* ptr; + int w; + + row_ptr = pMap->pixels; + for (y = 0; y < pMap->height; y++) { + w = (pMap->width * 2) / sizeof(br_colour); + ptr = (br_colour*) row_ptr; + while (w) { + *ptr = (*ptr >> 0x18) + (*ptr << 0x18) + ((*ptr >> 0x8) & 0xff00) + ((*ptr & 0xff00) <<0x8); + ptr++; + } + row_ptr += pMap->row_bytes; + } +#endif +} // FUNCTION: CARMA2_HW 0x005193f0 void C2_HOOK_FASTCALL EnsurePixelmapAllowed(br_pixelmap* pMap, undefined4 pArg2) { diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 632a3b32fc..7f48fa9bd1 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -11,9 +11,9 @@ extern br_error C2_HOOK_FASTCALL DRBrEnd(void); extern void C2_HOOK_FASTCALL Uppercaseificate(char* dest, const char* src); -// CheckQuit +extern int C2_HOOK_FASTCALL CheckQuit(void); -// sqr +extern double C2_HOOK_FASTCALL sqr(double pN); extern int C2_HOOK_FASTCALL IRandomBetween(int pA, int pB); @@ -53,13 +53,13 @@ extern int C2_HOOK_FASTCALL DRPixelmapLoadMany(const char* texturePathNoExt, br_ extern intptr_t DRActorEnumRecurse(br_actor* pActor, br_actor_enum_cbfn* callback, void* arg); -// CompareActorID +extern intptr_t C2_HOOK_CDECL CompareActorID(br_actor* pActor, void* pArg); -// DRActorFindRecurse +extern br_actor* C2_HOOK_FASTCALL DRActorFindRecurse(br_actor* pSearch_root, const char* pName); -// DRActorEnumRecurseWithMat +extern br_uint_32 C2_HOOK_FASTCALL DRActorEnumRecurseWithMat(br_actor* pActor, br_material* pMat, recurse_with_mat_cbfn* pCall_back, void* pArg); -// DRActorEnumRecurseWithTrans +extern br_uint_32 C2_HOOK_FASTCALL DRActorEnumRecurseWithTrans(br_actor* pActor, br_matrix34* pMatrix, recurse_with_trans_cbfn* pCall_back, void* pArg); // DRActorEnumRecurseWithSnart @@ -101,13 +101,13 @@ extern const char* C2_HOOK_FASTCALL GetMiscString(int pIndex); extern void C2_HOOK_FASTCALL PossibleService(void); -// DRMatrix34TApplyP +extern void C2_HOOK_FASTCALL DRMatrix34TApplyP(br_vector3* pA, const br_vector3* pB, const br_matrix34* pC); // DRPixelmapRectangleCopy // NormalSideOfPlane -// DRMaterialClone +extern br_material* C2_HOOK_FASTCALL DRMaterialClone(br_material* pMaterial, int pSet_identifier); extern int C2_HOOK_FASTCALL DRStricmp(const char* p1, const char* p2); @@ -201,17 +201,17 @@ extern void C2_HOOK_FASTCALL WhitenVertexRGB(br_model** pModels, int pCount); // GetBlenficatiousnessOfMaterial -// MungeCommas +extern char* C2_HOOK_FASTCALL MungeCommas(int pValue); -// MungeMetaCharacters +extern void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pMeta, const char* pRepl); -// MungeMetaCharactersChar +extern void C2_HOOK_FASTCALL MungeMetaCharactersChar(char* pText, char pMeta, char pChar); -// MungeMetaCharactersNum +extern void C2_HOOK_FASTCALL MungeMetaCharactersNum(char* pText, char pMeta, int pNum); -// DrPixelmapRectangleCopyPossibleLock +extern void C2_HOOK_FASTCALL DrPixelmapRectangleCopyPossibleLock(br_pixelmap* dst, br_int_32 dx, br_int_32 dy, br_pixelmap* src, br_int_32 sx, br_int_32 sy, br_int_32 w, br_int_32 h); -// PixelmapSwapByteOrder +extern void C2_HOOK_FASTCALL PixelmapSwapByteOrder(br_pixelmap* pMap); extern void C2_HOOK_FASTCALL EnsurePixelmapAllowed(br_pixelmap* pMap, undefined4 pArg2); diff --git a/src/carma2/newcommon/42-input.c b/src/carma2/newcommon/42-input.c index 6c1c0ea869..e9b9c6269f 100644 --- a/src/carma2/newcommon/42-input.c +++ b/src/carma2/newcommon/42-input.c @@ -29,11 +29,17 @@ int C2_HOOK_FASTCALL PDKeyDown(int pKey_index) { // PDAnyKeyDown -// AnyKeyDown +// STUB: CARMA2_HW 0x00482d70 +int C2_HOOK_FASTCALL AnyKeyDown(void) { + NOT_IMPLEMENTED(); +} // KevKeyService -// KeyIsDown +// STUB: CARMA2_HW 0x00483040 +int C2_HOOK_FASTCALL KeyIsDown(int pKey_index) { + NOT_IMPLEMENTED(); +} // KeyIsDownNoMouldiness diff --git a/src/carma2/newcommon/42-input.h b/src/carma2/newcommon/42-input.h index 9a4b67be03..76238abe87 100644 --- a/src/carma2/newcommon/42-input.h +++ b/src/carma2/newcommon/42-input.h @@ -27,11 +27,11 @@ extern int C2_HOOK_FASTCALL PDKeyDown(int pKey_index); // PDAnyKeyDown -// AnyKeyDown +extern int C2_HOOK_FASTCALL AnyKeyDown(void); // KevKeyService -// KeyIsDown +extern int C2_HOOK_FASTCALL KeyIsDown(int pKey_index); // KeyIsDownNoMouldiness diff --git a/src/carma2/newcommon/44-mainmenu.c b/src/carma2/newcommon/44-mainmenu.c index 9da0d23e7b..38cfaba3cb 100644 --- a/src/carma2/newcommon/44-mainmenu.c +++ b/src/carma2/newcommon/44-mainmenu.c @@ -4,7 +4,10 @@ // QuitVerifyDone -// DoVerifyQuit +// STUB: CARMA2_HW 0x00494450 +int C2_HOOK_FASTCALL DoVerifyQuit(int pReplace_background) { + NOT_IMPLEMENTED(); +} // DoMainScreen diff --git a/src/carma2/newcommon/44-mainmenu.h b/src/carma2/newcommon/44-mainmenu.h index 96f65fa861..47b97810ba 100644 --- a/src/carma2/newcommon/44-mainmenu.h +++ b/src/carma2/newcommon/44-mainmenu.h @@ -1,11 +1,13 @@ #ifndef GUARD_44_MAINMENU_H #define GUARD_44_MAINMENU_H +#include "c2_hooks.h" + // QuitVerifyStart // QuitVerifyDone -// DoVerifyQuit +extern int C2_HOOK_FASTCALL DoVerifyQuit(int pReplace_background); // DoMainScreen diff --git a/src/carma2/newcommon/globvars.c b/src/carma2/newcommon/globvars.c index 85ba5b555b..ba0e6744d2 100644 --- a/src/carma2/newcommon/globvars.c +++ b/src/carma2/newcommon/globvars.c @@ -146,7 +146,7 @@ int gNet_last_game_type; int gMap_view; // GLOBAL: CARMA2_HW 0x0074cadc -int gScreen_lock_often; +int gLock_often; // GLOBAL: CARMA2_HW 0x0074ca0c int gShadow_workaround; diff --git a/src/carma2/newcommon/globvars.h b/src/carma2/newcommon/globvars.h index 354b929e4c..1de6d6b406 100644 --- a/src/carma2/newcommon/globvars.h +++ b/src/carma2/newcommon/globvars.h @@ -51,7 +51,7 @@ extern int gQuick_time_banner_number; extern int gNet_last_game_type; extern int gMap_view; -extern int gScreen_lock_often; +extern int gLock_often; extern int gShadow_workaround; extern int gEnable_texture_interpolation; extern int gEnable_texture_antialiasing; diff --git a/src/carma2/platform/sdl3/sdl3.c b/src/carma2/platform/sdl3/sdl3.c index 63e539c4f9..e09a6dfcb8 100644 --- a/src/carma2/platform/sdl3/sdl3.c +++ b/src/carma2/platform/sdl3/sdl3.c @@ -94,8 +94,9 @@ static int find_gamepad_index(SDL_JoystickID which) { return -1; } -void Win32ServiceMessages() { +void SDL3ServiceMessages(void) { SDL_Event event; + while (SDL_PollEvent(&event)) { if (event.type == SDL_EVENT_MOUSE_MOTION) { gPD_mouse_position_x = event.motion.x; @@ -146,7 +147,7 @@ void Win32ServiceMessages() { } gKeyboardBuffer[gKeyboardBufferLength] = event.key.key; gKeyboardBufferLength++; - strncpy(buffer, gKeyboardBuffer, gKeyboardBufferLength); + strncpy(buffer, (char*)gKeyboardBuffer, gKeyboardBufferLength); buffer[gKeyboardBufferLength] = '\0'; DR_DPRINTF("KEY PRESSED, BUFFER NOW IS: '%s'", buffer); } @@ -256,7 +257,7 @@ char PDConvertToASCIILessThan128(char pChar) { int PDGetKeyboardCharacter(void) { int key; - Win32ServiceMessages(); + SDL3ServiceMessages(); if (gKeyboardBufferLength == 0) { return 0; } @@ -293,7 +294,7 @@ C2_NORETURN void PDShutdownSystem(void) { SDL_SetWindowFullscreen(g_SDL_Window, false); } dr_dprintf("Servicing messages..."); - Win32ServiceMessages(); + SDL3ServiceMessages(); dr_dprintf("Sending WM_SHOWWINDOW broadcast message..."); SDL_ShowWindow(g_SDL_Window); if (gIsFatalError) { @@ -378,7 +379,7 @@ void PDSetPalette(br_pixelmap *pixelmap) { } int PDServiceSystem(tU32 pTime_since_last_call) { - Win32ServiceMessages(); + SDL3ServiceMessages(); return 0; } @@ -629,7 +630,7 @@ void PDAllocateScreenAndBack(void) { dr_dprintf("%s: lock seldom", gScreen->identifier); } else { dr_dprintf("%s: lock often", gScreen->identifier); - gScreen_lock_often = 1; + gLock_often = 1; } gShadow_workaround = 1; /* Not 100% sure this is shadow related */ gEnable_texture_interpolation = 1; diff --git a/src/carma2/platform/sdl3/sdl3.h b/src/carma2/platform/sdl3/sdl3.h index d454beb3b9..2e297d7da9 100644 --- a/src/carma2/platform/sdl3/sdl3.h +++ b/src/carma2/platform/sdl3/sdl3.h @@ -114,4 +114,6 @@ extern void PDPageInProcessMemory(void); extern void PDDisposeActionReplayBuffer(void); +extern void SDL3ServiceMessages(void); + #endif /* REC2_SDL3_H */ diff --git a/src/carma2/platform/sdl3/sdl3_input.c b/src/carma2/platform/sdl3/sdl3_input.c index f10d689d34..43416ea1c7 100644 --- a/src/carma2/platform/sdl3/sdl3_input.c +++ b/src/carma2/platform/sdl3/sdl3_input.c @@ -216,7 +216,7 @@ void C2_HOOK_FASTCALL PDSetKeyArray(int *pKeys, int pMark) { int i; gKeys_pressed = 0; - Win32ServiceMessages(); + SDL3ServiceMessages(); keyboard_state = SDL_GetKeyboardState(&num_keys); for (i = 0; i < 151; i++) { int scan_code; @@ -370,4 +370,4 @@ int C2_HOOK_FASTCALL PDIsJoystickDPadEnabled(void) { tButtonJoystickInfo* C2_HOOK_FASTCALL PDGetCurrentJoystickData(void) { return NULL; -} \ No newline at end of file +} diff --git a/src/carma2/platform/win32/win32.c b/src/carma2/platform/win32/win32.c index ff2853ce7a..aed0284469 100644 --- a/src/carma2/platform/win32/win32.c +++ b/src/carma2/platform/win32/win32.c @@ -345,7 +345,7 @@ char C2_HOOK_FASTCALL PDConvertToASCIILessThan128(char pChar) { int C2_HOOK_FASTCALL PDGetKeyboardCharacter(void) { unsigned int key; - Win32ServiceMessages(); + SDL3ServiceMessages(); if (gKeyboardBufferLength != 0) { key = gKeyboardBuffer[0]; if (gKeyboardBufferLength > 1) { @@ -385,7 +385,7 @@ C2_NORETURN void C2_HOOK_FASTCALL PDShutdownSystem(void) { SetWindowPos(gHWnd, NULL, -100, -100, 64, 64, SWP_NOSENDCHANGING | SWP_NOACTIVATE | SWP_NOZORDER); } dr_dprintf("Servicing messages..."); - Win32ServiceMessages(); + SDL3ServiceMessages(); dr_dprintf("Sending WM_SHOWWINDOW broadcast message..."); SendMessageA(HWND_BROADCAST, WM_SHOWWINDOW, TRUE, 0); if (gIsFatalError) { @@ -637,7 +637,7 @@ void C2_HOOK_FASTCALL PDSetPalette(br_pixelmap *pixelmap) { // FUNCTION: CARMA2_HW 0x0051cbe0 int C2_HOOK_FASTCALL PDServiceSystem(tU32 pTime_since_last_call) { - Win32ServiceMessages(); + SDL3ServiceMessages(); return 0; } @@ -992,7 +992,7 @@ void C2_HOOK_FASTCALL PDAllocateScreenAndBack(void) { dr_dprintf("%s: lock seldom", gScreen->identifier); } else { dr_dprintf("%s: lock often", gScreen->identifier); - gScreen_lock_often = 1; + gLock_often = 1; } gShadow_workaround = 1; /* Not 100% sure this is shadow related */ gEnable_texture_interpolation = 1; diff --git a/src/carma2/platform/win32/win32_dinput.c b/src/carma2/platform/win32/win32_dinput.c index 9bbdce695e..920da4404f 100644 --- a/src/carma2/platform/win32/win32_dinput.c +++ b/src/carma2/platform/win32/win32_dinput.c @@ -1015,7 +1015,7 @@ void C2_HOOK_FASTCALL PDSetKeyArray(int* pKeys, int pMark) { int i; gKeys_pressed = 0; - Win32ServiceMessages(); + SDL3ServiceMessages(); if (gWindowActiveState != 2) { *pKeys = 0; return; diff --git a/src/carma2/platform/win32/win32_windows.c b/src/carma2/platform/win32/win32_windows.c index c46ad9af5f..14020ffdf0 100644 --- a/src/carma2/platform/win32/win32_windows.c +++ b/src/carma2/platform/win32/win32_windows.c @@ -10,7 +10,7 @@ #include // FUNCTION: CARMA2_HW 0x0051cad0 -void C2_HOOK_CDECL Win32ServiceMessages(void) { +void C2_HOOK_CDECL SDL3ServiceMessages(void) { MSG msg; dr_dprintf("Win32ServiceMessages() - START"); diff --git a/src/carma2/platform/win32/win32_windows.h b/src/carma2/platform/win32/win32_windows.h index 60ac7b1568..32ef0e5b96 100644 --- a/src/carma2/platform/win32/win32_windows.h +++ b/src/carma2/platform/win32/win32_windows.h @@ -3,6 +3,6 @@ #include "c2_hooks.h" -extern void C2_HOOK_CDECL Win32ServiceMessages(void); +extern void C2_HOOK_CDECL SDL3ServiceMessages(void); #endif