diff --git a/include/functions.h b/include/functions.h index 59afb49d2..ddc94564e 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1728,7 +1728,7 @@ void func_80106644(PlayState* play, s32 x, s32 z, s32 rot); s32 func_80109124(s16 arg0); // void func_801091F0(void); // void func_80109428(void); -// void func_801094A0(void); +void func_801094A0(s32 arg0, Color_RGBA8* color); // void func_801094C8(void); // void func_801094F8(void); // void func_80109528(void); diff --git a/include/z64map.h b/include/z64map.h index 15c41193e..2d20e1360 100644 --- a/include/z64map.h +++ b/include/z64map.h @@ -72,9 +72,9 @@ typedef struct { /* 0x0A */ s16 unkA; /* 0x0C */ s16 unkC; /* 0x0E */ s16 unkE; - /* 0x10 */ s32 unk10; + /* 0x10 */ TexturePtr unk10; /* 0x14 */ s32 unk14; //unk4 same type as unk14 - /* 0x18 */ s32 unk18; + /* 0x18 */ TexturePtr unk18; /* 0x1C */ s16 unk1C; //same as 0C /* 0x1E */ s16 unk1E; //same as 0E /* 0x20 */ s32 unk20; diff --git a/src/code/z_map_data.c b/src/code/z_map_data.c index 404fac482..d0240a76f 100644 --- a/src/code/z_map_data.c +++ b/src/code/z_map_data.c @@ -7,17 +7,13 @@ extern s32 D_801BF15C[5]; extern T_801BF170 D_801BF170[]; -typedef struct { - char unk0[4]; -} T_801BED40; //size 0x04 - -extern T_801BED40 D_801BED40[]; +extern Color_RGBA8 D_801BED40[]; extern s32 D_801BF3B4[]; extern s32 D_801BEFC8[]; -void func_801094A0(s32 arg0, T_801BED40* arg1) { - *arg1 = D_801BED40[arg0]; +void func_801094A0(s32 arg0, Color_RGBA8* color) { + *color = D_801BED40[arg0]; } void func_801094C8(s32 arg0, s32 *arg1, s32 *arg2) { diff --git a/src/code/z_map_disp.c b/src/code/z_map_disp.c index d63184936..3db075bd6 100644 --- a/src/code/z_map_disp.c +++ b/src/code/z_map_disp.c @@ -1,7 +1,6 @@ #include "global.h" #include "z64map.h" -void func_801031D0(PlayState* play, s32, s32, s32, s32, f32); void func_80103090(MinimapEntry*, s32*, s32*); void func_80105FE0(PlayState* play, s32 x, s32 z, s32 rot); void func_80106644(PlayState* play, s32 x, s32 z, s32 rot); @@ -97,7 +96,70 @@ void func_801030F4(MinimapEntry* arg0, s32* arg1, s32* arg2) { } } +void func_801098A0(u16, s32*); +s32 func_80109908(u16); + +#ifdef NON_MATCHING +// https://decomp.me/scratch/XPZfI +void func_801031D0(PlayState* play, TexturePtr arg1, s32 arg2, s32 arg3, s32 arg4, f32 arg5) { + MinimapEntry* spCC; + s32 spC8; + s32 spC4; + s16 var_a0_4; + s16 var_a3; + s32 var_t0; + s32 var_t1; + s32 var_v1_4; + s32 var_v1_5; + Color_RGBA8 spAC; + s32 spA8; + + spCC = &D_801BEBB8.unk0->entry[arg4]; + if ((spCC->unk0 != 0xFFFF) && (arg1 != 0)) { + func_80103090(spCC, &spC8, &spC4); + OPEN_DISPS(play->state.gfxCtx); + func_8012C654(play->state.gfxCtx); + func_801094A0(func_80109908(spCC->unk0), &spAC); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, spAC.r, spAC.g, spAC.b, (s32)(play->interfaceCtx.minimapAlpha * arg5 * spAC.a / 255.0f)); + func_801098A0(spCC->unk0, &spA8); + switch (spA8) { + case 1: + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPLoadTextureBlock_4b(OVERLAY_DISP++, arg1, G_IM_FMT_IA, spC8, spC4, 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); + break; + case 3: + gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0); + gDPLoadTextureBlock_4b(OVERLAY_DISP++, arg1, G_IM_FMT_I, spC8, spC4, 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); + break; + default: + case 0: + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPLoadTextureBlock_4b(OVERLAY_DISP++, arg1, G_IM_FMT_I, spC8, spC4, 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); + break; + } + + var_t1 = (spCC->unk8 & 1) ? (spC8 - 1) << 5 : 0; + var_t0 = (spCC->unk8 & 2) ? 0 : (spC4 - 1) << 5; + + var_v1_4 = (spCC->unk8 & 1) ? -1 : 1; + var_a3 = var_v1_4 << 0xA; + var_v1_5 = (spCC->unk8 & 2) ? 1 : -1; + + if ((spCC->unk8 & 1) != 0) { + var_a3 = var_a3 & 0xFFFF; + } + if ((spCC->unk8 & 2) != 0) { + var_a0_4 = var_v1_5 << 0xA; + } else { + var_a0_4 = (var_v1_5 << 0xA) & 0xFFFF; + } + gSPTextureRectangle(OVERLAY_DISP++, arg2 << 2, arg3 << 2, (spC8 + arg2) << 2, (arg3 + spC4) << 2, G_TX_RENDERTILE, var_t1, var_t0, var_a3, var_a0_4); + CLOSE_DISPS(play->state.gfxCtx); + } +} +#else #pragma GLOBAL_ASM("asm/non_matchings/code/z_map_disp/func_801031D0.s") +#endif s32 func_801039EC(PlayState *play) { if (play->sceneNum == SCENE_35TAKI) { @@ -114,6 +176,7 @@ s32 func_80103A10(PlayState* play) { } #ifdef NON_MATCHING +// https://decomp.me/scratch/TR5Jq void func_80103A58(PlayState *play, Actor *actor) { MinimapEntry *spDC; s32 spD8; @@ -245,6 +308,7 @@ void func_8010439C(PlayState *play) { } #ifdef NON_MATCHING +// https://decomp.me/scratch/vbnTA void func_801045AC(PlayState* play, Actor* actor) { //4729 MinimapEntry* sp7C; s32 sp78; @@ -428,6 +492,7 @@ s32 func_80105328(s32 arg0) { } #ifdef NON_MATCHING +// https://decomp.me/scratch/F3QhH void func_8010534C(PlayState* play) { T_801F53B0* var_s0; s16 temp_a0; @@ -612,21 +677,22 @@ extern s32 D_801F5834; | (a)) \ #ifdef NON_MATCHING +// https://decomp.me/scratch/3cGkW void func_80106D5C(PlayState* play, s32 arg1, s32 arg2, s32 arg3, s32 arg4, f32 arg5, s32 arg6) { s32 var_a0; - s32 var_a0_2; - s32 var_a0_3; - s32 var_a0_4; s32 var_a1_2; s32 var_a1_4; s32 var_a1_5; - s32 var_s2; s32 var_v1; - s32 var_v1_2; - s32 var_v1_3; + s32 var_s2; TexturePtr temp_s1; + s32 temp1; + s32 temp2; - D_801BECC4[1] = COLOR16(0, ((D_801F5834 * -120.0f) / 40.0f) + 200.0f, ((D_801F5834 * 115.0f) / 40.0f) + 140.0f, 1); + temp1 = ((D_801F5834 * -120.0f / 40.0f) + 200.0f) * 31.0f / 255.0f; + temp2 = ((D_801F5834 * 115.0f / 40.0f) + 140.0f) * 31.0f / 255.0f; + + D_801BECC4[1] = (temp1 << 6) | (temp2 << 1) | 1; //COLOR16(0, ((D_801F5834 * -120.0f) / 40.0f) + 200.0f, ((D_801F5834 * 115.0f) / 40.0f) + 140.0f, 1); // ( // 0 << 11 // | ((s32) (((((D_801F5834 * -120.0f) / 40.0f) + 200.0f) * 31.0f) / 255.0f) << 6) @@ -659,6 +725,7 @@ void func_80106D5C(PlayState* play, s32 arg1, s32 arg2, s32 arg3, s32 arg4, f32 s32 sp110; s32 sp10C; MinimapEntry* sp108; + s32 pad104; s32 sp100; s32 spFC; s32 spF8; @@ -666,10 +733,13 @@ void func_80106D5C(PlayState* play, s32 arg1, s32 arg2, s32 arg3, s32 arg4, f32 s32 spF0; s32 spEC; s32 spE8; + s32 padE4; + s32 padE0; sp108 = &D_801BEBB8.unk0->entry[var_s2]; if ((sp108->unk0 != 0xFFFF) && (sp108->unk0 < 0x162)) { - if ((D_801BEBB8.unk42 >= D_801BEBB8.unk3C[var_s2]) && ((D_801BEBB8.unk3C[var_s2] + ((sp108->unk8 >> 2) & 7)) >= D_801BEBB8.unk42)) { + if ((D_801BEBB8.unk42 >= D_801BEBB8.unk3C[var_s2]) + && ((D_801BEBB8.unk3C[var_s2] + ((sp108->unk8 >> 2) & 7)) >= D_801BEBB8.unk42)) { temp_s1 = D_801F57B4[var_s2]; if (temp_s1 != NULL) { spE8 = func_80109BA0(sp108->unk0); @@ -695,8 +765,9 @@ void func_80106D5C(PlayState* play, s32 arg1, s32 arg2, s32 arg3, s32 arg4, f32 spFC = 0; spF4 = 0x400; } - spF0 = (s32) (((((f32) sp108->unk2 - (f32) D_801BEBB8.unk38) * arg5) - (f32) sp110) + (f32) ((arg3 / 2) + arg1)); - spEC = (s32) (((((f32) sp108->unk6 - (f32) D_801BEBB8.unk3A) * arg5) - (f32) sp10C) + (f32) ((arg4 / 2) + arg2)); + spF0 = ((sp108->unk2 - (f32) D_801BEBB8.unk38) * arg5 - sp110) + ((arg3 / 2) + arg1); + spEC = ((sp108->unk6 - (f32) D_801BEBB8.unk3A) * arg5 - sp10C) + ((arg4 / 2) + arg2); + if (var_s2 == play->roomCtx.currRoom.num) { if (Map_IsInBossArea(play) != 0) { gDPLoadTextureBlock_4b(POLY_OPA_DISP++, temp_s1, G_IM_FMT_CI, sp118, sp114, 1, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK , G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);