From fa610cc70ce7b0b9a45cf3e070d59d808c5c597b Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 17:16:06 +0200 Subject: [PATCH 01/20] Match DRSetPaletteEntries --- src/carma2/newcommon/18-graphics2.c | 26 +++++++++++++++++++++++++- src/carma2/newcommon/18-graphics2.h | 2 +- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/18-graphics2.c b/src/carma2/newcommon/18-graphics2.c index a8f0dd93d5..48877f0e16 100644 --- a/src/carma2/newcommon/18-graphics2.c +++ b/src/carma2/newcommon/18-graphics2.c @@ -62,7 +62,31 @@ 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; + +// FUNCTION: CARMA2_HW 0x004b4fd0 +void C2_HOOK_FASTCALL DRSetPaletteEntries(br_pixelmap* pPalette, int pFirst_colour, int pCount) { + + if (!pFirst_colour) { + ((br_int_32*)pPalette->pixels)[0] = 0; + } + memcpy(gCurrent_palette_pixels + 4 * pFirst_colour, (char*)pPalette->pixels + 4 * pFirst_colour, 4 * pCount); + gPalette_changed = 0; + if (!gFaded_palette) { + PDSetPaletteEntries(pPalette, pFirst_colour, pCount); + } + gPalette_munged = 1; +} // DRSetPalette3 diff --git a/src/carma2/newcommon/18-graphics2.h b/src/carma2/newcommon/18-graphics2.h index 72a6f1a205..daf15c3ac6 100644 --- a/src/carma2/newcommon/18-graphics2.h +++ b/src/carma2/newcommon/18-graphics2.h @@ -8,7 +8,7 @@ extern int gNoTransients; extern br_pixelmap* gRender_palette; extern int gDim_amount; -// DRSetPaletteEntries +extern void C2_HOOK_FASTCALL DRSetPaletteEntries(br_pixelmap* pPalette, int pFirst_colour, int pCount); // DRSetPalette3 From cad4cdaeaa8c7930e1f60396dae433f88d96c150 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 17:36:26 +0200 Subject: [PATCH 02/20] Match DRSetPalette --- src/carma2/newcommon/18-graphics2.c | 41 ++++++++++++++++++++++++----- src/carma2/newcommon/18-graphics2.h | 8 +++--- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/carma2/newcommon/18-graphics2.c b/src/carma2/newcommon/18-graphics2.c index 48877f0e16..f9e8e4b0fe 100644 --- a/src/carma2/newcommon/18-graphics2.c +++ b/src/carma2/newcommon/18-graphics2.c @@ -75,24 +75,51 @@ char* gCurrent_palette_pixels; int gFaded_palette; // FUNCTION: CARMA2_HW 0x004b4fd0 -void C2_HOOK_FASTCALL DRSetPaletteEntries(br_pixelmap* pPalette, int pFirst_colour, int pCount) { +void C2_HOOK_FASTCALL DRSetPaletteEntries(br_pixelmap* pThe_palette, int pFirst_colour, int pCount) { if (!pFirst_colour) { - ((br_int_32*)pPalette->pixels)[0] = 0; + ((br_int_32*)pThe_palette->pixels)[0] = 0; } - memcpy(gCurrent_palette_pixels + 4 * pFirst_colour, (char*)pPalette->pixels + 4 * pFirst_colour, 4 * pCount); + memcpy(gCurrent_palette_pixels + 4 * pFirst_colour, (char*)pThe_palette->pixels + 4 * pFirst_colour, 4 * pCount); gPalette_changed = 0; if (!gFaded_palette) { - PDSetPaletteEntries(pPalette, pFirst_colour, pCount); + PDSetPaletteEntries(pThe_palette, pFirst_colour, pCount); } gPalette_munged = 1; } -// DRSetPalette3 +void C2_HOOK_FASTCALL DRSetPalette3(br_pixelmap* pThe_palette, int pSet_current_palette) { -// DRSetPalette2 + 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; + } +} -// DRSetPalette +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 daf15c3ac6..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; -extern void C2_HOOK_FASTCALL DRSetPaletteEntries(br_pixelmap* pPalette, int pFirst_colour, int pCount); +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); From 7cf33af1a8bb05d55aa746d99f02bccf44e49b97 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 18:03:22 +0200 Subject: [PATCH 03/20] Implement InitializePalettes [accuracy=97.67%] --- src/carma2/newcommon/18-graphics2.c | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/carma2/newcommon/18-graphics2.c b/src/carma2/newcommon/18-graphics2.c index f9e8e4b0fe..1c5bdc6c11 100644 --- a/src/carma2/newcommon/18-graphics2.c +++ b/src/carma2/newcommon/18-graphics2.c @@ -74,6 +74,39 @@ 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; + +// 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) { From 7921b98d8c1e409d79597eba0687e59ebdbb3e36 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 18:31:55 +0200 Subject: [PATCH 04/20] Implement MungeCommas [accuracy=83.67%] --- src/carma2/newcommon/41-utility.c | 24 +++++++++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index b152f38b58..c21b1dfd49 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -553,7 +553,29 @@ 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; + + 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--) { + + 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; +} // MungeMetaCharacters diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 632a3b32fc..4c22906e74 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -201,7 +201,7 @@ extern void C2_HOOK_FASTCALL WhitenVertexRGB(br_model** pModels, int pCount); // GetBlenficatiousnessOfMaterial -// MungeCommas +extern char* C2_HOOK_FASTCALL MungeCommas(int pValue); // MungeMetaCharacters From 83a1a0eb8ed190c3a4fdf5b51fa9b9f905e7aef8 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 19:36:40 +0200 Subject: [PATCH 05/20] Implement MungeMetaCharacters [accuracy=64.86%] --- src/carma2/common/frontend.c | 4 ++-- src/carma2/common/frontend.h | 4 ++-- src/carma2/newcommon/41-utility.c | 19 ++++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/carma2/common/frontend.c b/src/carma2/common/frontend.c index 9d93a13e0d..1c1e91a7a0 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; diff --git a/src/carma2/common/frontend.h b/src/carma2/common/frontend.h index 982c63b2b4..2bf08dbe26 100644 --- a/src/carma2/common/frontend.h +++ b/src/carma2/common/frontend.h @@ -164,7 +164,7 @@ 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); @@ -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/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index c21b1dfd49..2b8c154282 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -577,7 +577,24 @@ char* C2_HOOK_FASTCALL MungeCommas(int pValue) { return result_buffer; } -// MungeMetaCharacters +// FUNCTION: CARMA2_HW 0x00518fa0 +void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pMeta, const char* pRepl) { + int len_text; + int len_repl; + int i; + + len_text = strlen(pText); + len_repl = strlen(pRepl); + + 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; + } + } +} // MungeMetaCharactersChar diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 4c22906e74..12cd3f5ab3 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -203,7 +203,7 @@ extern void C2_HOOK_FASTCALL WhitenVertexRGB(br_model** pModels, int pCount); extern char* C2_HOOK_FASTCALL MungeCommas(int pValue); -// MungeMetaCharacters +extern void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pMeta, const char* pRepl); // MungeMetaCharactersChar From c84afd1fe49d01045753f4112950bbe862d5e447 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 19:41:28 +0200 Subject: [PATCH 06/20] Implement MungeMetaCharactersChar [accuracy=35.37%] --- src/carma2/newcommon/41-utility.c | 9 ++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 2b8c154282..7b9abe8d8d 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -596,7 +596,14 @@ void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pMeta, const char* p } } -// MungeMetaCharactersChar +// FUNCTION: CARMA2_HW 0x00519040 +void C2_HOOK_FASTCALL MungeMetaCharactersChar(char* pText, char pKey, char pChar) { + char repl[2]; + + repl[1] = '\0'; + repl[0] = pChar; + MungeMetaCharacters(pText, pKey, &pChar); +} // MungeMetaCharactersNum diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 12cd3f5ab3..d8f479dac0 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -205,7 +205,7 @@ extern char* C2_HOOK_FASTCALL MungeCommas(int pValue); extern void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pMeta, const char* pRepl); -// MungeMetaCharactersChar +extern void C2_HOOK_FASTCALL MungeMetaCharactersChar(char* pText, char pKey, char pChar); // MungeMetaCharactersNum From fc633cdea91a72e410d6764b93cf0b14b4b6cdca Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 19:46:15 +0200 Subject: [PATCH 07/20] Implement MungeMetaCharactersNum [accuracy=53.99%] --- src/carma2/common/frontend.c | 8 ++++---- src/carma2/common/frontend.h | 4 ++-- src/carma2/newcommon/41-utility.c | 12 +++++++++--- src/carma2/newcommon/41-utility.h | 4 ++-- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/carma2/common/frontend.c b/src/carma2/common/frontend.c index 1c1e91a7a0..bdb1453ad6 100644 --- a/src/carma2/common/frontend.c +++ b/src/carma2/common/frontend.c @@ -2429,17 +2429,17 @@ void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pMeta, const char* p } // 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 2bf08dbe26..6c7e82ee62 100644 --- a/src/carma2/common/frontend.h +++ b/src/carma2/common/frontend.h @@ -166,9 +166,9 @@ void C2_HOOK_FASTCALL KillAPOactor(br_actor* pActor); 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); diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 7b9abe8d8d..dd7749f21b 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -597,15 +597,21 @@ void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pMeta, const char* p } // 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) { char repl[2]; repl[1] = '\0'; repl[0] = pChar; - MungeMetaCharacters(pText, pKey, &pChar); + MungeMetaCharacters(pText, pMeta, &pChar); } -// MungeMetaCharactersNum +// 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); +} // DrPixelmapRectangleCopyPossibleLock diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index d8f479dac0..6660acd43f 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -205,9 +205,9 @@ extern char* C2_HOOK_FASTCALL MungeCommas(int pValue); extern void C2_HOOK_FASTCALL MungeMetaCharacters(char* pText, char pMeta, const char* pRepl); -extern void C2_HOOK_FASTCALL MungeMetaCharactersChar(char* pText, char pKey, char pChar); +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 From e1d5dd8d2921be9681b2c7f8eca2daaec5923e89 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 20:08:47 +0200 Subject: [PATCH 08/20] Match PixelmapSwapByteOrder --- src/carma2/newcommon/41-utility.c | 24 ++++++++++++++++++++++-- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index dd7749f21b..147d05760d 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -8,8 +8,8 @@ #include "70-packfile.h" #include "globvars.h" #include "platform.h" - #include "c2_string.h" + #include @@ -615,7 +615,27 @@ void C2_HOOK_FASTCALL MungeMetaCharactersNum(char* pText, char pMeta, int pNum) // DrPixelmapRectangleCopyPossibleLock -// PixelmapSwapByteOrder +// FUNCTION: CARMA2_HW 0x005191f0 +void C2_HOOK_FASTCALL PixelmapSwapByteOrder(br_pixelmap* pMap) { + +#if 0 // FIXME: introduce endian.h-like rec2_endian.h heder + 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 6660acd43f..20913bef5d 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -211,7 +211,7 @@ extern void C2_HOOK_FASTCALL MungeMetaCharactersNum(char* pText, char pMeta, int // DrPixelmapRectangleCopyPossibleLock -// PixelmapSwapByteOrder +extern void C2_HOOK_FASTCALL PixelmapSwapByteOrder(br_pixelmap* pMap); extern void C2_HOOK_FASTCALL EnsurePixelmapAllowed(br_pixelmap* pMap, undefined4 pArg2); From 48f07921a034f7a6f6a03c8712933a7dd6c6e9ee Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 20:17:21 +0200 Subject: [PATCH 09/20] Implement DrPixelmapRectangleCopyPossibleLock --- src/carma2/common/globvars.c | 2 +- src/carma2/common/globvars.h | 2 +- src/carma2/newcommon/41-utility.c | 13 +++++++++++-- src/carma2/newcommon/41-utility.h | 2 +- src/carma2/newcommon/globvars.c | 2 +- src/carma2/newcommon/globvars.h | 2 +- src/carma2/platform/sdl3/sdl3.c | 2 +- src/carma2/platform/win32/win32.c | 2 +- 8 files changed, 18 insertions(+), 9 deletions(-) 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/41-utility.c b/src/carma2/newcommon/41-utility.c index 147d05760d..56c0b94242 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -602,7 +602,7 @@ void C2_HOOK_FASTCALL MungeMetaCharactersChar(char* pText, char pMeta, char pCha repl[1] = '\0'; repl[0] = pChar; - MungeMetaCharacters(pText, pMeta, &pChar); + MungeMetaCharacters(pText, pMeta, repl); } // FUNCTION: CARMA2_HW 0x005190f0 @@ -613,7 +613,16 @@ void C2_HOOK_FASTCALL MungeMetaCharactersNum(char* pText, char pMeta, int pNum) MungeMetaCharacters(pText, pMeta, text); } -// DrPixelmapRectangleCopyPossibleLock +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) { diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 20913bef5d..2ff9c29471 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -209,7 +209,7 @@ extern void C2_HOOK_FASTCALL MungeMetaCharactersChar(char* pText, char pMeta, ch 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); extern void C2_HOOK_FASTCALL PixelmapSwapByteOrder(br_pixelmap* pMap); 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..d7bc92ee0e 100644 --- a/src/carma2/platform/sdl3/sdl3.c +++ b/src/carma2/platform/sdl3/sdl3.c @@ -629,7 +629,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/win32/win32.c b/src/carma2/platform/win32/win32.c index ff2853ce7a..e7c1bf0daf 100644 --- a/src/carma2/platform/win32/win32.c +++ b/src/carma2/platform/win32/win32.c @@ -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; From 4176cb33cfdf63572eaaf95465a4507f43045a0b Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 20:35:29 +0200 Subject: [PATCH 10/20] Match CheckQuit --- src/carma2/newcommon/41-utility.c | 28 ++++++++++++++++++++++++++-- src/carma2/newcommon/42-input.c | 10 ++++++++-- src/carma2/newcommon/42-input.h | 4 ++-- src/carma2/newcommon/44-mainmenu.c | 5 ++++- src/carma2/newcommon/44-mainmenu.h | 4 +++- 5 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 56c0b94242..8b6c1c7a5e 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -3,6 +3,9 @@ #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" @@ -52,7 +55,28 @@ 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; +} // sqr @@ -627,7 +651,7 @@ void C2_HOOK_FASTCALL DrPixelmapRectangleCopyPossibleLock(br_pixelmap* dst, br_i // FUNCTION: CARMA2_HW 0x005191f0 void C2_HOOK_FASTCALL PixelmapSwapByteOrder(br_pixelmap* pMap) { -#if 0 // FIXME: introduce endian.h-like rec2_endian.h heder +#if 0 // FIXME: introduce endian.h-like rec2_endian.h header br_uint_16 y; br_uint_8* row_ptr; br_colour* ptr; 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 From e742931bc380bff78a620a55cb1f519d6decfb97 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 20:36:41 +0200 Subject: [PATCH 11/20] Match sqr --- src/carma2/newcommon/41-utility.c | 6 +++++- src/carma2/newcommon/41-utility.h | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 8b6c1c7a5e..07d2c4530e 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -78,7 +78,11 @@ int C2_HOOK_FASTCALL CheckQuit(void) { return result; } -// sqr +// FUNCTION: CARMA2_HW 0x00513510 +double C2_HOOK_FASTCALL sqr(double pN) { + + return pN * pN; +} // FUNCTION: CARMA2_HW 0x00513520 int C2_HOOK_FASTCALL IRandomBetween(int pA, int pB) { diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 2ff9c29471..adc343c858 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); From e108778166130d217d5284050e1eb4ea634f0fe6 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 20:42:55 +0200 Subject: [PATCH 12/20] Get game building on Linux again No, it does not run (yet) --- reccmp-project.yml | 2 ++ src/carma2/platform/sdl3/sdl3.c | 11 ++++++----- src/carma2/platform/sdl3/sdl3.h | 2 ++ src/carma2/platform/sdl3/sdl3_input.c | 4 ++-- src/carma2/platform/win32/win32.c | 6 +++--- src/carma2/platform/win32/win32_dinput.c | 2 +- src/carma2/platform/win32/win32_windows.c | 2 +- src/carma2/platform/win32/win32_windows.h | 2 +- 8 files changed, 18 insertions(+), 13 deletions(-) diff --git a/reccmp-project.yml b/reccmp-project.yml index e8f3b89936..056ce368e4 100644 --- a/reccmp-project.yml +++ b/reccmp-project.yml @@ -1,5 +1,6 @@ targets: CARMA2_HW: + icon: reccmp/icons/unknown.png filename: CARMA2_HW.EXE source_root: - src/brender @@ -18,6 +19,7 @@ targets: hash: sha256: 5722433d8b66f9b613a399618e48ff27256eb396cce8b9fa2a3032b91c32b55c LAUNCHER: + icon: reccmp/icons/carma2.png filename: carma2.exe source_root: src/launcher hash: diff --git a/src/carma2/platform/sdl3/sdl3.c b/src/carma2/platform/sdl3/sdl3.c index d7bc92ee0e..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; } 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 e7c1bf0daf..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; } 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 From 7b7f919bec2688510047eb0bb3d118b8b261f4c6 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 20:44:22 +0200 Subject: [PATCH 13/20] Match CompareActorID --- src/carma2/newcommon/41-utility.c | 10 +++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 07d2c4530e..6725e70c33 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -263,7 +263,15 @@ 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) { + + if (pActor->identifier != NULL && strcmp(pActor->identifier, (const char*)pArg) == 0) { + return (intptr_t)pActor; + } else { + return 0; + } +} // DRActorFindRecurse diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index adc343c858..793b53fb7d 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -53,7 +53,7 @@ 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 From 8d4994e7baa3d6d00326753a3b8f3cf73983697b Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 20:45:18 +0200 Subject: [PATCH 14/20] Match DRActorFindRecurse --- src/carma2/newcommon/41-utility.c | 6 +++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 6725e70c33..8bcf4e3b5a 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -273,7 +273,11 @@ intptr_t C2_HOOK_CDECL CompareActorID(br_actor* pActor, void* pArg) { } } -// DRActorFindRecurse +// 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); +} // DRActorEnumRecurseWithMat diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 793b53fb7d..d75831ca9f 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -55,7 +55,7 @@ extern intptr_t DRActorEnumRecurse(br_actor* pActor, br_actor_enum_cbfn* callbac 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 From c24235dd234b81ae00e7e04bdf09855ff47799bc Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 20:46:59 +0200 Subject: [PATCH 15/20] Match DRActorEnumRecurseWithMat --- src/carma2/newcommon/41-utility.c | 20 +++++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 8bcf4e3b5a..5326492fec 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -279,7 +279,25 @@ br_actor* C2_HOOK_FASTCALL DRActorFindRecurse(br_actor* pSearch_root, const char return (br_actor*)DRActorEnumRecurse(pSearch_root, CompareActorID, (void*)pName); } -// DRActorEnumRecurseWithMat +// 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; + + 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 diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index d75831ca9f..cc20b566d1 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -57,7 +57,7 @@ extern intptr_t C2_HOOK_CDECL CompareActorID(br_actor* pActor, void* pArg); 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 From 2d6fed669cac5c795ea2c7127510961dea80441a Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 20:49:41 +0200 Subject: [PATCH 16/20] Match DRActorEnumRecurseWithTrans --- src/carma2/newcommon/41-utility.c | 23 ++++++++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 5326492fec..95eede212a 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -299,7 +299,28 @@ br_uint_32 C2_HOOK_FASTCALL DRActorEnumRecurseWithMat(br_actor* pActor, br_mater 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 diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index cc20b566d1..aa0bed929b 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -59,7 +59,7 @@ extern br_actor* C2_HOOK_FASTCALL DRActorFindRecurse(br_actor* pSearch_root, con 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 From ac2f7255cc6b3aa112512a1c066d8cbc88db03fb Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 20:50:10 +0200 Subject: [PATCH 17/20] icons are not in reccmp test --- reccmp-project.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/reccmp-project.yml b/reccmp-project.yml index 056ce368e4..e8f3b89936 100644 --- a/reccmp-project.yml +++ b/reccmp-project.yml @@ -1,6 +1,5 @@ targets: CARMA2_HW: - icon: reccmp/icons/unknown.png filename: CARMA2_HW.EXE source_root: - src/brender @@ -19,7 +18,6 @@ targets: hash: sha256: 5722433d8b66f9b613a399618e48ff27256eb396cce8b9fa2a3032b91c32b55c LAUNCHER: - icon: reccmp/icons/carma2.png filename: carma2.exe source_root: src/launcher hash: From 952f44800c6893837a2023a2f6a256677bfbd2d9 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 21:02:43 +0200 Subject: [PATCH 18/20] Match DRMaterialClone --- src/carma2/newcommon/41-utility.c | 32 ++++++++++++++++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 95eede212a..ad3e4702a4 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -382,7 +382,37 @@ void C2_HOOK_FASTCALL PossibleService(void) { // 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) { diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index aa0bed929b..b86da3cd76 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -107,7 +107,7 @@ extern void C2_HOOK_FASTCALL PossibleService(void); // 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); From 3e8b67d05ae09cfa021b8dde252084191f45ccbd Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 21:20:32 +0200 Subject: [PATCH 19/20] Implement DRMatrix34TApplyP [accuracy=56.25%] --- CMakeLists.txt | 4 ++-- src/carma2/newcommon/41-utility.c | 15 ++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) 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/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index ad3e4702a4..1c41702063 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -376,7 +376,20 @@ 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 diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index b86da3cd76..7f48fa9bd1 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -101,7 +101,7 @@ 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 From 09ebee0aeb63275e29600c16b7732e0724fdce89 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 11 Jun 2026 21:33:29 +0200 Subject: [PATCH 20/20] Simplify RevealStoredTransparentTextures (no change) --- src/carma2/newcommon/17-world2.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) 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);