From b7103160688ed8df3331e14f8188b2010d2d832c Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Thu, 3 Jul 2025 09:04:33 +0100 Subject: [PATCH] match func_8000CC7C (#658) * there we go :) * Update objects.c --- README.md | 26 +- include/object_properties.h | 2 +- include/structs.h | 2 +- src/collision.h | 4 +- src/objects.c | 504 ++++++++++++++------------- src/objects.h | 19 +- src/racer.c | 2 +- src/tracks.c | 2 +- src/tracks.h | 4 +- ver/symbols/symbol_addrs.jpn.v79.txt | 8 +- ver/symbols/symbol_addrs.pal.v77.txt | 8 +- ver/symbols/symbol_addrs.pal.v80.txt | 8 +- ver/symbols/symbol_addrs.us.v77.txt | 8 +- ver/symbols/symbol_addrs.us.v80.txt | 8 +- 14 files changed, 314 insertions(+), 291 deletions(-) diff --git a/README.md b/README.md index be6699c2..2fa97c11 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is the default if not specified. -As of July 1, 2025, this is our current score: +As of July 3, 2025, this is our current score: -    Decomp progress: 95.62% +    Decomp progress: 96.21% -    Documentation progress: 61.34% +    Documentation progress: 62.00% --- @@ -117,30 +117,30 @@ s32 is_drumstick_unlocked(void) { ``` -As of July 1, 2025, this is our current score: +As of July 3, 2025, this is our current score: ``` =============================================================== ADVENTURE ONE (ASM -> C Decompilation) - ------------ 95.62% Complete (96.32% NON_MATCHING) ------------ - # Decompiled functions: 1937 - # GLOBAL_ASM remaining: 15 + ------------ 96.21% Complete (96.91% NON_MATCHING) ------------ + # Decompiled functions: 1938 + # GLOBAL_ASM remaining: 14 # NON_MATCHING functions: 4 - # NON_EQUIVALENT WIP functions: 11 + # NON_EQUIVALENT WIP functions: 10 ------------------------- Game Status ------------------------- Balloons: 46/47, Keys: 4/4, Trophies: 4/5 T.T. Amulets: 4/4, Wizpig Amulets: 4/4 --------------------------------------------------------------- - We are collecting silver coins in Star City. (0/8 silver coins) + We are collecting silver coins in Star City. (4/8 silver coins) =============================================================== ADVENTURE TWO (Cleanup & Documentation) - ----------------------- 61.34% Complete ----------------------- - # Documented functions: 1219 - # Undocumented remaining: 433 + ----------------------- 62.00% Complete ----------------------- + # Documented functions: 1221 + # Undocumented remaining: 431 ------------------------- Game Status ------------------------- Balloons: 30/47, Keys: 3/4, Trophies: 2/5 T.T. Amulets: 3/4, Wizpig Amulets: 2/4 --------------------------------------------------------------- - We are racing in the rematch against Bubbler. (Lap 2/3) + We are racing in the rematch against Bubbler. (Lap 3/3) =============================================================== ``` diff --git a/include/object_properties.h b/include/object_properties.h index 209112a9..94b45a02 100644 --- a/include/object_properties.h +++ b/include/object_properties.h @@ -192,7 +192,7 @@ typedef struct ObjPropertyRacer { typedef struct ObjPropertySetupPoint { s32 racerIndex; - s32 entranceID; + u32 entranceID; } ObjPropertySetupPoint; typedef struct ObjPropertyWeapon { diff --git a/include/structs.h b/include/structs.h index f2c5be5d..242b2015 100644 --- a/include/structs.h +++ b/include/structs.h @@ -1285,7 +1285,7 @@ typedef struct Object_Racer { /* 0x1C8 */ u8 unk1C8; /* 0x1C9 */ u8 unk1C9; /* 0x1CA */ s8 unk1CA; - /* 0x1CB */ u8 unk1CB; + /* 0x1CB */ s8 unk1CB; /* 0x1CC */ s8 aiSkill; /* 0x1CD */ u8 unk1CD; /* 0x1CE */ u8 unk1CE; diff --git a/src/collision.h b/src/collision.h index 7ce73ce5..bf62280d 100644 --- a/src/collision.h +++ b/src/collision.h @@ -9,7 +9,7 @@ enum CollisionModes { COLLISION_MODE_DEFAULT, COLLISION_MODE_1, COLLISION_MODE_NO_WALLS }; void generate_collision_candidates(s32, f32 *, f32 *, s32); -s32 compute_grid_overlap_mask(LevelModelSegmentBoundingBox *segment, s32 x1, s32 z1, s32 x2, s32 z2); -s32 resolve_collisions(Vec3f *pos, Vec3f *pos2, f32 *radius, s8 *surface, s32 numEntries, s32 *numCollisions); +s32 compute_grid_overlap_mask(LevelModelSegmentBoundingBox *bbox, s32 x1, s32 z1, s32 x2, s32 z2); +s32 resolve_collisions(Vec3f *origin, Vec3f *target, f32 *radius, s8 *surface, s32 numEntries, s32 *numCollisions); #endif diff --git a/src/objects.c b/src/objects.c index 6ce3307a..5e3d7140 100644 --- a/src/objects.c +++ b/src/objects.c @@ -61,7 +61,7 @@ s32 D_800DC70C = 0; // Currently unknown, might be a different type. s16 D_800DC710 = 1; s32 D_800DC714 = 0; // Currently unknown, might be a different type. Object *gGhostObjStaff = NULL; -s8 D_800DC71C = 0; +s8 gRollingDemo = FALSE; s32 gObjectTexAnim = FALSE; s16 gTimeTrialTime = 10800; s16 gTimeTrialVehicle = -1; @@ -82,15 +82,16 @@ Object *gMagnetEffectObject = NULL; f32 D_800DC768[16] = { 0.0f, 1.0f, 0.70711f, 0.70711f, 1.0f, 0.0f, 0.70711f, -0.70711f, 0.0f, -1.0f, -0.70711f, -0.70711f, -1.0f, 0.0f, -0.70711f, 0.70711f }; -u16 D_800DC7A8[] = { +u16 gRacerObjectTable[] = { // Car - ASSET_OBJECT_ID_KREMCAR, ASSET_OBJECT_ID_BADGERCAR, ASSET_OBJECT_ID_TORTCAR, ASSET_OBJECT_ID_CONKACAR, - ASSET_OBJECT_ID_TIGERCAR, ASSET_OBJECT_ID_BANJOCAR, ASSET_OBJECT_ID_CHICKENCAR, ASSET_OBJECT_ID_MOUSECAR, -}; - -s16 D_800DC7B8[] = { - // TODO: move these first two entries to the first var above. I'm thinking this is either all one big var, or the - // boss objects have their own table. + ASSET_OBJECT_ID_KREMCAR, + ASSET_OBJECT_ID_BADGERCAR, + ASSET_OBJECT_ID_TORTCAR, + ASSET_OBJECT_ID_CONKACAR, + ASSET_OBJECT_ID_TIGERCAR, + ASSET_OBJECT_ID_BANJOCAR, + ASSET_OBJECT_ID_CHICKENCAR, + ASSET_OBJECT_ID_MOUSECAR, ASSET_OBJECT_ID_SWCAR, ASSET_OBJECT_ID_DIDDYCAR, // Hover @@ -868,10 +869,10 @@ void free_all_objects(void) { s32 i, len; timetrial_free_staff_ghost(); D_800DC748 = FALSE; - if (D_800DC71C) { + if (gRollingDemo) { rumble_init(TRUE); } - D_800DC71C = 0; + gRollingDemo = FALSE; if (gSwapLeadPlayer && is_in_two_player_adventure()) { gSwapLeadPlayer = FALSE; swap_lead_player(); @@ -1054,108 +1055,107 @@ s32 func_8000CC20(Object *obj) { return NextFreeIndex; } -// https://decomp.me/scratch/EXgPQ -#ifdef NON_EQUIVALENT -// track_init_racers -void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { - s32 numPlayers; // sp144 - enum GameMode gameMode; - s32 cutsceneID; // sp130 - s8 *miscAsset16; - s8 sp11C[8]; - s8 sp114[8]; - s32 spF4[8]; - s32 spD4[8]; - s32 spB4[8]; - s32 sp94[8]; - LevelHeader *levelHeader; - Camera *cutsceneCameraSegment; // sp74 - s16 objectId; - s8 sp127; - u8 raceType; - s8 tempVehicle; - u8 var_a1; - s32 isChallengeMode; // sp64 - s32 i6; // sp54 - LevelObjectEntry_Unk8000CC7C *entry; +/** + * Takes the level header and decides which race type to activate. + * Sets up the racer spawning. Initialising vehicle types, racer count, then + * spawning them into the world in their assigned order. + */ +void track_setup_racers(Vehicle vehicle, u32 entranceID, s32 playerCount) { + LevelObjectEntry_Racer *racerEntry; Object *curObj; - Object *curRacerObj; - Object *newRacerObj; + s32 numPlayers; + Object *racerObj; + LevelObjectEntry *objEntry; + enum GameMode gameMode; Object_Racer *curRacer; - Settings *settings; + s32 cutsceneID; s32 spawnObjFlags; - s32 racerPos; - s32 i2; + s8 *miscAsset16; + s8 sp127; + u8 spawnedObjCount; + s16 objectID; + s8 racerActive[8]; + s8 racerIDs[8]; + s32 spawnX[8]; + s32 spawnY[8]; + s32 spawnZ[8]; + s32 spawnAngle[8]; + Settings *settings; s32 j; s32 var_s4; - s32 tajFlags; + s32 i; + s32 k; + u8 raceType; + LevelHeader *levelHeader; + Camera *cutsceneCameraSegment; D_8011AD20 = FALSE; gEventCountdown = 0; - gFirstTimeFinish = 0; + gFirstTimeFinish = FALSE; gNumRacers = 0; D_8011AF00 = 0; - set_taj_status(0); + set_taj_status(TAJ_WANDER); levelHeader = get_current_level_header(); raceType = levelHeader->race_type; if (raceType == RACETYPE_CUTSCENE_1 || raceType == RACETYPE_CUTSCENE_2) { return; } if (raceType == RACETYPE_BOSS || raceType & RACETYPE_CHALLENGE) { - gIsTimeTrial = 0; - gTimeTrialEnabled = 0; + gIsTimeTrial = FALSE; + gTimeTrialEnabled = FALSE; } cutsceneID = -1; if (is_time_trial_enabled() && raceType == RACETYPE_DEFAULT) { cutsceneCameraSegment = cam_get_cameras(); - cutsceneID = (u8) cutsceneCameraSegment->zoom; + cutsceneID = cutsceneCameraSegment->zoom; cutsceneCameraSegment->zoom = 1; } gameMode = get_game_mode(); settings = get_settings(); - miscAsset16 = (s8 *) get_misc_asset(3); + miscAsset16 = (s8 *) get_misc_asset(ASSET_MISC_3); gPrevTimeTrialVehicle = D_8011ADC5; - tajFlags = settings->courseFlagsPtr[settings->courseId]; - if (!(tajFlags & 1)) { // Check if the player has not visited the course yet. - settings->courseFlagsPtr[settings->courseId] = tajFlags | 1; + if (!(settings->courseFlagsPtr[settings->courseId] & + RACE_VISITED)) { // Check if the player has not visited the course yet. + settings->courseFlagsPtr[settings->courseId] |= RACE_VISITED; D_8011AF00 = 2; } if (raceType != RACETYPE_DEFAULT) { D_8011AF00 = 2; } - for (i2 = 0; i2 < 8; i2++) { - spB4[i2] = 0; - spF4[i2] = 0; - spD4[i2] = 0; + for (j = 0; j < ARRAY_COUNT(spawnZ); j++) { + spawnX[j] = 0; + spawnY[j] = 0; + spawnZ[j] = 0; } - for (i2 = 0; i2 < gObjectCount; i2++) { - curObj = gObjPtrList[i2]; - if (!(curObj->trans.flags & OBJ_FLAGS_PARTICLE)) { - if (curObj->behaviorId == BHV_SETUP_POINT) { - if (arg1 == (u32) curObj->properties.setupPoint.entranceID) { - if (curObj->properties.setupPoint.racerIndex < 8) { - spF4[curObj->properties.setupPoint.racerIndex] = curObj->trans.x_position; - spD4[curObj->properties.setupPoint.racerIndex] = curObj->trans.y_position; - spB4[curObj->properties.setupPoint.racerIndex] = curObj->trans.z_position; - sp94[curObj->properties.setupPoint.racerIndex] = curObj->trans.rotation.y_rotation; + for (j = 0; j < gObjectCount; j++) { + racerObj = gObjPtrList[j]; + if (!(racerObj->trans.flags & OBJ_FLAGS_PARTICLE)) { + if (racerObj->behaviorId == BHV_SETUP_POINT) { + if (entranceID == racerObj->properties.setupPoint.entranceID) { + if (racerObj->properties.setupPoint.racerIndex < 8) { + spawnX[racerObj->properties.setupPoint.racerIndex] = racerObj->trans.x_position; + spawnY[racerObj->properties.setupPoint.racerIndex] = racerObj->trans.y_position; + spawnZ[racerObj->properties.setupPoint.racerIndex] = racerObj->trans.z_position; + spawnAngle[racerObj->properties.setupPoint.racerIndex] = racerObj->trans.rotation.y_rotation; } - tempVehicle = curObj->level_entry->setupPoint.vehicle; - if (tempVehicle != -1) { - vehicle = tempVehicle; + + objEntry = racerObj->level_entry; + if (objEntry->setupPoint.vehicle != -1) { + vehicle = objEntry->setupPoint.vehicle; } } } } } - D_8011ADC5 = vehicle; + D_8011ADC5 = vehicle; // UB if all setup points don't have an assigned vehicle ID. gPrevTimeTrialVehicle = D_8011ADC5; - numPlayers = arg2 + 1; + numPlayers = playerCount + 1; gNumRacers = 8; D_800DC740 = 0; if (is_two_player_adventure_race()) { numPlayers = 2; D_800DC740 = 1; - set_scene_viewport_num(1); + set_scene_viewport_num(VIEWPORT_LAYOUT_2_PLAYERS); } if (raceType == RACETYPE_HUBWORLD) { gTimeTrialEnabled = 0; @@ -1165,18 +1165,17 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { if (gIsTimeTrial) { raceType = RACETYPE_HUBWORLD; // ??? } - isChallengeMode = raceType & RACETYPE_CHALLENGE; if (raceType == RACETYPE_HUBWORLD || numPlayers >= 3) { gNumRacers = numPlayers; if (get_level_property_stack_pos() == 0 && D_800DC708 != 0) { - sp94[0] += D_800DC708; + spawnAngle[0] += D_800DC708; D_800DC708 = 0; } } else if (numPlayers == 2) { gNumRacers = get_multiplayer_racer_count(); } - if (isChallengeMode != 0) { + if (raceType & RACETYPE_CHALLENGE) { gNumRacers = 4; } D_8011AD3C = 0; @@ -1185,138 +1184,139 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { numPlayers = 1; D_8011AD3C = 1; } - D_800DC71C = 0; + gRollingDemo = FALSE; if (gameMode == GAMEMODE_MENU && raceType == RACETYPE_DEFAULT) { gNumRacers = 6; - D_800DC71C = 1; + gRollingDemo = TRUE; D_8011AD3C = 2; } - for (i2 = 0; i2 < gNumRacers; i2++) { - sp11C[i2] = 0; + for (i = 0; i < gNumRacers; i++) { + racerActive[i] = FALSE; } - var_a1 = 0; - for (i2 = 0; i2 < numPlayers; i2++) { - racerPos = settings->racers[i2].starting_position; - if (racerPos < gNumRacers) { - if (sp11C[racerPos] == 0) { - sp11C[racerPos] = 1; + spawnedObjCount = 0; + // Mark active for human players. + for (i = 0; i < numPlayers; i++) { + if (settings->racers[i].starting_position < gNumRacers) { + if (racerActive[settings->racers[i].starting_position] == FALSE) { + racerActive[settings->racers[i].starting_position] = TRUE; continue; } } - sp114[var_a1++] = (u16) i2; + racerIDs[spawnedObjCount++] = i; } - for (i2 = numPlayers; i2 < gNumRacers; i2++) { - racerPos = settings->racers[i2].starting_position; - if (racerPos < gNumRacers) { - if (sp11C[racerPos] == 0) { - sp11C[racerPos] = 1; + // Mark active for computer players. + for (i = numPlayers; i < gNumRacers; i++) { + if (settings->racers[i].starting_position < gNumRacers) { + if (racerActive[settings->racers[i].starting_position] == FALSE) { + racerActive[settings->racers[i].starting_position] = TRUE; continue; } } - sp114[var_a1++] = (u16) i2; + racerIDs[spawnedObjCount++] = i; } - for (i6 = 0; i6 < var_a1; i6++) { + // Assign spawn locations for active racers. + for (i = 0; i < spawnedObjCount; i++) { for (j = 0; j < gNumRacers; j++) { - if (sp11C[j] == 0) { - sp11C[j] = 1; - settings->racers[sp114[i6]].starting_position = j; - j = gNumRacers; + if (racerActive[j] == FALSE) { + racerActive[j] = TRUE; + settings->racers[racerIDs[i]].starting_position = j; + j = gNumRacers; // Break } } } - if (((!(curObj->trans.rotation.y_rotation)) && (!(curObj->trans.rotation.y_rotation))) && - (!(curObj->trans.rotation.y_rotation))) {} - entry = mempool_alloc_safe(sizeof(LevelObjectEntry_Unk8000CC7C), COLOUR_TAG_YELLOW); - entry->unkC = 0; - entry->unkA = 0; - entry->unk8 = 0; + racerEntry = mempool_alloc_safe(sizeof(LevelObjectEntry_Racer), COLOUR_TAG_YELLOW); + racerEntry->angleY = 0; + racerEntry->angleX = 0; + racerEntry->angleZ = 0; if (levelHeader->vehicle == VEHICLE_CAR) { gIsNonCarRacers = FALSE; } else { gIsNonCarRacers = TRUE; } - sp127 = -1; - i2 = gNumRacers; D_8011AD24[1] = levelHeader->bossRaceID; - for (i6 = 0; i6 < gNumRacers; i6++) { - var_s4 = i6; - if (raceType != RACETYPE_HUBWORLD && isChallengeMode == 0 && D_8011AD3C == 0) { - var_s4 = 0; - // This might not be a for loop? - for (j = 0; j < gNumRacers; j++) { - if (i6 == settings->racers[j].starting_position) { + sp127 = -1; + for (i = 0; i < gNumRacers; i++) { + if (raceType != RACETYPE_HUBWORLD && !(raceType & RACETYPE_CHALLENGE) && D_8011AD3C == 0) { + j = 0; + var_s4 = j; + do { + if (i == settings->racers[j].starting_position) { var_s4 = j; - j = i2; + j = gNumRacers; } - } - } - if (var_s4 < numPlayers) { - entry->unkE = var_s4; + j++; + } while (j < gNumRacers); } else { - entry->unkE = 4; + var_s4 = i; } - if (raceType != RACETYPE_HUBWORLD || entry->unkE != 4) { - spawnObjFlags = OBJECT_SPAWN_UNK01; + racerEntry->playerIndex = var_s4 < numPlayers ? var_s4 : 4; + if (raceType != RACETYPE_HUBWORLD || racerEntry->playerIndex != 4) { if (D_8011AD3C == 1) { - if (i6 == 0) { + if (i == 0) { vehicle = gBossVehicles[D_8011AD24[1]].playerVehicle; } else { - vehicle = gBossVehicles[D_8011AD24[1]].playerVehicle; + vehicle = gBossVehicles[D_8011AD24[1]].bossVehicle; } } else if (D_8011AD3C == 2) { vehicle = levelHeader->vehicle; } else { - if (entry->unkE == 4 || is_two_player_adventure_race()) { + if (racerEntry->playerIndex == 4 || is_two_player_adventure_race()) { vehicle = get_player_selected_vehicle(PLAYER_ONE); } else if (numPlayers >= 2) { - vehicle = get_player_selected_vehicle(entry->unkE); + vehicle = get_player_selected_vehicle(racerEntry->playerIndex); } } // Are these assignments correct? Seems weird. if (D_8011AD3C == 2) { - objectId = D_800DC7A8[D_800DC840[i6] + (vehicle * 10)]; + objectID = gRacerObjectTable[D_800DC840[i] + (vehicle * NUM_CHARACTERS)]; } else if (vehicle < 5) { - objectId = D_800DC7A8[(settings->racers[var_s4].character) + (vehicle * 10)]; + objectID = gRacerObjectTable[(settings->racers[var_s4].character) + (vehicle * NUM_CHARACTERS)]; } else { - objectId = D_800DC7B8[vehicle]; + objectID = gRacerObjectTable[vehicle + 45]; } - entry->common.objectID = objectId; - entry->common.size = ((objectId & 0x100) >> 1) | 0x10; - entry->common.x = spF4[i6]; - entry->common.y = spD4[i6]; - entry->common.z = spB4[i6]; - entry->unkC = sp94[i6]; - if (entry->unkE == 4) { + racerEntry->common.objectID = objectID; + racerEntry->common.size = ((objectID & 0x100) >> 1) | 0x10; + racerEntry->common.x = spawnX[i]; + racerEntry->common.y = spawnY[i]; + racerEntry->common.z = spawnZ[i]; + racerEntry->angleY = spawnAngle[i]; + if (racerEntry->playerIndex == 4) { model_anim_offset(1); } - if (entry->unkE == 4) { - spawnObjFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_UNK04; + + spawnObjFlags = OBJECT_BEHAVIOUR_SHADED; + if (racerEntry->playerIndex == 4) { + spawnObjFlags = OBJECT_BEHAVIOUR_SHADED | OBJECT_BEHAVIOUR_WATER_EFFECT; + // @fake but required for the | OBJECT_BEHAVIOUR_ANIMATION below to work + if (1) { + spawnObjFlags |= 0; + } if (numPlayers >= 2) { - spawnObjFlags |= OBJECT_SPAWN_UNK08; + spawnObjFlags |= OBJECT_BEHAVIOUR_ANIMATION; } } - if (entry->unkE != 4) { + if (racerEntry->playerIndex != 4) { if (numPlayers == 1) { - spawnObjFlags |= OBJECT_SPAWN_UNK10; + spawnObjFlags |= OBJECT_BEHAVIOUR_INTERACTIVE; } } if (vehicle >= VEHICLE_BOSSES) { - spawnObjFlags = OBJECT_SPAWN_UNK01; + spawnObjFlags = OBJECT_BEHAVIOUR_SHADED; model_anim_offset(0); } - newRacerObj = spawn_object((LevelObjectEntryCommon *) entry, spawnObjFlags); - newRacerObj->trans.rotation.y_rotation = sp94[i6]; - (*gRacers)[i6] = newRacerObj; - gRacersByPosition[i6] = newRacerObj; - gRacersByPort[var_s4] = newRacerObj; - curRacer = newRacerObj->racer; - newRacerObj->level_entry = NULL; + racerObj = spawn_object((LevelObjectEntryCommon *) racerEntry, spawnObjFlags); + racerObj->trans.rotation.y_rotation = spawnAngle[i]; + (*gRacers)[i] = racerObj; + gRacersByPosition[i] = racerObj; + gRacersByPort[var_s4] = racerObj; + curRacer = racerObj->racer; + racerObj->level_entry = NULL; curRacer->vehicleID = vehicle; curRacer->vehicleIDPrev = vehicle; if (sp127 != -1 && sp127 != (s32) vehicle) { @@ -1328,14 +1328,13 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { gIsNonCarRacers = TRUE; } curRacer->unk1CB = vehicle; - tempVehicle = curRacer->unk1CB; - if (tempVehicle < VEHICLE_CAR || tempVehicle > VEHICLE_PLANE) { + if (curRacer->unk1CB < VEHICLE_CAR || curRacer->unk1CB > VEHICLE_PLANE) { curRacer->unk1CB = 0; } curRacer->racerIndex = var_s4; curRacer->characterId = settings->racers[var_s4].character; if (D_8011AD3C == 2) { - curRacer->characterId = D_800DC840[i6]; + curRacer->characterId = D_800DC840[i]; } else { curRacer->characterId = settings->racers[var_s4].character; } @@ -1344,7 +1343,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { } else { curRacer->bananas = 0; } - if (get_filtered_cheats() & CHEAT_START_WITH_10_BANANAS && !isChallengeMode) { + if (get_filtered_cheats() & CHEAT_START_WITH_10_BANANAS && !(raceType & RACETYPE_CHALLENGE)) { if (curRacer->playerIndex != PLAYER_COMPUTER) { curRacer->bananas = 10; } @@ -1355,7 +1354,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { curRacer->vehicleSound = NULL; } - newRacerObj->interactObj->pushForce = miscAsset16[curRacer->characterId] + 1; + racerObj->interactObj->pushForce = miscAsset16[curRacer->characterId] + 1; switch (curRacer->vehicleID) { case VEHICLE_TRICKY: case VEHICLE_BLUEY: @@ -1365,7 +1364,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { case VEHICLE_BUBBLER: case VEHICLE_WIZPIG: case VEHICLE_ROCKET: - racer_special_init(newRacerObj, curRacer); + racer_special_init(racerObj, curRacer); break; default: break; @@ -1379,157 +1378,166 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { if (D_8011AD3C != 0) { D_8011AD20 = FALSE; } + // Remove unwanted objects depending on race type. if (get_game_mode() == GAMEMODE_INGAME) { for (j = 0; j < gObjectCount; j++) { - curObj = gObjPtrList[j]; - tajFlags = curObj->header->flags; - if ((tajFlags & 0x20) && (gIsTimeTrial)) { - free_object(curObj); - } else if ((tajFlags & 0x40) && (numPlayers >= 2)) { - free_object(curObj); + racerObj = gObjPtrList[j]; + i = racerObj->header->flags; + if (i & OBJECT_HEADER_NO_TIME_TRIAL && gIsTimeTrial) { + free_object(racerObj); + } else if (i & OBJECT_HEADER_NO_MULTIPLATER && numPlayers >= 2) { + free_object(racerObj); } } } - gGhostObjStaff = 0; + gGhostObjStaff = NULL; timetrial_free_staff_ghost(); gTimeTrialContPak = -1; - if ((gIsTimeTrial) && (numPlayers == 1)) { + if (gIsTimeTrial && numPlayers == 1) { timetrial_reset_player_ghost(); - gTimeTrialContPak = timetrial_init_player_ghost(0); + gTimeTrialContPak = timetrial_init_player_ghost(PLAYER_ONE); gHasGhostToSave = 0; - if (gTimeTrialVehicle >= 5) { - gTimeTrialVehicle = 0; + if (gTimeTrialVehicle >= VEHICLE_BOSSES) { + gTimeTrialVehicle = VEHICLE_CAR; } - if (timetrial_valid_player_ghost() != 0) { - objectId = D_800DC7A8[(gTimeTrialVehicle * 10) + gTimeTrialCharacter]; - entry->common.size = ((objectId & 0x100) >> 1) | 0x10; - entry->common.objectID = objectId; - entry->common.x = spF4[0]; - entry->common.y = spD4[0]; - entry->common.z = spB4[0]; - entry->unkC = sp94[0]; - newRacerObj = spawn_object((LevelObjectEntryCommon *) entry, OBJECT_SPAWN_UNK01); - newRacerObj->level_entry = NULL; - newRacerObj->behaviorId = BHV_TIMETRIAL_GHOST; - newRacerObj->shadow->scale = 0.01f; - newRacerObj->interactObj->flags = INTERACT_FLAGS_NONE; - gGhostObjPlayer = newRacerObj; - newRacerObj->racer->transparency = 0x60; + // Spawn player ghost. + if (timetrial_valid_player_ghost()) { + objectID = gRacerObjectTable[gTimeTrialCharacter + (gTimeTrialVehicle * NUM_CHARACTERS)]; + racerEntry->common.size = ((objectID & 0x100) >> 1) | 0x10; + racerEntry->common.objectID = objectID; + racerEntry->common.x = spawnX[0]; + racerEntry->common.y = spawnY[0]; + racerEntry->common.z = spawnZ[0]; + racerEntry->angleY = spawnAngle[0]; + curObj = spawn_object((LevelObjectEntryCommon *) racerEntry, 1); + curObj->level_entry = NULL; + curObj->behaviorId = BHV_TIMETRIAL_GHOST; + curObj->shadow->scale = 0.01f; + curObj->interactObj->flags = INTERACT_FLAGS_NONE; + gGhostObjPlayer = curObj; + curRacer = gGhostObjPlayer->racer; + curRacer->transparency = 96; } - if (timetrial_init_staff_ghost(get_current_map_id()) != 0) { - objectId = D_800DC7B8[gMapDefaultVehicle * 10]; - entry->common.size = ((objectId & 0x100) >> 1) | 0x10; - entry->common.objectID = objectId; - entry->common.x = spF4[0]; - entry->common.y = spD4[0]; - entry->common.z = spB4[0]; - entry->unkC = sp94[0]; - newRacerObj = spawn_object((LevelObjectEntryCommon *) entry, OBJECT_SPAWN_UNK01); - newRacerObj->level_entry = NULL; - newRacerObj->behaviorId = BHV_TIMETRIAL_GHOST; - newRacerObj->shadow->scale = 0.01f; - newRacerObj->interactObj->flags = INTERACT_FLAGS_NONE; - gGhostObjStaff = newRacerObj; - newRacerObj->racer->transparency = 0x60; + // Spawn staff ghost + if (timetrial_init_staff_ghost(get_current_map_id())) { + objectID = gRacerObjectTable[(gMapDefaultVehicle * NUM_CHARACTERS) + 8]; + + racerEntry->common.size = ((objectID & 0x100) >> 1) | 0x10; + racerEntry->common.objectID = objectID; + racerEntry->common.x = spawnX[0]; + racerEntry->common.y = spawnY[0]; + racerEntry->common.z = spawnZ[0]; + racerEntry->angleY = spawnAngle[0]; + curObj = spawn_object((LevelObjectEntryCommon *) racerEntry, 1); + curObj->level_entry = NULL; + curObj->behaviorId = BHV_TIMETRIAL_GHOST; + curObj->shadow->scale = 0.01f; + curObj->interactObj->flags = INTERACT_FLAGS_NONE; + gGhostObjStaff = curObj; + curRacer = gGhostObjStaff->racer; + curRacer->transparency = 96; } } - gEventCountdown = 100; - for (j = 0; j < gNumRacers; j++) { - curRacerObj = (*gRacers)[j]; - curRacer = curRacerObj->racer; - for (i2 = 0; i2 < 10; i2++) { - update_player_racer(curRacerObj, LOGIC_30FPS); // Simulate 10 updates? + + for (j = 0, gEventCountdown = 100; j < gNumRacers; j++) { + racerObj = (*gRacers)[j]; + curRacer = racerObj->racer; + for (k = 0; k < 10; k++) { + update_player_racer(racerObj, LOGIC_30FPS); // Settle racers. } if (curRacer->playerIndex == PLAYER_COMPUTER) { - var_s4 = (var_s4 + 1) & 1; - for (i2 = 0; i2 < curRacerObj->header->numberOfModelIds; i2++) { - if (curRacerObj->modelInstances[i2] != NULL) { - if (curRacerObj->modelInstances[i2]->animUpdateTimer != 0) { - curRacerObj->modelInstances[i2]->animUpdateTimer = (var_s4 * 2); + var_s4++; + var_s4 &= 1; + for (k = 0; k < racerObj->header->numberOfModelIds; k++) { + if (racerObj->modelInstances[k] != NULL) { + if (racerObj->modelInstances[k]->animUpdateTimer != 0) { + racerObj->modelInstances[k]->animUpdateTimer = (var_s4 * 2); } } } } else { // curRacer is a human racer. - for (i2 = 0; i2 < curRacerObj->header->numberOfModelIds; i2++) { - if (curRacerObj->modelInstances[i2] != NULL) { - if (curRacerObj->modelInstances[i2]->animUpdateTimer != 0) { - curRacerObj->modelInstances[i2]->animUpdateTimer = 0; + for (k = 0; k < racerObj->header->numberOfModelIds; k++) { + if (racerObj->modelInstances[k] != NULL) { + if (racerObj->modelInstances[k]->animUpdateTimer != 0) { + racerObj->modelInstances[k]->animUpdateTimer = 0; } } } } + // Apply size cheats to racers. if (get_filtered_cheats() & CHEAT_BIG_CHARACTERS) { - curRacerObj->trans.scale *= 1.4f; + racerObj->trans.scale *= 1.4f; } if (get_filtered_cheats() & CHEAT_SMALL_CHARACTERS) { - curRacerObj->trans.scale *= 0.714f; + racerObj->trans.scale *= 0.714f; } curRacer->stretch_height_cap = 1.0f; curRacer->stretch_height = 1.0f; } - if (raceType == RACETYPE_DEFAULT || isChallengeMode || gIsTimeTrial || D_8011AD3C) { + if (raceType == RACETYPE_DEFAULT || raceType & RACETYPE_CHALLENGE || gIsTimeTrial || D_8011AD3C != 0) { gEventCountdown = 80; } else { gEventCountdown = 0; } - if (raceType == RACETYPE_DEFAULT && numPlayers == 1 && !is_in_adventure_two()) { - if (is_two_player_adventure_race() == 0) { - for (i2 = 0; i2 < 3; i2++) { - entry->common.objectID = ASSET_OBJECT_ID_POSARROW; - entry->common.size = sizeof(LevelObjectEntryCommon); - entry->common.x = 0; - entry->common.y = 0; - entry->common.z = 0; - newRacerObj = spawn_object((LevelObjectEntryCommon *) entry, OBJECT_SPAWN_UNK01); - newRacerObj->properties.common.unk0 = i2; - newRacerObj->level_entry = NULL; + if (raceType == RACETYPE_DEFAULT && (playerCount + 1) == 1 && is_in_adventure_two() == FALSE) { + if (is_two_player_adventure_race() == FALSE) { + for (j = 0; j < 3; j++) { + racerEntry->common.objectID = ASSET_OBJECT_ID_POSARROW; + racerEntry->common.size = sizeof(LevelObjectEntryCommon); + racerEntry->common.x = 0; + racerEntry->common.y = 0; + racerEntry->common.z = 0; + curObj = spawn_object((LevelObjectEntryCommon *) racerEntry, OBJECT_SPAWN_UNK01); + curObj->properties.common.unk0 = j; + curObj->level_entry = NULL; } } } gRaceEndTimer = 0; - gRaceFinishTriggered = 0; + gRaceFinishTriggered = FALSE; set_next_taj_challenge_menu(0); if (settings->worldId == WORLD_CENTRAL_AREA) { - if (!is_in_tracks_mode()) { - var_s4 = 0; + if (is_in_tracks_mode() == FALSE) { miscAsset16 = (s8 *) get_misc_asset(ASSET_MISC_16); - tajFlags = settings->tajFlags; + j = 0; // settings->balloonsPtr[0] is the total balloon count. - if (!(tajFlags & TAJ_FLAGS_CAR_CHAL_UNLOCKED) && (settings->balloonsPtr[0] >= miscAsset16[0])) { - var_s4 = 1; - } else if (!(tajFlags & TAJ_FLAGS_HOVER_CHAL_UNLOCKED) && (settings->balloonsPtr[0] >= miscAsset16[1])) { - var_s4 = 2; - } else if (!(tajFlags & TAJ_FLAGS_PLANE_CHAL_UNLOCKED) && (settings->balloonsPtr[0] >= miscAsset16[2])) { - var_s4 = 3; + if (!(settings->tajFlags & TAJ_FLAGS_CAR_CHAL_UNLOCKED) && (settings->balloonsPtr[0] >= miscAsset16[0])) { + j = 1; + } else if (!(settings->tajFlags & TAJ_FLAGS_HOVER_CHAL_UNLOCKED) && + (settings->balloonsPtr[0] >= miscAsset16[1])) { + j = 2; + } else if (!(settings->tajFlags & TAJ_FLAGS_PLANE_CHAL_UNLOCKED) && + (settings->balloonsPtr[0] >= miscAsset16[2])) { + j = 3; } - if (var_s4) { + // Taj will teleport straight to the player to initiate a challenge. + if (j) { set_taj_voice_line(SOUND_VOICE_TAJ_CHALLENGE_RACE); - settings->tajFlags |= 1 << (var_s4 + 31); - set_taj_status(2); - set_next_taj_challenge_menu(var_s4); + settings->tajFlags |= 1 << (j + 31); + set_taj_status(TAJ_TELEPORT); + set_next_taj_challenge_menu(j); safe_mark_write_save_file(get_save_file_index()); } } } - *D_8011AD24 = 1; + D_8011AD24[0] = TRUE; if (cutsceneID >= 0) { cutsceneCameraSegment->zoom = cutsceneID; } - if (func_8000E148() != 0) { + // Menu demos will skip straight to the action. + if (racetype_demo()) { rumble_init(FALSE); gEventCountdown = 0; start_level_music(1.0f); } + //!@bug: Free timer is already 0 when loading levels. mempool_free_timer(0); - mempool_free(entry); + mempool_free(racerEntry); mempool_free_timer(2); } -#else -#pragma GLOBAL_ASM("asm/nonmatchings/objects/func_8000CC7C.s") -#endif /** * Return an error status for the controller pak. @@ -1565,8 +1573,11 @@ s8 func_8000E138(void) { return D_8011AD20; } -s8 func_8000E148(void) { - return D_800DC71C; +/** + * Returns true if currently in a rolling demo. + */ +s8 racetype_demo(void) { + return gRollingDemo; } s8 func_8000E158(void) { @@ -1644,9 +1655,10 @@ void transform_player_vehicle(void) { spawnObj.unkE = 0; spawnObj.common.size = 16; if (gOverworldVehicle < VEHICLE_BOSSES) { - objectID = ((s16 *) D_800DC7A8)[settings->racers[PLAYER_ONE].character + gOverworldVehicle * 10]; + objectID = + ((s16 *) gRacerObjectTable)[settings->racers[PLAYER_ONE].character + gOverworldVehicle * NUM_CHARACTERS]; } else { - objectID = D_800DC7B8[gOverworldVehicle + 37]; + objectID = gRacerObjectTable[gOverworldVehicle + 45]; } set_level_default_vehicle(gOverworldVehicle); spawnObj.common.size |= (objectID & 0x100) >> 1; @@ -2897,7 +2909,7 @@ void obj_update(s32 updateRate) { audspat_update_all(gRacersByPort, gNumRacers, updateRate); gPathUpdateOff = TRUE; gObjectUpdateRateF = (f32) updateRate; - D_8011AD24[0] = 0; + D_8011AD24[0] = FALSE; D_8011AD53 = 0; transform_player_vehicle(); dialogue_try_close(); diff --git a/src/objects.h b/src/objects.h index 24adb431..defd63e6 100644 --- a/src/objects.h +++ b/src/objects.h @@ -181,6 +181,17 @@ enum ObjectSpawnFlags { OBJECT_SPAWN_UNK10 = (1 << 4) }; +enum ObjectHeaderFlags { + OBJECT_HEADER_NONE, + OBJECT_HEADER_UNK01 = (1 << 0), + OBJECT_HEADER_UNK02 = (1 << 1), + OBJECT_HEADER_UNK04 = (1 << 2), + OBJECT_HEADER_UNK08 = (1 << 3), + OBJECT_HEADER_UNK10 = (1 << 4), + OBJECT_HEADER_NO_TIME_TRIAL = (1 << 5), // Disable object in time trial mode. + OBJECT_HEADER_NO_MULTIPLATER = (1 << 6) // Disable object in multiplayer. +}; + enum ObjectBehaviourFlags { OBJECT_BEHAVIOUR_NONE, OBJECT_BEHAVIOUR_SHADED = (1 << 0), @@ -293,7 +304,7 @@ s32 func_8000CC20(Object *obj); s32 get_contpak_error(void); void instShowBearBar(void); s8 func_8000E138(void); -s8 func_8000E148(void); +s8 racetype_demo(void); s8 func_8000E158(void); s8 func_8000E184(void); void func_8000E194(void); @@ -425,7 +436,7 @@ s32 obj_init_property_flags(s32 behaviorId); void tt_ghost_beaten(s32 arg0, s16 *playerId); void obj_init_animobject(Object *, Object *); Object *obj_butterfly_node(f32 x, f32 y, f32 z, f32 maxDistCheck, s32 dontCheckYAxis); -void func_8002125C(Object *obj, LevelObjectEntry_Animation *entry, Object_AnimatedObject *charSelect, UNUSED s32 index); +void func_8002125C(Object *obj, LevelObjectEntry_Animation *entry, Object_AnimatedObject *animObj, UNUSED s32 index); void func_80021104(Object *obj, Object_AnimatedObject *animObj, LevelObjectEntry_Animation *entry); s32 func_8001955C(Object *obj, s32 checkpoint, u8 arg2, s32 arg3, s32 arg4, f32 checkpointDist, f32 *outX, f32 *outY, f32 *outZ); @@ -477,14 +488,14 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32); s32 func_8001F460(Object *, s32, Object *); void func_8000B750(Object *racerObj, s32 racerIndex, s32 vehicleIDPrev, s32 boostType, s32 arg4); void func_80018CE0(Object *racerObj, f32 xPos, f32 yPos, f32 zPos, s32 updateRate); -s32 func_800185E4(s32 checkpointIndex, Object *obj, f32 objX, f32 objY, f32 objZ, f32 *checkpointDistance, u8 *arg6); +s32 func_800185E4(s32 checkpointIndex, Object *obj, f32 objX, f32 objY, f32 objZ, f32 *arg5, u8 *arg6); void obj_tex_animate(Object *, s32); Object *find_furthest_telepoint(f32 x, f32 z); void func_8006017C(ObjectModel *); void set_temp_model_transforms(Object *); void func_800101AC(Object *, s32); void func_800135B8(Object *); -void func_8000CC7C(Vehicle, u32, s32); +void track_setup_racers(Vehicle, u32, s32); void func_80017E98(void); void spectate_update(void); void func_8001E93C(void); diff --git a/src/racer.c b/src/racer.c index 4132aa5e..179bf0de 100644 --- a/src/racer.c +++ b/src/racer.c @@ -4458,7 +4458,7 @@ void update_player_racer(Object *obj, s32 updateRate) { playerIDF = -(f32) playerID; CLAMP(tempRacer->velocity, playerIDF, playerID); } - if (context != GAMEMODE_MENU || func_8000E148()) { + if (context != GAMEMODE_MENU || racetype_demo()) { racer_sound_update(obj, gCurrentButtonsPressed, gCurrentRacerInput, updateRate); } lastCheckpointDist = tempRacer->checkpoint_distance; diff --git a/src/tracks.c b/src/tracks.c index babb6f1e..df19e806 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -239,7 +239,7 @@ void init_track(u32 geometry, u32 skybox, s32 numberOfPlayers, Vehicle vehicle, func_8000C8F8(arg6, 0); func_8000C8F8(collectables, 1); gScenePlayerViewports = numberOfPlayers; - func_8000CC7C(vehicle, entranceId, numberOfPlayers); + track_setup_racers(vehicle, entranceId, numberOfPlayers); racerfx_alloc(72, 64); if (geometry == 0 && entranceId == 0) { diff --git a/src/tracks.h b/src/tracks.h index f7dab05d..e145b0dc 100644 --- a/src/tracks.h +++ b/src/tracks.h @@ -125,8 +125,8 @@ s32 get_inside_segment_count_xz(s32 x, s32 z, s32 *arg2); s32 get_inside_segment_count_xyz(s32 *arg0, s16 xPos1, s16 yPos1, s16 zPos1, s16 xPos2, s16 yPos2, s16 zPos2); LevelModelSegment *get_segment(s32 segmentID); LevelModelSegmentBoundingBox *get_segment_bounding_box(s32 segmentID); -void set_collision_mode(s32 arg0); -s32 get_collision_normal(f32 *arg0, f32 *arg1, f32 *arg2); +void set_collision_mode(s32 mode); +s32 get_collision_normal(f32 *outX, f32 *outY, f32 *outZ); s32 func_8002B9BC(Object *obj, f32 *arg1, Vec3f *arg2, s32 arg3); void func_8002C71C(LevelModelSegment *segment); LevelModel *get_current_level_model(void); diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index cbd9cbd5..2abc50c2 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -191,11 +191,11 @@ func_8000C8F8 = 0x8000C8F8; func_8000CBC0 = 0x8000CBC0; func_8000CBF0 = 0x8000CBF0; func_8000CC20 = 0x8000CC20; -func_8000CC7C = 0x8000CC7C; +track_setup_racers = 0x8000CC7C; get_contpak_error = 0x8000E0B0; instShowBearBar = 0x8000E128; func_8000E138 = 0x8000E138; -func_8000E148 = 0x8000E148; +racetype_demo = 0x8000E148; func_8000E158 = 0x8000E158; func_8000E184 = 0x8000E184; func_8000E194 = 0x8000E194; @@ -2209,7 +2209,7 @@ D_800DC70C = 0x800DE09C; D_800DC710 = 0x800DE0A0; D_800DC714 = 0x800DE0A4; gGhostObjStaff = 0x800DE0A8; -D_800DC71C = 0x800DE0AC; +gRollingDemo = 0x800DE0AC; gObjectTexAnim = 0x800DE0B0; gTimeTrialTime = 0x800DE0B4; gTimeTrialVehicle = 0x800DE0B8; @@ -2228,7 +2228,7 @@ gBoostObjOverrideID = 0x800DE0F0; gMagnetEffectObject = 0x800DE0F4; D_800DC768 = 0x800DE0F8; D_800DC76C = 0x800DE0FC; -D_800DC7A8 = 0x800DE138; +gRacerObjectTable = 0x800DE138; D_800DC7B8 = 0x800DE148; // type:s16 size:0x66 gBossVehicles = 0x800DE1B0; // size:0x14 D_800DC834 = 0x800DE1C4; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index c73ab097..f325d805 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -191,11 +191,11 @@ func_8000C8F8 = 0x8000C8F8; func_8000CBC0 = 0x8000CBC0; func_8000CBF0 = 0x8000CBF0; func_8000CC20 = 0x8000CC20; -func_8000CC7C = 0x8000CC7C; +track_setup_racers = 0x8000CC7C; get_contpak_error = 0x8000E0B0; instShowBearBar = 0x8000E128; func_8000E138 = 0x8000E138; -func_8000E148 = 0x8000E148; +racetype_demo = 0x8000E148; func_8000E158 = 0x8000E158; func_8000E184 = 0x8000E184; func_8000E194 = 0x8000E194; @@ -2109,7 +2109,7 @@ D_800DC70C = 0x800DC79C; D_800DC710 = 0x800DC7A0; D_800DC714 = 0x800DC7A4; gGhostObjStaff = 0x800DC7A8; -D_800DC71C = 0x800DC7AC; +gRollingDemo = 0x800DC7AC; gObjectTexAnim = 0x800DC7B0; gTimeTrialTime = 0x800DC7B4; gTimeTrialVehicle = 0x800DC7B8; @@ -2128,7 +2128,7 @@ gBoostObjOverrideID = 0x800DC7F0; gMagnetEffectObject = 0x800DC7F4; D_800DC768 = 0x800DC7F8; D_800DC76C = 0x800DC7FC; -D_800DC7A8 = 0x800DC838; +gRacerObjectTable = 0x800DC838; D_800DC7B8 = 0x800DC848; // type:s16 size:0x66 gBossVehicles = 0x800DC8B0; // size:0x14 D_800DC834 = 0x800DC8C4; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index 59e507e0..a90a810e 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -191,11 +191,11 @@ func_8000C8F8 = 0x8000C8F8; func_8000CBC0 = 0x8000CBC0; func_8000CBF0 = 0x8000CBF0; func_8000CC20 = 0x8000CC20; -func_8000CC7C = 0x8000CC7C; +track_setup_racers = 0x8000CC7C; get_contpak_error = 0x8000E0B0; instShowBearBar = 0x8000E128; func_8000E138 = 0x8000E138; -func_8000E148 = 0x8000E148; +racetype_demo = 0x8000E148; func_8000E158 = 0x8000E158; func_8000E184 = 0x8000E184; func_8000E194 = 0x8000E194; @@ -2036,7 +2036,7 @@ D_800DC70C = 0x800DCD0C; D_800DC710 = 0x800DCD10; D_800DC714 = 0x800DCD14; gGhostObjStaff = 0x800DCD18; -D_800DC71C = 0x800DCD1C; +gRollingDemo = 0x800DCD1C; gObjectTexAnim = 0x800DCD20; gTimeTrialTime = 0x800DCD24; gTimeTrialVehicle = 0x800DCD28; @@ -2055,7 +2055,7 @@ gBoostObjOverrideID = 0x800DCD60; gMagnetEffectObject = 0x800DCD64; D_800DC768 = 0x800DCD68; D_800DC76C = 0x800DCD6C; -D_800DC7A8 = 0x800DCDA8; +gRacerObjectTable = 0x800DCDA8; D_800DC7B8 = 0x800DCDB8; // type:s16 size:0x66 gBossVehicles = 0x800DCE20; // size:0x14 D_800DC834 = 0x800DCE34; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index 935e071f..c338891e 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -191,11 +191,11 @@ func_8000C8F8 = 0x8000C8F8; func_8000CBC0 = 0x8000CBC0; func_8000CBF0 = 0x8000CBF0; func_8000CC20 = 0x8000CC20; -func_8000CC7C = 0x8000CC7C; +track_setup_racers = 0x8000CC7C; get_contpak_error = 0x8000E0B0; instShowBearBar = 0x8000E128; func_8000E138 = 0x8000E138; -func_8000E148 = 0x8000E148; +racetype_demo = 0x8000E148; func_8000E158 = 0x8000E158; func_8000E184 = 0x8000E184; func_8000E194 = 0x8000E194; @@ -2204,7 +2204,7 @@ D_800DC70C = 0x800DC70C; D_800DC710 = 0x800DC710; D_800DC714 = 0x800DC714; gGhostObjStaff = 0x800DC718; -D_800DC71C = 0x800DC71C; +gRollingDemo = 0x800DC71C; gObjectTexAnim = 0x800DC720; gTimeTrialTime = 0x800DC724; gTimeTrialVehicle = 0x800DC728; @@ -2223,7 +2223,7 @@ gBoostObjOverrideID = 0x800DC760; gMagnetEffectObject = 0x800DC764; D_800DC768 = 0x800DC768; D_800DC76C = 0x800DC76C; -D_800DC7A8 = 0x800DC7A8; +gRacerObjectTable = 0x800DC7A8; D_800DC7B8 = 0x800DC7B8; // type:s16 size:0x66 gBossVehicles = 0x800DC820; // size:0x14 D_800DC834 = 0x800DC834; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index 9736c740..2295ae06 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -191,11 +191,11 @@ func_8000C8F8 = 0x8000C8F8; func_8000CBC0 = 0x8000CBC0; func_8000CBF0 = 0x8000CBF0; func_8000CC20 = 0x8000CC20; -func_8000CC7C = 0x8000CC7C; +track_setup_racers = 0x8000CC7C; get_contpak_error = 0x8000E0B0; instShowBearBar = 0x8000E128; func_8000E138 = 0x8000E138; -func_8000E148 = 0x8000E148; +racetype_demo = 0x8000E148; func_8000E158 = 0x8000E158; func_8000E184 = 0x8000E184; func_8000E194 = 0x8000E194; @@ -2033,7 +2033,7 @@ D_800DC70C = 0x800DCC7C; D_800DC710 = 0x800DCC80; D_800DC714 = 0x800DCC84; gGhostObjStaff = 0x800DCC88; -D_800DC71C = 0x800DCC8C; +gRollingDemo = 0x800DCC8C; gObjectTexAnim = 0x800DCC90; gTimeTrialTime = 0x800DCC94; gTimeTrialVehicle = 0x800DCC98; @@ -2052,7 +2052,7 @@ gBoostObjOverrideID = 0x800DCCD0; gMagnetEffectObject = 0x800DCCD4; D_800DC768 = 0x800DCCD8; D_800DC76C = 0x800DCCDC; -D_800DC7A8 = 0x800DCD18; +gRacerObjectTable = 0x800DCD18; D_800DC7B8 = 0x800DCD28; // type:s16 size:0x66 gBossVehicles = 0x800DCD90; // size:0x14 D_800DC834 = 0x800DCDA4;