Add a few NON_EQUIVALENT functions from scratches to keep them up to date (#602)

* WIP func_800101AC

* WIP func_800452A0

* cleanup

* Formatter and func_8004CC20 near match

* func_8004CC20 better score and documentation

* func_80049794 WIP and compilable

* Major cleanup of func_80049794

* Formatter

* Update scratch

* Add func_80019808 from scratch

* Cleanup func_80019808

* func_80019808 score improvment

* Improve func_80049794 score (Thanks Dominik!)

* func_8001C6C4 WIP

* func_8001E93C WIP

* small documenting

* Eliminate a lot of Obj64 casts.
This commit is contained in:
Ryan Myers
2025-06-03 14:47:46 -04:00
committed by GitHub
parent 4c4309665a
commit 520b3d58e3
20 changed files with 2519 additions and 224 deletions
+7
View File
@@ -885,6 +885,12 @@ typedef struct LevelObjectEntry_Hud {
s32 offsetY;
} LevelObjectEntry_Hud;
typedef struct LevelObjectEntry_BHV_UNK_5C {
LevelObjectEntryCommon common;
s8 unk8;
s8 unk9;
} LevelObjectEntry_BHV_UNK_5C;
typedef struct LevelObjectEntry {
union {
LevelObjectEntry_Racer racer;
@@ -978,6 +984,7 @@ typedef struct LevelObjectEntry {
LevelObjectEntry_WavePower wavePower;
LevelObjectEntry_CharacterSelect characterSelect;
LevelObjectEntry_Hud hud;
LevelObjectEntry_BHV_UNK_5C bhv_unk_5C;
};
} LevelObjectEntry;
+14 -8
View File
@@ -1537,12 +1537,17 @@ typedef struct Object_FogChanger {
typedef struct Object_NPC {
/* 0x00 */ f32 unk0;
/* 0x04 */ f32 animFrameF;
/* 0x08 */ s32 unk8;
/* 0x0C */ s8 nodeBack1; // One node backwards
/* 0x0D */ u8 nodeCurrent; // Intended target node
/* 0x0E */ u8 nodeBack2; // Two nodes backward
/* 0x0F */ u8 nodeForward1; // One node forward
/* 0x10 */ u8 nodeForward2; // Two nodes forward
/* 0x08 */ f32 unk8;
union {
/* 0x0C */ u8 nodeData[5];
struct {
/* 0x0C */ s8 nodeBack1; // One node backwards
/* 0x0D */ u8 nodeCurrent; // Intended target node
/* 0x0E */ u8 nodeBack2; // Two nodes backward
/* 0x0F */ u8 nodeForward1; // One node forward
/* 0x10 */ u8 nodeForward2; // Two nodes forward
};
};
/* 0x11 */ u8 fogR;
/* 0x12 */ u8 fogG;
/* 0x13 */ u8 fogB;
@@ -1596,7 +1601,7 @@ typedef struct Object_Log {
typedef struct Object_Fireball_Octoweapon {
u8 pad0[0x1C];
SoundHandle soundMask;
struct AudioPoint *soundMask;
} Object_Fireball_Octoweapon;
typedef struct Object_AnimatedObject {
@@ -1722,6 +1727,7 @@ typedef struct Object_68_38 {
typedef struct Object_68 {
/* 0x00 */ union {
ObjectModel *objModel;
Sprite *sprite;
TextureHeader *texHeader;
};
/* 0x04 */ Vertex *vertices[3];
@@ -1845,7 +1851,7 @@ typedef struct Object {
/* 0x0064 */ Object_64 *unk64; //player + 0x98
/* 0x0068 */ Object_68 **unk68; //player + 0x80
/* 0x006C */ struct ParticleEmitter *particleEmitter; //player + 0x370
/* 0x0070 */ Object_LightData **lightData;
/* 0x0070 */ struct ObjectLight **lightData;
/* 0x0074 */ u32 particleEmittersEnabled;
/* 0x0078 */ ObjProperties properties;
/* 0x0080 */ void *unk80;
+2 -1
View File
@@ -106,10 +106,11 @@ MtxF gCurrentModelMatrixS;
/******************************/
extern s32 D_B0000578; // Used as a symbol for anti-piracy checks in the game.
/**
* Official Name: camInit
*/
extern s32 D_B0000578;
void cam_init(void) {
s32 i;
s32 j;
+18 -17
View File
@@ -704,7 +704,7 @@ void hud_render_player(Gfx **dList, Mtx **mtx, Vertex **vertexList, Object *obj,
}
}
if (gShowHUD == FALSE) {
racer = (Object_Racer *) obj->unk64;
racer = &obj->unk64->racer;
if (D_8012718A) {
gHudController = 1 - racer->playerIndex;
} else {
@@ -1251,7 +1251,7 @@ void hud_main_battle(s32 countdown, Object *obj, s32 updateRate) {
s32 racersFinished;
s32 i;
racer = (Object_Racer *) obj->unk64;
racer = &obj->unk64->racer;
if (gNumActivePlayers != 1 || racer->raceFinished == FALSE) {
sprite_anim_off(TRUE);
hud_race_start(countdown, updateRate);
@@ -1395,7 +1395,7 @@ void hud_lives_render(Object_Racer *racer, UNUSED s32 updateRate) {
*/
void hud_main_boss(s32 countdown, Object *obj, s32 updateRate) {
LevelHeader *level;
Object_Racer *racer = (Object_Racer *) obj->unk64;
Object_Racer *racer = &obj->unk64->racer;
sprite_anim_off(TRUE);
hud_wrong_way(racer, updateRate);
@@ -1417,7 +1417,7 @@ void hud_main_boss(s32 countdown, Object *obj, s32 updateRate) {
* When racing Taj in the overworld, render most of the basic race hud.
*/
void hud_main_taj(s32 countdown, Object *obj, s32 updateRate) {
Object_Racer *racer = (Object_Racer *) obj->unk64;
Object_Racer *racer = &obj->unk64->racer;
sprite_anim_off(TRUE);
hud_wrong_way(racer, updateRate);
@@ -1438,7 +1438,7 @@ void hud_main_hub(Object *obj, s32 updateRate) {
HudElement *portrait;
if (cam_get_viewport_layout() == PLAYER_ONE) {
racer = (Object_Racer *) obj->unk64;
racer = &obj->unk64->racer;
sprite_anim_off(TRUE);
hud_balloons(racer);
hud_speedometre(obj, updateRate);
@@ -1820,7 +1820,7 @@ void hud_speedometre(Object *obj, UNUSED s32 updateRate) {
if (gNumActivePlayers == 1) {
if (!check_if_showing_cutscene_camera()) {
racer = (Object_Racer *) obj->unk64;
racer = &obj->unk64->racer;
if (racer->raceFinished == FALSE) {
if (racer->vehicleID == VEHICLE_PLANE) {
vel = sqrtf((obj->segment.x_velocity * obj->segment.x_velocity) +
@@ -3031,7 +3031,7 @@ void hud_weapon(Object *obj, s32 updateRate) {
Object_Racer *racer;
s32 temp_a0;
racer = (Object_Racer *) obj->unk64;
racer = &obj->unk64->racer;
if (racer->raceFinished == FALSE) {
enable_pal_viewport_height_adjust(TRUE);
temp_a0 = (racer->balloon_type * 3) + (racer->balloon_level);
@@ -3526,7 +3526,7 @@ void hud_render_general(Gfx **dList, Mtx **mtx, Vertex **vtx, s32 updateRate) {
spBC = gCurrentHud->entry[HUD_TREASURE_METRE].pos.y;
racerGroup = get_racer_objects(&racerCount);
for (sp144 = 0; sp144 < racerCount; sp144++) {
someRacer = (Object_Racer *) racerGroup[sp144]->unk64;
someRacer = &racerGroup[sp144]->unk64->racer;
hud_treasure(someRacer);
if (osTvType == OS_TV_TYPE_PAL) {
gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y += 66.0;
@@ -3586,7 +3586,7 @@ void hud_render_general(Gfx **dList, Mtx **mtx, Vertex **vtx, s32 updateRate) {
sp113 = TRUE;
for (i = 0; i < objectCount; i++) {
someRacer = (Object_Racer *) objectGroup[i]->unk64;
someRacer = &objectGroup[i]->unk64->racer;
if (someRacer != NULL && someRacer->playerIndex != PLAYER_COMPUTER && someRacer->raceFinished == FALSE) {
sp113 = FALSE;
}
@@ -3708,7 +3708,7 @@ void hud_render_general(Gfx **dList, Mtx **mtx, Vertex **vtx, s32 updateRate) {
// Non AI players get an arrow instead of a blob that rotates.
for (i = objectCount - 1; i >= 0; i--) {
temp_v0_8 = objectGroup[i];
someRacer = (Object_Racer *) objectGroup[i]->unk64;
someRacer = &objectGroup[i]->unk64->racer;
if (someRacer != NULL) {
minimap_marker_pos(objectGroup[i]->segment.trans.x_position, objectGroup[i]->segment.trans.z_position,
sp114, sp118, sp11C);
@@ -3811,7 +3811,7 @@ void minimap_marker_pos(f32 x, f32 z, f32 angleSin, f32 angleCos, f32 modelAspec
* deciding to draw a texture rectangle, ortho tris, or a 3D model entirely.
*/
void hud_element_render(Gfx **dList, Mtx **mtx, Vertex **vtxList, HudElement *hud) {
TextureHeader **textureHeader3;
ObjectModel **objModels;
TextureHeader *textureHeader2;
TextureHeader *textureHeader;
Camera *camera;
@@ -3949,7 +3949,7 @@ void hud_element_render(Gfx **dList, Mtx **mtx, Vertex **vtxList, HudElement *hu
sp48.drawTexture.yOffset = 0;
sp48.unk8 = 0;
texrect_draw_scaled(&gHudDL, &sp48.drawTexture, hud->pos.x, hud->pos.y, hud->scale, hud->scale, gHudColour,
1);
TEXRECT_POINT);
rendermode_reset(&gHudDL);
}
} else if (gAssetHudElementIds[spriteID] & ASSET_MASK_SPRITE) {
@@ -3973,14 +3973,15 @@ void hud_element_render(Gfx **dList, Mtx **mtx, Vertex **vtxList, HudElement *hu
} else {
mtx_cam_push(&gHudDL, &gHudMtx, (ObjectTransform *) hud, 1.0f, 0.0f);
if (0) {}
textureHeader3 = gAssetHudElements->entry[hud->spriteID];
hud_draw_model((ObjectModel *) *textureHeader3);
objModels = gAssetHudElements->entry[hud->spriteID];
hud_draw_model(*objModels);
mtx_pop(&gHudDL);
}
spriteID = hud->spriteID;
if (spriteID != 0x28) {
if ((spriteID != 0xE) && (spriteID != 0x1B) && ((spriteID < 0x2F) || (spriteID >= 0x36)) &&
(spriteID != 0x2E) && (gMinimapXlu & 1)) {
if (spriteID != HUD_SPRITE_PRO_AM) {
if (spriteID != HUD_SPRITE_MAP_DOT && spriteID != HUD_SPRITE_MAP_ARROW &&
(spriteID < HUD_ASSET_47 || spriteID >= HUD_ASSET_54) && spriteID != HUD_SPRITE_SPEEDOMETRE_ARROW &&
gMinimapXlu & 1) {
hud->pos.y -= objEntry.offsetY;
}
hud->pos.x -= gHudOffsetX + gHudBounceX;
+10 -10
View File
@@ -2152,17 +2152,18 @@ void func_8007FFEC(s32 numberOfPanels) {
vertexSize = sizeof(Vertex) * (20 * numberOfPanels);
triangleCount = sizeof(Triangle) * (10 * numberOfPanels);
gWoodPanelTriangles[0] = (Triangle *)mempool_alloc_safe(((vertexSize + triangleCount) * 2) + menuGeometrySize, COLOUR_TAG_WHITE);
gWoodPanelTriangles[1] = (Triangle *)((u32)gWoodPanelTriangles[0] + triangleCount);
gWoodPanelTriangles[0] =
(Triangle *) mempool_alloc_safe(((vertexSize + triangleCount) * 2) + menuGeometrySize, COLOUR_TAG_WHITE);
gWoodPanelTriangles[1] = (Triangle *) ((u32) gWoodPanelTriangles[0] + triangleCount);
gMenuGeometry = (unk80080BC8 *)((u32)gWoodPanelTriangles[1] + triangleCount);
gMenuGeometry = (unk80080BC8 *) ((u32) gWoodPanelTriangles[1] + triangleCount);
gWoodPanelVertices[0] = (Vertex *)((u32)gMenuGeometry + menuGeometrySize);
gWoodPanelVertices[1] = (Vertex *)((u32)gWoodPanelVertices[0] + vertexSize);
gWoodPanelVertices[0] = (Vertex *) ((u32) gMenuGeometry + menuGeometrySize);
gWoodPanelVertices[1] = (Vertex *) ((u32) gWoodPanelVertices[0] + vertexSize);
panelIndex = 0;
triangleCount = 0;
for(i = 0; i < numberOfPanels; i++) {
for (i = 0; i < numberOfPanels; i++) {
gMenuGeometry[i].vertices[0] = &gWoodPanelVertices[0][panelIndex];
gMenuGeometry[i].vertices[1] = &gWoodPanelVertices[1][panelIndex];
gMenuGeometry[i].triangles[0] = &gWoodPanelTriangles[0][triangleCount];
@@ -2176,10 +2177,10 @@ void func_8007FFEC(s32 numberOfPanels) {
}
triItemIndex = 0;
for(i = 0; i < numberOfPanels; i++) {
for (i = 0; i < numberOfPanels; i++) {
panelIndex = 0;
for(IndicesIndex = 0; IndicesIndex < 10; triItemIndex++, panelIndex += 3, IndicesIndex++) {
for(triListIndex = 0; triListIndex < 2; triListIndex++) {
for (IndicesIndex = 0; IndicesIndex < 10; triItemIndex++, panelIndex += 3, IndicesIndex++) {
for (triListIndex = 0; triListIndex < 2; triListIndex++) {
gWoodPanelTriangles[triListIndex][triItemIndex].verticesArray[0] = BACKFACE_DRAW;
gWoodPanelTriangles[triListIndex][triItemIndex].verticesArray[1] = gWoodPanelsIndices[panelIndex];
gWoodPanelTriangles[triListIndex][triItemIndex].verticesArray[2] = gWoodPanelsIndices[panelIndex + 1];
@@ -2198,7 +2199,6 @@ void func_8007FFEC(s32 numberOfPanels) {
gWoodPanelAllocCount = numberOfPanels;
}
/**
* Resize the UV's of the menu panels.
*/
+2 -1
View File
@@ -662,6 +662,7 @@ void rankings_render_order(s32 updateRate);
void results_render(UNUSED s32 updateRate, f32 opacity);
void func_80092188(s32 updateRate);
SIDeviceStatus func_80087F14(s32 *controllerIndex, s32 xAxisDirection);
void postrace_start(s32 finishState, s32 worldID);
// Non Matching functions below here
void load_menu_text(s32 language); // Non Matching
@@ -678,7 +679,7 @@ void dialogue_tt_gamestatus(void);
s32 menu_title_screen_loop(s32 updateRate);
s32 menu_magic_codes_loop(s32 updateRate);
s32 menu_credits_loop(s32 updateRate);
void func_8007FFEC(s32 arg0);
void func_8007FFEC(s32 numberOfPanels);
void set_gIntDisFlag(u8 setting);
void init_save_data(void);
void func_80080580(Gfx **dList, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight,
+119 -119
View File
File diff suppressed because it is too large Load Diff
-2
View File
@@ -443,8 +443,6 @@ void obj_init_fish(Object *fishObj, LevelObjectEntry_Fish *fishEntry, s32 param)
void obj_init_midifade(Object *obj, LevelObjectEntry_MidiFade *entry);
void obj_loop_butterfly(Object *butterflyObj, s32 updateRate);
s32 ainode_find_nearest(f32 diffX, f32 diffY, f32 diffZ, s32 useElevation);
s32 ainode_find_next(s32, s32, s32);
f32 func_8001C6C4(Object_64 *, Object *, f32, f32, s32);
void func_8000CBF0(Object*, s32);
void try_to_collect_egg(Object *, Object_CollectEgg*);
+887 -23
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -501,6 +501,7 @@ void race_transition_adventure(s32 updateRate);
void func_8001E4C4(void);
void racerfx_alloc(s32 numberOfVertices, s32 numberOfTriangles);
s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3);
s32 ainode_find_next(s32 nodeId, s32 nextNodeId, s32 direction);
/**
* Faster variant of the shading function for objects.
@@ -542,5 +543,6 @@ void obj_update(s32 updateRate);
void func_800159C8(Object *, Object *);
void obj_door_number(ObjectModel *, Object *);
s16 func_8001CD28(s32 arg0, s32 arg1, s32 arg2, s32 arg3); // NON MATCHING
f32 func_8001C6C4(Object_NPC *, Object *, f32, f32, s32);
#endif
+1448 -34
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -227,7 +227,7 @@ void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32, f32);
s32 func_80017248(void*, s32, s32*, Vec3f*, f32*, f32*, s8* surface);
void func_80059208(Object* obj, Object_Racer* racer, s32 updateRate); /* extern */
void func_80049794(s32 updateRate, f32 updateRateF, Object* obj, Object_Racer* racer); /* extern */
void func_8004CC20(s32 updateRate, f32 updateRateF, Object* obj, Object_Racer* racer); /* extern */
void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Racer *racer); /* extern */
void func_8004447C(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRate);
void func_800452A0(Object *obj, Object_Racer *racer, s32 updateRate);
void func_80045C48(Object *obj, Object_Racer *racer, s32 updateRate);
+1 -1
View File
@@ -2369,7 +2369,7 @@ s32 check_if_in_draw_range(Object *obj) {
case BHV_HIT_TESTER_2: // animated objects?
case BHV_ANIMATED_OBJECT_2: // space ships
obj64 = obj->unk64;
obj->segment.object.opacity = obj64->wizpig2.pad0[0x42];
obj->segment.object.opacity = obj64->animation.unk42;
break;
case BHV_PARK_WARDEN:
case BHV_GOLDEN_BALLOON:
+1 -1
View File
@@ -191,7 +191,7 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra
if (obj->segment.object.animationID == ANIM_BLUEY_TURN) {
racer->headAngleTarget = 0;
}
racer = (Object_Racer *) firstRacerObj->unk64;
racer = &firstRacerObj->unk64->racer;
if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING &&
obj->segment.object.animationID == ANIM_BLUEY_WALK) {
racer->attackType = ATTACK_SQUISHED;
+1 -1
View File
@@ -167,7 +167,7 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *
racer->headAngleTarget >>= 1;
}
}
racer = (Object_Racer *) firstRacerObj->unk64;
racer = &firstRacerObj->unk64->racer;
if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING &&
obj->segment.object.animationID == ANIM_BUBBLER_MOVE) {
racer->attackType = ATTACK_SQUISHED;
+2 -2
View File
@@ -134,7 +134,7 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r
if (*startTimer != 100) {
someObj = racerfx_get_boost(BOOST_DEFAULT);
if (someObj != NULL) {
rocket = (Object_WizpigRocket *) someObj->unk64;
rocket = &someObj->unk64->wizpigRocket;
someObj->properties.racer.unk0 = 0;
if (rocket != NULL) {
rocket->unk72 += updateRate;
@@ -145,7 +145,7 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r
}
}
firstRacerObj = get_racer_object(PLAYER_ONE);
racer = (Object_Racer *) firstRacerObj->unk64;
racer = &firstRacerObj->unk64->racer;
if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING &&
obj->segment.object.animationID == ANIM_ROCKET_DAMAGE) {
racer->attackType = ATTACK_SQUISHED;
+1 -1
View File
@@ -260,7 +260,7 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r
racer->headAngleTarget >>= 1;
}
}
racer = (Object_Racer *) firstRacerObj->unk64;
racer = &firstRacerObj->unk64->racer;
if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING &&
obj->segment.object.animationID == ANIM_SMOKEY_RUN) {
racer->attackType = ATTACK_SQUISHED;
+1 -1
View File
@@ -193,7 +193,7 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r
}
}
// Record the players height record. Falling 400 units below that will trigger a warp.
racer = (Object_Racer *) firstRacerObj->unk64;
racer = &firstRacerObj->unk64->racer;
if (gTrickyRacerPeakHeight < firstRacerObj->segment.trans.y_position) {
gTrickyRacerPeakHeight = firstRacerObj->segment.trans.y_position;
}
+1 -1
View File
@@ -232,7 +232,7 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r
obj_spawn_particle(obj, updateRate);
fade_when_near_camera(obj, racer, 40);
firstRacerObj = get_racer_object(PLAYER_ONE);
racer = (Object_Racer *) firstRacerObj->unk64;
racer = &firstRacerObj->unk64->racer;
if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING &&
obj->segment.object.animationID == ANIM_WIZPIG_WALK) {
racer->attackType = ATTACK_SQUISHED;
+1
View File
@@ -124,6 +124,7 @@ void weather_init(void);
void snow_vertices(void);
void lensflare_init(Object *);
void lensflare_render(Gfx**, Mtx**, Vertex**, Camera*);
void lensflare_override_remove(Object *obj);
void weather_reset(s32 weatherType, s32 density, s32 velX, s32 velY, s32 velZ, s32 intensity, s32 opacity);
#endif