summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMegaMech <MegaMech@users.noreply.github.com>2024-08-02 17:04:08 -0600
committerGitHub <noreply@github.com>2024-08-02 17:04:08 -0600
commit016b16a4845d51d32bbff97c29dbcf5509471e55 (patch)
tree3268591e9cfb3f31ba66ffaed88bd6d97d68513a
parent00067c03f66985ab894221f390cc92894be04945 (diff)
Fix menu bug & kart textures (#32)
* Fix menu bug * Fix undefined behaviour * Fix kart textures * Fix boost texture * Rename as per review * Fix buffer overflows --------- Co-authored-by: MegaMech <7255464+MegaMech@users.noreply.github.com>
-rw-r--r--src/buffers.h4
-rw-r--r--src/code_80057C60.c4
-rw-r--r--src/code_80091750.c94
-rw-r--r--src/kart_dma.c71
-rw-r--r--src/racing/memory.c6
-rw-r--r--src/render_objects.c2
-rw-r--r--src/render_player.c121
-rw-r--r--src/render_player.h2
-rw-r--r--src/spawn_players.c6
-rw-r--r--yamls/us/common_data.yml3
10 files changed, 158 insertions, 155 deletions
diff --git a/src/buffers.h b/src/buffers.h
index 66f58ad1a..f9b6a535e 100644
--- a/src/buffers.h
+++ b/src/buffers.h
@@ -36,8 +36,8 @@ typedef union {
* Likely over-sized due to encoded textures having variable size
*/
typedef struct {
- char unk_00[0x920];
-} struct_D_802DFB80; // size = 0x920
+ const char *unk_00; // Original 0x920 because compressed. But no longer compressed.
+} struct_D_802DFB80; // size = 0x1000
typedef struct {
u16 red:5;
diff --git a/src/code_80057C60.c b/src/code_80057C60.c
index ed29a3ef0..ff56d0e90 100644
--- a/src/code_80057C60.c
+++ b/src/code_80057C60.c
@@ -5228,12 +5228,12 @@ void func_80067604(Player *player, UNUSED s8 arg1, s16 arg2, s8 arg3) {
func_800652D4(sp8C, sp84, player->unk_258[30 + arg2].unk_00C * player->size);
if (player->unk_258[30 + arg2].unk_010 == 1) {
gSPDisplayList(gDisplayListHead++, D_0D008DB8);
- gDPLoadTextureBlock(gDisplayListHead++, common_texture_particle_spark, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gDPLoadTextureBlock(gDisplayListHead++, common_texture_particle_spark[0], G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
func_8004B72C(0x000000FF, 0x000000FF, 0x000000DF, 0x000000FF, 0x0000005F, 0, 0x00000060);
gSPDisplayList(gDisplayListHead++, D_0D008E70);
} else {
gSPDisplayList(gDisplayListHead++, D_0D008DB8);
- gDPLoadTextureBlock(gDisplayListHead++, common_texture_particle_spark, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gDPLoadTextureBlock(gDisplayListHead++, common_texture_particle_spark[0], G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
func_8004B72C(0x000000FF, 0x000000FF, 0x000000DF, 0x000000FF, 0x0000005F, 0, 0x00000060);
gSPDisplayList(gDisplayListHead++, D_0D008E48);
}
diff --git a/src/code_80091750.c b/src/code_80091750.c
index 2a2ac9f95..c19670ae3 100644
--- a/src/code_80091750.c
+++ b/src/code_80091750.c
@@ -1401,7 +1401,8 @@ void func_80091B78(void) {
D_8018EDF5 = 5;
D_8018EDF6 = 10;
if (osEepromProbe(&gSIEventMesgQueue) != 0) {
- load_save_data();
+ // save data disabled for now due to array overflow
+ //load_save_data();
}
if (func_80091D74() != 0) {
gMenuSelection = CONTROLLER_PAK_MENU;
@@ -1638,19 +1639,29 @@ void func_80092290(s32 arg0, s32 *arg1, s32 *arg2) {
}
//vtx = (Vtx *) segmented_to_virtual_dupe_2(&v1[0]);
+
temp_v1 = (*arg1 * 2) + 2;
+ //! @bug vtx array overflow temp fix
+ if ((vtx+temp_v1) >= 54) {
+ return;
+ }
temp_t6 = (vtx+temp_v1)->v.cn[0] * (256 - *arg2);
temp_t9 = (vtx+temp_v1)->v.cn[1] * (256 - *arg2);
temp_t7 = (vtx+temp_v1)->v.cn[2] * (256 - *arg2);
temp_t8_2 = (vtx+temp_v1)->v.cn[3] * (256 - *arg2);
+
temp_v1 = (((*arg1 * 2) + 2) % 6) + 2;
a = ((vtx+temp_v1)->v.cn[0] * *arg2);
b = ((vtx+temp_v1)->v.cn[1] * *arg2);
c = ((vtx+temp_v1)->v.cn[2] * *arg2);
d = ((vtx+temp_v1)->v.cn[3] * *arg2);
+ //! @bug vtx array overflow temp fix
+ if ((vtx+idx) >= 54) {
+ return;
+ }
(vtx+idx)->v.cn[0] = (temp_t6 + a) / 256;
(vtx+idx)->v.cn[1] = (temp_t9 + b) / 256;
@@ -3606,7 +3617,7 @@ void func_80099184(MkTexture *arg0)
while (var_s1->textureData != NULL) {
var_a1 = 0;
for (var_v0 = 0; var_v0 < gNumD_8018E118Entries; var_v0++) {
- if ( var_s1->textureData == (thing+var_v0)->textureData) {
+ if (var_s1->textureData == (thing+var_v0)->textureData) {
var_a1 = 1;
break;
}
@@ -3624,10 +3635,13 @@ void func_80099184(MkTexture *arg0)
}
//dma_copy_base_729a30(var_s1->textureData, var_a1_2, D_8018D9B4);
//mio0decode(D_8018D9B4, &D_8018D9B0[gD_8018E118TotalSize]);
- memcpy(&D_8018D9B0[gD_8018E118TotalSize], var_s1->textureData, var_a1_2);
+ //size_t texSize = ResourceGetTexSizeByName(var_s1->textureData);
+ //memcpy(&D_8018D9B0[gD_8018E118TotalSize], var_s1->textureData, texSize);
+ strcpy(&D_8018D9B0[gD_8018E118TotalSize], var_s1->textureData);
} else {
//dma_copy_base_729a30(var_s1->textureData, (var_s1->height * var_s1->width) * 2, &D_8018D9B0[gD_8018E118TotalSize]);
- memcpy(&D_8018D9B0[gD_8018E118TotalSize], var_s1->textureData, var_s1->width * var_s1->height*2);
+ //memcpy(&D_8018D9B0[gD_8018E118TotalSize], var_s1->textureData, var_s1->width * var_s1->height*2);
+ strcpy(&D_8018D9B0[gD_8018E118TotalSize], var_s1->textureData);
}
thing[gNumD_8018E118Entries].textureData = var_s1->textureData;
thing[gNumD_8018E118Entries].offset = gD_8018E118TotalSize;
@@ -3744,7 +3758,7 @@ void func_800996BC(MkTexture *arg0, s32 arg1) {
s32 var_a1;
u8 var_v0_2;
MkTexture *texture;
- struct_8018E118_entry *thing;
+ struct_8018E118_entry *thing = &D_8018E118[0];
texture = segmented_to_virtual_dupe(arg0);
@@ -3759,8 +3773,7 @@ void func_800996BC(MkTexture *arg0, s32 arg1) {
while (texture->textureData != NULL) {
var_a1 = 0;
for (var_v0 = 0; var_v0 < gNumD_8018E118Entries; var_v0++) {
- // wtf is going on here?
- if (D_8018E118[var_v0].textureData == (*texture).textureData) {
+ if (texture->textureData == (thing+var_v0)->textureData) {
var_a1 = 1;
break;
}
@@ -3807,10 +3820,8 @@ void func_800996BC(MkTexture *arg0, s32 arg1) {
break;
}
- thing = &D_8018E118[gNumD_8018E118Entries];
- thing->textureData = texture->textureData;
- thing = &D_8018E118[gNumD_8018E118Entries];
- thing->offset = gD_8018E118TotalSize;
+ thing[gNumD_8018E118Entries].textureData = texture->textureData;
+ thing[gNumD_8018E118Entries].offset = gD_8018E118TotalSize;
gD_8018E118TotalSize += texture->height * texture->width;
gD_8018E118TotalSize = ((gD_8018E118TotalSize / 8) * 8) + 8;
gNumD_8018E118Entries += 1;
@@ -10093,19 +10104,27 @@ void func_800AAE18(struct_8018D9E0_entry *arg0) {
* is found.
**/
struct_8018D9E0_entry *func_800AAE68(void) {
- struct_8018D9E0_entry *entry = D_8018D9E0;
- s32 thing = gPlayerCount - 1;
-
- for(; !(entry > &D_8018D9E0[D_8018D9E0_SIZE]); entry++) {
- if ((thing + 0xB) == entry->type) {
- goto escape;
+ s32 count = gPlayerCount - 1;
+ for (size_t i = 0; i < ARRAY_COUNT(D_8018D9E0); i++) {
+ if (D_8018D9E0[i].type == (count + 0xB)) {
+ return &D_8018D9E0[i];
}
}
+ printf("Error: func_800AAE68 returned a null value when searching id 0x%X", count+0xB);
+ return NULL;
+// struct_8018D9E0_entry *entry = D_8018D9E0;
+// s32 thing = gPlayerCount - 1;
- // Something VERY wrong has occurred
- while(true);
-escape:
- return entry;
+// for(; !(entry > &D_8018D9E0[D_8018D9E0_SIZE]); entry++) {
+// if ((thing + 0xB) == entry->type) {
+// goto escape;
+// }
+// }
+
+// // Something VERY wrong has occurred
+// while(true);
+// escape:
+// return entry;
}
/**
@@ -10114,18 +10133,27 @@ escape:
* is found.
**/
struct_8018D9E0_entry *func_800AAEB4(s32 arg0) {
- struct_8018D9E0_entry *entry = D_8018D9E0;
- for(; !(entry > &D_8018D9E0[D_8018D9E0_SIZE]); entry++) {
- if ((arg0 + 0x2B) == entry->type) {
- goto escape;
+ for (size_t i = 0; i < ARRAY_COUNT(D_8018D9E0); i++) {
+ if (D_8018D9E0[i].type == (arg0 + 0x2B)) {
+ return &D_8018D9E0[i];
}
}
+ printf("Error: func_800AAEB4 returned a null value when searching id 0x%X", arg0+0x2B);
+ return NULL;
- // Something VERY wrong has occurred
- while(true);
-escape:
- return entry;
+// struct_8018D9E0_entry *entry = D_8018D9E0;
+
+// for(; !(entry > &D_8018D9E0[D_8018D9E0_SIZE]); entry++) {
+// if ((arg0 + 0x2B) == entry->type) {
+// goto escape;
+// }
+// }
+
+// // Something VERY wrong has occurred
+// while(true);
+// escape:
+// return entry;
}
/**
@@ -10140,10 +10168,11 @@ escape:
**/
struct_8018D9E0_entry *find_8018D9E0_entry_dupe(s32 arg0) {
for (size_t i = 0; i < ARRAY_COUNT(D_8018D9E0); i++) {
- if (&D_8018D9E0[i].type == arg0) {
+ if (D_8018D9E0[i].type == arg0) {
return &D_8018D9E0[i];
}
}
+ printf("Error: find_8018D9E0_entry_dupe returned a null value when searching id 0x%X", arg0);
return NULL;
@@ -10162,10 +10191,13 @@ struct_8018D9E0_entry *find_8018D9E0_entry_dupe(s32 arg0) {
struct_8018D9E0_entry *find_8018D9E0_entry(s32 arg0) {
for (size_t i = 0; i < ARRAY_COUNT(D_8018D9E0); i++) {
- if (&D_8018D9E0[i].type == arg0) {
+ if (D_8018D9E0[i].type == arg0) {
return &D_8018D9E0[i];
}
}
+ // No printf here as returning null seems to be normal game logic
+ //printf("Error: find_8018D9E0_entry returned a null value when searching id 0x%X",
+ // arg0);
return NULL;
// struct_8018D9E0_entry *entry = D_8018D9E0;
diff --git a/src/kart_dma.c b/src/kart_dma.c
index cc329c7ab..51235b2e7 100644
--- a/src/kart_dma.c
+++ b/src/kart_dma.c
@@ -1704,15 +1704,9 @@ u8 *gKartPalettes[] = {
**/
void load_kart_texture(Player *player, s8 playerId, s8 screenId, s8 screenId2, s8 zero) {
s32 temp = player->effects;
- u8 *texture;
- u8 *asset;
- size_t size = 0;
if (((temp & 0x80) == 0x80) || ((temp & 0x40) == 0x40) || ((temp & 0x80000) == 0x80000) || ((temp & 0x800000) == 0x800000) || ((temp & 0x20000) == 0x20000) || ((player->unk_044 & 0x800) != 0)) {
if (player->animFrameSelector[screenId] != 0) {
osInvalDCache(&D_802DFB80[zero][screenId2][playerId], D_800DDEB0[player->characterId]);
-
-
- texture = gKartTextureTable1[player->characterId][player->animGroupSelector[screenId]][player->animFrameSelector[screenId]];
// osPiStartDma(
// &gDmaIoMesg,
// OS_MESG_PRI_NORMAL, OS_READ,
@@ -1724,12 +1718,7 @@ void load_kart_texture(Player *player, s8 playerId, s8 screenId, s8 screenId2, s
// &gDmaMesgQueue
// );
//printf("T1 kart %s\n", texture);
-
- //return gKartTextureTable1[player->characterId][player->animGroupSelector[screenId]][player->animFrameSelector[screenId]];
- size = ResourceGetTexSizeByName(texture);
- asset = (u8 *) LOAD_ASSET(texture);
- memcpy(&D_802DFB80[zero][screenId2][playerId], asset, 0x1000);
-
+ D_802DFB80[zero][screenId2][playerId].unk_00 = gKartTextureTable1[player->characterId][player->animGroupSelector[screenId]][player->animFrameSelector[screenId]];
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
} else {
osInvalDCache(&D_802DFB80[zero][screenId2][playerId], D_800DDEB0[player->characterId]);
@@ -1745,12 +1734,7 @@ void load_kart_texture(Player *player, s8 playerId, s8 screenId, s8 screenId2, s
// D_800DDEB0[player->characterId],
// &gDmaMesgQueue
// );
-
- texture = gKartTextureTable0[player->characterId][player->animGroupSelector[screenId]][player->animFrameSelector[screenId]];
- size = ResourceGetTexSizeByName(texture);
- //printf("T0 kart %s\n",texture);
- asset = (u8 *) LOAD_ASSET(texture);
- memcpy(&D_802DFB80[zero][screenId2][playerId], asset, 0x1000);
+ D_802DFB80[zero][screenId2][playerId].unk_00 = gKartTextureTable0[player->characterId][player->animGroupSelector[screenId]][player->animFrameSelector[screenId]];
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
} else if (((temp & 0x400) == 0x400) || ((temp & 0x01000000) == 0x01000000) || ((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000)) {
@@ -1767,12 +1751,7 @@ void load_kart_texture(Player *player, s8 playerId, s8 screenId, s8 screenId2, s
// 0x900,
// &gDmaMesgQueue
// );
- texture = gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8];
- //printf("Tum Kart %s\n",texture);
- size = ResourceGetTexSizeByName(texture);
- asset = (u8 *) LOAD_ASSET(texture);
- memcpy(&D_802DFB80[zero][screenId2][playerId], asset, 0x1000);
-
+ D_802DFB80[zero][screenId2][playerId].unk_00 = gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8];
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
} else {
osInvalDCache(&D_802DFB80[zero][screenId2][playerId], D_800DDEB0[player->characterId]);
@@ -1786,24 +1765,15 @@ void load_kart_texture(Player *player, s8 playerId, s8 screenId, s8 screenId2, s
// )],
// &D_802DFB80[arg4][arg3][playerId],
// D_800DDEB0[player->characterId],
- // &gDmaMesgQueue
+ // &gDmaMesgQueue
// );
-
- texture = gKartTextureTable0[player->characterId][player->animGroupSelector[screenId]][player->animFrameSelector[screenId]];
- //printf("T0 kart 2 %s\n", texture);
- size = ResourceGetTexSizeByName(texture);
- asset = (u8 *) LOAD_ASSET(texture);
- memcpy(&D_802DFB80[zero][screenId2][playerId], asset, 0x1000);
-
+ D_802DFB80[zero][screenId2][playerId].unk_00 = gKartTextureTable0[player->characterId][player->animGroupSelector[screenId]][player->animFrameSelector[screenId]];
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
}
void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4, size_t i) {
s32 temp = player->effects;
- u8 *asset;
- u8 *texture;
- size_t size;
if (((temp & 0x80) == 0x80) || ((temp & 0x40) == 0x40) || ((temp & 0x80000) == 0x80000) || ((temp & 0x800000) == 0x800000) || ((temp & 0x20000) == 0x20000) || ((player->unk_044 & 0x800) != 0))
{
@@ -1821,14 +1791,7 @@ void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4, size_t i)
// D_800DDEB0[player->characterId],
// &gDmaMesgQueue
// );
-
- texture = gKartTextureTable1[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]];
- //printf("T1 kart 2 %s\n", texture);
- size = ResourceGetTexSizeByName(texture);
- asset = (u8 *) LOAD_ASSET(texture);
- memcpy(&D_802DFB80[arg4][arg3][arg1],
- asset, size);
-
+ D_802DFB80[arg4][arg3][arg1].unk_00 = gKartTextureTable1[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]];
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
@@ -1843,11 +1806,7 @@ void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4, size_t i)
// D_800DDEB0[player->characterId],
// &gDmaMesgQueue
// );
- texture = gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]];
- //printf("T0 kart 3 %s\n", texture);
- size = ResourceGetTexSizeByName(texture);
- asset = (u8 *) LOAD_ASSET(texture);
- memcpy(&D_802DFB80[arg4][arg3][arg1], asset, size);
+ D_802DFB80[arg4][arg3][arg1].unk_00 = gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]];
}
} else if (((temp & 0x400) == 0x400) || ((temp & 0x01000000) == 0x01000000) ||
((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000))
@@ -1865,11 +1824,7 @@ void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4, size_t i)
// 0x900,
// &gDmaMesgQueue
// );
- texture = gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8];
- //printf("Tum kart 2 %s\n", texture);
- size = ResourceGetTexSizeByName(texture);
- asset = (u8 *) LOAD_ASSET(texture);
- memcpy(&D_802DFB80[arg4][arg3][arg1], asset, size);
+ D_802DFB80[arg4][arg3][arg1].unk_00 = gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8];
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
@@ -1884,11 +1839,7 @@ void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4, size_t i)
// D_800DDEB0[player->characterId],
// &gDmaMesgQueue
// );
- texture = gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]];
- //printf("T0 kart 4 %s 0x%llX\n", texture, &D_802DFB80[arg4][arg3][arg1]);
- size = ResourceGetTexSizeByName(texture);
- asset = (u8 *) LOAD_ASSET(texture);
- memcpy(&D_802DFB80[arg4][arg3][arg1], asset, size);
+ D_802DFB80[arg4][arg3][arg1].unk_00 = gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]];
}
}
@@ -1982,6 +1933,6 @@ void func_80027C74(UNUSED Player *player, u8 *texture, void *vAddr, u16 size) {
// );
//printf("test %s\n",texture);
- //size_t textureSize = ResourceGetTexSizeByName(texture);
- memcpy(vAddr, texture, size);
+ //size_t textureSize = ResourceGetTexSizeByName(texture);
+ memcpy(vAddr, texture, size);
}
diff --git a/src/racing/memory.c b/src/racing/memory.c
index 8d9a557a8..d984d64a8 100644
--- a/src/racing/memory.c
+++ b/src/racing/memory.c
@@ -1521,10 +1521,10 @@ u8 *load_lakitu_textures_x64(const char** textureList, size_t length) {
gNextFreeMemoryAddress += size;
size_t offset = 0;
for (size_t i = 0; i < length; i++) {
- //u8 *tex = (u8 *) LOAD_ASSET(textureList[i]);
+ u8 *tex = (u8 *) LOAD_ASSET(textureList[i]);
size_t texSize = ResourceGetTexSizeByName(textureList[i]);
- printf("\nTEX SIZE: %X\n\n", texSize);
- memcpy(&textures[offset], textureList[i], texSize);
+ //printf("\nTEX SIZE: %X\n\n", texSize);
+ memcpy(&textures[offset], tex, texSize);
offset += texSize;
}
return textures;
diff --git a/src/render_objects.c b/src/render_objects.c
index d461599bb..6d454b508 100644
--- a/src/render_objects.c
+++ b/src/render_objects.c
@@ -4207,7 +4207,7 @@ void func_800562E4(s32 arg0, s32 arg1, s32 arg2) {
D_80165878 = A_800E46F8[arg0][2];
func_8004B138(D_80165860, D_8016586C, D_80165878, arg2);
rsp_set_matrix_transformation(D_80183E40, D_80183E80, 0.2f);
- func_80044BF8(common_texture_particle_spark[arg1], 0x00000020, 0x00000020);
+ func_80044BF8(common_texture_particle_spark[arg1], 32, 32);
gSPVertex(gDisplayListHead++, D_0D005AE0, 4, 0);
gSPDisplayList(gDisplayListHead++, common_rectangle_display);
}
diff --git a/src/render_player.c b/src/render_player.c
index 62f65cdb9..0517a50a7 100644
--- a/src/render_player.c
+++ b/src/render_player.c
@@ -49,8 +49,8 @@ Player *D_80164AD0[8];
s16 gMatrixEffectCount;
s32 D_80164AF4[3];
struct_D_802F1F80 *gPlayerPalette;
-u8 *D_80164B08;
-u8 *D_80164B0C;
+static const char *sKartUpperTexture;
+static const char *sKartLowerTexture;
u16 gPlayerRedEffect[8];
u16 gPlayerGreenEffect[8];
u16 gPlayerBlueEffect[8];
@@ -281,17 +281,21 @@ void func_80020524(void) {
//mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].pixel_index_array);
- memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].pixel_index_array,
- D_802DFB80[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].unk_00, 0x1000);
+ // memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].pixel_index_array,
+ // D_802DFB80[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].unk_00, 0x1000);
+ strcpy(D_802BFB80.arraySize8[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].unk_00);
+
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
//mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array);
- memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array,
- D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00, 0x1000);
+ // memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array,
+ // D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00, 0x1000);
+
+ strcpy(D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00);
}
@@ -314,17 +318,20 @@ void func_8002088C(void) {
//mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].pixel_index_array);
- memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].pixel_index_array,
- D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].unk_00, 0x1000);
+ // memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].pixel_index_array,
+ // D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].unk_00, 0x1000);
+
+ strcpy(D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].unk_00);
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
//func_80027560(D_80164AD0[0], D_80164AB0[0], D_80164AC0[0], D_80164AC0[0], D_801651D0[D_80164AC0[0]][D_80164AB0[0]], 0);
//mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array);
- memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array,
- D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00, 0x1000);
+ // memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array,
+ // D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00, 0x1000);
+ strcpy(D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00);
}
void func_80020BF4(void) {
@@ -341,17 +348,19 @@ void func_80020BF4(void) {
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].pixel_index_array);
- memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].pixel_index_array,
- D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].unk_00, 0x1000);
-
+ // memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].pixel_index_array,
+ // D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].unk_00, 0x1000);
+ strcpy(D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].unk_00);
// osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
//func_80027560(D_80164AD0[0], D_80164AB0[0] + 4, D_80164AC0[0], D_80164AC0[0] - 2, D_801651D0[D_80164AC0[0]][D_80164AB0[0]], 0);
//mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array);
- memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00, 0x1000);
+ // memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00, 0x1000);
+
+ strcpy(D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00);
}
void func_80020F1C(void) {
@@ -369,14 +378,15 @@ void func_80020F1C(void) {
// osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
- memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].unk_00,0x1000);
-
+ //memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].unk_00,0x1000);
+ strcpy(D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].unk_00);
}
//func_80027560(D_80164AD0[0], D_80164AB0[0] + 4, D_80164AC0[0], D_80164AC0[0] - 2, D_801651D0[D_80164AC0[0]][D_80164AB0[0]], 0);
// mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array);
- memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00, 0x1000);
+ //memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00, 0x1000);
+ strcpy(D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00);
}
void try_render_player(Player *player, s8 playerId, s8 arg2) {
@@ -1410,7 +1420,7 @@ void render_player_shadow_credits(Player *player, s8 playerId, s8 arg2) {
gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF);
}
-void kart_render(Player *player, s8 playerId, s8 arg2, s8 arg3) {
+void kart_render(Player *player, s8 playerId, s8 screenId, s8 arg3) {
UNUSED s32 pad;
Mat4 sp1A4;
UNUSED s32 pad2[17];
@@ -1424,53 +1434,53 @@ void kart_render(Player *player, s8 playerId, s8 arg2, s8 arg3) {
if (player->unk_044 & 0x2000) {
sp14C[0] = 0;
- sp14C[1] = player->unk_048[arg2];
+ sp14C[1] = player->unk_048[screenId];
sp14C[2] = 0;
- func_80062B18(&sp148, &sp144, &sp140, 0.0f, 1.5f, 0.0f, -player->unk_048[arg2], player->unk_050[arg2]);
+ func_80062B18(&sp148, &sp144, &sp140, 0.0f, 1.5f, 0.0f, -player->unk_048[screenId], player->unk_050[screenId]);
sp154[1] = (player->pos[1] - player->boundingBoxSize) + (sp144 - 2.0);
sp154[0] = player->pos[0] + sp148;
sp154[2] = player->pos[2] + sp140;
} else {
- thing = (u16)(player->unk_048[arg2] + player->rotation[1] + player->unk_0C0);
- temp_v1 = player->unk_0CC[arg2] * sins(thing);
+ thing = (u16)(player->unk_048[screenId] + player->rotation[1] + player->unk_0C0);
+ temp_v1 = player->unk_0CC[screenId] * sins(thing);
if ((player->effects & 8) == 8) {
- sp14C[0] = cameras[arg2].rot[0] - 0x4000;
+ sp14C[0] = cameras[screenId].rot[0] - 0x4000;
} else {
sp14C[0] = -temp_v1 * 0.8;
}
- sp14C[1] = player->unk_048[arg2];
- sp14C[2] = player->unk_050[arg2];
+ sp14C[1] = player->unk_048[screenId];
+ sp14C[2] = player->unk_050[screenId];
if (((s32)player->effects & HIT_EFFECT) == HIT_EFFECT) {
- func_80062B18(&sp148, &sp144, &sp140, 0.0f, 8.0f, 0.0f, -player->unk_048[arg2], player->unk_050[arg2]);
+ func_80062B18(&sp148, &sp144, &sp140, 0.0f, 8.0f, 0.0f, -player->unk_048[screenId], player->unk_050[screenId]);
sp154[1] = (player->pos[1] - player->boundingBoxSize) + player->unk_108;
sp154[0] = player->pos[0] + sp148;
sp154[2] = player->pos[2] + sp140;
} else {
- func_80062B18(&sp148, &sp144, &sp140, 0.0f, 1.5f, 0.0f, -player->unk_048[arg2], player->unk_050[arg2]);
+ func_80062B18(&sp148, &sp144, &sp140, 0.0f, 1.5f, 0.0f, -player->unk_048[screenId], player->unk_050[screenId]);
sp154[1] = (player->pos[1] - player->boundingBoxSize) + player->unk_108 + (sp144 - 2.0);
sp154[0] = player->pos[0] + sp148;
sp154[2] = player->pos[2] + sp140;
}
}
#ifdef AVOID_UB
- gPlayerPalette = &D_802F1F80[D_801651D0[arg2][playerId]][arg2][playerId];
+ gPlayerPalette = &D_802F1F80[D_801651D0[screenId][playerId]][screenId][playerId];
#else
- gPlayerPalette = (struct_D_802F1F80 *) &D_802F1F80[D_801651D0[arg2][playerId]][arg2][playerId * 0x100];
+ gPlayerPalette = (struct_D_802F1F80 *) &D_802F1F80[D_801651D0[screenId][playerId]][screenId][playerId * 0x100];
#endif
- if ((arg2 == 0) || (arg2 == 1)) {
- D_80164B08 = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2][playerId].pixel_index_array[0];
- D_80164B0C = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2][playerId].pixel_index_array[0x7C0];
+ if ((screenId == 0) || (screenId == 1)) {
+ sKartUpperTexture = D_802BFB80.arraySize8[D_801651D0[screenId][playerId]][screenId][playerId].pixel_index_array;
+ //sKartLowerTexture = &D_802BFB80.arraySize8[D_801651D0[screenId][playerId]][screenId][playerId].pixel_index_array[0x7C0];
} else {
- D_80164B08 = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2 - 1][playerId - 4].pixel_index_array[0];
- D_80164B0C = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2 - 1][playerId - 4].pixel_index_array[0x7C0];
+ sKartUpperTexture = D_802BFB80.arraySize8[D_801651D0[screenId][playerId]][screenId - 1][playerId - 4].pixel_index_array;
+ //sKartLowerTexture = &D_802BFB80.arraySize8[D_801651D0[screenId][playerId]][screenId - 1][playerId - 4].pixel_index_array[0x7C0];
}
mtxf_translate_rotate(sp1A4, sp154, sp14C);
mtxf_scale2(sp1A4, gCharacterSize[player->characterId] * player->size);
- convert_to_fixed_point_matrix(&gGfxPool->mtxKart[playerId + (arg2 * 8)], sp1A4);
+ convert_to_fixed_point_matrix(&gGfxPool->mtxKart[playerId + (screenId * 8)], sp1A4);
if ((player->effects & BOO_EFFECT) == BOO_EFFECT) {
- if (arg2 == playerId) {
- gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (arg2 * 8)]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ if (screenId == playerId) {
+ gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (screenId * 8)]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gDisplayListHead++, common_setting_render_character);
gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette);
gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16);
@@ -1485,7 +1495,7 @@ void kart_render(Player *player, s8 playerId, s8 arg2, s8 arg3) {
);
gDPSetRenderMode(gDisplayListHead++, AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA));
} else {
- gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (arg2 * 8)]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (screenId * 8)]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gDisplayListHead++, common_setting_render_character);
gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette);
gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16);
@@ -1501,7 +1511,7 @@ void kart_render(Player *player, s8 playerId, s8 arg2, s8 arg3) {
gDPSetRenderMode(gDisplayListHead++, AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA));
}
} else if (((player->unk_0CA & 4) == 4) || (player->soundEffects & 0x08000000) || (player->soundEffects & 0x04000000)) {
- gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (arg2 * 8)]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (screenId * 8)]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gDisplayListHead++, common_setting_render_character);
gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette);
gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16);
@@ -1517,7 +1527,7 @@ void kart_render(Player *player, s8 playerId, s8 arg2, s8 arg3) {
gDPSetAlphaCompare(gDisplayListHead++, G_AC_DITHER);
gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_XLU_SURF, G_RM_ZB_XLU_SURF2);
} else {
- gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (arg2 * 8)]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (screenId * 8)]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gDisplayListHead++, common_setting_render_character);
gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette);
gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16);
@@ -1532,11 +1542,14 @@ void kart_render(Player *player, s8 playerId, s8 arg2, s8 arg3) {
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2);
}
- gDPLoadTextureBlock(gDisplayListHead++, D_80164B08, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ // Render heads
+ gDPLoadTextureBlock(gDisplayListHead++, sKartUpperTexture, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &D_800DDBB4[playerId][arg3], 4, 0);
gSPDisplayList(gDisplayListHead++, common_square_plain_render);
- gDPLoadTextureBlock(gDisplayListHead++, D_80164B0C, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ // Render karts
+ u8 *test = (u8 *)LOAD_ASSET(sKartUpperTexture);
+ gDPLoadTextureBlock(gDisplayListHead++, test+0x7C0, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &D_800DDBB4[playerId][arg3 + 4], 4, 0);
gSPDisplayList(gDisplayListHead++, common_square_plain_render);
gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF);
@@ -1576,11 +1589,11 @@ void ghost_render(Player *player, s8 playerId, s8 arg2, s8 arg3) {
gPlayerPalette = (struct_D_802F1F80 *) &D_802F1F80[D_801651D0[arg2][playerId]][arg2][playerId * 0x100];
#endif
if ((arg2 == 0) || (arg2 == 1)) {
- D_80164B08 = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2][playerId].pixel_index_array[0];
- D_80164B0C = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2][playerId].pixel_index_array[0x7C0];
+ sKartUpperTexture = D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2][playerId].pixel_index_array;
+ //sKartLowerTexture = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2][playerId].pixel_index_array[0x7C0];
} else {
- D_80164B08 = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2 - 1][playerId - 4].pixel_index_array[0];
- D_80164B0C = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2 - 1][playerId - 4].pixel_index_array[0x7C0];
+ sKartUpperTexture = D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2 - 1][playerId - 4].pixel_index_array;
+ //sKartLowerTexture = &D_802BFB80.arraySize8[D_801651D0[arg2][playerId]][arg2 - 1][playerId - 4].pixel_index_array[0x7C0];
}
mtxf_translate_rotate(sp12C, spDC, spD4);
@@ -1602,11 +1615,12 @@ void ghost_render(Player *player, s8 playerId, s8 arg2, s8 arg3) {
);
gDPSetRenderMode(gDisplayListHead++, AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA));
- gDPLoadTextureBlock(gDisplayListHead++, D_80164B08, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gDPLoadTextureBlock(gDisplayListHead++, sKartUpperTexture, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &D_800DDBB4[playerId][arg3], 4, 0);
gSPDisplayList(gDisplayListHead++, common_square_plain_render);
- gDPLoadTextureBlock(gDisplayListHead++, D_80164B0C, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ u8 *test = (u8 *)LOAD_ASSET(sKartUpperTexture);
+ gDPLoadTextureBlock(gDisplayListHead++, test+0x7C0, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &D_800DDBB4[playerId][arg3 + 4], 4, 0);
gSPDisplayList(gDisplayListHead++, common_square_plain_render);
gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF);
@@ -1643,11 +1657,12 @@ void func_80025DE8(Player *player, s8 playerId, s8 arg2, s8 arg3) {
);
gDPSetRenderMode(gDisplayListHead++, AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA));
- gDPLoadTextureBlock(gDisplayListHead++, D_80164B08, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gDPLoadTextureBlock(gDisplayListHead++, sKartUpperTexture, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &D_800DDBB4[playerId][arg3], 4, 0);
gSPDisplayList(gDisplayListHead++, common_square_plain_render);
- gDPLoadTextureBlock(gDisplayListHead++, D_80164B0C, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ u8 *test = (u8 *)LOAD_ASSET(sKartUpperTexture);
+ gDPLoadTextureBlock(gDisplayListHead++, test+0x7C0, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &D_800DDBB4[playerId][arg3 + 4], 4, 0);
gSPDisplayList(gDisplayListHead++, common_square_plain_render);
gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF);
@@ -1688,10 +1703,12 @@ void player_ice_reflection_render(Player *player, s8 playerId, s8 arg2, s8 arg3)
(s16) player->unk_0C6 / 2
);
gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_XLU_SURF, G_RM_ZB_XLU_SURF2);
- gDPLoadTextureBlock(gDisplayListHead++, D_80164B08, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gDPLoadTextureBlock(gDisplayListHead++, sKartUpperTexture, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &D_800DDBB4[playerId][arg3], 4, 0);
gSPDisplayList(gDisplayListHead++, common_square_plain_render);
- gDPLoadTextureBlock(gDisplayListHead++, D_80164B0C, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+
+ u8 *test = (u8 *)LOAD_ASSET(sKartUpperTexture);
+ gDPLoadTextureBlock(gDisplayListHead++, test+0x7C0, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &D_800DDBB4[playerId][arg3 + 4], 4, 0);
gSPDisplayList(gDisplayListHead++, common_square_plain_render);
gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF);
diff --git a/src/render_player.h b/src/render_player.h
index 345ab2ae8..35b7b706b 100644
--- a/src/render_player.h
+++ b/src/render_player.h
@@ -68,8 +68,6 @@ void func_80027024(s32, s32, s32);
/* This is where I'd put my static data, if I had any */
extern struct_D_802F1F80 *gPlayerPalette;
-extern u8 *D_80164B08;
-extern u8 *D_80164B0C;
extern s32 D_80164A28;
extern s16 D_80164AB0[];
diff --git a/src/spawn_players.c b/src/spawn_players.c
index 4eb4732c2..7f1547f02 100644
--- a/src/spawn_players.c
+++ b/src/spawn_players.c
@@ -1087,13 +1087,15 @@ void func_8003CD98(Player *player, Camera *camera, s8 playerId, s8 screenId) {
load_kart_palette(player, playerId, screenId, 1);
load_kart_texture(player, playerId, screenId, screenId, 0);
//mio0decode((u8 *) &D_802DFB80[0][arg3][playerId], (u8 *) &D_802BFB80.arraySize8[0][arg3][playerId]);
- memcpy(&D_802BFB80.arraySize8[0][screenId][playerId], &D_802DFB80[0][screenId][playerId], 0x1000);
+ // This memcpy does not seem to be required for some reason
+ //memcpy(&D_802BFB80.arraySize8[0][screenId][playerId], &D_802DFB80[0][screenId][playerId], 0x1000);
} 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);
//mio0decode((u8 *) &D_802DFB80[0][arg3 - 2][playerId + 4], (u8 *) &D_802BFB80.arraySize8[0][arg3 - 2][playerId + 4]);
- memcpy(&D_802BFB80.arraySize8[0][screenId - 2][playerId + 4], &D_802DFB80[0][screenId - 2][playerId + 4], 0x1000);
+ // This memcpy does not seem to be required for some reason
+ //memcpy(&D_802BFB80.arraySize8[0][screenId - 2][playerId + 4], &D_802DFB80[0][screenId - 2][playerId + 4], 0x1000);
}
D_801650D0[screenId][playerId] = player->animFrameSelector[screenId];
diff --git a/yamls/us/common_data.yml b/yamls/us/common_data.yml
index 8a90d43bf..8a773c16e 100644
--- a/yamls/us/common_data.yml
+++ b/yamls/us/common_data.yml
@@ -2126,6 +2126,7 @@ common_texture_particle_spark_2:
offset: 0x2B058
width: 32
height: 32
+ ctype: u8
type: texture
format: i8
common_texture_particle_spark_3:
@@ -2133,6 +2134,7 @@ common_texture_particle_spark_3:
offset: 0x2B458
width: 32
height: 32
+ ctype: u8
type: texture
format: i8
common_texture_particle_spark_4:
@@ -2140,6 +2142,7 @@ common_texture_particle_spark_4:
offset: 0x2B858
width: 32
height: 32
+ ctype: u8
type: texture
format: i8
common_texture_particle_smoke_1: