diff --git a/src/buffers.h b/src/buffers.h index 64bf2ce8d2..f8a9fb141a 100644 --- a/src/buffers.h +++ b/src/buffers.h @@ -70,7 +70,7 @@ typedef struct { extern u16 gRandomSeed16; extern u8 randomSeedPadding[216]; extern union_D_802BFB80 D_802BFB80; -extern struct_D_802DFB80 gEncodedKartTexture[][2][8]; +extern struct_D_802DFB80 gEncodedKartTexture[][4][8]; /** * It would be nice to define gPlayerPalettesList as "struct_D_802F1F80 gPlayerPalettesList[2][4][8]". diff --git a/src/buffers/buffers.c b/src/buffers/buffers.c index 9a2f34eeee..4b7d3a31b4 100644 --- a/src/buffers/buffers.c +++ b/src/buffers/buffers.c @@ -8,7 +8,7 @@ */ ALIGNED8 union_D_802BFB80 D_802BFB80; // [nothing][screen][player] -ALIGNED8 struct_D_802DFB80 gEncodedKartTexture[2][2][8]; +ALIGNED8 struct_D_802DFB80 gEncodedKartTexture[2][4][8]; #ifdef AVOID_UB // [buffer][screen][player] Buffer might be two separate buffers or something? ALIGNED8 struct_D_802F1F80 gPlayerPalettesList[2][4][8]; diff --git a/src/code_80057C60.c b/src/code_80057C60.c index 7e820f65bc..f75a011beb 100644 --- a/src/code_80057C60.c +++ b/src/code_80057C60.c @@ -769,30 +769,20 @@ void func_8005902C(void) { void func_800590D4(void) { if (D_8018D2A4 != 0) { - if (gModeSelection != BATTLE) { - switch (gPlayerCountSelection1) { - case 1: - if (gModeSelection != TIME_TRIALS) { - func_8004E800(PLAYER_ONE); - break; - } - break; - case 2: - func_8004E800(PLAYER_ONE); - func_8004E800(PLAYER_TWO); - break; - case 3: - func_8004E998(PLAYER_ONE); - func_8004E998(PLAYER_TWO); - func_8004E998(PLAYER_THREE); - break; - case 4: - func_8004E998(PLAYER_ONE); - func_8004E998(PLAYER_TWO); - func_8004E998(PLAYER_THREE); - func_8004E998(PLAYER_FOUR); - break; - } + switch(gModeSelection) { + case BATTLE: + case TIME_TRIALS: + break; + case GRAND_PRIX: + for (size_t i = 0; i < gPlayerCountSelection1; i++) { + func_8004E800(i); + } + break; + case VERSUS: + for (size_t i = 0; i < gPlayerCountSelection1; i++) { + func_8004E998(i); + } + break; } } } @@ -6580,17 +6570,27 @@ void func_8006E058(void) { break; case SCREEN_MODE_3P_4P_SPLITSCREEN: - if ((VERSUS == gModeSelection) || (BATTLE == gModeSelection)) { - func_8006E420(gPlayerOne, 0, 0); - func_8006E420(gPlayerTwo, 1, 0); - func_8006E420(gPlayerThree, 2, 0); - - if (gPlayerCountSelection1 == 4) { + switch(gModeSelection) { + case GRAND_PRIX: + func_8006E420(gPlayerOne, 0, 0); + func_8006E420(gPlayerTwo, 1, 0); + func_8006E420(gPlayerThree, 2, 0); func_8006E420(gPlayerFour, 3, 0); - } + func_8006E420(gPlayerFive, 4, 0); + func_8006E420(gPlayerSix, 5, 0); + func_8006E420(gPlayerSeven, 6, 0); + func_8006E420(gPlayerEight, 7, 0); + break; + case VERSUS: + case BATTLE: + func_8006E420(gPlayerOne, 0, 0); + func_8006E420(gPlayerTwo, 1, 0); + func_8006E420(gPlayerThree, 2, 0); + if (gPlayerCountSelection1 == 4) { + func_8006E420(gPlayerFour, 3, 0); + } + break; } - - break; } } diff --git a/src/data/textures.c b/src/data/textures.c index 6e518ba031..9aa1867d95 100644 --- a/src/data/textures.c +++ b/src/data/textures.c @@ -4230,10 +4230,11 @@ MenuTexture seg2_menu_2p_column[5] = { * @brief MenuTexture for the first colone three player * */ -MenuTexture seg2_menu_3p_column[4] = { +MenuTexture seg2_menu_3p_column[5] = { { 1, texture_menu_3p_game, 64, 54, 0, 0, 0x0 }, - { 1, texture_mode_vs, 64, 18, 0, 65, 0x0 }, - { 1, texture_mode_battle, 64, 18, 0, 83, 0x0 }, + { 1, texture_mode_mario_gp, 64, 18, 0, 65, 0x0 }, + { 1, texture_mode_vs, 64, 18, 0, 83, 0x0 }, + { 1, texture_mode_battle, 64, 18, 0, 101, 0x0 }, { 0, NULL, 0, 0, 0, 0, 0 }, }; @@ -4241,10 +4242,11 @@ MenuTexture seg2_menu_3p_column[4] = { * @brief MenuTexture for the first colone four player * */ -MenuTexture seg2_menu_4p_column[4] = { +MenuTexture seg2_menu_4p_column[5] = { { 1, texture_menu_4p_game, 64, 54, 0, 0, 0x0 }, - { 1, texture_mode_vs, 64, 18, 0, 65, 0x0 }, - { 1, texture_mode_battle, 64, 18, 0, 83, 0x0 }, + { 1, texture_mode_mario_gp, 64, 18, 0, 65, 0x0 }, + { 1, texture_mode_vs, 64, 18, 0, 83, 0x0 }, + { 1, texture_mode_battle, 64, 18, 0, 101, 0x0 }, { 0, NULL, 0, 0, 0, 0, 0 }, }; diff --git a/src/menu_items.c b/src/menu_items.c index 9838fd31e1..32f57de05d 100644 --- a/src/menu_items.c +++ b/src/menu_items.c @@ -5414,7 +5414,7 @@ void func_8009CE64(s32 arg0) { switch (gModeSelection) { case 0: case 1: - gModeSelection = 2; + gModeSelection = VERSUS; break; } } diff --git a/src/menus.c b/src/menus.c index ab24e419b6..24d49ac550 100644 --- a/src/menus.c +++ b/src/menus.c @@ -100,14 +100,14 @@ const s8 sScreenModePlayerTable[] = { SCREEN_MODE_1P, SCREEN_MODE_2P_SPLITSCREEN const s8 sScreenModePlayerCount[] = { 1, 2, 2, 3, 4 }; // Set indexed slots numbers for one-two-three-four mode selection -const s8 gPlayerModeSelection[] = { 1, 2, 1, 1 }; +const s8 gPlayerModeSelection[] = { 1, 2, 2, 2 }; // Limit for each index column in one-two-three-four mode selection const s8 sGameModePlayerColumnDefault[][3] = { { 2, 1, 0 }, // 1p (GP options, TT options, ...) { 2, 2, 0 }, // 2p (GP options, VS options, Battle) - { 2, 0, 0 }, // 3p (VS options, Battle, ...) - { 2, 0, 0 }, // 4p (VS options, Battle, ...) + { 2, 2, 0 }, // 3p (GP options, VS options, Battle, ...) + { 2, 2, 0 }, // 4p (GP options, VS options, Battle, ...) }; // Limit for each index column in one-two-three-four mode selection @@ -115,16 +115,16 @@ const s8 sGameModePlayerColumnDefault[][3] = { const s8 sGameModePlayerColumnExtra[][3] = { { 3, 1, 0 }, // 1p (GP options, TT options, ...) { 3, 3, 0 }, // 2p (GP options, VS options, Battle) - { 3, 0, 0 }, // 3p (VS options, Battle, ...) - { 3, 0, 0 }, // 4p (VS options, Battle, ...) + { 3, 3, 0 }, // 3p (GP options, VS options, Battle, ...) + { 3, 3, 0 }, // 4p (GP options, VS options, Battle, ...) }; // Modes to select in one-two-three-four mode selection const s32 gGameModePlayerSelection[][3] = { { GRAND_PRIX, TIME_TRIALS, 0x00000000 }, // 1p game modes { GRAND_PRIX, VERSUS, BATTLE }, // 2p game modes - { VERSUS, BATTLE, 0x00000000 }, // 3p game modes - { VERSUS, BATTLE, 0x00000000 }, // 4p game modes + { GRAND_PRIX, VERSUS, BATTLE }, // 3p game modes + { GRAND_PRIX, VERSUS, BATTLE }, // 4p game modes }; // Map from character grid position id to character id diff --git a/src/player_controller.c b/src/player_controller.c index b8a33c4c66..85be988882 100644 --- a/src/player_controller.c +++ b/src/player_controller.c @@ -443,7 +443,14 @@ void func_80028F70(void) { } break; case SCREEN_MODE_3P_4P_SPLITSCREEN: - for (size_t i = 0; i < 4; i++) { + size_t players; + if (gModeSelection == GRAND_PRIX) { + players = 8; + } else { // VERSUS, BATTLE + players = 4; + } + + for (size_t i = 0; i < players; i++) { func_80028E70(&gPlayers[i], camera1, i, 0); } break; diff --git a/src/racing/race_logic.c b/src/racing/race_logic.c index 4ea13aa353..bb52544eb8 100644 --- a/src/racing/race_logic.c +++ b/src/racing/race_logic.c @@ -264,6 +264,9 @@ void func_8028E678(void) { case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL: D_8015F894 = 6; break; + case SCREEN_MODE_3P_4P_SPLITSCREEN: + D_8015F894 = 5; + break; } break; case 5: @@ -990,6 +993,26 @@ void func_8028FCBC(void) { gRaceState = RACE_FINISHED; } break; + case SCREEN_MODE_3P_4P_SPLITSCREEN: + if (((gPlayerOne->type & PLAYER_CINEMATIC_MODE) != 0) && + ((gPlayerTwo->type & PLAYER_CINEMATIC_MODE) != 0) && + ((gPlayerThree->type & PLAYER_CINEMATIC_MODE) != 0) && + ((gPlayerFour->type & PLAYER_CINEMATIC_MODE) != 0)) { + + size_t bestRank = gPlayers[0].currentRank; + gPlayerWinningIndex = 0; + for (size_t i = 1; i < gPlayerCountSelection1; i++) { + if (gPlayers[i].currentRank < bestRank) { + bestRank = gPlayers[i].currentRank; + gPlayerWinningIndex = i; + } + } + + func_8028E298(); + D_802BA038 = 600; + gRaceState = RACE_FINISHED; + } + break; } break; case VERSUS: diff --git a/src/render_player.c b/src/render_player.c index 2aa5bdbf1c..b04c518aa0 100644 --- a/src/render_player.c +++ b/src/render_player.c @@ -355,7 +355,8 @@ void render_players(Camera* camera, s32 screenIdx) { init_render_player(gPlayerTwo, camera, PLAYER_TWO, screenIdx); init_render_player(gPlayerThree, camera, PLAYER_THREE, screenIdx); init_render_player(gPlayerFour, camera, PLAYER_FOUR, screenIdx); - if (gActiveScreenMode != SCREEN_MODE_3P_4P_SPLITSCREEN) { + if ((gActiveScreenMode != SCREEN_MODE_3P_4P_SPLITSCREEN) || + (gModeSelection == GRAND_PRIX)) { init_render_player(gPlayerFive, camera, PLAYER_FIVE, screenIdx); init_render_player(gPlayerSix, camera, PLAYER_SIX, screenIdx); init_render_player(gPlayerSeven, camera, PLAYER_SEVEN, screenIdx); @@ -371,7 +372,8 @@ void render_players(Camera* camera, s32 screenIdx) { try_rendering_player(gPlayerTwo, PLAYER_TWO, screenIdx); try_rendering_player(gPlayerThree, PLAYER_THREE, screenIdx); try_rendering_player(gPlayerFour, PLAYER_FOUR, screenIdx); - if (gActiveScreenMode != SCREEN_MODE_3P_4P_SPLITSCREEN) { + if ((gActiveScreenMode != SCREEN_MODE_3P_4P_SPLITSCREEN) || + (gModeSelection == GRAND_PRIX)) { try_rendering_player(gPlayerFive, PLAYER_FIVE, screenIdx); try_rendering_player(gPlayerSix, PLAYER_SIX, screenIdx); try_rendering_player(gPlayerSeven, PLAYER_SEVEN, screenIdx); @@ -384,7 +386,8 @@ void render_players(Camera* camera, s32 screenIdx) { render_kart_particles(gPlayerTwo, PLAYER_TWO, screenIdx); render_kart_particles(gPlayerThree, PLAYER_THREE, screenIdx); render_kart_particles(gPlayerFour, PLAYER_FOUR, screenIdx); - if (gActiveScreenMode != SCREEN_MODE_3P_4P_SPLITSCREEN) { + if ((gActiveScreenMode != SCREEN_MODE_3P_4P_SPLITSCREEN) || + (gModeSelection == GRAND_PRIX)) { render_kart_particles(gPlayerFive, PLAYER_FIVE, screenIdx); render_kart_particles(gPlayerSix, PLAYER_SIX, screenIdx); render_kart_particles(gPlayerSeven, PLAYER_SEVEN, screenIdx); @@ -545,7 +548,8 @@ void func_80021B0C(void) { func_8006E7CC(gPlayerTwo, 1, 0); func_8006E7CC(gPlayerThree, 2, 0); func_8006E7CC(gPlayerFour, 3, 0); - if (gActiveScreenMode != SCREEN_MODE_3P_4P_SPLITSCREEN) { + if ((gActiveScreenMode != SCREEN_MODE_3P_4P_SPLITSCREEN) || + (gModeSelection == GRAND_PRIX)) { func_8006E7CC(gPlayerFive, 4, 0); func_8006E7CC(gPlayerSix, 5, 0); func_8006E7CC(gPlayerSeven, 6, 0); @@ -829,15 +833,27 @@ void func_8002276C(void) { } break; case SCREEN_MODE_3P_4P_SPLITSCREEN: - if ((VERSUS == gModeSelection) || (BATTLE == gModeSelection)) { - func_80022A98(gPlayerOne, 0); - func_80022A98(gPlayerTwo, 1); - func_80022A98(gPlayerThree, 2); - if (gPlayerCountSelection1 == 4) { + switch (gModeSelection) { + case GRAND_PRIX: /* switch 1 */ + func_80022A98(gPlayerOne, 0); + func_80022A98(gPlayerTwo, 1); + func_80022A98(gPlayerThree, 2); func_80022A98(gPlayerFour, 3); - } + func_80022A98(gPlayerFive, 4); + func_80022A98(gPlayerSix, 5); + func_80022A98(gPlayerSeven, 6); + func_80022A98(gPlayerEight, 7); + break; + case VERSUS: + case BATTLE: + func_80022A98(gPlayerOne, 0); + func_80022A98(gPlayerTwo, 1); + func_80022A98(gPlayerThree, 2); + if (gPlayerCountSelection1 == 4) { + func_80022A98(gPlayerFour, 3); + } + break; } - break; } } @@ -1344,17 +1360,9 @@ void render_kart(Player* player, s8 playerId, s8 screenId, s8 flipOffset) { } load_kart_palette(player, playerId, screenId, D_801651D0[screenId][playerId]); gPlayerPalette = &gPlayerPalettesList[D_801651D0[screenId][playerId]][screenId][playerId]; - // When screenId >= 2 (in 3/4 player mode), adjust indices to fit gEncodedKartTexture[2][2][8] dimensions - if ((screenId == 0) || (screenId == 1)) { - load_kart_texture(player, playerId, screenId, screenId, D_801651D0[screenId][playerId]); - } else { - load_kart_texture(player, playerId - 4, screenId, screenId - 1, D_801651D0[screenId][playerId]); - } - if ((screenId == 0) || (screenId == 1)) { - sKartTexture = gEncodedKartTexture[D_801651D0[screenId][playerId]][screenId][playerId].unk_00; - } else { - sKartTexture = gEncodedKartTexture[D_801651D0[screenId][playerId]][screenId - 1][playerId - 4].unk_00; - } + + load_kart_texture(player, playerId, screenId, screenId, D_801651D0[screenId][playerId]); + sKartTexture = gEncodedKartTexture[D_801651D0[screenId][playerId]][screenId][playerId].unk_00; mtxf_translate_rotate(mtx, sp154, sp14C); mtxf_scale(mtx, gCharacterSize[player->characterId] * player->size); convert_to_fixed_point_matrix(GetKartMatrix(playerId + (screenId * 8)), mtx); @@ -1460,11 +1468,7 @@ void render_ghost(Player* player, s8 playerId, s8 screenId, s8 flipOffset) { gPlayerPalette = (struct_D_802F1F80*) &gPlayerPalettesList[D_801651D0[screenId][playerId]][screenId][playerId * 0x100]; #endif - if ((screenId == 0) || (screenId == 1)) { - sKartTexture = gEncodedKartTexture[D_801651D0[screenId][playerId]][screenId][playerId].unk_00; - } else { - sKartTexture = gEncodedKartTexture[D_801651D0[screenId][playerId]][screenId - 1][playerId - 4].unk_00; - } + sKartTexture = gEncodedKartTexture[D_801651D0[screenId][playerId]][screenId][playerId].unk_00; mtxf_translate_rotate(mtx, spDC, spD4); mtxf_scale(mtx, gCharacterSize[player->characterId] * player->size); diff --git a/src/spawn_players.c b/src/spawn_players.c index a5e5d739f2..7250b4173c 100644 --- a/src/spawn_players.c +++ b/src/spawn_players.c @@ -755,6 +755,83 @@ void spawn_players_2p_battle(f32* arg0, f32* arg1, f32 arg2) { func_80039AE4(); } +// Added function +void spawn_players_gp_three_player(f32* arg0, f32* arg1, f32 arg2) { + func_80039DA4(); + if ((GetCupCursorPosition() == TRACK_ONE) || (gDemoMode == 1) || + (gDebugMenuSelection == DEBUG_MENU_OPTION_SELECTED)) { + + // Players + s32 arr[] = {MARIO, LUIGI, YOSHI, TOAD, DK, WARIO, PEACH, BOWSER}; + + // Remove human players + for (size_t i = 0; i < NUM_PLAYERS; i++) { + for (size_t j = 0; j < gPlayerCountSelection1; j++) { + if (arr[i] == gCharacterSelections[j]) { + arr[i] = -1; + break; + } + } + } + + // Set remaining players into chooseCPUPlayers + size_t numCPU = 0; + for (size_t i = 0; i < NUM_PLAYERS; i++) { + if (arr[i] != -1) { + chooseCPUPlayers[numCPU] = arr[i]; + numCPU++; + } + } + + // Shuffle + for (size_t i = numCPU - 1; i > 0; i--) { + size_t j = random_int(i); + size_t tmp = chooseCPUPlayers[i]; + chooseCPUPlayers[i] = chooseCPUPlayers[j]; + chooseCPUPlayers[j] = tmp; + } + } + + if (gPlayerCountSelection1 == 3) { + spawn_player(gPlayerFour, 3, arg0[D_80165270[3]], arg1[D_80165270[3]], arg2, 32768.0f, chooseCPUPlayers[0], + PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE); + spawn_player(gPlayerFive, 4, arg0[D_80165270[4]], arg1[D_80165270[4]], arg2, 32768.0f, chooseCPUPlayers[1], + PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE); + spawn_player(gPlayerSix, 5, arg0[D_80165270[5]], arg1[D_80165270[5]], arg2, 32768.0f, chooseCPUPlayers[2], + PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE); + spawn_player(gPlayerSeven, 6, arg0[D_80165270[6]], arg1[D_80165270[6]], arg2, 32768.0f, chooseCPUPlayers[3], + PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE); + spawn_player(gPlayerEight, 7, arg0[D_80165270[7]], arg1[D_80165270[7]], arg2, 32768.0f, chooseCPUPlayers[4], + PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE); + spawn_player(gPlayerOne, 0, arg0[D_80165270[0]], arg1[D_80165270[0]], arg2, 32768.0f, gCharacterSelections[0], + PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN); + spawn_player(gPlayerTwo, 1, arg0[D_80165270[1]], arg1[D_80165270[1]], arg2, 32768.0f, + gCharacterSelections[1], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN); + spawn_player(gPlayerThree, 2, arg0[D_80165270[2]], arg1[D_80165270[2]], arg2, 32768.0f, gCharacterSelections[2], + PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN); + } else { // 4 player + spawn_player(gPlayerFive, 4, arg0[D_80165270[4]], arg1[D_80165270[4]], arg2, 32768.0f, chooseCPUPlayers[0], + PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE); + spawn_player(gPlayerSix, 5, arg0[D_80165270[5]], arg1[D_80165270[5]], arg2, 32768.0f, chooseCPUPlayers[1], + PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE); + spawn_player(gPlayerSeven, 6, arg0[D_80165270[6]], arg1[D_80165270[6]], arg2, 32768.0f, chooseCPUPlayers[2], + PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE); + spawn_player(gPlayerEight, 7, arg0[D_80165270[7]], arg1[D_80165270[7]], arg2, 32768.0f, chooseCPUPlayers[3], + PLAYER_EXISTS | PLAYER_CPU | PLAYER_START_SEQUENCE); + spawn_player(gPlayerOne, 0, arg0[D_80165270[0]], arg1[D_80165270[0]], arg2, 32768.0f, gCharacterSelections[0], + PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN); + spawn_player(gPlayerTwo, 1, arg0[D_80165270[1]], arg1[D_80165270[1]], arg2, 32768.0f, gCharacterSelections[1], + PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN); + spawn_player(gPlayerThree, 2, arg0[D_80165270[2]], arg1[D_80165270[2]], arg2, 32768.0f, + gCharacterSelections[2], PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN); + spawn_player(gPlayerFour, 3, arg0[D_80165270[3]], arg1[D_80165270[3]], arg2, 32768.0f, gCharacterSelections[3], + PLAYER_EXISTS | PLAYER_START_SEQUENCE | PLAYER_HUMAN); + } + + D_80164A28 = 0; + func_80039AE4(); +} + 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); @@ -972,6 +1049,19 @@ void spawn_and_set_player_spawns(void) { case SCREEN_MODE_3P_4P_SPLITSCREEN: switch (gModeSelection) { + case GRAND_PRIX: // Added case to allow grand prix in 3/4 player split-screen + D_80165210[0] = (D_80165210[2] = (D_80165210[4] = (D_80165210[6] = sp5E + 0x14))); + D_80165210[1] = (D_80165210[3] = (D_80165210[5] = (D_80165210[7] = sp5E - 0x14))); + D_80165230[0] = sp5C + 0x1E; + D_80165230[1] = sp5C + 0x32; + D_80165230[2] = sp5C + 0x46; + D_80165230[3] = sp5C + 0x5A; + D_80165230[4] = sp5C + 0x6E; + D_80165230[5] = sp5C + 0x82; + D_80165230[6] = sp5C + 0x96; + D_80165230[7] = sp5C + 0xAA; + spawn_players_gp_three_player(D_80165210, D_80165230, sp5A); + break; case VERSUS: D_80165210[0] = sp5E + 0x1E; D_80165210[6] = sp5E - 0xA; @@ -1174,7 +1264,7 @@ void func_8003CD98(Player* player, Camera* camera, s8 playerId, s8 screenId) { } else { load_kart_palette(player, playerId, screenId, 0); load_kart_palette(player, playerId, screenId, 1); - load_kart_texture(player, (s8) (playerId + 4), screenId, (s8) (screenId - 2), 0); + load_kart_texture(player, (s8) (playerId), screenId, (s8) (screenId), 0); #ifdef TARGET_N64 mio0decode((u8*) &gEncodedKartTexture[0][screenId - 2][playerId + 4], (u8*) &D_802BFB80.arraySize8[0][screenId - 2][playerId + 4]); diff --git a/src/spawn_players.h b/src/spawn_players.h index 665a369c45..9a22356e5c 100644 --- a/src/spawn_players.h +++ b/src/spawn_players.h @@ -15,6 +15,7 @@ void spawn_players_versus_one_player(f32*, f32*, f32); void spawn_players_gp_two_player(f32* arg0, f32* arg1, f32); void spawn_players_versus_two_player(f32*, f32*, f32); void spawn_players_2p_battle(f32*, f32*, f32); +void spawn_players_gp_three_player(f32* arg0, f32* arg1, f32 arg2); void func_8003B318(f32*, f32*, f32); void spawn_players_3p_battle(f32*, f32*, f32); void func_8003B870(f32*, f32*, f32); diff --git a/src/textures.h b/src/textures.h index f23f212c8e..082cb1628e 100644 --- a/src/textures.h +++ b/src/textures.h @@ -499,8 +499,8 @@ extern MenuTexture D_02004638[2]; extern MenuTexture seg2_game_select_texture[2]; extern MenuTexture seg2_menu_1p_column[4]; extern MenuTexture seg2_menu_2p_column[5]; -extern MenuTexture seg2_menu_3p_column[4]; -extern MenuTexture seg2_menu_4p_column[4]; +extern MenuTexture seg2_menu_3p_column[5]; +extern MenuTexture seg2_menu_4p_column[5]; extern MenuTexture D_020047DC[2]; extern MenuTexture D_02004804[2]; extern MenuTexture D_0200482C[2];