some rename and allow change the course engine (#691)

* some rename and allow change the course engine

* fix comment

* add more comment

* rename and change description
This commit is contained in:
coco875 2024-10-21 01:24:37 +02:00 committed by GitHub
parent 0e0345f96d
commit 8901f82f5a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
59 changed files with 891 additions and 751 deletions

View File

@ -330,7 +330,7 @@ glabel L8001AFD8
/* 01BC94 8001B094 46283280 */ add.d $f10, $f6, $f8
/* 01BC98 8001B098 8D86001C */ lw $a2, 0x1c($t4)
/* 01BC9C 8001B09C AFA70028 */ sw $a3, 0x28($sp)
/* 01BCA0 8001B0A0 0C0AB870 */ jal spawn_actor_on_surface
/* 01BCA0 8001B0A0 0C0AB870 */ jal get_surface_height
/* 01BCA4 8001B0A4 462053A0 */ cvt.s.d $f14, $f10
/* 01BCA8 8001B0A8 8FA70028 */ lw $a3, 0x28($sp)
/* 01BCAC 8001B0AC 3C013F80 */ li $at, 0x3F800000 # 1.000000
@ -582,7 +582,7 @@ glabel L8001B3B4
/* 01C054 8001B454 E4E00028 */ swc1 $f0, 0x28($a3)
/* 01C058 8001B458 E4E0002C */ swc1 $f0, 0x2c($a3)
/* 01C05C 8001B45C AFA70028 */ sw $a3, 0x28($sp)
/* 01C060 8001B460 0C0AB870 */ jal spawn_actor_on_surface
/* 01C060 8001B460 0C0AB870 */ jal get_surface_height
/* 01C064 8001B464 462033A0 */ cvt.s.d $f14, $f6
/* 01C068 8001B468 8FA70028 */ lw $a3, 0x28($sp)
/* 01C06C 8001B46C 3C013F80 */ li $at, 0x3F800000 # 1.000000
@ -1122,7 +1122,7 @@ glabel L8001BB30
/* 01C7F4 8001BBF4 46249180 */ add.d $f6, $f18, $f4
/* 01C7F8 8001BBF8 8CE60020 */ lw $a2, 0x20($a3)
/* 01C7FC 8001BBFC AFA70028 */ sw $a3, 0x28($sp)
/* 01C800 8001BC00 0C0AB870 */ jal spawn_actor_on_surface
/* 01C800 8001BC00 0C0AB870 */ jal get_surface_height
/* 01C804 8001BC04 462033A0 */ cvt.s.d $f14, $f6
/* 01C808 8001BC08 8FA70028 */ lw $a3, 0x28($sp)
/* 01C80C 8001BC0C C4E8000C */ lwc1 $f8, 0xc($a3)

View File

@ -3,7 +3,7 @@ glabel func_8006FA94
/* 070698 8006FA98 AFBF0014 */ sw $ra, 0x14($sp)
/* 07069C 8006FA9C 0C01BE33 */ jal func_8006F8CC
/* 0706A0 8006FAA0 00000000 */ nop
/* 0706A4 8006FAA4 0C01BC02 */ jal func_8006F008
/* 0706A4 8006FAA4 0C01BC02 */ jal course_mini_map_settings
/* 0706A8 8006FAA8 00000000 */ nop
/* 0706AC 8006FAAC 24040000 */ li $a0, 0
/* 0706B0 8006FAB0 0C0338C4 */ jal osSetTime

View File

@ -15,13 +15,13 @@ glabel func_8004F168
/* 04FD9C 8004F19C 01CF1821 */ addu $v1, $t6, $t7
/* 04FDA0 8004F1A0 94780000 */ lhu $t8, ($v1)
/* 04FDA4 8004F1A4 00A03825 */ move $a3, $a1
/* 04FDA8 8004F1A8 3C018019 */ lui $at, %hi(D_8018D2A0) # $at, 0x8019
/* 04FDA8 8004F1A8 3C018019 */ lui $at, %hi(gMiniMapMarkerScale) # $at, 0x8019
/* 04FDAC 8004F1AC 33198000 */ andi $t9, $t8, 0x8000
/* 04FDB0 8004F1B0 13200088 */ beqz $t9, .L8004F3D4
/* 04FDB4 8004F1B4 00044040 */ sll $t0, $a0, 1
/* 04FDB8 8004F1B8 C420D2A0 */ lwc1 $f0, %lo(D_8018D2A0)($at)
/* 04FDB8 8004F1B8 C420D2A0 */ lwc1 $f0, %lo(gMiniMapMarkerScale)($at)
/* 04FDBC 8004F1BC C4640014 */ lwc1 $f4, 0x14($v1)
/* 04FDC0 8004F1C0 3C098019 */ lui $t1, %hi(D_8018D2C0) # 0x8019
/* 04FDC0 8004F1C0 3C098019 */ lui $t1, %hi(gMiniMapFinishLineX) # 0x8019
/* 04FDC4 8004F1C4 C466001C */ lwc1 $f6, 0x1c($v1)
/* 04FDC8 8004F1C8 46002082 */ mul.s $f2, $f4, $f0
/* 04FDCC 8004F1CC 01284821 */ addu $t1, $t1, $t0
@ -29,11 +29,11 @@ glabel func_8004F168
/* 04FDD4 8004F1D4 3C0C8019 */ lui $t4, %hi(D_8018D2B0) # $t4, 0x8019
/* 04FDD8 8004F1D8 858CD2B0 */ lh $t4, %lo(D_8018D2B0)($t4)
/* 04FDDC 8004F1DC 854AD2F0 */ lh $t2, %lo(D_8018D2F0)($t2)
/* 04FDE0 8004F1E0 8529D2C0 */ lh $t1, %lo(D_8018D2C0)($t1) # -0x2d40($t1)
/* 04FDE0 8004F1E0 8529D2C0 */ lh $t1, %lo(gMiniMapFinishLineX)($t1) # -0x2d40($t1)
/* 04FDE4 8004F1E4 4600120D */ trunc.w.s $f8, $f2
/* 04FDE8 8004F1E8 46003302 */ mul.s $f12, $f6, $f0
/* 04FDEC 8004F1EC 3C0F8019 */ lui $t7, %hi(D_8018D2E0) # $t7, 0x8019
/* 04FDF0 8004F1F0 85EFD2E0 */ lh $t7, %lo(D_8018D2E0)($t7)
/* 04FDEC 8004F1EC 3C0F8019 */ lui $t7, %hi(gMiniMapX) # $t7, 0x8019
/* 04FDF0 8004F1F0 85EFD2E0 */ lh $t7, %lo(gMiniMapX)($t7)
/* 04FDF4 8004F1F4 01001025 */ move $v0, $t0
/* 04FDF8 8004F1F8 012A5821 */ addu $t3, $t1, $t2
/* 04FDFC 8004F1FC 05810003 */ bgez $t4, .L8004F20C
@ -43,21 +43,21 @@ glabel func_8004F168
.L8004F20C:
/* 04FE0C 8004F20C 44084000 */ mfc1 $t0, $f8
/* 04FE10 8004F210 016D7023 */ subu $t6, $t3, $t5
/* 04FE14 8004F214 3C0D8019 */ lui $t5, %hi(D_8018D2D8) # 0x8019
/* 04FE14 8004F214 3C0D8019 */ lui $t5, %hi(gMiniMapFinishLineY) # 0x8019
/* 04FE18 8004F218 01CFC021 */ addu $t8, $t6, $t7
/* 04FE1C 8004F21C 3C0E8019 */ lui $t6, %hi(D_8018D2F8) # $t6, 0x8019
/* 04FE20 8004F220 01A26821 */ addu $t5, $t5, $v0
/* 04FE24 8004F224 00084C00 */ sll $t1, $t0, 0x10
/* 04FE28 8004F228 85ADD2D8 */ lh $t5, %lo(D_8018D2D8)($t5) # -0x2d28($t5)
/* 04FE28 8004F228 85ADD2D8 */ lh $t5, %lo(gMiniMapFinishLineY)($t5) # -0x2d28($t5)
/* 04FE2C 8004F22C 85CED2F8 */ lh $t6, %lo(D_8018D2F8)($t6)
/* 04FE30 8004F230 3C198019 */ lui $t9, %hi(D_8018D2B8) # $t9, 0x8019
/* 04FE34 8004F234 4600628D */ trunc.w.s $f10, $f12
/* 04FE38 8004F238 8739D2B8 */ lh $t9, %lo(D_8018D2B8)($t9)
/* 04FE3C 8004F23C 00095403 */ sra $t2, $t1, 0x10
/* 04FE40 8004F240 030A2021 */ addu $a0, $t8, $t2
/* 04FE44 8004F244 3C188019 */ lui $t8, %hi(D_8018D2E8) # $t8, 0x8019
/* 04FE44 8004F244 3C188019 */ lui $t8, %hi(gMiniMapY) # $t8, 0x8019
/* 04FE48 8004F248 01AE7821 */ addu $t7, $t5, $t6
/* 04FE4C 8004F24C 8718D2E8 */ lh $t8, %lo(D_8018D2E8)($t8)
/* 04FE4C 8004F24C 8718D2E8 */ lh $t8, %lo(gMiniMapY)($t8)
/* 04FE50 8004F250 440E5000 */ mfc1 $t6, $f10
/* 04FE54 8004F254 00046400 */ sll $t4, $a0, 0x10
/* 04FE58 8004F258 000C5C03 */ sra $t3, $t4, 0x10

View File

@ -1,122 +0,0 @@
#include "courses/all_course_data.h"
#include "courses/all_course_packed.h"
#include "include/actor_types.h"
#include "include/bomb_kart.h"
#include "include/common_structs.h"
#include "include/config.h"
#include "include/course_offsets.h"
#include "include/decode.h"
#include "include/defines.h"
#include "include/kart_attributes.h"
#include "include/libc/math.h"
#include "include/libc/stdarg.h"
#include "include/libc/stddef.h"
#include "include/libc/stdio.h"
#include "include/libc/stdlib.h"
#include "include/libc/string.h"
#include "include/macros.h"
#include "include/objects.h"
#include "include/PR/abi.h"
#include "include/PR/gbi.h"
#include "include/PR/gs2dex.h"
#include "include/PR/gu.h"
#include "include/PR/libaudio.h"
#include "include/PR/libultra.h"
#include "include/PR/mbi.h"
#include "include/PR/os.h"
#include "include/PR/os_ai.h"
#include "include/PR/os_cache.h"
#include "include/PR/os_cont.h"
#include "include/PR/os_eeprom.h"
#include "include/PR/os_exception.h"
#include "include/PR/os_internal.h"
#include "include/PR/os_libc.h"
#include "include/PR/os_message.h"
#include "include/PR/os_misc.h"
#include "include/PR/os_pi.h"
#include "include/PR/os_rdp.h"
#include "include/PR/os_thread.h"
#include "include/PR/os_time.h"
#include "include/PR/os_tlb.h"
#include "include/PR/os_vi.h"
#include "include/PR/R4300.h"
#include "include/PR/rcp.h"
#include "include/PR/sptask.h"
#include "include/PR/ucode.h"
#include "include/PR/ultratypes.h"
#include "include/save_data.h"
#include "include/segments.h"
#include "include/sounds.h"
#include "include/types.h"
#include "include/ultra64.h"
#include "include/vehicles.h"
#include "include/waypoints.h"
#include "src/audio/data.h"
#include "src/audio/effects.h"
#include "src/audio/external.h"
#include "src/audio/heap.h"
#include "src/audio/internal.h"
#include "src/audio/load.h"
#include "src/audio/playback.h"
#include "src/audio/port_eu.h"
#include "src/audio/seqplayer.h"
#include "src/audio/synthesis.h"
#include "src/buffers.h"
#include "src/camera.h"
#include "src/camera_junk.h"
#include "src/code_800029B0.h"
#include "src/animation.h"
#include "src/code_80005FD0.h"
#include "src/code_8003DC40.h"
#include "src/code_80057C60.h"
#include "src/code_8006E9C0.h"
#include "src/update_objects.h"
#include "src/code_80086E70.h"
#include "src/code_80091440.h"
#include "src/code_80091750.h"
#include "src/code_800AF9B0.h"
#include <assets/common_data.h>
#include <assets/data_800E45C0.h>
#include <assets/data_800E8700.h>
#include "src/data/some_data.h"
#include "src/data/path_spawn_metadata.h"
#include "src/buffers/trig_tables.h"
#include "src/data_segment2.h"
#include "src/effects.h"
#include "src/ending/ceremony_and_credits.h"
#include "src/ending/code_80280000.h"
#include "src/ending/code_80281780.h"
#include "src/ending/code_80281C40.h"
#include "src/ending/credits.h"
#include "src/ending/podium_ceremony_actors.h"
#include "src/render_objects.h"
#include "src/kart_dma.h"
#include "src/main.h"
#include "src/math_util_2.h"
#include "src/menus.h"
#include "src/os/bstring.h"
#include "src/os/controller.h"
#include "src/os/hardware.h"
#include "src/os/libaudio_internal.h"
#include "src/os/libultra_internal.h"
#include "src/os/new_func.h"
#include "src/os/osAi.h"
#include "src/os/osContInternal.h"
#include "src/os/osint.h"
#include "src/os/piint.h"
#include "src/os/printf.h"
#include "src/player_controller.h"
#include "src/profiler.h"
#include "src/racing/actors.h"
#include "src/racing/actors_extended.h"
#include "src/racing/collision.h"
#include "src/racing/math_util.h"
#include "src/racing/memory.h"
#include "src/racing/race_logic.h"
#include "src/racing/render_courses.h"
#include "src/racing/skybox_and_splitscreen.h"
#include "src/render_player.h"
#include "src/save.h"
#include "src/spawn_players.h"
#include "src/staff_ghosts.h"
#include "src/textures.h"

View File

@ -435,7 +435,7 @@ index c2a84aa..338e2bd 100644
temp_v1 = ((temp_v1 - 1) * 4) + var_a3;
+ if (isFlycam) {
+ func_8029569C();
+ render_course_credits();
+ return;
+ }
+

View File

@ -3,6 +3,7 @@
#include <common_structs.h>
#include <mk64.h>
#include <course.h>
#define NUM_BOMB_KARTS_MAX 7
#define NUM_BOMB_KARTS_VERSUS 7

11
include/config.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef CONFIG_H
#define CONFIG_H
/**
* @brief Use a custom course engine
* Use a custom course engine instead of the default one who use switch. see course.h and everywhere
* ENABLE_CUSTOM_COURSE_ENGINE are use to define your
*
*/
#define ENABLE_CUSTOM_COURSE_ENGINE 0
#endif

View File

@ -4,6 +4,7 @@
#include <ultra64.h>
#include <PR/gbi.h>
#include <macros.h>
#include "waypoints.h"
/**
* @file Include for course gfx.inc.c.
@ -16,4 +17,119 @@ typedef struct {
u16 flags;
} TrackSections;
struct _struct_gCoursePathSizes_0x10 {
/* 0x00 */ u16 unk0;
/* 0x02 */ u16 unk2;
/* 0x04 */ u16 unk4;
/* 0x06 */ u16 unk6;
/* 0x08 */ u16 unk8;
/* 0x0A */ char padA[6];
}; // size 0x10
#if !ENABLE_CUSTOM_COURSE_ENGINE
typedef enum {
/* 0x00 */ COURSE_MARIO_RACEWAY = 0,
/* 0x01 */ COURSE_CHOCO_MOUNTAIN,
/* 0x02 */ COURSE_BOWSER_CASTLE,
/* 0x03 */ COURSE_BANSHEE_BOARDWALK,
/* 0x04 */ COURSE_YOSHI_VALLEY,
/* 0x05 */ COURSE_FRAPPE_SNOWLAND,
/* 0x06 */ COURSE_KOOPA_BEACH,
/* 0x07 */ COURSE_ROYAL_RACEWAY,
/* 0x08 */ COURSE_LUIGI_RACEWAY,
/* 0x09 */ COURSE_MOO_MOO_FARM,
/* 0x0A */ COURSE_TOADS_TURNPIKE,
/* 0x0B */ COURSE_KALAMARI_DESERT,
/* 0x0C */ COURSE_SHERBET_LAND,
/* 0x0D */ COURSE_RAINBOW_ROAD,
/* 0x0E */ COURSE_WARIO_STADIUM,
/* 0x0F */ COURSE_BLOCK_FORT,
/* 0x10 */ COURSE_SKYSCRAPER,
/* 0x11 */ COURSE_DOUBLE_DECK,
/* 0x12 */ COURSE_DK_JUNGLE,
/* 0x13 */ COURSE_BIG_DONUT,
/* 0x14 */ COURSE_AWARD_CEREMONY,
/* 0x15 */ NUM_COURSES
} COURSES;
#else
#define COURSE_MARIO_RACEWAY
#define COURSE_CHOCO_MOUNTAIN
#define COURSE_BOWSER_CASTLE
#define COURSE_BANSHEE_BOARDWALK
#define COURSE_YOSHI_VALLEY
#define COURSE_FRAPPE_SNOWLAND
#define COURSE_KOOPA_BEACH
#define COURSE_ROYAL_RACEWAY
#define COURSE_LUIGI_RACEWAY
#define COURSE_MOO_MOO_FARM
#define COURSE_TOADS_TURNPIKE
#define COURSE_KALAMARI_DESERT
#define COURSE_SHERBET_LAND
#define COURSE_RAINBOW_ROAD
#define COURSE_WARIO_STADIUM
#define COURSE_BLOCK_FORT
#define COURSE_SKYSCRAPER
#define COURSE_DOUBLE_DECK
#define COURSE_DK_JUNGLE
#define COURSE_BIG_DONUT
#define COURSE_AWARD_CEREMONY
#define NUM_COURSES
#endif
#if !ENABLE_CUSTOM_COURSE_ENGINE
extern s16 gCurrentCourseId;
extern s16* D_800DCBB4[];
#define GET_COURSE_800DCBB4(n) D_800DCBB4[gCurrentCourseId][n]
extern f32 gKartAICourseMaximumSeparation[];
#define GET_COURSE_AIMaximumSeparation gKartAICourseMaximumSeparation[gCurrentCourseId]
extern struct _struct_gCoursePathSizes_0x10 gCoursePathSizes[];
#define GET_COURSE_PathSizes gCoursePathSizes[gCurrentCourseId]
extern s16 gKartAISteeringSensitivity[];
#define GET_COURSE_AISteeringSensitivity gKartAISteeringSensitivity[gCurrentCourseId]
extern f32 gKartAICourseMinimumSeparation[];
#define GET_COURSE_AIMinimumSeparation gKartAICourseMinimumSeparation[gCurrentCourseId]
extern TrackWaypoint* gCoursePathTable[][4];
#define GET_COURSE_PathTable(p) segmented_to_virtual_dupe_2(gCoursePathTable[gCurrentCourseId][p])
extern TrackWaypoint* gCoursePathTable2[][4];
#define GET_COURSE_PathTable2(p) segmented_to_virtual_dupe_2(gCoursePathTable2[gCurrentCourseId][p])
extern KartAIBehaviour* gKartAIBehaviourLUT[];
#define GET_COURSE_AIBehaviour segmented_to_virtual_dupe_2(gKartAIBehaviourLUT[i])
extern char* gCourseNames[];
#define GET_COURSE_Name gCourseNames[gCurrentCourseId]
extern char* gCourseNamesDup[];
#define GET_COURSE_NameDup gCourseNamesDup[gCupCourseOrder[gCupSelection][gCourseIndexInCup]]
extern char* gDebugCourseNames[];
#define GET_COURSE_debugName gDebugCourseNames[gCurrentCourseId]
extern f32 gCourseFarPersp;
#define gCourseFarPersp gCourseFarPersp
extern f32 gCourseNearPersp;
#define gCourseNearPersp gCourseNearPersp
#define GET_COURSE_D_0D0096B8(cc) *(f32*) segmented_to_virtual_dupe_2(&D_0D0096B8[gCurrentCourseId][cc])
#define GET_COURSE_D_0D009808(cc) *(f32*) segmented_to_virtual_dupe_2(&D_0D009808[gCurrentCourseId][cc])
#define GET_COURSE_D_0D009418(cc) *(f32*) segmented_to_virtual_dupe_2(&D_0D009418[gCurrentCourseId][cc])
#define GET_COURSE_D_0D009568(cc) *(f32*) segmented_to_virtual_dupe_2(&D_0D009568[gCurrentCourseId][cc])
#else
#define gCurrentCourseId
#define GET_COURSE_800DCBB4(n)
#define GET_COURSE_AIMaximumSeparation
#define GET_COURSE_PathSizes
#define GET_COURSE_AISteeringSensitivity
#define GET_COURSE_AIMinimumSeparation
#define GET_COURSE_PathTable(p)
#define GET_COURSE_PathTable2(p)
#define GET_COURSE_AIBehaviour
#define GET_COURSE_Name
#define GET_COURSE_NameDup
#define GET_COURSE_debugName
#define gCourseFarPersp
#define gCourseNearPersp
#define GET_COURSE_D_0D0096B8(cc)
#define GET_COURSE_D_0D009808(cc)
#define GET_COURSE_D_0D009418(cc)
#define GET_COURSE_D_0D009568(cc)
#endif
#endif // COURSE_H

View File

