Fix some of the memory allocation in framebuffers (#182)

* Fix some of the memory allocation in framebuffers

Also includes a the questionable change of undoing a previously
 made match for func_80027A20. The changes made here remove an
 AVOID_UB usage and (I would argue) is therefore more "correct",
 but undoing a byte-for-byte match is admittedly bad.

Also adds in some header files and updates some not-quite-right
 decomps to be slighly more accurate.

Signed-off-by: Taggerung <tyler.taggerung@gmail.com>
This commit is contained in:
Tyler McGavran 2022-08-15 01:47:11 -04:00 committed by GitHub
parent 2fe6c6a2f9
commit 7d23fcc063
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 546 additions and 448 deletions

View File

@ -513,14 +513,6 @@ typedef struct
/* 0x7F */ u8 checksum;
} struct_8018EE10_entry; // size = 0x80
typedef struct {
char unk_00[0x920];
} struct_D_802DFB80; // size = 0x920
typedef struct {
char unk_00[0x1000];
} struct_D_802BFB80;
typedef struct {
/* 0x00 */ u16 red;
/* 0x02 */ u16 green;

View File

@ -12,10 +12,6 @@ void func_802B6540(f32* arg0, f32 arg1, f32 arg2, f32 arg3, s16 arg4);
void func_80295BF8(s32 arg0);
void func_8005D6C0(Player* player);
void func_8006B7E4(Player* player, s32 arg1);
void func_8002D268(Player* player, s32 arg1, s8 arg2, s8 arg3);
void func_8002934C(Player* player, s32 arg1, s8 arg2, s8 arg3);
void func_80027A20(Player* player, s8 arg1, s8 arg2, s32 arg3);
void func_80027040(Player* player, s8 arg1, s8 arg2, s8 arg3, s32 arg4);
void func_800267AC(Player* player, s8 arg1, s8 arg2);
void func_8005D290(void);
// TODO: should rot, arg4, and arg5 be rotx, roty, and rotz?

View File

@ -91,8 +91,6 @@ extern Mtx D_80183D60[];
extern struct_D_8018CE10 D_8018CE10[];
extern struct_D_802874D8 D_802874D8;
//extern struct_D_802DFB80 D_802DFB80[][8];
//extern struct_D_802BFB80 D_802BFB80[][8];
//extern struct GfxPool *gGfxPool; // D_8014EF40

33
mk64.ld
View File

@ -344,22 +344,23 @@ SECTIONS
}
END_SEG(code_8028DF00)
BEGIN_NOLOAD(code_8028DF00) {
BUILD_DIR/src/race_logic.o(.bss);
BUILD_DIR/src/actors.o(.bss);
BUILD_DIR/src/memory.o(.bss);
BUILD_DIR/src/framebuffers.o(.bss*);
BUILD_DIR/src/audio/synthesis.o(.bss*);
BUILD_DIR/asm/bss_audio.o(.bss*);
. = ALIGN(0x8);
BUILD_DIR/asm/bss_sptask_audio.o(.bss);
}
END_NOLOAD(code_8028DF00)
_code_8028DF00SegmentNoloadSize = SIZEOF(.code_8028DF00.noload) + 0x10;
_code_8028DF00SegmentNoloadSizeHi = _code_8028DF00SegmentNoloadSize >> 16;
_code_8028DF00SegmentNoloadSizeLo = _code_8028DF00SegmentNoloadSize & 0xFFFF;
BEGIN_NOLOAD(code_8028DF00)
{
BUILD_DIR/src/race_logic.o(.bss);
BUILD_DIR/src/actors.o(.bss);
BUILD_DIR/src/memory.o(.bss);
BUILD_DIR/src/framebuffers.o(.bss*);
BUILD_DIR/src/audio/synthesis.o(.bss*);
BUILD_DIR/asm/bss_audio.o(.bss*);
. = ALIGN(0x8);
BUILD_DIR/asm/bss_sptask_audio.o(.bss);
}
END_NOLOAD(code_8028DF00)
_code_8028DF00SegmentNoloadSize = SIZEOF(.code_8028DF00.noload) + 0x10;
_code_8028DF00SegmentNoloadSizeHi = _code_8028DF00SegmentNoloadSize >> 16;
_code_8028DF00SegmentNoloadSizeLo = _code_8028DF00SegmentNoloadSize & 0xFFFF;
/* 0x80280000 123640-12AAE0 [74A0] */
BEGIN_SEG(code_80280000, SEG_80280000)

View File

@ -12,3 +12,5 @@
"PHYSICAL_.*" = "unsigned int"
"TIME_TRIAL_.*" = "int"
"TEXT_.*" = "int"
"OS_.*" = "int"
"SEGMENT_.*" = "int"

View File

@ -298,13 +298,13 @@ void func_80020524(void) {
func_80027560(D_80164AD0[i], D_80164AB0[i], D_80164AC0[i], D_80164AC0[i], D_801651D0[D_80164AC0[i]][D_80164AB0[i]]);
mio0decode(&D_802DFB80[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1] * 0x920],
&D_802BFB80[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1] * 0x1000]);
mio0decode(&D_802DFB80[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]],
&D_802BFB80[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]]);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
mio0decode(&D_802DFB80[D_801651D0[D_80164ABE[D_800DDB58]][D_80164AAE[D_800DDB58]]][D_80164ABE[D_800DDB58]][D_80164AAE[D_800DDB58] * 0x920],
&D_802BFB80[D_801651D0[D_80164ABE[D_800DDB58]][D_80164AAE[D_800DDB58]]][D_80164ABE[D_800DDB58]][D_80164AAE[D_800DDB58] * 0x1000]);
mio0decode(&D_802DFB80[D_801651D0[D_80164ABE[D_800DDB58]][D_80164AAE[D_800DDB58]]][D_80164ABE[D_800DDB58]][D_80164AAE[D_800DDB58]],
&D_802BFB80[D_801651D0[D_80164ABE[D_800DDB58]][D_80164AAE[D_800DDB58]]][D_80164ABE[D_800DDB58]][D_80164AAE[D_800DDB58]]);
}
#ifdef MIPS_TO_C

206
src/code_80027040.h Normal file
View File

@ -0,0 +1,206 @@
#ifndef CODE_80027040_H
#define CODE_80027040_H
#include "macros.h"
#include "common_structs.h"
/* Function Prototypes */
void func_80027040(Player*, s8, s8, s8, s8);
void func_80027560(Player*, s8, s8, s8, s8);
void func_80027A20(Player*, s8, s8, s8);
void func_80027BDC(UNUSED Player*, s32, void*, u16);
void func_80027C74(UNUSED Player*, s32, void*, u16);
/* This is where I'd put my static data, if I had any */
extern u16 D_800DDEB0[];
extern u8 _kart_texturesSegmentRomStart[];
extern uintptr_t **gKartMarioTable0[];
extern uintptr_t **gKartLuigiTable0[];
extern uintptr_t **gKartYoshiTable0[];
extern uintptr_t **gKartToadTable0[];
extern uintptr_t **gKartDKTable0[];
extern uintptr_t **gKartWarioTable0[];
extern uintptr_t **gKartPeachTable0[];
extern uintptr_t **gKartBowserTable0[];
extern uintptr_t **gKartMarioTable1[];
extern uintptr_t **gKartLuigiTable1[];
extern uintptr_t **gKartYoshiTable1[];
extern uintptr_t **gKartToadTable1[];
extern uintptr_t **gKartDKTable1[];
extern uintptr_t **gKartWarioTable1[];
extern uintptr_t **gKartPeachTable1[];
extern uintptr_t **gKartBowserTable1[];
extern uintptr_t ***gKartTextureTable0[];
extern uintptr_t ***gKartTextureTable1[];
extern uintptr_t *gKartPalettes[];
extern uintptr_t *gKartTextureGroup18s[];
extern uintptr_t *gKartMarioGroup8[];
extern uintptr_t *gKartMarioGroup7[];
extern uintptr_t *gKartMarioGroup6[];
extern uintptr_t *gKartMarioGroup5[];
extern uintptr_t *gKartMarioGroup4[];
extern uintptr_t *gKartMarioGroup3[];
extern uintptr_t *gKartMarioGroup2[];
extern uintptr_t *gKartMarioGroup1[];
extern uintptr_t *gKartMarioGroup0[];
extern uintptr_t *gKartLuigiGroup8[];
extern uintptr_t *gKartLuigiGroup7[];
extern uintptr_t *gKartLuigiGroup6[];
extern uintptr_t *gKartLuigiGroup5[];
extern uintptr_t *gKartLuigiGroup4[];
extern uintptr_t *gKartLuigiGroup3[];
extern uintptr_t *gKartLuigiGroup2[];
extern uintptr_t *gKartLuigiGroup1[];
extern uintptr_t *gKartLuigiGroup0[];
extern uintptr_t *gKartYoshiGroup8[];
extern uintptr_t *gKartYoshiGroup7[];
extern uintptr_t *gKartYoshiGroup6[];
extern uintptr_t *gKartYoshiGroup5[];
extern uintptr_t *gKartYoshiGroup4[];
extern uintptr_t *gKartYoshiGroup3[];
extern uintptr_t *gKartYoshiGroup2[];
extern uintptr_t *gKartYoshiGroup1[];
extern uintptr_t *gKartYoshiGroup0[];
extern uintptr_t *gKartToadGroup8[];
extern uintptr_t *gKartToadGroup7[];
extern uintptr_t *gKartToadGroup6[];
extern uintptr_t *gKartToadGroup5[];
extern uintptr_t *gKartToadGroup4[];
extern uintptr_t *gKartToadGroup3[];
extern uintptr_t *gKartToadGroup2[];
extern uintptr_t *gKartToadGroup1[];
extern uintptr_t *gKartToadGroup0[];
extern uintptr_t *gKartDKGroup8[];
extern uintptr_t *gKartDKGroup7[];
extern uintptr_t *gKartDKGroup6[];
extern uintptr_t *gKartDKGroup5[];
extern uintptr_t *gKartDKGroup4[];
extern uintptr_t *gKartDKGroup3[];
extern uintptr_t *gKartDKGroup2[];
extern uintptr_t *gKartDKGroup1[];
extern uintptr_t *gKartDKGroup0[];
extern uintptr_t *gKartWarioGroup8[];
extern uintptr_t *gKartWarioGroup7[];
extern uintptr_t *gKartWarioGroup6[];
extern uintptr_t *gKartWarioGroup5[];
extern uintptr_t *gKartWarioGroup4[];
extern uintptr_t *gKartWarioGroup3[];
extern uintptr_t *gKartWarioGroup2[];
extern uintptr_t *gKartWarioGroup1[];
extern uintptr_t *gKartWarioGroup0[];
extern uintptr_t *gKartPeachGroup8[];
extern uintptr_t *gKartPeachGroup7[];
extern uintptr_t *gKartPeachGroup6[];
extern uintptr_t *gKartPeachGroup5[];
extern uintptr_t *gKartPeachGroup4[];
extern uintptr_t *gKartPeachGroup3[];
extern uintptr_t *gKartPeachGroup2[];
extern uintptr_t *gKartPeachGroup1[];
extern uintptr_t *gKartPeachGroup0[];
extern uintptr_t *gKartBowserGroup8[];
extern uintptr_t *gKartBowserGroup7[];
extern uintptr_t *gKartBowserGroup6[];
extern uintptr_t *gKartBowserGroup5[];
extern uintptr_t *gKartBowserGroup4[];
extern uintptr_t *gKartBowserGroup3[];
extern uintptr_t *gKartBowserGroup2[];
extern uintptr_t *gKartBowserGroup1[];
extern uintptr_t *gKartBowserGroup0[];
extern uintptr_t *gKartMarioGroup17[];
extern uintptr_t *gKartMarioGroup16[];
extern uintptr_t *gKartMarioGroup15[];
extern uintptr_t *gKartMarioGroup14[];
extern uintptr_t *gKartMarioGroup13[];
extern uintptr_t *gKartMarioGroup12[];
extern uintptr_t *gKartMarioGroup11[];
extern uintptr_t *gKartMarioGroup10[];
extern uintptr_t *gKartMarioGroup9[];
extern uintptr_t *gKartLuigiGroup17[];
extern uintptr_t *gKartLuigiGroup16[];
extern uintptr_t *gKartLuigiGroup15[];
extern uintptr_t *gKartLuigiGroup14[];
extern uintptr_t *gKartLuigiGroup13[];
extern uintptr_t *gKartLuigiGroup12[];
extern uintptr_t *gKartLuigiGroup11[];
extern uintptr_t *gKartLuigiGroup10[];
extern uintptr_t *gKartLuigiGroup9[];
extern uintptr_t *gKartYoshiGroup17[];
extern uintptr_t *gKartYoshiGroup16[];
extern uintptr_t *gKartYoshiGroup15[];
extern uintptr_t *gKartYoshiGroup14[];
extern uintptr_t *gKartYoshiGroup13[];
extern uintptr_t *gKartYoshiGroup12[];
extern uintptr_t *gKartYoshiGroup11[];
extern uintptr_t *gKartYoshiGroup10[];
extern uintptr_t *gKartYoshiGroup9[];
extern uintptr_t *gKartToadGroup17[];
extern uintptr_t *gKartToadGroup16[];
extern uintptr_t *gKartToadGroup15[];
extern uintptr_t *gKartToadGroup14[];
extern uintptr_t *gKartToadGroup13[];
extern uintptr_t *gKartToadGroup12[];
extern uintptr_t *gKartToadGroup11[];
extern uintptr_t *gKartToadGroup10[];
extern uintptr_t *gKartToadGroup9[];
extern uintptr_t *gKartDKGroup17[];
extern uintptr_t *gKartDKGroup16[];
extern uintptr_t *gKartDKGroup15[];
extern uintptr_t *gKartDKGroup14[];
extern uintptr_t *gKartDKGroup13[];
extern uintptr_t *gKartDKGroup12[];
extern uintptr_t *gKartDKGroup11[];
extern uintptr_t *gKartDKGroup10[];
extern uintptr_t *gKartDKGroup9[];
extern uintptr_t *gKartWarioGroup17[];
extern uintptr_t *gKartWarioGroup16[];
extern uintptr_t *gKartWarioGroup15[];
extern uintptr_t *gKartWarioGroup14[];
extern uintptr_t *gKartWarioGroup13[];
extern uintptr_t *gKartWarioGroup12[];
extern uintptr_t *gKartWarioGroup11[];
extern uintptr_t *gKartWarioGroup10[];
extern uintptr_t *gKartWarioGroup9[];
extern uintptr_t *gKartPeachGroup17[];
extern uintptr_t *gKartPeachGroup16[];
extern uintptr_t *gKartPeachGroup15[];
extern uintptr_t *gKartPeachGroup14[];
extern uintptr_t *gKartPeachGroup13[];
extern uintptr_t *gKartPeachGroup12[];
extern uintptr_t *gKartPeachGroup11[];
extern uintptr_t *gKartPeachGroup10[];
extern uintptr_t *gKartPeachGroup9[];
extern uintptr_t *gKartBowserGroup17[];
extern uintptr_t *gKartBowserGroup16[];
extern uintptr_t *gKartBowserGroup15[];
extern uintptr_t *gKartBowserGroup14[];
extern uintptr_t *gKartBowserGroup13[];
extern uintptr_t *gKartBowserGroup12[];
extern uintptr_t *gKartBowserGroup11[];
extern uintptr_t *gKartBowserGroup10[];
extern uintptr_t *gKartBowserGroup9[];
#endif

View File

@ -14,6 +14,7 @@ void func_800291E8();
void func_800291F0();
void func_800291F8();
void func_80029200(Player*, s8);
void func_8002934C(Player*, Camera*, s8, s8);
void func_8002A5F4(Vec3f, f32, Vec3f, f32, f32);
void func_8002AAC0(Player*);
void func_8002AB70(Player*);
@ -24,6 +25,7 @@ void func_8002B308(Player*, s8, s8);
void func_8002B5C0(Player*, s8, s8);
void func_8002B830(Player*, s8, s8);
void func_8002C11C(Player*);
void func_8002D268(Player*, Camera*, s8, s8);
void func_8002E4C4(Player*);
void func_80030FC8(Player*);
void func_80031F48(Player*, f32);

View File

@ -1,6 +1,7 @@
#include <ultra64.h>
#include "config.h"
#include "framebuffers.h"
u16 gRandomSeed16;
@ -8,12 +9,9 @@ u8 randomSeedPadding[216];
u8 frameBufferPadding[22544];
u8 D_802BFB80[77824];
u8 D_802D2B80[32768]; // Luigi raceway course path ghost
u8 D_802DAB80[20480];
u8 D_802DFB80[2][2][18688];
u16 D_802F1F80[2][4][2048];
struct_D_802BFB80 D_802BFB80[2][2][8];
struct_D_802DFB80 D_802DFB80[2][2][8];
u32 D_802F1F80[2][4][1024];
u16 gZBuffer[SCREEN_WIDTH * SCREEN_HEIGHT];

View File

