From 641a452a186edeffd2d322006c72103998cbf1f7 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 08:58:04 +0200 Subject: [PATCH 01/34] Implement CloneActor --- src/carma2/newcommon/41-utility.c | 21 ++++++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 1c41702063..a461517f59 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -458,10 +458,29 @@ void C2_HOOK_FASTCALL DRstrlwr(char* s) { // FUNCTION: CARMA2_HW 0x00515950 int C2_HOOK_FASTCALL PDCheckDriveExists(const char* pThe_path) { + return PDCheckDriveExists2(pThe_path, NULL, 0); } -// CloneActor +br_actor* C2_HOOK_FASTCALL CloneActor(br_actor* pActor) { + br_actor *clone; + br_actor *child; + + clone = BrActorAllocate(pActor->type, pActor->type_data); + clone->model = pActor->model; + clone->material = pActor->material; + if (pActor->identifier != NULL) { + if (clone->identifier != NULL) { + BrResFree(clone->identifier); + } + clone->identifier = BrResStrDup(clone, pActor->identifier);; + } + clone->t = pActor->t; + for (child = pActor->children; child != NULL; child = child->next) { + BrActorAdd(clone, CloneActor(child)); + } + return clone; +} // CalcActorGlobalPos diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 7f48fa9bd1..cf158fbff7 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -115,7 +115,7 @@ extern void C2_HOOK_FASTCALL DRstrlwr(char* s); int C2_HOOK_FASTCALL PDCheckDriveExists(const char* pThe_path); -// CloneActor +br_actor* C2_HOOK_FASTCALL CloneActor(br_actor* pActor); // CalcActorGlobalPos From b014dac4032f729689d708aa480bf18be9f928bb Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 09:03:43 +0200 Subject: [PATCH 02/34] Implement CalcActorGlobalPos [accuracy=96.15%] --- src/carma2/newcommon/41-utility.c | 15 ++++++++++++++- src/carma2/newcommon/41-utility.h | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index a461517f59..17a6c4510e 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -482,7 +482,20 @@ br_actor* C2_HOOK_FASTCALL CloneActor(br_actor* pActor) { return clone; } -// CalcActorGlobalPos +// FUNCTION: CARMA2_HW 0x00515b80 +void C2_HOOK_FASTCALL CalcActorGlobalPos(br_vector3* pResult, br_actor* pActor) { + br_vector3 tv; + + BrVector3Set(pResult, 0.0f, 0.0f, 0.0f); + for (;pActor != NULL && pActor != gNon_track_actor; pActor = pActor->parent) { + if (pActor->t.t.mat.m[0][0] == 1.0f) { + BrVector3Accumulate(pResult, &pActor->t.t.translate.t); + } else { + BrMatrix34ApplyP(&tv, pResult, &pActor->t.t.mat); + BrVector3Accumulate(pResult, &tv); + } + } +} // frac diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index cf158fbff7..1a4969c7c7 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -115,9 +115,9 @@ extern void C2_HOOK_FASTCALL DRstrlwr(char* s); int C2_HOOK_FASTCALL PDCheckDriveExists(const char* pThe_path); -br_actor* C2_HOOK_FASTCALL CloneActor(br_actor* pActor); +extern br_actor* C2_HOOK_FASTCALL CloneActor(br_actor* pActor); -// CalcActorGlobalPos +extern void C2_HOOK_FASTCALL CalcActorGlobalPos(br_vector3* pResult, br_actor* pActor); // frac From e8957acd4452516c4697fcacb2130f3b29584dc5 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 09:04:53 +0200 Subject: [PATCH 03/34] Match frac --- 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 17a6c4510e..6b4d6a39e9 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -497,7 +497,11 @@ void C2_HOOK_FASTCALL CalcActorGlobalPos(br_vector3* pResult, br_actor* pActor) } } -// frac +// FUNCTION: CARMA2_HW 0x00515c20 +float C2_HOOK_STDCALL frac(float pN) { + + return pN - (float)(int)pN; +} // FindMaterialCB diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 1a4969c7c7..41390a0dbf 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -119,7 +119,7 @@ extern br_actor* C2_HOOK_FASTCALL CloneActor(br_actor* pActor); extern void C2_HOOK_FASTCALL CalcActorGlobalPos(br_vector3* pResult, br_actor* pActor); -// frac +extern float C2_HOOK_STDCALL frac(float pN); // FindMaterialCB From a42ab906d81da62840b61b693f1df4f1cd7cd871 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 09:09:09 +0200 Subject: [PATCH 04/34] Match FindMaterialCB --- src/carma2/newcommon/41-utility.c | 22 +++++++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 6b4d6a39e9..fa03262efb 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -503,7 +503,27 @@ float C2_HOOK_STDCALL frac(float pN) { return pN - (float)(int)pN; } -// FindMaterialCB +// FUNCTION: CARMA2_HW 0x00515d90 +intptr_t C2_HOOK_CDECL FindMaterialCB(br_actor* pActor, void* data) { + const char* name = data; + br_model* model = pActor->model; + br_face *face; + int face_i; + + if (model != NULL) { + + face = model->faces; + for (face_i = 0; face_i < model->nfaces; face_i++, face++) { + + if (face->material != NULL + && face->material->identifier != NULL + && strcmp(face->material->identifier, name) == 0) { + return (intptr_t)face->material; + } + } + } + return (intptr_t)NULL; +} // FindMaterial diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 41390a0dbf..b4a8bdea9b 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -121,7 +121,7 @@ extern void C2_HOOK_FASTCALL CalcActorGlobalPos(br_vector3* pResult, br_actor* p extern float C2_HOOK_STDCALL frac(float pN); -// FindMaterialCB +extern intptr_t C2_HOOK_CDECL FindMaterialCB(br_actor* pActor, void* data); // FindMaterial From f72c2a3bb25b844336dc66b99bf2f5261e0df03d Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 09:10:07 +0200 Subject: [PATCH 05/34] Match FindMaterial --- 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 fa03262efb..b55fbad62c 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -525,7 +525,15 @@ intptr_t C2_HOOK_CDECL FindMaterialCB(br_actor* pActor, void* data) { return (intptr_t)NULL; } -// FindMaterial +// FUNCTION: CARMA2_HW 0x00515c40 +br_material* C2_HOOK_FASTCALL FindMaterial(const char* pName, br_actor* pActor, int pRecursive) { + + if (pRecursive) { + return (br_material*)DRActorEnumRecurse(pActor, FindMaterialCB, (void*)pName); + } else { + return (br_material*)FindMaterialCB(pActor, (void*)pName); + } +} // BlendifyMaterialTablishly diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index b4a8bdea9b..64197c8f20 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -123,7 +123,7 @@ extern float C2_HOOK_STDCALL frac(float pN); extern intptr_t C2_HOOK_CDECL FindMaterialCB(br_actor* pActor, void* data); -// FindMaterial +extern br_material* C2_HOOK_FASTCALL FindMaterial(const char* pName, br_actor* pActor, int pRecursive); // BlendifyMaterialTablishly From 93448810dc0b39ce8ac3b32d98eb9fdf55d76ae0 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 09:12:05 +0200 Subject: [PATCH 06/34] Match LoadShadeTable --- src/carma2/newcommon/63-loading3.c | 9 ++++++++- src/carma2/newcommon/63-loading3.h | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/63-loading3.c b/src/carma2/newcommon/63-loading3.c index 53879d119c..1cd6df468c 100644 --- a/src/carma2/newcommon/63-loading3.c +++ b/src/carma2/newcommon/63-loading3.c @@ -111,7 +111,14 @@ br_pixelmap* C2_HOOK_FASTCALL LoadPixelmap(const char* pPath_name) { return pm; } -// LoadShadeTable +// FUNCTION: CARMA2_HW 0x0048ef40 +br_pixelmap* C2_HOOK_FASTCALL LoadShadeTable(const char* pName) { + tPath_name the_path; + + PathCat(the_path, gApplication_path, "SHADETAB"); + PathCat(the_path, the_path, pName); + return BrPixelmapLoad(the_path); +} // LoadMaterial diff --git a/src/carma2/newcommon/63-loading3.h b/src/carma2/newcommon/63-loading3.h index f498ef6935..c15a45a1b5 100644 --- a/src/carma2/newcommon/63-loading3.h +++ b/src/carma2/newcommon/63-loading3.h @@ -15,7 +15,7 @@ extern br_pixelmap* C2_HOOK_FASTCALL RealLoadPixelmap(const char* pPath_name); extern br_pixelmap* C2_HOOK_FASTCALL LoadPixelmap(const char* pPath_name); -// LoadShadeTable +extern br_pixelmap* C2_HOOK_FASTCALL LoadShadeTable(const char* pName); // LoadMaterial From d87d55abdf3bda180025729a0d13344cf1eec909 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 09:15:52 +0200 Subject: [PATCH 07/34] Match LoadSingleShadeTable --- src/carma2/newcommon/28-world3.c | 28 +++++++++++++++++++++++++++- src/carma2/newcommon/28-world3.h | 2 +- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/28-world3.c b/src/carma2/newcommon/28-world3.c index 5b6ae434dc..dcd5c1f2c0 100644 --- a/src/carma2/newcommon/28-world3.c +++ b/src/carma2/newcommon/28-world3.c @@ -259,7 +259,33 @@ int C2_HOOK_FASTCALL AddPixelmaps(tBrender_storage* pStorage_space, const char* // LoadSinglePixelmap -// LoadSingleShadeTable +// FUNCTION: CARMA2_HW 0x005016a0 +br_pixelmap* C2_HOOK_FASTCALL LoadSingleShadeTable(tBrender_storage* pStorage_space, const char* pName) { + br_pixelmap* temp; + + temp = LoadShadeTable(pName); + if (temp == NULL) { + return BrTableFind(pName); + } + + switch (AddShadeTableToStorage(pStorage_space, temp)) { + case eStorage_allocated: + BrTableAdd(temp); + return temp; + case eStorage_duplicate: + if (gDisallow_duplicates) { + FatalError(kFatalError_DuplicatePixelmap_S, temp->identifier); + } else { + BrPixelmapFree(temp); + } + return BrTableFind(pName); + case eStorage_not_enough_room: + FatalError(kFatalError_InsufficientShadeTableSlots); + break; + } + + return NULL; +} // LoadSingleMaterial diff --git a/src/carma2/newcommon/28-world3.h b/src/carma2/newcommon/28-world3.h index 3eaeb0e60b..a2b73e6b0f 100644 --- a/src/carma2/newcommon/28-world3.h +++ b/src/carma2/newcommon/28-world3.h @@ -74,7 +74,7 @@ extern int C2_HOOK_FASTCALL AddPixelmaps(tBrender_storage* pStorage_space, const // LoadSinglePixelmap -// LoadSingleShadeTable +extern br_pixelmap* C2_HOOK_FASTCALL LoadSingleShadeTable(tBrender_storage* pStorage_space, const char* pName); // LoadSingleMaterial From 9db421b02c63886b084d5a2887bd9db206bd8ee2 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 09:50:05 +0200 Subject: [PATCH 08/34] Implement BlendifyMaterial [accuracy=92.31%] --- src/carma2/newcommon/41-utility.c | 78 +++++++++++++++++++++++++++++-- src/carma2/newcommon/41-utility.h | 6 +-- 2 files changed, 77 insertions(+), 7 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index b55fbad62c..e629a31009 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -2,6 +2,7 @@ #include "01-network.h" #include "02-init.h" +#include "28-world3.h" #include "18-graphics2.h" #include "40-main.h" #include "42-input.h" @@ -535,11 +536,80 @@ br_material* C2_HOOK_FASTCALL FindMaterial(const char* pName, br_actor* pActor, } } -// BlendifyMaterialTablishly +void C2_HOOK_FASTCALL BlendifyMaterialTablishly(br_material* pMaterial, int pPercent) { + char* s; -// BlendifyMaterialPrimitively - -// BlendifyMaterial + if (pPercent != 0 && pPercent != 100) { + switch (pPercent) { + case 25: + s = "BLEND25.TAB"; + break; + case 50: + s = "BLEND50.TAB"; + break; + case 75: + s = "BLEND75.TAB"; + break; + default: + return; + } + pMaterial->index_blend = BrTableFind(s); + if (pMaterial->index_blend == NULL) { + pMaterial->index_blend = LoadSingleShadeTable(&gTrack_storage_space, s); + } + } else { + pMaterial->index_blend = NULL; + } +} + +void C2_HOOK_FASTCALL BlendifyMaterialPrimitively(br_material* pMaterial, int pPercent) { + + // GLOBAL: CARMA2_HW 0x00661688 + static br_token_value alpha25[] = { + { BRT_BLEND_B, { /*.b = */ 1 } }, + { BRT_OPACITY_X, { /*.x = */ BR_FIXED_INT(0x40) } }, + { 0 }, + }; + // GLOBAL: CARMA2_HW 0x006616a0 + static br_token_value alpha50[] = { + { BRT_BLEND_B, { /*.b = */ 1 } }, + { BRT_OPACITY_X, { /*.x = */ BR_FIXED_INT(0x80) } }, + { 0 }, + }; + // GLOBAL: CARMA2_HW 0x006616b8 + static br_token_value alpha75[] = { + { BRT_BLEND_B, { /*.b = */ 1 } }, + { BRT_OPACITY_X, { /*.x = */ BR_FIXED_INT(0xc0) } }, + { 0 }, + }; + + switch (pPercent) { + case 25: + pMaterial->extra_prim = alpha25; + break; + case 50: + pMaterial->extra_prim = alpha50; + break; + case 75: + pMaterial->extra_prim = alpha75; + break; + case 0: + case 100: + pMaterial->extra_prim = NULL; + break; + } +} + +// FUNCTION: CARMA2_HW 0x00515e70 +void C2_HOOK_FASTCALL BlendifyMaterial(br_material* pMaterial, int pPercent) { + br_uint_8 pixel_format = gScreen->type; + + if (pixel_format == BR_PMT_INDEX_8) { + BlendifyMaterialTablishly(pMaterial, pPercent); + } else { + BlendifyMaterialPrimitively(pMaterial, pPercent); + } +} // DRModelUpdateAndKevificateMaterials diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 64197c8f20..55eb094d37 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -125,11 +125,11 @@ extern intptr_t C2_HOOK_CDECL FindMaterialCB(br_actor* pActor, void* data); extern br_material* C2_HOOK_FASTCALL FindMaterial(const char* pName, br_actor* pActor, int pRecursive); -// BlendifyMaterialTablishly +extern void C2_HOOK_FASTCALL BlendifyMaterialTablishly(br_material* pMaterial, int pPercent); -// BlendifyMaterialPrimitively +extern void C2_HOOK_FASTCALL BlendifyMaterialPrimitively(br_material* pMaterial, int pPercent); -// BlendifyMaterial +extern void C2_HOOK_FASTCALL BlendifyMaterial(br_material* pMaterial, int pPercent); // DRModelUpdateAndKevificateMaterials From 9c4fc51438c3dac1e0d6a43529e1ea2ffd412473 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 09:52:54 +0200 Subject: [PATCH 09/34] Match DRModelUpdateAndKevificateMaterials --- 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 e629a31009..37a9b607ca 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -12,6 +12,8 @@ #include "70-packfile.h" #include "globvars.h" #include "platform.h" +#include "rec2_macros.h" + #include "c2_string.h" #include @@ -611,7 +613,23 @@ void C2_HOOK_FASTCALL BlendifyMaterial(br_material* pMaterial, int pPercent) { } } -// DRModelUpdateAndKevificateMaterials +// FUNCTION: CARMA2_HW 0x00515fa0 +void C2_HOOK_FASTCALL DRModelUpdateAndKevificateMaterials(br_model* pModel, br_uint_16 pFlags) { + int i; + v11group* v11g; + + C2_HOOK_BUG_ON(sizeof(v11group) != 0x24); + + if (pModel->nvertices != 0 && pModel->nfaces != 0) { + + BrModelUpdate(pModel, pFlags); + for (i = 0; i < V11MODEL(pModel)->ngroups; i++) { + + v11g = &V11MODEL(pModel)->groups[i]; + *v11g->face_colours.materials = pModel->faces[*v11g->face_user].material; + } + } +} // DRModelUpdateDeluxTurbo diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 55eb094d37..08f1aef15d 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -131,7 +131,7 @@ extern void C2_HOOK_FASTCALL BlendifyMaterialPrimitively(br_material* pMaterial, extern void C2_HOOK_FASTCALL BlendifyMaterial(br_material* pMaterial, int pPercent); -// DRModelUpdateAndKevificateMaterials +extern void C2_HOOK_FASTCALL DRModelUpdateAndKevificateMaterials(br_model* pModel, br_uint_16 pFlags); // DRModelUpdateDeluxTurbo From 448bab846809a79effc49768041b6cd8e510eba1 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 09:59:04 +0200 Subject: [PATCH 10/34] Match PaletteEntry16Bit --- src/carma2/newcommon/41-utility.c | 26 +++++++++++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 37a9b607ca..079ffc9d7c 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -7,6 +7,7 @@ #include "40-main.h" #include "42-input.h" #include "44-mainmenu.h" +#include "52-errors.h" #include "63-loading3.h" #include "69-sound.h" #include "70-packfile.h" @@ -669,7 +670,30 @@ int C2_HOOK_FASTCALL PossibleUnlock(int pValue) { return 0; } -// PaletteEntry16Bit +// FUNCTION: CARMA2_HW 0x00516fd0 +tU16 C2_HOOK_FASTCALL PaletteEntry16Bit(br_pixelmap* pPal, int pEntry) { + tU32* src_entry; + int red; + int green; + int blue; + + src_entry = pPal->pixels; + switch (gBack_screen->type) { + default: + BrFailure("Unsupported back buffer type."); + return 0; + case BR_PMT_RGB_565: + red = (src_entry[pEntry] >> 8) & 0xf800; + green = (src_entry[pEntry] >> 5) & 0x07e0; + blue = (src_entry[pEntry] >> 3) & 0x001f; + return red | green | blue; + case BR_PMT_RGB_555: + red = (src_entry[pEntry] >> 9) & 0x7c00; + green = (src_entry[pEntry] >> 6) & 0x03e0; + blue = (src_entry[pEntry] >> 3) & 0x001f; + return red | green | blue; + } +} // Colour24BitTo16Bit diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 08f1aef15d..415cf1a2f9 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -167,7 +167,7 @@ extern void C2_HOOK_FASTCALL DRModelUpdateAndKevificateMaterials(br_model* pMode extern int C2_HOOK_FASTCALL PossibleUnlock(int pValue); -// PaletteEntry16Bit +extern tU16 C2_HOOK_FASTCALL PaletteEntry16Bit(br_pixelmap* pPal, int pEntry); // Colour24BitTo16Bit From 55f6fb9cbbe94ef3a3548d71e37dea5c7b8eb916 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 10:10:11 +0200 Subject: [PATCH 11/34] Implement PaletteOf16Bits [match=76.19%] --- src/carma2/newcommon/18-graphics2.h | 1 + src/carma2/newcommon/41-utility.c | 28 +++++++++++++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/18-graphics2.h b/src/carma2/newcommon/18-graphics2.h index 67c2575fb8..b34d488330 100644 --- a/src/carma2/newcommon/18-graphics2.h +++ b/src/carma2/newcommon/18-graphics2.h @@ -7,6 +7,7 @@ extern int gNoTransients; extern br_pixelmap* gRender_palette; extern int gDim_amount; +extern int gPalette_changed; extern void C2_HOOK_FASTCALL DRSetPaletteEntries(br_pixelmap* pThe_palette, int pFirst_colour, int pCount); diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 079ffc9d7c..e6737f575b 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -29,6 +29,12 @@ char* gMisc_strings[300]; // GLOBAL: CARMA2_HW 0x0074ca04 tMaterial_exception* gMaterial_exceptions; +// GLOBAL: CARMA2_HW 0x006b63f4 +br_pixelmap* g16bit_palette; + +// GLOBAL: CARMA2_HW 0x006b63f0 +br_pixelmap* gPalette_source; + // FUNCTION: CARMA2_HW 0x00513400 br_error C2_HOOK_FASTCALL DRBrEnd(void) { br_device *dev; @@ -697,7 +703,27 @@ tU16 C2_HOOK_FASTCALL PaletteEntry16Bit(br_pixelmap* pPal, int pEntry) { // Colour24BitTo16Bit -// PaletteOf16Bits +// FUNCTION: CARMA2_HW 0x005170c0 +br_pixelmap* C2_HOOK_FASTCALL PaletteOf16Bits(br_pixelmap* pSrc) { + tU16* dst_entry; + int i; + + if (g16bit_palette == NULL) { + g16bit_palette = BrPixelmapAllocate(BR_PMT_RGB_565, 1, 256, NULL, 0); + if (g16bit_palette == NULL) { + FatalError(kFatalError_OOM_S, "16-bit palette"); + } + } + if (!gPalette_changed || gPalette_source != pSrc) { + dst_entry = g16bit_palette->pixels; + for (i = 0; i < 256; i++) { + *dst_entry++ = PaletteEntry16Bit(pSrc, i); + } + gPalette_changed = 1; + gPalette_source = pSrc; + } + return g16bit_palette; +} // Copy8BitTo16Bit diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 415cf1a2f9..1e6e8dccc2 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -171,7 +171,7 @@ extern tU16 C2_HOOK_FASTCALL PaletteEntry16Bit(br_pixelmap* pPal, int pEntry); // Colour24BitTo16Bit -// PaletteOf16Bits +extern br_pixelmap* C2_HOOK_FASTCALL PaletteOf16Bits(br_pixelmap* pSrc); // Copy8BitTo16Bit From 113d66cb090a621dc917b5a4d1589aa163a112d7 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 10:53:49 +0200 Subject: [PATCH 12/34] Fix redundant declarations in carma code --- src/brender/core/fw/devlist.h | 28 +- src/brender/core/fw/devsetup.h | 24 +- src/brender/core/fw/diag.h | 12 +- src/brender/core/fw/fwsetup.h | 12 +- src/brender/core/fw/mem.h | 14 +- src/brender/core/fw/resource.h | 40 +-- src/brender/core/v1db/prepmesh.h | 46 +-- src/brender/include/brender/brender.h | 364 +++++++++++----------- src/carma2/common/network.h | 112 +++---- src/carma2/newcommon/01-network.c | 2 - src/carma2/newcommon/18-graphics2.c | 45 --- src/carma2/newcommon/18-graphics2.h | 1 + src/carma2/newcommon/41-utility.c | 29 +- src/carma2/newcommon/41-utility.h | 4 +- src/carma2/newcommon/CMakeLists.txt | 4 + src/carma2/newcommon/globvrbm.h | 3 +- src/carma2/platform/platform.h | 194 ++++++------ src/carma2/platform/win32/win32.h | 28 +- src/carma2/platform/win32/win32_dinput.h | 68 ++-- src/carma2/platform/win32/win32_sound.h | 44 +-- src/carma2/s3/include/s3/internal/audio.h | 126 ++++---- src/carma2/s3/include/s3/s3.h | 62 ++-- 22 files changed, 621 insertions(+), 641 deletions(-) diff --git a/src/brender/core/fw/devlist.h b/src/brender/core/fw/devlist.h index 9698f8f328..6d5b2aa4ec 100644 --- a/src/brender/core/fw/devlist.h +++ b/src/brender/core/fw/devlist.h @@ -5,30 +5,30 @@ #include "brender/br_types.h" -br_error C2_HOOK_CDECL AddRequestedDrivers(void); +extern br_error C2_HOOK_CDECL AddRequestedDrivers(void); -br_error C2_HOOK_STDCALL devAdd(br_device** pdev, br_device_begin_fn* dev_begin, const char* args, br_image* image); +extern br_error C2_HOOK_STDCALL devAdd(br_device** pdev, br_device_begin_fn* dev_begin, const char* args, br_image* image); -br_error C2_HOOK_CDECL BrDevAdd(br_device** pdev, const char* image, const char* args); +extern br_error C2_HOOK_CDECL BrDevAdd(br_device** pdev, const char* image, const char* args); -br_error C2_HOOK_CDECL BrDevAddStatic(br_device** pdev, br_device_begin_fn* dev_begin, const char* args); +extern br_error C2_HOOK_CDECL BrDevAddStatic(br_device** pdev, br_device_begin_fn* dev_begin, const char* args); -br_error C2_HOOK_CDECL BrDevCheckAdd(br_device** pdev, const char* name, const char* args); +extern br_error C2_HOOK_CDECL BrDevCheckAdd(br_device** pdev, const char* name, const char* args); -br_error C2_HOOK_CDECL BrDevAddConfig(const char* config); +extern br_error C2_HOOK_CDECL BrDevAddConfig(const char* config); -br_error C2_HOOK_CDECL BrDevRemove(br_device* dev); +extern br_error C2_HOOK_CDECL BrDevRemove(br_device* dev); -br_error C2_HOOK_CDECL BrDevFind(br_device** pdev, const char* pattern); +extern br_error C2_HOOK_CDECL BrDevFind(br_device** pdev, const char* pattern); -br_error C2_HOOK_CDECL BrDevFindMany(br_device** devices, br_int_32* ndevices, br_int_32 max_devices, const char* pattern); +extern br_error C2_HOOK_CDECL BrDevFindMany(br_device** devices, br_int_32* ndevices, br_int_32 max_devices, const char* pattern); -br_error C2_HOOK_CDECL BrDevCount(br_int_32* ndevices, const char* pattern); +extern br_error C2_HOOK_CDECL BrDevCount(br_int_32* ndevices, const char* pattern); -br_error C2_HOOK_CDECL BrDevContainedFind(br_object** ph, br_token type, const char* pattern, br_token_value* tv); +extern br_error C2_HOOK_CDECL BrDevContainedFind(br_object** ph, br_token type, const char* pattern, br_token_value* tv); -br_error C2_HOOK_CDECL BrDevContainedFindMany(br_object** objects, br_int_32 max_objects, br_int_32* pnum_objects, br_token type, const char* pattern, br_token_value* tv); +extern br_error C2_HOOK_CDECL BrDevContainedFindMany(br_object** objects, br_int_32 max_objects, br_int_32* pnum_objects, br_token type, const char* pattern, br_token_value* tv); -br_error C2_HOOK_CDECL BrDevContainedCount(br_int_32* pcount, br_token type, const char* pattern, br_token_value* tv); +extern br_error C2_HOOK_CDECL BrDevContainedCount(br_int_32* pcount, br_token type, const char* pattern, br_token_value* tv); -#endif \ No newline at end of file +#endif diff --git a/src/brender/core/fw/devsetup.h b/src/brender/core/fw/devsetup.h index b69f3eb08b..e1bf3d7dda 100644 --- a/src/brender/core/fw/devsetup.h +++ b/src/brender/core/fw/devsetup.h @@ -5,28 +5,28 @@ #include "c2_hooks.h" -br_pixelmap* C2_HOOK_CDECL BrDevLastBeginQuery(void); +extern br_pixelmap* C2_HOOK_CDECL BrDevLastBeginQuery(void); -void C2_HOOK_STDCALL BrDevLastBeginSet(br_pixelmap* pm); +extern void C2_HOOK_STDCALL BrDevLastBeginSet(br_pixelmap* pm); -br_error C2_HOOK_CDECL BrDevBeginVar(br_pixelmap** ppm, const char* setup_string, ...); +extern br_error C2_HOOK_CDECL BrDevBeginVar(br_pixelmap** ppm, const char* setup_string, ...); -br_error C2_HOOK_CDECL BrDevBeginTV(br_pixelmap** ppm, const char* setup_string, br_token_value* setup_tv); +extern br_error C2_HOOK_CDECL BrDevBeginTV(br_pixelmap** ppm, const char* setup_string, br_token_value* setup_tv); -br_error C2_HOOK_CDECL BrDevBegin(br_pixelmap** ppm, const char* setup_string); +extern br_error C2_HOOK_CDECL BrDevBegin(br_pixelmap** ppm, const char* setup_string); -br_pixelmap* C2_HOOK_CDECL BrDevBeginOld(const char* setup_string); +extern br_pixelmap* C2_HOOK_CDECL BrDevBeginOld(const char* setup_string); -void C2_HOOK_CDECL BrDevEndOld(void); +extern void C2_HOOK_CDECL BrDevEndOld(void); -void C2_HOOK_CDECL BrDevPaletteSetOld(br_pixelmap* pm); +extern void C2_HOOK_CDECL BrDevPaletteSetOld(br_pixelmap* pm); -void C2_HOOK_CDECL BrDevPaletteSetEntryOld(int i, br_colour colour); +extern void C2_HOOK_CDECL BrDevPaletteSetEntryOld(int i, br_colour colour); -br_error C2_HOOK_CDECL BrRendererFacilityFind(br_renderer_facility** prf, br_device_pixelmap* destination, br_token scalar_type); +extern br_error C2_HOOK_CDECL BrRendererFacilityFind(br_renderer_facility** prf, br_device_pixelmap* destination, br_token scalar_type); -br_error C2_HOOK_CDECL BrPrimitiveLibraryFind(br_primitive_library** ppl, br_device_pixelmap* destination, br_token scalar_type); +extern br_error C2_HOOK_CDECL BrPrimitiveLibraryFind(br_primitive_library** ppl, br_device_pixelmap* destination, br_token scalar_type); -br_error C2_HOOK_CDECL BrGeometryFormatFind(br_geometry** pgf, br_renderer* renderer, br_renderer_facility* renderer_facility, br_token scalar_type, br_token format_type); +extern br_error C2_HOOK_CDECL BrGeometryFormatFind(br_geometry** pgf, br_renderer* renderer, br_renderer_facility* renderer_facility, br_token scalar_type, br_token format_type); #endif //REC2_DEVSETUP_H diff --git a/src/brender/core/fw/diag.h b/src/brender/core/fw/diag.h index 7c0cf6366f..1eff4a758f 100644 --- a/src/brender/core/fw/diag.h +++ b/src/brender/core/fw/diag.h @@ -3,14 +3,14 @@ #include "c2_hooks.h" -C2_NORETURN void C2_HOOK_CDECL BrFailure(const char* format, ...); +extern C2_NORETURN void C2_HOOK_CDECL BrFailure(const char* format, ...); -void C2_HOOK_CDECL BrWarning(const char* s, ...); +extern void C2_HOOK_CDECL BrWarning(const char* s, ...); -void C2_HOOK_CDECL BrFatal(const char* name, int line, const char* s, ...); +extern void C2_HOOK_CDECL BrFatal(const char* name, int line, const char* s, ...); -void C2_HOOK_CDECL _BrAssert(const char* condition, const char* file, unsigned int line); +extern void C2_HOOK_CDECL _BrAssert(const char* condition, const char* file, unsigned int line); -void C2_HOOK_CDECL _BrUAssert(const char* condition, const char* file, unsigned int line); +extern void C2_HOOK_CDECL _BrUAssert(const char* condition, const char* file, unsigned int line); -#endif // REC2_DIAG_H \ No newline at end of file +#endif // REC2_DIAG_H diff --git a/src/brender/core/fw/fwsetup.h b/src/brender/core/fw/fwsetup.h index da05c08338..92937a4fe2 100644 --- a/src/brender/core/fw/fwsetup.h +++ b/src/brender/core/fw/fwsetup.h @@ -7,14 +7,14 @@ extern br_framework_state fw; -br_error C2_HOOK_CDECL BrFwBegin(void); +extern br_error C2_HOOK_CDECL BrFwBegin(void); -br_error C2_HOOK_CDECL BrFwEnd(void); +extern br_error C2_HOOK_CDECL BrFwEnd(void); -br_diaghandler* C2_HOOK_CDECL BrDiagHandlerSet(br_diaghandler* newdh); +extern br_diaghandler* C2_HOOK_CDECL BrDiagHandlerSet(br_diaghandler* newdh); -br_filesystem* C2_HOOK_CDECL BrFilesystemSet(br_filesystem* newfs); +extern br_filesystem* C2_HOOK_CDECL BrFilesystemSet(br_filesystem* newfs); -br_allocator* C2_HOOK_CDECL BrAllocatorSet(br_allocator* newal); +extern br_allocator* C2_HOOK_CDECL BrAllocatorSet(br_allocator* newal); -#endif // REC2_FWSETUP_H \ No newline at end of file +#endif // REC2_FWSETUP_H diff --git a/src/brender/core/fw/mem.h b/src/brender/core/fw/mem.h index 30743457e3..9de6eb5ecc 100644 --- a/src/brender/core/fw/mem.h +++ b/src/brender/core/fw/mem.h @@ -5,16 +5,16 @@ #include "brender/br_types.h" -void* C2_HOOK_CDECL BrMemAllocate(br_size_t size, br_uint_8 type); +extern void* C2_HOOK_CDECL BrMemAllocate(br_size_t size, br_uint_8 type); -void C2_HOOK_CDECL BrMemFree(void* block); +extern void C2_HOOK_CDECL BrMemFree(void* block); -br_size_t C2_HOOK_CDECL BrMemInquire(br_uint_8 type); +extern br_size_t C2_HOOK_CDECL BrMemInquire(br_uint_8 type); -br_int_32 C2_HOOK_CDECL BrMemAlign(br_uint_8 type); +extern br_int_32 C2_HOOK_CDECL BrMemAlign(br_uint_8 type); -void* C2_HOOK_CDECL BrMemCalloc(int nelems, br_size_t size, br_uint_8 type); +extern void* C2_HOOK_CDECL BrMemCalloc(int nelems, br_size_t size, br_uint_8 type); -char* C2_HOOK_CDECL BrMemStrDup(const char* str); +extern char* C2_HOOK_CDECL BrMemStrDup(const char* str); -#endif // REC2_MEM_H \ No newline at end of file +#endif // REC2_MEM_H diff --git a/src/brender/core/fw/resource.h b/src/brender/core/fw/resource.h index 76acaf4306..e1eefd77f0 100644 --- a/src/brender/core/fw/resource.h +++ b/src/brender/core/fw/resource.h @@ -5,44 +5,44 @@ #include "brender/br_types.h" -void* C2_HOOK_CDECL ResToUser(resource_header* r); +extern void* C2_HOOK_CDECL ResToUser(resource_header* r); resource_header* C2_HOOK_CDECL UserToRes(void* r); -void* C2_HOOK_CDECL BrResAllocate(void* vparent, br_size_t size, br_uint_8 res_class); +extern void* C2_HOOK_CDECL BrResAllocate(void* vparent, br_size_t size, br_uint_8 res_class); -void C2_HOOK_STDCALL BrResInternalFree(resource_header* res, br_boolean callback); +extern void C2_HOOK_STDCALL BrResInternalFree(resource_header* res, br_boolean callback); -void C2_HOOK_CDECL BrResFree(void* vres); +extern void C2_HOOK_CDECL BrResFree(void* vres); -void C2_HOOK_CDECL BrResAssert(void* vres); +extern void C2_HOOK_CDECL BrResAssert(void* vres); -void C2_HOOK_CDECL BrResFreeNoCallback(void* vres); +extern void C2_HOOK_CDECL BrResFreeNoCallback(void* vres); -void* C2_HOOK_CDECL BrResAdd(void* vparent, void* vres); +extern void* C2_HOOK_CDECL BrResAdd(void* vparent, void* vres); -void* C2_HOOK_CDECL BrResRemove(void* vres); +extern void* C2_HOOK_CDECL BrResRemove(void* vres); -br_uint_8 C2_HOOK_CDECL BrResClass(void* vres); +extern br_uint_8 C2_HOOK_CDECL BrResClass(void* vres); -br_boolean C2_HOOK_CDECL BrResIsChild(void* vparent, void* vchild); +extern br_boolean C2_HOOK_CDECL BrResIsChild(void* vparent, void* vchild); -br_uint_32 C2_HOOK_CDECL BrResSize(void* vres); +extern br_uint_32 C2_HOOK_CDECL BrResSize(void* vres); -br_uint_32 C2_HOOK_CDECL ResSizeTotal(void* vres, br_uint_32* ptotal); +extern br_uint_32 C2_HOOK_CDECL ResSizeTotal(void* vres, br_uint_32* ptotal); -br_uint_32 C2_HOOK_CDECL BrResSizeTotal(void* vres); +extern br_uint_32 C2_HOOK_CDECL BrResSizeTotal(void* vres); -br_uint_32 C2_HOOK_CDECL BrResChildEnum(void* vres, br_resenum_cbfn* callback, void* arg); +extern br_uint_32 C2_HOOK_CDECL BrResChildEnum(void* vres, br_resenum_cbfn* callback, void* arg); -br_uint_32 C2_HOOK_CDECL BrResCheck(void* vres, int no_tag); +extern br_uint_32 C2_HOOK_CDECL BrResCheck(void* vres, int no_tag); -char* C2_HOOK_CDECL BrResStrDup(void* vparent, const char* str); +extern char* C2_HOOK_CDECL BrResStrDup(void* vparent, const char* str); -void C2_HOOK_CDECL InternalResourceDump(resource_header* res, br_putline_cbfn* putline, void* arg, int level); +extern void C2_HOOK_CDECL InternalResourceDump(resource_header* res, br_putline_cbfn* putline, void* arg, int level); -void C2_HOOK_CDECL BrResDump(void* vres, br_putline_cbfn* putline, void* arg); +extern void C2_HOOK_CDECL BrResDump(void* vres, br_putline_cbfn* putline, void* arg); -char* C2_HOOK_CDECL BrResClassIdentifier(br_uint_8 res_class); +extern char* C2_HOOK_CDECL BrResClassIdentifier(br_uint_8 res_class); -#endif // REC2_RESOURCE_H \ No newline at end of file +#endif // REC2_RESOURCE_H diff --git a/src/brender/core/v1db/prepmesh.h b/src/brender/core/v1db/prepmesh.h index 0d7bed5444..cfdac50cc0 100644 --- a/src/brender/core/v1db/prepmesh.h +++ b/src/brender/core/v1db/prepmesh.h @@ -5,48 +5,48 @@ #include "brender/br_types.h" -int C2_HOOK_STDCALL addEdge(br_uint_16 first, br_uint_16 last); +extern int C2_HOOK_STDCALL addEdge(br_uint_16 first, br_uint_16 last); -void C2_HOOK_STDCALL prepareEdges(v11group* group, br_model* model); +extern void C2_HOOK_STDCALL prepareEdges(v11group* group, br_model* model); -void C2_HOOK_STDCALL BrPrepareEdges(br_model* model); +extern void C2_HOOK_STDCALL BrPrepareEdges(br_model* model); -int C2_HOOK_CDECL FacesCompare(const void* p1, const void* p2); +extern int C2_HOOK_CDECL FacesCompare(const void* p1, const void* p2); -int C2_HOOK_CDECL TVCompare_XYZ(const void* p1, const void* p2); +extern int C2_HOOK_CDECL TVCompare_XYZ(const void* p1, const void* p2); -int C2_HOOK_CDECL TVCompare_MXYZUVN(const void* p1, const void* p2); +extern int C2_HOOK_CDECL TVCompare_MXYZUVN(const void* p1, const void* p2); -int C2_HOOK_CDECL TVCompare_MVN(const void* p1, const void* p2); +extern int C2_HOOK_CDECL TVCompare_MVN(const void* p1, const void* p2); -br_fraction C2_HOOK_CDECL BrScalarToFractionClamp(br_scalar s); +extern br_fraction C2_HOOK_CDECL BrScalarToFractionClamp(br_scalar s); -void C2_HOOK_STDCALL PrepareFaceNormals(br_model* model); +extern void C2_HOOK_STDCALL PrepareFaceNormals(br_model* model); -void C2_HOOK_STDCALL Smoothing(br_model* model, br_scalar crease_limit, prep_vertex** start, prep_vertex** end); +extern void C2_HOOK_STDCALL Smoothing(br_model* model, br_scalar crease_limit, prep_vertex** start, prep_vertex** end); -void C2_HOOK_STDCALL SmoothingCreased(br_model* model, br_scalar crease_limit, prep_vertex** start, prep_vertex** end); +extern void C2_HOOK_STDCALL SmoothingCreased(br_model* model, br_scalar crease_limit, prep_vertex** start, prep_vertex** end); -void C2_HOOK_STDCALL CopyVertex(v11group* group, int v, prep_vertex* src, br_model* model); +extern void C2_HOOK_STDCALL CopyVertex(v11group* group, int v, prep_vertex* src, br_model* model); -void C2_HOOK_STDCALL CopyFace(v11group* group, int f, br_face* src, br_model* model); +extern void C2_HOOK_STDCALL CopyFace(v11group* group, int f, br_face* src, br_model* model); -void C2_HOOK_STDCALL PrepareGroups(br_model* model); +extern void C2_HOOK_STDCALL PrepareGroups(br_model* model); -void C2_HOOK_STDCALL PrepareBoundingRadius(br_model* model); +extern void C2_HOOK_STDCALL PrepareBoundingRadius(br_model* model); -void C2_HOOK_STDCALL PrepareBoundingBox(br_model* model); +extern void C2_HOOK_STDCALL PrepareBoundingBox(br_model* model); -int C2_HOOK_STDCALL IsMaterialTransparent(const br_material* material); +extern int C2_HOOK_STDCALL IsMaterialTransparent(const br_material* material); -int C2_HOOK_STDCALL IsMaterialTransparent(const br_material* material); +extern int C2_HOOK_STDCALL IsMaterialTransparent(const br_material* material); -void C2_HOOK_STDCALL RegenerateFaceNormals(v11model* v11m); +extern void C2_HOOK_STDCALL RegenerateFaceNormals(v11model* v11m); -void C2_HOOK_STDCALL RegenerateVertexNormals(v11model* v11m); +extern void C2_HOOK_STDCALL RegenerateVertexNormals(v11model* v11m); -void C2_HOOK_CDECL BrModelUpdate(br_model* model, br_uint_16 flags); +extern void C2_HOOK_CDECL BrModelUpdate(br_model* model, br_uint_16 flags); -void C2_HOOK_STDCALL BrModelClear(br_model* model); +extern void C2_HOOK_STDCALL BrModelClear(br_model* model); -#endif // REC2_PREPMESH_H \ No newline at end of file +#endif // REC2_PREPMESH_H diff --git a/src/brender/include/brender/brender.h b/src/brender/include/brender/brender.h index 6a0f886923..c6d49559d2 100644 --- a/src/brender/include/brender/brender.h +++ b/src/brender/include/brender/brender.h @@ -10,36 +10,35 @@ extern struct br_font* BrFontFixed3x5; extern struct br_font* BrFontProp4x6; extern struct br_font* BrFontProp7x9; -void C2_HOOK_CDECL BrV1dbBeginWrapper_Float(void); -br_error C2_HOOK_CDECL BrDevBeginVar(br_pixelmap** ppm, const char* setup_string, ...); +extern br_error C2_HOOK_CDECL BrDevBeginVar(br_pixelmap** ppm, const char* setup_string, ...); // BrActor br_actor* C2_HOOK_CDECL BrActorLoad(const char* filename); -br_uint_32 C2_HOOK_CDECL BrActorLoadMany(const char* filename, br_actor** actors, br_uint_16 num); -br_uint_32 C2_HOOK_CDECL BrModelSaveMany(char* filename, br_model** models, br_uint_16 num); -br_uint_32 C2_HOOK_CDECL BrActorSave(char* filename, br_actor* ptr); +extern br_uint_32 C2_HOOK_CDECL BrActorLoadMany(const char* filename, br_actor** actors, br_uint_16 num); +extern br_uint_32 C2_HOOK_CDECL BrModelSaveMany(char* filename, br_model** models, br_uint_16 num); +extern br_uint_32 C2_HOOK_CDECL BrActorSave(char* filename, br_actor* ptr); br_actor* C2_HOOK_CDECL BrActorAllocate(br_uint_8 type, void* type_data); br_actor* C2_HOOK_CDECL BrActorAdd(br_actor* parent, br_actor* a); -void C2_HOOK_CDECL BrActorRelink(br_actor* parent, br_actor* a); +extern void C2_HOOK_CDECL BrActorRelink(br_actor* parent, br_actor* a); br_actor* C2_HOOK_CDECL BrActorRemove(br_actor* a); -void C2_HOOK_CDECL BrActorFree(br_actor* a); -br_uint_32 C2_HOOK_CDECL BrActorEnum(br_actor* parent, br_actor_enum_cbfn* callback, void* arg); +extern void C2_HOOK_CDECL BrActorFree(br_actor* a); +extern br_uint_32 C2_HOOK_CDECL BrActorEnum(br_actor* parent, br_actor_enum_cbfn* callback, void* arg); br_bounds* C2_HOOK_CDECL BrActorToBounds(br_bounds* b, br_actor* ap); br_uint_16 C2_HOOK_CDECL BrActorToActorMatrix34(br_matrix34* m, br_actor* a, br_actor* b); -void C2_HOOK_CDECL BrLightEnable(br_actor* l); -void C2_HOOK_CDECL BrLightDisable(br_actor* l); +extern void C2_HOOK_CDECL BrLightEnable(br_actor* l); +extern void C2_HOOK_CDECL BrLightDisable(br_actor* l); // BrAllocator -br_allocator* C2_HOOK_CDECL BrAllocatorSet(br_allocator* newal); +extern br_allocator* C2_HOOK_CDECL BrAllocatorSet(br_allocator* newal); // BrClip -void C2_HOOK_CDECL BrClipPlaneEnable(br_actor* c); -void C2_HOOK_CDECL BrClipPlaneDisable(br_actor* c); +extern void C2_HOOK_CDECL BrClipPlaneEnable(br_actor* c); +extern void C2_HOOK_CDECL BrClipPlaneDisable(br_actor* c); // BrDev -void C2_HOOK_CDECL BrDevPaletteSetOld(br_pixelmap* pm); -void C2_HOOK_CDECL BrDevPaletteSetEntryOld(int i, br_colour colour); +extern void C2_HOOK_CDECL BrDevPaletteSetOld(br_pixelmap* pm); +extern void C2_HOOK_CDECL BrDevPaletteSetEntryOld(int i, br_colour colour); // BrEnvironment br_actor* C2_HOOK_CDECL BrEnvironmentSet(br_actor* a); @@ -48,223 +47,222 @@ br_actor* C2_HOOK_CDECL BrEnvironmentSet(br_actor* a); br_filesystem* C2_HOOK_CDECL BrFilesystemSet(br_filesystem* newfs); // BrMap -br_pixelmap* C2_HOOK_CDECL BrMapAdd(br_pixelmap* pixelmap); -br_pixelmap* C2_HOOK_CDECL BrMapRemove(br_pixelmap* pixelmap); -br_pixelmap* C2_HOOK_CDECL BrMapFind(const char* pattern); -br_uint_32 C2_HOOK_CDECL BrMapAddMany(br_pixelmap** items, int n); -br_map_find_cbfn* C2_HOOK_CDECL BrMapFindHook(br_map_find_cbfn* hook); -void C2_HOOK_CDECL BrMapUpdate(br_pixelmap* map, br_uint_16 flags); +extern br_pixelmap* C2_HOOK_CDECL BrMapAdd(br_pixelmap* pixelmap); +extern br_pixelmap* C2_HOOK_CDECL BrMapRemove(br_pixelmap* pixelmap); +extern br_pixelmap* C2_HOOK_CDECL BrMapFind(const char* pattern); +extern br_uint_32 C2_HOOK_CDECL BrMapAddMany(br_pixelmap** items, int n); +extern br_map_find_cbfn* C2_HOOK_CDECL BrMapFindHook(br_map_find_cbfn* hook); +extern void C2_HOOK_CDECL BrMapUpdate(br_pixelmap* map, br_uint_16 flags); -br_pixelmap* C2_HOOK_CDECL BrPixelmapDirectLock(br_pixelmap* src, br_boolean block); -br_pixelmap* C2_HOOK_CDECL BrPixelmapDirectUnlock(br_pixelmap* src); +extern br_pixelmap* C2_HOOK_CDECL BrPixelmapDirectLock(br_pixelmap* src, br_boolean block); +extern br_pixelmap* C2_HOOK_CDECL BrPixelmapDirectUnlock(br_pixelmap* src); // BrMaterial -br_material* C2_HOOK_CDECL BrMaterialAllocate(const char* name); -br_material* C2_HOOK_CDECL BrMaterialLoad(const char* filename); -br_uint_32 C2_HOOK_CDECL BrMaterialLoadMany(const char* filename, br_material** materials, br_uint_16 num); -br_material* C2_HOOK_CDECL BrMaterialAdd(br_material* material); -br_material* C2_HOOK_CDECL BrMaterialRemove(br_material* material); -void C2_HOOK_CDECL BrMaterialUpdate(br_material* mat, br_uint_16 flags); -br_material* C2_HOOK_CDECL BrMaterialFind(const char* pattern); -void C2_HOOK_CDECL BrMaterialFree(br_material* m); -br_uint_32 C2_HOOK_CDECL BrMaterialAddMany(br_material** items, int n); -br_uint_32 C2_HOOK_CDECL BrMaterialEnum(const char* pattern, br_material_enum_cbfn* callback, void* arg); -br_material_find_cbfn* C2_HOOK_CDECL BrMaterialFindHook(br_material_find_cbfn* hook); +extern br_material* C2_HOOK_CDECL BrMaterialAllocate(const char* name); +extern br_material* C2_HOOK_CDECL BrMaterialLoad(const char* filename); +extern br_uint_32 C2_HOOK_CDECL BrMaterialLoadMany(const char* filename, br_material** materials, br_uint_16 num); +extern br_material* C2_HOOK_CDECL BrMaterialAdd(br_material* material); +extern br_material* C2_HOOK_CDECL BrMaterialRemove(br_material* material); +extern void C2_HOOK_CDECL BrMaterialUpdate(br_material* mat, br_uint_16 flags); +extern br_material* C2_HOOK_CDECL BrMaterialFind(const char* pattern); +extern void C2_HOOK_CDECL BrMaterialFree(br_material* m); +extern br_uint_32 C2_HOOK_CDECL BrMaterialAddMany(br_material** items, int n); +extern br_uint_32 C2_HOOK_CDECL BrMaterialEnum(const char* pattern, br_material_enum_cbfn* callback, void* arg); +extern br_material_find_cbfn* C2_HOOK_CDECL BrMaterialFindHook(br_material_find_cbfn* hook); // BrMatrix236 -void C2_HOOK_CDECL BrMatrix23Copy(br_matrix23* A, br_matrix23* B); -void C2_HOOK_CDECL BrMatrix23Identity(br_matrix23* mat); -void C2_HOOK_CDECL BrMatrix23LPNormalise(br_matrix23* A, const br_matrix23* B); -void C2_HOOK_CDECL BrMatrix23Mul(br_matrix23* A, br_matrix23* B, br_matrix23* C); -void C2_HOOK_CDECL BrMatrix23Rotate(br_matrix23* mat, br_angle rz); -void C2_HOOK_CDECL BrMatrix23Scale(br_matrix23* mat, br_scalar sx, br_scalar sy); -void C2_HOOK_CDECL BrMatrix23PreTranslate(br_matrix23* mat, br_scalar x, br_scalar y); -void C2_HOOK_CDECL BrMatrix23PostTranslate(br_matrix23* A, br_scalar x, br_scalar y); -void C2_HOOK_CDECL BrMatrix23PreScale(br_matrix23* mat, br_scalar sx, br_scalar sy); -void C2_HOOK_CDECL BrMatrix23PostScale(br_matrix23* mat, br_scalar sx, br_scalar sy); -void C2_HOOK_CDECL BrMatrix23PreShearX(br_matrix23* mat, br_scalar sy); -void C2_HOOK_CDECL BrMatrix23PostShearX(br_matrix23* mat, br_scalar sy); -void C2_HOOK_CDECL BrMatrix23PreShearY(br_matrix23* mat, br_scalar sx); -void C2_HOOK_CDECL BrMatrix23PostShearY(br_matrix23* mat, br_scalar sx); -void C2_HOOK_CDECL BrMatrix23TApplyV(br_vector2* A, const br_vector2* B, const br_matrix23* C); +extern void C2_HOOK_CDECL BrMatrix23Copy(br_matrix23* A, br_matrix23* B); +extern void C2_HOOK_CDECL BrMatrix23Identity(br_matrix23* mat); +extern void C2_HOOK_CDECL BrMatrix23LPNormalise(br_matrix23* A, const br_matrix23* B); +extern void C2_HOOK_CDECL BrMatrix23Mul(br_matrix23* A, br_matrix23* B, br_matrix23* C); +extern void C2_HOOK_CDECL BrMatrix23Rotate(br_matrix23* mat, br_angle rz); +extern void C2_HOOK_CDECL BrMatrix23Scale(br_matrix23* mat, br_scalar sx, br_scalar sy); +extern void C2_HOOK_CDECL BrMatrix23PreTranslate(br_matrix23* mat, br_scalar x, br_scalar y); +extern void C2_HOOK_CDECL BrMatrix23PostTranslate(br_matrix23* A, br_scalar x, br_scalar y); +extern void C2_HOOK_CDECL BrMatrix23PreScale(br_matrix23* mat, br_scalar sx, br_scalar sy); +extern void C2_HOOK_CDECL BrMatrix23PostScale(br_matrix23* mat, br_scalar sx, br_scalar sy); +extern void C2_HOOK_CDECL BrMatrix23PreShearX(br_matrix23* mat, br_scalar sy); +extern void C2_HOOK_CDECL BrMatrix23PostShearX(br_matrix23* mat, br_scalar sy); +extern void C2_HOOK_CDECL BrMatrix23PreShearY(br_matrix23* mat, br_scalar sx); +extern void C2_HOOK_CDECL BrMatrix23PostShearY(br_matrix23* mat, br_scalar sx); +extern void C2_HOOK_CDECL BrMatrix23TApplyV(br_vector2* A, const br_vector2* B, const br_matrix23* C); // BrMatrix34 -void C2_HOOK_CDECL BrMatrix34Identity(br_matrix34* mat); -void C2_HOOK_CDECL BrMatrix34Translate(br_matrix34* mat, br_scalar dx, br_scalar dy, br_scalar dz); -void C2_HOOK_CDECL BrMatrix34Pre(br_matrix34* mat, const br_matrix34* A); -void C2_HOOK_CDECL BrMatrix34Post(br_matrix34* mat, const br_matrix34* A); -void C2_HOOK_CDECL BrMatrix34TApplyP(br_vector3* A, const br_vector3* B, const br_matrix34* C); -void C2_HOOK_CDECL BrMatrix34ApplyV(br_vector3* A, const br_vector3* B, const br_matrix34* C); -br_scalar C2_HOOK_CDECL BrMatrix34Inverse(br_matrix34* B, const br_matrix34* A); -void C2_HOOK_CDECL BrMatrix34LPInverse(br_matrix34* A, const br_matrix34* B); -void C2_HOOK_CDECL BrMatrix34ApplyP(br_vector3* A, const br_vector3* B, const br_matrix34* C); -void C2_HOOK_CDECL BrMatrix34Scale(br_matrix34* mat, br_scalar sx, br_scalar sy, br_scalar sz); -void C2_HOOK_CDECL BrMatrix34PostTranslate(br_matrix34* mat, br_scalar x, br_scalar y, br_scalar z); -void C2_HOOK_CDECL BrMatrix34Mul(br_matrix34* A, const br_matrix34* B, const br_matrix34* C); -void C2_HOOK_CDECL BrMatrix34Copy(br_matrix34* A, const br_matrix34* B); -void C2_HOOK_CDECL BrMatrix34PreRotateY(br_matrix34* mat, br_angle ry); -void C2_HOOK_CDECL BrMatrix34RotateX(br_matrix34* mat, br_angle rx); -void C2_HOOK_CDECL BrMatrix34RotateY(br_matrix34* mat, br_angle ry); -void C2_HOOK_CDECL BrMatrix34PreScale(br_matrix34* mat, br_scalar sx, br_scalar sy, br_scalar sz); -void C2_HOOK_CDECL BrMatrix34PostScale(br_matrix34* mat, br_scalar sx, br_scalar sy, br_scalar sz); -void C2_HOOK_CDECL BrMatrix34PreTransform(br_matrix34* mat, const br_transform* xform); -void C2_HOOK_CDECL BrMatrix34PostTransform(br_matrix34* mat, const br_transform* xform); -void C2_HOOK_CDECL BrMatrix34TApplyV(br_vector3* A, const br_vector3* B, const br_matrix34* C); -void C2_HOOK_CDECL BrMatrix34LPNormalise(br_matrix34* A, const br_matrix34* B); -void C2_HOOK_CDECL BrMatrix34PreRotate(br_matrix34* mat, br_angle r, const br_vector3* axis); -void C2_HOOK_CDECL BrMatrix34Rotate(br_matrix34* mat, br_angle r, const br_vector3* a); -void C2_HOOK_CDECL BrMatrix34PreTranslate(br_matrix34* mat, br_scalar x, br_scalar y, br_scalar z); -void C2_HOOK_CDECL BrMatrix34PostShearX(br_matrix34* mat, br_scalar sy, br_scalar sz); -void C2_HOOK_CDECL BrMatrix34PostShearY(br_matrix34* mat, br_scalar sx, br_scalar sz); -void C2_HOOK_CDECL BrMatrix34PostShearZ(br_matrix34* mat, br_scalar sx, br_scalar sy); -void C2_HOOK_CDECL BrMatrix34PreShearX(br_matrix34* mat, br_scalar sy, br_scalar sz); -void C2_HOOK_CDECL BrMatrix34PostRotate(br_matrix34* mat, br_angle r, const br_vector3* axis); -void C2_HOOK_CDECL BrMatrix34PostRotateX(br_matrix34* mat, br_angle ry); -void C2_HOOK_CDECL BrMatrix34PostRotateY(br_matrix34* mat, br_angle ry); -void C2_HOOK_CDECL BrMatrix34PostRotateZ(br_matrix34* mat, br_angle ry); -void C2_HOOK_CDECL BrMatrix34PreRotateX(br_matrix34* mat, br_angle ry); -void C2_HOOK_CDECL BrMatrix34PreRotateY(br_matrix34* mat, br_angle ry); -void C2_HOOK_CDECL BrMatrix34PreRotateZ(br_matrix34* mat, br_angle rz); -void C2_HOOK_CDECL BrMatrix34RollingBall(br_matrix34 *mat, int dx,int dy, int radius); -br_euler* C2_HOOK_CDECL BrMatrix34ToEuler(br_euler* euler, const br_matrix34* mat); +extern void C2_HOOK_CDECL BrMatrix34Identity(br_matrix34* mat); +extern void C2_HOOK_CDECL BrMatrix34Translate(br_matrix34* mat, br_scalar dx, br_scalar dy, br_scalar dz); +extern void C2_HOOK_CDECL BrMatrix34Pre(br_matrix34* mat, const br_matrix34* A); +extern void C2_HOOK_CDECL BrMatrix34Post(br_matrix34* mat, const br_matrix34* A); +extern void C2_HOOK_CDECL BrMatrix34TApplyP(br_vector3* A, const br_vector3* B, const br_matrix34* C); +extern void C2_HOOK_CDECL BrMatrix34ApplyV(br_vector3* A, const br_vector3* B, const br_matrix34* C); +extern br_scalar C2_HOOK_CDECL BrMatrix34Inverse(br_matrix34* B, const br_matrix34* A); +extern void C2_HOOK_CDECL BrMatrix34LPInverse(br_matrix34* A, const br_matrix34* B); +extern void C2_HOOK_CDECL BrMatrix34ApplyP(br_vector3* A, const br_vector3* B, const br_matrix34* C); +extern void C2_HOOK_CDECL BrMatrix34Scale(br_matrix34* mat, br_scalar sx, br_scalar sy, br_scalar sz); +extern void C2_HOOK_CDECL BrMatrix34PostTranslate(br_matrix34* mat, br_scalar x, br_scalar y, br_scalar z); +extern void C2_HOOK_CDECL BrMatrix34Mul(br_matrix34* A, const br_matrix34* B, const br_matrix34* C); +extern void C2_HOOK_CDECL BrMatrix34Copy(br_matrix34* A, const br_matrix34* B); +extern void C2_HOOK_CDECL BrMatrix34RotateX(br_matrix34* mat, br_angle rx); +extern void C2_HOOK_CDECL BrMatrix34RotateY(br_matrix34* mat, br_angle ry); +extern void C2_HOOK_CDECL BrMatrix34PreScale(br_matrix34* mat, br_scalar sx, br_scalar sy, br_scalar sz); +extern void C2_HOOK_CDECL BrMatrix34PostScale(br_matrix34* mat, br_scalar sx, br_scalar sy, br_scalar sz); +extern void C2_HOOK_CDECL BrMatrix34PreTransform(br_matrix34* mat, const br_transform* xform); +extern void C2_HOOK_CDECL BrMatrix34PostTransform(br_matrix34* mat, const br_transform* xform); +extern void C2_HOOK_CDECL BrMatrix34TApplyV(br_vector3* A, const br_vector3* B, const br_matrix34* C); +extern void C2_HOOK_CDECL BrMatrix34LPNormalise(br_matrix34* A, const br_matrix34* B); +extern void C2_HOOK_CDECL BrMatrix34PreRotate(br_matrix34* mat, br_angle r, const br_vector3* axis); +extern void C2_HOOK_CDECL BrMatrix34Rotate(br_matrix34* mat, br_angle r, const br_vector3* a); +extern void C2_HOOK_CDECL BrMatrix34PreTranslate(br_matrix34* mat, br_scalar x, br_scalar y, br_scalar z); +extern void C2_HOOK_CDECL BrMatrix34PostShearX(br_matrix34* mat, br_scalar sy, br_scalar sz); +extern void C2_HOOK_CDECL BrMatrix34PostShearY(br_matrix34* mat, br_scalar sx, br_scalar sz); +extern void C2_HOOK_CDECL BrMatrix34PostShearZ(br_matrix34* mat, br_scalar sx, br_scalar sy); +extern void C2_HOOK_CDECL BrMatrix34PreShearX(br_matrix34* mat, br_scalar sy, br_scalar sz); +extern void C2_HOOK_CDECL BrMatrix34PostRotate(br_matrix34* mat, br_angle r, const br_vector3* axis); +extern void C2_HOOK_CDECL BrMatrix34PostRotateX(br_matrix34* mat, br_angle ry); +extern void C2_HOOK_CDECL BrMatrix34PostRotateY(br_matrix34* mat, br_angle ry); +extern void C2_HOOK_CDECL BrMatrix34PostRotateZ(br_matrix34* mat, br_angle ry); +extern void C2_HOOK_CDECL BrMatrix34PreRotateX(br_matrix34* mat, br_angle ry); +extern void C2_HOOK_CDECL BrMatrix34PreRotateY(br_matrix34* mat, br_angle ry); +extern void C2_HOOK_CDECL BrMatrix34PreRotateZ(br_matrix34* mat, br_angle rz); +extern void C2_HOOK_CDECL BrMatrix34RollingBall(br_matrix34 *mat, int dx,int dy, int radius); +extern br_euler* C2_HOOK_CDECL BrMatrix34ToEuler(br_euler* euler, const br_matrix34* mat); // BrMatrix4 -void C2_HOOK_CDECL BrMatrix4Copy(br_matrix4* A, const br_matrix4* B); -br_scalar C2_HOOK_CDECL BrMatrix4Inverse(br_matrix4* A, const br_matrix4* B); -void C2_HOOK_CDECL BrMatrix4TApply(br_vector4* A, const br_vector4* B, const br_matrix4* C); -void C2_HOOK_CDECL BrMatrix4ApplyP(br_vector4* A, br_vector3* B, const br_matrix4* C); -void C2_HOOK_CDECL BrMatrix4Perspective(br_matrix4* mat, br_angle field_of_view, br_scalar aspect, br_scalar hither, br_scalar yon); -void C2_HOOK_CDECL BrMatrix4Scale(br_matrix4* mat, br_scalar sx, br_scalar sy, br_scalar sz); -void C2_HOOK_CDECL BrMatrix4Mul(br_matrix4* A, const br_matrix4* B, const br_matrix4* C); -void C2_HOOK_CDECL BrMatrix4Mul34(br_matrix4* A, const br_matrix34* B, const br_matrix4* C); +extern void C2_HOOK_CDECL BrMatrix4Copy(br_matrix4* A, const br_matrix4* B); +extern br_scalar C2_HOOK_CDECL BrMatrix4Inverse(br_matrix4* A, const br_matrix4* B); +extern void C2_HOOK_CDECL BrMatrix4TApply(br_vector4* A, const br_vector4* B, const br_matrix4* C); +extern void C2_HOOK_CDECL BrMatrix4ApplyP(br_vector4* A, br_vector3* B, const br_matrix4* C); +extern void C2_HOOK_CDECL BrMatrix4Perspective(br_matrix4* mat, br_angle field_of_view, br_scalar aspect, br_scalar hither, br_scalar yon); +extern void C2_HOOK_CDECL BrMatrix4Scale(br_matrix4* mat, br_scalar sx, br_scalar sy, br_scalar sz); +extern void C2_HOOK_CDECL BrMatrix4Mul(br_matrix4* A, const br_matrix4* B, const br_matrix4* C); +extern void C2_HOOK_CDECL BrMatrix4Mul34(br_matrix4* A, const br_matrix34* B, const br_matrix4* C); // BrQuaternion -br_quat* C2_HOOK_CDECL BrMatrix34ToQuat(br_quat* q, const br_matrix34* mat); -br_quat* C2_HOOK_CDECL BrQuatInvert(br_quat* q, const br_quat* qq); -br_quat* C2_HOOK_CDECL BrQuatMul(br_quat* q, const br_quat* l, const br_quat* r); +extern br_quat* C2_HOOK_CDECL BrMatrix34ToQuat(br_quat* q, const br_matrix34* mat); +extern br_quat* C2_HOOK_CDECL BrQuatInvert(br_quat* q, const br_quat* qq); +extern br_quat* C2_HOOK_CDECL BrQuatMul(br_quat* q, const br_quat* l, const br_quat* r); // BrMem -void C2_HOOK_CDECL BrMemFree(void* block); -void* C2_HOOK_CDECL BrMemAllocate(br_size_t size, br_uint_8 type); -void* C2_HOOK_CDECL BrMemCalloc(int nelems, br_size_t size, br_uint_8 type); -char* C2_HOOK_CDECL BrMemStrDup(const char* str); +extern void C2_HOOK_CDECL BrMemFree(void* block); +extern void* C2_HOOK_CDECL BrMemAllocate(br_size_t size, br_uint_8 type); +extern void* C2_HOOK_CDECL BrMemCalloc(int nelems, br_size_t size, br_uint_8 type); +extern char* C2_HOOK_CDECL BrMemStrDup(const char* str); // BrModel -br_model* C2_HOOK_CDECL BrModelAllocate(const char* name, int nvertices, int nfaces); -br_model* C2_HOOK_CDECL BrModelAdd(br_model* model); -br_uint_32 C2_HOOK_CDECL BrModelAddMany(br_model** items, int n); -br_model* C2_HOOK_CDECL BrModelRemove(br_model* model); -br_model* C2_HOOK_CDECL BrModelLoad(const char* filename); -br_model* C2_HOOK_CDECL BrModelFind(const char* name); -void C2_HOOK_CDECL BrModelFree(br_model* model); -void C2_HOOK_CDECL BrModelUpdate(br_model* model, br_uint_16 flags); -br_uint_32 C2_HOOK_CDECL BrModelLoadMany(const char* filename, br_model** models, br_uint_16 num); -br_model_find_cbfn* C2_HOOK_CDECL BrModelFindHook(br_model_find_cbfn* hook); +extern br_model* C2_HOOK_CDECL BrModelAllocate(const char* name, int nvertices, int nfaces); +extern br_model* C2_HOOK_CDECL BrModelAdd(br_model* model); +extern br_uint_32 C2_HOOK_CDECL BrModelAddMany(br_model** items, int n); +extern br_model* C2_HOOK_CDECL BrModelRemove(br_model* model); +extern br_model* C2_HOOK_CDECL BrModelLoad(const char* filename); +extern br_model* C2_HOOK_CDECL BrModelFind(const char* name); +extern void C2_HOOK_CDECL BrModelFree(br_model* model); +extern void C2_HOOK_CDECL BrModelUpdate(br_model* model, br_uint_16 flags); +extern br_uint_32 C2_HOOK_CDECL BrModelLoadMany(const char* filename, br_model** models, br_uint_16 num); +extern br_model_find_cbfn* C2_HOOK_CDECL BrModelFindHook(br_model_find_cbfn* hook); // BrPixelmap -br_pixelmap* C2_HOOK_CDECL BrPixelmapLoad(const char* filename); -br_uint_32 C2_HOOK_CDECL BrPixelmapLoadMany(const char* filename, br_pixelmap** pixelmaps, br_uint_16 num); -br_uint_32 C2_HOOK_CDECL BrPixelmapSave(const char* filename, br_pixelmap* ptr); -br_uint_32 C2_HOOK_CDECL BrPixelmapSaveMany(const char* filename, br_pixelmap** pixelmaps, br_uint_16 num); -void C2_HOOK_CDECL BrPixelmapFree(br_pixelmap* src); -br_pixelmap* C2_HOOK_CDECL BrPixelmapMatch(br_pixelmap* src, br_uint_8 match_type); -br_pixelmap* C2_HOOK_CDECL BrPixelmapAllocateSub(br_pixelmap* src, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h); -void C2_HOOK_CDECL BrPixelmapFill(br_pixelmap* dst, br_uint_32 colour); -void C2_HOOK_CDECL BrPixelmapRectangleCopy(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); -void C2_HOOK_CDECL BrPixelmapCopy(br_pixelmap* dst, br_pixelmap* src); -void C2_HOOK_CDECL BrPixelmapLine(br_pixelmap* dst, br_int_32 x1, br_int_32 y1, br_int_32 x2, br_int_32 y2, br_uint_32 colour); -void C2_HOOK_CDECL BrPixelmapRectangle(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour); -void C2_HOOK_CDECL BrPixelmapRectangleFill(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour); -br_uint_32 C2_HOOK_CDECL BrPixelmapPixelGet(br_pixelmap* dst, br_int_32 x, br_int_32 y); -void C2_HOOK_CDECL BrPixelmapPixelSet(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_uint_32 colour); -br_pixelmap* C2_HOOK_CDECL BrPixelmapAllocate(br_uint_8 type, br_int_32 w, br_int_32 h, void* pixels, int flags); -void C2_HOOK_CDECL BrPixelmapDoubleBuffer(br_pixelmap* dst, br_pixelmap* src); -void C2_HOOK_CDECL BrPixelmapPaletteSet(br_pixelmap *pm, br_pixelmap *pal); -void C2_HOOK_CDECL BrPixelmapPaletteEntrySet(br_pixelmap *pm, br_int_32 i,br_colour colour); -void C2_HOOK_CDECL BrPixelmapPaletteEntrySetMany(br_pixelmap *pm, br_int_32 index , br_int_32 ncolours, br_colour *colours); -void C2_HOOK_CDECL BrPixelmapText(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_uint_32 colour, br_font* font, char* text); -void C2_HOOK_CDECL BrPixelmapTextF(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_uint_32 colour, br_font* font, char* fmt, ...); -br_uint_16 C2_HOOK_CDECL BrPixelmapTextWidth(br_pixelmap* dst, br_font* font, char* text); +extern br_pixelmap* C2_HOOK_CDECL BrPixelmapLoad(const char* filename); +extern br_uint_32 C2_HOOK_CDECL BrPixelmapLoadMany(const char* filename, br_pixelmap** pixelmaps, br_uint_16 num); +extern br_uint_32 C2_HOOK_CDECL BrPixelmapSave(const char* filename, br_pixelmap* ptr); +extern br_uint_32 C2_HOOK_CDECL BrPixelmapSaveMany(const char* filename, br_pixelmap** pixelmaps, br_uint_16 num); +extern void C2_HOOK_CDECL BrPixelmapFree(br_pixelmap* src); +extern br_pixelmap* C2_HOOK_CDECL BrPixelmapMatch(br_pixelmap* src, br_uint_8 match_type); +extern br_pixelmap* C2_HOOK_CDECL BrPixelmapAllocateSub(br_pixelmap* src, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h); +extern void C2_HOOK_CDECL BrPixelmapFill(br_pixelmap* dst, br_uint_32 colour); +extern void C2_HOOK_CDECL BrPixelmapRectangleCopy(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_CDECL BrPixelmapCopy(br_pixelmap* dst, br_pixelmap* src); +extern void C2_HOOK_CDECL BrPixelmapLine(br_pixelmap* dst, br_int_32 x1, br_int_32 y1, br_int_32 x2, br_int_32 y2, br_uint_32 colour); +extern void C2_HOOK_CDECL BrPixelmapRectangle(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour); +extern void C2_HOOK_CDECL BrPixelmapRectangleFill(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour); +extern br_uint_32 C2_HOOK_CDECL BrPixelmapPixelGet(br_pixelmap* dst, br_int_32 x, br_int_32 y); +extern void C2_HOOK_CDECL BrPixelmapPixelSet(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_uint_32 colour); +extern br_pixelmap* C2_HOOK_CDECL BrPixelmapAllocate(br_uint_8 type, br_int_32 w, br_int_32 h, void* pixels, int flags); +extern void C2_HOOK_CDECL BrPixelmapDoubleBuffer(br_pixelmap* dst, br_pixelmap* src); +extern void C2_HOOK_CDECL BrPixelmapPaletteSet(br_pixelmap *pm, br_pixelmap *pal); +extern void C2_HOOK_CDECL BrPixelmapPaletteEntrySet(br_pixelmap *pm, br_int_32 i,br_colour colour); +extern void C2_HOOK_CDECL BrPixelmapPaletteEntrySetMany(br_pixelmap *pm, br_int_32 index , br_int_32 ncolours, br_colour *colours); +extern void C2_HOOK_CDECL BrPixelmapText(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_uint_32 colour, br_font* font, char* text); +extern void C2_HOOK_CDECL BrPixelmapTextF(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_uint_32 colour, br_font* font, char* fmt, ...); +extern br_uint_16 C2_HOOK_CDECL BrPixelmapTextWidth(br_pixelmap* dst, br_font* font, char* text); // BrQSort -void C2_HOOK_CDECL BrQsort(void* basep, unsigned int nelems, unsigned int size, br_qsort_cbfn comp); +extern void C2_HOOK_CDECL BrQsort(void* basep, unsigned int nelems, unsigned int size, br_qsort_cbfn comp); // BrRes -void* C2_HOOK_CDECL BrResAllocate(void* vparent, br_size_t size, br_uint_8 res_class); -void* C2_HOOK_CDECL BrResAdd(void* vparent, void* vres); -br_resource_class* C2_HOOK_CDECL BrResClassAdd(br_resource_class* rclass); -void* C2_HOOK_CDECL BrResRemove(void* vres); -void C2_HOOK_CDECL BrResFree(void* vres); -char* C2_HOOK_CDECL BrResStrDup(void* vparent, const char* str); -br_uint_32 C2_HOOK_CDECL BrResSize(void* vres); -br_uint_8 C2_HOOK_CDECL BrResClass(void* vres); +extern void* C2_HOOK_CDECL BrResAllocate(void* vparent, br_size_t size, br_uint_8 res_class); +extern void* C2_HOOK_CDECL BrResAdd(void* vparent, void* vres); +extern br_resource_class* C2_HOOK_CDECL BrResClassAdd(br_resource_class* rclass); +extern void* C2_HOOK_CDECL BrResRemove(void* vres); +extern void C2_HOOK_CDECL BrResFree(void* vres); +extern char* C2_HOOK_CDECL BrResStrDup(void* vparent, const char* str); +extern br_uint_32 C2_HOOK_CDECL BrResSize(void* vres); +extern br_uint_8 C2_HOOK_CDECL BrResClass(void* vres); // BrTable -br_pixelmap* C2_HOOK_CDECL BrTableAdd(br_pixelmap* pixelmap); -br_pixelmap* C2_HOOK_CDECL BrTableFind(const char* pattern); -br_pixelmap* C2_HOOK_CDECL BrTableRemove(br_pixelmap* pixelmap); -br_uint_32 C2_HOOK_CDECL BrTableAddMany(br_pixelmap** items, int n); -void C2_HOOK_CDECL BrTableUpdate(br_pixelmap* table, br_uint_16 flags); -br_uint_32 C2_HOOK_CDECL BrTableEnum(const char* pattern, br_table_enum_cbfn* callback, void* arg); -br_table_find_cbfn* C2_HOOK_CDECL BrTableFindHook(br_table_find_cbfn* hook); +extern br_pixelmap* C2_HOOK_CDECL BrTableAdd(br_pixelmap* pixelmap); +extern br_pixelmap* C2_HOOK_CDECL BrTableFind(const char* pattern); +extern br_pixelmap* C2_HOOK_CDECL BrTableRemove(br_pixelmap* pixelmap); +extern br_uint_32 C2_HOOK_CDECL BrTableAddMany(br_pixelmap** items, int n); +extern void C2_HOOK_CDECL BrTableUpdate(br_pixelmap* table, br_uint_16 flags); +extern br_uint_32 C2_HOOK_CDECL BrTableEnum(const char* pattern, br_table_enum_cbfn* callback, void* arg); +extern br_table_find_cbfn* C2_HOOK_CDECL BrTableFindHook(br_table_find_cbfn* hook); // BrTransform -void C2_HOOK_CDECL BrTransformToMatrix34(br_matrix34* mat, br_transform* xform); +extern void C2_HOOK_CDECL BrTransformToMatrix34(br_matrix34* mat, br_transform* xform); // BrEuler -br_matrix34* C2_HOOK_CDECL BrEulerToMatrix34(br_matrix34* mat, const br_euler* euler); +extern br_matrix34* C2_HOOK_CDECL BrEulerToMatrix34(br_matrix34* mat, const br_euler* euler); // BrV1db -void C2_HOOK_CDECL BrV1dbBeginWrapper_Float(void); +extern void C2_HOOK_CDECL BrV1dbBeginWrapper_Float(void); // BrVector3 -// void C2_HOOK_CDECL BrVector3Cross(br_vector3* v1, br_vector3* v2, br_vector3* v3); -void C2_HOOK_CDECL BrVector3SetFloat(br_vector3* v1, float f1, float f2, float f3); -// void C2_HOOK_CDECL BrVector3Sub(br_vector3* v1, br_vector3* v2, br_vector3* v3); -// void C2_HOOK_CDECL BrVector3Accumulate(br_vector3* v1, br_vector3* v2); -// void C2_HOOK_CDECL BrVector3Normalise(br_vector3* v1, br_vector3* v2); +// extern void C2_HOOK_CDECL BrVector3Cross(br_vector3* v1, br_vector3* v2, br_vector3* v3); +extern void C2_HOOK_CDECL BrVector3SetFloat(br_vector3* v1, float f1, float f2, float f3); +// extern void C2_HOOK_CDECL BrVector3Sub(br_vector3* v1, br_vector3* v2, br_vector3* v3); +// extern void C2_HOOK_CDECL BrVector3Accumulate(br_vector3* v1, br_vector3* v2); +// extern void C2_HOOK_CDECL BrVector3Normalise(br_vector3* v1, br_vector3* v2); // BrTransform -void C2_HOOK_CDECL BrTransformToTransform(br_transform* dest, br_transform* src); +extern void C2_HOOK_CDECL BrTransformToTransform(br_transform* dest, br_transform* src); // Logging -C2_NORETURN void C2_HOOK_CDECL BrFailure(const char* s, ...); -void C2_HOOK_CDECL BrFatal(const char* name, int line, const char* s, ...); +extern C2_NORETURN void C2_HOOK_CDECL BrFailure(const char* s, ...); +extern void C2_HOOK_CDECL BrFatal(const char* name, int line, const char* s, ...); // Z-buffer with primitive (or so I think) -void C2_HOOK_CDECL BrZbsBegin(br_uint_8 colour_type, br_uint_8 depth_type, void* primitive, br_uint_32 size); +extern void C2_HOOK_CDECL BrZbsBegin(br_uint_8 colour_type, br_uint_8 depth_type, void* primitive, br_uint_32 size); // Z-buffer -void C2_HOOK_CDECL BrZbBegin(br_uint_8 colour_type, br_uint_8 depth_type); +extern void C2_HOOK_CDECL BrZbBegin(br_uint_8 colour_type, br_uint_8 depth_type); -void C2_HOOK_CDECL BrZbSceneRender(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer); -void C2_HOOK_CDECL BrZbSceneRenderBegin(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer); -void C2_HOOK_CDECL BrZbSceneRenderAdd(br_actor* tree); -void C2_HOOK_CDECL BrZbSceneRenderEnd(void); +extern void C2_HOOK_CDECL BrZbSceneRender(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer); +extern void C2_HOOK_CDECL BrZbSceneRenderBegin(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer); +extern void C2_HOOK_CDECL BrZbSceneRenderAdd(br_actor* tree); +extern void C2_HOOK_CDECL BrZbSceneRenderEnd(void); -void C2_HOOK_CDECL BrZbsSceneRender(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer); +extern void C2_HOOK_CDECL BrZbsSceneRender(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer); -void C2_HOOK_CDECL BrZbModelRender(br_actor* actor, br_model* model, br_material* material, br_uint_8 style, int on_screen, int use_custom); -void C2_HOOK_CDECL BrZsModelRender(br_actor* actor, br_model* model, br_material* material, br_order_table* order_table, br_uint_8 style, int on_screen, int use_custom); +extern void C2_HOOK_CDECL BrZbModelRender(br_actor* actor, br_model* model, br_material* material, br_uint_8 style, int on_screen, int use_custom); +extern void C2_HOOK_CDECL BrZsModelRender(br_actor* actor, br_model* model, br_material* material, br_order_table* order_table, br_uint_8 style, int on_screen, int use_custom); -void C2_HOOK_CDECL BrZbsSceneRenderBegin(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer); -void C2_HOOK_CDECL BrZbsSceneRenderAdd(br_actor* tree); -void C2_HOOK_CDECL BrZbsSceneRenderEnd(void); +extern void C2_HOOK_CDECL BrZbsSceneRenderBegin(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer); +extern void C2_HOOK_CDECL BrZbsSceneRenderAdd(br_actor* tree); +extern void C2_HOOK_CDECL BrZbsSceneRenderEnd(void); -br_pixelmap* C2_HOOK_CDECL DOSGfxBegin(const char* setup_string); +extern br_pixelmap* C2_HOOK_CDECL DOSGfxBegin(const char* setup_string); // Various -br_uint_32 C2_HOOK_CDECL BrOnScreenCheck(br_bounds3* bounds); +extern br_uint_32 C2_HOOK_CDECL BrOnScreenCheck(br_bounds3* bounds); -int BrWriteModeSet(int mode); -br_uint_32 C2_HOOK_CDECL BrSwap32(br_uint_32 l); -br_diaghandler* C2_HOOK_CDECL BrDiagHandlerSet(br_diaghandler* newdh); +extern int C2_HOOK_CDECLBrWriteModeSet(int mode); +extern br_uint_32 C2_HOOK_CDECL BrSwap32(br_uint_32 l); +extern br_diaghandler* C2_HOOK_CDECL BrDiagHandlerSet(br_diaghandler* newdh); -void C2_HOOK_CDECL _BrEndHook(void); -br_error C2_HOOK_CDECL BrDevFind(br_device** pdev, const char* pattern); -br_error C2_HOOK_CDECL BrDevRemove(br_device* dev); +extern void C2_HOOK_CDECL _BrEndHook(void); +extern br_error C2_HOOK_CDECL BrDevFind(br_device** pdev, const char* pattern); +extern br_error C2_HOOK_CDECL BrDevRemove(br_device* dev); // Carmageddon 2 adaptation -void C2_HOOK_CDECL BrSetScreenZOffset(br_uint_32 pOffset); +extern void C2_HOOK_CDECL BrSetScreenZOffset(br_uint_32 pOffset); #endif diff --git a/src/carma2/common/network.h b/src/carma2/common/network.h index de834a3b80..1415ee9a99 100644 --- a/src/carma2/common/network.h +++ b/src/carma2/common/network.h @@ -34,116 +34,116 @@ extern tU32 gAsk_time; extern tPlayer_ID gLocal_net_ID; extern tGuaranteed_message gGuarantee_list[200]; -void C2_HOOK_FASTCALL BroadcastStatus(void); +extern void C2_HOOK_FASTCALL BroadcastStatus(void); -void C2_HOOK_FASTCALL InitNetHeadups(void); +extern void C2_HOOK_FASTCALL InitNetHeadups(void); -void C2_HOOK_FASTCALL DisposeNetHeadups(void); +extern void C2_HOOK_FASTCALL DisposeNetHeadups(void); -void C2_HOOK_FASTCALL NetPlayerStatusChanged(tPlayer_status pNew_status); +extern void C2_HOOK_FASTCALL NetPlayerStatusChanged(tPlayer_status pNew_status); -void C2_HOOK_FASTCALL NetLeaveGame(tNet_game_details* pNet_game); +extern void C2_HOOK_FASTCALL NetLeaveGame(tNet_game_details* pNet_game); -void C2_HOOK_FASTCALL ShutdownNetIfRequired(void); +extern void C2_HOOK_FASTCALL ShutdownNetIfRequired(void); -void C2_HOOK_FASTCALL NetSendHeadupToEverybody(const char* pMessage); +extern void C2_HOOK_FASTCALL NetSendHeadupToEverybody(const char* pMessage); -void C2_HOOK_FASTCALL NetSendHeadupToAllPlayers(char* pMessage); +extern void C2_HOOK_FASTCALL NetSendHeadupToAllPlayers(char* pMessage); -tNet_message* C2_HOOK_FASTCALL NetBuildMessage(undefined pArg1, undefined4 pArg2); +extern tNet_message* C2_HOOK_FASTCALL NetBuildMessage(undefined pArg1, undefined4 pArg2); -int C2_HOOK_FASTCALL NetSendMessageToAddress(tNet_game_details* pDetails, tNet_message* pMessage, void* pAddress); +extern int C2_HOOK_FASTCALL NetSendMessageToAddress(tNet_game_details* pDetails, tNet_message* pMessage, void* pAddress); -tNet_game_details* C2_HOOK_FASTCALL NetAllocatePIDGameDetails(void); +extern tNet_game_details* C2_HOOK_FASTCALL NetAllocatePIDGameDetails(void); -void C2_HOOK_FASTCALL DisposeCurrentJoinPollGame(void); +extern void C2_HOOK_FASTCALL DisposeCurrentJoinPollGame(void); -int C2_HOOK_FASTCALL NetJoinGameLowLevel(tNet_game_details* pGame_details, const char* pName); +extern int C2_HOOK_FASTCALL NetJoinGameLowLevel(tNet_game_details* pGame_details, const char* pName); -void C2_HOOK_FASTCALL LeaveTempGame(void); +extern void C2_HOOK_FASTCALL LeaveTempGame(void); -void C2_HOOK_FASTCALL NetLeaveGameLowLevel(void); +extern void C2_HOOK_FASTCALL NetLeaveGameLowLevel(void); -void C2_HOOK_FASTCALL DoNextJoinPoll(void); +extern void C2_HOOK_FASTCALL DoNextJoinPoll(void); -void C2_HOOK_FASTCALL CheckForDisappearees(void); +extern void C2_HOOK_FASTCALL CheckForDisappearees(void); -void C2_HOOK_FASTCALL CheckForPendingStartRace(void); +extern void C2_HOOK_FASTCALL CheckForPendingStartRace(void); -void C2_HOOK_FASTCALL CheckForNeedyEnvironmentRecipients(void); +extern void C2_HOOK_FASTCALL CheckForNeedyEnvironmentRecipients(void); -void C2_HOOK_FASTCALL GetCheckSum(tNet_message* pMessage); +extern void C2_HOOK_FASTCALL GetCheckSum(tNet_message* pMessage); -void C2_HOOK_FASTCALL ResendGuaranteedMessages(void); +extern void C2_HOOK_FASTCALL ResendGuaranteedMessages(void); -void C2_HOOK_FASTCALL NetFreeExcessMemory(void); +extern void C2_HOOK_FASTCALL NetFreeExcessMemory(void); -void C2_HOOK_FASTCALL NetService(int pIn_race); +extern void C2_HOOK_FASTCALL NetService(int pIn_race); -void C2_HOOK_FASTCALL DisableNetService(void); +extern void C2_HOOK_FASTCALL DisableNetService(void); -void C2_HOOK_FASTCALL ReenableNetService(void); +extern void C2_HOOK_FASTCALL ReenableNetService(void); -tNet_message* C2_HOOK_FASTCALL NetAllocateMessage(int pSize); +extern tNet_message* C2_HOOK_FASTCALL NetAllocateMessage(int pSize); -tNet_message_chunk* C2_HOOK_FASTCALL NetAllocateMessageChunk(int pType, int pOption); +extern tNet_message_chunk* C2_HOOK_FASTCALL NetAllocateMessageChunk(int pType, int pOption); -tNet_game_player_info* C2_HOOK_FASTCALL NetPlayerFromCar(tCar_spec *pCar); +extern tNet_game_player_info* C2_HOOK_FASTCALL NetPlayerFromCar(tCar_spec *pCar); -void C2_HOOK_FASTCALL NetFinishRace(tNet_game_details* pDetails, tRace_over_reason pReason); +extern void C2_HOOK_FASTCALL NetFinishRace(tNet_game_details* pDetails, tRace_over_reason pReason); -void C2_HOOK_FASTCALL NetFullScreenMessage(int pStr_index, int pLeave_it_up_there); +extern void C2_HOOK_FASTCALL NetFullScreenMessage(int pStr_index, int pLeave_it_up_there); -void C2_HOOK_FASTCALL NetSendMessageStacks(void); +extern void C2_HOOK_FASTCALL NetSendMessageStacks(void); -int C2_HOOK_FASTCALL NetInitialise(void); +extern int C2_HOOK_FASTCALL NetInitialise(void); -void C2_HOOK_FASTCALL NetEndJoinList(void); +extern void C2_HOOK_FASTCALL NetEndJoinList(void); -void C2_HOOK_FASTCALL NetDisposeGameDetails(tNet_game_details* pDetails); +extern void C2_HOOK_FASTCALL NetDisposeGameDetails(tNet_game_details* pDetails); -void C2_HOOK_FASTCALL StopAllThatJoinyStuffThisInstant(void); +extern void C2_HOOK_FASTCALL StopAllThatJoinyStuffThisInstant(void); -tNet_game_details* C2_HOOK_FASTCALL NetHostGame(tNet_game_type pNet_type, tNet_game_options* pOptions, int pRace_index, const char* pHost_name, int pCar_index); +extern tNet_game_details* C2_HOOK_FASTCALL NetHostGame(tNet_game_type pNet_type, tNet_game_options* pOptions, int pRace_index, const char* pHost_name, int pCar_index); -int C2_HOOK_FASTCALL NetJoinGame(tNet_game_details *pGame_details,char *pPlayer_name,int pCar_index); +extern int C2_HOOK_FASTCALL NetJoinGame(tNet_game_details *pGame_details,char *pPlayer_name,int pCar_index); -void C2_HOOK_FASTCALL NetStartProducingJoinList(tAddToJoinListProc *pAdd_proc); +extern void C2_HOOK_FASTCALL NetStartProducingJoinList(tAddToJoinListProc *pAdd_proc); -void C2_HOOK_FASTCALL InitNetStorageSpace(void); +extern void C2_HOOK_FASTCALL InitNetStorageSpace(void); -void C2_HOOK_FASTCALL DisposeNetStorageSpace(void); +extern void C2_HOOK_FASTCALL DisposeNetStorageSpace(void); -tNet_message* C2_HOOK_FASTCALL NetBuildGuaranteedMessage(tU8 pNet_message_type, int pOption); +extern tNet_message* C2_HOOK_FASTCALL NetBuildGuaranteedMessage(tU8 pNet_message_type, int pOption); -void C2_HOOK_FASTCALL NetGuaranteedSendMessageToHost(tNet_game_details* pDetails, tNet_message* pMessage, void* pNotifyFail); +extern void C2_HOOK_FASTCALL NetGuaranteedSendMessageToHost(tNet_game_details* pDetails, tNet_message* pMessage, void* pNotifyFail); tNet_message* C2_HOOK_FASTCALL NetGetNextMessage(tNet_game_details* pDetails, void** pSender_address); -void C2_HOOK_FASTCALL ReceivedMessage(tNet_message* pMessage, void* pSender_address, tU32 pReceive_time); +extern void C2_HOOK_FASTCALL ReceivedMessage(tNet_message* pMessage, void* pSender_address, tU32 pReceive_time); -void C2_HOOK_FASTCALL CheckCheckSum(tNet_message* pMessage); +extern void C2_HOOK_FASTCALL CheckCheckSum(tNet_message* pMessage); -void C2_HOOK_FASTCALL StatReceivePacket(void); +extern void C2_HOOK_FASTCALL StatReceivePacket(void); -void C2_HOOK_FASTCALL NetReallyDisposeMessage(tNet_game_details* pDetails, tNet_message* pMessage); +extern void C2_HOOK_FASTCALL NetReallyDisposeMessage(tNet_game_details* pDetails, tNet_message* pMessage); -void C2_HOOK_FASTCALL NetReceiveAndProcessMessages(void); +extern void C2_HOOK_FASTCALL NetReceiveAndProcessMessages(void); -int C2_HOOK_FASTCALL NetGuaranteedSendMessageToAllPlayers(tNet_game_details* pDetails, tNet_message* pMessage, undefined4 *pArg3); +extern int C2_HOOK_FASTCALL NetGuaranteedSendMessageToAllPlayers(tNet_game_details* pDetails, tNet_message* pMessage, undefined4 *pArg3); -int C2_HOOK_FASTCALL NetDisposeMessage(tNet_game_details* pDetails, tNet_message* pMessage); +extern int C2_HOOK_FASTCALL NetDisposeMessage(tNet_game_details* pDetails, tNet_message* pMessage); -int C2_HOOK_FASTCALL NetReallySendMessageToPlayer(tNet_game_details* pNet_game, tNet_message* pMessage, tPlayer_ID pPlayer_id); +extern int C2_HOOK_FASTCALL NetReallySendMessageToPlayer(tNet_game_details* pNet_game, tNet_message* pMessage, tPlayer_ID pPlayer_id); -void* C2_HOOK_FASTCALL NetGetToPlayerContentsSize(tNet_game_player_info* pNet_player, int pSize); +extern void* C2_HOOK_FASTCALL NetGetToPlayerContentsSize(tNet_game_player_info* pNet_player, int pSize); -tPlayer_status C2_HOOK_FASTCALL NetGetPlayerStatus(void); +extern tPlayer_status C2_HOOK_FASTCALL NetGetPlayerStatus(void); -tNet_message_chunk* C2_HOOK_FASTCALL NetStartBroadcastContents(tNet_message_type pType, tS32 pSize_decider); +extern tNet_message_chunk* C2_HOOK_FASTCALL NetStartBroadcastContents(tNet_message_type pType, tS32 pSize_decider); -void C2_HOOK_FASTCALL NetBroadcastContents(tNet_message_chunk* pMessage); +extern void C2_HOOK_FASTCALL NetBroadcastContents(tNet_message_chunk* pMessage); -int C2_HOOK_FASTCALL NetGuaranteedSendMessageToEverybody(tNet_game_details* pNet_game, tNet_message* pMessage, undefined4 pArg3); +extern int C2_HOOK_FASTCALL NetGuaranteedSendMessageToEverybody(tNet_game_details* pNet_game, tNet_message* pMessage, undefined4 pArg3); -#endif // REC2_NETWORK_H \ No newline at end of file +#endif // REC2_NETWORK_H diff --git a/src/carma2/newcommon/01-network.c b/src/carma2/newcommon/01-network.c index 6e1d41f945..e1fc8f2c79 100644 --- a/src/carma2/newcommon/01-network.c +++ b/src/carma2/newcommon/01-network.c @@ -7,8 +7,6 @@ #include -#include "../common/network.h" - // GLOBAL: CARMA2_HW 0x0068d95c int gJoin_poll_index; diff --git a/src/carma2/newcommon/18-graphics2.c b/src/carma2/newcommon/18-graphics2.c index 1c5bdc6c11..fb2ba51f55 100644 --- a/src/carma2/newcommon/18-graphics2.c +++ b/src/carma2/newcommon/18-graphics2.c @@ -44,9 +44,6 @@ 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 0x0074a604 br_pixelmap* gPalette_0074a604; @@ -62,51 +59,9 @@ br_pixelmap* gPalette_0074a5fc; // GLOBAL: CARMA2_HW 0x0074a670 br_pixelmap* gPalette_0074a670; -// 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; - -// 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) { diff --git a/src/carma2/newcommon/18-graphics2.h b/src/carma2/newcommon/18-graphics2.h index b34d488330..8aab33e463 100644 --- a/src/carma2/newcommon/18-graphics2.h +++ b/src/carma2/newcommon/18-graphics2.h @@ -8,6 +8,7 @@ extern int gNoTransients; extern br_pixelmap* gRender_palette; extern int gDim_amount; extern int gPalette_changed; +extern br_pixelmap* gCurrent_palette; extern void C2_HOOK_FASTCALL DRSetPaletteEntries(br_pixelmap* pThe_palette, int pFirst_colour, int pCount); diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index e6737f575b..a4dc5437da 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -725,9 +725,34 @@ br_pixelmap* C2_HOOK_FASTCALL PaletteOf16Bits(br_pixelmap* pSrc) { return g16bit_palette; } -// Copy8BitTo16Bit +void C2_HOOK_FASTCALL Copy8BitTo16Bit(br_pixelmap* pDst, br_pixelmap* pSrc, br_pixelmap* pPalette) { + int x; + int y; + tU8* src_start; + tU16* dst_start; + tU16* palette_entry; + + palette_entry = PaletteOf16Bits(pPalette)->pixels; + for (y = 0; y < pDst->height; y++) { + src_start = (tU8*)pSrc->pixels + pSrc->row_bytes * y; + dst_start = (tU16*)((tU8*)pDst->pixels + pDst->row_bytes * y); + for (x = 0; x < pDst->width; x++) { + *dst_start = palette_entry[*src_start]; + src_start++; + dst_start++; + } + } +} -// DRPixelmapCopy +// FUNCTION: CARMA2_HW 0x00517d90 +void C2_HOOK_FASTCALL DRPixelmapCopy(br_pixelmap* dst, br_pixelmap* src) { + + if (dst->type == src->type) { + BrPixelmapCopy(dst, src); + } else if (dst->type != BR_PMT_INDEX_8 && src->type == BR_PMT_INDEX_8) { + Copy8BitTo16Bit(dst, src, gCurrent_palette); + } +} static tMaterial_exception* C2_HOOK_FASTCALL FindExceptionInList(const char* pIdentifier, tMaterial_exception* pList) { diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 1e6e8dccc2..21dbf0b7c3 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -173,9 +173,9 @@ extern tU16 C2_HOOK_FASTCALL PaletteEntry16Bit(br_pixelmap* pPal, int pEntry); extern br_pixelmap* C2_HOOK_FASTCALL PaletteOf16Bits(br_pixelmap* pSrc); -// Copy8BitTo16Bit +extern void C2_HOOK_FASTCALL Copy8BitTo16Bit(br_pixelmap* pDst, br_pixelmap* pSrc, br_pixelmap* pPalette); -// DRPixelmapCopy +extern void C2_HOOK_FASTCALL DRPixelmapCopy(br_pixelmap* dst, br_pixelmap* src); // tMaterial_exception* C2_HOOK_FASTCALL FindExceptionInList(const char* pIdentifier, tMaterial_exception* pList) diff --git a/src/carma2/newcommon/CMakeLists.txt b/src/carma2/newcommon/CMakeLists.txt index 49dcba9ca1..846305f0af 100644 --- a/src/carma2/newcommon/CMakeLists.txt +++ b/src/carma2/newcommon/CMakeLists.txt @@ -99,3 +99,7 @@ target_link_libraries(c2_newcommon QuickTime::Dummy Smackw32::Smackw32 ) + +if(NOT MSVC) + add_compile_options(-Wredundant-decls) +endif() diff --git a/src/carma2/newcommon/globvrbm.h b/src/carma2/newcommon/globvrbm.h index b302f3569c..1e675c6c38 100644 --- a/src/carma2/newcommon/globvrbm.h +++ b/src/carma2/newcommon/globvrbm.h @@ -5,7 +5,6 @@ #include -extern int gCar_flying; extern br_actor* gPrat_actor; extern br_actor* g2d_camera; extern br_actor* gPowerupHUD_actor; @@ -130,4 +129,4 @@ extern int gOffence_dim_h; extern int gOffence_dim_x; extern int gOffence_dim_y; -#endif //REC2_GLOBVRBM_H \ No newline at end of file +#endif //REC2_GLOBVRBM_H diff --git a/src/carma2/platform/platform.h b/src/carma2/platform/platform.h index e29bdc478e..ac03f5831c 100644 --- a/src/carma2/platform/platform.h +++ b/src/carma2/platform/platform.h @@ -16,187 +16,187 @@ extern void* gHWnd; extern void* gPDActionReplayBuffer; extern int gPDActionReplayBufferSize; -int PDGetRegisterSourceLocation(char* buffer, int* buffer_size); +extern int PDGetRegisterSourceLocation(char* buffer, int* buffer_size); -int C2_HOOK_FASTCALL PDServiceSystem(tU32 pTime_since_last_call); +extern int C2_HOOK_FASTCALL PDServiceSystem(tU32 pTime_since_last_call); -void C2_HOOK_FASTCALL PDInitialiseSystem(void); +extern void C2_HOOK_FASTCALL PDInitialiseSystem(void); -void C2_HOOK_FASTCALL PDBuildAppPath(char* pThe_path); -void C2_HOOK_FASTCALL PDEnterDebugger(const char* pStr); -void C2_NORETURN C2_HOOK_FASTCALL PDFatalError(const char* pThe_str); -void C2_HOOK_FASTCALL PDNonFatalError(const char* pThe_str); -int C2_HOOK_FASTCALL PDIsWindowInactive(void); -char C2_HOOK_FASTCALL PDConvertToASCIILessThan128(char pChar); -int C2_HOOK_FASTCALL PDGetKeyboardCharacter(void); -void C2_HOOK_FASTCALL PDClearKeyboardBuffer(void); -void C2_HOOK_FASTCALL PDSetKeyArray(int* pKeys, int pMark); -void C2_HOOK_FASTCALL PDSetFileVariables(void); -C2_NORETURN void C2_HOOK_FASTCALL PDShutdownSystem(void); -void C2_HOOK_FASTCALL PDUnlockRealBackScreen(void); +extern void C2_HOOK_FASTCALL PDBuildAppPath(char* pThe_path); +extern void C2_HOOK_FASTCALL PDEnterDebugger(const char* pStr); +extern void C2_NORETURN C2_HOOK_FASTCALL PDFatalError(const char* pThe_str); +extern void C2_HOOK_FASTCALL PDNonFatalError(const char* pThe_str); +extern int C2_HOOK_FASTCALL PDIsWindowInactive(void); +extern char C2_HOOK_FASTCALL PDConvertToASCIILessThan128(char pChar); +extern int C2_HOOK_FASTCALL PDGetKeyboardCharacter(void); +extern void C2_HOOK_FASTCALL PDClearKeyboardBuffer(void); +extern void C2_HOOK_FASTCALL PDSetKeyArray(int* pKeys, int pMark); +extern void C2_HOOK_FASTCALL PDSetFileVariables(void); +extern C2_NORETURN void C2_HOOK_FASTCALL PDShutdownSystem(void); +extern void C2_HOOK_FASTCALL PDUnlockRealBackScreen(void); -int C2_HOOK_FASTCALL PDCheckDriveExists2(const char* pThe_path, const char* pFile_name, tU32 pMin_size); +extern int C2_HOOK_FASTCALL PDCheckDriveExists2(const char* pThe_path, const char* pFile_name, tU32 pMin_size); -int C2_HOOK_FASTCALL PDReadSourceLocation(tPath_name pPath); +extern int C2_HOOK_FASTCALL PDReadSourceLocation(tPath_name pPath); -int C2_HOOK_FASTCALL PDDoWeLeadAnAustereExistance(void); +extern int C2_HOOK_FASTCALL PDDoWeLeadAnAustereExistance(void); -void C2_HOOK_FASTCALL PDInitTimer(void); +extern void C2_HOOK_FASTCALL PDInitTimer(void); -tU32 C2_HOOK_FASTCALL PDGetTotalTime(void); +extern tU32 C2_HOOK_FASTCALL PDGetTotalTime(void); -int C2_HOOK_FASTCALL PDGetMicroseconds(void); +extern int C2_HOOK_FASTCALL PDGetMicroseconds(void); -void C2_HOOK_FASTCALL PDScreenBufferSwap(int pRendering_area_only); +extern void C2_HOOK_FASTCALL PDScreenBufferSwap(int pRendering_area_only); -void C2_HOOK_FASTCALL PDSetPaletteEntries(br_pixelmap* pPalette, int pFirst_colour, int pCount); +extern void C2_HOOK_FASTCALL PDSetPaletteEntries(br_pixelmap* pPalette, int pFirst_colour, int pCount); -void C2_HOOK_FASTCALL PDSetPalette(br_pixelmap *pixelmap); +extern void C2_HOOK_FASTCALL PDSetPalette(br_pixelmap *pixelmap); -void C2_HOOK_FASTCALL PDEnumPath(const char* path, tEnumPathCallback pCallback, void* data); +extern void C2_HOOK_FASTCALL PDEnumPath(const char* path, tEnumPathCallback pCallback, void* data); -int C2_HOOK_FASTCALL PDmkdir(const char* path); +extern int C2_HOOK_FASTCALL PDmkdir(const char* path); -void C2_HOOK_FASTCALL MAMSUnlock(void** pPtr); +extern void C2_HOOK_FASTCALL MAMSUnlock(void** pPtr); -void C2_HOOK_FASTCALL MAMSLock(void** pPtr); +extern void C2_HOOK_FASTCALL MAMSLock(void** pPtr); -void C2_HOOK_FASTCALL PDForEveryFileRecurse(const char* pThe_path, tPDForEveryFileRecurse_cbfn pAction_routine); +extern void C2_HOOK_FASTCALL PDForEveryFileRecurse(const char* pThe_path, tPDForEveryFileRecurse_cbfn pAction_routine); -void C2_HOOK_FASTCALL PDForEveryFile(const char* pThe_path, tPDForEveryFile_cbfn pAction_routine); +extern void C2_HOOK_FASTCALL PDForEveryFile(const char* pThe_path, tPDForEveryFile_cbfn pAction_routine); -void C2_HOOK_FASTCALL PDGetCurrentDate(char* pTimeStr); +extern void C2_HOOK_FASTCALL PDGetCurrentDate(char* pTimeStr); -void C2_HOOK_FASTCALL PDGetCurrentTime(char* pTimeStr); +extern void C2_HOOK_FASTCALL PDGetCurrentTime(char* pTimeStr); -void C2_HOOK_FASTCALL PDFileDelete(const char* pPath, int pIgnore_read_only); +extern void C2_HOOK_FASTCALL PDFileDelete(const char* pPath, int pIgnore_read_only); -int C2_HOOK_FASTCALL PDGetMouseClickPosition(int* pX_coord, int* pY_coord); +extern int C2_HOOK_FASTCALL PDGetMouseClickPosition(int* pX_coord, int* pY_coord); -void C2_HOOK_FASTCALL PDInstallErrorHandlers(void); +extern void C2_HOOK_FASTCALL PDInstallErrorHandlers(void); -int C2_HOOK_FASTCALL PDInitScreenVars(int pArgc, const char** pArgv); +extern int C2_HOOK_FASTCALL PDInitScreenVars(int pArgc, const char** pArgv); -void C2_HOOK_FASTCALL PDSaveOriginalPalette(void); +extern void C2_HOOK_FASTCALL PDSaveOriginalPalette(void); -void C2_HOOK_FASTCALL PDInitScreen(void); +extern void C2_HOOK_FASTCALL PDInitScreen(void); -void C2_HOOK_FASTCALL PDNetObtainSystemUserName(char* pName, int pMax_length); +extern void C2_HOOK_FASTCALL PDNetObtainSystemUserName(char* pName, int pMax_length); -int C2_HOOK_FASTCALL PDNetShutdown(void); +extern int C2_HOOK_FASTCALL PDNetShutdown(void); -int C2_HOOK_FASTCALL PDNetInitialise(void); +extern int C2_HOOK_FASTCALL PDNetInitialise(void); -void C2_HOOK_FASTCALL PDNetStartProducingJoinList(void); +extern void C2_HOOK_FASTCALL PDNetStartProducingJoinList(void); -void C2_HOOK_FASTCALL PDNetEndJoinList(void); +extern void C2_HOOK_FASTCALL PDNetEndJoinList(void); -int C2_HOOK_FASTCALL PDNetGetNextJoinGame(tNet_game_details* pGame, int pIndex); +extern int C2_HOOK_FASTCALL PDNetGetNextJoinGame(tNet_game_details* pGame, int pIndex); -int C2_HOOK_FASTCALL PDNetGetHeaderSize(void); +extern int C2_HOOK_FASTCALL PDNetGetHeaderSize(void); -int C2_HOOK_FASTCALL PDNetJoinGame(tNet_game_details* pGame_details, const char* pName); +extern int C2_HOOK_FASTCALL PDNetJoinGame(tNet_game_details* pGame_details, const char* pName); -void C2_HOOK_FASTCALL PDNetHostFinishGame(void); +extern void C2_HOOK_FASTCALL PDNetHostFinishGame(void); -void C2_HOOK_FASTCALL PDNetLeaveGame(void); +extern void C2_HOOK_FASTCALL PDNetLeaveGame(void); -tNet_message* C2_HOOK_FASTCALL PDNetGetNextMessage(tNet_game_details* pDetails, void** gRemote_addr); +extern tNet_message* C2_HOOK_FASTCALL PDNetGetNextMessage(tNet_game_details* pDetails, void** gRemote_addr); -int C2_HOOK_FASTCALL PDNetSendMessageToAddress(tNet_game_details* pDetails, tNet_message* pMessage, void* pAddress); +extern int C2_HOOK_FASTCALL PDNetSendMessageToAddress(tNet_game_details* pDetails, tNet_message* pMessage, void* pAddress); -int C2_HOOK_FASTCALL PDFileUnlock(const char* pThe_path); +extern int C2_HOOK_FASTCALL PDFileUnlock(const char* pThe_path); -void C2_HOOK_FASTCALL PDAllocateScreenAndBack(void); +extern void C2_HOOK_FASTCALL PDAllocateScreenAndBack(void); -void C2_HOOK_FASTCALL PDGetMousePosition(int *pX, int *pY); +extern void C2_HOOK_FASTCALL PDGetMousePosition(int *pX, int *pY); -void C2_HOOK_FASTCALL PDRevertPalette(void); +extern void C2_HOOK_FASTCALL PDRevertPalette(void); -void C2_HOOK_FASTCALL PDMouseButtons(int* pLeftButtonDown, int* pRightButtonDown); +extern void C2_HOOK_FASTCALL PDMouseButtons(int* pLeftButtonDown, int* pRightButtonDown); -tU32 C2_HOOK_FASTCALL PDGetJoystickButtonStates(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoystickButtonStates(void); -void C2_HOOK_FASTCALL PDSetKeysFromJoystick(int *keys); +extern void C2_HOOK_FASTCALL PDSetKeysFromJoystick(int *keys); -void C2_HOOK_FASTCALL PDReadJoysticks(void); +extern void C2_HOOK_FASTCALL PDReadJoysticks(void); -void C2_HOOK_FASTCALL PDInitJoysticks(void); +extern void C2_HOOK_FASTCALL PDInitJoysticks(void); -void C2_HOOK_FASTCALL PDPlayFFBEffectIndex(int index); +extern void C2_HOOK_FASTCALL PDPlayFFBEffectIndex(int index); -int C2_HOOK_FASTCALL PDFindJoystickEffect(const char* effectName); +extern int C2_HOOK_FASTCALL PDFindJoystickEffect(const char* effectName); -void C2_HOOK_FASTCALL PDPlayFFBEffect(const char* effectName); +extern void C2_HOOK_FASTCALL PDPlayFFBEffect(const char* effectName); -tU32 C2_HOOK_FASTCALL PDGetJoy1Button1(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy1Button1(void); -tU32 C2_HOOK_FASTCALL PDGetJoy1Button2(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy1Button2(void); -tU32 C2_HOOK_FASTCALL PDGetJoy1Button3(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy1Button3(void); -tU32 C2_HOOK_FASTCALL PDGetJoy1Button4(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy1Button4(void); -int C2_HOOK_FASTCALL PDGetJoy1X(void); +extern int C2_HOOK_FASTCALL PDGetJoy1X(void); -int C2_HOOK_FASTCALL PDGetJoy1Y(void); +extern int C2_HOOK_FASTCALL PDGetJoy1Y(void); -tU32 C2_HOOK_FASTCALL PDGetJoy2Button1(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy2Button1(void); -tU32 C2_HOOK_FASTCALL PDGetJoy2Button2(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy2Button2(void); -tU32 C2_HOOK_FASTCALL PDGetJoy2Button3(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy2Button3(void); -tU32 C2_HOOK_FASTCALL PDGetJoy2Button4(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy2Button4(void); -int C2_HOOK_FASTCALL PDGetJoy2X(void); +extern int C2_HOOK_FASTCALL PDGetJoy2X(void); -int C2_HOOK_FASTCALL PDGetJoy2Y(void); +extern int C2_HOOK_FASTCALL PDGetJoy2Y(void); -tButtonJoystickInfo* C2_HOOK_FASTCALL PDGetCurrentJoystickData(void); +extern tButtonJoystickInfo* C2_HOOK_FASTCALL PDGetCurrentJoystickData(void); -int C2_HOOK_FASTCALL PDS3Init(void); +extern int C2_HOOK_FASTCALL PDS3Init(void); -void C2_HOOK_FASTCALL PDExtractFilename(char* pDest, const char* pPath); +extern void C2_HOOK_FASTCALL PDExtractFilename(char* pDest, const char* pPath); -void C2_HOOK_FASTCALL PDExtractDirectory(char* pDest, const char* pPath); +extern void C2_HOOK_FASTCALL PDExtractDirectory(char* pDest, const char* pPath); -void* C2_HOOK_FASTCALL PDS3CreateSoundBuffer(tS3_wav_info* pWav_info, void* pWav_buffer); +extern void* C2_HOOK_FASTCALL PDS3CreateSoundBuffer(tS3_wav_info* pWav_info, void* pWav_buffer); -void C2_HOOK_FASTCALL PDS3ReleaseSound(tS3_descriptor* pSound_descriptor); +extern void C2_HOOK_FASTCALL PDS3ReleaseSound(tS3_descriptor* pSound_descriptor); -int C2_HOOK_FASTCALL PDS3UpdateChannelFrequency(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3UpdateChannelFrequency(tS3_channel* pChannel); -int C2_HOOK_FASTCALL PDS3PlaySample(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3PlaySample(tS3_channel* pChannel); -tS3_error_codes C2_HOOK_FASTCALL PDS3StartMidiChannel(tS3_channel* pChannel); +extern tS3_error_codes C2_HOOK_FASTCALL PDS3StartMidiChannel(tS3_channel* pChannel); -const char* C2_HOOK_FASTCALL PDS3GetWorkingDirectory(void); +extern const char* C2_HOOK_FASTCALL PDS3GetWorkingDirectory(void); -int C2_HOOK_FASTCALL PDS3StopMidiChannel(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3StopMidiChannel(tS3_channel* pChannel); -int C2_HOOK_FASTCALL PDS3StopCDAChannel(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3StopCDAChannel(tS3_channel* pChannel); -tS3_error_codes C2_HOOK_FASTCALL PDS3PlayCDAChannel(tS3_channel* pChannel); +extern tS3_error_codes C2_HOOK_FASTCALL PDS3PlayCDAChannel(tS3_channel* pChannel); -int C2_HOOK_FASTCALL PDS3StopSampleChannel(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3StopSampleChannel(tS3_channel* pChannel); -int C2_HOOK_FASTCALL PDS3UpdateChannelVolume(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3UpdateChannelVolume(tS3_channel* pChannel); -void C2_HOOK_FASTCALL PDS3Stop(void); +extern void C2_HOOK_FASTCALL PDS3Stop(void); -int C2_HOOK_FASTCALL PDS3IsMIDIStopped(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3IsMIDIStopped(tS3_channel* pChannel); -int C2_HOOK_FASTCALL PDS3IsCDAPlaying(void); +extern int C2_HOOK_FASTCALL PDS3IsCDAPlaying(void); -void C2_HOOK_FASTCALL PDS3ServiceCDA(tS32 pDelta_time); +extern void C2_HOOK_FASTCALL PDS3ServiceCDA(tS32 pDelta_time); -int C2_HOOK_FASTCALL PDS3IsSamplePlaying(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3IsSamplePlaying(tS3_channel* pChannel); -void C2_HOOK_FASTCALL PDPageInProcessMemory(void); +extern void C2_HOOK_FASTCALL PDPageInProcessMemory(void); -int C2_HOOK_FASTCALL PDIsJoystickDPadEnabled(void); +extern int C2_HOOK_FASTCALL PDIsJoystickDPadEnabled(void); -void C2_HOOK_FASTCALL PDReallyAllocateActionReplayBuffer(void); +extern void C2_HOOK_FASTCALL PDReallyAllocateActionReplayBuffer(void); #endif // C2_PLATFORM_H diff --git a/src/carma2/platform/win32/win32.h b/src/carma2/platform/win32/win32.h index 3bc62f5ecf..c4e6968cd6 100644 --- a/src/carma2/platform/win32/win32.h +++ b/src/carma2/platform/win32/win32.h @@ -45,32 +45,32 @@ extern HINSTANCE gHInstance; extern char gFatalErrorMessage[512]; extern int gIsFatalError; -LRESULT CALLBACK Carma2MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +extern LRESULT CALLBACK Carma2MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); -int C2_HOOK_FASTCALL PDFileUnlock(const char* pThe_path); +extern int C2_HOOK_FASTCALL PDFileUnlock(const char* pThe_path); -int C2_HOOK_CDECL IsNetworkShare(const char* path); +extern int C2_HOOK_CDECL IsNetworkShare(const char* path); -int C2_HOOK_CDECL IsValidDriveIndex(int driveIndex); +extern int C2_HOOK_CDECL IsValidDriveIndex(int driveIndex); -void C2_HOOK_FASTCALL PDRevertPalette(void); +extern void C2_HOOK_FASTCALL PDRevertPalette(void); -void C2_HOOK_FASTCALL PDMouseButtons(int* pLeftButtonDown, int* pRightButtonDown); +extern void C2_HOOK_FASTCALL PDMouseButtons(int* pLeftButtonDown, int* pRightButtonDown); -void C2_HOOK_FASTCALL PDExtractFilename(char* pDest, const char* pPath); +extern void C2_HOOK_FASTCALL PDExtractFilename(char* pDest, const char* pPath); -void C2_HOOK_FASTCALL PDExtractDirectory(char* pDest, const char* pPath); +extern void C2_HOOK_FASTCALL PDExtractDirectory(char* pDest, const char* pPath); -void C2_HOOK_FASTCALL PDPageInMemory(void* pMemory); +extern void C2_HOOK_FASTCALL PDPageInMemory(void* pMemory); -void C2_HOOK_FASTCALL PDPageInProcessMemory(void); +extern void C2_HOOK_FASTCALL PDPageInProcessMemory(void); -void C2_HOOK_FASTCALL PDGetCurrentTime(char* pStr); +extern void C2_HOOK_FASTCALL PDGetCurrentTime(char* pStr); -void C2_HOOK_FASTCALL PDGetCurrentDate(char* pStr); +extern void C2_HOOK_FASTCALL PDGetCurrentDate(char* pStr); -void C2_HOOK_FASTCALL PDFileDelete(const char* pPath, int pIgnore_read_only); +extern void C2_HOOK_FASTCALL PDFileDelete(const char* pPath, int pIgnore_read_only); -void C2_HOOK_FASTCALL PDDisposeActionReplayBuffer(void); +extern void C2_HOOK_FASTCALL PDDisposeActionReplayBuffer(void); #endif // C2_WIN32_WIN32_H diff --git a/src/carma2/platform/win32/win32_dinput.h b/src/carma2/platform/win32/win32_dinput.h index fd659ad879..cda00e7926 100644 --- a/src/carma2/platform/win32/win32_dinput.h +++ b/src/carma2/platform/win32/win32_dinput.h @@ -11,70 +11,70 @@ extern int gASCII_shift_table[151]; extern int gScan_code[256]; extern int gJoystick_deadzone; -void C2_HOOK_FASTCALL KeyBegin(void); +extern void C2_HOOK_FASTCALL KeyBegin(void); -void C2_HOOK_FASTCALL Win32InitInputDevice(void); +extern void C2_HOOK_FASTCALL Win32InitInputDevice(void); -void C2_HOOK_FASTCALL CloseDirectInput(void); +extern void C2_HOOK_FASTCALL CloseDirectInput(void); -int C2_HOOK_FASTCALL InitForceFeedback(void); +extern int C2_HOOK_FASTCALL InitForceFeedback(void); -void C2_HOOK_FASTCALL KeyBegin(void); +extern void C2_HOOK_FASTCALL KeyBegin(void); -int C2_HOOK_FASTCALL JoystickDInputBegin(void); +extern int C2_HOOK_FASTCALL JoystickDInputBegin(void); -int C2_HOOK_FASTCALL InitForceFeedback(void); +extern int C2_HOOK_FASTCALL InitForceFeedback(void); -void C2_HOOK_FASTCALL ResetDInputJoystickFFB(int pIndex); +extern void C2_HOOK_FASTCALL ResetDInputJoystickFFB(int pIndex); -void C2_HOOK_FASTCALL RegisterJoystickFFBForces(void); +extern void C2_HOOK_FASTCALL RegisterJoystickFFBForces(void); -void C2_HOOK_FASTCALL Win32InitInputDevice(void); +extern void C2_HOOK_FASTCALL Win32InitInputDevice(void); -int C2_HOOK_FASTCALL JoystickDInputBegin(void); +extern int C2_HOOK_FASTCALL JoystickDInputBegin(void); -tU32 C2_HOOK_FASTCALL PDGetJoystickButtonStates(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoystickButtonStates(void); -void C2_HOOK_FASTCALL PDSetKeyArray(int* pKeys, int pMark); +extern void C2_HOOK_FASTCALL PDSetKeyArray(int* pKeys, int pMark); -void C2_HOOK_FASTCALL PDReadJoysticks(void); +extern void C2_HOOK_FASTCALL PDReadJoysticks(void); -int C2_HOOK_FASTCALL GetDirectInputJoy1X(void); +extern int C2_HOOK_FASTCALL GetDirectInputJoy1X(void); -int C2_HOOK_FASTCALL GetDirectInputJoy1Y(void); +extern int C2_HOOK_FASTCALL GetDirectInputJoy1Y(void); -tU32 C2_HOOK_FASTCALL PDGetJoy1Button1(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy1Button1(void); -tU32 C2_HOOK_FASTCALL PDGetJoy1Button2(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy1Button2(void); -tU32 C2_HOOK_FASTCALL PDGetJoy1Button3(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy1Button3(void); -tU32 C2_HOOK_FASTCALL PDGetJoy1Button4(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy1Button4(void); -int C2_HOOK_FASTCALL PDGetJoy1X(void); +extern int C2_HOOK_FASTCALL PDGetJoy1X(void); -int C2_HOOK_FASTCALL PDGetJoy1Y(void); +extern int C2_HOOK_FASTCALL PDGetJoy1Y(void); -tU32 C2_HOOK_FASTCALL PDGetJoy2Button1(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy2Button1(void); -tU32 C2_HOOK_FASTCALL PDGetJoy2Button2(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy2Button2(void); -tU32 C2_HOOK_FASTCALL PDGetJoy2Button3(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy2Button3(void); -tU32 C2_HOOK_FASTCALL PDGetJoy2Button4(void); +extern tU32 C2_HOOK_FASTCALL PDGetJoy2Button4(void); -int C2_HOOK_FASTCALL PDGetJoy2X(void); +extern int C2_HOOK_FASTCALL PDGetJoy2X(void); -int C2_HOOK_FASTCALL PDGetJoy2Y(void); +extern int C2_HOOK_FASTCALL PDGetJoy2Y(void); -void C2_HOOK_FASTCALL PDInitJoysticks(void); +extern void C2_HOOK_FASTCALL PDInitJoysticks(void); -void C2_HOOK_FASTCALL PDPlayFFBEffectIndex(int index); +extern void C2_HOOK_FASTCALL PDPlayFFBEffectIndex(int index); -int C2_HOOK_FASTCALL PDFindJoystickEffect(const char* effectName); +extern int C2_HOOK_FASTCALL PDFindJoystickEffect(const char* effectName); -void C2_HOOK_FASTCALL PDPlayFFBEffect(const char* effectName); +extern void C2_HOOK_FASTCALL PDPlayFFBEffect(const char* effectName); -int C2_HOOK_FASTCALL PDIsJoystickDPadEnabled(void); +extern int C2_HOOK_FASTCALL PDIsJoystickDPadEnabled(void); -#endif // C2_WIN32_INPUT_H \ No newline at end of file +#endif // C2_WIN32_INPUT_H diff --git a/src/carma2/platform/win32/win32_sound.h b/src/carma2/platform/win32/win32_sound.h index 40201a1b5b..ab5514e857 100644 --- a/src/carma2/platform/win32/win32_sound.h +++ b/src/carma2/platform/win32/win32_sound.h @@ -32,48 +32,48 @@ enum tSSDXFlags { SSDX_InitDirectSound = 0x2, }; -int C2_HOOK_FASTCALL PDS3Init(void); +extern int C2_HOOK_FASTCALL PDS3Init(void); -int C2_HOOK_FASTCALL PDS3DDXInit(void); +extern int C2_HOOK_FASTCALL PDS3DDXInit(void); -int C2_HOOK_FASTCALL PDS3InitCDA(void); +extern int C2_HOOK_FASTCALL PDS3InitCDA(void); -void* C2_HOOK_FASTCALL PDS3CreateSoundBuffer(tS3_wav_info* pWav_info, void* pWav_buffer); +extern void* C2_HOOK_FASTCALL PDS3CreateSoundBuffer(tS3_wav_info* pWav_info, void* pWav_buffer); -void C2_HOOK_FASTCALL PDS3ReleaseSound(tS3_descriptor* pSound_descriptor); +extern void C2_HOOK_FASTCALL PDS3ReleaseSound(tS3_descriptor* pSound_descriptor); -int C2_HOOK_FASTCALL PDReverseAudio(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDReverseAudio(tS3_channel* pChannel); -const char* C2_HOOK_FASTCALL PDS3GetWorkingDirectory(void); +extern const char* C2_HOOK_FASTCALL PDS3GetWorkingDirectory(void); -int C2_HOOK_FASTCALL PDS3StopMidiChannel(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3StopMidiChannel(tS3_channel* pChannel); -void C2_HOOK_FASTCALL PDS3CheckCDAMedia(tS3_channel* pChannel); +extern void C2_HOOK_FASTCALL PDS3CheckCDAMedia(tS3_channel* pChannel); -int C2_HOOK_FASTCALL PDS3StopCDAChannel(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3StopCDAChannel(tS3_channel* pChannel); -int C2_HOOK_FASTCALL PDS3StopSampleChannel(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3StopSampleChannel(tS3_channel* pChannel); -int C2_HOOK_FASTCALL PDS3UpdateChannelVolume(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3UpdateChannelVolume(tS3_channel* pChannel); -void C2_HOOK_FASTCALL PDS3UpdateCDAVolume(tS3_channel* pChannel, int pVolume); +extern void C2_HOOK_FASTCALL PDS3UpdateCDAVolume(tS3_channel* pChannel, int pVolume); -void C2_HOOK_FASTCALL PDS3Stop(void); +extern void C2_HOOK_FASTCALL PDS3Stop(void); -int C2_HOOK_FASTCALL PDS3IsMIDIStopped(tS3_channel *pChannel); +extern int C2_HOOK_FASTCALL PDS3IsMIDIStopped(tS3_channel *pChannel); -int C2_HOOK_FASTCALL PDS3IsCDAPlaying(void); +extern int C2_HOOK_FASTCALL PDS3IsCDAPlaying(void); -int C2_HOOK_FASTCALL PDS3IsSamplePlaying(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3IsSamplePlaying(tS3_channel* pChannel); -int C2_HOOK_FASTCALL PDS3UpdateChannelFrequency(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3UpdateChannelFrequency(tS3_channel* pChannel); -int C2_HOOK_FASTCALL PDS3PlaySample(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDS3PlaySample(tS3_channel* pChannel); -tS3_error_codes C2_HOOK_FASTCALL PDS3StartMidiChannel(tS3_channel* pChannel); +extern tS3_error_codes C2_HOOK_FASTCALL PDS3StartMidiChannel(tS3_channel* pChannel); -tS3_error_codes C2_HOOK_FASTCALL PDS3PlayCDAChannel(tS3_channel* pChannel); +extern tS3_error_codes C2_HOOK_FASTCALL PDS3PlayCDAChannel(tS3_channel* pChannel); -void C2_HOOK_FASTCALL PDS3ServiceCDA(tS32 pDelta_time); +extern void C2_HOOK_FASTCALL PDS3ServiceCDA(tS32 pDelta_time); #endif diff --git a/src/carma2/s3/include/s3/internal/audio.h b/src/carma2/s3/include/s3/internal/audio.h index 0b670918fe..4beede8fba 100644 --- a/src/carma2/s3/include/s3/internal/audio.h +++ b/src/carma2/s3/include/s3/internal/audio.h @@ -24,130 +24,130 @@ extern int gS3_delta_time; extern int gS3_inside_cockpit; extern br_uint_32 gS3_last_service_time_spatial; -int C2_HOOK_FASTCALL S3Init(const char* pPath, int pLow_memory_mode, const char* pSound_path); +extern int C2_HOOK_FASTCALL S3Init(const char* pPath, int pLow_memory_mode, const char* pSound_path); -void C2_HOOK_FASTCALL S3Enable(void); +extern void C2_HOOK_FASTCALL S3Enable(void); -void C2_HOOK_FASTCALL S3Disable(void); +extern void C2_HOOK_FASTCALL S3Disable(void); -int C2_HOOK_FASTCALL S3StopChannel(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL S3StopChannel(tS3_channel* pChannel); -int C2_HOOK_FASTCALL S3GetCountChannels(int pCount_channels_1, int pCount_channels_2); +extern int C2_HOOK_FASTCALL S3GetCountChannels(int pCount_channels_1, int pCount_channels_2); -tS3_outlet* C2_HOOK_FASTCALL S3CreateOutlet(int pCount_channels_1, int pCount_channels_2); +extern tS3_outlet* C2_HOOK_FASTCALL S3CreateOutlet(int pCount_channels_1, int pCount_channels_2); -tS3_error_codes C2_HOOK_FASTCALL S3ReleaseOutlet(tS3_outlet* pOutlet); +extern tS3_error_codes C2_HOOK_FASTCALL S3ReleaseOutlet(tS3_outlet* pOutlet); -int C2_HOOK_FASTCALL S3SetOutletVolume(tS3_outlet* pOutlet, int pVolume); +extern int C2_HOOK_FASTCALL S3SetOutletVolume(tS3_outlet* pOutlet, int pVolume); -void C2_HOOK_FASTCALL S3StopAllOutletSounds(void); +extern void C2_HOOK_FASTCALL S3StopAllOutletSounds(void); -int C2_HOOK_FASTCALL S3StopOutletSound(tS3_outlet* pOutlet); +extern int C2_HOOK_FASTCALL S3StopOutletSound(tS3_outlet* pOutlet); -int C2_HOOK_FASTCALL S3ReleaseSoundSource(tS3_sound_source* src); +extern int C2_HOOK_FASTCALL S3ReleaseSoundSource(tS3_sound_source* src); -tS3_error_codes C2_HOOK_FASTCALL S3StopSound(int pTag); +extern tS3_error_codes C2_HOOK_FASTCALL S3StopSound(int pTag); -void C2_HOOK_FASTCALL S3UpdateListenerVectors(void); +extern void C2_HOOK_FASTCALL S3UpdateListenerVectors(void); -void C2_HOOK_FASTCALL S3Service(int inside_cockpit, int unk1); +extern void C2_HOOK_FASTCALL S3Service(int inside_cockpit, int unk1); -int C2_HOOK_FASTCALL S3DisableSound(void); +extern int C2_HOOK_FASTCALL S3DisableSound(void); -void C2_HOOK_FASTCALL S3EnableCDA(void); +extern void C2_HOOK_FASTCALL S3EnableCDA(void); -void* C2_HOOK_FASTCALL S3LoadSoundBankFile(const char* pPath); +extern void* C2_HOOK_FASTCALL S3LoadSoundBankFile(const char* pPath); -int C2_HOOK_FASTCALL S3LoadSoundbank(const char* pPath, int pLow_memory_mode); +extern int C2_HOOK_FASTCALL S3LoadSoundbank(const char* pPath, int pLow_memory_mode); -int C2_HOOK_FASTCALL S3CreateOutletChannels(tS3_outlet* outlet, int pChannel_count); +extern int C2_HOOK_FASTCALL S3CreateOutletChannels(tS3_outlet* outlet, int pChannel_count); -void C2_HOOK_FASTCALL S3SoundBankReaderSkipWhitespace(tS3_soundbank_read_ctx* pContext); +extern void C2_HOOK_FASTCALL S3SoundBankReaderSkipWhitespace(tS3_soundbank_read_ctx* pContext); -int C2_HOOK_FASTCALL S3SoundBankReadEntry(tS3_soundbank_read_ctx *pContext, const char* pDir_name, int pLow_memory_mode); +extern int C2_HOOK_FASTCALL S3SoundBankReadEntry(tS3_soundbank_read_ctx *pContext, const char* pDir_name, int pLow_memory_mode); -void C2_HOOK_FASTCALL S3SoundBankReaderNextLine(tS3_soundbank_read_ctx* pContext); +extern void C2_HOOK_FASTCALL S3SoundBankReaderNextLine(tS3_soundbank_read_ctx* pContext); -void C2_HOOK_FASTCALL S3SoundBankReaderSkipToNewline(tS3_soundbank_read_ctx* pContext); +extern void C2_HOOK_FASTCALL S3SoundBankReaderSkipToNewline(tS3_soundbank_read_ctx* pContext); -void C2_HOOK_FASTCALL S3SoundBankReaderAdvance(tS3_soundbank_read_ctx* pContext, int pAmount); +extern void C2_HOOK_FASTCALL S3SoundBankReaderAdvance(tS3_soundbank_read_ctx* pContext, int pAmount); -tS3_descriptor* C2_HOOK_FASTCALL S3CreateDescriptor(void); +extern tS3_descriptor* C2_HOOK_FASTCALL S3CreateDescriptor(void); -int C2_HOOK_FASTCALL S3SoundBankReaderReadFilename(char** pPath, tS3_soundbank_read_ctx* pContext, const char* pDir_name); +extern int C2_HOOK_FASTCALL S3SoundBankReaderReadFilename(char** pPath, tS3_soundbank_read_ctx* pContext, const char* pDir_name); -void C2_HOOK_FASTCALL S3StopMidi(void); +extern void C2_HOOK_FASTCALL S3StopMidi(void); -void C2_HOOK_FASTCALL S3StopCDA(void); +extern void C2_HOOK_FASTCALL S3StopCDA(void); -void C2_HOOK_FASTCALL S3StopMidiInternal(void); +extern void C2_HOOK_FASTCALL S3StopMidiInternal(void); -int C2_HOOK_FASTCALL S3StopMIDIChannel(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL S3StopMIDIChannel(tS3_channel* pChannel); -int C2_HOOK_FASTCALL S3StopCDAInternal(void); +extern int C2_HOOK_FASTCALL S3StopCDAInternal(void); -int C2_HOOK_FASTCALL S3StopCDAChannel(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL S3StopCDAChannel(tS3_channel* pChannel); -int C2_HOOK_FASTCALL S3UnbindChannels(tS3_outlet* pOutlet); +extern int C2_HOOK_FASTCALL S3UnbindChannels(tS3_outlet* pOutlet); -tS3_channel* C2_HOOK_FASTCALL S3GetChannelForTag(int pTag); +extern tS3_channel* C2_HOOK_FASTCALL S3GetChannelForTag(int pTag); -tS3_error_codes C2_HOOK_FASTCALL S3ClearBufferOfMidiChannel(int pTag); +extern tS3_error_codes C2_HOOK_FASTCALL S3ClearBufferOfMidiChannel(int pTag); -int C2_HOOK_FASTCALL S3ReleaseSound(int pSound_id); +extern int C2_HOOK_FASTCALL S3ReleaseSound(int pSound_id); -double C2_HOOK_STDCALL S3FRandomBetween(double pMin, double pMax); +extern double C2_HOOK_STDCALL S3FRandomBetween(double pMin, double pMax); -int C2_HOOK_FASTCALL S3IRandomBetween(int pMin, int pMax, int pDefault); +extern int C2_HOOK_FASTCALL S3IRandomBetween(int pMin, int pMax, int pDefault); -int C2_HOOK_FASTCALL S3IRandomBetweenLog(int pMin, int pMax, int pDefault); +extern int C2_HOOK_FASTCALL S3IRandomBetweenLog(int pMin, int pMax, int pDefault); -int C2_HOOK_FASTCALL S3FreeUnboundChannels(void); +extern int C2_HOOK_FASTCALL S3FreeUnboundChannels(void); -int C2_HOOK_FASTCALL S3SoundStillPlaying(int pTag); +extern int C2_HOOK_FASTCALL S3SoundStillPlaying(int pTag); -int C2_HOOK_FASTCALL S3SetVolume(int pVolume); +extern int C2_HOOK_FASTCALL S3SetVolume(int pVolume); -int C2_HOOK_FASTCALL S3ServiceChannel(tS3_channel *pChannel); +extern int C2_HOOK_FASTCALL S3ServiceChannel(tS3_channel *pChannel); -int C2_HOOK_FASTCALL S3ServiceSpatialSound(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL S3ServiceSpatialSound(tS3_channel* pChannel); -tS3_sound_source* C2_HOOK_FASTCALL S3CreateSoundSource(void* pPosition, void* pVelocity, tS3_outlet* pBound_outlet); +extern tS3_sound_source* C2_HOOK_FASTCALL S3CreateSoundSource(void* pPosition, void* pVelocity, tS3_outlet* pBound_outlet); -tS3_sound_source* C2_HOOK_FASTCALL S3CreateSoundSourceBR(br_vector3* pPosition, br_vector3* pVelocity, tS3_outlet* pBound_outlet); +extern tS3_sound_source* C2_HOOK_FASTCALL S3CreateSoundSourceBR(br_vector3* pPosition, br_vector3* pVelocity, tS3_outlet* pBound_outlet); -int C2_HOOK_FASTCALL S3IsCDAEnabled(void); +extern int C2_HOOK_FASTCALL S3IsCDAEnabled(void); -void C2_HOOK_FASTCALL S3CalculateRandomizedFields(tS3_channel* chan, tS3_descriptor* desc); +extern void C2_HOOK_FASTCALL S3CalculateRandomizedFields(tS3_channel* chan, tS3_descriptor* desc); -int C2_HOOK_FASTCALL S3CalculatePriority(int pPriority, int pVolumeFactor); +extern int C2_HOOK_FASTCALL S3CalculatePriority(int pPriority, int pVolumeFactor); -int C2_HOOK_FASTCALL S3GenerateTag(tS3_outlet* outlet); +extern int C2_HOOK_FASTCALL S3GenerateTag(tS3_outlet* outlet); -tS3_channel* C2_HOOK_FASTCALL S3AllocateChannel(tS3_outlet* pOutlet, int pPriority); +extern tS3_channel* C2_HOOK_FASTCALL S3AllocateChannel(tS3_outlet* pOutlet, int pPriority); -int C2_HOOK_FASTCALL S3MIDILoadSong2(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL S3MIDILoadSong2(tS3_channel* pChannel); -tS3_error_codes C2_HOOK_FASTCALL S3MIDILoadSong(tS3_channel* pChannel); +extern tS3_error_codes C2_HOOK_FASTCALL S3MIDILoadSong(tS3_channel* pChannel); -int C2_HOOK_FASTCALL S3ExecuteSampleFilterFuncs(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL S3ExecuteSampleFilterFuncs(tS3_channel* pChannel); -tS3_error_codes C2_HOOK_FASTCALL S3PlayMIDI(tS3_channel* pChannel); +extern tS3_error_codes C2_HOOK_FASTCALL S3PlayMIDI(tS3_channel* pChannel); -int C2_HOOK_FASTCALL S3SetMIDIVolume2(tS3_channel* pChannel, int pVolume); +extern int C2_HOOK_FASTCALL S3SetMIDIVolume2(tS3_channel* pChannel, int pVolume); -int C2_HOOK_FASTCALL S3SetMIDIVolume(tS3_channel* pChannel, int pVolume); +extern int C2_HOOK_FASTCALL S3SetMIDIVolume(tS3_channel* pChannel, int pVolume); -tS3_error_codes C2_HOOK_FASTCALL S3PlayCDA(tS3_channel* pChannel); +extern tS3_error_codes C2_HOOK_FASTCALL S3PlayCDA(tS3_channel* pChannel); -int C2_HOOK_FASTCALL S3StartSound(tS3_outlet* pOutlet, tS3_sound_id pSound); +extern int C2_HOOK_FASTCALL S3StartSound(tS3_outlet* pOutlet, tS3_sound_id pSound); -int C2_HOOK_FASTCALL S3StartSound2(tS3_outlet* pOutlet, tS3_sound_id pSound, unsigned int pRepeats, int pLeft_volume, int pRight_volume, int pLeft_pitch, int pRight_pitch); +extern int C2_HOOK_FASTCALL S3StartSound2(tS3_outlet* pOutlet, tS3_sound_id pSound, unsigned int pRepeats, int pLeft_volume, int pRight_volume, int pLeft_pitch, int pRight_pitch); -tS3_error_codes C2_HOOK_FASTCALL S3MIDITagHasStoppedPlaying(int pTag); +extern tS3_error_codes C2_HOOK_FASTCALL S3MIDITagHasStoppedPlaying(int pTag); -int C2_HOOK_FASTCALL S3ServiceMIDIChannel(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL S3ServiceMIDIChannel(tS3_channel* pChannel); -int C2_HOOK_FASTCALL S3IsCDAPlaying(void); +extern int C2_HOOK_FASTCALL S3IsCDAPlaying(void); #endif // S3_AUDIO_H diff --git a/src/carma2/s3/include/s3/s3.h b/src/carma2/s3/include/s3/s3.h index d98692be70..ceab15892a 100644 --- a/src/carma2/s3/include/s3/s3.h +++ b/src/carma2/s3/include/s3/s3.h @@ -229,66 +229,66 @@ extern char gS3_sound_folder_name[6]; extern tS3_callbacks gS3_callbacks; extern int gS3_CDA_enabled; -int C2_HOOK_FASTCALL S3Init(const char* pPath, int pLow_memory_mode, const char* pSound_path); +extern int C2_HOOK_FASTCALL S3Init(const char* pPath, int pLow_memory_mode, const char* pSound_path); -void C2_HOOK_FASTCALL S3Enable(void); +extern void C2_HOOK_FASTCALL S3Enable(void); -void C2_HOOK_FASTCALL S3Disable(void); +extern void C2_HOOK_FASTCALL S3Disable(void); -tS3_outlet* C2_HOOK_FASTCALL S3CreateOutlet(int pCount_channels_1, int pCount_channels_2); +extern tS3_outlet* C2_HOOK_FASTCALL S3CreateOutlet(int pCount_channels_1, int pCount_channels_2); -tS3_error_codes C2_HOOK_FASTCALL S3ReleaseOutlet(tS3_outlet* pOutlet); +extern tS3_error_codes C2_HOOK_FASTCALL S3ReleaseOutlet(tS3_outlet* pOutlet); -int C2_HOOK_FASTCALL S3SetOutletVolume(tS3_outlet* pOutlet, int pVolume); +extern int C2_HOOK_FASTCALL S3SetOutletVolume(tS3_outlet* pOutlet, int pVolume); -void C2_HOOK_FASTCALL S3StopAllOutletSounds(void); +extern void C2_HOOK_FASTCALL S3StopAllOutletSounds(void); -int C2_HOOK_FASTCALL S3StopOutletSound(tS3_outlet* pOutlet); +extern int C2_HOOK_FASTCALL S3StopOutletSound(tS3_outlet* pOutlet); -int C2_HOOK_FASTCALL S3ReleaseSoundSource(tS3_sound_source* src); +extern int C2_HOOK_FASTCALL S3ReleaseSoundSource(tS3_sound_source* src); -int C2_HOOK_FASTCALL S3StartSound(tS3_outlet* pOutlet, tS3_sound_id pSound); +extern int C2_HOOK_FASTCALL S3StartSound(tS3_outlet* pOutlet, tS3_sound_id pSound); -int C2_HOOK_FASTCALL DRS3StartSound2(tS3_outlet* pOutlet, tS3_sound_id pSound, unsigned int pRepeats, int pLeft_volume, int pRight_volume, int pLeft_pitch, int pRight_pitch); +extern int C2_HOOK_FASTCALL DRS3StartSound2(tS3_outlet* pOutlet, tS3_sound_id pSound, unsigned int pRepeats, int pLeft_volume, int pRight_volume, int pLeft_pitch, int pRight_pitch); -int C2_HOOK_FASTCALL S3StartSound2(tS3_outlet* pOutlet, tS3_sound_id pSound, unsigned int pRepeats, int pLeft_volume, int pRight_volume, int pLeft_pitch, int pRight_pitch); +extern int C2_HOOK_FASTCALL S3StartSound2(tS3_outlet* pOutlet, tS3_sound_id pSound, unsigned int pRepeats, int pLeft_volume, int pRight_volume, int pLeft_pitch, int pRight_pitch); -tS3_error_codes C2_HOOK_FASTCALL S3StopSound(int pTag); +extern tS3_error_codes C2_HOOK_FASTCALL S3StopSound(int pTag); -void C2_HOOK_FASTCALL S3Service(int inside_cockpit, int unk1); +extern void C2_HOOK_FASTCALL S3Service(int inside_cockpit, int unk1); -void C2_HOOK_FASTCALL S3UpdateSoundSource(tS3_outlet* outlet, tS3_sound_tag tag, tS3_sound_source* src, float pMax_distance_squared, int pPeriod, tS3_repeats pAmbient_repeats, tS3_volume pVolume, int pPitch, tS3_speed pSpeed); +extern void C2_HOOK_FASTCALL S3UpdateSoundSource(tS3_outlet* outlet, tS3_sound_tag tag, tS3_sound_source* src, float pMax_distance_squared, int pPeriod, tS3_repeats pAmbient_repeats, tS3_volume pVolume, int pPitch, tS3_speed pSpeed); -int C2_HOOK_STDCALL S3Set3DSoundEnvironment(float a1, float a2, float a3); +extern int C2_HOOK_STDCALL S3Set3DSoundEnvironment(float a1, float a2, float a3); -tS3_buffer_desc* C2_HOOK_FASTCALL S3GetBufferDescription(int pSample_id); +extern tS3_buffer_desc* C2_HOOK_FASTCALL S3GetBufferDescription(int pSample_id); -tS3_error_codes C2_HOOK_FASTCALL S3LoadSample(int pSample_id); +extern tS3_error_codes C2_HOOK_FASTCALL S3LoadSample(int pSample_id); -void C2_HOOK_FASTCALL S3EnableCDA(void); +extern void C2_HOOK_FASTCALL S3EnableCDA(void); -int C2_HOOK_FASTCALL PDReverseAudio(tS3_channel* pChannel); +extern int C2_HOOK_FASTCALL PDReverseAudio(tS3_channel* pChannel); -int C2_HOOK_FASTCALL S3DisableSound(void); +extern int C2_HOOK_FASTCALL S3DisableSound(void); -int C2_HOOK_FASTCALL S3SoundStillPlaying(int pTag); +extern int C2_HOOK_FASTCALL S3SoundStillPlaying(int pTag); -int C2_HOOK_FASTCALL S3SetVolume(int pVolume); +extern int C2_HOOK_FASTCALL S3SetVolume(int pVolume); -void C2_HOOK_FASTCALL S3BindListenerPositionBRender(br_vector3* pos); +extern void C2_HOOK_FASTCALL S3BindListenerPositionBRender(br_vector3* pos); -void C2_HOOK_FASTCALL S3BindListenerVelocityBRender(br_vector3* vel); +extern void C2_HOOK_FASTCALL S3BindListenerVelocityBRender(br_vector3* vel); -void C2_HOOK_FASTCALL S3BindListenerLeftBRender(br_vector3* left); +extern void C2_HOOK_FASTCALL S3BindListenerLeftBRender(br_vector3* left); -tS3_sound_source* C2_HOOK_FASTCALL S3CreateSoundSource(void* pPosition, void* pVelocity, tS3_outlet* pBound_outlet); +extern tS3_sound_source* C2_HOOK_FASTCALL S3CreateSoundSource(void* pPosition, void* pVelocity, tS3_outlet* pBound_outlet); -tS3_sound_source* C2_HOOK_FASTCALL S3CreateSoundSourceBR(br_vector3* pPosition, br_vector3* pVelocity, tS3_outlet* pBound_outlet); +extern tS3_sound_source* C2_HOOK_FASTCALL S3CreateSoundSourceBR(br_vector3* pPosition, br_vector3* pVelocity, tS3_outlet* pBound_outlet); -int C2_HOOK_FASTCALL S3BindAmbientSoundToOutlet(tS3_outlet* pOutlet, int pSound, tS3_sound_source* source, float pMax_distance, int pPeriod, int pRepeats, int pVolume, int pPitch, int pSpeed); +extern int C2_HOOK_FASTCALL S3BindAmbientSoundToOutlet(tS3_outlet* pOutlet, int pSound, tS3_sound_source* source, float pMax_distance, int pPeriod, int pRepeats, int pVolume, int pPitch, int pSpeed); -int C2_HOOK_FASTCALL S3IsCDAEnabled(void); +extern int C2_HOOK_FASTCALL S3IsCDAEnabled(void); -int C2_HOOK_FASTCALL S3IsCDAPlaying(void); +extern int C2_HOOK_FASTCALL S3IsCDAPlaying(void); #endif From 87f0df57016f589a7838ccae7951628b5732aea5 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 11:31:06 +0200 Subject: [PATCH 13/34] Match DRModelUpdateDeluxTurbo --- src/carma2/newcommon/41-utility.c | 15 ++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index a4dc5437da..0ccb380c16 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -638,7 +638,20 @@ void C2_HOOK_FASTCALL DRModelUpdateAndKevificateMaterials(br_model* pModel, br_u } } -// DRModelUpdateDeluxTurbo +// FUNCTION: CARMA2_HW 0x00516010 +int C2_HOOK_FASTCALL DRModelUpdateDeluxTurbo(br_actor* pActor, br_model* pModel, br_uint_16 pFlags) { + + if (pModel->nfaces == 0 || pModel->nvertices == 0) { + + pActor->type = BR_ACTOR_NONE; + pActor->model = NULL; + return 0; + } else { + + DRModelUpdateAndKevificateMaterials(pModel,pFlags); + return 1; + } +} // DistanceFromFace diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 21dbf0b7c3..fed58d0312 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -133,7 +133,7 @@ extern void C2_HOOK_FASTCALL BlendifyMaterial(br_material* pMaterial, int pPerce extern void C2_HOOK_FASTCALL DRModelUpdateAndKevificateMaterials(br_model* pModel, br_uint_16 pFlags); -// DRModelUpdateDeluxTurbo +extern int C2_HOOK_FASTCALL DRModelUpdateDeluxTurbo(br_actor* pActor, br_model* pModel, br_uint_16 pFlags); // DistanceFromFace From 8ea8279ba2ceee02177514a6c73c20270c83850d Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 11:35:32 +0200 Subject: [PATCH 14/34] Match TestForNan --- 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 0ccb380c16..c89b6aae96 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -657,7 +657,15 @@ int C2_HOOK_FASTCALL DRModelUpdateDeluxTurbo(br_actor* pActor, br_model* pModel, // DRBoundsCopy -// TestForNan +// FUNCTION: CARMA2_HW 0x005160f0 +int C2_HOOK_FASTCALL TestForNan(float* f) { + + if (f != NULL) { + return ((~*(tU32*)f) & 0x7f800000) == 0; + } else { + return 0; + } +} // DRVector3TestForNan diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index fed58d0312..843441b1f0 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -139,7 +139,7 @@ extern int C2_HOOK_FASTCALL DRModelUpdateDeluxTurbo(br_actor* pActor, br_model* // DRBoundsCopy -// TestForNan +extern int C2_HOOK_FASTCALL TestForNan(float* f); // DRVector3TestForNan From efb6549e88e080eeb8e7822076b1a552027d45fe Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 11:43:49 +0200 Subject: [PATCH 15/34] Match DRVector3TestForNan --- src/carma2/newcommon/41-utility.c | 12 ++++++++++-- src/carma2/newcommon/41-utility.h | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index c89b6aae96..12a0b15f99 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -658,7 +658,7 @@ int C2_HOOK_FASTCALL DRModelUpdateDeluxTurbo(br_actor* pActor, br_model* pModel, // DRBoundsCopy // FUNCTION: CARMA2_HW 0x005160f0 -int C2_HOOK_FASTCALL TestForNan(float* f) { +int C2_HOOK_FASTCALL TestForNan(const float* f) { if (f != NULL) { return ((~*(tU32*)f) & 0x7f800000) == 0; @@ -667,7 +667,15 @@ int C2_HOOK_FASTCALL TestForNan(float* f) { } } -// DRVector3TestForNan +// FUNCTION: CARMA2_HW 0x00516160 +int C2_HOOK_FASTCALL DRVector3TestForNan(const br_vector3* pV) { + + if (pV != NULL) { + return TestForNan(&pV->v[0]) || TestForNan(&pV->v[1]) || TestForNan(&pV->v[2]); + } else { + return 0; + } +} // DRScaleModel diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 843441b1f0..3feac814b6 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -139,9 +139,9 @@ extern int C2_HOOK_FASTCALL DRModelUpdateDeluxTurbo(br_actor* pActor, br_model* // DRBoundsCopy -extern int C2_HOOK_FASTCALL TestForNan(float* f); +extern int C2_HOOK_FASTCALL TestForNan(const float* f); -// DRVector3TestForNan +extern int C2_HOOK_FASTCALL DRVector3TestForNan(const br_vector3* pV); // DRScaleModel From 00cad191e54a8dc8038ca4ff8f0614dcbdd3f8b7 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 11:59:01 +0200 Subject: [PATCH 16/34] Implement DRScaleModel [accuracy=42.67%] --- src/carma2/newcommon/41-utility.c | 15 ++++++++++++++- src/carma2/newcommon/61-pedestrn.h | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 12a0b15f99..a408fae0de 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -677,7 +677,20 @@ int C2_HOOK_FASTCALL DRVector3TestForNan(const br_vector3* pV) { } } -// DRScaleModel +// FUNCTION: CARMA2_HW 0x00516240 +void C2_HOOK_FASTCALL DRScaleModel(br_model* pModel, float pScale) { + int i; + br_vertex *vertex; + + if (pModel->nvertices != 0) { + vertex = pModel->vertices; + for (i = 0; i < pModel->nvertices; i++, vertex++) { + + BrVector3Scale(&vertex->p, &vertex->p, pScale); + } + BrModelUpdate(pModel, BR_MODU_ALL); + } +} // DistanceFromFaceND diff --git a/src/carma2/newcommon/61-pedestrn.h b/src/carma2/newcommon/61-pedestrn.h index 162944756f..361fd9b3ac 100644 --- a/src/carma2/newcommon/61-pedestrn.h +++ b/src/carma2/newcommon/61-pedestrn.h @@ -365,7 +365,7 @@ extern void C2_HOOK_FASTCALL SetGoreLevel(int pNewLevel); // ScaleModelXYZ -// ScaleModel +// DRScaleModel // DisposeMove From 7f0f84f153662a254ddafde3596bc5c3d5d699c1 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 12:06:18 +0200 Subject: [PATCH 17/34] Implement DistanceFromFaceND [accuracy=57.14%] --- 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 a408fae0de..1b1dea892d 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -692,7 +692,11 @@ void C2_HOOK_FASTCALL DRScaleModel(br_model* pModel, float pScale) { } } -// DistanceFromFaceND +// FUNCTION: CARMA2_HW 0x005162a0 +float C2_HOOK_FASTCALL DistanceFromFaceND(const br_vector3* pP, const br_vector3* pN, br_scalar pF) { + + return BrVector3Dot(pP, pN) - pF; +} // DRVector3NonZero diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 3feac814b6..37705de2c2 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -145,7 +145,7 @@ extern int C2_HOOK_FASTCALL DRVector3TestForNan(const br_vector3* pV); // DRScaleModel -// DistanceFromFaceND +extern float C2_HOOK_FASTCALL DistanceFromFaceND(const br_vector3* pP, const br_vector3* pN, br_scalar pF); // DRVector3NonZero From 061075f2fb5f19fe2f603202fa5dc57990fa03fe Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 12:24:44 +0200 Subject: [PATCH 18/34] Match DRVector3NonZero --- 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 1b1dea892d..9abc196ba8 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -698,7 +698,14 @@ float C2_HOOK_FASTCALL DistanceFromFaceND(const br_vector3* pP, const br_vector3 return BrVector3Dot(pP, pN) - pF; } -// DRVector3NonZero +// FUNCTION: CARMA2_HW 0x00516350 +int C2_HOOK_FASTCALL DRVector3NonZero(br_vector3* pV) { + if (pV->v[0] == 0.f && pV->v[1] == 0.f && pV->v[2] == 0.f) { + return 0; + } else { + return 1; + } +} // DRVector3Diminish diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 37705de2c2..e26f63eabc 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -147,7 +147,7 @@ extern int C2_HOOK_FASTCALL DRVector3TestForNan(const br_vector3* pV); extern float C2_HOOK_FASTCALL DistanceFromFaceND(const br_vector3* pP, const br_vector3* pN, br_scalar pF); -// DRVector3NonZero +extern int C2_HOOK_FASTCALL DRVector3NonZero(br_vector3* pV); // DRVector3Diminish From 7cc472a0517360b2e831027e1aae4be1e22459b6 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 12:44:18 +0200 Subject: [PATCH 19/34] Match DRVector3Diminish --- src/carma2/newcommon/41-utility.c | 18 ++++++++++++++++-- src/carma2/newcommon/41-utility.h | 4 ++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 9abc196ba8..6886387170 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -699,7 +699,7 @@ float C2_HOOK_FASTCALL DistanceFromFaceND(const br_vector3* pP, const br_vector3 } // FUNCTION: CARMA2_HW 0x00516350 -int C2_HOOK_FASTCALL DRVector3NonZero(br_vector3* pV) { +int C2_HOOK_FASTCALL DRVector3NonZero(const br_vector3* pV) { if (pV->v[0] == 0.f && pV->v[1] == 0.f && pV->v[2] == 0.f) { return 0; } else { @@ -707,7 +707,21 @@ int C2_HOOK_FASTCALL DRVector3NonZero(br_vector3* pV) { } } -// DRVector3Diminish +// FUNCTION: CARMA2_HW 0x00516390 +void C2_HOOK_FASTCALL DRVector3Diminish(br_vector3* pV1, const br_vector3* pV2) { + br_vector3 v1 = *pV1; + + BrVector3Sub(pV1, pV1, pV2); + if (v1.v[0] * pV1->v[0] <= 0.0f) { + pV1->v[0] = 0.0f; + } + if (v1.v[1] * pV1->v[1] <= 0.0f) { + pV1->v[1] = 0.0f; + } + if (v1.v[2] * pV1->v[2] <= 0.0f) { + pV1->v[2] = 0.0f; + } +} // DRScalarToU16 diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index e26f63eabc..7944cc4005 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -147,9 +147,9 @@ extern int C2_HOOK_FASTCALL DRVector3TestForNan(const br_vector3* pV); extern float C2_HOOK_FASTCALL DistanceFromFaceND(const br_vector3* pP, const br_vector3* pN, br_scalar pF); -extern int C2_HOOK_FASTCALL DRVector3NonZero(br_vector3* pV); +extern int C2_HOOK_FASTCALL DRVector3NonZero(const br_vector3* pV); -// DRVector3Diminish +extern void C2_HOOK_FASTCALL DRVector3Diminish(br_vector3* pV1, const br_vector3* pV2); // DRScalarToU16 From 9eef7592cf95062f26624f6b83a243ad80525829 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 12:45:22 +0200 Subject: [PATCH 20/34] Match DRScalarToU16 --- src/carma2/newcommon/41-utility.c | 11 ++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 6886387170..546c2a3e5d 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -723,7 +723,16 @@ void C2_HOOK_FASTCALL DRVector3Diminish(br_vector3* pV1, const br_vector3* pV2) } } -// DRScalarToU16 +// FUNCTION: CARMA2_HW 0x00516410 +tU16 C2_HOOK_FASTCALL DRScalarToU16(float pValue, float pMin, float pMax) { + + if (pValue < pMin) { + pValue = pMin; + } else if (pValue > pMax) { + pValue = pMax; + } + return (tU16)(((pValue - pMin) * 65535.0f) / (pMax - pMin) + 0.5f); +} // DRU16ToScalar diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 7944cc4005..3a7e540e21 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -151,7 +151,7 @@ extern int C2_HOOK_FASTCALL DRVector3NonZero(const br_vector3* pV); extern void C2_HOOK_FASTCALL DRVector3Diminish(br_vector3* pV1, const br_vector3* pV2); -// DRScalarToU16 +extern tU16 C2_HOOK_FASTCALL DRScalarToU16(float pValue, float pMin, float pMax); // DRU16ToScalar From a5e923c88593885d6e6ccfbd2c7e7b3256d7636e Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 14:01:57 +0200 Subject: [PATCH 21/34] Implement DRU16ToScalar [accuracy=92.31%] [call convention unclear] --- 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 546c2a3e5d..94fb130c8f 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -734,7 +734,14 @@ tU16 C2_HOOK_FASTCALL DRScalarToU16(float pValue, float pMin, float pMax) { return (tU16)(((pValue - pMin) * 65535.0f) / (pMax - pMin) + 0.5f); } -// DRU16ToScalar +// FUNCTION: CARMA2_HW 0x00516460 +br_scalar C2_HOOK_FASTCALL DRU16ToScalar(tU16 pValue, float pMin, float pMax) { + + // FIXME: what call convention does this function use? + // __thiscall is possible, but out of place + + return (float)pValue * (pMax - pMin) / 65535.0f + pMin; +} // CompressVector3 diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 3a7e540e21..550ffbf0ec 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -153,7 +153,7 @@ extern void C2_HOOK_FASTCALL DRVector3Diminish(br_vector3* pV1, const br_vector3 extern tU16 C2_HOOK_FASTCALL DRScalarToU16(float pValue, float pMin, float pMax); -// DRU16ToScalar +extern br_scalar C2_HOOK_FASTCALL DRU16ToScalar(tU16 pValue, float pMin, float pMax); // CompressVector3 From 12768d6115e3cc171c54fe231f3da504afb26ccf Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 14:03:47 +0200 Subject: [PATCH 22/34] Match CompressVector3 --- src/carma2/newcommon/41-utility.c | 8 +++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 94fb130c8f..a88f780935 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -743,7 +743,13 @@ br_scalar C2_HOOK_FASTCALL DRU16ToScalar(tU16 pValue, float pMin, float pMax) { return (float)pValue * (pMax - pMin) / 65535.0f + pMin; } -// CompressVector3 +// FUNCTION: CARMA2_HW 0x00516490 +void C2_HOOK_FASTCALL CompressVector3(tCompressed_vector3* pDest, const br_vector3* pSrc, float pMin, float pMax) { + + pDest->v[0] = DRScalarToU16(pSrc->v[0], pMin, pMax); + pDest->v[1] = DRScalarToU16(pSrc->v[1], pMin, pMax); + pDest->v[2] = DRScalarToU16(pSrc->v[2], pMin, pMax); +} // ExpandVector3 diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 550ffbf0ec..47724cd273 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -155,7 +155,7 @@ extern tU16 C2_HOOK_FASTCALL DRScalarToU16(float pValue, float pMin, float pMax) extern br_scalar C2_HOOK_FASTCALL DRU16ToScalar(tU16 pValue, float pMin, float pMax); -// CompressVector3 +extern void C2_HOOK_FASTCALL CompressVector3(tCompressed_vector3* pDest, const br_vector3* pSrc, float pMin, float pMax); // ExpandVector3 From d5372b1e1098c1a153070c2031336e8654ba80b3 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 14:07:46 +0200 Subject: [PATCH 23/34] Implement ExpandVector3 [accuracy=90%] --- src/carma2/newcommon/41-utility.c | 8 +++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index a88f780935..81d08e6050 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -751,7 +751,13 @@ void C2_HOOK_FASTCALL CompressVector3(tCompressed_vector3* pDest, const br_vecto pDest->v[2] = DRScalarToU16(pSrc->v[2], pMin, pMax); } -// ExpandVector3 +// FUNCTION: CARMA2_HW 0x00516570 +void C2_HOOK_FASTCALL ExpandVector3(br_vector3* pDest, const tCompressed_vector3 *pSrc, float pMin, float pMax) { + + pDest->v[0] = DRU16ToScalar(pSrc->v[0], pMin, pMax); + pDest->v[1] = DRU16ToScalar(pSrc->v[1], pMin, pMax); + pDest->v[2] = DRU16ToScalar(pSrc->v[2], pMin, pMax); +} // CompressMatrix34 diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 47724cd273..ccb052c18e 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -157,7 +157,7 @@ extern br_scalar C2_HOOK_FASTCALL DRU16ToScalar(tU16 pValue, float pMin, float p extern void C2_HOOK_FASTCALL CompressVector3(tCompressed_vector3* pDest, const br_vector3* pSrc, float pMin, float pMax); -// ExpandVector3 +extern void C2_HOOK_FASTCALL ExpandVector3(br_vector3* pDest, const tCompressed_vector3 *pSrc, float pMin, float pMax); // CompressMatrix34 From 461cf6ed1102e50f43ab63abfe3ab5b5314cf35b Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 14:34:04 +0200 Subject: [PATCH 24/34] Implement CompressMatrix34 [accuracy=95.83%] --- src/carma2/newcommon/41-utility.c | 21 +++++++++++++++++++-- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 81d08e6050..56f14a1805 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -731,7 +731,7 @@ tU16 C2_HOOK_FASTCALL DRScalarToU16(float pValue, float pMin, float pMax) { } else if (pValue > pMax) { pValue = pMax; } - return (tU16)(((pValue - pMin) * 65535.0f) / (pMax - pMin) + 0.5f); + return (tU16)((pValue - pMin) * 65535.0f / (pMax - pMin) + 0.5f); } // FUNCTION: CARMA2_HW 0x00516460 @@ -759,7 +759,24 @@ void C2_HOOK_FASTCALL ExpandVector3(br_vector3* pDest, const tCompressed_vector3 pDest->v[2] = DRU16ToScalar(pSrc->v[2], pMin, pMax); } -// CompressMatrix34 +// FUNCTION: CARMA2_HW 0x005165e0 +void C2_HOOK_FASTCALL CompressMatrix34(tCompressed_matrix3* pCompressed_matrix3, int* pInactive, const br_matrix34* pMatrix) { + br_vector3 pos; + + if (pMatrix->m[3][0] >= 500.0f) { + *pInactive = 1; + BrVector3Set(&pos, + pMatrix->m[3][0] - 1000.0f, + pMatrix->m[3][1] - 1000.0f, + pMatrix->m[3][2] - 1000.0f); + } else { + *pInactive = 0; + BrVector3Copy(&pos, (const br_vector3*)pMatrix->m[3]); + } + CompressVector3(&pCompressed_matrix3->m0, (const br_vector3*)pMatrix->m[0], -1.1f, 1.1f); + CompressVector3(&pCompressed_matrix3->m1, (const br_vector3*)pMatrix->m[1], -1.1f, 1.1f); + CompressVector3(&pCompressed_matrix3->p, &pos, -300.0f, 300.0f); +} // ExpandMatrix34 diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index ccb052c18e..99f54dfdf9 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -159,7 +159,7 @@ extern void C2_HOOK_FASTCALL CompressVector3(tCompressed_vector3* pDest, const b extern void C2_HOOK_FASTCALL ExpandVector3(br_vector3* pDest, const tCompressed_vector3 *pSrc, float pMin, float pMax); -// CompressMatrix34 +extern void C2_HOOK_FASTCALL CompressMatrix34(tCompressed_matrix3* pCompressed_matrix3, int* pInactive, const br_matrix34* pMatrix); // ExpandMatrix34 From 86f5b0bb891bd51932d5bda575addde37be9a497 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 14:39:40 +0200 Subject: [PATCH 25/34] Implement ExpandMatrix34 [accuracy=48.93%] --- src/carma2/newcommon/41-utility.c | 18 +++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 56f14a1805..f4986761b3 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -778,7 +778,23 @@ void C2_HOOK_FASTCALL CompressMatrix34(tCompressed_matrix3* pCompressed_matrix3, CompressVector3(&pCompressed_matrix3->p, &pos, -300.0f, 300.0f); } -// ExpandMatrix34 +// FUNCTION: CARMA2_HW 0x00516910 +void C2_HOOK_FASTCALL ExpandMatrix34(br_matrix34* pMatrix, const tCompressed_matrix3* pCompressed, int pInactive) { + + ExpandVector3((br_vector3*)pMatrix->m[0], &pCompressed->m0, -1.1f, 1.1f); + BrVector3Normalise((br_vector3*)pMatrix->m[0], (br_vector3*)pMatrix->m[0]); + ExpandVector3((br_vector3*)pMatrix->m[1], &pCompressed->m1, -1.1f, 1.1f); + BrVector3Normalise((br_vector3*)pMatrix->m[1], (br_vector3*)pMatrix->m[1]); + BrVector3Cross((br_vector3*)pMatrix->m[2], (br_vector3*)pMatrix->m[0], (br_vector3*)pMatrix->m[1]); + BrVector3Normalise((br_vector3*)pMatrix->m[2], (br_vector3*)pMatrix->m[2]); + ExpandVector3((br_vector3*)pMatrix->m[3], &pCompressed->p, 300.0f, 300.0f); + if (pInactive) { + BrVector3Set((br_vector3*)pMatrix->m[3], + pMatrix->m[3][0] + 1000.0f, + pMatrix->m[3][1] + 1000.0f, + pMatrix->m[3][2] + 1000.0f); + } +} // PossibleLock diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 99f54dfdf9..2e60a38725 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -161,7 +161,7 @@ extern void C2_HOOK_FASTCALL ExpandVector3(br_vector3* pDest, const tCompressed_ extern void C2_HOOK_FASTCALL CompressMatrix34(tCompressed_matrix3* pCompressed_matrix3, int* pInactive, const br_matrix34* pMatrix); -// ExpandMatrix34 +extern void C2_HOOK_FASTCALL ExpandMatrix34(br_matrix34* pMatrix, const tCompressed_matrix3* pCompressed, int pInactive); // PossibleLock From 6e898c1344e5263875d42321236799f58d64c443 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 15:04:53 +0200 Subject: [PATCH 26/34] Match PossibleLock --- src/carma2/newcommon/41-utility.c | 8 +++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index f4986761b3..1328b68a1e 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -796,7 +796,13 @@ void C2_HOOK_FASTCALL ExpandMatrix34(br_matrix34* pMatrix, const tCompressed_mat } } -// PossibleLock +// FUNCTION: CARMA2_HW 0x00516c10 +void C2_HOOK_FASTCALL PossibleLock(int pValue) { + + if (gBack_screen->pixels == NULL) { + BrPixelmapDirectLock(gBack_screen, 1); + } +} // STUB: CARMA2_HW 0x00516c30 int C2_HOOK_FASTCALL PossibleUnlock(int pValue) { diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 2e60a38725..566e1452cd 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -163,7 +163,7 @@ extern void C2_HOOK_FASTCALL CompressMatrix34(tCompressed_matrix3* pCompressed_m extern void C2_HOOK_FASTCALL ExpandMatrix34(br_matrix34* pMatrix, const tCompressed_matrix3* pCompressed, int pInactive); -// PossibleLock +extern void C2_HOOK_FASTCALL PossibleLock(int pValue); extern int C2_HOOK_FASTCALL PossibleUnlock(int pValue); From 248b9fd5534c5ad3f9852b0074eeccff17a020db Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 15:05:03 +0200 Subject: [PATCH 27/34] Match PossibleUnlock --- src/carma2/newcommon/41-utility.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 1328b68a1e..9f9fc6ad7c 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -804,9 +804,13 @@ void C2_HOOK_FASTCALL PossibleLock(int pValue) { } } -// STUB: CARMA2_HW 0x00516c30 +// FUNCTION: CARMA2_HW 0x00516c30 int C2_HOOK_FASTCALL PossibleUnlock(int pValue) { - NOT_IMPLEMENTED(); + + if (gBack_screen->pixels != NULL) { + BrPixelmapDirectUnlock(gBack_screen); + return 1; + } return 0; } From 963b95f380ccd2a9a6f89f5be054ae8494e50705 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 20:53:07 +0200 Subject: [PATCH 28/34] Match BRPM_convert --- src/carma2/newcommon/41-utility.c | 75 +++++++++++++++++++++++++++++-- src/carma2/newcommon/41-utility.h | 3 +- 2 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 9f9fc6ad7c..696a607aac 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -1026,9 +1026,78 @@ void C2_HOOK_FASTCALL WhitenVertexRGB(br_model** pModels, int pCount) { } } -// ArenaOpenFile - -// BRPM_convert +#ifdef REC2_MATCHING +// FUNCTION: CARMA2_HW 0x00518700 +void C2_HOOK_FASTCALL BRPM_convert(br_pixelmap* pMap, int pPixel_type) { + void* pixel; + int row_bytes; + int width; + int height; + + if (pMap != NULL && pPixel_type == BR_PMT_RGB_555 && pMap->type == BR_PMT_RGB_565 && pMap->pixels != NULL) { + pixel = pMap->pixels; + row_bytes = pMap->row_bytes; + width = pMap->width; + height = pMap->height; + + __asm { + mov ecx, dword ptr [height] + mov esi, dword ptr [pixel] + mov edx, dword ptr [row_bytes] + mov edi, dword ptr [width] + next_row: + push ecx + mov ecx, edi + push esi + next_pixel: + mov eax, dword ptr [esi] + mov ebx, eax + and eax, 0xffc0 + and ebx, 0x1f + shr eax, 0x1 + or eax, ebx + mov word ptr [esi], ax + add esi, 0x2 + loop next_pixel + pop esi + add esi, edx + pop ecx + loop next_row + } + pMap->type = BR_PMT_RGB_555; + } +} +#else +void C2_HOOK_FASTCALL BRPM_convert(br_pixelmap* pMap, int pPixel_type) { + br_uint_8* row_pointer; + br_uint_16* pixel; + br_uint_16 row_stride; + br_uint_32 original_w; + br_uint_32 w; + br_uint_32 h; + + if (pMap != NULL && pPixel_type == BR_PMT_RGB_555 && pMap->type == BR_PMT_RGB_565 && pMap->pixels != NULL) { + row_pointer = pMap->pixels; + pixel = pMap->pixels; + row_stride = pMap->row_bytes; + original_w = pMap->width; + h = pMap->height; + w = pMap->width; + + while (h-- != 0) { + w = original_w; + pixel = (br_uint_16*)row_pointer; + while (w-- != 0) { + // RGB565 -> XRGB1555: remove least significant bit of green (6 bits -> 5 bits) + *pixel = ((*pixel & 0xffc0)>>1) | (*pixel & 0x001f); + pixel++; + } + row_pointer += row_stride; + } + pMap->type = BR_PMT_RGB_555; + } +} +#endif // PrintScreen diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 566e1452cd..445cb7e58d 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -187,9 +187,8 @@ extern void C2_HOOK_FASTCALL GlorifyMaterial(br_material** pMaterials, int pCoun extern void C2_HOOK_FASTCALL WhitenVertexRGB(br_model** pModels, int pCount); -// ArenaOpenFile -// BRPM_convert +extern void C2_HOOK_FASTCALL BRPM_convert(br_pixelmap* pMap, int pPixel_type); // PrintScreen From afa2e813f4ea5c03aeb2a486e44a08700441da95 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 21:15:44 +0200 Subject: [PATCH 29/34] Match OpenUniqueFileB --- src/carma2/newcommon/41-utility.c | 19 ++++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 696a607aac..233d59bfdf 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -2,6 +2,7 @@ #include "01-network.h" #include "02-init.h" +#include "08-loading1.h" #include "28-world3.h" #include "18-graphics2.h" #include "40-main.h" @@ -336,7 +337,23 @@ br_uint_32 C2_HOOK_FASTCALL DRActorEnumRecurseWithTrans(br_actor* pActor, br_mat // sign -// OpenUniqueFileB +// FUNCTION: CARMA2_HW 0x005149a0 +FILE* C2_HOOK_FASTCALL OpenUniqueFileB(char* pPrefix, char* pExtension) { + int index; + FILE* f; + tPath_name the_path; + + for (index = 0; index < 10000; index++) { + PathCat(the_path, gApplication_path, pPrefix); + sprintf(the_path + strlen(the_path), "%04d.%s", index, pExtension); + f = DRfopen(the_path, "rt"); + if (f == NULL) { + return DRfopen(the_path, "wb"); + } + PFfclose(f); + } + return NULL; +} // PrintScreenFile diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 445cb7e58d..db35f1e577 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -65,7 +65,7 @@ extern br_uint_32 C2_HOOK_FASTCALL DRActorEnumRecurseWithTrans(br_actor* pActor, // sign -// OpenUniqueFileB +extern FILE* C2_HOOK_FASTCALL OpenUniqueFileB(char* pPrefix, char* pExtension); // PrintScreenFile From b75a1fc97228e51568001bb322a893f7e3143ea7 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 21:18:03 +0200 Subject: [PATCH 30/34] Match WriteU8L --- src/carma2/newcommon/08-loading1.c | 8 +++++++- src/carma2/newcommon/08-loading1.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/08-loading1.c b/src/carma2/newcommon/08-loading1.c index a683de0d81..5606d470d0 100644 --- a/src/carma2/newcommon/08-loading1.c +++ b/src/carma2/newcommon/08-loading1.c @@ -38,7 +38,13 @@ tU32 C2_HOOK_FASTCALL ReadU32(FILE* pF) { // WriteU16L -// WriteU8L +// FUNCTION: CARMA2_HW 0x0048f960 +void C2_HOOK_FASTCALL WriteU8L(FILE* pF, tU8 pNumber) { + tU8 raw_byte; + + raw_byte = pNumber; + PFfwrite(&raw_byte, sizeof(raw_byte), 1, pF); +} // MemReadU32 diff --git a/src/carma2/newcommon/08-loading1.h b/src/carma2/newcommon/08-loading1.h index 20fc39f49d..8d1fc43c01 100644 --- a/src/carma2/newcommon/08-loading1.h +++ b/src/carma2/newcommon/08-loading1.h @@ -18,7 +18,7 @@ extern tU32 C2_HOOK_FASTCALL ReadU32(FILE* pF); // WriteU16L -// WriteU8L +extern void C2_HOOK_FASTCALL WriteU8L(FILE* pF, tU8 pNumber); // MemReadU32 From be48054f84104d5d8190737d822a4f63d5223e8f Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 21:18:56 +0200 Subject: [PATCH 31/34] Match WriteU16L --- src/carma2/newcommon/08-loading1.c | 8 +++++++- src/carma2/newcommon/08-loading1.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/08-loading1.c b/src/carma2/newcommon/08-loading1.c index 5606d470d0..b1beab16ad 100644 --- a/src/carma2/newcommon/08-loading1.c +++ b/src/carma2/newcommon/08-loading1.c @@ -36,7 +36,13 @@ tU32 C2_HOOK_FASTCALL ReadU32(FILE* pF) { // WriteU32L -// WriteU16L +// FUNCTION: CARMA2_HW 0x0048f930 +void C2_HOOK_FASTCALL WriteU16L(FILE* pF, tU16 pNumber) { + tU16 raw_short; + + raw_short = pNumber; + PFfwrite(&raw_short, sizeof(raw_short), 1, pF); +} // FUNCTION: CARMA2_HW 0x0048f960 void C2_HOOK_FASTCALL WriteU8L(FILE* pF, tU8 pNumber) { diff --git a/src/carma2/newcommon/08-loading1.h b/src/carma2/newcommon/08-loading1.h index 8d1fc43c01..c33bd36be0 100644 --- a/src/carma2/newcommon/08-loading1.h +++ b/src/carma2/newcommon/08-loading1.h @@ -16,7 +16,7 @@ extern tU32 C2_HOOK_FASTCALL ReadU32(FILE* pF); // WriteU32L -// WriteU16L +extern void C2_HOOK_FASTCALL WriteU16L(FILE* pF, tU16 pNumber); extern void C2_HOOK_FASTCALL WriteU8L(FILE* pF, tU8 pNumber); From faf8ad6dc2c5e0bd109f0b0b97b726a2d9c7e5c4 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 21:20:15 +0200 Subject: [PATCH 32/34] Match WriteU32L --- src/carma2/newcommon/08-loading1.c | 8 +++++++- src/carma2/newcommon/08-loading1.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/08-loading1.c b/src/carma2/newcommon/08-loading1.c index b1beab16ad..cf07d6aa68 100644 --- a/src/carma2/newcommon/08-loading1.c +++ b/src/carma2/newcommon/08-loading1.c @@ -34,7 +34,13 @@ tU32 C2_HOOK_FASTCALL ReadU32(FILE* pF) { // ReadS32 -// WriteU32L +// FUNCTION: CARMA2_HW 0x0048f910 +void C2_HOOK_FASTCALL WriteU32L(FILE* pF, tU32 pNumber) { + tU32 raw_long; + + raw_long = pNumber; + PFfwrite(&raw_long, sizeof(raw_long), 1, pF); +} // FUNCTION: CARMA2_HW 0x0048f930 void C2_HOOK_FASTCALL WriteU16L(FILE* pF, tU16 pNumber) { diff --git a/src/carma2/newcommon/08-loading1.h b/src/carma2/newcommon/08-loading1.h index c33bd36be0..db0c976583 100644 --- a/src/carma2/newcommon/08-loading1.h +++ b/src/carma2/newcommon/08-loading1.h @@ -14,7 +14,7 @@ extern tU32 C2_HOOK_FASTCALL ReadU32(FILE* pF); // ReadS32 -// WriteU32L +extern void C2_HOOK_FASTCALL WriteU32L(FILE* pF, tU32 pNumber); extern void C2_HOOK_FASTCALL WriteU16L(FILE* pF, tU16 pNumber); From d5069249081b032242f664b83afa403caeab4540 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 21:26:15 +0200 Subject: [PATCH 33/34] Match PrintScreenFile --- src/carma2/newcommon/41-utility.c | 66 ++++++++++++++++++++++++++++++- src/carma2/newcommon/41-utility.h | 2 +- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 233d59bfdf..1815e85e52 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -355,7 +355,71 @@ FILE* C2_HOOK_FASTCALL OpenUniqueFileB(char* pPrefix, char* pExtension) { return NULL; } -// PrintScreenFile +// FUNCTION: CARMA2_HW 0x00514ab0 +void C2_HOOK_FASTCALL PrintScreenFile(FILE* pF) { + int i; + int j; + int bit_map_size; + tU8* pixel_ptr; + + bit_map_size = gBack_screen->height * gBack_screen->row_bytes; + + // 1. BMP Header + // 1. 'BM' Signature + WriteU8L(pF, 'B'); + WriteU8L(pF, 'M'); + // 2. File size in bytes (header = 0xe bytes; infoHeader = 0x28 bytes; colorTable = 0x400 bytes; pixelData = xxx) + WriteU32L(pF, bit_map_size + 0x436); + // 3. unused + WriteU16L(pF, 0); + // 4. unused + WriteU16L(pF, 0); + // 5. pixelData offset (from beginning of file) + WriteU32L(pF, 0x436); + + // 2. Info Header + // 1. InfoHeader Size + WriteU32L(pF, 0x28); + // 2. Width of bitmap in pixels + WriteU32L(pF, gBack_screen->row_bytes); + // 3. Height of bitmap in pixels + WriteU32L(pF, gBack_screen->height); + // 4. Number of planes + WriteU16L(pF, 1); + // 5. Bits per pixels / palletization (8 -> 8bit palletized ==> #colors = 256) + WriteU16L(pF, 8); + // 6. Compression (0 = BI_RGB -> no compression) + WriteU32L(pF, 0); + // 7. Image Size (0 --> no compression) + WriteU32L(pF, 0); + // 8. Horizontal Pixels Per Meter + WriteU32L(pF, 0); + // 9. Vertical Pixels Per Meter + WriteU32L(pF, 0); + // 10. # Actually used colors + WriteU32L(pF, 0); + // 11. Number of important colors + WriteU32L(pF, 256); + + // 3. Color table (=palette) + for (i = 0; i < 256; i++) { + // red, green, blue, unused + WriteU8L(pF, ((tU8*)gCurrent_palette->pixels)[4 * i + 0]); + WriteU8L(pF, ((tU8*)gCurrent_palette->pixels)[4 * i + 1]); + WriteU8L(pF, ((tU8*)gCurrent_palette->pixels)[4 * i + 2]); + WriteU8L(pF, 0); + } + + // 4. Pixel Data (=LUT) + pixel_ptr = (tU8*)gBack_screen->pixels + bit_map_size - gBack_screen->row_bytes; + for (i = 0; i < gBack_screen->height; i++) { + for (j = 0; j < gBack_screen->row_bytes; j++) { + WriteU8L(pF, *pixel_ptr++); + } + pixel_ptr -= 2 * gBack_screen->row_bytes; + } + WriteU16L(pF, 0); +} // PrintScreenFile16 diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index db35f1e577..030fe68550 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -67,7 +67,7 @@ extern br_uint_32 C2_HOOK_FASTCALL DRActorEnumRecurseWithTrans(br_actor* pActor, extern FILE* C2_HOOK_FASTCALL OpenUniqueFileB(char* pPrefix, char* pExtension); -// PrintScreenFile +extern void C2_HOOK_FASTCALL PrintScreenFile(FILE* pF); // PrintScreenFile16 From 904fc486dacc30ecb8112371101da8529b07df58 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 12 Jun 2026 21:40:46 +0200 Subject: [PATCH 34/34] Implement PrintScreen [accuracy=72.17%] --- src/carma2/newcommon/41-utility.c | 96 ++++++++++++++++++++++++++++++- src/carma2/newcommon/41-utility.h | 5 +- 2 files changed, 96 insertions(+), 5 deletions(-) diff --git a/src/carma2/newcommon/41-utility.c b/src/carma2/newcommon/41-utility.c index 1815e85e52..3671e97ca6 100644 --- a/src/carma2/newcommon/41-utility.c +++ b/src/carma2/newcommon/41-utility.c @@ -421,7 +421,86 @@ void C2_HOOK_FASTCALL PrintScreenFile(FILE* pF) { WriteU16L(pF, 0); } -// PrintScreenFile16 +void C2_HOOK_FASTCALL PrintScreenFile16(FILE* pF) { + int i; + int j; + int bit_map_size; + tU16* pixel_ptr; + + if (gBack_screen->pixels == NULL) { + BrPixelmapDirectLock(gBack_screen, 1); + } + + bit_map_size = gBack_screen->height * 3 * gBack_screen->width; + + // 1. BMP Header + // 1. 'BM' Signature + WriteU8L(pF, 'B'); + WriteU8L(pF, 'M'); + // 2. File size in bytes (header = 0xe bytes; infoHeader = 0x28 bytes; colorTable = 0x400 bytes; pixelData = xxx) + WriteU32L(pF, 0x36 + bit_map_size); + // 3. unused + WriteU16L(pF, 0); + // 4. unused + WriteU16L(pF, 0); + // 5. pixelData offset (from beginning of file) + WriteU32L(pF, 0x36); + + // 2. Info Header + // 1. InfoHeader Size + WriteU32L(pF, 0x28); + // 2. Width of bitmap in pixels + WriteU32L(pF, gBack_screen->width); + // 3. Height of bitmap in pixels + WriteU32L(pF, gBack_screen->height); + // 4. Number of planes + WriteU16L(pF, 1); + // 5. Bits per pixels / palletization (0x18 -> 24bit colours ==> #colors = 2^24) + WriteU16L(pF, 0x18); + // 6. Compression (0 = BI_RGB -> no compression) + WriteU32L(pF, 0); + // 7. Image Size (0 --> no compression) + WriteU32L(pF, 0); + // 8. Horizontal Pixels Per Meter + WriteU32L(pF, 0); + // 9. Vertical Pixels Per Meter + WriteU32L(pF, 0); + // 10. # Actually used colors + WriteU32L(pF, 0); + // 11. Number of important colors + WriteU32L(pF, 256); + + // 4. Pixel Data (=LUT) + pixel_ptr = (tU16*)((tU8*)gBack_screen->pixels + bit_map_size - gBack_screen->row_bytes); + for (i = 0; i < gBack_screen->height; i++) { + for (j = 0; j < gBack_screen->width; j++) { + tU8 r, g, b; + tU16 pixel = *pixel_ptr++; + if (gBack_screen->type == BR_PMT_RGB_565) { + b = pixel << 3; + g = (pixel >> 3) & 0xf8; + r = (pixel >> 8) & 0xf8; + } else if (gBack_screen->type == BR_PMT_RGB_555) { + b = pixel << 3; + g = (pixel >> 2) & 0xf8; + r = (pixel >> 7) & 0xf8; + } else { + b = 0; + g = 0; + r = 0; + } + WriteU8L(pF, b); + WriteU8L(pF, g); + WriteU8L(pF, r); + } + pixel_ptr = (tU16*)((tU8*)pixel_ptr + 2 * gBack_screen->width - gBack_screen->row_bytes); + } + WriteU16L(pF, 0); + + if (gBack_screen->pixels != NULL) { + BrPixelmapDirectUnlock(gBack_screen); + } +} // GetTotalTime @@ -1180,7 +1259,20 @@ void C2_HOOK_FASTCALL BRPM_convert(br_pixelmap* pMap, int pPixel_type) { } #endif -// PrintScreen +// FUNCTION: CARMA2_HW 0x00518780 +void C2_HOOK_FASTCALL PrintScreen(void) { + FILE* f; + + f = OpenUniqueFileB("DUMP", "BMP"); + if (f != NULL) { + if (gBack_screen->type == BR_PMT_INDEX_8) { + PrintScreenFile(f); + } else { + PrintScreenFile16(f); + } + PFfclose(f); + } +} // FudgeBRenderIntoTheNinetiesWithSomeProperFuckingColourSupport diff --git a/src/carma2/newcommon/41-utility.h b/src/carma2/newcommon/41-utility.h index 030fe68550..e3d0b8ffd5 100644 --- a/src/carma2/newcommon/41-utility.h +++ b/src/carma2/newcommon/41-utility.h @@ -69,7 +69,7 @@ extern FILE* C2_HOOK_FASTCALL OpenUniqueFileB(char* pPrefix, char* pExtension); extern void C2_HOOK_FASTCALL PrintScreenFile(FILE* pF); -// PrintScreenFile16 +extern void C2_HOOK_FASTCALL PrintScreenFile16(FILE* pF); // GetTotalTime @@ -187,10 +187,9 @@ extern void C2_HOOK_FASTCALL GlorifyMaterial(br_material** pMaterials, int pCoun extern void C2_HOOK_FASTCALL WhitenVertexRGB(br_model** pModels, int pCount); - extern void C2_HOOK_FASTCALL BRPM_convert(br_pixelmap* pMap, int pPixel_type); -// PrintScreen +extern void C2_HOOK_FASTCALL PrintScreen(void); // FudgeBRenderIntoTheNinetiesWithSomeProperFuckingColourSupport