@ -6,6 +6,8 @@
* Global header for mk64
*/
#include <config.h>
/*=======================
Configuration
=======================*/
@ -23,31 +25,6 @@
// Border Height Define for NTSC Versions
#define BORDER_HEIGHT 1
typedef enum {
/* 0x00 */ COURSE_MARIO_RACEWAY = 0,
/* 0x01 */ COURSE_CHOCO_MOUNTAIN,
/* 0x02 */ COURSE_BOWSER_CASTLE,
/* 0x03 */ COURSE_BANSHEE_BOARDWALK,
/* 0x04 */ COURSE_YOSHI_VALLEY,
/* 0x05 */ COURSE_FRAPPE_SNOWLAND,
/* 0x06 */ COURSE_KOOPA_BEACH,
/* 0x07 */ COURSE_ROYAL_RACEWAY,
/* 0x08 */ COURSE_LUIGI_RACEWAY,
/* 0x09 */ COURSE_MOO_MOO_FARM,
/* 0x0A */ COURSE_TOADS_TURNPIKE,
/* 0x0B */ COURSE_KALAMARI_DESERT,
/* 0x0C */ COURSE_SHERBET_LAND,
/* 0x0D */ COURSE_RAINBOW_ROAD,
/* 0x0E */ COURSE_WARIO_STADIUM,
/* 0x0F */ COURSE_BLOCK_FORT,
/* 0x10 */ COURSE_SKYSCRAPER,
/* 0x11 */ COURSE_DOUBLE_DECK,
/* 0x12 */ COURSE_DK_JUNGLE,
/* 0x13 */ COURSE_BIG_DONUT,
/* 0x14 */ COURSE_AWARD_CEREMONY,
/* 0x15 */ NUM_COURSES
} COURSES;
#define COURSE_NULL 0xFF
typedef enum {

View File

@ -182,7 +182,7 @@ extern s16 D_80165750;
/**
* These seem to be limits on different object types in Moo Moo Farm
* See init_course_object in code_8006E9C0.c
* See init_course_objects in code_8006E9C0.c
* Maybe max number of active moles in a given group of moles?
*/
extern s32 D_8018D1C8;

View File

@ -9,4 +9,4 @@ run `make model_extract -j` to extract assets in multithreaded. And waits (for m
you can run `make fast64_blender` to run blender with fast64 enable without downloading it.
## Organisation
In Tracks there is all track json and folder (once extracted). In each track folder you can find three folder objects, sections, preview, collision_sections. Objects are all assets who are use for object/actor. Sections are all sections reference in a Gfx list who are use with render_course_segments. And preview are the version of the track who are use in func_8029569C who the complete track or a big part (some are broken). Collision sections are just collision who are use in mk64.
In Tracks there is all track json and folder (once extracted). In each track folder you can find three folder objects, sections, preview, collision_sections. Objects are all assets who are use for object/actor. Sections are all sections reference in a Gfx list who are use with render_course_segments. And preview are the version of the track who are use in render_course_credits who the complete track or a big part (some are broken). Collision sections are just collision who are use in mk64.

View File

@ -1,7 +1,9 @@
#include <ultra64.h>
#include <macros.h>
#include <mk64.h>
#include <defines.h>
#include <mk64.h>
#include <course.h>
#include "camera.h"
#include "math_util_2.h"
#include <sounds.h>

View File

@ -17,6 +17,8 @@
#include "main.h"
#include "spawn_players.h"
#include <course.h>
f32 D_800DDB30[] = { 0.4f, 0.6f, 0.275f, 0.3f };
Camera cameras[4];

View File

@ -26,7 +26,9 @@
extern s32 D_802BA038;
extern s16 D_802BA048;
#if !ENABLE_CUSTOM_COURSE_ENGINE
s16 gCurrentCourseId = 0;
#endif
s16 gCurrentlyLoadedCourseId = 0xFF;
u16 D_800DC5A8 = 0;
s32 D_800DC5AC = 0;
@ -193,7 +195,7 @@ void setup_race(void) {
gCurrentlyLoadedCourseId = gCurrentCourseId;
gNextFreeMemoryAddress = gFreeMemoryResetAnchor;
load_course(gCurrentCourseId);
func_80295D88();
course_generate_collision_mesh();
D_8015F730 = gNextFreeMemoryAddress;
} else {
gNextFreeMemoryAddress = D_8015F730;
@ -209,7 +211,7 @@ void setup_race(void) {
D_802BA038 = -1;
D_802BA048 = 0;
func_802A74BC();
func_802A4D18();
set_perspective_and_aspect_ratio();
func_80091FA4();
init_actors_and_load_textures();
@ -241,7 +243,9 @@ void setup_race(void) {
}
}
// sound related
void func_80002DAC(void) {
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
vec3f_set(D_8015F748, -223.0f, 94.0f, -155.0f);
@ -276,6 +280,9 @@ void func_80002DAC(void) {
default:
break;
}
#else
#endif
}
/**
@ -302,6 +309,7 @@ void func_80003040(void) {
gPlayerCountSelection1 = 1;
set_segment_base_addr(0x3, (void*) (gNextFreeMemoryAddress + 0xFFFF7000));
destroy_all_actors();
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
dma_textures(gTextureTrees1, 0x35B, 0x800);
@ -380,5 +388,8 @@ void func_80003040(void) {
default:
break;
}
#else
#endif
gNumPermanentActors = gNumActors;
}

View File

@ -34,7 +34,6 @@ void func_80002DAC(void);
void clear_nmi_buffer(void);
void func_80003040(void);
extern s16 gCurrentCourseId; // D_800DC5A0
extern s16 gCurrentlyLoadedCourseId;
extern u16 D_800DC5A8;
extern s32 D_800DC5AC;

View File

@ -1126,7 +1126,7 @@ void func_80008424(s32 playerId, f32 arg1, Player* player) {
}
if (var_a1 != 1) {
if (var_f2 < arg1) {
if ((gDemoMode == 1) && (gCurrentCourseId != 0x0014)) {
if ((gDemoMode == 1) && (gCurrentCourseId != COURSE_AWARD_CEREMONY)) {
player_speed(player);
} else if (D_80163330[playerId] == 1) {
func_80007D04(playerId, player);
@ -1212,7 +1212,7 @@ s32 func_800088D8(s32 playerId, s16 arg1, s16 arg2) {
return true;
}
arg1_times_8 = arg1 * 8;
temp_a3 = &D_800DCBB4[gCurrentCourseId][arg1_times_8];
temp_a3 = &GET_COURSE_800DCBB4(arg1_times_8);
if (arg2 == 0) {
if (gDemoMode == 1) {
temp_a2 = D_80164450[playerId] - D_80164450[D_80164378[7]];
@ -1434,15 +1434,15 @@ void func_8000929C(s32 playerId, Player* player) {
D_801630E2 = 1;
func_80008F38(playerId);
}
if (gCurrentCourseId == 0x0014) {
if (gCurrentCourseId == COURSE_AWARD_CEREMONY) {
func_8000B95C(playerId, sSomeNearestWaypoint, D_80163448);
return;
}
if ((sSomeNearestWaypoint < 0x14) || ((gWaypointCountByPathIndex[D_80163448] - 0x14) < sSomeNearestWaypoint) ||
(gCurrentCourseId == 0x000B)) {
(gCurrentCourseId == COURSE_KALAMARI_DESERT)) {
var_v1 = 0;
var_t0 = 0;
if (gCurrentCourseId == 0x000B) {
if (gCurrentCourseId == COURSE_KALAMARI_DESERT) {
D_801634EC = 0;
if (player->effects & 0x200) {
D_801634EC = 1;
@ -1538,7 +1538,7 @@ void update_vehicles(void) {
func_8000DF8C(i);
}
}
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_KALAMARI_DESERT:
update_vehicle_trains();
@ -1553,6 +1553,9 @@ void update_vehicles(void) {
update_vehicle_cars();
break;
}
#else
#endif
}
}
@ -1646,7 +1649,7 @@ void func_80009B60(s32 playerId) {
f32 athing = 1.5f;
player = &gPlayers[playerId];
if ((s32) gKartAICourseMaximumSeparation[gCurrentCourseId] >= 0) {
if ((s32) GET_COURSE_AIMaximumSeparation >= 0) {
D_80163100[playerId] += 1;
if (playerId == 0) {
D_80163378++;
@ -1720,11 +1723,11 @@ void func_80009B60(s32 playerId) {
break;
}
D_801631E0[playerId] = 0;
if ((player->effects & 0x1000) && (gCurrentCourseId != 0x0014)) {
if ((player->effects & 0x1000) && (gCurrentCourseId != COURSE_AWARD_CEREMONY)) {
D_801631E0[playerId] = 1;
}
if ((D_801646CC == 1) || (player->type & 0x800) || (gCurrentCourseId == 0x0014)) {
if (gCurrentCourseId != 0x000A) {
if ((D_801646CC == 1) || (player->type & 0x800) || (gCurrentCourseId == COURSE_AWARD_CEREMONY)) {
if (gCurrentCourseId != COURSE_TOADS_TURNPIKE) {
D_801634F8[playerId].unk4 = 0.0f;
}
D_801634F8[playerId].unkC = 0.0f;
@ -1743,13 +1746,13 @@ void func_80009B60(s32 playerId) {
}
D_801631F8[playerId] = D_801631E0[playerId];
switch (gCurrentCourseId) {
case 4:
case 0x0014:
case COURSE_YOSHI_VALLEY:
case COURSE_AWARD_CEREMONY:
D_801634F8[playerId].unk4 = 0.0f;
break;
default:
break;
case 10:
case COURSE_SKYSCRAPER:
func_8001490C(playerId);
func_80014A60(playerId);
func_80014BB4(playerId);
@ -1768,15 +1771,12 @@ void func_80009B60(s32 playerId) {
(D_8016334C[playerId] < gGPCurrentRaceRankByPlayerId[playerId])) {
D_80163210[playerId] = 8.333333f;
} else if (D_80162FD0 == (s16) 1U) {
D_80163210[playerId] =
*(f32*) segmented_to_virtual_dupe_2(&D_0D0096B8[gCurrentCourseId][gCCSelection]);
D_80163210[playerId] = GET_COURSE_D_0D0096B8(gCCSelection);
D_801634F8[playerId].unk4 = -0.5f;
} else if (D_801645E0[sSomeNearestWaypoint] > 0) {
D_80163210[playerId] =
*(f32*) segmented_to_virtual_dupe_2(&D_0D009418[gCurrentCourseId][gCCSelection]);
D_80163210[playerId] = GET_COURSE_D_0D009418(gCCSelection);
} else {
D_80163210[playerId] =
*(f32*) segmented_to_virtual_dupe_2(&D_0D009568[gCurrentCourseId][gCCSelection]);
D_80163210[playerId] = GET_COURSE_D_0D009568(gCCSelection);
}
check_ai_crossing_distance(playerId);
func_8000D3B8(playerId);
@ -1858,10 +1858,10 @@ void func_80009B60(s32 playerId) {
}
D_801630B8[playerId] = func_8000B7E4(playerId, sSomeNearestWaypoint);
func_8000D438(playerId, sSomeNearestWaypoint);
if (gCurrentCourseId != 0x0014) {
if (gCurrentCourseId != COURSE_AWARD_CEREMONY) {
if (D_80164450[playerId] < 0xB) {
stackPadding1A = D_801630E0;
if ((D_80164450[playerId] > 0) && (gCurrentCourseId == 0x000A)) {
if ((D_80164450[playerId] > 0) && (gCurrentCourseId == COURSE_TOADS_TURNPIKE)) {
stackPadding1A += 0x14;
stackPadding1A %= D_80164430;
func_8000BBD8(stackPadding1A, 0.0f, 0);
@ -1895,7 +1895,7 @@ void func_80009B60(s32 playerId) {
}
}
}
if (gCurrentCourseId == 0x0014) {
if (gCurrentCourseId == COURSE_AWARD_CEREMONY) {
switch (D_80163410[playerId]) { /* switch 3; irregular */
case 3: /* switch 3 */
D_80162FA0[0] = D_80163418[playerId];
@ -1928,7 +1928,7 @@ void func_80009B60(s32 playerId) {
if (var_a2 < (s16) temp_f6) {
var_a2 = temp_f6;
}
var_v1 = gKartAISteeringSensitivity[gCurrentCourseId];
var_v1 = GET_COURSE_AISteeringSensitivity;
switch (D_801631D8[playerId]) { /* switch 4; irregular */
case 2: /* switch 4 */
if (D_80163068[playerId] > (0.5f * 1.0f)) {
@ -1973,19 +1973,15 @@ void func_80009B60(s32 playerId) {
D_80163050[playerId] = var_a1;
if ((D_801630B8[playerId] == 1) || (D_801630E8[playerId] == 1) || (D_801630E8[playerId] == -1) ||
(player->effects & 0x1000000C)) {
D_80163028[playerId] =
*(f32*) segmented_to_virtual_dupe_2(&D_0D009418[gCurrentCourseId][gCCSelection]);
D_80163028[playerId] = GET_COURSE_D_0D009418(gCCSelection);
} else {
D_80163028[playerId] =
*(f32*) segmented_to_virtual_dupe_2(&D_0D009568[gCurrentCourseId][gCCSelection]);
D_80163028[playerId] = GET_COURSE_D_0D009568(gCCSelection);
}
if ((D_80163068[playerId] > 0.9f) || (D_80163068[playerId] < -0.9f)) {
D_80163028[playerId] =
*(f32*) segmented_to_virtual_dupe_2(&D_0D009808[gCurrentCourseId][gCCSelection]);
D_80163028[playerId] = GET_COURSE_D_0D009808(gCCSelection);
}
if (D_80162FD0 == 1) {
D_80163028[playerId] =
*(f32*) segmented_to_virtual_dupe_2(&D_0D0096B8[gCurrentCourseId][gCCSelection]);
D_80163028[playerId] = GET_COURSE_D_0D0096B8(gCCSelection);
}
if ((D_801630E8[playerId] == 2) || (D_801630E8[playerId] == -2) || (D_801630E8[playerId] == 3)) {
D_80163028[playerId] = 3.3333333f;
@ -2169,7 +2165,7 @@ f32 func_8000B874(f32 posX, f32 posZ, u16 waypointIndex, s32 pathIndex) {
void func_8000B95C(s32 playerId, u16 waypointIndex, s32 pathIndex) {
UNUSED Vec3f pad;
D_80163068[playerId] = 0.0f;
if ((s32) gKartAICourseMaximumSeparation[gCurrentCourseId] >= 0) {
if ((s32) GET_COURSE_AIMaximumSeparation >= 0) {
if ((gPlayers[playerId].type & 0x8000) != 0) {
D_80163068[playerId] =
func_8000B874(gPlayers[playerId].pos[0], gPlayers[playerId].pos[2], waypointIndex, pathIndex);
@ -2936,7 +2932,7 @@ void set_bomb_kart_spawn_positions(void) {
case COURSE_YOSHI_VALLEY:
startingXPos = bombKartSpawn->startingXPos;
startingZPos = bombKartSpawn->startingZPos;
startingYPos = spawn_actor_on_surface(startingXPos, 2000.0f, startingZPos);
startingYPos = get_surface_height(startingXPos, 2000.0f, startingZPos);
break;
case COURSE_AWARD_CEREMONY:
temp_v0 = &D_80164550[3][bombKartSpawn->waypointIndex];
@ -3420,7 +3416,7 @@ void func_8000F2BC(TrackWaypoint* arg0, size_t size) {
// Appears to allocate memory for each course.
void func_8000F2DC(void) {
struct _struct_gCoursePathSizes_0x10* ptr = &gCoursePathSizes[gCurrentCourseId];
struct _struct_gCoursePathSizes_0x10* ptr = &GET_COURSE_PathSizes;
s32 temp;
s32 i;
@ -3471,6 +3467,7 @@ void func_8000F2DC(void) {
}
D_80164430 = *gWaypointCountByPathIndex;
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_KALAMARI_DESERT:
generate_train_waypoints();
@ -3487,6 +3484,9 @@ void func_8000F2DC(void) {
init_vehicles_cars();
break;
}
#else
#endif
set_bomb_kart_spawn_positions();
func_8000EEDC();
}
@ -3509,7 +3509,7 @@ void func_8000F628(void) {
if (gCurrentCourseId < (NUM_COURSES - 1)) {
func_8000B95C(i, 0, 0);
}
D_80163028[i] = *(f32*) segmented_to_virtual_dupe_2(&D_0D009418[gCurrentCourseId][gCCSelection]);
D_80163028[i] = GET_COURSE_D_0D009418(gCCSelection);
D_801630E8[i] = 0;
D_80163100[i] = 0;
D_80163178[i] = 0.0f;
@ -3541,7 +3541,7 @@ void func_8000F628(void) {
D_80163068[i] = 0.0f;
D_80163090[i] = 0.0f;
var_s5 = &D_801634F8[i];
var_s5->unkC = gKartAICourseMinimumSeparation[gCurrentCourseId] * (f32) (((i + 1) % 3) - 1);
var_s5->unkC = GET_COURSE_AIMinimumSeparation * (f32) (((i + 1) % 3) - 1);
var_s5->unk4 = var_s5->unkC;
var_s5->unk0 = 0.0f;
var_s5->unk8 = 0.015f;
@ -3672,17 +3672,16 @@ void func_800100F0(s32 pathIndex) {
s32 i;
// cast required
if ((s32) gKartAICourseMaximumSeparation[gCurrentCourseId] >= 0) {
if ((s32) GET_COURSE_AIMaximumSeparation >= 0) {
pathDest = D_80164550[pathIndex];
bInvalidPath = 1;
if (gCurrentCourseId != COURSE_AWARD_CEREMONY) {
var_v0 = process_path_data(pathDest,
segmented_to_virtual_dupe_2(gCoursePathTable2[gCurrentCourseId][pathIndex]));
var_v0 = process_path_data(pathDest, GET_COURSE_PathTable2(pathIndex));
gWaypointCountByPathIndex[pathIndex] = (u16) var_v0;
} else {
// Course path included in course_data which has already been loaded into memory.
// This is how we get the addr to our path data.
path = segmented_to_virtual_dupe_2(gCoursePathTable[gCurrentCourseId][pathIndex]);
path = GET_COURSE_PathTable(pathIndex);
ptr = path;
for (i = 0; i < 3000; i++, ptr++) {
@ -3724,8 +3723,8 @@ void func_80010218(s32 pathIndex) {
TrackWaypoint* var_s1;
TrackWaypoint* var_s2;
if (((s32) gKartAICourseMaximumSeparation[gCurrentCourseId]) >= 0) {
waypointWidth = gKartAICourseMaximumSeparation[gCurrentCourseId];
if (((s32) GET_COURSE_AIMaximumSeparation) >= 0) {
waypointWidth = GET_COURSE_AIMaximumSeparation;
waypoint = &D_80164550[pathIndex][0];
var_s1 = &D_80164560[pathIndex][0];
var_s2 = &D_80164570[pathIndex][0];
@ -3775,7 +3774,7 @@ f32 func_80010480(s32 pathIndex, u16 waypointIndex) {
f32 root2;
f32 root1;
if ((s32) gKartAICourseMaximumSeparation[gCurrentCourseId] < 0) {
if ((s32) GET_COURSE_AIMaximumSeparation < 0) {
return 0.0f;
}
waypointCount = gWaypointCountByPathIndex[pathIndex];
@ -3817,7 +3816,7 @@ void func_800107C4(s32 pathIndex) {
s32 var_a3;
s16* wut;
if ((s32) gKartAICourseMaximumSeparation[gCurrentCourseId] >= 0) {
if ((s32) GET_COURSE_AIMaximumSeparation >= 0) {
var_a3 = gWaypointCountByPathIndex[pathIndex];
var_t4 = &D_80164580[pathIndex][0];
for (var_s0 = 0; var_s0 < var_a3; var_s0++, var_t4++) {
@ -3885,7 +3884,7 @@ void func_80010DBC(s32 pathIndex) {
s32 waypointIndex;
u16* angle;
if ((s32) gKartAICourseMaximumSeparation[gCurrentCourseId] >= 0) {
if ((s32) GET_COURSE_AIMaximumSeparation >= 0) {
for (angle = (u16*) &D_80164590[pathIndex][0], waypointIndex = 0;
waypointIndex < gWaypointCountByPathIndex[pathIndex]; waypointIndex++, angle++) {
*angle = func_80010CB0(pathIndex, waypointIndex);
@ -3924,13 +3923,13 @@ void func_80010E6C(s32 pathIndex) {
}
f32 func_80010F40(f32 arg0, f32 arg1, f32 arg2, UNUSED s32 arg3, UNUSED s32 arg4) {
arg1 = spawn_actor_on_surface(arg0, 2000.0f, arg2);
arg1 = get_surface_height(arg0, 2000.0f, arg2);
check_bounding_collision(&D_80162E70, 1.0f, arg0, arg1, arg2);
return arg1;
}
f32 func_80010FA0(f32 arg0, f32 arg1, f32 arg2, UNUSED s32 arg3, UNUSED s32 arg4) {
arg1 = spawn_actor_on_surface(arg0, (f32) ((f64) arg1 + 30.0), arg2);
arg1 = get_surface_height(arg0, (f32) ((f64) arg1 + 30.0), arg2);
check_bounding_collision(&D_80162E70, 10.0f, arg0, arg1, arg2);
return arg1;
}
@ -4018,12 +4017,12 @@ s32 func_80011014(TrackWaypoint* pathDest, TrackWaypoint* path, s32 numPathPoint
} else {
switch (gCurrentCourseId) {
case 13:
case COURSE_RAINBOW_ROAD:
if (var_f20_2 < (var_f28 - 15.0)) {
var_f20_2 = (f32) var_f28 - 15.0;
}
break;
case 14:
case COURSE_WARIO_STADIUM:
if ((var_s0 >= 1140) && (var_s0 <= 1152)) {
var_f20_2 = var_f28;
} else {
@ -4032,7 +4031,7 @@ s32 func_80011014(TrackWaypoint* pathDest, TrackWaypoint* path, s32 numPathPoint
}
}
break;
case 18:
case COURSE_DK_JUNGLE:
if ((var_s0 > 204) && (var_s0 < 220)) {
var_f20_2 = var_f28;
} else {
@ -4169,7 +4168,7 @@ s32 generate_2d_path(Path2D* pathDest, TrackWaypoint* pathSrc, s32 numWaypoints)
void copy_courses_kart_ai_behaviour(void) {
s32 i;
for (i = 0; i < NUM_COURSES - 1; i++) {
gCoursesKartAIBehaviour[i] = segmented_to_virtual_dupe_2(gKartAIBehaviourLUT[i]);
gCoursesKartAIBehaviour[i] = GET_COURSE_AIBehaviour;
}
}
@ -4354,7 +4353,7 @@ void generate_train_waypoints(void) {
temp = gVehicle2DWaypoint;
gVehicle2DWaypointLength = generate_2d_path(temp, waypoint, i - 1);
D_80162EB0 = spawn_actor_on_surface(temp[0].x, 2000.0f, temp[0].z);
D_80162EB0 = get_surface_height(temp[0].x, 2000.0f, temp[0].z);
}
void generate_ferry_waypoints(void) {
@ -4413,6 +4412,7 @@ void spawn_course_vehicles(void) {
f32 origXPos;
f32 origZPos;
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_KALAMARI_DESERT:
for (loopIndex = 0; loopIndex < NUM_TRAINS; loopIndex++) {
@ -4504,6 +4504,9 @@ void spawn_course_vehicles(void) {
}
break;
}
#else
#endif
}
void set_vehicle_pos_waypoint(TrainCarStuff* trainCar, Path2D* posXZ, u16 waypoint) {
@ -5645,7 +5648,7 @@ void func_80015544(s32 playerId, f32 arg1, s32 cameraId, s32 pathIndex) {
temp_f2 = (f32) D_80164550[pathIndex][gNearestWaypointByCameraId[cameraId]].posY;
temp_f12 = spawn_actor_on_surface(D_80162FA0[0], (f32) (temp_f2 + 30.0), D_80162FA0[2]);
temp_f12 = get_surface_height(D_80162FA0[0], (f32) (temp_f2 + 30.0), D_80162FA0[2]);
if ((temp_f12 < (temp_f2 - 20.0)) || (temp_f12 >= 3000.0)) {
D_80164618[cameraId] = (f32) (temp_f2 + 10.0);
} else {
@ -5801,7 +5804,7 @@ void func_80015C94(Camera* camera, UNUSED Player* unusedPlayer, UNUSED s32 arg2,
}
camera->pos[0] = midX;
camera->pos[2] = midZ;
temp_f2_2 = spawn_actor_on_surface(midX, (midY + 30.0), midZ);
temp_f2_2 = get_surface_height(midX, (midY + 30.0), midZ);
if ((temp_f2_2 < (midY - 20.0)) || (temp_f2_2 >= 3000.0)) {
camera->pos[1] = midY + 10.0;
} else {
@ -5929,7 +5932,7 @@ void func_80016494(Camera* camera, UNUSED Player* unusedPlayer, UNUSED s32 arg2,
}
camera->pos[0] = midX;
camera->pos[2] = midZ;
temp_f2_5 = spawn_actor_on_surface(midX, midY + 30.0, midZ);
temp_f2_5 = get_surface_height(midX, midY + 30.0, midZ);
if ((temp_f2_5 < (midY - 20.0)) || (temp_f2_5 >= 3000.0)) {
camera->pos[1] = midY + 10.0;
} else {
@ -5969,7 +5972,7 @@ void func_80016C3C(UNUSED s32 playerId, UNUSED f32 arg1, s32 cameraId) {
D_80164688[cameraId] = -0.1f;
}
D_80163DD8[cameraId] = 0;
if (gCurrentCourseId == 4) {
if (gCurrentCourseId == COURSE_YOSHI_VALLEY) {
D_80163DD8[cameraId] = random_int(4U);
D_80164688[cameraId] = 0.0f;
}
@ -6046,7 +6049,7 @@ void func_80017054(Camera* camera, UNUSED Player* player, UNUSED s32 index, s32
sp56 = gNearestWaypointByCameraId[cameraId];
gNearestWaypointByCameraId[cameraId] =
func_8000D33C(camera->pos[0], camera->pos[1], camera->pos[2], gNearestWaypointByCameraId[cameraId], pathIndex);
if (gCurrentCourseId == 4) {
if (gCurrentCourseId == COURSE_YOSHI_VALLEY) {
if ((sp56 != gNearestWaypointByCameraId[cameraId]) && (gNearestWaypointByCameraId[cameraId] == 1)) {
pathIndex = (D_80163DD8[cameraId] = random_int(4U));
gNearestWaypointByCameraId[cameraId] = func_8000D33C(camera->pos[0], camera->pos[1], camera->pos[2],
@ -6459,7 +6462,7 @@ void func_800188F4(Camera* camera, UNUSED Player* unusePlayer, UNUSED s32 arg2,
}
camera->pos[0] = midX;
camera->pos[2] = midZ;
temp_f2_4 = spawn_actor_on_surface(midX, midY + 30.0, midZ);
temp_f2_4 = get_surface_height(midX, midY + 30.0, midZ);
if ((temp_f2_4 < (midY - 20.0)) || (temp_f2_4 >= 3000.0)) {
camera->pos[1] = midY + 10.0;
} else {
@ -6495,7 +6498,7 @@ void func_80019118(s32 playerId, f32 arg1, s32 cameraId, UNUSED s16 pathIndex) {
D_80164638[cameraId] = D_80162FA0[2];
temp_f2 = (f32) D_80164550[0][gNearestWaypointByCameraId[cameraId]].posY;
temp_f12 = spawn_actor_on_surface(D_80162FA0[0], (f32) (temp_f2 + 30.0), D_80162FA0[2]);
temp_f12 = get_surface_height(D_80162FA0[0], (f32) (temp_f2 + 30.0), D_80162FA0[2]);
if ((temp_f12 < (temp_f2 - 20.0)) || (temp_f12 >= 3000.0)) {
D_80164618[cameraId] = (f32) (temp_f2 + 10.0);
@ -6722,7 +6725,7 @@ void func_80019D2C(Camera* camera, Player* player, s32 arg2) {
s32 nearestWaypoint;
playerId = camera->playerId;
if ((D_80163378 != 0) && (gCurrentCourseId == 8)) {
if ((D_80163378 != 0) && (gCurrentCourseId == COURSE_LUIGI_RACEWAY)) {
calculate_camera_up_vector(camera, arg2);
nearestWaypoint = gNearestWaypointByPlayerId[playerId];
if (((nearestWaypoint >= 0x65) && (nearestWaypoint < 0xFA)) ||
@ -7217,9 +7220,9 @@ void kart_ai_use_item_strategy(s32 playerId) {
banana->velocity[1] = 0.0f;
banana->velocity[2] = 0.0f;
if (D_801631E0[playerId] == ((u16) 1)) {
banana->pos[1] = spawn_actor_on_surface(player->pos[0], (f32) (((f64) player->pos[1]) + 30.0),
player->pos[2]) +
(banana->boundingBoxSize + 1.0f);
banana->pos[1] =
get_surface_height(player->pos[0], (f32) (((f64) player->pos[1]) + 30.0), player->pos[2]) +
(banana->boundingBoxSize + 1.0f);
}
}
player->soundEffects &= ~0x00040000;
@ -7280,7 +7283,7 @@ void kart_ai_use_item_strategy(s32 playerId) {
banana->velocity[1] = 0.0f;
banana->velocity[2] = 0.0f;
banana->pos[1] =
spawn_actor_on_surface(banana->pos[0], (f32) (((f64) banana->pos[1]) + 30.0), banana->pos[2]) +
get_surface_height(banana->pos[0], (f32) (((f64) banana->pos[1]) + 30.0), banana->pos[2]) +
(banana->boundingBoxSize + 1.0f);
}
player->soundEffects &= ~0x00040000;
@ -7497,9 +7500,9 @@ void kart_ai_use_item_strategy(s32 playerId) {
} else {
func_802A1064(fakeItemBox);
if (D_801631E0[playerId] == 1) {
fakeItemBox->pos[1] = spawn_actor_on_surface(fakeItemBox->pos[0], fakeItemBox->pos[1] + 30.0,
fakeItemBox->pos[2]) +
fakeItemBox->boundingBoxSize;
fakeItemBox->pos[1] =
get_surface_height(fakeItemBox->pos[0], fakeItemBox->pos[1] + 30.0, fakeItemBox->pos[2]) +
fakeItemBox->boundingBoxSize;
}
}
temp_s0->unk_00 = 0;
@ -7636,7 +7639,7 @@ void func_8001BE78(void) {
temp_s0 = &D_80164550[i][gNearestWaypointByPlayerId[i]];
temp_s1->pos[0] = (f32) temp_s0->posX;
temp_s1->pos[1] =
spawn_actor_on_surface((f32) temp_s0->posX, 2000.0f, (f32) temp_s0->posZ) + temp_s1->boundingBoxSize;
get_surface_height((f32) temp_s0->posX, 2000.0f, (f32) temp_s0->posZ) + temp_s1->boundingBoxSize;
temp_s1->pos[2] = (f32) temp_s0->posZ;
temp_s1->rotation[1] = (s16) *D_80164590[i];
func_8003680C(temp_s1, 0);

View File

@ -1,6 +1,8 @@
#include <ultra64.h>
#include <macros.h>
#include <mk64.h>
#include <course.h>
#include "math_util.h"
#include <common_structs.h>
#include "player_controller.h"
@ -231,6 +233,7 @@ void func_8003F46C(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4
player->kartHopVelocity = 0.0f;
return;
} else {
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
func_8003E048(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
@ -255,6 +258,9 @@ void func_8003F46C(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4
func_8003E048(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
break;
}
#else
#endif
if (player->effects & 0x10000) {
player->unk_DAC = 0.5f;
}

View File

@ -18,6 +18,4 @@ void func_8003F46C(Player*, Vec3f, Vec3f, Vec3f, f32*, f32*, f32*, f32*);
void func_8003F734(Player*, Vec3f, Vec3f, f32*, f32*, f32*, f32*);
void func_8003FBAC(Player*, Vec3f, Vec3f, f32*, f32*, f32*, f32*);
extern s16 gCurrentCourseId;
#endif

View File

@ -7,6 +7,7 @@
#include <macros.h>
#include <PR/gbi.h>
#include <mk64.h>
#include <course.h>
#include "camera.h"
#include "code_80057C60.h"
@ -291,7 +292,7 @@ u8 D_80183FA8[4][0x2000];
*/
s32 indexObjectList3[32];
//! Seemingly a pointer to Lakitu texture(s)
u8* D_8018C028;
u8* gLakituTexturePtr;
/**
* Unused list of object indices
*/
@ -348,8 +349,7 @@ s16 D_8018CF18;
Player* D_8018CF1C;
s16 D_8018CF20;
UNUSED s32 D_8018CF24;
Player* D_8018CF28[4];
UNUSED s32 D_8018CF38[4];
Player* D_8018CF28[8];
s16 D_8018CF48;
s16 D_8018CF50[8];
s16 D_8018CF60;
@ -692,7 +692,7 @@ void render_player_snow_effect_four(void) {
}
void render_object_for_player(s32 cameraId) {
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
break;
@ -777,6 +777,9 @@ void render_object_for_player(s32 cameraId) {
}
break;
}
#else
#endif
render_object_smoke_particles(cameraId);
render_object_leaf_particle(cameraId);
@ -1039,14 +1042,14 @@ void func_800591B4(void) {
if (D_80165800[0] != 0) {
func_8004EE54(0);
if (gModeSelection != BATTLE) {
func_8004F020(0);
render_mini_map_finish_line(0);
}
func_8004F3E4(0);
}
if ((gScreenModeSelection == SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL) && (D_80165800[1] != 0)) {
func_8004EE54(1);
if (gModeSelection != BATTLE) {
func_8004F020(1);
render_mini_map_finish_line(1);
}
func_8004F3E4(1);
}
@ -1316,16 +1319,16 @@ void func_80059D00(void) {
if (!gDemoMode) {
func_8007AA44(0);
}
func_80078C70(0);
course_update_clouds(0);
if (playerHUD[PLAYER_ONE].raceCompleteBool == 0) {
func_8005C360((gPlayerOneCopy->unk_094 / 18.0f) * 216.0f);
}
func_8005D0FC(PLAYER_ONE);
} else {
func_80059820(PLAYER_ONE);
func_80078C70(1);
course_update_clouds(1);
func_80059820(PLAYER_TWO);
func_80078C70(2);
course_update_clouds(2);
}
update_object();
break;
@ -1337,14 +1340,14 @@ void func_80059D00(void) {
if (!gDemoMode) {
func_8007AA44(0);
}
func_80078C70(1);
course_update_clouds(1);
func_8005D1F4(0);
func_80059820(PLAYER_TWO);
func_8005D0FC(PLAYER_TWO);
if (!gDemoMode) {
func_8007AA44(1);
}
func_80078C70(2);
course_update_clouds(2);
func_8005D1F4(1);
update_object();
break;
@ -1356,14 +1359,14 @@ void func_80059D00(void) {
if (!gDemoMode) {
func_8007AA44(0);
}
func_80078C70(3);
course_update_clouds(3);
func_8005D1F4(0);
func_80059820(PLAYER_TWO);
func_8005D0FC(PLAYER_TWO);
if (!gDemoMode) {
func_8007AA44(1);
}
func_80078C70(4);
course_update_clouds(4);
func_8005D1F4(1);
update_object();
break;
@ -1419,7 +1422,7 @@ void func_8005A070(void) {
func_80077640();
} else if (gGamestate == CREDITS_SEQUENCE) {
func_80059820(PLAYER_ONE);
func_80078C70(0);
course_update_clouds(0);
update_object();
} else {
func_80059D00();
@ -1567,6 +1570,7 @@ void func_8005A71C(void) {
}
void update_object(void) {
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
case COURSE_CHOCO_MOUNTAIN:
@ -1635,6 +1639,10 @@ void update_object(void) {
update_ferries_smoke_particle();
break;
}
#else
#endif
if (D_80165730 != 0) {
func_80074EE8();
}
@ -2589,7 +2597,8 @@ void func_8005CB60(s32 playerId, s32 lapCount) {
case 1: /* switch 1 */
func_80079084(playerId);
func_800C9060(playerId, SOUND_ARG_LOAD(0x19, 0x00, 0xF0, 0x15));
if ((gCurrentCourseId == 8) && (D_80165898 == 0) && (gModeSelection != (s32) 1)) {
if ((gCurrentCourseId == COURSE_LUIGI_RACEWAY) && (D_80165898 == 0) &&
(gModeSelection != (s32) 1)) {
D_80165898 = 1;
}
break;
@ -2610,7 +2619,7 @@ void func_8005CB60(s32 playerId, s32 lapCount) {
if (D_8018D114 == 2) {
D_80165800[playerId] = 0;
}
if (gCurrentCourseId == 4) {
if (gCurrentCourseId == COURSE_YOSHI_VALLEY) {
playerHUD[playerId].unk_81 = 1;
}
playerHUD[playerId].lap1CompletionTimeX = 0x0140;
@ -3390,44 +3399,44 @@ void func_8005F90C(Player* player, s16 arg1, s32 arg2, UNUSED s8 arg3, UNUSED s8
((player->unk_258[10 + arg2].unk_01E > 0) || (player->unk_258[10 + arg2].unk_01C == 0))) {
func_8005D794(player, &player->unk_258[10 + arg1], var_f0, var_f2, var_f12, surfaceType, var_t1);
func_8005D7D8(&player->unk_258[10 + arg1], 4, 0.46f);
if ((gCurrentCourseId == 1) || (gCurrentCourseId == 7)) {
if ((gCurrentCourseId == COURSE_CHOCO_MOUNTAIN) || (gCurrentCourseId == COURSE_ROYAL_RACEWAY)) {
func_8005DAD8(&player->unk_258[10 + arg1], 1, 0, 0x0080);
}
if (gCurrentCourseId == 0x000B) {
if (gCurrentCourseId == COURSE_KALAMARI_DESERT) {
func_8005DAD8(&player->unk_258[10 + arg1], 7, 0, 0x0080);
}
if (gCurrentCourseId == 9) {
if (gCurrentCourseId == COURSE_MOO_MOO_FARM) {
func_8005DAD8(&player->unk_258[10 + arg1], 8, 0, 0x0080);
}
if (gCurrentCourseId == 0x000E) {
if (gCurrentCourseId == COURSE_WARIO_STADIUM) {
func_8005DAD8(&player->unk_258[10 + arg1], 9, 0, 0x0080);
}
if (gCurrentCourseId == 4) {
if (gCurrentCourseId == COURSE_YOSHI_VALLEY) {
func_8005DAD8(&player->unk_258[10 + arg1], 0x000A, 0, 0x0080);
}
if (gCurrentCourseId == 0x0012) {
if (gCurrentCourseId == COURSE_DK_JUNGLE) {
func_8005DAD8(&player->unk_258[10 + arg1], 0x000B, 0, 0x0080);
}
player->unk_258[10 + arg1].unk_03A = random_int(0x0010U);
} else if (player->unk_258[10 + arg2].unk_01E > 0) {
func_8005D794(player, &player->unk_258[10 + arg1], var_f0, var_f2, var_f12, surfaceType, var_t1);
func_8005D7D8(&player->unk_258[10 + arg1], 4, 0.46f);
if ((gCurrentCourseId == 1) || (gCurrentCourseId == 7)) {
if ((gCurrentCourseId == COURSE_CHOCO_MOUNTAIN) || (gCurrentCourseId == COURSE_ROYAL_RACEWAY)) {
func_8005DAD8(&player->unk_258[10 + arg1], 1, 0, 0x0080);
}
if (gCurrentCourseId == 0x000B) {
if (gCurrentCourseId == COURSE_KALAMARI_DESERT) {
func_8005DAD8(&player->unk_258[10 + arg1], 7, 0, 0x0080);
}
if (gCurrentCourseId == 9) {
if (gCurrentCourseId == COURSE_MOO_MOO_FARM) {
func_8005DAD8(&player->unk_258[10 + arg1], 8, 0, 0x0080);
}
if (gCurrentCourseId == 0x000E) {
if (gCurrentCourseId == COURSE_WARIO_STADIUM) {
func_8005DAD8(&player->unk_258[10 + arg1], 9, 0, 0x0080);
}
if (gCurrentCourseId == 4) {
if (gCurrentCourseId == COURSE_YOSHI_VALLEY) {
func_8005DAD8(&player->unk_258[10 + arg1], 0x000A, 0, 0x0080);
}
if (gCurrentCourseId == 0x0012) {
if (gCurrentCourseId == COURSE_DK_JUNGLE) {
func_8005DAD8(&player->unk_258[10 + arg1], 0x000B, 0, 0x0080);
}
player->unk_258[10 + arg1].unk_03A = random_int(0x0010U);

View File

@ -413,7 +413,7 @@ extern Vec3su D_80183E98;
extern u8 D_80183FA8[4][0x2000];
// extern s32 indexObjectList3[]; -> objects.h
extern u8* D_8018C028;
extern u8* gLakituTexturePtr;
// extern s32 indexObjectList4[]; -> objects.h
// extern Collision D_8018C0B0[]; -> objects.h
// extern s32 gObjectParticle1[]; -> objects.h
@ -544,18 +544,18 @@ extern s32 D_8018D22C;
extern s32 D_8018D240;
extern u8* D_8018D248[];
extern f32 D_8018D2A0;
extern f32 gMiniMapMarkerScale;
extern s32 D_8018D2A4;
extern s32 D_8018D2AC;
extern s16 D_8018D2B0;
extern s32 D_8018D2B4;
extern s16 D_8018D2B8;
extern s32 D_8018D2BC;
extern s16 D_8018D2C0[];
extern s16 gMiniMapFinishLineX[];
extern s32 D_8018D2C8[];
extern s16 D_8018D2D8[];
extern s16 D_8018D2E0;
extern s16 D_8018D2E8;
extern s16 gMiniMapFinishLineY[];
extern s16 gMiniMapX;
extern s16 gMiniMapY;
extern s16 D_8018D2F0;
extern s16 D_8018D2F8;
extern u16 D_8018D300;

View File

@ -68,7 +68,7 @@ s8 D_8018D1B8[NUM_GROUP3_MOLES];
s32 D_8018D1C4;
/**
* These seem to be limits on different object types in Moo Moo Farm
* See init_course_object in code_8006E9C0.c
* See init_course_objects in code_8006E9C0.c
* Maybe max number of active moles in a given group of moles?
*/
s32 D_8018D1C8;
@ -108,7 +108,7 @@ s8 D_8018D230;
UNUSED s32 D_8018D238[2];
s32 D_8018D240;
u8* D_8018D248[22];
f32 D_8018D2A0;
f32 gMiniMapMarkerScale;
s32 D_8018D2A4;
UNUSED s32 D_8018D2A8;
s32 D_8018D2AC;
@ -116,12 +116,12 @@ s16 D_8018D2B0;
s32 D_8018D2B4;
s16 D_8018D2B8;
s32 D_8018D2BC;
s16 D_8018D2C0[4];
s16 gMiniMapFinishLineX[4];
s32 D_8018D2C8[4];
s16 D_8018D2D8[4];
s16 D_8018D2E0;
s16 gMiniMapFinishLineY[4];
s16 gMiniMapX;
UNUSED s32 D_8018D2E4;
s16 D_8018D2E8;
s16 gMiniMapY;
UNUSED s32 D_8018D2EC;
s16 D_8018D2F0;
UNUSED s32 D_8018D2F4;

View File

@ -168,14 +168,14 @@ void func_8006EF60(void) {
// clang-format on
}
void func_8006F008(void) {
void course_mini_map_settings(void) {
D_801655C8 = 0;
xOrientation = 1.0f;
if (gIsMirrorMode != 0) {
xOrientation = -1.0f;
}
D_8018D2C0[0] = 257;
D_8018D2D8[0] = 170;
gMiniMapFinishLineX[0] = 257;
gMiniMapFinishLineY[0] = 170;
D_8018D300 = 255;
D_8018D308 = 255;
D_8018D310 = 255;
@ -183,172 +183,176 @@ void func_8006F008(void) {
if (gCurrentCourseId < NUM_COURSES - 1) {
func_8006EEE8((s32) gCurrentCourseId);
}
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
D_8018D220 = (void*) dma_textures(gTextureExhaust5, 0x443, 0x1000);
D_8018D2A0 = 0.022f;
D_8018D2E0 = 6;
D_8018D2E8 = 28;
D_8018D2C0[0] = 260;
D_8018D2D8[0] = 170;
gMiniMapMarkerScale = 0.022f;
gMiniMapX = 6;
gMiniMapY = 28;
gMiniMapFinishLineX[0] = 260;
gMiniMapFinishLineY[0] = 170;
D_80165718 = 0;
D_80165720 = 5;
D_80165728 = -240;
break;
case COURSE_CHOCO_MOUNTAIN:
D_8018D2A0 = 0.022f;
D_8018D2C0[0] = 265;
D_8018D2E0 = 19;
D_8018D2E8 = 37;
gMiniMapMarkerScale = 0.022f;
gMiniMapFinishLineX[0] = 265;
gMiniMapX = 19;
gMiniMapY = 37;
break;
case COURSE_BOWSER_CASTLE:
D_8018D2C0[0] = 265;
D_8018D2A0 = 0.0174f;
D_8018D2E0 = 12;
D_8018D2E8 = 48;
gMiniMapFinishLineX[0] = 265;
gMiniMapMarkerScale = 0.0174f;
gMiniMapX = 12;
gMiniMapY = 48;
break;
case COURSE_BANSHEE_BOARDWALK:
D_80165880 = (void*) dma_textures(gTextureGhosts, 0x4CC2, 0xD980);
D_8018D2A0 = 0.016f;
D_8018D2C0[0] = 0x0106;
D_8018D2E0 = 55;
D_8018D2E8 = 39;
gMiniMapMarkerScale = 0.016f;
gMiniMapFinishLineX[0] = 0x0106;
gMiniMapX = 55;
gMiniMapY = 39;
break;
case COURSE_YOSHI_VALLEY:
D_8018D220 = (void*) dma_textures(gTextureExhaust0, 0x479, 0xC00);
D_8018D2A0 = 0.018f;
D_8018D2E0 = 61;
D_8018D2E8 = 38;
gMiniMapMarkerScale = 0.018f;
gMiniMapX = 61;
gMiniMapY = 38;
break;
case COURSE_FRAPPE_SNOWLAND:
D_8018D2C0[0] = 262;
D_8018D2A0 = 0.016f;
D_8018D2E0 = 36;
D_8018D2E8 = 40;
gMiniMapFinishLineX[0] = 262;
gMiniMapMarkerScale = 0.016f;
gMiniMapX = 36;
gMiniMapY = 40;
D_8018D300 = 72;
D_8018D308 = 100;
D_8018D310 = 255;
break;
case COURSE_KOOPA_BEACH:
D_8018D220 = (void*) dma_textures(gTextureExhaust3, 0x3C8U, 0x1000);
D_8018D2A0 = 0.014f;
D_8018D2C0[0] = 268;
D_8018D2E0 = 40;
D_8018D2E8 = 21;
gMiniMapMarkerScale = 0.014f;
gMiniMapFinishLineX[0] = 268;
gMiniMapX = 40;
gMiniMapY = 21;
break;
case COURSE_ROYAL_RACEWAY:
D_8018D220 = (void*) dma_textures(gTextureExhaust4, 0x3F8, 0x1000);
D_8018D2C0[0] = 262;
D_8018D2A0 = 0.014f;
D_8018D2E0 = 37;
D_8018D2E8 = 50;
gMiniMapFinishLineX[0] = 262;
gMiniMapMarkerScale = 0.014f;
gMiniMapX = 37;
gMiniMapY = 50;
D_80165718 = -64;
D_80165720 = 5;
D_80165728 = -330;
break;
case COURSE_LUIGI_RACEWAY:
D_8018D220 = (void*) dma_textures(gTextureExhaust2, 0x4F4U, 0xC00);
D_8018D2A0 = 0.0155f;
D_8018D2C0[0] = 271;
D_8018D2E0 = 45;
D_8018D2E8 = 60;
gMiniMapMarkerScale = 0.0155f;
gMiniMapFinishLineX[0] = 271;
gMiniMapX = 45;
gMiniMapY = 60;
D_80165718 = -140;
D_80165720 = -44;
D_80165728 = -215;
break;
case COURSE_MOO_MOO_FARM:
D_8018D220 = (void*) dma_textures(gTextureExhaust0, 0x479, 0xC00);
D_8018D2A0 = 0.0155f;
D_8018D2C0[0] = 271;
D_8018D2E0 = 18;
D_8018D2E8 = 36;
gMiniMapMarkerScale = 0.0155f;
gMiniMapFinishLineX[0] = 271;
gMiniMapX = 18;
gMiniMapY = 36;
break;
case COURSE_TOADS_TURNPIKE:
D_8018D2A0 = 0.013f;
D_8018D2C0[0] = 252;
D_8018D2E0 = 57;
D_8018D2E8 = 44;
gMiniMapMarkerScale = 0.013f;
gMiniMapFinishLineX[0] = 252;
gMiniMapX = 57;
gMiniMapY = 44;
break;
case COURSE_KALAMARI_DESERT:
D_8018D2C0[0] = 263;
D_8018D2D8[0] = 165;
gMiniMapFinishLineX[0] = 263;
gMiniMapFinishLineY[0] = 165;
D_8018D220 = (void*) dma_textures(gTextureExhaust5, 0x443, 0x1000);
D_8018D2A0 = 0.015f;
D_8018D2E0 = 55;
D_8018D2E8 = 27;
gMiniMapMarkerScale = 0.015f;
gMiniMapX = 55;
gMiniMapY = 27;
break;
case COURSE_SHERBET_LAND:
D_8018D220 = (void*) dma_textures(gTextureExhaust1, 0x485, 0xC00);
D_8018D2A0 = 0.015f;
D_8018D2C0[0] = 262;
D_8018D2E0 = 52;
D_8018D2E8 = 33;
gMiniMapMarkerScale = 0.015f;
gMiniMapFinishLineX[0] = 262;
gMiniMapX = 52;
gMiniMapY = 33;
D_8018D300 = 72;
D_8018D308 = 100;
D_8018D310 = 255;
break;
case COURSE_RAINBOW_ROAD:
D_8018D2A0 = 0.0103f;
D_8018D2C0[0] = 261;
D_8018D2D8[0] = 166;
D_8018D2E0 = 39;
D_8018D2E8 = 55;
gMiniMapMarkerScale = 0.0103f;
gMiniMapFinishLineX[0] = 261;
gMiniMapFinishLineY[0] = 166;
gMiniMapX = 39;
gMiniMapY = 55;
break;
case COURSE_WARIO_STADIUM:
D_8018D2A0 = 0.0155f;
D_8018D2C0[0] = 0x0106;
D_8018D2E0 = 53;
D_8018D2E8 = 35;
gMiniMapMarkerScale = 0.0155f;
gMiniMapFinishLineX[0] = 0x0106;
gMiniMapX = 53;
gMiniMapY = 35;
break;
case COURSE_BLOCK_FORT:
D_8018D2A0 = 0.0335f;
D_8018D2E0 = 32;
D_8018D2E8 = 32;
gMiniMapMarkerScale = 0.0335f;
gMiniMapX = 32;
gMiniMapY = 32;
break;
case COURSE_SKYSCRAPER:
D_8018D2A0 = 0.0445f;
D_8018D2E0 = 32;
D_8018D2E8 = 32;
gMiniMapMarkerScale = 0.0445f;
gMiniMapX = 32;
gMiniMapY = 32;
break;
case COURSE_DOUBLE_DECK:
D_8018D2A0 = 0.0285f;
D_8018D2E0 = 32;
D_8018D2E8 = 32;
gMiniMapMarkerScale = 0.0285f;
gMiniMapX = 32;
gMiniMapY = 32;
break;
case COURSE_DK_JUNGLE:
D_8018D2A0 = 0.0155f;
D_8018D2C0[0] = 255;
D_8018D2E0 = 29;
D_8018D2E8 = 47;
gMiniMapMarkerScale = 0.0155f;
gMiniMapFinishLineX[0] = 255;
gMiniMapX = 29;
gMiniMapY = 47;
break;
case COURSE_BIG_DONUT:
D_8018D2A0 = 0.0257f;
D_8018D2E0 = 32;
D_8018D2E8 = 31;
gMiniMapMarkerScale = 0.0257f;
gMiniMapX = 32;
gMiniMapY = 31;
}
#else
#endif
if (gIsMirrorMode != 0) {
D_8018D2E0 = D_8018D2B0 - D_8018D2E0;
gMiniMapX = D_8018D2B0 - gMiniMapX;
}
if (gPlayerCount == 4) {
D_8018D2C0[0] = 160;
D_8018D2D8[0] = 120;
gMiniMapFinishLineX[0] = 160;
gMiniMapFinishLineY[0] = 120;
return;
}
if (gPlayerCount == 3) {
D_8018D2C0[0] = 235;
D_8018D2D8[0] = 175;
gMiniMapFinishLineX[0] = 235;
gMiniMapFinishLineY[0] = 175;
return;
}
if (gPlayerCount == 2) {
if (gCurrentCourseId != 10) {
D_8018D2C0[1] = 265;
D_8018D2C0[0] = D_8018D2C0[1];
if (gCurrentCourseId != COURSE_TOADS_TURNPIKE) {
gMiniMapFinishLineX[1] = 265;
gMiniMapFinishLineX[0] = gMiniMapFinishLineX[1];
} else {
D_8018D2C0[1] = 255;
D_8018D2C0[0] = D_8018D2C0[1];
gMiniMapFinishLineX[1] = 255;
gMiniMapFinishLineX[0] = gMiniMapFinishLineX[1];
}
D_8018D2D8[0] = 65;
D_8018D2D8[1] = 180;
gMiniMapFinishLineY[0] = 65;
gMiniMapFinishLineY[1] = 180;
}
}
@ -392,8 +396,8 @@ void func_8006F8CC(void) {
D_801657F0 = 1;
D_80165800[0] = D_80165800[1] = 0;
}
D_8018D2D8[0] = 0x0041;
D_8018D2D8[1] = 0x00B4;
gMiniMapFinishLineY[0] = 0x0041;
gMiniMapFinishLineY[1] = 0x00B4;
}
func_8006F824(0);
} else {
@ -419,7 +423,7 @@ void func_8006FA94(void) {
Player* player;
func_8006F8CC();
func_8006F008();
course_mini_map_settings();
osSetTime(0);
D_8018D170 = 0;
D_8018D190 = 0;
@ -683,10 +687,11 @@ void init_stars(StarData* starList) {
D_8018D230 = 1;
}
void func_8007055C(void) {
void course_init_cloud(void) {
s32 var_s0;
s32 var_s4;
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
// Uses Kalimari Desert's clouds for initialization?
@ -735,6 +740,9 @@ void func_8007055C(void) {
init_stars(gWarioStadiumStars);
break;
}
#else
#endif
func_8008C23C();
}
@ -751,10 +759,11 @@ void func_80070714(void) {
D_80165748 = 0xA;
}
void init_course_object(void) {
void init_course_objects(void) {
s32 objectId;
s32 i;
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
if (gGamestate != 9) {
@ -1007,6 +1016,9 @@ void init_course_object(void) {
default:
break;
}
#else
#endif
}
void init_hud_one_player(void) {
@ -1025,9 +1037,9 @@ void init_hud_one_player(void) {
find_unused_obj_index(&gItemWindowObjectByPlayerId[0]);
find_unused_obj_index(&gItemWindowObjectByPlayerId[1]);
init_object_list_index();
func_8007055C();
func_8007055C();
init_course_object();
course_init_cloud();
course_init_cloud();
init_course_objects();
playerHUD[PLAYER_ONE].speedometerX = 0x0156;
playerHUD[PLAYER_ONE].speedometerY = 0x0106;
D_8018CFEC = playerHUD[PLAYER_ONE].speedometerX + 0x18;
@ -1106,9 +1118,9 @@ void init_hud_two_player_vertical(void) {
find_unused_obj_index(&gItemWindowObjectByPlayerId[1]);
init_object_list_index();
func_8007055C();
func_8007055C();
init_course_object();
course_init_cloud();
course_init_cloud();
init_course_objects();
playerHUD[PLAYER_ONE].itemBoxX = -0x52;
playerHUD[PLAYER_ONE].itemBoxY = 0x32;
@ -1174,9 +1186,9 @@ void init_hud_two_player_horizontal() {
find_unused_obj_index(&gItemWindowObjectByPlayerId[1]);
init_object_list_index();
func_8007055C();
func_8007055C();
init_course_object();
course_init_cloud();
course_init_cloud();
init_course_objects();
playerHUD[PLAYER_ONE].itemBoxY = 0x22;
playerHUD[PLAYER_ONE].itemBoxX = -0x53;
@ -1252,7 +1264,7 @@ void init_hud_three_four_player(void) {
find_unused_obj_index(&gItemWindowObjectByPlayerId[3]);
init_object_list_index();
init_course_object();
init_course_objects();
playerHUD[PLAYER_ONE].itemBoxX = -0x36;
playerHUD[PLAYER_ONE].itemBoxY = 0x36;

View File

@ -13,7 +13,7 @@ void func_8006EE44(void);
void init_item_window(s32);
void func_8006EEE8(s32);
void func_8006EF60(void);
void func_8006F008(void);
void course_mini_map_settings(void);
void func_8006F824(s32);
void func_8006F8CC(void);
void func_8006FA94(void);
@ -23,9 +23,9 @@ void init_cloud_object(s32, s32, CloudData*);
void init_clouds(CloudData*);
void init_star_object(s32, s32, StarData*);
void init_stars(StarData*);
void func_8007055C(void);
void course_init_cloud(void);
void func_80070714(void);
void init_course_object(void);
void init_course_objects(void);
void init_hud_one_player(void);
void init_hud_two_player_vertical(void);
void init_hud_three_four_player(void);

View File

@ -2,6 +2,7 @@
#include <macros.h>
#include <common_structs.h>
#include <mk64.h>
#include <course.h>
#include "code_80086E70.h"
#include "camera.h"

View File

@ -166,6 +166,4 @@ void func_8008BFFC(s32);
void func_8008C1B8(s32);
void func_8008C1C0(s32);
extern s16 gCurrentCourseId;
#endif

View File

@ -1,10 +1,12 @@
#include <ultra64.h>
#include <PR/ultratypes.h>
#include <macros.h>
#include <mk64.h>
#include <defines.h>
#include <segments.h>
#include <PR/ultratypes.h>
#include <sounds.h>
#include <mk64.h>
#include <course.h>
#include "code_800029B0.h"
#include "code_80091750.h"
#include "code_80005FD0.h"
@ -313,6 +315,7 @@ char* gCupNames[] = {
"special cup",
};
#if !ENABLE_CUSTOM_COURSE_ENGINE
// Displays at beginning of course
char* gCourseNames[] = {
#include "assets/course_metadata/gCourseNames.inc.c"
@ -321,15 +324,22 @@ char* gCourseNames[] = {
char* gCourseNamesDup[] = {
#include "assets/course_metadata/gCourseNames.inc.c"
};
#else
#endif
char* gCourseNamesDup2[] = {
#include "assets/course_metadata/gCourseNames.inc.c"
};
#if !ENABLE_CUSTOM_COURSE_ENGINE
// Used in debug menu at splash screen
char* gDebugCourseNames[] = {
#include "assets/course_metadata/gCourseDebugNames.inc.c"
};
#else
#endif
const s8 gPerCupIndexByCourseId[] = {
#include "assets/course_metadata/gPerCupIndexByCourseId.inc.c"
@ -2446,7 +2456,7 @@ void func_80095574(void) {
} else {
var_v0 = 8;
}
debug_print_str2(var_v0 + 0xB9, 0x0000006E, gDebugCourseNames[gCurrentCourseId]);
debug_print_str2(var_v0 + 0xB9, 0x0000006E, GET_COURSE_debugName);
debug_print_str2(0x00000050, 0x00000078, "screen_mode");
debug_print_str2(0x000000AA, 0x00000078, gDebugScreenModeNames[gScreenModeListIndex]);
debug_print_str2(0x00000050, 0x00000082, "player");
@ -4761,7 +4771,7 @@ void func_8009CE64(s32 arg0) {
} else {
D_8018E7AC[arg0] = 0;
if (gDebugMenuSelection != DEBUG_MENU_OPTION_SELECTED) {
switch (gMenuFadeType) { /* switch 3 */
switch (gMenuFadeType) { /* switch 3 */
case MENU_FADE_TYPE_MAIN: /* switch 3 */
if (gMenuSelection == LOGO_INTRO_MENU) {
gMenuSelection = START_MENU;
@ -4780,7 +4790,7 @@ void func_8009CE64(s32 arg0) {
gCCSelection = (s32) 1;
switch (gNextDemoId) { /* switch 4 */
case 0: /* switch 4 */
gCurrentCourseId = 0;
gCurrentCourseId = COURSE_MARIO_RACEWAY;
gScreenModeSelection = 0;
gPlayerCountSelection1 = 1;
gPlayerCount = 1;
@ -4788,7 +4798,7 @@ void func_8009CE64(s32 arg0) {
gModeSelection = 0;
break;
case 1: /* switch 4 */
gCurrentCourseId = (s16) 1;
gCurrentCourseId = COURSE_CHOCO_MOUNTAIN;
gScreenModeSelection = (s32) 1;
gPlayerCountSelection1 = 2;
gPlayerCount = (s8) 2;
@ -4797,7 +4807,7 @@ void func_8009CE64(s32 arg0) {
gModeSelection = 2;
break;
case 2: /* switch 4 */
gCurrentCourseId = 0x000B;
gCurrentCourseId = COURSE_KALAMARI_DESERT;
gScreenModeSelection = 0;
gPlayerCountSelection1 = (s32) 1;
gPlayerCount = 1;
@ -4805,7 +4815,7 @@ void func_8009CE64(s32 arg0) {
gModeSelection = 0;
break;
case 3: /* switch 4 */
gCurrentCourseId = 0x000E;
gCurrentCourseId = COURSE_WARIO_STADIUM;
gScreenModeSelection = 3;
gPlayerCountSelection1 = 3;
gPlayerCount = (s8) 3;
@ -4815,7 +4825,7 @@ void func_8009CE64(s32 arg0) {
gModeSelection = (s32) 2;
break;
case 4: /* switch 4 */
gCurrentCourseId = 2;
gCurrentCourseId = COURSE_BOWSER_CASTLE;
gScreenModeSelection = 0;
gPlayerCountSelection1 = (s32) 1;
gPlayerCount = 1;
@ -4823,7 +4833,7 @@ void func_8009CE64(s32 arg0) {
gModeSelection = 0;
break;
case 5: /* switch 4 */
gCurrentCourseId = 0x000C;
gCurrentCourseId = COURSE_SHERBET_LAND;
gScreenModeSelection = 3;
gPlayerCountSelection1 = 4;
gPlayerCount = 4;
@ -4877,12 +4887,12 @@ void func_8009CE64(s32 arg0) {
}
unref_8018EE0C = 0;
} else {
switch (gDebugGotoScene) { /* switch 5; irregular */
switch (gDebugGotoScene) { /* switch 5; irregular */
case DEBUG_GOTO_ENDING: /* switch 5 */
gGamestateNext = (s32) 5;
break;
case DEBUG_GOTO_CREDITS_SEQUENCE_DEFAULT: /* switch 5 */
case DEBUG_GOTO_CREDITS_SEQUENCE_EXTRA: /* switch 5 */
case DEBUG_GOTO_CREDITS_SEQUENCE_EXTRA: /* switch 5 */
gGamestateNext = 9;
gCreditsCourseId = 8;
break;
@ -4925,7 +4935,7 @@ void func_8009CE64(s32 arg0) {
gCupSelection = gCupSelectionByCourseId[gCurrentCourseId];
D_800DC540 = gCupSelection;
gCourseIndexInCup = gPerCupIndexByCourseId[gCurrentCourseId];
switch (gDebugGotoScene) { /* switch 6; irregular */
switch (gDebugGotoScene) { /* switch 6; irregular */
case DEBUG_GOTO_ENDING: /* switch 6 */
break;
case DEBUG_GOTO_CREDITS_SEQUENCE_DEFAULT: /* switch 6 */
@ -6120,7 +6130,7 @@ void func_8009F5E0(struct_8018D9E0_entry* arg0) {
break;
case 0x97: /* switch 6 */
set_text_color(5);
func_80093324(arg0->column, arg0->row, gCourseNames[gCurrentCourseId], arg0->unk1C, arg0->unk24, 1.0f);
func_80093324(arg0->column, arg0->row, GET_COURSE_Name, arg0->unk1C, arg0->unk24, 1.0f);
break;
case 0x98: /* switch 6 */
func_800A2D1C(arg0);
@ -6328,7 +6338,8 @@ void func_800A09E0(struct_8018D9E0_entry* arg0) {
s32 table_row, x = 0x20, y;
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH - 1, 194);
for (table_row = 0; table_row < 9; table_row++) {
if ((gControllerPakScrollDirection != CONTROLLER_PAK_SCROLL_DIR_NONE) || ((table_row != 0) && (table_row != 8))) {
if ((gControllerPakScrollDirection != CONTROLLER_PAK_SCROLL_DIR_NONE) ||
((table_row != 0) && (table_row != 8))) {
y = (table_row * 0xA) + arg0->row;
gDisplayListHead = func_8009BA74(gDisplayListHead, D_0200157C, x, y);
}
@ -6764,7 +6775,7 @@ void func_800A1FB0(struct_8018D9E0_entry* arg0) {
struct_8018EE10_entry* var_v1;
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x00000140, 0x000000F0, 0, 0, 0, 0x00000064);
switch (gSubMenuSelection) { /* switch 1 */
switch (gSubMenuSelection) { /* switch 1 */
case SUB_MENU_OPTION_RETURN_GAME_SELECT: /* switch 1 */
case SUB_MENU_OPTION_SOUND_MODE: /* switch 1 */
case SUB_MENU_OPTION_COPY_CONTROLLER_PAK: /* switch 1 */
@ -6780,7 +6791,7 @@ void func_800A1FB0(struct_8018D9E0_entry* arg0) {
set_text_color(1);
draw_text(0x000000E6, 0x55 + 0x23, gSoundModeNames[gSoundMode], 0, 1.0f, 1.0f);
break;
case SUB_MENU_ERASE_QUIT: /* switch 1 */
case SUB_MENU_ERASE_QUIT: /* switch 1 */
case SUB_MENU_ERASE_ERASE: /* switch 1 */
set_text_color(3);
for (stackPadding0 = 0; stackPadding0 < ARRAY_COUNT(D_800E7878); stackPadding0++) {
@ -6802,9 +6813,9 @@ void func_800A1FB0(struct_8018D9E0_entry* arg0) {
}
break;
case SUB_MENU_COPY_PAK_ERROR_NO_GHOST_DATA: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_NO_GAME_DATA: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_NO_PAK_2P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_BAD_READ_2P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_NO_GAME_DATA: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_NO_PAK_2P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_BAD_READ_2P: /* switch 1 */
set_text_color(2);
var_s1 = gSubMenuSelection - SUB_MENU_COPY_PAK_ERROR_2P_MIN;
for (stackPadding0 = 0; stackPadding0 < ARRAY_COUNT(D_800E78D0) / 4; stackPadding0++) { // 12 / 4 = 3
@ -6812,10 +6823,10 @@ void func_800A1FB0(struct_8018D9E0_entry* arg0) {
0.9f, 0.9f);
}
break;
case SUB_MENU_COPY_PAK_ERROR_NO_PAK_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_BAD_READ_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_NO_PAK_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_BAD_READ_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_CANT_CREATE_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_NO_PAGES_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_NO_PAGES_1P: /* switch 1 */
set_text_color(2);
var_s1 = gSubMenuSelection - SUB_MENU_COPY_PAK_ERROR_1P_MIN;
for (stackPadding0 = 0; stackPadding0 < ARRAY_COUNT(D_800E7890) / 4; stackPadding0++) { // 16 / 4 = 4
@ -6841,8 +6852,8 @@ void func_800A1FB0(struct_8018D9E0_entry* arg0) {
break;
case SUB_MENU_COPY_PAK_FROM_GHOST1_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_FROM_GHOST2_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_TO_GHOST1_2P: /* switch 1 */
case SUB_MENU_COPY_PAK_TO_GHOST2_2P: /* switch 1 */
case SUB_MENU_COPY_PAK_TO_GHOST1_2P: /* switch 1 */
case SUB_MENU_COPY_PAK_TO_GHOST2_2P: /* switch 1 */
switch (gSubMenuSelection) {
case SUB_MENU_COPY_PAK_FROM_GHOST1_1P:
case SUB_MENU_COPY_PAK_FROM_GHOST2_1P:
@ -6941,8 +6952,8 @@ void func_800A1FB0(struct_8018D9E0_entry* arg0) {
func_80093324(0x6E + (0x32 * var_s2), 0x000000D2, D_800E7930[var_s2], 0, 0.75f, 0.75f);
}
break;
case SUB_MENU_COPY_PAK_START: /* switch 1 */
case SUB_MENU_COPY_PAK_COPYING: /* switch 1 */
case SUB_MENU_COPY_PAK_START: /* switch 1 */
case SUB_MENU_COPY_PAK_COPYING: /* switch 1 */
case SUB_MENU_COPY_PAK_COMPLETED: /* switch 1 */
var_s5 = (gSubMenuSelection - SUB_MENU_COPY_PAK_ACTION_MIN) / 2;
set_text_color(2);
@ -6985,13 +6996,13 @@ void func_800A1FB0(struct_8018D9E0_entry* arg0) {
}
break;
}
switch (gSubMenuSelection) { /* switch 2 */
case SUB_MENU_COPY_PAK_FROM_GHOST1_1P: /* switch 2 */
case SUB_MENU_COPY_PAK_FROM_GHOST2_1P: /* switch 2 */
case SUB_MENU_COPY_PAK_TO_GHOST1_2P: /* switch 2 */
case SUB_MENU_COPY_PAK_TO_GHOST2_2P: /* switch 2 */
case SUB_MENU_COPY_PAK_PROMPT_QUIT: /* switch 2 */
case SUB_MENU_COPY_PAK_PROMPT_COPY: /* switch 2 */
switch (gSubMenuSelection) { /* switch 2 */
case SUB_MENU_COPY_PAK_FROM_GHOST1_1P: /* switch 2 */
case SUB_MENU_COPY_PAK_FROM_GHOST2_1P: /* switch 2 */
case SUB_MENU_COPY_PAK_TO_GHOST1_2P: /* switch 2 */
case SUB_MENU_COPY_PAK_TO_GHOST2_2P: /* switch 2 */
case SUB_MENU_COPY_PAK_PROMPT_QUIT: /* switch 2 */
case SUB_MENU_COPY_PAK_PROMPT_COPY: /* switch 2 */
spE0.column -= 5;
spE0.row -= 6;
break;
@ -7078,7 +7089,8 @@ void func_800A2EB8(struct_8018D9E0_entry* arg0) {
draw_text((-(s32) (((f32) (get_string_width(D_800E76CC[gCCSelection]) + 8) * 0.6f) / 2) - arg0->column) + 0xF5,
arg0->row + 0xE1, gCupNames[D_800DC540], 0, 0.6f, 0.6f);
draw_text((temp_s0 - arg0->column) + 0xF5, arg0->row + 0xE1,
D_800E76CC[gGameModeSubMenuColumn[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]], 0, 0.6f, 0.6f);
D_800E76CC[gGameModeSubMenuColumn[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]], 0, 0.6f,
0.6f);
}
void func_800A32B4(s32 arg0, s32 arg1, s32 characterId, s32 rank) {
@ -7194,7 +7206,8 @@ void func_800A34A8(struct_8018D9E0_entry* arg0) {
draw_text((-(s32) (((get_string_width(D_800E76CC[gCCSelection]) + 8) * 0.6f) / 2) - arg0->column) + 0xE6,
arg0->row + 0xE1, gCupNames[D_800DC540], 0, 0.6f, 0.6f);
draw_text((temp_s0_3 - arg0->column) + 0xE6, arg0->row + 0xE1,
D_800E76CC[gGameModeSubMenuColumn[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]], 0, 0.6f, 0.6f);
D_800E76CC[gGameModeSubMenuColumn[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]], 0, 0.6f,
0.6f);
}
}
@ -7265,8 +7278,7 @@ void func_800A3C84(struct_8018D9E0_entry* arg0) {
s32 rowOffset;
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1);
draw_text(arg0->column + 0x43, arg0->row + 0x19, gCourseNamesDup[gCupCourseOrder[gCupSelection][gCourseIndexInCup]],
0, 0.6f, 0.6f);
draw_text(arg0->column + 0x43, arg0->row + 0x19, GET_COURSE_NameDup, 0, 0.6f, 0.6f);
set_text_color(TEXT_YELLOW);
draw_text(arg0->column + 0x46, arg0->row + 0x28, D_800E7730, 0, 0.75f, 0.75f);
for (recordType = 0, rowOffset = 0; recordType < TIME_TRIAL_3LAP_RECORD_5; recordType += 1, rowOffset += 0xF) {
@ -7942,7 +7954,7 @@ void func_800A6034(struct_8018D9E0_entry* arg0) {
text = gCupNames[D_800DC540];
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
func_80093754(arg0->column + 0x41, arg0->row + 0xA0, text, 0, 0.85f, 1.0f);
text = gCourseNames[gCurrentCourseId];
text = GET_COURSE_Name;
set_text_color((s32) gCurrentCourseId % 4);
func_80093754(arg0->column + 0x41, arg0->row + 0xC3, text, 0, 0.65f, 0.85f);
}
@ -8479,19 +8491,19 @@ void func_800A7A4C(s32 arg0) {
case 0xA: /* switch 8 */
func_800AA280(var_s1);
break;
case 0x10: /* switch 8 */
case 0x11: /* switch 8 */
switch (gMainMenuSelection) { /* switch 5 */
case 0x10: /* switch 8 */
case 0x11: /* switch 8 */
switch (gMainMenuSelection) { /* switch 5 */
case MAIN_MENU_OPTION: /* switch 5 */
case MAIN_MENU_DATA: /* switch 5 */
case MAIN_MENU_PLAYER_SELECT: /* switch 5 */
case MAIN_MENU_DATA: /* switch 5 */
case MAIN_MENU_PLAYER_SELECT: /* switch 5 */
func_800A9B9C(var_s1);
break;
case MAIN_MENU_MODE_SELECT: /* switch 5 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 5 */
case MAIN_MENU_OK_SELECT: /* switch 5 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 5 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 5 */
case MAIN_MENU_MODE_SELECT: /* switch 5 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 5 */
case MAIN_MENU_OK_SELECT: /* switch 5 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 5 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 5 */
func_800A9C40(var_s1);
break;
}
@ -8500,21 +8512,21 @@ void func_800A7A4C(s32 arg0) {
func_800AA280(var_s1);
func_800A9A98(var_s1);
break;
case 0xB: /* switch 8 */
case 0xC: /* switch 8 */
case 0xD: /* switch 8 */
case 0xE: /* switch 8 */
switch (gMainMenuSelection) { /* switch 6 */
case 0xB: /* switch 8 */
case 0xC: /* switch 8 */
case 0xD: /* switch 8 */
case 0xE: /* switch 8 */
switch (gMainMenuSelection) { /* switch 6 */
case MAIN_MENU_OPTION: /* switch 6 */
case MAIN_MENU_DATA: /* switch 6 */
case MAIN_MENU_PLAYER_SELECT: /* switch 6 */
case MAIN_MENU_DATA: /* switch 6 */
case MAIN_MENU_PLAYER_SELECT: /* switch 6 */
func_800A9B9C(var_s1);
break;
case MAIN_MENU_MODE_SELECT: /* switch 6 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 6 */
case MAIN_MENU_OK_SELECT: /* switch 6 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 6 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 6 */
case MAIN_MENU_MODE_SELECT: /* switch 6 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 6 */
case MAIN_MENU_OK_SELECT: /* switch 6 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 6 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 6 */
func_800A9C40(var_s1);
break;
}
@ -8561,10 +8573,10 @@ void func_800A7A4C(s32 arg0) {
break;
}
switch (gPlayerSelectMenuSelection) { /* switch 10; irregular */
case PLAYER_SELECT_MENU_MAIN: /* switch 10 */
case PLAYER_SELECT_MENU_MAIN: /* switch 10 */
func_800AAB90(var_s1);
break;
case PLAYER_SELECT_MENU_OK: /* switch 10 */
case PLAYER_SELECT_MENU_OK: /* switch 10 */
case PLAYER_SELECT_MENU_OK_GO_BACK: /* switch 10 */
func_800AAA9C(var_s1);
break;
@ -8580,12 +8592,12 @@ void func_800A7A4C(s32 arg0) {
case 0x55: /* switch 8 */
case 0x56: /* switch 8 */
func_800AB164(var_s1);
switch (gSubMenuSelection) { /* switch 11; irregular */
switch (gSubMenuSelection) { /* switch 11; irregular */
case SUB_MENU_MAP_SELECT_CUP: /* switch 11 */
func_800AB020(var_s1);
break;
case SUB_MENU_MAP_SELECT_COURSE: /* switch 11 */
case SUB_MENU_MAP_SELECT_OK: /* switch 11 */
case SUB_MENU_MAP_SELECT_OK: /* switch 11 */
func_800AB098(var_s1);
break;
}
@ -8846,7 +8858,8 @@ void func_800A8270(s32 arg0, struct_8018D9E0_entry* arg1) {
gDisplayListHead = func_80098FC8(gDisplayListHead, var_s3, var_s0, var_s4, var_s0 + 0x35);
}
for (var_s0 += 0x41, var_s2 = 0; var_s2 <= gPlayerModeSelection[arg0]; var_s2++, var_s0 += 0x12) {
if ((var_s2 == gGameModeMenuColumn[arg0]) && ((arg0 + 1) == gPlayerCount) && (gMainMenuSelection > MAIN_MENU_PLAYER_SELECT)) {
if ((var_s2 == gGameModeMenuColumn[arg0]) && ((arg0 + 1) == gPlayerCount) &&
(gMainMenuSelection > MAIN_MENU_PLAYER_SELECT)) {
if (gMainMenuSelection == MAIN_MENU_MODE_SELECT) {
gDisplayListHead =
draw_flash_select_case_slow(gDisplayListHead, var_s3, var_s0, var_s4, var_s0 + 0x11);
@ -8873,14 +8886,13 @@ void func_800A8564(struct_8018D9E0_entry* arg0) {
switch (arg0->type) { /* irregular */
case 0xF:
var_a0 = D_0200487C;
if ((gMainMenuSelection == MAIN_MENU_OK_SELECT) ||
(gMainMenuSelection == MAIN_MENU_OK_SELECT_GO_BACK)) {
if ((gMainMenuSelection == MAIN_MENU_OK_SELECT) || (gMainMenuSelection == MAIN_MENU_OK_SELECT_GO_BACK)) {
var_a1 = 1;
}
break;
case 0x33:
var_a0 = D_02004B74;
if ((gPlayerSelectMenuSelection == PLAYER_SELECT_MENU_OK) ||
if ((gPlayerSelectMenuSelection == PLAYER_SELECT_MENU_OK) ||
(gPlayerSelectMenuSelection == PLAYER_SELECT_MENU_OK_GO_BACK)) {
var_a1 = 1;
}
@ -8977,8 +8989,10 @@ void func_800A8A98(struct_8018D9E0_entry* arg0) {
gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetCombineMode(gDisplayListHead++, G_CC_DECALRGBA, G_CC_DECALRGBA);
for (someIndex = 0; someIndex < NUM_COURSES_PER_CUP; someIndex++) {
if ((someIndex == gCourseIndexInCup) && (gSubMenuSelection > SUB_MENU_MAP_SELECT_CUP) && (gModeSelection != GRAND_PRIX)) {
if ((gSubMenuSelection == SUB_MENU_MAP_SELECT_COURSE) || (gSubMenuSelection == SUB_MENU_MAP_SELECT_BATTLE_COURSE)) {
if ((someIndex == gCourseIndexInCup) && (gSubMenuSelection > SUB_MENU_MAP_SELECT_CUP) &&
(gModeSelection != GRAND_PRIX)) {
if ((gSubMenuSelection == SUB_MENU_MAP_SELECT_COURSE) ||
(gSubMenuSelection == SUB_MENU_MAP_SELECT_BATTLE_COURSE)) {
gDisplayListHead = draw_flash_select_case_slow(
gDisplayListHead, D_800E7208[someIndex][0].column + temp_s2, D_800E7208[someIndex][0].row + temp_s3,
D_800E7208[someIndex][1].column + temp_s2, D_800E7208[someIndex][1].row + temp_s3);
@ -9300,7 +9314,8 @@ void func_800A97BC(struct_8018D9E0_entry* arg0) {
if (i < 7) {
gControllerPakVisibleTableRows[i] = gControllerPakVisibleTableRows[i + 1];
} else {
if ((gControllerPakVisibleTableRows[i - 1] == 0x10) || (gControllerPakVisibleTableRows[i - 1] == 0)) {
if ((gControllerPakVisibleTableRows[i - 1] == 0x10) ||
(gControllerPakVisibleTableRows[i - 1] == 0)) {
gControllerPakVisibleTableRows[i] = 0;
} else {
gControllerPakVisibleTableRows[i] = gControllerPakVisibleTableRows[i - 1] + 1;
@ -9320,7 +9335,8 @@ void func_800A97BC(struct_8018D9E0_entry* arg0) {
if (i > 1) {
gControllerPakVisibleTableRows[i] = gControllerPakVisibleTableRows[i - 1];
} else {
if ((gControllerPakVisibleTableRows[i + 1] == 1) || (gControllerPakVisibleTableRows[i + 1] == 0)) {
if ((gControllerPakVisibleTableRows[i + 1] == 1) ||
(gControllerPakVisibleTableRows[i + 1] == 0)) {
gControllerPakVisibleTableRows[i] = 0;
} else {
gControllerPakVisibleTableRows[i] = gControllerPakVisibleTableRows[i + 1] - 1;
@ -9339,17 +9355,11 @@ void func_800A97BC(struct_8018D9E0_entry* arg0) {
// Don't know if this belongs here or inside func_800A9A98
// as a `static const`. But this matches so we'll leave
// it here for now.
const s8 D_800F0CA0[] = {
0x03, 0x03, 0x03, 0x02, 0x00, 0x02, 0x02, 0x01
};
const s8 D_800F0CA0[] = { 0x03, 0x03, 0x03, 0x02, 0x00, 0x02, 0x02, 0x01 };
const s8 D_800F0CA8[] = {
0x03, 0x02, 0x00
};
const s8 D_800F0CA8[] = { 0x03, 0x02, 0x00 };
const s8 D_800F0CAC[] = {
0x03, 0x03, 0x02
};
const s8 D_800F0CAC[] = { 0x03, 0x03, 0x02 };
void func_800A9A98(struct_8018D9E0_entry* arg0) {
s32 sp4;
@ -9538,10 +9548,10 @@ void func_800A9E58(struct_8018D9E0_entry* arg0) {
arg0->visible = 0;
} else {
arg0->unk20 = gGameModeMenuColumn[gPlayerCount - 1];
switch (gMainMenuSelection) { /* switch 2 */
case MAIN_MENU_MODE_SELECT: /* switch 2 */
switch (gMainMenuSelection) { /* switch 2 */
case MAIN_MENU_MODE_SELECT: /* switch 2 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 2 */
case MAIN_MENU_OK_SELECT: /* switch 2 */
case MAIN_MENU_OK_SELECT: /* switch 2 */
arg0->visible = 1;
temp_v0 = func_800AAE68();
arg0->column = temp_v0->column;
@ -9565,13 +9575,13 @@ void func_800A9E58(struct_8018D9E0_entry* arg0) {
}
}
break;
case 1: /* switch 5 */
switch (gMainMenuSelection) { /* switch 3 */
case MAIN_MENU_MODE_SELECT: /* switch 3 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 3 */
case MAIN_MENU_OK_SELECT: /* switch 3 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 3 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 3 */
case 1: /* switch 5 */
switch (gMainMenuSelection) { /* switch 3 */
case MAIN_MENU_MODE_SELECT: /* switch 3 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 3 */
case MAIN_MENU_OK_SELECT: /* switch 3 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 3 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 3 */
if ((temp_a1 != sp20) && (temp_a1 != sp1C)) {
arg0->visible = 0;
arg0->cursor = 0;
@ -9596,13 +9606,13 @@ void func_800A9E58(struct_8018D9E0_entry* arg0) {
break;
}
break;
case 2: /* switch 5 */
switch (gMainMenuSelection) { /* switch 4 */
case MAIN_MENU_MODE_SELECT: /* switch 4 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 4 */
case MAIN_MENU_OK_SELECT: /* switch 4 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 4 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 4 */
case 2: /* switch 5 */
switch (gMainMenuSelection) { /* switch 4 */
case MAIN_MENU_MODE_SELECT: /* switch 4 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 4 */
case MAIN_MENU_OK_SELECT: /* switch 4 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 4 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 4 */
if ((temp_a1 != sp20) && (temp_a1 != sp1C)) {
arg0->visible = 0;
arg0->cursor = 0;
@ -10527,7 +10537,7 @@ void func_800ABF68(struct_8018D9E0_entry* arg0) {
case 0:
arg0->column = 0x140;
arg0->cursor = 1;
arg0->unk20 = 0xA0 - (get_string_width(gCourseNames[gCurrentCourseId]) / 2);
arg0->unk20 = 0xA0 - (get_string_width(GET_COURSE_Name) / 2);
/* fallthrough */
case 1:
func_800A9208(arg0, arg0->unk20);

View File

@ -486,10 +486,7 @@ extern RGBA16 D_800E74D0[];
extern RGBA16 D_800E74E8[];
extern const s16 gGlyphDisplayWidth[];
extern char* gCupNames[];
extern char* gCourseNames[];
extern char* gCourseNamesDup[];
extern char* gCourseNamesDup2[];
extern char* gDebugCourseNames[];
// Maps course IDs (as defined in the COURSES enum) to an index in a given cup's track order
extern const s8 gPerCupIndexByCourseId[]; // D_800EFD50
extern const s8 D_800EFD64[];

View File

@ -2,14 +2,19 @@
#include "courses/all_course_data.h"
#include <assets/ceremony_data.h>
#if !ENABLE_CUSTOM_COURSE_ENGINE
// @warning Array contains an extra zero element at the end.
KartAIBehaviour* gKartAIBehaviourLUT[] = {
#include "assets/course_metadata/gKartAIBehaviourLUT.inc.c"
};
#else
#endif
TrackWaypoint nullPath = { 0x8000, 0x0000, 0x0000, 0x0000 };
#if !ENABLE_CUSTOM_COURSE_ENGINE
TrackWaypoint* gCoursePathTable[][4] = {
#include "assets/course_metadata/gCoursePathTableUnknown.inc.c"
};
@ -18,7 +23,7 @@ TrackWaypoint* gCoursePathTable2[][4] = {
#include "assets/course_metadata/gCoursePathTable.inc.c"
};
// @warning Array contains an extra zero element at the end.
/// @warning Array contains an extra zero element at the end.
s16 gKartAISteeringSensitivity[] = {
#include "assets/course_metadata/gCPUSteeringSensitivity.inc.c"
};
@ -32,6 +37,9 @@ f32 gKartAICourseMaximumSeparation[] = {
f32 gKartAICourseMinimumSeparation[] = {
#include "assets/course_metadata/gKartAICourseMinimumSeparation.inc.c"
};
#else
#endif
// I think the types for D_800DCAF4, D_800DCB34, and D_800DCBB4 are all
// wrong in some way based on their usage in func_800088D8
@ -60,9 +68,13 @@ BombKartSpawn gBombKartSpawns[][NUM_BOMB_KARTS_MAX] = {
#include "assets/course_metadata/gBombKartSpawns.inc.c"
};
#if !ENABLE_CUSTOM_COURSE_ENGINE
struct _struct_gCoursePathSizes_0x10 gCoursePathSizes[] = {
#include "assets/course_metadata/gCoursePathSizes.inc.c"
};
#else
#endif
s32 D_800DDB20 = 0x00000000;

View File

@ -6,27 +6,10 @@
#include <assets/common_data.h>
#include "include/bomb_kart.h"
struct _struct_gCoursePathSizes_0x10 {
/* 0x00 */ u16 unk0;
/* 0x02 */ u16 unk2;
/* 0x04 */ u16 unk4;
/* 0x06 */ u16 unk6;
/* 0x08 */ u16 unk8;
/* 0x0A */ char padA[6];
}; // size 0x10
extern KartAIBehaviour* gKartAIBehaviourLUT[];
extern TrackWaypoint nullPath;
extern TrackWaypoint* gCoursePathTable[][4];
extern TrackWaypoint* gCoursePathTable2[][4];
extern s16 gKartAISteeringSensitivity[];
extern f32 gKartAICourseMaximumSeparation[];
extern f32 gKartAICourseMinimumSeparation[];
extern s16 D_800DCAF4[];
extern s16 D_800DCB34[];
extern s16* D_800DCBB4[];
extern BombKartSpawn gBombKartSpawns[][NUM_BOMB_KARTS_MAX];
extern struct _struct_gCoursePathSizes_0x10 gCoursePathSizes[];
extern s32 D_800DDB20;
extern s32 D_800DDB24;

View File

@ -17,6 +17,7 @@
#include "audio/external.h"
#include "spawn_players.h"
#include "code_80091750.h"
#include <course.h>
s32 D_8018D900[8];
s16 D_8018D920[8];
@ -1587,8 +1588,10 @@ void func_8008FEDC(Player* player, UNUSED s8 arg1) {
player->kartHopAcceleration = 0.0f;
}
void func_8008FF08(Player* player, s8 playerId) {
void course_update_waypoint(Player* player, s8 playerId) {
s16 waypoint;
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_BOWSER_CASTLE:
waypoint = gNearestWaypointByPlayerId[playerId];
@ -1670,6 +1673,9 @@ void func_8008FF08(Player* player, s8 playerId) {
}
break;
}
#else
#endif
}
void func_80090178(Player* player, s8 playerId, Vec3f arg2, Vec3f arg3) {
@ -1795,7 +1801,7 @@ void func_80090868(Player* player) {
player->unk_D98 = 1;
player->unk_D9C = 0.0f;
player->unk_DA0 = 0.5f;
func_8008FF08(player, playerIndex);
course_update_waypoint(player, playerIndex);
player->unk_222 = 0;
player->unk_0CA |= 2;
player->unk_0C8 = 0;

View File

@ -106,7 +106,7 @@ void func_8008FDA8(Player*, s8);
void func_8008FDF4(Player*, s8);
void func_8008FE84(Player*, s8);
void func_8008FEDC(Player*, s8);
void func_8008FF08(Player*, s8);
void course_update_waypoint(Player*, s8);
void func_80090178(Player*, s8, Vec3f, Vec3f);
void func_80090778(Player*);
void func_80090868(Player*);

View File

@ -1,5 +1,6 @@
#include <ultra64.h>
#include <macros.h>
#include <course.h>
#include <common_structs.h>
#include "camera_junk.h"
@ -38,7 +39,7 @@ void init_camera_podium_ceremony(void) {
cameras[0].up[2] = 0.0f;
gCameraZoom[0] = 40.0f;
gScreenAspect = 1.33333333f;
D_80150150 = 3.0f;
D_8015014C = 6800.0f;
gCourseNearPersp = 3.0f;
gCourseFarPersp = 6800.0f;
init_cinematic_camera();
}

View File

@ -4,10 +4,11 @@
#include <debug.h>
#include <PR/gu.h>
#include <mk64.h>
#include <course.h>
#include <main.h>
#include "main.h"
#include <segments.h>
#include <code_800029B0.h>
#include "code_800029B0.h"
#include "camera.h"
#include "memory.h"
#include "math_util.h"
@ -30,7 +31,7 @@ s32 D_802874A0;
// s32 D_802874A4[5];
void func_80280000(void) {
func_802966A0();
course_update_water();
func_80059AC8();
func_80059AC8();
func_8005A070();
@ -51,7 +52,8 @@ void func_80280038(void) {
func_80057FC4(0);
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, gCourseNearPersp, gCourseFarPersp,
1.0f);
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
@ -128,7 +130,7 @@ void load_credits(void) {
gCurrentCourseId = gCreditsCourseId;
D_800DC5B4 = 1;
creditsRenderMode = 1;
func_802A4D18();
set_perspective_and_aspect_ratio();
func_802A74BC();
camera->unk_B4 = 60.0f;
gCameraZoom[0] = 60.0f;

View File

@ -3,6 +3,7 @@
#include <defines.h>
#include <segments.h>
#include <mk64.h>
#include <course.h>
#include "code_80281780.h"
#include "memory.h"
@ -92,7 +93,7 @@ void load_ceremony_cutscene(void) {
gIsMirrorMode = 0;
gGotoMenu = 0xFFFF;
D_80287554 = 0;
func_802A4D18();
set_perspective_and_aspect_ratio();
func_802A74BC();
camera->unk_B4 = 60.0f;
gCameraZoom[0] = 60.0f;

View File

@ -1,6 +1,7 @@
#include <ultra64.h>
#include <PR/gu.h>
#include <macros.h>
#include <course.h>
#include "code_80281C40.h"
#include "main.h"
@ -49,7 +50,7 @@ void func_80281CB4(s32 arg0, s32 arg1, s32 arg2, s32 arg3) {
extern Gfx D_80284F70[];
extern Gfx D_80284EE0[];
void func_80281D00(void) {
void render_podium_ceremony(void) {
Camera* camera = &cameras[0];
UNUSED s32 pad[3];
u16 perspNorm;
@ -69,8 +70,8 @@ void func_80281D00(void) {
}
func_8028150C();
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
guPerspective((Mtx*) &gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, D_80150150, D_8015014C,
1.0f);
guPerspective((Mtx*) &gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, gCourseNearPersp,
gCourseFarPersp, 1.0f);
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);

View File

@ -5,7 +5,7 @@
void func_80281C40(void);
void func_80281CB4(s32, s32, s32, s32);
void func_80281D00(void);
void render_podium_ceremony(void);
extern s32 gGotoMenu;
extern u16 gIsInQuitToMenuTransition;

View File

@ -458,7 +458,7 @@ void podium_ceremony_loop(void) {
func_8001C14C();
update_vehicles();
}
func_80281D00();
render_podium_ceremony();
func_80281540();
#if DVDL
display_dvdl();

View File

@ -7,6 +7,7 @@
#include <macros.h>
#include <decode.h>
#include <mk64.h>
#include <course.h>
#include "profiler.h"
#include "main.h"
@ -123,8 +124,8 @@ f32 gCameraZoom[4]; // look like to be the fov of each character
UNUSED s32 D_80150140;
UNUSED s32 D_80150144;
f32 gScreenAspect;
f32 D_8015014C;
f32 D_80150150;
f32 gCourseFarPersp;
f32 gCourseNearPersp;
UNUSED f32 D_80150154;
struct D_80150158 gD_80150158[16];
@ -612,7 +613,7 @@ void race_logic_loop(void) {
func_8028F474();
func_80059AC8();
update_course_actors();
func_802966A0();
course_update_water();
func_8028FCBC();
}
func_80022744();
@ -676,7 +677,7 @@ void race_logic_loop(void) {
func_8028F474();
func_80059AC8();
update_course_actors();
func_802966A0();
course_update_water();
func_8028FCBC();
}
func_80022744();
@ -722,7 +723,7 @@ void race_logic_loop(void) {
func_8028F474();
func_80059AC8();
update_course_actors();
func_802966A0();
course_update_water();
func_8028FCBC();
}
func_80022744();
@ -794,7 +795,7 @@ void race_logic_loop(void) {
func_8028F474();
func_80059AC8();
update_course_actors();
func_802966A0();
course_update_water();
func_8028FCBC();
}
func_80022744();
@ -1105,25 +1106,25 @@ void thread3_video(UNUSED void* arg0) {
void func_800025D4(void) {
func_80091B78();
gActiveScreenMode = SCREEN_MODE_1P;
func_802A4D18();
set_perspective_and_aspect_ratio();
}
void func_80002600(void) {
func_80091B78();
gActiveScreenMode = SCREEN_MODE_1P;
func_802A4D18();
set_perspective_and_aspect_ratio();
}
void func_8000262C(void) {
func_80091B78();
gActiveScreenMode = SCREEN_MODE_1P;
func_802A4D18();
set_perspective_and_aspect_ratio();
}
void func_80002658(void) {
func_80091B78();
gActiveScreenMode = SCREEN_MODE_1P;
func_802A4D18();
set_perspective_and_aspect_ratio();
}
/**

View File

@ -167,8 +167,6 @@ extern s32 gGotoMode;
extern f32 gCameraZoom[];
extern f32 gScreenAspect;
extern f32 D_8015014C;
extern f32 D_80150150;
extern struct D_80150158 gD_80150158[];
extern uintptr_t gSegmentTable[];

View File

@ -3,6 +3,7 @@
#include <defines.h>
#include <common_structs.h>
#include <mk64.h>
#include <course.h>
#include "menus.h"
#include "main.h"
@ -40,9 +41,9 @@ f32 gIntroModelPosY;
f32 gIntroModelPosZ;
s32 gMenuFadeType;
s8 gCharacterGridSelections[4]; // Map from each player to current grid position (1-4 top, 5-8 bottom)
s8 gCharacterGridSelections[4]; // Map from each player to current grid position (1-4 top, 5-8 bottom)
bool8 gCharacterGridIsSelected[4]; // Sets true if a character is selected for each player
s8 gSubMenuSelection; // Map Select states, Options and Ghost Data text selection
s8 gSubMenuSelection; // Map Select states, Options and Ghost Data text selection
s8 gMainMenuSelection;
s8 gPlayerSelectMenuSelection;
s8 gDebugMenuSelection;
@ -50,11 +51,12 @@ s8 gControllerPakMenuSelection;
s8 gScreenModeListIndex; // 0-4 index, selects a screen mode in sScreenModePlayerTable
u8 gSoundMode;
s8 gPlayerCount;
s8 gVersusResultCursorSelection; // 4 options indexed (10-13), gets set when selecting an option
s8 gTimeTrialsResultCursorSelection; // 5 options indexed (5-9), gets set when selecting an option (excluding Save Ghost)
s8 gBattleResultCursorSelection; // 4 options indexed (10-13), gets set when selecting an option
s8 gVersusResultCursorSelection; // 4 options indexed (10-13), gets set when selecting an option
s8 gTimeTrialsResultCursorSelection; // 5 options indexed (5-9), gets set when selecting an option (excluding Save
// Ghost)
s8 gBattleResultCursorSelection; // 4 options indexed (10-13), gets set when selecting an option
s8 gTimeTrialDataCourseIndex;
s8 gCourseRecordsMenuSelection; // Used for selecting an option in course record data
s8 gCourseRecordsMenuSelection; // Used for selecting an option in course record data
s8 gCourseRecordsSubMenuSelection; // Used for erase records and ghosts (Quit - Erase)
s8 gDebugGotoScene;
bool8 gGhostPlayerInit;
@ -99,13 +101,9 @@ u32 sVIGammaOffDitherOn = (OS_VI_GAMMA_OFF | OS_VI_DITHER_FILTER_ON);
/** RoData **/
// Sets the actual screen mode based on values set in sScreenModePlayerCount
const s8 sScreenModePlayerTable[] = {
SCREEN_MODE_1P,
SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL,
SCREEN_MODE_2P_SPLITSCREEN_VERTICAL,
SCREEN_MODE_3P_4P_SPLITSCREEN,
SCREEN_MODE_3P_4P_SPLITSCREEN
};
const s8 sScreenModePlayerTable[] = { SCREEN_MODE_1P, SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL,
SCREEN_MODE_2P_SPLITSCREEN_VERTICAL, SCREEN_MODE_3P_4P_SPLITSCREEN,
SCREEN_MODE_3P_4P_SPLITSCREEN };
// Sets how many players can load on each screen mode set in sScreenModePlayerTable
const s8 sScreenModePlayerCount[] = { 1, 2, 2, 3, 4 };
@ -141,8 +139,7 @@ const s32 gGameModePlayerSelection[][3] = {
// Map from character grid position id to character id
// Note: changing order doesn't affect graphics, only the selection
const s8 sCharacterGridOrder[] = {
MARIO, LUIGI, PEACH, TOAD,
YOSHI, DK, WARIO, BOWSER,
MARIO, LUIGI, PEACH, TOAD, YOSHI, DK, WARIO, BOWSER,
};
const s16 gCupCourseOrder[5][4] = {
@ -450,7 +447,8 @@ void options_menu_act(struct Controller* controller, u16 controllerIdx) {
}
case SUB_MENU_COPY_PAK_FROM_GHOST1_1P:
case SUB_MENU_COPY_PAK_FROM_GHOST2_1P: {
if ((btnAndStick & D_JPAD) && (gSubMenuSelection < SUB_MENU_COPY_PAK_FROM_GHOST_MAX) && (sp30[PLAYER_TWO].ghostDataSaved)) {
if ((btnAndStick & D_JPAD) && (gSubMenuSelection < SUB_MENU_COPY_PAK_FROM_GHOST_MAX) &&
(sp30[PLAYER_TWO].ghostDataSaved)) {
gSubMenuSelection += 1;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (sp38->unk24 < 4.2) {
@ -458,7 +456,8 @@ void options_menu_act(struct Controller* controller, u16 controllerIdx) {
}
sp38->unk8 = 1;
}
if ((btnAndStick & U_JPAD) && (gSubMenuSelection > SUB_MENU_COPY_PAK_FROM_GHOST_MIN) && sp30[PLAYER_ONE].ghostDataSaved) {
if ((btnAndStick & U_JPAD) && (gSubMenuSelection > SUB_MENU_COPY_PAK_FROM_GHOST_MIN) &&
sp30[PLAYER_ONE].ghostDataSaved) {
gSubMenuSelection -= 1;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (sp38->unk24 < 4.2) {
@ -473,7 +472,8 @@ void options_menu_act(struct Controller* controller, u16 controllerIdx) {
}
if (btnAndStick & A_BUTTON) {
sp38->unk20 = gSubMenuSelection - SUB_MENU_COPY_PAK_FROM_GHOST_MIN;
if (sp30[sp38->unk20].courseIndex == D_8018EE10[PLAYER_TWO].courseIndex && D_8018EE10[PLAYER_TWO].ghostDataSaved) {
if (sp30[sp38->unk20].courseIndex == D_8018EE10[PLAYER_TWO].courseIndex &&
D_8018EE10[PLAYER_TWO].ghostDataSaved) {
gSubMenuSelection = SUB_MENU_COPY_PAK_TO_GHOST2_2P;
} else {
gSubMenuSelection = SUB_MENU_COPY_PAK_TO_GHOST1_2P;
@ -485,7 +485,8 @@ void options_menu_act(struct Controller* controller, u16 controllerIdx) {
case SUB_MENU_COPY_PAK_TO_GHOST1_2P:
case SUB_MENU_COPY_PAK_TO_GHOST2_2P: {
// bit of a fake match, but if it works it works?
if ((sp30[sp38->unk20].courseIndex != ((0, (D_8018EE10 + (gSubMenuSelection - SUB_MENU_COPY_PAK_TO_GHOST_MIN))->courseIndex))) ||
if ((sp30[sp38->unk20].courseIndex !=
((0, (D_8018EE10 + (gSubMenuSelection - SUB_MENU_COPY_PAK_TO_GHOST_MIN))->courseIndex))) ||
((D_8018EE10 + (gSubMenuSelection - SUB_MENU_COPY_PAK_TO_GHOST_MIN))->ghostDataSaved == 0)) {
if ((btnAndStick & D_JPAD) && (gSubMenuSelection < SUB_MENU_COPY_PAK_TO_GHOST_MAX)) {
gSubMenuSelection += 1;
@ -725,7 +726,8 @@ void course_data_menu_act(struct Controller* controller, UNUSED u16 controllerId
sp28 = find_8018D9E0_entry_dupe(0xE8);
sp24 = &gSaveData.allCourseTimeTrialRecords.cupRecords[gTimeTrialDataCourseIndex / 4]
.courseRecords[gTimeTrialDataCourseIndex % 4];
if (gCourseRecordsMenuSelection == COURSE_RECORDS_MENU_ERASE_GHOST && func_800B639C(gTimeTrialDataCourseIndex) < 0) {
if (gCourseRecordsMenuSelection == COURSE_RECORDS_MENU_ERASE_GHOST &&
func_800B639C(gTimeTrialDataCourseIndex) < 0) {
gCourseRecordsMenuSelection -= 1;
}
@ -747,11 +749,13 @@ void course_data_menu_act(struct Controller* controller, UNUSED u16 controllerId
if ((btnAndStick & D_JPAD) && (gCourseRecordsMenuSelection < COURSE_RECORDS_MENU_MAX)) {
gCourseRecordsMenuSelection += 1;
if (gCourseRecordsMenuSelection == COURSE_RECORDS_MENU_ERASE_RECORDS && sp24->unknownBytes[0] == 0) {
if (gCourseRecordsMenuSelection == COURSE_RECORDS_MENU_ERASE_RECORDS &&
sp24->unknownBytes[0] == 0) {
gCourseRecordsMenuSelection += 1;
}
if (gCourseRecordsMenuSelection == COURSE_RECORDS_MENU_ERASE_GHOST && func_800B639C(gTimeTrialDataCourseIndex) < 0) {
if (gCourseRecordsMenuSelection == COURSE_RECORDS_MENU_ERASE_GHOST &&
func_800B639C(gTimeTrialDataCourseIndex) < 0) {
if (sp24->unknownBytes[0] == 0) {
gCourseRecordsMenuSelection = COURSE_RECORDS_MENU_RETURN_MENU;
} else {
@ -934,7 +938,8 @@ void controller_pak_menu_act(struct Controller* controller, UNUSED u16 controlle
return;
}
}
} else if (((btnAndStick & D_JPAD) != 0) && (gControllerPakScrollDirection == CONTROLLER_PAK_SCROLL_DIR_NONE)) {
} else if (((btnAndStick & D_JPAD) != 0) &&
(gControllerPakScrollDirection == CONTROLLER_PAK_SCROLL_DIR_NONE)) {
++gControllerPakSelectedTableRow;
if (gControllerPakSelectedTableRow >= CONTROLLER_PAK_MENU_TABLE_GAME_DATA) {
gControllerPakSelectedTableRow = CONTROLLER_PAK_MENU_QUIT;
@ -1414,12 +1419,14 @@ void main_menu_act(struct Controller* controller, u16 controllerIdx) {
if (btnAndStick & D_JPAD) {
cursorMoved = false;
if (func_800B555C()) {
if (subMode < sGameModePlayerColumnExtra[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]) {
if (subMode <
sGameModePlayerColumnExtra[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]) {
cursorMoved = true;
}
} else {
// L800B30D4
if (subMode < sGameModePlayerColumnDefault[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]) {
if (subMode <
sGameModePlayerColumnDefault[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]) {
cursorMoved = true;
}
}
@ -1569,8 +1576,7 @@ void player_select_menu_act(struct Controller* controller, u16 controllerIdx) {
// L800B36F4
selected = false;
for (i = 0; i < ARRAY_COUNT(gCharacterGridSelections); i++) {
if ((gCharacterGridSelections[i] != 0) &&
(gCharacterGridIsSelected[i] == 0)) {
if ((gCharacterGridSelections[i] != 0) && (gCharacterGridIsSelected[i] == 0)) {
selected = true;
break;
}
@ -1793,7 +1799,8 @@ void course_select_menu_act(struct Controller* arg0, u16 controllerIdx) {
}
break;
case SUB_MENU_MAP_SELECT_OK:
if ((controllerIdx == PLAYER_ONE) && ((++gMenuTimingCounter == 0x3C) || ((gMenuTimingCounter % 300) == 0))) {
if ((controllerIdx == PLAYER_ONE) &&
((++gMenuTimingCounter == 0x3C) || ((gMenuTimingCounter % 300) == 0))) {
play_sound2(SOUND_MENU_OK);
}

View File

@ -2,6 +2,7 @@
#include <macros.h>
#include <defines.h>
#include <mk64.h>
#include <course.h>
#include "player_controller.h"
#include "code_800029B0.h"
@ -245,6 +246,8 @@ void func_80027EDC(Player* player, s8 playerId) {
UNUSED s32 pad;
if (((player->type & PLAYER_HUMAN) == PLAYER_HUMAN) &&
((player->type & PLAYER_INVISIBLE_OR_BOMB) != PLAYER_INVISIBLE_OR_BOMB)) {
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
if (((s16) gNearestWaypointByPlayerId[playerId] >= 0x19B) &&
@ -375,7 +378,11 @@ void func_80027EDC(Player* player, s8 playerId) {
default:
break;
}
#else
#endif
} else {
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
if (((s16) gNearestWaypointByPlayerId[playerId] >= 0x19B) &&
@ -491,6 +498,9 @@ void func_80027EDC(Player* player, s8 playerId) {
default:
break;
}
#else
#endif
}
}
@ -2359,8 +2369,8 @@ void func_8002E4C4(Player* player) {
player->kartHopJerk = 0.0f;
player->kartHopAcceleration = 0.0f;
player->kartHopVelocity = 0.0f;
player->pos[1] = spawn_actor_on_surface(player->pos[0], D_80164510[player_index] + 10.0f, player->pos[2]) +
player->boundingBoxSize;
player->pos[1] =
get_surface_height(player->pos[0], D_80164510[player_index] + 10.0f, player->pos[2]) + player->boundingBoxSize;
if (((player->pos[1] - D_80164510[player_index]) > 1200.0f) ||
((player->pos[1] - D_80164510[player_index]) < -1200.0f)) {
player->pos[1] = player->oldPos[1];

View File

@ -981,7 +981,7 @@ void spawn_all_item_boxes(struct ActorSpawnData* spawnData) {
startingRot[1] = random_u16();
startingRot[2] = random_u16();
temp_s1 = add_actor_to_empty_slot(startingPos, startingRot, startingVelocity, ACTOR_ITEM_BOX);
temp_f0 = spawn_actor_on_surface(startingPos[0], startingPos[1] + 10.0f, startingPos[2]);
temp_f0 = get_surface_height(startingPos[0], startingPos[1] + 10.0f, startingPos[2]);
// Should be struct ItemBox but not enough space in the stack.
// It's either the ItemBox or the SEGMENT/OFFSET variables.
@ -1053,6 +1053,7 @@ void spawn_course_actors(void) {
struct RailroadCrossing* rrxing;
gNumPermanentActors = 0;
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
spawn_foliage(d_course_mario_raceway_tree_spawns);
@ -1172,6 +1173,9 @@ void spawn_course_actors(void) {
spawn_all_item_boxes(d_course_big_donut_item_box_spawns);
break;
}
#else
#endif
gNumPermanentActors = gNumActors;
}
@ -1208,6 +1212,7 @@ void init_actors_and_load_textures(void) {
dma_textures(gTextureFinishLineBanner8, 0x0000025BU, 0x00000800U);
dma_textures(gTexture671A88, 0x00000400U, 0x00000800U);
dma_textures(gTexture6774D8, 0x00000400U, 0x00000800U);
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
dma_textures(gTextureTrees1, 0x0000035BU, 0x00000800U);
@ -1275,6 +1280,9 @@ void init_actors_and_load_textures(void) {
dma_textures(gTextureDksJungleParkwayKiwanoFruit3, 0x00000364U, 0x00000400U);
break;
}
#else
#endif
init_red_shell_texture();
destroy_all_actors();
spawn_course_actors();

View File

@ -125,7 +125,6 @@ extern u16 D_802BA260; // Box Truck sub-type?
// end of definition of actor.c variables
extern s16 gCurrentCourseId;
extern u16 isCrossingTriggeredByIndex[];
extern Lights1 D_800DC610[];

View File

@ -1,9 +1,11 @@
#include <ultra64.h>
#include <macros.h>
#include <PR/gbi.h>
#include <mk64.h>
#include <common_structs.h>
#include <mk64.h>
#include <actor_types.h>
#include <course.h>
#include "main.h"
#include "memory.h"
#include "collision.h"
@ -871,8 +873,8 @@ s32 is_colliding_with_drivable_surface(Collision* collision, f32 boundingBoxSize
/**
* Wall collision
*/
s32 is_colliding_with_wall2(Collision* arg, f32 boundingBoxSize, f32 x1, f32 y1, f32 z1, u16 surfaceIndex, f32 posX,
f32 posY, f32 posZ) {
s32 is_colliding_with_wall_z(Collision* arg, f32 boundingBoxSize, f32 x1, f32 y1, f32 z1, u16 surfaceIndex, f32 posX,
f32 posY, f32 posZ) {
CollisionTriangle* triangle = &gCollisionMesh[surfaceIndex];
UNUSED s32 pad[6];
f32 x4;
@ -1053,8 +1055,8 @@ s32 is_colliding_with_wall2(Collision* arg, f32 boundingBoxSize, f32 x1, f32 y1,
/**
* This is actually more like colliding with face X/Y/Z
*/
s32 is_colliding_with_wall1(Collision* arg, f32 boundingBoxSize, f32 x1, f32 y1, f32 z1, u16 surfaceIndex, f32 posX,
f32 posY, f32 posZ) {
s32 is_colliding_with_wall_x(Collision* arg, f32 boundingBoxSize, f32 x1, f32 y1, f32 z1, u16 surfaceIndex, f32 posX,
f32 posY, f32 posZ) {
CollisionTriangle* triangle = &gCollisionMesh[surfaceIndex];
s32 b = 1;
UNUSED s32 pad[7];
@ -1267,15 +1269,15 @@ u16 actor_terrain_collision(Collision* collision, f32 boundingBoxSize, f32 newX,
}
if ((s32) collision->meshIndexYX < (s32) gCollisionMeshCount) {
if (is_colliding_with_wall2(collision, boundingBoxSize, newX, newY, newZ, collision->meshIndexYX, oldX, oldY,
oldZ) == COLLISION) {
if (is_colliding_with_wall_z(collision, boundingBoxSize, newX, newY, newZ, collision->meshIndexYX, oldX, oldY,
oldZ) == COLLISION) {
flags |= FACING_Z_AXIS;
}
}
if ((s32) collision->meshIndexZY < (s32) gCollisionMeshCount) {
if (is_colliding_with_wall1(collision, boundingBoxSize, newX, newY, newZ, collision->meshIndexZY, oldX, oldY,
oldZ) == COLLISION) {
if (is_colliding_with_wall_x(collision, boundingBoxSize, newX, newY, newZ, collision->meshIndexZY, oldX, oldY,
oldZ) == COLLISION) {
flags |= FACING_X_AXIS;
}
}
@ -1334,16 +1336,16 @@ u16 actor_terrain_collision(Collision* collision, f32 boundingBoxSize, f32 newX,
} else if ((gCollisionMesh[collisionIndex].flags & FACING_X_AXIS) != 0) {
if ((flags & FACING_X_AXIS) == 0) {
if (collisionIndex != collision->meshIndexZY) {
if (is_colliding_with_wall1(collision, boundingBoxSize, newX, newY, newZ, collisionIndex, oldX,
oldY, oldZ) == COLLISION) {
if (is_colliding_with_wall_x(collision, boundingBoxSize, newX, newY, newZ, collisionIndex, oldX,
oldY, oldZ) == COLLISION) {
flags |= FACING_X_AXIS;
}
}
}
} else if ((flags & FACING_Z_AXIS) == 0) {
if (collisionIndex != collision->meshIndexYX) {
if (is_colliding_with_wall2(collision, boundingBoxSize, newX, newY, newZ, collisionIndex, oldX, oldY,
oldZ) == COLLISION) {
if (is_colliding_with_wall_z(collision, boundingBoxSize, newX, newY, newZ, collisionIndex, oldX, oldY,
oldZ) == COLLISION) {
flags |= FACING_Z_AXIS;
}
}
@ -1461,10 +1463,11 @@ u16 check_bounding_collision(Collision* collision, f32 boundingBoxSize, f32 posX
extern u8 D_8014F1110;
/**
* @brief Returns the height of the surface below the provided position. Used to set actors onto the course mesh.
* If unable to spawn actor on the surface set to -3000.0f or
* if outside the collision grid, spawn in the air (3000.0f).
*/
f32 spawn_actor_on_surface(f32 posX, f32 posY, f32 posZ) {
f32 get_surface_height(f32 posX, f32 posY, f32 posZ) {
f32 height;
s16 sectionIndexX;
s16 sectionIndexZ;
@ -2178,8 +2181,8 @@ u16 player_terrain_collision(Player* player, KartTyre* tyre, f32 tyre2X, f32 tyr
tyreZ = tyre->pos[2];
switch (tyre->surfaceFlags) {
case 0x80:
if (is_colliding_with_wall1(collision, boundingBoxSize, tyreX, tyreY, tyreZ, tyre->collisionMeshIndex,
tyre2X, tyre2Y, tyre2Z) == 1) {
if (is_colliding_with_wall_x(collision, boundingBoxSize, tyreX, tyreY, tyreZ, tyre->collisionMeshIndex,
tyre2X, tyre2Y, tyre2Z) == 1) {
height = calculate_surface_height(tyreX, tyreY, tyreZ, tyre->collisionMeshIndex);
if ((!(height > player->pos[1])) && !((player->pos[1] - height) > (2 * boundingBoxSize))) {
tyre->baseHeight = height;
@ -2200,8 +2203,8 @@ u16 player_terrain_collision(Player* player, KartTyre* tyre, f32 tyre2X, f32 tyr
}
break;
case 0x20:
if (is_colliding_with_wall2(collision, boundingBoxSize, tyreX, tyreY, tyreZ, tyre->collisionMeshIndex,
tyre2X, tyre2Y, tyre2Z) == 1) {
if (is_colliding_with_wall_z(collision, boundingBoxSize, tyreX, tyreY, tyreZ, tyre->collisionMeshIndex,
tyre2X, tyre2Y, tyre2Z) == 1) {
height = calculate_surface_height(tyreX, tyreY, tyreZ, tyre->collisionMeshIndex);
if (!(player->pos[1] < height) && !((2 * boundingBoxSize) < (player->pos[1] - height))) {
tyre->baseHeight = height;
@ -2273,8 +2276,8 @@ u16 player_terrain_collision(Player* player, KartTyre* tyre, f32 tyre2X, f32 tyr
} else if (gCollisionMesh[meshIndex].flags & FACING_X_AXIS) {
if (gCollisionMesh[meshIndex].normalY != 0.0f) {
if (meshIndex != tyre->collisionMeshIndex) {
if (is_colliding_with_wall1(collision, boundingBoxSize, tyreX, tyreY, tyreZ, meshIndex, tyre2X,
tyre2Y, tyre2Z) == 1) {
if (is_colliding_with_wall_x(collision, boundingBoxSize, tyreX, tyreY, tyreZ, meshIndex, tyre2X,
tyre2Y, tyre2Z) == 1) {
height = calculate_surface_height(tyreX, tyreY, tyreZ, meshIndex);
if (!(player->pos[1] < height) && !((2 * boundingBoxSize) < (player->pos[1] - height))) {
tyre->baseHeight = height;
@ -2291,8 +2294,8 @@ u16 player_terrain_collision(Player* player, KartTyre* tyre, f32 tyre2X, f32 tyr
} else {
if (gCollisionMesh[meshIndex].normalY != 0.0f) {
if (meshIndex != tyre->collisionMeshIndex) {
if (is_colliding_with_wall2(collision, boundingBoxSize, tyreX, tyreY, tyreZ, meshIndex, tyre2X,
tyre2Y, tyre2Z) == 1) {
if (is_colliding_with_wall_z(collision, boundingBoxSize, tyreX, tyreY, tyreZ, meshIndex, tyre2X,
tyre2Y, tyre2Z) == 1) {
height = calculate_surface_height(tyreX, tyreY, tyreZ, meshIndex);
if (!(player->pos[1] < height) && !((2 * boundingBoxSize) < (player->pos[1] - height))) {
tyre->baseHeight = height;

View File

@ -26,7 +26,7 @@ void adjust_pos_orthogonally(Vec3f, f32, Vec3f, f32);
s32 detect_tyre_collision(KartTyre*);
u16 actor_terrain_collision(Collision*, f32, f32, f32, f32, f32, f32, f32);
u16 check_bounding_collision(Collision*, f32, f32, f32, f32);
f32 spawn_actor_on_surface(f32, f32, f32);
f32 get_surface_height(f32, f32, f32);
void set_vtx_buffer(uintptr_t, u32, u32);
s32 is_line_intersecting_rectangle(s16, s16, s16, s16, s16, s16, s16, s16);
s32 is_triangle_intersecting_bounding_box(s16, s16, s16, s16, u16);

View File

@ -420,10 +420,19 @@ void func_802B5CAC(s16 arg0, s16 arg1, Vec3f arg2) {
}
void func_802B5D30(s16 arg0, s16 arg1, s32 arg2) {
func_802B5D64((Lights1*) 0x9000000, arg0, arg1, arg2);
set_course_lighting((Lights1*) 0x9000000, arg0, arg1, arg2);
}
void func_802B5D64(Lights1* addr, s16 arg1, s16 arg2, s32 arg3) {
/**
* @brief Set the course lighting object
* Uses a directional light
*
* @param addr
* @param arg1
* @param arg2
* @param arg3
*/
void set_course_lighting(Lights1* addr, s16 arg1, s16 arg2, s32 arg3) {
u32 segment = SEGMENT_NUMBER2(addr);
u32 offset = SEGMENT_OFFSET(addr);
UNUSED s32 pad;
@ -1175,7 +1184,7 @@ f32 is_within_render_distance(Vec3f cameraPos, Vec3f objectPos, u16 orientationY
}
// No idea if arg1 is actually a Mat4 or not, but since this function is unused
// its impossible to know with certainty either way, very close of func_802B5D64
// its impossible to know with certainty either way, very close of set_course_lighting
UNUSED void func_802B8414(uintptr_t addr, Mat4 arg1, s16 arg2, s16 arg3, s32 arg4) {
u32 segment = SEGMENT_NUMBER2(addr);
u32 offset = SEGMENT_OFFSET(addr);

View File

@ -40,7 +40,7 @@ void mtxf_s16_rotate_z(Mat4, s16);
void func_802B5B14(Vec3f b, Vec3s rotate); // unused
void func_802B5CAC(s16, s16, Vec3f);
void func_802B5D30(s16, s16, s32);
void func_802B5D64(Lights1*, s16, s16, s32);
void set_course_lighting(Lights1*, s16, s16, s32);
void mtxf_scale(Mat4, f32);
void mtxf_pos_rotation_xyz(Mat4, Vec3f, Vec3s);
void mtxf_translate_vec3f_mat3(Vec3f, Mat3);

View File

@ -1,9 +1,11 @@
#include <ultra64.h>
#include <macros.h>
#include <mk64.h>
#include <common_structs.h>
#include <defines.h>
#include <sounds.h>
#include <mk64.h>
#include <course.h>
#include "camera.h"
#include "waypoints.h"
#include "staff_ghosts.h"
@ -422,48 +424,48 @@ void func_8028EC98(s32 arg0) {
func_800029B0();
switch (arg0) {
case 0:
case 7:
case 8:
case 14:
case COURSE_MARIO_RACEWAY:
case COURSE_ROYAL_RACEWAY:
case COURSE_LUIGI_RACEWAY:
case COURSE_WARIO_STADIUM:
func_800C8EAC(3);
break;
case 10:
case COURSE_TOADS_TURNPIKE:
func_800C8EAC(21);
break;
case 4:
case 9:
case COURSE_YOSHI_VALLEY:
case COURSE_MOO_MOO_FARM:
func_800C8EAC(4);
break;
case 1:
case 15:
case 17:
case COURSE_CHOCO_MOUNTAIN:
case COURSE_BLOCK_FORT:
case COURSE_DOUBLE_DECK:
func_800C8EAC(5);
break;
case 11:
case COURSE_KALAMARI_DESERT:
func_800C8EAC(10);
break;
case 6:
case COURSE_KOOPA_BEACH:
func_800C8EAC(6);
break;
case 2:
case COURSE_BOWSER_CASTLE:
func_800C8EAC(9);
break;
case 3:
case COURSE_BANSHEE_BOARDWALK:
func_800C8EAC(7);
break;
case 5:
case 12:
case COURSE_FRAPPE_SNOWLAND:
case COURSE_SHERBET_LAND:
func_800C8EAC(8);
break;
case 13:
case COURSE_RAINBOW_ROAD:
func_800C8EAC(18);
break;
case 18:
case COURSE_DK_JUNGLE:
func_800C8EAC(19);
break;
case 16:
case 19:
case COURSE_SKYSCRAPER:
case COURSE_BIG_DONUT:
func_800C8EAC(25);
break;
}

View File

@ -947,7 +947,7 @@ void render_moo_moo_farm(struct UnkStruct_800DC5EC* arg0) {
s16 temp_s0 = arg0->pathCounter;
s16 playerDirection = arg0->playerDirection;
func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
set_course_lighting(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@ -1012,7 +1012,7 @@ void render_moo_moo_farm(struct UnkStruct_800DC5EC* arg0) {
void render_toads_turnpike(struct UnkStruct_800DC5EC* arg0) {
UNUSED s32 pad[13];
func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
set_course_lighting(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@ -1039,7 +1039,7 @@ void render_toads_turnpike(struct UnkStruct_800DC5EC* arg0) {
void render_kalimari_desert(struct UnkStruct_800DC5EC* arg0) {
func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
set_course_lighting(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@ -1168,7 +1168,7 @@ void render_wario_stadium(struct UnkStruct_800DC5EC* arg0) {
void render_block_fort(UNUSED struct UnkStruct_800DC5EC* arg0) {
func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
set_course_lighting(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@ -1177,7 +1177,7 @@ void render_block_fort(UNUSED struct UnkStruct_800DC5EC* arg0) {
}
void render_skyscraper(UNUSED struct UnkStruct_800DC5EC* arg0) {
func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
set_course_lighting(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@ -1201,7 +1201,7 @@ void render_skyscraper(UNUSED struct UnkStruct_800DC5EC* arg0) {
void render_double_deck(UNUSED struct UnkStruct_800DC5EC* arg0) {
func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
set_course_lighting(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@ -1213,8 +1213,8 @@ void render_double_deck(UNUSED struct UnkStruct_800DC5EC* arg0) {
void render_dks_jungle_parkway(struct UnkStruct_800DC5EC* arg0) {
func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
func_802B5D64(&D_800DC610[1], D_802B87D4, D_802B87D0, 1);
set_course_lighting(D_800DC610, D_802B87D4, 0, 1);
set_course_lighting(&D_800DC610[1], D_802B87D4, D_802B87D0, 1);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK | G_LIGHTING);
@ -1239,7 +1239,7 @@ void render_big_donut(struct UnkStruct_800DC5EC* arg0) {
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
set_course_lighting(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
@ -1259,7 +1259,13 @@ void render_big_donut(struct UnkStruct_800DC5EC* arg0) {
gSPDisplayList(gDisplayListHead++, ((uintptr_t) 0x07000230));
}
void func_8029569C(void) {
/**
* @brief The game has two versions of each course. One for normal gameplay and another for credits.
* The credits version is not split into segments so that the game camera can fly around the whole course.
*
*/
void render_course_credits(void) {
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
gSPDisplayList(gDisplayListHead++, d_course_mario_raceway_dl_9348);
@ -1322,16 +1328,20 @@ void func_8029569C(void) {
gSPDisplayList(gDisplayListHead++, d_course_sherbet_land_dl_0);
break;
}
#else
#endif
}
void render_course(struct UnkStruct_800DC5EC* arg0) {
func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
set_course_lighting(D_800DC610, D_802B87D4, 0, 1);
if (creditsRenderMode) {
func_8029569C();
render_course_credits();
return;
}
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
render_mario_raceway(arg0);
@ -1394,6 +1404,9 @@ void render_course(struct UnkStruct_800DC5EC* arg0) {
render_big_donut(arg0);
break;
}
#else
#endif
}
void func_80295BF8(s32 playerIndex) {
@ -1431,7 +1444,11 @@ void func_80295D6C(void) {
D_8015F6F6 = -3000;
}
void func_80295D88(void) {
/**
* @brief Also sets vertex colours for the course vtx data
*
*/
void course_generate_collision_mesh(void) {
gNumActors = 0;
gCourseMinX = 0;
@ -1450,6 +1467,7 @@ void func_80295D88(void) {
gCollisionMesh = (CollisionTriangle*) gNextFreeMemoryAddress;
D_800DC5BC = 0;
D_800DC5C8 = 0;
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
// d_course_mario_raceway_packed_dl_1140
@ -1514,7 +1532,7 @@ void func_80295D88(void) {
D_8015F8E4 = -80.0f;
break;
case COURSE_YOSHI_VALLEY:
func_802B5D64(&d_course_yoshi_valley_lights4, -0x38F0, 0x1C70, 1);
set_course_lighting(&d_course_yoshi_valley_lights4, -0x38F0, 0x1C70, 1);
parse_course_displaylists((uintptr_t) d_course_yoshi_valley_addr);
func_80295C6C();
D_8015F8E4 = gCourseMinY - 10.0f;
@ -1655,10 +1673,13 @@ void func_80295D88(void) {
D_8015F8E4 = 100.0f;
break;
}
#else
#endif
}
void func_802966A0(void) {
void course_update_water(void) {
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_KOOPA_BEACH:
// clang-format off
@ -1735,6 +1756,9 @@ void func_802966A0(void) {
evaluate_collision_players_palm_trees();
break;
}
#else
#endif
}
void func_802969F8(void) {

View File

@ -28,14 +28,14 @@ void render_skyscraper(struct UnkStruct_800DC5EC*);
void render_double_deck(struct UnkStruct_800DC5EC*);
void render_dks_jungle_parkway(struct UnkStruct_800DC5EC*);
void render_big_donut(struct UnkStruct_800DC5EC*);
void func_8029569C(void);
void render_course_credits(void);
void render_course(struct UnkStruct_800DC5EC*);
void func_80295BF8(s32);
void func_80295C6C(void);
void func_80295D50(s16, s16);
void func_80295D6C(void);
void func_80295D88(void);
void func_802966A0(void);
void course_generate_collision_mesh(void);
void course_update_water(void);
void func_802969F8(void);
extern s32 D_8015F59C;

View File

@ -2,6 +2,7 @@
#include <macros.h>
#include <PR/gbi.h>
#include <mk64.h>
#include <course.h>
#include "skybox_and_splitscreen.h"
#include "code_800029B0.h"
@ -309,14 +310,18 @@ void func_802A4300(void) {
gDPPipeSync(gDisplayListHead++);
gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE);
}
/**
* @note that the second half of the s16 value is truncated (unused). So if you want red, put 255. But the original
* programmers might have put something like `42,239`, in bytes: b1010010011111111 The extra bits are skipped and the
* game only reads `11111111` (255)
*/
struct Skybox {
s16 unk0;
s16 unk2;
s16 unk4;
s16 unk6;
s16 unk8;
s16 unkA;
s16 topRed;
s16 topGreen;
s16 topBlue;
s16 bottomRed;
s16 bottomGreen;
s16 bottomBlue;
};
UNUSED Gfx D_802B8A90[] = {
@ -330,12 +335,12 @@ UNUSED Gfx D_802B8A90[] = {
gsSPEndDisplayList(),
};
struct Skybox sSkyColors[] = {
struct Skybox sTopSkyBoxColors[] = {
#include "assets/course_metadata/sSkyColors.inc.c"
};
// struct Skybox sSkyColors[] = {
// struct Skybox sTopSkyBoxColors[] = {
// {128, 4280, 6136, 216, 7144, 32248},
// {255, 255, 255, 255, 255, 255},
// {48, 1544, 49528, 0, 0, 0},
@ -359,11 +364,11 @@ struct Skybox sSkyColors[] = {
// {238, 144, 255, 255, 224, 240},
// };
struct Skybox sSkyColors2[] = {
struct Skybox sBottomSkyBoxColors[] = {
#include "assets/course_metadata/sSkyColors2.inc.c"
};
void func_802A450C(Vtx* skybox) {
void course_set_skybox_colours(Vtx* skybox) {
s32 i;
if (D_800DC5BC != 0) {
@ -400,30 +405,42 @@ void func_802A450C(Vtx* skybox) {
}
return;
}
skybox[0].v.cn[0] = sSkyColors[gCurrentCourseId].unk0;
skybox[0].v.cn[1] = sSkyColors[gCurrentCourseId].unk2;
skybox[0].v.cn[2] = sSkyColors[gCurrentCourseId].unk4;
skybox[1].v.cn[0] = sSkyColors[gCurrentCourseId].unk6;
skybox[1].v.cn[1] = sSkyColors[gCurrentCourseId].unk8;
skybox[1].v.cn[2] = sSkyColors[gCurrentCourseId].unkA;
skybox[2].v.cn[0] = sSkyColors[gCurrentCourseId].unk6;
skybox[2].v.cn[1] = sSkyColors[gCurrentCourseId].unk8;
skybox[2].v.cn[2] = sSkyColors[gCurrentCourseId].unkA;
skybox[3].v.cn[0] = sSkyColors[gCurrentCourseId].unk0;
skybox[3].v.cn[1] = sSkyColors[gCurrentCourseId].unk2;
skybox[3].v.cn[2] = sSkyColors[gCurrentCourseId].unk4;
skybox[4].v.cn[0] = sSkyColors2[gCurrentCourseId].unk0;
skybox[4].v.cn[1] = sSkyColors2[gCurrentCourseId].unk2;
skybox[4].v.cn[2] = sSkyColors2[gCurrentCourseId].unk4;
skybox[5].v.cn[0] = sSkyColors2[gCurrentCourseId].unk6;
skybox[5].v.cn[1] = sSkyColors2[gCurrentCourseId].unk8;
skybox[5].v.cn[2] = sSkyColors2[gCurrentCourseId].unkA;
skybox[6].v.cn[0] = sSkyColors2[gCurrentCourseId].unk6;
skybox[6].v.cn[1] = sSkyColors2[gCurrentCourseId].unk8;
skybox[6].v.cn[2] = sSkyColors2[gCurrentCourseId].unkA;
skybox[7].v.cn[0] = sSkyColors2[gCurrentCourseId].unk0;
skybox[7].v.cn[1] = sSkyColors2[gCurrentCourseId].unk2;
skybox[7].v.cn[2] = sSkyColors2[gCurrentCourseId].unk4;
#if !ENABLE_CUSTOM_COURSE_ENGINE
skybox[0].v.cn[0] = sTopSkyBoxColors[gCurrentCourseId].topRed;
skybox[0].v.cn[1] = sTopSkyBoxColors[gCurrentCourseId].topGreen;
skybox[0].v.cn[2] = sTopSkyBoxColors[gCurrentCourseId].topBlue;
skybox[1].v.cn[0] = sTopSkyBoxColors[gCurrentCourseId].bottomRed;
skybox[1].v.cn[1] = sTopSkyBoxColors[gCurrentCourseId].bottomGreen;
skybox[1].v.cn[2] = sTopSkyBoxColors[gCurrentCourseId].bottomBlue;
skybox[2].v.cn[0] = sTopSkyBoxColors[gCurrentCourseId].bottomRed;
skybox[2].v.cn[1] = sTopSkyBoxColors[gCurrentCourseId].bottomGreen;
skybox[2].v.cn[2] = sTopSkyBoxColors[gCurrentCourseId].bottomBlue;
skybox[3].v.cn[0] = sTopSkyBoxColors[gCurrentCourseId].topRed;
skybox[3].v.cn[1] = sTopSkyBoxColors[gCurrentCourseId].topGreen;
skybox[3].v.cn[2] = sTopSkyBoxColors[gCurrentCourseId].topBlue;
skybox[4].v.cn[0] = sBottomSkyBoxColors[gCurrentCourseId].topRed;
skybox[4].v.cn[1] = sBottomSkyBoxColors[gCurrentCourseId].topGreen;
skybox[4].v.cn[2] = sBottomSkyBoxColors[gCurrentCourseId].topBlue;
skybox[5].v.cn[0] = sBottomSkyBoxColors[gCurrentCourseId].bottomRed;
skybox[5].v.cn[1] = sBottomSkyBoxColors[gCurrentCourseId].bottomGreen;
skybox[5].v.cn[2] = sBottomSkyBoxColors[gCurrentCourseId].bottomBlue;
skybox[6].v.cn[0] = sBottomSkyBoxColors[gCurrentCourseId].bottomRed;
skybox[6].v.cn[1] = sBottomSkyBoxColors[gCurrentCourseId].bottomGreen;
skybox[6].v.cn[2] = sBottomSkyBoxColors[gCurrentCourseId].bottomBlue;
skybox[7].v.cn[0] = sBottomSkyBoxColors[gCurrentCourseId].topRed;
skybox[7].v.cn[1] = sBottomSkyBoxColors[gCurrentCourseId].topGreen;
skybox[7].v.cn[2] = sBottomSkyBoxColors[gCurrentCourseId].topBlue;
#else
#endif
}
void func_802A487C(Vtx* arg0, UNUSED struct UnkStruct_800DC5EC* arg1, UNUSED s32 arg2, UNUSED s32 arg3,
@ -457,11 +474,11 @@ void func_802A4A0C(Vtx* vtx, struct UnkStruct_800DC5EC* arg1, UNUSED s32 arg2, U
Vec3f sp5C;
f32 sp58;
func_802A450C(vtx);
course_set_skybox_colours(vtx);
sp5C[0] = 0.0f;
sp5C[1] = 0.0f;
sp5C[2] = 30000.0f;
func_802B5564(matrix1, &sp128, camera->unk_B4, gScreenAspect, D_80150150, D_8015014C, 1.0f);
func_802B5564(matrix1, &sp128, camera->unk_B4, gScreenAspect, gCourseNearPersp, gCourseFarPersp, 1.0f);
func_802B5794(matrix2, camera->pos, camera->lookAt);
mtxf_multiplication(matrix3, matrix1, matrix2);
@ -500,10 +517,10 @@ void func_802A4A0C(Vtx* vtx, struct UnkStruct_800DC5EC* arg1, UNUSED s32 arg2, U
}
}
void func_802A4D18(void) {
void set_perspective_and_aspect_ratio(void) {
if (gGamestate != 4) {
D_8015014C = 6800.0f;
D_80150150 = 3.0f;
gCourseFarPersp = 6800.0f;
gCourseNearPersp = 3.0f;
} else {
switch (gCurrentCourseId) {
case COURSE_BOWSER_CASTLE:
@ -511,21 +528,21 @@ void func_802A4D18(void) {
case COURSE_RAINBOW_ROAD:
case COURSE_BLOCK_FORT:
case COURSE_SKYSCRAPER:
D_8015014C = 2700.0f;
D_80150150 = 2.0f;
gCourseFarPersp = 2700.0f;
gCourseNearPersp = 2.0f;
break;
case COURSE_CHOCO_MOUNTAIN:
case COURSE_DOUBLE_DECK:
D_8015014C = 1500.0f;
D_80150150 = 2.0f;
gCourseFarPersp = 1500.0f;
gCourseNearPersp = 2.0f;
break;
case COURSE_KOOPA_BEACH:
D_8015014C = 5000.0f;
D_80150150 = 1.0f;
gCourseFarPersp = 5000.0f;
gCourseNearPersp = 1.0f;
break;
case COURSE_WARIO_STADIUM:
D_8015014C = 4800.0f;
D_80150150 = 10.0f;
gCourseFarPersp = 4800.0f;
gCourseNearPersp = 10.0f;
break;
case COURSE_MARIO_RACEWAY:
case COURSE_YOSHI_VALLEY:
@ -536,16 +553,16 @@ void func_802A4D18(void) {
case COURSE_TOADS_TURNPIKE:
case COURSE_SHERBET_LAND:
case COURSE_DK_JUNGLE:
D_8015014C = 4500.0f;
D_80150150 = 9.0f;
gCourseFarPersp = 4500.0f;
gCourseNearPersp = 9.0f;
break;
case COURSE_KALAMARI_DESERT:
D_8015014C = 7000.0f;
D_80150150 = 10.0f;
gCourseFarPersp = 7000.0f;
gCourseNearPersp = 10.0f;
break;
default:
D_8015014C = 6800.0f;
D_80150150 = 3.0f;
gCourseFarPersp = 6800.0f;
gCourseNearPersp = 3.0f;
break;
}
}
@ -785,9 +802,10 @@ void render_player_one_1p_screen(void) {
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
#ifdef VERSION_EU
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], sp9C, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f);
#else
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, gCourseNearPersp, gCourseFarPersp,
1.0f);
#endif
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]),
@ -847,9 +865,10 @@ void render_player_one_2p_screen_vertical(void) {
func_802A3730(D_800DC5EC);
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
#ifdef VERSION_EU
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], sp9C, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f);
#else
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, gCourseNearPersp, gCourseFarPersp,
1.0f);
#endif
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]),
@ -913,9 +932,10 @@ void render_player_two_2p_screen_vertical(void) {
#endif
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
#ifdef VERSION_EU
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], sp9C, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f);
#else
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], gScreenAspect, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], gScreenAspect, gCourseNearPersp, gCourseFarPersp,
1.0f);
#endif
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[1]),
@ -975,9 +995,10 @@ void render_player_one_2p_screen_horizontal(void) {
#endif
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
#ifdef VERSION_EU
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], sp9C, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f);
#else
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, gCourseNearPersp, gCourseFarPersp,
1.0f);
#endif
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]),
@ -1038,9 +1059,10 @@ void render_player_two_2p_screen_horizontal(void) {
#endif
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
#ifdef VERSION_EU
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], sp9C, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f);
#else
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], gScreenAspect, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], gScreenAspect, gCourseNearPersp, gCourseFarPersp,
1.0f);
#endif
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[1]),
@ -1097,9 +1119,10 @@ void render_player_one_3p_4p_screen(void) {
func_802A3730(D_800DC5EC);
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
#ifdef VERSION_EU
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], sp9C, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f);
#else
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, gCourseNearPersp, gCourseFarPersp,
1.0f);
#endif
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]),
@ -1156,9 +1179,10 @@ void render_player_two_3p_4p_screen(void) {
func_802A3730(D_800DC5F0);
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
#ifdef VERSION_EU
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], sp9C, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f);
#else
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], gScreenAspect, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[1], &perspNorm, gCameraZoom[1], gScreenAspect, gCourseNearPersp, gCourseFarPersp,
1.0f);
#endif
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[1]),
@ -1216,9 +1240,10 @@ void render_player_three_3p_4p_screen(void) {
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
#ifdef VERSION_EU
guPerspective(&gGfxPool->mtxPersp[2], &perspNorm, gCameraZoom[2], sp9C, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[2], &perspNorm, gCameraZoom[2], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f);
#else
guPerspective(&gGfxPool->mtxPersp[2], &perspNorm, gCameraZoom[2], gScreenAspect, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[2], &perspNorm, gCameraZoom[2], gScreenAspect, gCourseNearPersp, gCourseFarPersp,
1.0f);
#endif
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[2]),
@ -1285,9 +1310,10 @@ void render_player_four_3p_4p_screen(void) {
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
#ifdef VERSION_EU
guPerspective(&gGfxPool->mtxPersp[3], &perspNorm, gCameraZoom[3], sp9C, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[3], &perspNorm, gCameraZoom[3], sp9C, gCourseNearPersp, gCourseFarPersp, 1.0f);
#else
guPerspective(&gGfxPool->mtxPersp[3], &perspNorm, gCameraZoom[3], gScreenAspect, D_80150150, D_8015014C, 1.0f);
guPerspective(&gGfxPool->mtxPersp[3], &perspNorm, gCameraZoom[3], gScreenAspect, gCourseNearPersp, gCourseFarPersp,
1.0f);
#endif
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[3]),

View File

@ -28,9 +28,9 @@ s32 set_viewport2(void);
void set_viewport(void);
void select_framebuffer(void);
void func_802A4300(void);
void func_802A450C(Vtx*);
void course_set_skybox_colours(Vtx*);
void func_802A487C(Vtx*, struct UnkStruct_800DC5EC*, s32, s32, f32*);
void func_802A4D18(void);
void set_perspective_and_aspect_ratio(void);
void func_802A4EF4(void);
void func_802A5004(void);
void func_802A50EC(void);

View File

@ -2425,13 +2425,13 @@ void func_8004ED40(s32 arg0) {
void func_8004EE54(s32 arg0) {
if (gIsMirrorMode != 0) {
func_8004D4E8(D_8018D2C0[arg0] + D_8018D2F0, D_8018D2D8[arg0] + D_8018D2F8, (u8*) D_8018D240, (s32) D_8018D300,
(s32) D_8018D308, (s32) D_8018D310, 0x000000FF, (s32) D_8018D2B0, (s32) D_8018D2B8,
(s32) D_8018D2B0, (s32) D_8018D2B8);
func_8004D4E8(gMiniMapFinishLineX[arg0] + D_8018D2F0, gMiniMapFinishLineY[arg0] + D_8018D2F8, (u8*) D_8018D240,
(s32) D_8018D300, (s32) D_8018D308, (s32) D_8018D310, 0x000000FF, (s32) D_8018D2B0,
(s32) D_8018D2B8, (s32) D_8018D2B0, (s32) D_8018D2B8);
} else {
func_8004D37C(D_8018D2C0[arg0] + D_8018D2F0, D_8018D2D8[arg0] + D_8018D2F8, (u8*) D_8018D240, (s32) D_8018D300,
(s32) D_8018D308, (s32) D_8018D310, 0x000000FF, (s32) D_8018D2B0, (s32) D_8018D2B8,
(s32) D_8018D2B0, (s32) D_8018D2B8);
func_8004D37C(gMiniMapFinishLineX[arg0] + D_8018D2F0, gMiniMapFinishLineY[arg0] + D_8018D2F8, (u8*) D_8018D240,
(s32) D_8018D300, (s32) D_8018D308, (s32) D_8018D310, 0x000000FF, (s32) D_8018D2B0,
(s32) D_8018D2B8, (s32) D_8018D2B0, (s32) D_8018D2B8);
}
}
@ -2445,12 +2445,13 @@ void func_8004EF9C(s32 arg0) {
temp_t0, temp_v0, temp_t0);
}
void func_8004F020(s32 arg0) {
void render_mini_map_finish_line(s32 arg0) {
f32 var_f0;
f32 var_f2;
var_f2 = ((D_8018D2C0[arg0] + D_8018D2F0) - (D_8018D2B0 / 2)) + D_8018D2E0;
var_f0 = ((D_8018D2D8[arg0] + D_8018D2F8) - (D_8018D2B8 / 2)) + D_8018D2E8;
var_f2 = ((gMiniMapFinishLineX[arg0] + D_8018D2F0) - (D_8018D2B0 / 2)) + gMiniMapX;
var_f0 = ((gMiniMapFinishLineY[arg0] + D_8018D2F8) - (D_8018D2B8 / 2)) + gMiniMapY;
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) { /* irregular */
case COURSE_MARIO_RACEWAY:
var_f0 = var_f0 - 2.0;
@ -2463,6 +2464,9 @@ void func_8004F020(s32 arg0) {
break;
}
draw_hud_2d_texture_8x8(var_f2, var_f0, (u8*) common_texture_minimap_finish_line);
#else
#endif
}
#ifdef NON_MATCHING
@ -2479,10 +2483,10 @@ void func_8004F168(s32 arg0, s32 playerId, s32 characterId) {
Player* player = &gPlayerOne[playerId];
if (player->type & (1 << 15)) {
thing0 = player->pos[0] * D_8018D2A0;
thing1 = player->pos[2] * D_8018D2A0;
temp_a0 = ((D_8018D2C0[arg0] + D_8018D2F0) - (D_8018D2B0 / 2)) + D_8018D2E0 + (s16) (thing0);
temp_a1 = ((D_8018D2D8[arg0] + D_8018D2F8) - (D_8018D2B8 / 2)) + D_8018D2E8 + (s16) (thing1);
thing0 = player->pos[0] * gMiniMapMarkerScale;
thing1 = player->pos[2] * gMiniMapMarkerScale;
temp_a0 = ((gMiniMapFinishLineX[arg0] + D_8018D2F0) - (D_8018D2B0 / 2)) + gMiniMapX + (s16) (thing0);
temp_a1 = ((gMiniMapFinishLineY[arg0] + D_8018D2F8) - (D_8018D2B8 / 2)) + gMiniMapY + (s16) (thing1);
if (characterId != 8) {
if ((gGPCurrentRaceRankByPlayerId[playerId] == 0) && (gModeSelection != 3) && (gModeSelection != 1)) {
#if EXPLICIT_AND == 1
@ -3179,16 +3183,16 @@ void func_80051C60(s16 arg0, s32 arg1) {
Object* object;
if (D_801658FE == 0) {
if (gCurrentCourseId == 6) {
if (gCurrentCourseId == COURSE_KOOPA_BEACH) {
var_s5 = arg0;
} else if (gCurrentCourseId == 9) {
} else if (gCurrentCourseId == COURSE_MOO_MOO_FARM) {
var_s5 = arg0 - 0x10;
} else if (gCurrentCourseId == 4) {
} else if (gCurrentCourseId == COURSE_YOSHI_VALLEY) {
var_s5 = arg0 - 0x10;
} else {
var_s5 = arg0 + 0x10;
}
} else if (gCurrentCourseId == 6) {
} else if (gCurrentCourseId == COURSE_KOOPA_BEACH) {
var_s5 = arg0 * 2;
} else {
var_s5 = arg0 + 0x20;

View File

@ -294,7 +294,7 @@ void func_8004ED40(s32);
void func_8004EE54(s32);
void func_8004EF9C(s32);
void func_8004F020(s32);
void render_mini_map_finish_line(s32);
void func_8004F168(s32, s32, s32);
void func_8004F3E4(s32);
s32 func_8004F674(s32*, s32);
@ -441,8 +441,8 @@ extern Vec3su D_80183E80;
extern f32 D_8018CFEC;
extern f32 D_8018CFF4;
extern s16 D_8018D2E0;
extern s16 D_8018D2E8;
extern s16 gMiniMapX;
extern s16 gMiniMapY;
extern u8* D_8018D4BC;
extern u8* D_8018D4C0;

View File

@ -1,8 +1,10 @@
#include <ultra64.h>
#include <macros.h>
#include <mk64.h>
#include <common_structs.h>
#include <defines.h>
#include <mk64.h>
#include <course.h>
#include "code_800029B0.h"
#include "camera.h"
#include "math_util.h"

View File

@ -1,5 +1,6 @@
#include <defines.h>
#include <mk64.h>
#include <course.h>
#include "spawn_players.h"
#include "code_800029B0.h"
@ -111,7 +112,7 @@ void spawn_player(Player* player, s8 playerIndex, f32 startingRow, f32 startingC
}
player->pos[0] = startingRow;
ret = spawn_actor_on_surface(startingRow, arg4 + 50.0f, startingColumn) + player->boundingBoxSize;
ret = get_surface_height(startingRow, arg4 + 50.0f, startingColumn) + player->boundingBoxSize;
player->pos[2] = startingColumn;
player->pos[1] = ret;
player->oldPos[0] = startingRow;

View File

@ -1,9 +1,11 @@
#include <ultra64.h>
#include <macros.h>
#include <mk64.h>
#include <common_structs.h>
#include <defines.h>
#include <decode.h>
#include <mk64.h>
#include <course.h>
#include "main.h"
#include "code_800029B0.h"
#include "buffers.h"
@ -106,7 +108,7 @@ void func_80004FF8(void) {
void set_staff_ghost(void) {
u32 temp_v0; // Appears to be player total lap time.
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
temp_v0 = func_800B4E24(0) & 0xfffff;
@ -148,6 +150,9 @@ void set_staff_ghost(void) {
D_80162DD6 = 1;
D_80162DF4 = 1;
}
#else
#endif
}
s32 func_800051C4(void) {

View File

@ -2831,7 +2831,7 @@ void update_stars(s32 arg0, Camera* camera, StarData* starList) {
UNUSED void func_80078C68() {
}
void func_80078C70(s32 arg0) {
void course_update_clouds(s32 arg0) {
s32 sp1C;
Camera* camera;
@ -2868,6 +2868,7 @@ void func_80078C70(s32 arg0) {
D_8018D210 = (-(D_8018D200 / 2) * 0xB6) - 0x71C;
D_8018D1E8 = 1.7578125 / D_8018D200;
D_8018D218 = 0xA0;
#if !ENABLE_CUSTOM_COURSE_ENGINE
switch (gCurrentCourseId) { /* switch 2 */
case COURSE_MARIO_RACEWAY: /* switch 2 */
// Uses Luigi Raceway's clouds for display purposes?
@ -2908,6 +2909,9 @@ void func_80078C70(s32 arg0) {
break;
}
}
#else
#endif
}
void func_80078F64(void) {
@ -2953,7 +2957,7 @@ void func_80079114(s32 objectIndex, s32 arg1, s32 arg2) {
if (gObjectList[objectIndex].state >= 2) {
if ((u8) gObjectList[objectIndex].unk_0D8 == 1) {
if (arg1 == 0) {
func_80074894(objectIndex, D_8018C028);
func_80074894(objectIndex, gLakituTexturePtr);
return;
}
a = gIndexLakituList[0];
@ -2964,13 +2968,13 @@ void func_80079114(s32 objectIndex, s32 arg1, s32 arg2) {
}
switch (arg2) {
case 0:
func_800748F4(objectIndex, D_8018C028);
func_800748F4(objectIndex, gLakituTexturePtr);
break;
case 1:
func_800748C4(objectIndex, D_8018C028);
func_800748C4(objectIndex, gLakituTexturePtr);
break;
case 2:
func_80074894(objectIndex, D_8018C028);
func_80074894(objectIndex, gLakituTexturePtr);
break;
}
}
@ -3094,7 +3098,7 @@ void init_obj_lakitu_red_flag(s32 objectIndex, s32 playerIndex) {
init_texture_object(objectIndex, (u8*) common_tlut_lakitu_checkered_flag, gTextureLakituCheckeredFlag01, 0x48U,
(u16) 0x00000038);
object = &gObjectList[objectIndex];
object->activeTexture = D_8018C028;
object->activeTexture = gLakituTexturePtr;
object->vertex = common_vtx_also_lakitu;
object->pos[2] = 5000.0f;
object->pos[1] = 5000.0f;
@ -3340,7 +3344,7 @@ void func_8007A060(s32 objectIndex, s32 playerIndex) {
init_texture_object(objectIndex, (u8*) common_tlut_lakitu_second_lap, gTextureLakituSecondLap01, 0x48U,
(u16) 0x00000038);
object = &gObjectList[objectIndex];
object->activeTexture = D_8018C028;
object->activeTexture = gLakituTexturePtr;
object->vertex = common_vtx_also_lakitu;
object->pos[2] = 5000.0f;
object->pos[1] = 5000.0f;
@ -3389,7 +3393,7 @@ void func_8007A228(s32 objectIndex, s32 playerIndex) {
init_texture_object(objectIndex, (u8*) common_tlut_lakitu_final_lap, gTextureLakituFinalLap01, 0x48U,
(u16) 0x00000038);
object = &gObjectList[objectIndex];
object->activeTexture = D_8018C028;
object->activeTexture = gLakituTexturePtr;
object->vertex = common_vtx_also_lakitu;
object->pos[2] = 5000.0f;
object->pos[1] = 5000.0f;
@ -3436,7 +3440,7 @@ void func_8007A3F0(s32 objectIndex, s32 arg1) {
func_800791F0(objectIndex, arg1);
init_texture_object(objectIndex, (u8*) common_tlut_lakitu_reverse, gTextureLakituReverse01, 0x48U,
(u16) 0x00000038);
gObjectList[objectIndex].activeTexture = D_8018C028;
gObjectList[objectIndex].activeTexture = gLakituTexturePtr;
gObjectList[objectIndex].vertex = common_vtx_also_lakitu;
gObjectList[objectIndex].pos[2] = var;
gObjectList[objectIndex].pos[1] = var;
@ -3584,7 +3588,7 @@ void func_8007AA44(s32 playerId) {
func_8007A910(playerId);
objectIndex = gIndexLakituList[playerId];
D_8018C028 = D_80183FA8[playerId];
gLakituTexturePtr = D_80183FA8[playerId];
switch (gObjectList[objectIndex].unk_0D8) {
case 1:
func_80079114(objectIndex, playerId, 2);
@ -6054,7 +6058,7 @@ void func_80080E8C(s32 objectIndex1, s32 objectIndex2, s32 arg2) {
gObjectList[objectIndex1].velocity[2] = coss(anAngle) * 0.6;
}
#else
GLOBAL_ASM("asm/non_matchings/update_objects/func_80080E8C.s")
GLOBAL_ASM("asm/non_matchings/update_objects/func_80080E8C.s")
#endif
void func_80080FEC(s32 arg0) {
@ -6764,7 +6768,7 @@ void func_80082F1C(s32 objectIndex, s32 arg1) {
set_obj_direction_angle(objectIndex, 0U, test->rot, 0U);
}
#else
GLOBAL_ASM("asm/non_matchings/update_objects/func_80082F1C.s")
GLOBAL_ASM("asm/non_matchings/update_objects/func_80082F1C.s")
#endif
void func_80083018(s32 objectIndex, s32 arg1) {
@ -7840,7 +7844,7 @@ void func_80086074(s32 objectIndex, s32 arg1) {
func_80085BB4(objectIndex);
}
#else
GLOBAL_ASM("asm/non_matchings/update_objects/func_80086074.s")
GLOBAL_ASM("asm/non_matchings/update_objects/func_80086074.s")
#endif
void func_80086110(s32 objectIndex, s32 arg1) {

View File

@ -181,7 +181,7 @@ void func_800788F8(s32, u16, Camera*);
void update_clouds(s32, Camera*, CloudData*);
void update_stars(s32, Camera*, StarData*);
void func_80078C68(void);
void func_80078C70(s32);
void course_update_clouds(s32);
void func_80078F64(void);
void func_80079054(s32);
void func_80079084(s32);