@ -3,13 +3,68 @@
#include <PR/ultratypes.h>
#include "config.h"
#include "common_structs.h"
/*
* This type could reasonably be called decodedTexture or similar
* These are textures that have been passed through mio0decode
*
* According to http://ultra64.ca/files/documentation/online-manuals/man/app/te/us/tmf.html
* This is technically an array of u32's, but each u32 contains 8/4 pixels depending
* on pixel depth of the texure (4/8 bits respectively) so representing it as u8's should be fine
*/
typedef struct {
u8 pixel_index_array[0x1000];
} struct_D_802BFB80; // size = 0x1000
/*
* Texture prior to be being decoded via mio0decode
* Likely over-sized due to encoded textures having variable size
*/
typedef struct {
char unk_00[0x920];
} struct_D_802DFB80; // size = 0x920
typedef struct {
u16 red:5;
u16 green:5;
u16 blue:5;
u16 alpha:1;
} RGBA5551;
/*
* This type could reasonably be called activeCharacterPalette or similar
*
* Appears to be a combination of 2 different palettes:
* kart_palette appears to be the palette for all non-wheel elements of the kart (including the driver).
* wheel_palette then is the palette for the wheels
*
* kart_palette does not appear to be used 100% of the time, more testing is needed to figure out what's going on
* wheel_palette changes as you drive around while kart_palette is constant
*
* The term "palette" appears to be synonymous with "texture lookup table (TLUT)",
* at least as far as the N64 texture engine is concerned
* According to http://ultra64.ca/files/documentation/online-manuals/man/app/te/us/tlf.html
* palettes are techinally arrays of u32's, but I feel using a more meaningful data type
* helps with understanding
*/
typedef struct {
/* 0x000 */ RGBA5551 kart_palette[0xC0];
/* 0x180 */ RGBA5551 wheel_palette[0x40];
} struct_D_802F1F80; // size = 0x200
extern u16 gRandomSeed16;
extern u8 D_802BFB80[2][2][0x8000];
extern u8 D_802D2B80[32768];
extern u8 D_802DAB80[20480];
extern u8 D_802DFB80[2][2][18688];
extern u16 D_802F1F80[2][4][2048];
extern u8 randomSeedPadding[216];
extern u8 frameBufferPadding[22544];
extern struct_D_802BFB80 D_802BFB80[][2][8];
extern struct_D_802DFB80 D_802DFB80[][2][8];
/**
* SO
* It would be nice to define D_802F1F80 as ```struct_D_802F1F80 D_802F1F80[2][4][8]```.
* But due to some register allocation issues in func_80027A20 we have to define it in a different manner
**/
extern u32 D_802F1F80[][4][1024];
extern u16 gZBuffer[SCREEN_WIDTH * SCREEN_HEIGHT];

View File

