summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorquarrel07 <178681861+quarrel07@users.noreply.github.com>2026-08-01 23:29:56 -0500
committerGitHub <noreply@github.com>2026-08-01 22:29:56 -0600
commit8629bec3205b35b6f052a5f0a0164b8132ac1304 (patch)
tree45594c74a153377f618426ef62d77cb3a3db5a48
parentaa6c9c10caf3630ca37cb45bafc0485b76605445 (diff)
Fix the warning-flagged real bugs across the codebase (#691, 1 of 3) (#725)
* menu_items: fix the real-bug-tier compiler warnings (#691 batch 1) Six fixes, all in menu_items.c, all verified by menu playtest on macOS: - BSWAP16(*color0++) advanced the pointer twice per pixel on little-endian builds (the macro evaluates its argument twice) and mixed bytes from two different pixels. Read first, increment separately. Note: this function (func_8009A9FC) currently has no callers, so the corruption was latent, not live. - func_8009B9D0 fell off the end on a lookup miss, returning garbage (the existing code comment already suspected this). The miss path now returns the display list head unchanged, i.e. draws nothing. - update_ok_menu_item read an uninitialized stack slot for unknown menu item types; now selects an explicit no-animation value, matching what the garbage read did in practice. - pause_menu_item_box_cursor: removed the three empty 'if (x2);' matching artifacts. The x/y/z spin state itself is untouched. - func_800A1FB0: initialized var_s4/var_s5 against the guarded-but-warned switch default. - func_800A54EC: initialized the pause cursor position pointer against its unreachable mode-switch default (would have been a null-deref class bug if mode values ever grew). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * collision: define the G_ENDDL opcode shifts, return 0 when no tyre surface found Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * replays: cast staff-ghost pointer comparisons, return 0 for empty ghost buffer Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * update_objects: return 0 from conditional step helpers, fix TLUT pointer comparison, init train draw distances Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * render_player: remove the impossible lamp range (vanilla bug, never glowed on N64 either) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * math_util_2: return the vector, not the address of the parameter slot Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Crab: remove inner declaration shadowing the initialized objectIndex Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * editor: honor InverseMatrix failure (bool was compared against 2, always true) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Track.h: drop dead null checks on array members Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * shells: drop always-true angle and surface gates (behavior unchanged, s16 made them tautological) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * particles: make the no-return particle setters void Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * effects/stubs/skybox/main: align signatures with functions that return nothing Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * menus/save: type the pak status variable as s32, return BAD_READ on the fall-off path Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * audio: remove uninitialized-read matching artifacts, init isSound Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * code_80005FD0/code_80086E70: init dead bomb kart pointer and the no_init variable Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * port/engine UI: fix printf-style format types and non-literal format string Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * render_objects: feed the unused texture param to the uninitialized img walker Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Format the changed lines per .clang-format Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Address review: strip explanatory comments, drop vec3f pointer returns Comments moved to the PR record; the one flagged worth keeping stays. vec3f_set_xyz/normalize/cross_product return void now since the out argument is the interface and nothing used the pointer. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Update actors_extended.c * Add checkbox for 'Shells Shoot Straight' option * Update render_player.c * Update PortMenu.cpp * Update render_player.c * Update actors_extended.c * Update render_player.c --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
-rw-r--r--src/actors/blue_and_red_shells/update.inc.c3
-rw-r--r--src/audio/external.c1
-rw-r--r--src/audio/heap.c4
-rw-r--r--src/audio/port_eu.c2
-rw-r--r--src/code_80005FD0.c1
-rw-r--r--src/code_80057C60.c6
-rw-r--r--src/code_80057C60.h6
-rw-r--r--src/code_80086E70.c2
-rw-r--r--src/effects.c2
-rw-r--r--src/effects.h2
-rw-r--r--src/engine/editor/EditorMath.cpp6
-rw-r--r--src/engine/objects/Crab.cpp1
-rw-r--r--src/engine/tracks/Track.h6
-rw-r--r--src/engine/vehicles/Bus.cpp2
-rw-r--r--src/engine/vehicles/Car.cpp2
-rw-r--r--src/engine/vehicles/TankerTruck.cpp2
-rw-r--r--src/engine/vehicles/Train.cpp2
-rw-r--r--src/engine/vehicles/Truck.cpp2
-rw-r--r--src/main.c2
-rw-r--r--src/main.h2
-rw-r--r--src/math_util_2.c10
-rw-r--r--src/math_util_2.h6
-rw-r--r--src/menu_items.c24
-rw-r--r--src/menus.c2
-rw-r--r--src/player_controller.c4
-rw-r--r--src/port/Game.cpp1
-rw-r--r--src/port/ui/ContentBrowser.cpp1
-rw-r--r--src/port/ui/PortMenu.cpp6
-rw-r--r--src/port/ui/Properties.cpp2
-rw-r--r--src/port/ui/TrackProperties.cpp6
-rw-r--r--src/racing/actors_extended.c149
-rw-r--r--src/racing/collision.c12
-rw-r--r--src/racing/skybox_and_splitscreen.c5
-rw-r--r--src/racing/skybox_and_splitscreen.h2
-rw-r--r--src/render_objects.c6
-rw-r--r--src/render_player.c14
-rw-r--r--src/replays.c9
-rw-r--r--src/save.c3
-rw-r--r--src/spawn_players.c8
-rw-r--r--src/stubs.c1
-rw-r--r--src/update_objects.c10
41 files changed, 192 insertions, 145 deletions
diff --git a/src/actors/blue_and_red_shells/update.inc.c b/src/actors/blue_and_red_shells/update.inc.c
index 5190d28f1..f85d9ca35 100644
--- a/src/actors/blue_and_red_shells/update.inc.c
+++ b/src/actors/blue_and_red_shells/update.inc.c
@@ -186,8 +186,7 @@ s16 func_802B3FD0(Player* owner, struct ShellActor* shell) {
}
void func_802B4104(struct ShellActor* shell) {
- if ((shell->unk30.surfaceDistance[0] < 0.0f) &&
- ((shell->unk30.unk48[1] < 0.25f) || (shell->unk30.unk48[1] > -0.25f))) {
+ if (shell->unk30.surfaceDistance[0] < 0.0f) {
destroy_destructable_actor((struct Actor*) shell);
func_800C98B8(shell->pos, shell->velocity, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x54));
shell->flags |= 0x80;
diff --git a/src/audio/external.c b/src/audio/external.c
index 6ba8ee2b0..564079a55 100644
--- a/src/audio/external.c
+++ b/src/audio/external.c
@@ -1966,7 +1966,6 @@ void func_800C6108(u8 playerId) {
D_800E9E64[playerId] = (player->unk_098 / D_800E9DC4[playerId]) + D_800E9DD4[playerId];
if ((player->unk_098 < 1800.0f) && ((player->kartProps & THROTTLE) != THROTTLE)) {
D_800E9E64[playerId] = (player->unk_098 / D_800E9F7C[playerId].unk_34) + D_800E9F7C[playerId].unk_28;
- if (D_800E9EC4) {} // ?
}
if (player->speed > 4.75f) {
if (D_800E9EB4[playerId] < (D_800E9F7C[playerId].unk_18 + 0.4f)) {
diff --git a/src/audio/heap.c b/src/audio/heap.c
index 63482a163..363a2fb52 100644
--- a/src/audio/heap.c
+++ b/src/audio/heap.c
@@ -246,7 +246,7 @@ void* alloc_bank_or_seq(struct SoundMultiPool* arg0, s32 arg1, s32 size, s32 arg
u16 secondVal;
s32 var_v1_2;
u8* table;
- u8 isSound;
+ u8 isSound = 0;
if (arg3 == 0) {
tp = &arg0->temporary;
@@ -254,8 +254,6 @@ void* alloc_bank_or_seq(struct SoundMultiPool* arg0, s32 arg1, s32 size, s32 arg
if (arg0 == &gSeqLoadedPool) {
table = gSeqLoadStatus; isSound = 0;
} else {
- // wtf?
- firstVal += 0;
if (arg0 == &gBankLoadedPool) {
isSound = 1; table = gBankLoadStatus;
} else if (arg0 == &gUnusedLoadedPool) {
diff --git a/src/audio/port_eu.c b/src/audio/port_eu.c
index 60fbc1dbd..dfc9b12d2 100644
--- a/src/audio/port_eu.c
+++ b/src/audio/port_eu.c
@@ -168,8 +168,6 @@ struct SPTask* create_next_audio_frame_task(void) {
index = gAudioTaskIndex;
gAudioTask->msgqueue = NULL;
- // wtf?
- writtenCmdsCopy += 0;
gAudioTask->msg.ptr = NULL;
task = &gAudioTask->task.t;
diff --git a/src/code_80005FD0.c b/src/code_80005FD0.c
index b0e8210e8..54ab5e177 100644
--- a/src/code_80005FD0.c
+++ b/src/code_80005FD0.c
@@ -2989,6 +2989,7 @@ void set_bomb_kart_spawn_positions(void) {
BombKartSpawn* bombKartSpawn;
for (var_s3 = 0; var_s3 < NUM_BOMB_KARTS_VERSUS; var_s3++) {
+ bombKartSpawn = NULL;
// bombKartSpawn = &gBombKartSpawns[gCurrentCourseId][var_s3];
if (IsYoshiValley()) {
startingXPos = bombKartSpawn->startingXPos;
diff --git a/src/code_80057C60.c b/src/code_80057C60.c
index 3a9d04e7e..3974c3fd2 100644
--- a/src/code_80057C60.c
+++ b/src/code_80057C60.c
@@ -2545,21 +2545,21 @@ void set_particle_position_and_rotation(Player* player, UnkPlayerStruct258* arg1
arg1->unk_010 = arg6;
}
-s32 init_particle_player(UnkPlayerStruct258* arg0, s8 type, f32 arg2) {
+void init_particle_player(UnkPlayerStruct258* arg0, s8 type, f32 arg2) {
arg0->isAlive = true;
arg0->type = type;
arg0->unk_01E = 0;
arg0->scale = arg2;
}
-s32 set_particle_colour(UnkPlayerStruct258* arg0, s32 arg1, s16 arg2) {
+void set_particle_colour(UnkPlayerStruct258* arg0, s32 arg1, s16 arg2) {
arg0->red = (u8) (arg1 >> 16);
arg0->green = (u8) (arg1 >> 8);
arg0->blue = (u8) arg1;
arg0->alpha = arg2;
}
-s32 set_particle_colour_randomly_varried(UnkPlayerStruct258* arg0, s32 arg1, s16 arg2) {
+void set_particle_colour_randomly_varried(UnkPlayerStruct258* arg0, s32 arg1, s16 arg2) {
s32 temp_v0;
temp_v0 = random_int(0x30);
diff --git a/src/code_80057C60.h b/src/code_80057C60.h
index 39be870cb..5ec5cef51 100644
--- a/src/code_80057C60.h
+++ b/src/code_80057C60.h
@@ -115,9 +115,9 @@ void func_8005D1F4(s32);
void func_8005D290(void);
void reset_player_particle_pool(Player*);
void set_particle_position_and_rotation(Player*, UnkPlayerStruct258*, f32, f32, f32, s8, s8);
-s32 init_particle_player(UnkPlayerStruct258*, s8, f32);
-s32 set_particle_colour(UnkPlayerStruct258*, s32, s16);
-s32 set_particle_colour_randomly_varried(UnkPlayerStruct258*, s32, s16);
+void init_particle_player(UnkPlayerStruct258*, s8, f32);
+void set_particle_colour(UnkPlayerStruct258*, s32, s16);
+void set_particle_colour_randomly_varried(UnkPlayerStruct258*, s32, s16);
void set_drift_particles(Player*, s16, s32, s8, s8);
void check_drift_particles_setup_valid(Player*, s16, s32, s8, s8);
void func_8005DAD0(void);
diff --git a/src/code_80086E70.c b/src/code_80086E70.c
index 7e4de6fb8..2e6ecd04d 100644
--- a/src/code_80086E70.c
+++ b/src/code_80086E70.c
@@ -1331,7 +1331,7 @@ void func_8008A1D0(s32 objectIndex, s32 cameraId, s32 arg2, s32 arg3) {
// This function is really cool, it tests the value of an unitialized local variable
UNUSED void func_8008A2CC(s32 objectIndex, s32 cameraId, u16 arg2) {
Camera* camera;
- u32 no_init;
+ u32 no_init = 0;
u16 var_a2;
camera = &camera1[cameraId];
diff --git a/src/effects.c b/src/effects.c
index 933dcb08d..69f5ca1b0 100644
--- a/src/effects.c
+++ b/src/effects.c
@@ -29,7 +29,7 @@ s32 D_8018D990[8];
UNUSED void func_unnamed(void) {
}
-s32 func_8008C1D8(UNUSED s32* arg0) {
+void func_8008C1D8(UNUSED s32* arg0) {
}
void func_8008C1E0(UNUSED s32* arg0, UNUSED s32 arg1) {
diff --git a/src/effects.h b/src/effects.h
index 2bd2996c1..1d6453829 100644
--- a/src/effects.h
+++ b/src/effects.h
@@ -6,7 +6,7 @@
/* Function Prototypes */
void func_unnamed(void);
-s32 func_8008C1D8(s32*);
+void func_8008C1D8(s32*);
void func_8008C1E0(s32*, s32);
void func_unnamed1(s32);
void func_unnamed2(s32);
diff --git a/src/engine/editor/EditorMath.cpp b/src/engine/editor/EditorMath.cpp
index 635d68d59..486b86430 100644
--- a/src/engine/editor/EditorMath.cpp
+++ b/src/engine/editor/EditorMath.cpp
@@ -65,13 +65,13 @@ FVector ScreenRayTrace() {
guPerspectiveF(perspMtx, &perspNorm, camera->fieldOfView, OTRGetAspectRatio(), CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f);
Mat4 inversePerspMtx;
- if (InverseMatrix((float*)&perspMtx, (float*)&inversePerspMtx) != 2) {
+ if (InverseMatrix((float*) &perspMtx, (float*) &inversePerspMtx)) {
FVector4 rayEye = MultiplyMatrixVector(inversePerspMtx, (float*)&rayClip.x);
Mat4 lookAtMtx;
guLookAtF(lookAtMtx, camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]);
Mat4 inverseViewMtx;
- if (InverseMatrix((float*)&lookAtMtx, (float*)&inverseViewMtx[0][0]) != 2) {
+ if (InverseMatrix((float*) &lookAtMtx, (float*) &inverseViewMtx[0][0])) {
rayEye.w = 0;
FVector4 invRayWor = MultiplyMatrixVector(inverseViewMtx, (float*)&rayEye.x);
@@ -206,7 +206,7 @@ FVector TransformVecDirection(const FVector& dir, const float mtx[4][4]) {
Ray RayToLocalSpace(MtxF mtx, const Ray& ray) {
MtxF inverse;
- if (InverseMatrix((float*)&mtx, (float*)&inverse) != 2) {
+ if (InverseMatrix((float*) &mtx, (float*) &inverse)) {
FVector localRayOrigin = TransformVecByMatrix(ray.Origin, (float(*)[4])&inverse);
FVector localRayDir = TransformVecDirection(ray.Direction, (float(*)[4])&inverse);
return Ray{localRayOrigin, localRayDir.Normalize()};
diff --git a/src/engine/objects/Crab.cpp b/src/engine/objects/Crab.cpp
index c4e057b8c..a435e881e 100644
--- a/src/engine/objects/Crab.cpp
+++ b/src/engine/objects/Crab.cpp
@@ -100,7 +100,6 @@ void OCrab::DrawModel(s32 cameraId) {
func_8008A364(objectIndex, cameraId, 0x2AABU, 800);
if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) {
Camera* camera;
- s32 objectIndex;
if (gObjectList[objectIndex].state >= 2) {
camera = &camera1[cameraId];
diff --git a/src/engine/tracks/Track.h b/src/engine/tracks/Track.h
index 143bc228d..b188b0bb2 100644
--- a/src/engine/tracks/Track.h
+++ b/src/engine/tracks/Track.h
@@ -120,9 +120,9 @@ typedef struct Properties {
#ifdef __cplusplus
nlohmann::json to_json() const {
nlohmann::json j;
- j["Name"] = Name ? Name : "";
- j["DebugName"] = DebugName ? DebugName : "";
- j["TrackLength"] = TrackLength ? TrackLength : "";
+ j["Name"] = Name;
+ j["DebugName"] = DebugName;
+ j["TrackLength"] = TrackLength;
//j["AIBehaviour"] = AIBehaviour ? AIBehaviour : "";
j["LakituTowType"] = LakituTowType;
j["AIMaximumSeparation"] = AIMaximumSeparation;
diff --git a/src/engine/vehicles/Bus.cpp b/src/engine/vehicles/Bus.cpp
index 654018782..4c4d07cd9 100644
--- a/src/engine/vehicles/Bus.cpp
+++ b/src/engine/vehicles/Bus.cpp
@@ -40,7 +40,7 @@ ABus::ABus(const SpawnParams& params) : AActor(params) {
BusCounts[PathIndex].push_back(PathPoint);
break;
case SpawnMode::AUTO: // Automatically distribute buses based on a specific path point
- printf("vehicle path size %d\n", gVehiclePathSize);
+ printf("vehicle path size %zu\n", gVehiclePathSize);
PathPoint = GetVehiclePathPointDistributed(BusCounts[PathIndex], gVehiclePathSize);
BusCounts[PathIndex].push_back(PathPoint);
printf("train spawn path point: %d\n", PathPoint);
diff --git a/src/engine/vehicles/Car.cpp b/src/engine/vehicles/Car.cpp
index 4ccc321fd..7d6fbd136 100644
--- a/src/engine/vehicles/Car.cpp
+++ b/src/engine/vehicles/Car.cpp
@@ -41,7 +41,7 @@ ACar::ACar(const SpawnParams& params) : AActor(params) {
CarCounts[PathIndex].push_back(PathPoint);
break;
case SpawnMode::AUTO: // Automatically distribute cars based on a specific path point
- printf("vehicle path size %d\n", gVehiclePathSize);
+ printf("vehicle path size %zu\n", gVehiclePathSize);
PathPoint = GetVehiclePathPointDistributed(CarCounts[PathIndex], gVehiclePathSize);
CarCounts[PathIndex].push_back(PathPoint);
printf("train spawn path point: %d\n", PathPoint);
diff --git a/src/engine/vehicles/TankerTruck.cpp b/src/engine/vehicles/TankerTruck.cpp
index 258a28109..8fefdcc77 100644
--- a/src/engine/vehicles/TankerTruck.cpp
+++ b/src/engine/vehicles/TankerTruck.cpp
@@ -40,7 +40,7 @@ ATankerTruck::ATankerTruck(const SpawnParams& params) : AActor(params) {
TruckCounts[PathIndex].push_back(PathPoint);
break;
case SpawnMode::AUTO: // Automatically distribute trucks based on a specific path point
- printf("vehicle path size %d\n", gVehiclePathSize);
+ printf("vehicle path size %zu\n", gVehiclePathSize);
PathPoint = GetVehiclePathPointDistributed(TruckCounts[PathIndex], gVehiclePathSize);
TruckCounts[PathIndex].push_back(PathPoint);
printf("train spawn path point: %d\n", PathPoint);
diff --git a/src/engine/vehicles/Train.cpp b/src/engine/vehicles/Train.cpp
index a4b0e2ce2..8d985dd8e 100644
--- a/src/engine/vehicles/Train.cpp
+++ b/src/engine/vehicles/Train.cpp
@@ -57,7 +57,7 @@ ATrain::ATrain(const SpawnParams& params) : AActor(params) {
TrainCounts[pathIndex].push_back(pathPoint);
break;
case SpawnMode::AUTO: // Automatically distribute trains based on a specific path point
- printf("vehicle path size %d\n", gVehiclePathSize);
+ printf("vehicle path size %zu\n", gVehiclePathSize);
pathPoint = GetVehiclePathPointDistributed(TrainCounts[pathIndex], gVehiclePathSize);
TrainCounts[pathIndex].push_back(pathPoint);
printf("train spawn path point: %d\n", pathPoint);
diff --git a/src/engine/vehicles/Truck.cpp b/src/engine/vehicles/Truck.cpp
index d60237344..f3d9712d2 100644
--- a/src/engine/vehicles/Truck.cpp
+++ b/src/engine/vehicles/Truck.cpp
@@ -40,7 +40,7 @@ ATruck::ATruck(const SpawnParams& params) : AActor(params) {
TruckCounts[PathIndex].push_back(PathPoint);
break;
case SpawnMode::AUTO: // Automatically distribute trucks based on a specific path point
- printf("vehicle path size %d\n", gVehiclePathSize);
+ printf("vehicle path size %zu\n", gVehiclePathSize);
PathPoint = GetVehiclePathPointDistributed(TruckCounts[PathIndex], gVehiclePathSize);
TruckCounts[PathIndex].push_back(PathPoint);
printf("train spawn path point: %d\n", PathPoint);
diff --git a/src/main.c b/src/main.c
index 62e7faa21..fb4428c66 100644
--- a/src/main.c
+++ b/src/main.c
@@ -458,7 +458,7 @@ void end_master_display_list(void) {
// clear_frame_buffer from SM64, with a few edits
//! @todo Why did void* work for matching
-void* clear_framebuffer(s32 color) {
+void clear_framebuffer(s32 color) {
gDPPipeSync(gDisplayListHead++);
gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
diff --git a/src/main.h b/src/main.h
index 5b2772631..7bbfbfed1 100644
--- a/src/main.h
+++ b/src/main.h
@@ -77,7 +77,7 @@ void dispatch_audio_sptask(struct SPTask*);
void exec_display_list(struct SPTask*);
void init_rcp(void);
void end_master_display_list(void);
-void* clear_framebuffer(s32);
+void clear_framebuffer(s32);
void rendering_init(void);
void config_gfx_pool(void);
void display_and_vsync(void);
diff --git a/src/math_util_2.c b/src/math_util_2.c
index b76be6eea..df635ba85 100644
--- a/src/math_util_2.c
+++ b/src/math_util_2.c
@@ -332,29 +332,25 @@ s32 f32_step_towards(f32* value, f32 target, f32 step) {
return targetReached;
}
-Vec3f* vec3f_set_xyz(Vec3f arg0, f32 arg1, f32 arg2, f32 arg3) {
+void vec3f_set_xyz(Vec3f arg0, f32 arg1, f32 arg2, f32 arg3) {
arg0[0] = arg1;
arg0[1] = arg2;
arg0[2] = arg3;
- return (Vec3f*) &arg0;
}
-Vec3f* vec3f_normalize(Vec3f dest) {
+void vec3f_normalize(Vec3f dest) {
f32 invsqrt = 1.0f / sqrtf(dest[0] * dest[0] + dest[1] * dest[1] + dest[2] * dest[2]);
dest[0] = dest[0] * invsqrt;
dest[1] = dest[1] * invsqrt;
dest[2] = dest[2] * invsqrt;
- return (Vec3f*) &dest;
}
-Vec3f* vec3f_cross_product(Vec3f dest, Vec3f arg1, Vec3f arg2) {
+void vec3f_cross_product(Vec3f dest, Vec3f arg1, Vec3f arg2) {
dest[0] = (arg1[1] * arg2[2]) - (arg2[1] * arg1[2]);
dest[1] = (arg1[2] * arg2[0]) - (arg2[2] * arg1[0]);
dest[2] = (arg1[0] * arg2[1]) - (arg2[0] * arg1[1]);
-
- return (Vec3f*) &dest;
}
UNUSED s32 is_within_distance_2d(f32 x1, f32 y1, f32 x2, f32 y2, f32 distance) {
diff --git a/src/math_util_2.h b/src/math_util_2.h
index 22020b914..29e5d6f24 100644
--- a/src/math_util_2.h
+++ b/src/math_util_2.h
@@ -49,9 +49,9 @@ s32 s16_step_down_towards(s16*, s16, s16);
s32 u16_step_down_towards(u16*, s32, s32);
s32 s16_step_towards(s16*, s16, s16);
s32 f32_step_towards(f32*, f32, f32);
-Vec3f* vec3f_set_xyz(Vec3f, f32, f32, f32);
-Vec3f* vec3f_normalize(Vec3f dest);
-Vec3f* vec3f_cross_product(Vec3f, Vec3f, Vec3f);
+void vec3f_set_xyz(Vec3f, f32, f32, f32);
+void vec3f_normalize(Vec3f dest);
+void vec3f_cross_product(Vec3f, Vec3f, Vec3f);
s32 func_80041658(f32, f32);
f32 func_800416D8(f32 x, f32 z, u16 angle);
f32 func_80041724(f32, f32, u16);
diff --git a/src/menu_items.c b/src/menu_items.c
index 243f1aab0..ea90b1e20 100644
--- a/src/menu_items.c
+++ b/src/menu_items.c
@@ -4314,7 +4314,8 @@ void func_8009A9FC(s32 arg0, s32 arg1, u32 arg2, s32 arg3) {
color0 = LOAD_ASSET(sMenuTextureList[sMenuTextureMap[arg0].offset]);
color1 = LOAD_ASSET(sMenuTextureList[sMenuTextureMap[arg1].offset]);
for (size_t i = 0; i < arg2; i++) {
- temp_a0 = BSWAP16(*color0++);
+ temp_a0 = BSWAP16(*color0);
+ color0++;
red = (temp_a0 & 0xF800) >> 0xB;
green = (temp_a0 & 0x7C0) >> 6;
blue = (temp_a0 & 0x3E) >> 1;
@@ -4529,8 +4530,9 @@ Gfx* func_8009B9D0(Gfx* displayListHead, MenuTexture* textures) {
}
if (found) {
gSPDisplayList(displayListHead++, displayList);
- return displayListHead;
}
+ // Texture not found: draw nothing.
+ return displayListHead;
}
Gfx* render_menu_textures(Gfx* arg0, MenuTexture* arg1, s32 column, s32 row) {
@@ -7388,8 +7390,8 @@ void func_800A1F30(UNUSED MenuItem* unused) {
void func_800A1FB0(MenuItem* arg0) {
Unk_D_800E70A0 spE0 = { 0 };
s32 i;
- s32 var_s5;
- s32 var_s4;
+ s32 var_s5 = SUB_MENU_COPY_PAK_FROM_GHOST_MIN;
+ s32 var_s4 = 0;
char spB8[3];
s32 var_s1;
char spA8[3];
@@ -8441,7 +8443,8 @@ void render_pause_battle(MenuItem* arg0) {
void func_800A54EC(void) {
Unk_D_800E70A0 sp50;
- Unk_D_800E70A0* var_v1;
+ // Initialized against the (unreachable) default of the mode switch below.
+ Unk_D_800E70A0* var_v1 = &D_800E8538[0];
MenuItem* sp48;
s32 whyTheSequel;
s32 why;
@@ -8768,12 +8771,6 @@ void pause_menu_item_box_cursor(MenuItem* arg0, Unk_D_800E70A0* arg1) {
y2 += y1;
z2 += z1;
- // clang-format off
- if (x2);
- if (y2);
- if (z2);
- // clang-format on
-
guScale(mtx, 1.2f, 1.2f, 1.2f);
guRotate(mtx2, y2, 0.0f, 1.0f, 0.0f);
guMtxCatL(mtx, mtx2, mtx);
@@ -10074,12 +10071,13 @@ const s8 D_800F0CA0[] = {
};
void update_ok_menu_item(MenuItem* arg0) {
- s32 sp4;
s32 var_v0;
switch (arg0->type) {
default:
- var_v0 = sp4; // wut?
+ // Was an uninitialized read; -1 hits no animation case below,
+ // which is what the garbage value did in practice.
+ var_v0 = -1;
break;
case MENU_ITEM_UI_OK:
var_v0 = D_800F0CA0[gMainMenuSelection - 1];
diff --git a/src/menus.c b/src/menus.c
index 8476e43d3..615302c04 100644
--- a/src/menus.c
+++ b/src/menus.c
@@ -238,7 +238,7 @@ void options_menu_act(struct Controller* controller, u16 controllerIdx) {
MenuItem* sp38;
s32 res;
struct_8018EE10_entry* sp30;
- bool tempVar; // cursorWasMoved or communicateStoredAction
+ s32 tempVar; // cursorWasMoved or communicateStoredAction; also holds PFS_* status codes
UNUSED u32 pad;
btnAndStick = (controller->buttonPressed | controller->stickPressed);
diff --git a/src/player_controller.c b/src/player_controller.c
index ed9aaff67..89a774274 100644
--- a/src/player_controller.c
+++ b/src/player_controller.c
@@ -3824,9 +3824,7 @@ void func_80033AE0(Player* player, struct Controller* controller, s8 arg2) {
func_8002BD58(player);
}
player->effects &= 0xDFFFFFFF;
- if (((s32) player->tyres[BACK_RIGHT].surfaceType) > 0xE) {
- var_f12 = var_f12;
- } else {
+ if (((s32) player->tyres[BACK_RIGHT].surfaceType) <= 0xE) {
var_f12 += D_800E3410[player->characterId][player->tyres[BACK_RIGHT].surfaceType];
}
if (((s32) player->tyres[BACK_LEFT].surfaceType) < 0xF) {
diff --git a/src/port/Game.cpp b/src/port/Game.cpp
index c1afe80b1..375bca787 100644
--- a/src/port/Game.cpp
+++ b/src/port/Game.cpp
@@ -288,6 +288,7 @@ s32 CM_GetCrossingOnTriggered(uintptr_t* crossing) {
if (ptr) {
return ptr->OnTriggered;
}
+ return 0;
}
/**
diff --git a/src/port/ui/ContentBrowser.cpp b/src/port/ui/ContentBrowser.cpp
index 3427c08c2..1dfb20705 100644
--- a/src/port/ui/ContentBrowser.cpp
+++ b/src/port/ui/ContentBrowser.cpp
@@ -333,5 +333,6 @@ void ContentBrowserWindow::AddActorContent(std::string search) {
}
}
ImGui::End();
+ return nullptr;
}
}
diff --git a/src/port/ui/PortMenu.cpp b/src/port/ui/PortMenu.cpp
index 69e887481..dfef9b87a 100644
--- a/src/port/ui/PortMenu.cpp
+++ b/src/port/ui/PortMenu.cpp
@@ -405,6 +405,9 @@ void PortMenu::AddEnhancements() {
AddWidget(path, "Enable Look Behind Camera", WIDGET_CVAR_CHECKBOX)
.CVar("gLookBehind")
.Options(CheckboxOptions().Tooltip("Press C-Left to look behind you"));
+ AddWidget(path, "Fix Visuals", WIDGET_CVAR_CHECKBOX)
+ .CVar("gFixVisuals")
+ .Options(CheckboxOptions().Tooltip("Fixes the second last lamp glow in Banshee Boardwalk"));
AddRulesets();
@@ -464,6 +467,9 @@ void PortMenu::AddRulesets() {
.CVar("gGoFish")
.Options(CheckboxOptions().Tooltip(
"Collect as many trophies as you can. Racer with the most trophies wins!"));
+ AddWidget(path, "Shells Shoot Straight", WIDGET_CVAR_CHECKBOX)
+ .CVar("gShellsShootStraight")
+ .Options(CheckboxOptions().Tooltip("Fixes a logic bug in the game code. No evidence if this is intended gameplay or not."));
AddWidget(path, "Track X Stretch", WIDGET_SLIDER_FLOAT)
.ValuePointer(&gVtxStretch[0])
.Options(UIWidgets::FloatSliderOptions().Min(0.1f).Max(10.0f).Step(0.1f).Format("%.2f"));
diff --git a/src/port/ui/Properties.cpp b/src/port/ui/Properties.cpp
index 88974290c..98062f3c0 100644
--- a/src/port/ui/Properties.cpp
+++ b/src/port/ui/Properties.cpp
@@ -61,7 +61,7 @@ namespace TrackEditor {
ImGui::SetCursorPosX((windowWidth - textWidth) * 0.5f);
// Display actor title
- ImGui::Text(title);
+ ImGui::Text("%s", title);
// Display actor resource name. ex. mk:cloud
if (obj->ResourceName[0] != '\0') { // Params is unset for some train components
diff --git a/src/port/ui/TrackProperties.cpp b/src/port/ui/TrackProperties.cpp
index ccf677776..ba7a7dd32 100644
--- a/src/port/ui/TrackProperties.cpp
+++ b/src/port/ui/TrackProperties.cpp
@@ -389,15 +389,15 @@ namespace TrackEditor {
RGB8ToFloat((u8*)&D_800DC610[i].l->l.dir, direction);
// Edit the ambient RGB colour
- ImGui::Text("Light %d - Ambient Colour", i + 1);
+ ImGui::Text("Light %zu - Ambient Colour", i + 1);
ImGui::ColorEdit3(("Ambient Colour " + std::to_string(i)).c_str(), ambient); // Modify ambient colour
// Edit the diffuse RGB colour
- ImGui::Text("Light %d - Diffuse Colour", i + 1);
+ ImGui::Text("Light %zu - Diffuse Colour", i + 1);
ImGui::ColorEdit3(("Diffuse Colour " + std::to_string(i)).c_str(), diffuse); // Modify diffuse colour
// Edit the direction RGB colour (this could be represented as a direction vector)
- ImGui::Text("Light %d - Direction", i + 1);
+ ImGui::Text("Light %zu - Direction", i + 1);
ImGui::ColorEdit3(("Direction Colour " + std::to_string(i)).c_str(), direction); // Modify direction vector colour
FloatToRGB8(ambient, (u8*)&D_800DC610[i].a.l.col);
diff --git a/src/racing/actors_extended.c b/src/racing/actors_extended.c
index 8a1676f1c..b629ec4ce 100644
--- a/src/racing/actors_extended.c
+++ b/src/racing/actors_extended.c
@@ -438,81 +438,104 @@ void update_actor_triple_shell(TripleShellParent* parent, s16 shellType) {
if (parent->firePressed > 0.0f) { // Fires a shell and resets firePressed to zero
if (parent->shellIndices[0] > 0.0f) {
shell = (struct ShellActor*) GET_ACTOR((s16) parent->shellIndices[0]);
- if ((shell->rotAngle < 0x38E) || (shell->rotAngle >= -0x38D)) {
- someVelocity[0] = 0;
- someVelocity[1] = 0;
- someVelocity[2] = 8;
- func_802B64C4(someVelocity, player->rotation[1] + player->unk_0C0);
- shell->velocity[0] = someVelocity[0];
- shell->velocity[1] = someVelocity[1];
- shell->velocity[2] = someVelocity[2];
- shell->state = MOVING_SHELL;
- shell->someTimer = 0x001E;
- func_800C9060(parent->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04));
- func_800C90F4(parent->playerId,
- (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00));
- if (parent->type == ACTOR_TRIPLE_RED_SHELL) {
- add_red_shell_in_unexpired_actor_list(parent->shellIndices[0]);
- } else {
- add_green_shell_in_unexpired_actor_list(parent->shellIndices[0]);
+ /**
+ * Below is a feature that continues holding triple shells until they are aiming forward.
+ * In decomp the three gShellsShootStraight conditions always evaluated to true,
+ * thus negating the feature from ever working.
+ * It has been re-added in for experimental purposes with slight adjustments
+ * to behave correctly and for clean code.
+ */
+ if (CVarGetInteger("gShellsShootStraight", 0)) {
+ // Forces shell 1 to fire inside a cone of -5 to +5 degrees
+ if ((shell->rotAngle < -0x38E) || (shell->rotAngle > 0x38E)) {
+ break;
}
- parent->shellIndices[0] = -1.0f;
- parent->shellsAvailable -= 1;
- parent->firePressed -= 1.0f;
- break;
}
+ someVelocity[0] = 0;
+ someVelocity[1] = 0;
+ someVelocity[2] = 8;
+ func_802B64C4(someVelocity, player->rotation[1] + player->unk_0C0);
+ shell->velocity[0] = someVelocity[0];
+ shell->velocity[1] = someVelocity[1];
+ shell->velocity[2] = someVelocity[2];
+ shell->state = MOVING_SHELL;
+ shell->someTimer = 0x001E;
+ func_800C9060(parent->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04));
+ func_800C90F4(parent->playerId,
+ (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00));
+ if (parent->type == ACTOR_TRIPLE_RED_SHELL) {
+ add_red_shell_in_unexpired_actor_list(parent->shellIndices[0]);
+ } else {
+ add_green_shell_in_unexpired_actor_list(parent->shellIndices[0]);
+ }
+ parent->shellIndices[0] = -1.0f;
+ parent->shellsAvailable -= 1;
+ parent->firePressed -= 1.0f;
+ break;
}
if (parent->shellIndices[1] > 0.0f) {
shell = (struct ShellActor*) GET_ACTOR((s16) parent->shellIndices[1]);
- if ((shell->rotAngle < 0xAA1) || (shell->rotAngle >= 0x38F)) {
- someVelocity[0] = 0;
- someVelocity[1] = 0;
- someVelocity[2] = 8;
- func_802B64C4(someVelocity, player->rotation[1] + player->unk_0C0);
- shell->velocity[0] = someVelocity[0];
- shell->velocity[1] = someVelocity[1];
- shell->velocity[2] = someVelocity[2];
- shell->state = MOVING_SHELL;
- shell->someTimer = 0x001E;
- func_800C90F4(parent->playerId,
- (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00));
- func_800C9060(parent->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04));
- if (parent->type == ACTOR_TRIPLE_RED_SHELL) {
- add_red_shell_in_unexpired_actor_list(parent->shellIndices[1]);
- } else {
- add_green_shell_in_unexpired_actor_list(parent->shellIndices[1]);
+ if (CVarGetInteger("gShellsShootStraight", 0)) {
+ // Forces shell 2 to fire inside a cone of 5 to 14.95 degrees
+ if ((shell->rotAngle < 0x38E) || (shell->rotAngle > 0xAA1)) {
+ break;
}
- parent->shellIndices[1] = -1.0f;
- parent->shellsAvailable -= 1;
- parent->firePressed -= 1.0f;
- break;
}
+ someVelocity[0] = 0;
+ someVelocity[1] = 0;
+ someVelocity[2] = 8;
+ func_802B64C4(someVelocity, player->rotation[1] + player->unk_0C0);
+ shell->velocity[0] = someVelocity[0];
+ shell->velocity[1] = someVelocity[1];
+ shell->velocity[2] = someVelocity[2];
+ shell->state = MOVING_SHELL;
+ shell->someTimer = 0x001E;
+ func_800C90F4(parent->playerId,
+ (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00));
+ func_800C9060(parent->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04));
+ if (parent->type == ACTOR_TRIPLE_RED_SHELL) {
+ add_red_shell_in_unexpired_actor_list(parent->shellIndices[1]);
+ } else {
+ add_green_shell_in_unexpired_actor_list(parent->shellIndices[1]);
+ }
+ parent->shellIndices[1] = -1.0f;
+ parent->shellsAvailable -= 1;
+ parent->firePressed -= 1.0f;
+ break;
}
if (parent->shellIndices[2] > 0.0f) {
shell = (struct ShellActor*) GET_ACTOR((s16) parent->shellIndices[2]);
- if ((shell->rotAngle < -0x38E) || (shell->rotAngle >= -0x71B)) {
- someVelocity[0] = 0;
- someVelocity[1] = 0;
- someVelocity[2] = 8;
- func_802B64C4(someVelocity, player->rotation[1] + player->unk_0C0);
- shell->velocity[0] = someVelocity[0];
- shell->velocity[1] = someVelocity[1];
- shell->velocity[2] = someVelocity[2];
- shell->state = MOVING_SHELL;
- shell->someTimer = 0x001E;
- func_800C9060(parent->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04));
- func_800C90F4(parent->playerId,
- (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00));
- if (parent->type == ACTOR_TRIPLE_RED_SHELL) {
- add_red_shell_in_unexpired_actor_list(parent->shellIndices[2]);
- } else {
- add_green_shell_in_unexpired_actor_list(parent->shellIndices[2]);
+ if (CVarGetInteger("gShellsShootStraight", 0)) {
+ /**
+ * Forces shell 3 to fire inside a cone of -5 to -14.95 degrees
+ * -0xAA1 was originally -10 degrees (0x71C). However,
+ * shell 3 would continue looping for a bit so it's been adjusted to mirror shell 2
+ */
+ if ((shell->rotAngle < -0xAA1) || (shell->rotAngle > -0x38E)) {
+ break;
}
- parent->shellIndices[2] = -1.0f;
- parent->shellsAvailable -= 1;
- parent->firePressed -= 1.0f;
- break;
}
+ someVelocity[0] = 0;
+ someVelocity[1] = 0;
+ someVelocity[2] = 8;
+ func_802B64C4(someVelocity, player->rotation[1] + player->unk_0C0);
+ shell->velocity[0] = someVelocity[0];
+ shell->velocity[1] = someVelocity[1];
+ shell->velocity[2] = someVelocity[2];
+ shell->state = MOVING_SHELL;
+ shell->someTimer = 0x001E;
+ func_800C9060(parent->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04));
+ func_800C90F4(parent->playerId,
+ (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00));
+ if (parent->type == ACTOR_TRIPLE_RED_SHELL) {
+ add_red_shell_in_unexpired_actor_list(parent->shellIndices[2]);
+ } else {
+ add_green_shell_in_unexpired_actor_list(parent->shellIndices[2]);
+ }
+ parent->shellIndices[2] = -1.0f;
+ parent->shellsAvailable -= 1;
+ parent->firePressed -= 1.0f;
+ break;
}
}
break;
diff --git a/src/racing/collision.c b/src/racing/collision.c
index fd653df96..225dee00e 100644
--- a/src/racing/collision.c
+++ b/src/racing/collision.c
@@ -24,7 +24,7 @@ void nullify_displaylist(uintptr_t addr) {
Gfx* macro;
macro = (Gfx*) addr;
- macro->words.w0 = (G_ENDDL << 24);
+ macro->words.w0 = ((u32) (G_ENDDL & 0xFF) << 24);
macro->words.w1 = 0;
}
@@ -689,10 +689,10 @@ UNUSED s32 detect_tyre_collision(KartTyre* tyre) {
}
tyre->baseHeight = tyreY;
tyre->surfaceType = 0;
- //! @bug
- // Another function that has a return value but doesn't have an explicit return statement in one of its codepaths.
- // The return value at this point will be whatever was last returned by func_802AAE4C/func_802AB6C4/func_802AB288
- // depending on which (if any) if statements were entered on the loop's last cycle
+ // Used to fall off the end here (see git history for the original @bug
+ // note): the return value was whatever the last helper call left behind.
+ // No surface was found, so report no collision.
+ return 0;
}
s32 is_colliding_with_drivable_surface(struct Collision* collision, f32 boundingBoxSize, f32 newX, f32 newY, f32 newZ,
@@ -2187,7 +2187,7 @@ void find_vtx_and_set_colours(Gfx* displayList, s8 alpha, u8 red, u8 green, u8 b
lo = gfx->words.w0;
hi = gfx->words.w1;
opcode = GFX_GET_OPCODE(lo);
- if (opcode == (G_ENDDL << 24)) {
+ if (opcode == ((u32) (G_ENDDL & 0xFF) << 24)) {
break;
} else if (opcode == (G_DL << 24)) {
find_vtx_and_set_colours((Gfx*) hi, alpha, red, green, blue);
diff --git a/src/racing/skybox_and_splitscreen.c b/src/racing/skybox_and_splitscreen.c
index dff50e117..c669f59d1 100644
--- a/src/racing/skybox_and_splitscreen.c
+++ b/src/racing/skybox_and_splitscreen.c
@@ -257,7 +257,7 @@ UNUSED void func_802A40D4(void) {
UNUSED void func_802A40DC(void) {
}
-UNUSED s32 set_viewport2(void) {
+UNUSED void set_viewport2(void) {
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gScreenOneCtx->viewport));
gSPClearGeometryMode(gDisplayListHead++, G_CLEAR_ALL_MODES);
gSPSetGeometryMode(gDisplayListHead++,
@@ -623,7 +623,8 @@ void render_screens(ScreenContext* screen, s32 mode, s32 someId, s32 playerId) {
s32 screenId = screen - gScreenContexts;
if (NULL == camera) {
- printf("[skybox_and_splitscreen.c] Skipping rendering for screen %d. This viewport has no camera\n", screen - gScreenContexts);
+ printf("[skybox_and_splitscreen.c] Skipping rendering for screen %ld. This viewport has no camera\n",
+ (long) (screen - gScreenContexts));
return;
}
diff --git a/src/racing/skybox_and_splitscreen.h b/src/racing/skybox_and_splitscreen.h
index 38748f36a..81be1edf3 100644
--- a/src/racing/skybox_and_splitscreen.h
+++ b/src/racing/skybox_and_splitscreen.h
@@ -26,7 +26,7 @@ void func_802A40C4(void);
void func_802A40CC(void);
void func_802A40D4(void);
void func_802A40DC(void);
-s32 set_viewport2(void);
+void set_viewport2(void);
void set_viewport(void);
void select_framebuffer(void);
void func_802A4300(void);
diff --git a/src/render_objects.c b/src/render_objects.c
index f100ab95d..f6fa6b1aa 100644
--- a/src/render_objects.c
+++ b/src/render_objects.c
@@ -2181,11 +2181,13 @@ UNUSED void func_8004CD18(s32 arg0, s32 arg1, u8* texture) {
func_8004C91C(arg0, arg1, texture, 64, 64, 32);
}
-UNUSED void func_8004CD48(s32 arg0, s32 arg1, UNUSED u8* texture, s32 width, s32 arg4, s32 height) {
+UNUSED void func_8004CD48(s32 arg0, s32 arg1, u8* texture, s32 width, s32 arg4, s32 height) {
UNUSED s32 pad;
s32 var_s0;
s32 i;
- u8* img;
+ // img was never initialized; the (formerly UNUSED) texture param is
+ // clearly what the loop was meant to walk.
+ u8* img = texture;
var_s0 = arg1 - (arg4 / 2);
gSPDisplayList(gDisplayListHead++, D_0D007FE0);
diff --git a/src/render_player.c b/src/render_player.c
index ad4b5eb26..07a9cc38f 100644
--- a/src/render_player.c
+++ b/src/render_player.c
@@ -1021,6 +1021,18 @@ void render_light_environment_on_player(Player* player, s8 arg1) {
D_80164B80[arg1] = 0;
}
} else if (IsBansheeBoardwalk()) {
+ /**
+ * @bug For the second last lamp
+ *
+ * The condition for this lamp does not work, and if it did,
+ * the lamp area extends nearly to the finishline.
+ * This adjustment places the lamp glow into a suitable area
+ */
+ s16 bugFix = 0x288; // Original game value
+ if (CVarGetInteger("gFixVisuals", 0)) {
+ bugFix = 0x25F; // Bug fix
+ }
+
if (((gNearestPathPointByPlayerId[arg1] >= 0xD) && (gNearestPathPointByPlayerId[arg1] < 0x15)) ||
((gNearestPathPointByPlayerId[arg1] >= 0x29) && (gNearestPathPointByPlayerId[arg1] < 0x39)) ||
((gNearestPathPointByPlayerId[arg1] >= 0x46) && (gNearestPathPointByPlayerId[arg1] < 0x4E)) ||
@@ -1037,7 +1049,7 @@ void render_light_environment_on_player(Player* player, s8 arg1) {
((gNearestPathPointByPlayerId[arg1] >= 0x216) && (gNearestPathPointByPlayerId[arg1] < 0x21D)) ||
((gNearestPathPointByPlayerId[arg1] >= 0x230) && (gNearestPathPointByPlayerId[arg1] < 0x23A)) ||
((gNearestPathPointByPlayerId[arg1] >= 0x24C) && (gNearestPathPointByPlayerId[arg1] < 0x256)) ||
- ((gNearestPathPointByPlayerId[arg1] >= 0x288) && (gNearestPathPointByPlayerId[arg1] < 0x269)) ||
+ ((gNearestPathPointByPlayerId[arg1] >= bugFix) && (gNearestPathPointByPlayerId[arg1] < 0x269)) ||
((gNearestPathPointByPlayerId[arg1] >= 0x274) &&
(gNearestPathPointByPlayerId[arg1] < 0x27E))) { // under a lamp
change_player_color_effect_rgb(player, arg1, COLOR_LIGHT, 0.3f);
diff --git a/src/replays.c b/src/replays.c
index ae844fe0c..2ba389f95 100644
--- a/src/replays.c
+++ b/src/replays.c
@@ -72,11 +72,11 @@ void load_course_ghost(void) {
u8* ghost = (u8*) D_80162DC4;
size_t size = 0;
- if (ghost == d_luigi_raceway_staff_ghost) {
+ if (ghost == (u8*) d_luigi_raceway_staff_ghost) {
size = 1046 * sizeof(StaffGhost);
- } else if (ghost == d_mario_raceway_staff_ghost) {
+ } else if (ghost == (u8*) d_mario_raceway_staff_ghost) {
size = 935 * sizeof(StaffGhost);
- } else if (ghost == d_royal_raceway_staff_ghost) {
+ } else if (ghost == (u8*) d_royal_raceway_staff_ghost) {
size = 1907 * sizeof(StaffGhost);
}
@@ -135,6 +135,9 @@ s32 func_800051C4(void) {
mio0encode((s32) sReplayGhostEncoded, (sReplayGhostBufferSize * 4) + 0x20, (s32) gReplayGhostCompressed);
return phi_v0 + 0x1e;
}
+ // Empty buffer used to fall off the end; report zero encoded size (the
+ // caller only checks this against an upper bound).
+ return 0;
}
void func_8000522C(void) {
diff --git a/src/save.c b/src/save.c
index 8e200e159..cadc00393 100644
--- a/src/save.c
+++ b/src/save.c
@@ -689,6 +689,9 @@ s32 controller_pak_2_status(void) {
return PFS_PAK_BAD_READ;
}
}
+ // Reached when the pak was just marked BAD above; used to fall off the
+ // end and return garbage.
+ return PFS_PAK_BAD_READ;
}
s32 func_800B5F30(void) {
diff --git a/src/spawn_players.c b/src/spawn_players.c
index 5233f428a..6064f5181 100644
--- a/src/spawn_players.c
+++ b/src/spawn_players.c
@@ -1325,7 +1325,9 @@ void spawn_multiplayer_cameras(u32 mode) {
Vec3f spawn = {gPlayers[i].pos[0], gPlayers[i].pos[1], gPlayers[i].pos[2]};
camera = CM_AddCamera(spawn, gPlayers[i].rotation[1], mode);
if (!camera) {
- CM_ThrowRuntimeError("[spawn_players] [spawn_multiplayer_cameras] NULL camera while attempting to create camera for player %d", i);
+ CM_ThrowRuntimeError("[spawn_players] [spawn_multiplayer_cameras] NULL camera while attempting to create "
+ "camera for player %zu",
+ i);
}
CM_AttachCamera(camera, i);
gScreenContexts[i].camera = camera;
@@ -1336,7 +1338,9 @@ void spawn_multiplayer_cameras(u32 mode) {
Vec3f spawn = {gPlayers[i].pos[0], gPlayers[i].pos[1], gPlayers[i].pos[2]};
camera = CM_AddLookBehindCamera(spawn, gPlayers[i].rotation[1], mode);
if (!camera) {
- CM_ThrowRuntimeError("[spawn_players] [spawn_multiplayer_cameras] NULL camera while attempting to create LookBehind camera for player %d", i);
+ CM_ThrowRuntimeError("[spawn_players] [spawn_multiplayer_cameras] NULL camera while attempting to create "
+ "LookBehind camera for player %zu",
+ i);
}
CM_AttachCamera(camera, i);
gScreenContexts[i].lookBehindCamera = camera;
diff --git a/src/stubs.c b/src/stubs.c
index 11a7b74a1..93fbe1099 100644
--- a/src/stubs.c
+++ b/src/stubs.c
@@ -62,4 +62,5 @@ void osSpTaskYield(void) {
}
OSYieldResult osSpTaskYielded(OSTask* task) {
+ return 0;
}
diff --git a/src/update_objects.c b/src/update_objects.c
index 006e5607d..697072351 100644
--- a/src/update_objects.c
+++ b/src/update_objects.c
@@ -943,6 +943,7 @@ s32 func_80073B34(s32 arg0, s16* arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s
if (arg3 < *arg1) {
return func_80073A10(arg0, arg1, arg2, arg3, arg4, arg5, arg6);
}
+ return 0;
}
bool func_80073B78(s32 arg0, s32 objectIndex, s16* arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7) {
@@ -1112,6 +1113,7 @@ s32 func_8007415C(s32 objectIndex, f32* arg1, f32 arg2, f32 arg3, f32 arg4, s32
if (*arg1 < arg3) {
return func_8007401C(objectIndex, arg1, arg2, arg3, arg4, arg5, arg6);
}
+ return 0;
}
s32 func_800741B4(s32 objectIndex, f32* arg1, f32 arg2, f32 arg3, f32 arg4, s32 arg5, s32 arg6) {
@@ -1223,7 +1225,7 @@ void func_800745C8(s32 objectIndex, const char** lakituTexturePtr) {
if ((gObjectList[objectIndex].status & 1) != 0) {
phi_a1 = 0;
- if (gObjectList[objectIndex].tlutList != gObjectList[objectIndex].activeTLUT) {
+ if (gObjectList[objectIndex].tlutList != (const u8*) gObjectList[objectIndex].activeTLUT) {
gObjectList[objectIndex].activeTLUT = gObjectList[objectIndex].tlutList;
}
@@ -2910,7 +2912,8 @@ void func_8007D714(s32 arg0) {
}
void func_8007DDC0(s32 objectIndex) {
- f32 sp2C;
+ // Initialized for the non-race CC modes the switch below doesn't cover.
+ f32 sp2C = 1150.0f;
Object* object;
object = &gObjectList[objectIndex];
@@ -2951,7 +2954,8 @@ void func_8007DDC0(s32 objectIndex) {
}
void func_8007E1F4(s32 objectIndex) {
- f32 sp2C;
+ // Initialized for the non-race CC modes the check below doesn't cover.
+ f32 sp2C = 700.0f;
Object* object;
object = &gObjectList[objectIndex];