diff --git a/include/functions.h b/include/functions.h index a9705281d..dbdc6c819 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1683,8 +1683,8 @@ s16 func_80105318(void); // void func_8010534C(void); void func_8010549C(PlayState* play, void* segmentAddress); void func_8010565C(PlayState* play, s32 num, void* segmentAddress); -void func_80105818(PlayState* play, u32 uParm2, TransitionActorEntry* puParm3); -void func_80105A40(void); +void func_80105818(PlayState* play, s32 num, TransitionActorEntry* transitionActorList); +void func_80105A40(PlayState* play); void func_80105B34(PlayState* play); void func_80105C40(s16 arg0); // void func_80105FE0(void); diff --git a/include/z64.h b/include/z64.h index c9cbeb1bc..2405448fd 100644 --- a/include/z64.h +++ b/include/z64.h @@ -37,7 +37,6 @@ #include "z64effect.h" #include "z64item.h" #include "z64light.h" -#include "z64map.h" #include "z64math.h" #include "z64message.h" #include "z64object.h" @@ -45,6 +44,7 @@ #include "z64player.h" #include "z64save.h" #include "z64scene.h" +#include "z64map.h" #include "z64schedule.h" #include "z64skin.h" #include "z64subs.h" diff --git a/include/z64map.h b/include/z64map.h index a17317548..2dd7ef90c 100644 --- a/include/z64map.h +++ b/include/z64map.h @@ -1,40 +1,14 @@ #ifndef Z64MAP_H #define Z64MAP_H #include "ultra64.h" - +#include "z64scene.h" #define FLOOR_INDEX_MAX 4 /* z_scene */ -typedef struct { - /* 0x00 */ u16 unk0; - /* 0x02 */ s16 unk2; - /* 0x04 */ UNK_TYPE2 unk4; - /* 0x06 */ s16 unk6; - /* 0x08 */ u16 unk8; -} MinimapEntry; // size = 0xA - -typedef struct { - /* 0x00 */ MinimapEntry* entry; - /* 0x04 */ s32 unk4; -} MinimapList; // size = 0x8 - -typedef struct { - /* 0x00 */ MinimapEntry* entry; - /* 0x04 */ s16 unk4; -} MinimapList2; // size = 0x8 - -typedef struct { - /* 0x00 */ UNK_TYPE2 unk0; - /* 0x02 */ UNK_TYPE2 unk2; - /* 0x04 */ UNK_TYPE2 unk4; - /* 0x06 */ UNK_TYPE2 unk6; - /* 0x08 */ UNK_TYPE2 unk8; -} MinimapChest; // size = 0xA - /* z_map_data */ typedef struct { - /* 0x00 */ s32 unk0; + /* 0x00 */ TexturePtr lmapTex; //minimap texture /* 0x04 */ u8 unk4; /* 0x05 */ u8 unk5; /* 0x06 */ u8 unk6; @@ -78,15 +52,15 @@ typedef struct { /* 0x0A */ s16 unkA; /* 0x0C */ s16 unkC; /* 0x0E */ s16 unkE; - /* 0x10 */ TexturePtr unk10; + /* 0x10 */ TexturePtr unk10; // gameplay cur minimap room /* 0x14 */ s32 unk14; //unk4 same type as unk14 /* 0x18 */ TexturePtr unk18; /* 0x1C */ s16 unk1C; //same as 0C /* 0x1E */ s16 unk1E; //same as 0E /* 0x20 */ s32 unk20; /* 0x24 */ s32 unk24; - /* 0x28 */ void* unk28; - /* 0x2C */ void* unk2C; + /* 0x28 */ TexturePtr unk28; //unk type + /* 0x2C */ TexturePtr unk2C; //unk type /* 0x30 */ s16 unk30; //scene minBounds.x /* 0x32 */ s16 unk32; //scene minBounds.z /* 0x34 */ s16 unk34; //scene boundsWidth.x @@ -111,17 +85,6 @@ typedef struct { /* 0x02 */ s16 unk2; } T_801BEC5C; -typedef struct{ - /* 0x00 */ s16 unk0; - /* 0x02 */ s16 unk2; - /* 0x04 */ s16 unk4; - /* 0x06 */ UNK_TYPE2 unk6; - /* 0x08 */ s16 unk8; - /* 0x0A */ UNK_TYPE2 unkA; - /* 0x0C */ UNK_TYPE2 unkC; - /* 0x0E */ u16 unkE; -} T_801F53B0; - typedef struct { /* 0x00 */ s32 unk0[5]; } T_801BEC70; @@ -141,6 +104,9 @@ typedef struct { } T_801F56B0; /* z_map_data */ +TexturePtr func_8010958C(s32); + +s32 func_80109714(s32); s32 func_80109CBC(s32); s32 func_80109A98(s32); s32 func_80109AD8(s32); diff --git a/include/z64scene.h b/include/z64scene.h index d750647f0..175ecc066 100644 --- a/include/z64scene.h +++ b/include/z64scene.h @@ -4,7 +4,6 @@ #include "ultra64.h" #include "z64dma.h" #include "z64cutscene.h" -#include "z64map.h" #include "unk.h" #define SPAWN_ROT_FLAGS(rotation, flags) (((rotation) << 7) | (flags)) @@ -305,6 +304,32 @@ typedef struct { /* 0x04 */ TransitionActorEntry* transitionActorList; } DoorContext; +typedef struct { + /* 0x00 */ u16 unk0; + /* 0x02 */ s16 unk2; + /* 0x04 */ UNK_TYPE2 unk4; + /* 0x06 */ s16 unk6; + /* 0x08 */ u16 unk8; +} MinimapEntry; // size = 0xA + +typedef struct { + /* 0x00 */ MinimapEntry* entry; + /* 0x04 */ s32 unk4; +} MinimapList; // size = 0x8 + +typedef struct { + /* 0x00 */ MinimapEntry* entry; + /* 0x04 */ s16 unk4; +} MinimapList2; // size = 0x8 + +typedef struct { + /* 0x00 */ UNK_TYPE2 unk0; + /* 0x02 */ UNK_TYPE2 unk2; + /* 0x04 */ UNK_TYPE2 unk4; + /* 0x06 */ UNK_TYPE2 unk6; + /* 0x08 */ UNK_TYPE2 unk8; +} MinimapChest; // size = 0xA + typedef struct { /* 0x0 */ s16 id; /* 0x2 */ Vec3s pos; diff --git a/src/code/z_map_data.c b/src/code/z_map_data.c index ee570aa21..b2693ef23 100644 --- a/src/code/z_map_data.c +++ b/src/code/z_map_data.c @@ -40,8 +40,8 @@ s16 func_8010956C(s32 arg0) { return D_801BED4C[arg0].unkA; } -s32 func_8010958C(s32 arg0) { - return D_801BED4C[arg0].unk0; +TexturePtr func_8010958C(s32 arg0) { + return D_801BED4C[arg0].lmapTex; } void func_801095AC(s32 arg0, s32 *arg1, s32 *arg2) { diff --git a/src/code/z_map_disp.c b/src/code/z_map_disp.c index 38e5e69a7..b3da50419 100644 --- a/src/code/z_map_disp.c +++ b/src/code/z_map_disp.c @@ -1,6 +1,6 @@ #include "global.h" -#include "z64map.h" +void func_801068D8(PlayState* play); void func_801068B4(PlayState* play); void func_80103090(MinimapEntry*, s32*, s32*); void func_80105FE0(PlayState* play, s32 x, s32 z, s32 rot); @@ -28,11 +28,12 @@ extern u32 D_801BEB18; extern u32 D_801BEB28; extern TexturePtr D_801BEB38; extern T_801BEBB8 D_801BEBB8; +extern s16 D_801BEBFA; extern s16 D_801BEC10; extern MinimapList D_801BEC14; //D_801F5130 extern s32 D_801BEC1C; //current scene's no. of rooms extern s32 D_801BEC20; //MinimapChest count -extern u8 D_801BEC24; +extern DoorContext D_801BEC24; extern Color_RGBA8 D_801BEC2C[]; // cat colors extern T_801BEC5C D_801BEC5C[5]; extern T_801BEC70 D_801BEC70; @@ -41,10 +42,9 @@ extern u16 D_801BECA4[0x10]; //palette 1 extern u16 D_801BECC4[0x10]; //palette 2 extern T_801BED24 D_801BED24[2]; - extern MinimapEntry D_801F5130[0x50]; extern MinimapChest D_801F5270[32]; -extern T_801F53B0 D_801F53B0[]; +extern TransitionActorEntry D_801F53B0[48]; extern T_801F56B0 D_801F56B0; extern TexturePtr D_801F57B4[32]; //unconfirmed length extern s32 D_801F5834; @@ -62,7 +62,7 @@ void func_80102E90(PlayState* play, s16* arg1) { *arg1 = -1; } -void func_80102EA4(UNK_TYPE4 arg0, UNK_TYPE4 arg1) { +void func_80102EA4(PlayState* play, s16* arg1) { } @@ -619,7 +619,7 @@ s32 func_80105328(s32 arg0) { #ifdef NON_MATCHING // https://decomp.me/scratch/F3QhH void func_8010534C(PlayState* play) { - T_801F53B0* var_s0; + TransitionActorEntry* var_s0; s16 temp_a0; s16 temp_a2; s16 temp_v0; @@ -628,22 +628,22 @@ void func_8010534C(PlayState* play) { s16* temp_v1; s32 var_s2; - for (var_s2 = 0; var_s2 < D_801BEC24; var_s2++) { + for (var_s2 = 0; var_s2 < D_801BEC24.numTransitionActors; var_s2++) { var_s0 = &D_801F53B0[var_s2]; - if (func_80105328(var_s0->unkE) != 0) { - if (var_s0->unk4 < 0) { - var_v1 = -var_s0->unk4; + if (func_80105328(var_s0->params) != 0) { + if (var_s0->id < 0) { + var_v1 = -var_s0->id; } else { - var_v1 = var_s0->unk4; + var_v1 = var_s0->id; } if (var_v1 != 0x18) { for (var_v0 = 0; var_v0 < D_801BEBB8.unk40; var_v0++) { - if (((var_v0 == D_801BEBB8.unk40 - 1) && (var_s0->unk8 >= (D_801BEBB8.unk48[var_v0] - 5))) + if (((var_v0 == D_801BEBB8.unk40 - 1) && (var_s0->pos.y >= (D_801BEBB8.unk48[var_v0] - 5))) || ( (var_v0 != D_801BEBB8.unk40 - 1) && - (var_s0->unk8 >= (D_801BEBB8.unk48[var_v0] - 5)) && - (var_s0->unk8 < (D_801BEBB8.unk48[var_v0+1] - 5)) + (var_s0->pos.y >= (D_801BEBB8.unk48[var_v0] - 5)) && + (var_s0->pos.y < (D_801BEBB8.unk48[var_v0+1] - 5)) )) { D_801BEBB8.unk58 = var_v0; return; @@ -709,14 +709,190 @@ void func_8010565C(PlayState* play, s32 num, void* segmentAddress) { D_801BEBB8.unk50 = D_801BEC20; } +void func_80105818(PlayState* play, s32 num, TransitionActorEntry* transitionActorList) { + s32 i; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_disp/func_80105818.s") + if (Map_IsInBossArea(play) == 0) { + D_801BEC24.numTransitionActors = num; + for (i = 0; i < num; i++) + { + D_801F53B0[i] = transitionActorList[i]; + } + D_801BEC24.transitionActorList = D_801F53B0; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_disp/func_80105A40.s") +void func_80105A40(PlayState* play) { + s32 i; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_disp/func_80105B34.s") + D_801BEBB8.unk0 = NULL; + D_801BEBB8.unk4 = -1; + D_801BEBB8.unkC = 0xD2; + D_801BEBB8.unkE = 0x8C; + D_801BEBB8.unk10 = NULL; + D_801BEBB8.unk14 = -1; + D_801BEBB8.unk18 = NULL; + D_801BEBB8.unk1C = 0; + D_801BEBB8.unk1E = 0; + D_801BEBB8.unk20 = 0; + D_801BEBB8.unk24 = 0; + D_801BEBB8.unk28 = NULL; + D_801BEBB8.unk2C = NULL; + + for (i = 0; i < D_801BEC1C; i++) { + func_80102EA4(play, &D_801BEBB8.unk3C[i]); + } + D_801BEBB8.unk3C = NULL; + D_801BEBB8.unk40 = 0; + D_801BEBB8.unk42 = 0; + D_801BEBB8.unk44 = 0; + D_801BEBB8.unk4C = 0; + D_801BEBB8.unk48 = NULL; + D_801BEBB8.unk50 = 0; + D_801BEBB8.unk54 = NULL; + func_801068D8(play); + D_801BEBB8.unk5A = 0; +} + + +void func_80105B34(PlayState* play) { + s16 temp_a0; + s16 temp_a0_2; + s16 temp_v1; + s16 temp_v1_2; + s32 temp_v0; + + if ((D_801BEBB8.unk0 != NULL) && (D_801BEC1C != 0)) { + D_801BEBFA = 8 - play->pauseCtx.unk_256; + if (D_801BEBB8.unk14 != -1) { + temp_v0 = D_801BEBB8.unk24; + if (temp_v0 > 0) { + temp_v1 = D_801BEBB8.unk8; + temp_a0 = D_801BEBB8.unkC; + if (temp_v1 != temp_a0) { + D_801BEBB8.unkC = (s16) (s32) (((f32) (temp_v1 - temp_a0) / (f32) temp_v0) + (f32) temp_a0); + } + temp_v1_2 = D_801BEBB8.unkA; + temp_a0_2 = D_801BEBB8.unkE; + if (temp_v1_2 != temp_a0_2) { + D_801BEBB8.unkE = (s16) (s32) (((f32) (temp_v1_2 - temp_a0_2) / (f32) temp_v0) + (f32) temp_a0_2); + } + D_801BEBB8.unk24 = temp_v0 - 1; + return; + } + D_801BEBB8.unk14 = -1; + D_801BEBB8.unk24 = 0; + D_801BEBB8.unkC = D_801BEBB8.unk8; + D_801BEBB8.unkE = D_801BEBB8.unkA; + return; + } + D_801BEBB8.unk24 = 0; + } +} + + +#ifdef NON_MATCHING +//https://decomp.me/scratch/oK0wd +void func_80105C40(s16 arg0) { + MinimapEntry* temp_s0; + MinimapEntry* sp58; + s32 sp54; + s32 sp50; + s32 sp4C; + s32 sp48; + s32 sp44; + s32 sp40; + s32 sp3C; + s32 sp38; + s32 var_v0; + s32 pad; + s32 sp2C; + + if ((D_801BEBB8.unk0 != NULL) && (D_801BEC1C != 0) && (arg0 != -1)) { + temp_s0 = &D_801BEBB8.unk0->entry[arg0]; + if ( ( temp_s0->unk0 < 5) || (( temp_s0->unk0 >= 0x100) && ( temp_s0->unk0 < 0x162)) || temp_s0->unk0 == 0xFFFF) { + + D_801BEBB8.unk14 = D_801BEBB8.unk4; + D_801BEBB8.unk4 = arg0; + D_801BEBB8.unk24 = 0x14; + + D_801BEBB8.unk18 = D_801BEBB8.unk10; + sp54 = D_801BEBB8.unk8; + sp50 = D_801BEBB8.unkA; + + temp_s0 = &D_801BEBB8.unk0->entry[D_801BEBB8.unk4]; + + if (temp_s0->unk0 == 0xFFFF) { + D_801BEBB8.unk1E = 0; + D_801BEBB8.unk8 = 0xD2; + D_801BEBB8.unkA = 0x8C; + D_801BEBB8.unkC = 0xD2; + D_801BEBB8.unkE = 0x8C; + D_801BEBB8.unk10 = NULL; + D_801BEBB8.unk1C = D_801BEBB8.unk1E; + return; + } + func_801030F4(temp_s0, &sp44, &sp40); + func_80103090(temp_s0, &sp4C, &sp48); + D_801BEBB8.unk8 = 0x127 - sp4C; + D_801BEBB8.unkA = 0xDC - sp48; + if (D_801BEBB8.unk14 != -1) { + sp58 = &D_801BEBB8.unk0->entry[D_801BEBB8.unk14]; + if (sp58->unk0 == 0xFFFF) { + D_801BEBB8.unk1E = 0; + D_801BEBB8.unk10 = NULL; + D_801BEBB8.unk1C = D_801BEBB8.unk1E; + D_801BEBB8.unkC = D_801BEBB8.unk8; + D_801BEBB8.unkE = D_801BEBB8.unkA; + return; + } + func_801030F4(sp58, &sp3C, &sp38); + //temp_a0 = ; + var_v0 = D_801BEBB8.unk0->unk4; + if (D_801BEBB8.unk0->unk4 == 0) { + var_v0 = 0x14; + } else if (D_801BEBB8.unk0->unk4 == -1) { + func_801030B4(temp_s0, &sp2C); + var_v0 = sp2C; + } + //temp_fv0 = ; + D_801BEBB8.unk1C = (s16) (s32) (((f32) sp44 + (((f32) sp58->unk2 - (f32) temp_s0->unk2) * (1.0f / var_v0))) - (f32) sp3C); + D_801BEBB8.unk1E = (s16) (s32) (((f32) sp40 + (((f32) sp58->unk6 - (f32) temp_s0->unk6) * (1.0f / var_v0))) - (f32) sp38); + D_801BEBB8.unkC = sp54 - D_801BEBB8.unk1C; + D_801BEBB8.unkE = sp50 - D_801BEBB8.unk1E; + } + else { + D_801BEBB8.unk1C = D_801BEBB8.unk1E = 0; + D_801BEBB8.unkC = D_801BEBB8.unk8; + D_801BEBB8.unkE = D_801BEBB8.unkA; + } + D_801BEBB8.unk10 = NULL; + + switch (func_80109714(temp_s0->unk0)) { + case 0: + D_801BEBB8.unk10 = func_8010958C(temp_s0->unk0); + return; + case 1: + if (D_801BEBB8.unk18 == D_801BEBB8.unk28) { + D_801BEBB8.unk10 = D_801BEBB8.unk2C; + } else { + D_801BEBB8.unk10 = D_801BEBB8.unk28; + } + if (func_801096D4(temp_s0->unk0) != 0) { + func_80178E3C(SEGMENT_ROM_START(map_grand_static), + temp_s0->unk0 - 0x100, + (s32) D_801BEBB8.unk10, + func_801096D4(temp_s0->unk0)); + } + break; + } + } + } +} +#else #pragma GLOBAL_ASM("asm/non_matchings/code/z_map_disp/func_80105C40.s") +#endif #pragma GLOBAL_ASM("asm/non_matchings/code/z_map_disp/func_80105FE0.s") @@ -810,7 +986,7 @@ void func_801068B4(PlayState* play) { func_8010683C(); } -void func_801068D8(s32 arg0) { +void func_801068D8(PlayState* play) { func_8010683C(); } diff --git a/src/code/z_map_exp.c b/src/code/z_map_exp.c index 5135a3c41..d681f2e95 100644 --- a/src/code/z_map_exp.c +++ b/src/code/z_map_exp.c @@ -169,8 +169,8 @@ void Map_InitRoomData(PlayState* play, s16 room) { } } -void Map_Destroy(void) { - func_80105A40(); +void Map_Destroy(PlayState* play) { + func_80105A40(play); } void Map_Init(PlayState* play) {