@ -1,189 +1,10 @@
#include <ultra64.h>
#include <macros.h>
#include "main.h"
#include "variables.h"
#include "framebuffers.h"
#include "common_structs.h"
extern OSIoMesg gDmaIoMesg;
extern OSMesgQueue gDmaMesgQueue;
extern OSMesg gMainReceivedMesg;
extern u8 _kart_texturesSegmentRomStart[];
extern uintptr_t *gKartPalettes[];
// arrays?
extern u16 D_802F1F80[2][4][2048];
extern u8 D_802DFB80[2][2][18688];
extern u16 D_800DDEB0[];
/*
u16 D_800DDEB0[] = { // sizes
0x06c0, 0x06e0, 0x06e0, 0x0680, 0x07c0, 0x0700, 0x0680, 0x0910
};
*/
extern s32 gActiveScreenMode;
extern uintptr_t *gKartTextureGroup18s[];
extern uintptr_t *gKartMarioGroup8[];
extern uintptr_t *gKartMarioGroup7[];
extern uintptr_t *gKartMarioGroup6[];
extern uintptr_t *gKartMarioGroup5[];
extern uintptr_t *gKartMarioGroup4[];
extern uintptr_t *gKartMarioGroup3[];
extern uintptr_t *gKartMarioGroup2[];
extern uintptr_t *gKartMarioGroup1[];
extern uintptr_t *gKartMarioGroup0[];
extern uintptr_t *gKartLuigiGroup8[];
extern uintptr_t *gKartLuigiGroup7[];
extern uintptr_t *gKartLuigiGroup6[];
extern uintptr_t *gKartLuigiGroup5[];
extern uintptr_t *gKartLuigiGroup4[];
extern uintptr_t *gKartLuigiGroup3[];
extern uintptr_t *gKartLuigiGroup2[];
extern uintptr_t *gKartLuigiGroup1[];
extern uintptr_t *gKartLuigiGroup0[];
extern uintptr_t *gKartYoshiGroup8[];
extern uintptr_t *gKartYoshiGroup7[];
extern uintptr_t *gKartYoshiGroup6[];
extern uintptr_t *gKartYoshiGroup5[];
extern uintptr_t *gKartYoshiGroup4[];
extern uintptr_t *gKartYoshiGroup3[];
extern uintptr_t *gKartYoshiGroup2[];
extern uintptr_t *gKartYoshiGroup1[];
extern uintptr_t *gKartYoshiGroup0[];
extern uintptr_t *gKartToadGroup8[];
extern uintptr_t *gKartToadGroup7[];
extern uintptr_t *gKartToadGroup6[];
extern uintptr_t *gKartToadGroup5[];
extern uintptr_t *gKartToadGroup4[];
extern uintptr_t *gKartToadGroup3[];
extern uintptr_t *gKartToadGroup2[];
extern uintptr_t *gKartToadGroup1[];
extern uintptr_t *gKartToadGroup0[];
extern uintptr_t *gKartDKGroup8[];
extern uintptr_t *gKartDKGroup7[];
extern uintptr_t *gKartDKGroup6[];
extern uintptr_t *gKartDKGroup5[];
extern uintptr_t *gKartDKGroup4[];
extern uintptr_t *gKartDKGroup3[];
extern uintptr_t *gKartDKGroup2[];
extern uintptr_t *gKartDKGroup1[];
extern uintptr_t *gKartDKGroup0[];
extern uintptr_t *gKartWarioGroup8[];
extern uintptr_t *gKartWarioGroup7[];
extern uintptr_t *gKartWarioGroup6[];
extern uintptr_t *gKartWarioGroup5[];
extern uintptr_t *gKartWarioGroup4[];
extern uintptr_t *gKartWarioGroup3[];
extern uintptr_t *gKartWarioGroup2[];
extern uintptr_t *gKartWarioGroup1[];
extern uintptr_t *gKartWarioGroup0[];
extern uintptr_t *gKartPeachGroup8[];
extern uintptr_t *gKartPeachGroup7[];
extern uintptr_t *gKartPeachGroup6[];
extern uintptr_t *gKartPeachGroup5[];
extern uintptr_t *gKartPeachGroup4[];
extern uintptr_t *gKartPeachGroup3[];
extern uintptr_t *gKartPeachGroup2[];
extern uintptr_t *gKartPeachGroup1[];
extern uintptr_t *gKartPeachGroup0[];
extern uintptr_t *gKartBowserGroup8[];
extern uintptr_t *gKartBowserGroup7[];
extern uintptr_t *gKartBowserGroup6[];
extern uintptr_t *gKartBowserGroup5[];
extern uintptr_t *gKartBowserGroup4[];
extern uintptr_t *gKartBowserGroup3[];
extern uintptr_t *gKartBowserGroup2[];
extern uintptr_t *gKartBowserGroup1[];
extern uintptr_t *gKartBowserGroup0[];
extern uintptr_t *gKartMarioGroup17[];
extern uintptr_t *gKartMarioGroup16[];
extern uintptr_t *gKartMarioGroup15[];
extern uintptr_t *gKartMarioGroup14[];
extern uintptr_t *gKartMarioGroup13[];
extern uintptr_t *gKartMarioGroup12[];
extern uintptr_t *gKartMarioGroup11[];
extern uintptr_t *gKartMarioGroup10[];
extern uintptr_t *gKartMarioGroup9[];
extern uintptr_t *gKartLuigiGroup17[];
extern uintptr_t *gKartLuigiGroup16[];
extern uintptr_t *gKartLuigiGroup15[];
extern uintptr_t *gKartLuigiGroup14[];
extern uintptr_t *gKartLuigiGroup13[];
extern uintptr_t *gKartLuigiGroup12[];
extern uintptr_t *gKartLuigiGroup11[];
extern uintptr_t *gKartLuigiGroup10[];
extern uintptr_t *gKartLuigiGroup9[];
extern uintptr_t *gKartYoshiGroup17[];
extern uintptr_t *gKartYoshiGroup16[];
extern uintptr_t *gKartYoshiGroup15[];
extern uintptr_t *gKartYoshiGroup14[];
extern uintptr_t *gKartYoshiGroup13[];
extern uintptr_t *gKartYoshiGroup12[];
extern uintptr_t *gKartYoshiGroup11[];
extern uintptr_t *gKartYoshiGroup10[];
extern uintptr_t *gKartYoshiGroup9[];
extern uintptr_t *gKartToadGroup17[];
extern uintptr_t *gKartToadGroup16[];
extern uintptr_t *gKartToadGroup15[];
extern uintptr_t *gKartToadGroup14[];
extern uintptr_t *gKartToadGroup13[];
extern uintptr_t *gKartToadGroup12[];
extern uintptr_t *gKartToadGroup11[];
extern uintptr_t *gKartToadGroup10[];
extern uintptr_t *gKartToadGroup9[];
extern uintptr_t *gKartDKGroup17[];
extern uintptr_t *gKartDKGroup16[];
extern uintptr_t *gKartDKGroup15[];
extern uintptr_t *gKartDKGroup14[];
extern uintptr_t *gKartDKGroup13[];
extern uintptr_t *gKartDKGroup12[];
extern uintptr_t *gKartDKGroup11[];
extern uintptr_t *gKartDKGroup10[];
extern uintptr_t *gKartDKGroup9[];
extern uintptr_t *gKartWarioGroup17[];
extern uintptr_t *gKartWarioGroup16[];
extern uintptr_t *gKartWarioGroup15[];
extern uintptr_t *gKartWarioGroup14[];
extern uintptr_t *gKartWarioGroup13[];
extern uintptr_t *gKartWarioGroup12[];
extern uintptr_t *gKartWarioGroup11[];
extern uintptr_t *gKartWarioGroup10[];
extern uintptr_t *gKartWarioGroup9[];
extern uintptr_t *gKartPeachGroup17[];
extern uintptr_t *gKartPeachGroup16[];
extern uintptr_t *gKartPeachGroup15[];
extern uintptr_t *gKartPeachGroup14[];
extern uintptr_t *gKartPeachGroup13[];
extern uintptr_t *gKartPeachGroup12[];
extern uintptr_t *gKartPeachGroup11[];
extern uintptr_t *gKartPeachGroup10[];
extern uintptr_t *gKartPeachGroup9[];
extern uintptr_t *gKartBowserGroup17[];
extern uintptr_t *gKartBowserGroup16[];
extern uintptr_t *gKartBowserGroup15[];
extern uintptr_t *gKartBowserGroup14[];
extern uintptr_t *gKartBowserGroup13[];
extern uintptr_t *gKartBowserGroup12[];
extern uintptr_t *gKartBowserGroup11[];
extern uintptr_t *gKartBowserGroup10[];
extern uintptr_t *gKartBowserGroup9[];
#include "code_80027040.h"
uintptr_t **gKartMarioTable0[] = {
gKartMarioGroup8, gKartMarioGroup7, gKartMarioGroup6,
@ -303,31 +124,26 @@ uintptr_t ***gKartTextureTable1[] = {
* @param arg4 First buffer index always zero.
**/
void func_80027040(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4) {
s32 temp;
if (((((((player->unk_0BC & 0x80) == 0x80) || ((player->unk_0BC & 0x40) == 0x40)) || ((player->unk_0BC & 0x80000) == 0x80000)) ||
((player->unk_0BC & 0x800000) == 0x800000)) || ((player->unk_0BC & 0x20000) == 0x20000)) || ((player->unk_044 & 0x800) != 0))
{
s32 temp = player->unk_0BC;
if (((temp & 0x80) == 0x80) || ((temp & 0x40) == 0x40) || ((temp & 0x80000) == 0x80000) || ((temp & 0x800000) == 0x800000) || ((temp & 0x20000) == 0x20000) || ((player->unk_044 & 0x800) != 0)) {
if (player->unk_244[arg2] != 0) {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable1[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId], &gDmaMesgQueue);
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable1[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId], &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable0[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId], &gDmaMesgQueue);
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable0[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId], &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
} else if (((((player->unk_0BC & 0x400) == 0x400) || ((player->unk_0BC & 0x1000000) == 0x1000000)) ||
((player->unk_0BC & 0x2000000) == 0x2000000)) || ((player->unk_0BC & 0x10000) == 0x10000))
{
osInvalDCache(&D_802DFB80[arg4][arg3][arg1 * 0x920], 0x780U);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureGroup18s[player->characterId][player->unk_0A8 >> 8])], &D_802DFB80[arg4][arg3][arg1 * 0x920], 0x900U, &gDmaMesgQueue);
} else if (((temp & 0x400) == 0x400) || ((temp & 0x01000000) == 0x01000000) || ((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000)) {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], 0x780U);
// I think there's something off with the "player->unk_0A8 >> 8"
// I don't like that right-shift
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureGroup18s[player->characterId][player->unk_0A8 >> 8])], &D_802DFB80[arg4][arg3][arg1], 0x900, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable0[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId], &gDmaMesgQueue);
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable0[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId], &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
}
@ -335,47 +151,43 @@ void func_80027040(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4) {
void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4) {
s32 temp = player->unk_0BC;
if (((temp & 0x80) == 0x80) || ((temp & 0x40) == 0x40) || ((temp & 0x80000) == 0x80000) ||
((temp & 0x800000) == 0x800000) || ((temp & 0x20000) == 0x20000) || ((player->unk_044 & 0x800) != 0))
if (((temp & 0x80) == 0x80) || ((temp & 0x40) == 0x40) || ((temp & 0x80000) == 0x80000) || ((temp & 0x800000) == 0x800000) || ((temp & 0x20000) == 0x20000) || ((player->unk_044 & 0x800) != 0))
{
if (player->unk_244[arg2] != 0) {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable1[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId], &gDmaMesgQueue);
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable1[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId], &gDmaMesgQueue);
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable0[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId], &gDmaMesgQueue);
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable0[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId], &gDmaMesgQueue);
}
} else if (((temp & 0x400) == 0x400) || ((temp & 0x01000000) == 0x01000000) ||
((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000))
{
osInvalDCache(&D_802DFB80[arg4][arg3][arg1 * 0x920], 0x780);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureGroup18s[player->characterId][player->unk_0A8 >> 8])], &D_802DFB80[arg4][arg3][arg1 * 0x920], 0x900, &gDmaMesgQueue);
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], 0x780);
// I think there's something off with the "player->unk_0A8 >> 8"
// I don't like that right-shift
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureGroup18s[player->characterId][player->unk_0A8 >> 8])], &D_802DFB80[arg4][arg3][arg1], 0x900, &gDmaMesgQueue);
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable0[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1 * 0x920], D_800DDEB0[player->characterId], &gDmaMesgQueue);
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartTextureTable0[player->characterId][player->unk_24C[arg2]][player->unk_244[arg2]])], &D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId], &gDmaMesgQueue);
}
}
void func_80027A20(Player *player, s8 arg1, s8 arg2, s8 arg3) {
// @bug: Undefined Behaviour UB
// untested fix. [arg1 << 8] may be a fake match.
#ifdef AVOID_UB
void *temp_s0 = &D_802F1F80[arg3][arg2][0];
#else
void *temp_s0 = &D_802F1F80[arg3][arg2][arg1 << 8];
#endif
// Weird typecasting is being done here. We define D_802F1F80 as a 3-dimensional u32 array,
// but its better to understand it as a 3-dimensional struct_D_802F1F80 array.
struct_D_802F1F80 *temp_s0 = &D_802F1F80[arg3][arg2][arg1 << 7];
switch(gActiveScreenMode) {
case 0: case 1:
case 0:
case 1:
case 2:
osInvalDCache(temp_s0, 0x200);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartPalettes[player->characterId])], temp_s0, 0x200, &gDmaMesgQueue);
osInvalDCache(temp_s0, sizeof(struct_D_802F1F80));
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartPalettes[player->characterId])], temp_s0, sizeof(struct_D_802F1F80), &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
break;
case 3:
osInvalDCache(temp_s0, 0x200);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartPalettes[player->characterId])], temp_s0, 0x200, &gDmaMesgQueue);
osInvalDCache(temp_s0, sizeof(struct_D_802F1F80));
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(gKartPalettes[player->characterId])], temp_s0, sizeof(struct_D_802F1F80), &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
break;
}
@ -383,11 +195,11 @@ void func_80027A20(Player *player, s8 arg1, s8 arg2, s8 arg3) {
void func_80027BDC(UNUSED Player *player, s32 arg1, void *vAddr, u16 size) {
osInvalDCache(vAddr, size);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(arg1)], vAddr, size, &gDmaMesgQueue);
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(arg1)], vAddr, size, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
void func_80027C74(UNUSED Player *player, s32 arg1, void *vAddr, u16 size) {
osInvalDCache(vAddr, size);
osPiStartDma(&gDmaIoMesg, 0, 0, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(arg1)], vAddr, size, &gDmaMesgQueue);
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ, &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(arg1)], vAddr, size, &gDmaMesgQueue);
}

View File

@ -4,6 +4,8 @@
#include "memory.h"
#include "waypoints.h"
#include "framebuffers.h"
#include "code_80027040.h"
#include "code_80027D00.h"
extern s16 D_80165560[];
extern s32* D_800E3C50[];
@ -277,10 +279,10 @@ void spawn_player(Player *player, s8 playerIndex, f32 arg2, f32 arg3, f32 arg4,
player->boundingBoxCorners[BACK_RIGHT_TYRE].cornerY = 0.0f;
player->boundingBoxCorners[BACK_RIGHT_TYRE].cornerZ = 0.0f;
player->boundingBoxCorners[FRONT_LEFT_TYRE].cornerGroundY = 0.0f;
player->boundingBoxCorners[ FRONT_LEFT_TYRE].cornerGroundY = 0.0f;
player->boundingBoxCorners[FRONT_RIGHT_TYRE].cornerGroundY = 0.0f;
player->boundingBoxCorners[BACK_LEFT_TYRE].cornerGroundY = 0.0f;
player->boundingBoxCorners[BACK_RIGHT_TYRE].cornerGroundY = 0.0f;
player->boundingBoxCorners[ BACK_LEFT_TYRE].cornerGroundY = 0.0f;
player->boundingBoxCorners[ BACK_RIGHT_TYRE].cornerGroundY = 0.0f;
player->unk_110.unk3C = 0.0f;
player->unk_110.unk40 = 0.0f;
@ -454,38 +456,38 @@ void func_80039F44(f32 *arg0, f32 *arg1, f32 arg2) {
D_8016556E = 0;
if (D_800DC51C == 1) {
spawn_player(gPlayerOneCopy, 0, arg0[D_80165270[0]], arg1[D_80165270[0]], arg2, 32768.0f, gCharacterSelections[0], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerTwo, 1, arg0[D_80165270[1]], arg1[D_80165270[1]], arg2, 32768.0f, D_80165560[0], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerThree, 2, arg0[D_80165270[2]], arg1[D_80165270[2]], arg2, 32768.0f, D_80165560[1], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerFour, 3, arg0[D_80165270[3]], arg1[D_80165270[3]], arg2, 32768.0f, D_80165560[2], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerFive, 4, arg0[D_80165270[4]], arg1[D_80165270[4]], arg2, 32768.0f, D_80165560[3], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerSix, 5, arg0[D_80165270[5]], arg1[D_80165270[5]], arg2, 32768.0f, D_80165560[4], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerSeven, 6, arg0[D_80165270[6]], arg1[D_80165270[6]], arg2, 32768.0f, D_80165560[5], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerEight, 7, arg0[D_80165270[7]], arg1[D_80165270[7]], arg2, 32768.0f, D_80165560[6], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerTwo, 1, arg0[D_80165270[1]], arg1[D_80165270[1]], arg2, 32768.0f, D_80165560[0], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerThree, 2, arg0[D_80165270[2]], arg1[D_80165270[2]], arg2, 32768.0f, D_80165560[1], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerFour, 3, arg0[D_80165270[3]], arg1[D_80165270[3]], arg2, 32768.0f, D_80165560[2], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerFive, 4, arg0[D_80165270[4]], arg1[D_80165270[4]], arg2, 32768.0f, D_80165560[3], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerSix, 5, arg0[D_80165270[5]], arg1[D_80165270[5]], arg2, 32768.0f, D_80165560[4], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerSeven, 6, arg0[D_80165270[6]], arg1[D_80165270[6]], arg2, 32768.0f, D_80165560[5], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerEight, 7, arg0[D_80165270[7]], arg1[D_80165270[7]], arg2, 32768.0f, D_80165560[6], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
D_80164A28 = 0;
} else {
spawn_player(gPlayerOneCopy, 0, arg0[D_80165270[0]], arg1[D_80165270[0]] + 250.0f, arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[D_80165270[1]], arg1[D_80165270[1]] + 250.0f, arg2, 32768.0f, D_80165560[0], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerThree, 2, arg0[D_80165270[3]], arg1[D_80165270[2]] + 250.0f, arg2, 32768.0f, D_80165560[1], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFour, 3, arg0[D_80165270[2]], arg1[D_80165270[3]] + 250.0f, arg2, 32768.0f, D_80165560[2], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[D_80165270[5]], arg1[D_80165270[4]] + 250.0f, arg2, 32768.0f, D_80165560[3], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[D_80165270[4]], arg1[D_80165270[5]] + 250.0f, arg2, 32768.0f, D_80165560[4], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSeven, 6, arg0[D_80165270[7]], arg1[D_80165270[6]] + 250.0f, arg2, 32768.0f, D_80165560[5], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerEight, 7, arg0[D_80165270[6]], arg1[D_80165270[7]] + 250.0f, arg2, 32768.0f, D_80165560[6], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerTwo, 1, arg0[D_80165270[1]], arg1[D_80165270[1]] + 250.0f, arg2, 32768.0f, D_80165560[0], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerThree, 2, arg0[D_80165270[3]], arg1[D_80165270[2]] + 250.0f, arg2, 32768.0f, D_80165560[1], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFour, 3, arg0[D_80165270[2]], arg1[D_80165270[3]] + 250.0f, arg2, 32768.0f, D_80165560[2], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[D_80165270[5]], arg1[D_80165270[4]] + 250.0f, arg2, 32768.0f, D_80165560[3], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[D_80165270[4]], arg1[D_80165270[5]] + 250.0f, arg2, 32768.0f, D_80165560[4], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSeven, 6, arg0[D_80165270[7]], arg1[D_80165270[6]] + 250.0f, arg2, 32768.0f, D_80165560[5], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerEight, 7, arg0[D_80165270[6]], arg1[D_80165270[7]] + 250.0f, arg2, 32768.0f, D_80165560[6], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_CPU);
D_80164A28 = 1;
}
func_80039AE4();
}
void func_8003A59C(f32 *arg0, f32 *arg1, f32 arg2) {
spawn_player(gPlayerFour, 3, arg0[2], arg1[2], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[4], arg1[4], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFour, 3, arg0[2], arg1[2], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[4], arg1[4], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSeven, 6, arg0[5], arg1[5], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerEight, 7, arg0[6], arg1[6], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
if (D_800DC51C == 1) {
spawn_player(gPlayerOneCopy, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerTwo, 1, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerThree, 2, arg0[1], arg1[1], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerTwo, 1, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerThree, 2, arg0[1], arg1[1], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
} else if (D_8015F890 != 1) {
spawn_player(gPlayerOneCopy, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
if (D_80162DD4[0] == 0) {
@ -541,9 +543,9 @@ getRand:
}
spawn_player(gPlayerThree, 2, arg0[D_80165270[2]], arg1[D_80165270[2]], arg2, 32768.0f, D_80165560[0], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerFour, 3, arg0[D_80165270[3]], arg1[D_80165270[3]], arg2, 32768.0f, D_80165560[1], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerFive, 4, arg0[D_80165270[4]], arg1[D_80165270[4]], arg2, 32768.0f, D_80165560[2], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerSix, 5, arg0[D_80165270[5]], arg1[D_80165270[5]], arg2, 32768.0f, D_80165560[3], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerFour, 3, arg0[D_80165270[3]], arg1[D_80165270[3]], arg2, 32768.0f, D_80165560[1], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerFive, 4, arg0[D_80165270[4]], arg1[D_80165270[4]], arg2, 32768.0f, D_80165560[2], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerSix, 5, arg0[D_80165270[5]], arg1[D_80165270[5]], arg2, 32768.0f, D_80165560[3], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerSeven, 6, arg0[D_80165270[6]], arg1[D_80165270[6]], arg2, 32768.0f, D_80165560[4], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerEight, 7, arg0[D_80165270[7]], arg1[D_80165270[7]], arg2, 32768.0f, D_80165560[5], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
@ -564,9 +566,9 @@ getRand:
void func_8003AE24(f32 *arg0, f32 *arg1, f32 arg2) {
spawn_player(gPlayerThree, 2, arg0[1], arg1[1], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFour, 3, arg0[2], arg1[2], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[4], arg1[4], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFour, 3, arg0[2], arg1[2], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[4], arg1[4], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSeven, 6, arg0[5], arg1[5], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerEight, 7, arg0[6], arg1[6], arg2, 32768.0f, gCharacterSelections[0], PLAYER_START_SEQUENCE | PLAYER_CPU);
if (D_800DC51C == 1) {
@ -586,15 +588,15 @@ void func_8003AE24(f32 *arg0, f32 *arg1, f32 arg2) {
void spawn_players_2p_battle(f32 *arg0, f32 *arg1, f32 arg2) {
if (gCurrentCourseId == COURSE_BIG_DONUT) {
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, -16384.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 16384.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 16384.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
} else {
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 0.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 0.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
}
spawn_player(gPlayerThree, 2, arg0[2], arg1[2], arg2, 32768.0f, gCharacterSelections[2], PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[3], PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerFive, 4, arg0[4], arg1[4], arg2, 32768.0f, 4, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[5], arg1[5], arg2, 32768.0f, 5, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[3], PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerFive, 4, arg0[4], arg1[4], arg2, 32768.0f, 4, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[5], arg1[5], arg2, 32768.0f, 5, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSeven, 6, arg0[6], arg1[6], arg2, 32768.0f, 6, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerEight, 7, arg0[0], arg1[0], arg2, 32768.0f, 7, PLAYER_START_SEQUENCE | PLAYER_CPU);
D_80164A28 = 0;
@ -602,18 +604,18 @@ void spawn_players_2p_battle(f32 *arg0, f32 *arg1, f32 arg2) {
}
void func_8003B318(f32 *arg0, f32 *arg1, f32 arg2) {
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 32768.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 32768.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerThree, 2, arg0[2], arg1[2], arg2, 32768.0f, gCharacterSelections[2], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
if (D_800DC51C == 1) {
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 32768.0f, gCharacterSelections[1], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 32768.0f, gCharacterSelections[1], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerThree, 2, arg0[2], arg1[2], arg2, 32768.0f, gCharacterSelections[2], PLAYER_HUMAN_AND_CPU);
}
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, 3, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[4], arg1[4], arg2, 32768.0f, 4, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[5], arg1[5], arg2, 32768.0f, 5, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, 3, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[4], arg1[4], arg2, 32768.0f, 4, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[5], arg1[5], arg2, 32768.0f, 5, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSeven, 6, arg0[6], arg1[6], arg2, 32768.0f, 6, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerEight, 7, arg0[0], arg1[0], arg2, 32768.0f, 7, PLAYER_START_SEQUENCE | PLAYER_CPU);
D_80164A28 = 0;
@ -622,17 +624,17 @@ void func_8003B318(f32 *arg0, f32 *arg1, f32 arg2) {
void spawn_players_3p_battle(f32 *arg0, f32 *arg1, f32 arg2) {
if (gCurrentCourseId == COURSE_BIG_DONUT) {
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, -16384.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 16384.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerThree, 2, arg0[2], arg1[2], arg2, 0.0f, gCharacterSelections[2], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, -16384.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 16384.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerThree, 2, arg0[2], arg1[2], arg2, 0.0f, gCharacterSelections[2], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
} else {
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 0.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 0.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerThree, 2, arg0[2], arg1[2], arg2, -16384.0f, gCharacterSelections[2], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
}
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, 3, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[4], arg1[4], arg2, 32768.0f, 4, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[5], arg1[5], arg2, 32768.0f, 5, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, 3, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[4], arg1[4], arg2, 32768.0f, 4, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[5], arg1[5], arg2, 32768.0f, 5, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSeven, 6, arg0[6], arg1[6], arg2, 32768.0f, 6, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerEight, 7, arg0[0], arg1[0], arg2, 32768.0f, 7, PLAYER_START_SEQUENCE | PLAYER_CPU);
D_80164A28 = 0;
@ -640,18 +642,18 @@ void spawn_players_3p_battle(f32 *arg0, f32 *arg1, f32 arg2) {
}
void func_8003B870(f32 *arg0, f32 *arg1, f32 arg2) {
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 32768.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 32768.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerThree, 2, arg0[2], arg1[2], arg2, 32768.0f, gCharacterSelections[2], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[3], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[3], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
if (D_800DC51C == 1) {
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 32768.0f, gCharacterSelections[1], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 32768.0f, gCharacterSelections[1], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerThree, 2, arg0[2], arg1[2], arg2, 32768.0f, gCharacterSelections[2], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[3], PLAYER_HUMAN_AND_CPU);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[3], PLAYER_HUMAN_AND_CPU);
}
spawn_player(gPlayerFive, 4, arg0[4], arg1[4], arg2, 32768.0f, 4, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[5], arg1[5], arg2, 32768.0f, 5, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[4], arg1[4], arg2, 32768.0f, 4, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[5], arg1[5], arg2, 32768.0f, 5, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSeven, 6, arg0[6], arg1[6], arg2, 32768.0f, 6, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerEight, 7, arg0[0], arg1[0], arg2, 32768.0f, 7, PLAYER_START_SEQUENCE | PLAYER_CPU);
D_80164A28 = 0;
@ -660,18 +662,18 @@ void func_8003B870(f32 *arg0, f32 *arg1, f32 arg2) {
void spawn_players_4p_battle(f32 *arg0, f32 *arg1, f32 arg2) {
if (gCurrentCourseId == COURSE_BIG_DONUT) {
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, -16384.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 16384.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerThree, 2, arg0[2], arg1[2], arg2, 0.0f, gCharacterSelections[2], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[3], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, -16384.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 16384.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerThree, 2, arg0[2], arg1[2], arg2, 0.0f, gCharacterSelections[2], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 32768.0f, gCharacterSelections[3], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
} else {
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 0.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerOne, 0, arg0[0], arg1[0], arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[1], arg1[1], arg2, 0.0f, gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerThree, 2, arg0[2], arg1[2], arg2, -16384.0f, gCharacterSelections[2], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 16384.0f, gCharacterSelections[3], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerFour, 3, arg0[3], arg1[3], arg2, 16384.0f, gCharacterSelections[3], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
}
spawn_player(gPlayerFive, 4, arg0[4], arg1[4], arg2, 32768.0f, 4, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[5], arg1[5], arg2, 32768.0f, 5, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerFive, 4, arg0[4], arg1[4], arg2, 32768.0f, 4, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSix, 5, arg0[5], arg1[5], arg2, 32768.0f, 5, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerSeven, 6, arg0[6], arg1[6], arg2, 32768.0f, 6, PLAYER_START_SEQUENCE | PLAYER_CPU);
spawn_player(gPlayerEight, 7, arg0[0], arg1[0], arg2, 32768.0f, 7, PLAYER_START_SEQUENCE | PLAYER_CPU);
D_80164A28 = 0;
@ -679,18 +681,18 @@ void spawn_players_4p_battle(f32 *arg0, f32 *arg1, f32 arg2) {
}
void func_8003BE30(void) {
spawn_player(gPlayerOne, 0, -2770.774f, -345.187f, -34.6f, 0.0f, gCharacterIdByGPOverallRank[0], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerTwo, 1, -3691.506f, -6.822f, -6.95f, 36400.0f, gCharacterIdByGPOverallRank[1], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerOne, 0, -2770.774f, -345.187f, -34.6f, 0.0f, gCharacterIdByGPOverallRank[0], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerTwo, 1, -3691.506f, -6.822f, -6.95f, 36400.0f, gCharacterIdByGPOverallRank[1], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerThree, 2, -3475.028f, -998.485f, -8.059f, 45500.0f, gCharacterIdByGPOverallRank[2], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
if (D_802874D8.unk_1D >= 3) {
spawn_player(gPlayerFour, 3, -3025.772f, 110.039f, -23.224f, 28210.0f, D_802874D8.unk_1E, PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
} else {
spawn_player(gPlayerFour, 3, -3025.772f, 110.039f, -23.224f, 28210.0f, gCharacterIdByGPOverallRank[3], PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
}
spawn_player(gPlayerFive, 4, -2770.774f, -345.187f, -34.6f, 0.0f, 0, 0x7000);
spawn_player(gPlayerSix, 5, -3691.506f, -6.822f, -6.95f, 36400.0f, 0, 0x7000);
spawn_player(gPlayerSeven, 6, -3475.028f, -998.485f, -8.059f, 45500.0f, 0, 0x7000);
spawn_player(gPlayerEight, 7, -3025.772f, 110.039f, -23.224f, 28210.0f, 0, 0x7000);
spawn_player(gPlayerFive, 4, -2770.774f, -345.187f, -34.6f, 0.0f, 0, 0x7000);
spawn_player(gPlayerSix, 5, -3691.506f, -6.822f, -6.95f, 36400.0f, 0, 0x7000);
spawn_player(gPlayerSeven, 6, -3475.028f, -998.485f, -8.059f, 45500.0f, 0, 0x7000);
spawn_player(gPlayerEight, 7, -3025.772f, 110.039f, -23.224f, 28210.0f, 0, 0x7000);
D_80164A28 = 0;
func_80039AE4();
}
@ -988,14 +990,14 @@ void func_8003C0F0(void) {
D_80165230[5] = 130.0f;
D_80165230[6] = 150.0f;
D_80165230[7] = 170.0f;
spawn_player(gPlayerOneCopy, 0, D_80165210[0], D_80165230[0], sp5A, 32768.0f, gCharacterSelections[0], ((1 << 15) | (1 << 13)) | (1 << 14));
spawn_player(gPlayerTwo, 1, D_80165210[1], D_80165230[1], sp5A, 32768.0f, 1, ((1 << 15) | (1 << 12)) | (1 << 13));
spawn_player(gPlayerThree, 2, D_80165210[2], D_80165230[2], sp5A, 32768.0f, 2, ((1 << 15) | (1 << 12)) | (1 << 13));
spawn_player(gPlayerFour, 3, D_80165210[3], D_80165230[3], sp5A, 32768.0f, 3, ((1 << 15) | (1 << 12)) | (1 << 13));
spawn_player(gPlayerFive, 4, D_80165210[4], D_80165230[4], sp5A, 32768.0f, 4, ((1 << 15) | (1 << 12)) | (1 << 13));
spawn_player(gPlayerSix, 5, D_80165210[5], D_80165230[5], sp5A, 32768.0f, 5, ((1 << 15) | (1 << 12)) | (1 << 13));
spawn_player(gPlayerSeven, 6, D_80165210[6], D_80165230[6], sp5A, 32768.0f, 6, ((1 << 15) | (1 << 12)) | (1 << 13));
spawn_player(gPlayerEight, 7, D_80165210[7], D_80165230[7], sp5A, 32768.0f, 7, ((1 << 15) | (1 << 12)) | (1 << 13));
spawn_player(gPlayerOneCopy, 0, D_80165210[0], D_80165230[0], sp5A, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, D_80165210[1], D_80165230[1], sp5A, 32768.0f, 1, PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerThree, 2, D_80165210[2], D_80165230[2], sp5A, 32768.0f, 2, PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerFour, 3, D_80165210[3], D_80165230[3], sp5A, 32768.0f, 3, PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerFive, 4, D_80165210[4], D_80165230[4], sp5A, 32768.0f, 4, PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerSix, 5, D_80165210[5], D_80165230[5], sp5A, 32768.0f, 5, PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerSeven, 6, D_80165210[6], D_80165230[6], sp5A, 32768.0f, 6, PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
spawn_player(gPlayerEight, 7, D_80165210[7], D_80165230[7], sp5A, 32768.0f, 7, PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE);
D_80164A28 = 0;
break;
}
@ -1016,18 +1018,15 @@ void func_8003CD98(Player *player, struct Camera *camera, s8 arg2, s8 arg3) {
}
func_8002934C(player, camera, arg3, arg2);
if ((arg3 == 0) || (arg3 == 1)) {
s32 idx;
func_80027A20(player, arg2, arg3, 0);
func_80027A20(player, arg2, arg3, 1);
func_80027040(player, arg2, arg3, arg3, 0);
// mio0decode((u8*)&D_802DFB80[arg3][arg2], (u8*)&D_802BFB80[arg3][arg2]); // [0x8000][0x1000]
mio0decode((u8*)&D_802DFB80[0][0][(arg3 * 0x4900) + (arg2 * 0x920)], (u8*)&D_802BFB80[0][0][(arg3 << 0xF) + (arg2 << 0xC)]);
mio0decode(&D_802DFB80[0][arg3][arg2], &D_802BFB80[0][arg3][arg2]);
} else {
func_80027A20(player, arg2, arg3, 0);
func_80027A20(player, arg2, arg3, 1);
func_80027040(player, (s8) (arg2 + 4), arg3, (s8) (arg3 - 2), 0);
mio0decode((u8*)&D_802DFB80[0][0][(arg3 * 0x4900) + (arg2 * 0x920)] - 0x6D80, (u8*)&D_802BFB80[0][0][(arg3 << 0xF) + (arg2 << 0xC)] + 0xFFFF4000);
mio0decode(&D_802DFB80[0][arg3 - 2][arg2 + 4], &D_802BFB80[0][arg3 - 2][arg2 + 4]);
}
D_801650D0[arg3][arg2] = player->unk_244[arg3];
@ -1050,7 +1049,7 @@ void func_8003D080(void) {
}
if (D_800DC51C == 0) {
switch (gActiveScreenMode) {
case 0:
case SCREEN_MODE_1P:
switch (gModeSelection) {
case 0:
if (gCurrentCourseId == 10) {
@ -1070,8 +1069,8 @@ void func_8003D080(void) {
}
break;
case 1:
case 2:
case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL:
case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL:
switch (gModeSelection) {
case 0:
func_8001C4D0(ptr->pos[0], ptr->pos[1], ptr->pos[2], ptr->unk_02C[1], 1, 0);
@ -1093,8 +1092,8 @@ void func_8003D080(void) {
}
break;
case 3:
if (gModeSelection == 3) {
case SCREEN_MODE_3P_4P_SPLITSCREEN:
if (gModeSelection == BATTLE) {
func_8001C4D0(ptr->pos[0], ptr->pos[1], ptr->pos[2], ptr->unk_02C[1], 9, 0);
ptr++;
func_8001C4D0(ptr->pos[0], ptr->pos[1], ptr->pos[2], ptr->unk_02C[1], 9, 1);
@ -1119,18 +1118,18 @@ void func_8003D080(void) {
}
} else {
switch (gActiveScreenMode) {
case 0:
case SCREEN_MODE_1P:
func_8001C4D0(ptr->pos[0], ptr->pos[1], ptr->pos[2], ptr->unk_02C[1], 3, 0);
break;
case 1:
case 2:
case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL:
case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL:
func_8001C4D0(ptr->pos[0], ptr->pos[1], ptr->pos[2], ptr->unk_02C[1], 3, 0);
ptr++;
func_8001C4D0(ptr->pos[0], ptr->pos[1], ptr->pos[2], ptr->unk_02C[1], 3, 1);
break;
case 3:
case SCREEN_MODE_3P_4P_SPLITSCREEN:
func_8001C4D0(ptr->pos[0], ptr->pos[1], ptr->pos[2], ptr->unk_02C[1], 3, 0);
ptr++;
func_8001C4D0(ptr->pos[0], ptr->pos[1], ptr->pos[2], ptr->unk_02C[1], 3, 1);
@ -1143,54 +1142,54 @@ void func_8003D080(void) {
}
switch (gActiveScreenMode) {
case 0:
func_8003CD98(gPlayerOneCopy, camera1, 0, 0); // sic
func_8003CD98(gPlayerTwo, camera1, 1, 0);
case SCREEN_MODE_1P:
func_8003CD98(gPlayerOneCopy, camera1, 0, 0); // sic
func_8003CD98(gPlayerTwo, camera1, 1, 0);
func_8003CD98(gPlayerThree, camera1, 2, 0);
func_8003CD98(gPlayerFour, camera1, 3, 0);
func_8003CD98(gPlayerFive, camera1, 4, 0);
func_8003CD98(gPlayerSix, camera1, 5, 0);
func_8003CD98(gPlayerFour, camera1, 3, 0);
func_8003CD98(gPlayerFive, camera1, 4, 0);
func_8003CD98(gPlayerSix, camera1, 5, 0);
func_8003CD98(gPlayerSeven, camera1, 6, 0);
func_8003CD98(gPlayerEight, camera1, 7, 0);
break;
case 1:
case 2:
case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL:
case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL:
func_8003CD98(gPlayerOneCopy, camera1, 0, 0);
func_8003CD98(gPlayerTwo, camera1, 1, 0);
func_8003CD98(gPlayerThree, camera1, 2, 0);
func_8003CD98(gPlayerFour, camera1, 3, 0);
func_8003CD98(gPlayerFive, camera1, 4, 0);
func_8003CD98(gPlayerSix, camera1, 5, 0);
func_8003CD98(gPlayerSeven, camera1, 6, 0);
func_8003CD98(gPlayerEight, camera1, 7, 0);
func_8003CD98(gPlayerTwo, camera1, 1, 0);
func_8003CD98(gPlayerThree, camera1, 2, 0);
func_8003CD98(gPlayerFour, camera1, 3, 0);
func_8003CD98(gPlayerFive, camera1, 4, 0);
func_8003CD98(gPlayerSix, camera1, 5, 0);
func_8003CD98(gPlayerSeven, camera1, 6, 0);
func_8003CD98(gPlayerEight, camera1, 7, 0);
func_8003CD98(gPlayerOneCopy, camera2, 0, 1);
func_8003CD98(gPlayerTwo, camera2, 1, 1);
func_8003CD98(gPlayerThree, camera2, 2, 1);
func_8003CD98(gPlayerFour, camera2, 3, 1);
func_8003CD98(gPlayerFive, camera2, 4, 1);
func_8003CD98(gPlayerSix, camera2, 5, 1);
func_8003CD98(gPlayerSeven, camera2, 6, 1);
func_8003CD98(gPlayerEight, camera2, 7, 1);
func_8003CD98(gPlayerTwo, camera2, 1, 1);
func_8003CD98(gPlayerThree, camera2, 2, 1);
func_8003CD98(gPlayerFour, camera2, 3, 1);
func_8003CD98(gPlayerFive, camera2, 4, 1);
func_8003CD98(gPlayerSix, camera2, 5, 1);
func_8003CD98(gPlayerSeven, camera2, 6, 1);
func_8003CD98(gPlayerEight, camera2, 7, 1);
break;
case 3:
case SCREEN_MODE_3P_4P_SPLITSCREEN:
func_8003CD98(gPlayerOneCopy, camera1, 0, 0);
func_8003CD98(gPlayerTwo, camera1, 1, 0);
func_8003CD98(gPlayerThree, camera1, 2, 0);
func_8003CD98(gPlayerFour, camera1, 3, 0);
func_8003CD98(gPlayerTwo, camera1, 1, 0);
func_8003CD98(gPlayerThree, camera1, 2, 0);
func_8003CD98(gPlayerFour, camera1, 3, 0);
func_8003CD98(gPlayerOneCopy, camera2, 0, 1);
func_8003CD98(gPlayerTwo, camera2, 1, 1);
func_8003CD98(gPlayerThree, camera2, 2, 1);
func_8003CD98(gPlayerFour, camera2, 3, 1);
func_8003CD98(gPlayerTwo, camera2, 1, 1);
func_8003CD98(gPlayerThree, camera2, 2, 1);
func_8003CD98(gPlayerFour, camera2, 3, 1);
func_8003CD98(gPlayerOneCopy, camera3, 0, 2);
func_8003CD98(gPlayerTwo, camera3, 1, 2);
func_8003CD98(gPlayerThree, camera3, 2, 2);
func_8003CD98(gPlayerFour, camera3, 3, 2);
func_8003CD98(gPlayerTwo, camera3, 1, 2);
func_8003CD98(gPlayerThree, camera3, 2, 2);
func_8003CD98(gPlayerFour, camera3, 3, 2);
func_8003CD98(gPlayerOneCopy, camera4, 0, 3);
func_8003CD98(gPlayerTwo, camera4, 1, 3);
func_8003CD98(gPlayerThree, camera4, 2, 3);
func_8003CD98(gPlayerFour, camera4, 3, 3);
func_8003CD98(gPlayerTwo, camera4, 1, 3);
func_8003CD98(gPlayerThree, camera4, 2, 3);
func_8003CD98(gPlayerFour, camera4, 3, 3);
break;
}
}

View File

@ -3,6 +3,7 @@
#include <types.h>
#include <common_structs.h>
#include <defines.h>
#include "framebuffers.h"
extern s32 mio0encode(s32 input, s32, s32);
extern s32 func_80040174(void *, s32, s32);
@ -51,12 +52,8 @@ s32 D_80162DFC;
s32 D_80162E00;
extern u8 D_802BFB80[77824];
extern u8 *D_802D2B80[32768];
extern u8 *D_802DAB80[20480];
u32 *D_800DC710 = &D_802D2B80[0];
u32 *D_800DC714 = &D_802DAB80[0];
u32 *D_800DC710 = &D_802BFB80[0][2][3];
u32 *D_800DC714 = &D_802BFB80[1][1][3];
extern OSIoMesg *gDmaIoMesg;
extern u8 _kart_texturesSegmentRomStart;
@ -87,7 +84,7 @@ extern s32 D_80164394;
extern s32 D_80164398;
void func_80004EF0(void) {
D_80162DA4 = &D_802D2B80[0];
D_80162DA4 = &D_802BFB80[0][2][3];
osInvalDCache(&D_80162DA4[0], 0x4000);
osPiStartDma(&gDmaIoMesg, 0, 0, (D_80162DC4 & 0xFFFFFF) + &_kart_texturesSegmentRomStart, D_80162DA4, 0x4000, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1);
@ -96,13 +93,13 @@ void func_80004EF0(void) {
}
void func_80004FB0(void) {
D_80162DB4 = &D_802BFB80[(D_80162DD0 << 0xf) + 0x3000];
D_80162DB4 = &D_802BFB80[0][D_80162DD0][3];
D_80162DAC = *D_80162DB4 & 0xFF0000;
D_80162DB0 = 0;
}
void func_80004FF8(void) {
D_80162D94 = &D_802BFB80[(D_80162DC8 << 0xF) + 0x3000];
D_80162D94 = &D_802BFB80[0][D_80162DC8][3];
D_80162D8C = (s32) *D_80162D94 & 0xFF0000;
D_80162D90 = 0;
}
@ -169,7 +166,7 @@ s32 func_800051C4(void) {
}
void func_8000522C(void) {
D_80162D94 = &D_802BFB80[(D_80162DC8 << 0xF) + 0x3000];
D_80162D94 = &D_802BFB80[0][D_80162DC8][3];
mio0decode(D_800DC714, D_80162D94);
D_80162D8C = (s32) (*D_80162D94 & 0xFF0000);
D_80162D90 = 0;
@ -187,7 +184,7 @@ void func_800052A4(void) {
D_80162DCC = 0;
}
temp_v0 = D_80162DB8;
D_80162D80 = (void *) &D_802BFB80[(D_80162DC8 << 0xF) + 0x3000];
D_80162D80 = (void *) &D_802BFB80[0][D_80162DC8][3];
D_80162D84 = temp_v0;
D_80162D86 = temp_v0;
}
@ -221,8 +218,8 @@ void func_80005310(void) {
} else {
D_80162DD8 = 1U;
D_80162DBC = &D_802BFB80[(D_80162DCC << 0xF) + 0x3000];
*D_80162DBC = 0xFFFFFFFF;
D_80162DBC = &D_802BFB80[0][D_80162DCC][3];
D_80162DBC[0] = -1;
D_80162DB8 = 0;
D_80162DDC = 0;
func_80091EE4(&D_80162DC0);
@ -483,42 +480,83 @@ void func_80005AE8(Player *ply) {
}
#ifdef NON_MATCHING
void func_80005B18(void) {
s16 *temp_v0_2;
s16 *temp_v0_3;
s32 temp_v0;
u16 *phi_a3;
void func_80005B18(void)
{
if (gModeSelection == 1)
{
if (((gLapCountByPlayerId[0] == 3) && (D_80162DDC == 0)) && (D_80162DF8 != 1))
{
if (D_80162DD4 == (u16)1)
{
D_80162DD0 = D_80162DCC;
func_800052A4();
D_80162DD4 = 0;
D_80162DDC = 1;
D_80162DE0 = gPlayerOne->characterId;
D_80162DE8 = gPlayerOne->characterId;
D_80162E00 = 0;
D_80162DFC = D_8018CA78;
func_80005AE8(gPlayerTwo);
func_80005AE8(gPlayerThree);
}
else
{
if (gLapCountByPlayerId[4] != 3)
{
D_80162DD0 = D_80162DCC;
func_800052A4();
D_80162DDC = 1;
D_80162DE0 = gPlayerOne->characterId;
D_80162DFC = D_8018CA78;
D_80162E00 = 0;
D_80162DE8 = gPlayerOne->characterId;
func_80005AE8(gPlayerTwo);
func_80005AE8(gPlayerThree);
return;
if (gModeSelection == TIME_TRIALS) {
temp_v0 = gLapCountByPlayerId[0];
//phi_a3 = &D_80162DD4;
if ((gLapCountByPlayerId[0] == 3) && (D_80162DDC == 0) && D_80162DF8 != 1) {
//if (D_80162DF8 != 1) {
if (D_80162DD4 == 1) {
D_80162DD0 = D_80162DCC;
func_800052A4(); //gModeSelection, &D_80162DDC, 3, &D_80162DD4);
D_80162DD4 = 0;
D_80162DDC = 1;
D_80162DE0 = gPlayerOne->characterId;
D_80162DE8 = gPlayerOne->characterId;
D_80162E00 = 0;
D_80162DFC = D_8018CA78;
func_80005AE8(gPlayerTwo); // (u16) &D_80162DDC);
func_80005AE8(gPlayerThree);
} else {
if (gLapCountByPlayerId[4] != 3) {
D_80162DD0 = D_80162DCC;
func_800052A4(); // gModeSelection, &D_80162DDC, 3, &D_80162DD4);
D_80162DDC = 1;
D_80162DE0 = gPlayerOne->characterId;
D_80162DFC = D_8018CA78;
D_80162E00 = 0;
D_80162DE8 = gPlayerOne->characterId;
func_80005AE8(gPlayerTwo); // (u16) &D_80162DDC);
func_80005AE8(gPlayerThree);
return;
}
}
D_80162D80 = (void *) &D_802BFB80[0][D_80162DC8][3];
D_80162D84 = D_80162D86;
D_80162DD0 = D_80162DCC;
D_80162DE8 = gPlayerOne->characterId;
D_80162DD8 = 0;
D_80162DD4 = 0;
D_80162DDC = 1;
func_80005AE8(gPlayerTwo); // (u16) &D_80162DDC, 3, &D_80162DD4);
func_80005AE8(gPlayerThree);
return;
}
if ((gLapCountByPlayerId[0] == 3) && (D_80162DDC == 0) && (D_80162DF8 == 1)) {
D_80162D80 = (void *) &D_802BFB80[0][D_80162DC8][3];
D_80162D84 = D_80162D86;
D_80162DDC = 1;
}
if (( gPlayerOne->unk_000 & PLAYER_CINEMATIC_MODE) == PLAYER_CINEMATIC_MODE) {
func_80005AE8(gPlayerTwo); // (u16) &D_80162DDC, 3, phi_a3);
func_80005AE8(gPlayerThree);
return;
};
D_80162DEC++;
if (D_80162DEC > 100) {
D_80162DEC = 100;
}
if ((gModeSelection == TIME_TRIALS) && (gActiveScreenMode == 0)) {
if ((D_80162DD4 == 0) && (gLapCountByPlayerId[4] != 3)) {
func_800057DC(); //gModeSelection, &D_80162DDC, 3, &D_80162DD4);
}
if ((D_80162DD6 == 0) && (3 != gLapCountByPlayerId[8])) {
func_8000561C();
}
if (( gPlayerOne->unk_000 & PLAYER_CINEMATIC_MODE) == 0) {
func_8000599C();
}
}
}
D_80162D80 = &D_802BFB80[(D_80162DC8 << 0xF) + 0x3000];
D_80162D84 = D_80162D86;
D_80162DD0 = D_80162DCC;
@ -563,7 +601,6 @@ void func_80005B18(void)
func_8000599C();
}
}
}
}
#else