From 12f8f7149d0976df5f2b740710cfbc6e7b5ec143 Mon Sep 17 00:00:00 2001 From: bismurphy Date: Fri, 26 Jul 2024 14:13:51 -0400 Subject: [PATCH] Decompile w58 (Alucart Shield) Shield Spell (#1439) This modifies a variable at 0x80097420, I noticed that was in the g_UnkGraphicsStruct, so I went through all the uses of that variable and made them all use the struct. --- include/sfx.h | 1 + include/weapon.h | 1 + src/dra/72BB0.c | 2 +- src/dra/7E4BC.c | 4 +- src/dra/dra.h | 1 - src/pc/stubs.c | 1 - src/weapon/w_058.c | 190 ++++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 194 insertions(+), 6 deletions(-) diff --git a/include/sfx.h b/include/sfx.h index 9c4582b4c..62ad001ba 100644 --- a/include/sfx.h +++ b/include/sfx.h @@ -208,6 +208,7 @@ typedef enum { MONO_SOUND, STEREO_SOUND } soundMode; #define SFX_DOOR_UNKNOWN 0x64F #endif +#define SFX_UNK_641 0x641 #define NA_SE_EN_COG_CLICK 0x642 #define NA_SE_EN_ROCK_BREAK 0x644 #define SOUND_BAT_SCREECH 0x64E diff --git a/include/weapon.h b/include/weapon.h index 29ac8db0a..8b8467424 100644 --- a/include/weapon.h +++ b/include/weapon.h @@ -3,6 +3,7 @@ #define WEAPON #include +#include typedef struct { /* 0x00 */ void (*EntityWeaponAttack)(Entity* self); diff --git a/src/dra/72BB0.c b/src/dra/72BB0.c index 41dcf5c03..6c0fcb1ed 100644 --- a/src/dra/72BB0.c +++ b/src/dra/72BB0.c @@ -1205,7 +1205,7 @@ void func_80115394(DamageParam* damage, s16 arg_PlayerStep, s16 arg2) { nullifyVelY = false; PLAYER.drawFlags = DRAW_COLORS; plDraw = &g_PlayerDraw[0]; - if ((D_80097420 == 0xFFF) && (PLAYER.step_s)) { + if ((g_unkGraphicsStruct.unk20 == 0xFFF) && (PLAYER.step_s)) { SetPlayerStep(Player_Unk17); PLAYER.velocityY = 0; PLAYER.velocityX = 0; diff --git a/src/dra/7E4BC.c b/src/dra/7E4BC.c index 342ecdf67..c9a0ce8d5 100644 --- a/src/dra/7E4BC.c +++ b/src/dra/7E4BC.c @@ -1521,7 +1521,7 @@ void EntityLevelUpAnimation(Entity* self) { break; case 1: if (++D_80138090 == 2) { - D_80097420 = 3; + g_unkGraphicsStruct.unk20 = 3; } self->ext.factory.unk80 -= 8; self->ext.factory.unk82 -= 8; @@ -1565,7 +1565,7 @@ void EntityLevelUpAnimation(Entity* self) { self->ext.factory.unk7E = 0; } if (self->ext.factory.unk80 > 0x200) { - D_80097420 = 0; + g_unkGraphicsStruct.unk20 = 0; DestroyEntity(self); return; } diff --git a/src/dra/dra.h b/src/dra/dra.h index 884f359f4..b05c3238c 100644 --- a/src/dra/dra.h +++ b/src/dra/dra.h @@ -284,7 +284,6 @@ extern u8 aPbav_0[0x2000]; // TODO: extract file extern u8 aPbav_1[0x2000]; // TODO: extract file extern u8 aPbav_2[0x2000]; // TODO: extract file -extern s32 D_80097420; extern u16 g_ButtonMask[]; extern u8 g_StageSelectOrder[]; extern u16 D_800A04CC[]; diff --git a/src/pc/stubs.c b/src/pc/stubs.c index bcf855454..3bd2cb9fa 100644 --- a/src/pc/stubs.c +++ b/src/pc/stubs.c @@ -163,7 +163,6 @@ u32 D_801362B4; u32 g_DebugCurPal; s32 D_801362D4; s32 D_8013640C; -s32 D_80097420; s32 D_800974A4; OT_TYPE* g_CurrentOT; s32 D_801362B8; diff --git a/src/weapon/w_058.c b/src/weapon/w_058.c index e7d56b1e0..2825daa1a 100644 --- a/src/weapon/w_058.c +++ b/src/weapon/w_058.c @@ -3,6 +3,8 @@ #include "weapon_private.h" #include "shared.h" +extern SpriteParts D_19A000_8017A040[]; + INCLUDE_ASM("weapon/nonmatchings/w_058", EntityWeaponAttack); s32 func_ptr_80170004(Entity* self) {} @@ -17,7 +19,193 @@ s32 func_ptr_80170014(Entity* self) {} s32 GetWeaponId(void) { return 52; } -INCLUDE_ASM("weapon/nonmatchings/w_058", EntityWeaponShieldSpell); +void EntityWeaponShieldSpell(Entity* self) { + Primitive* prim; + s16 primRight; + s16 primLeft; + s16 selfX; + s16 selfY; + bool showQuestionMark; + + // This block sets variables that are unused + s16 temp_s1; + s16 temp_s5; + + temp_s1 = 0x1C; + if (PLAYER.facingLeft) { + temp_s1 = -temp_s1; + } + temp_s5 = 0x30; + + showQuestionMark = false; + switch (self->step) { + case 0: + self->primIndex = g_api.AllocPrimitives(PRIM_GT4, 2); + if (self->primIndex == -1) { + DestroyEntity(self); + return; + } + SetSpriteBank1(D_19A000_8017A040); + if (g_HandId != 0) { + self->animSet = ANIMSET_OVL(0x12); + self->palette = 0x128; + self->ext.shield.unk86 = 0x129; + self->unk5A = 0x66; + self->ext.shield.unk7C = 0; + self->ext.shield.unk7D = 0x80; + } else { + self->animSet = ANIMSET_OVL(0x10); + self->palette = 0x110; + self->ext.shield.unk86 = 0x111; + self->unk5A = 0x64; + self->ext.shield.unk7C = 0x80; + self->ext.shield.unk7D = 0; + } + + self->posY.i.hi -= 8; + self->flags = FLAG_UNK_04000000 | FLAG_HAS_PRIMS | FLAG_UNK_10000; + self->zPriority = PLAYER.zPriority - 2; + self->facingLeft = PLAYER.facingLeft; + self->animCurFrame = 0x3E; + self->drawFlags = FLAG_DRAW_ROTX | FLAG_DRAW_ROTY; + self->rotX = self->rotY = 0; + // The primitive for the main shield appearing up behind Alucard + prim = &g_PrimBuf[self->primIndex]; + prim->clut = 0x19F; + prim->tpage = 0x19; + prim->u0 = prim->u2 = 0x80; + prim->u1 = prim->u3 = 0x80 + 0x4F; + prim->v0 = prim->v1 = + self->ext.shield.unk7C + 0; // PSP needs +0 which is interesting + prim->v2 = prim->v3 = self->ext.shield.unk7C + 0x4F; + self->ext.shield.unk82 = 0; + prim->r0 = prim->g0 = prim->b0 = prim->r1 = prim->g1 = prim->b1 = + prim->r2 = prim->g2 = prim->b2 = prim->r3 = prim->g3 = prim->b3 = + 0x80; + prim->priority = self->zPriority - 4; + prim->drawMode = + DRAW_UNK_40 | DRAW_TPAGE2 | DRAW_TPAGE | DRAW_COLORS | DRAW_TRANSP; + prim = prim->next; + // The primitive for the little question mark above Alucard + prim->clut = 0x190; + prim->tpage = 0x1E; + prim->u0 = prim->u2 = 0x78; + prim->u1 = prim->u3 = 0x78 + 7; + prim->v0 = prim->v1 = 8; + prim->v2 = prim->v3 = 8 + 7; + prim->priority = self->zPriority + 4; + prim->drawMode = DRAW_HIDE; + SetSpeedX(FIX(-2)); + self->velocityY = 0; + DestroyEntityWeapon(1); + g_api.PlaySfx(SFX_UNK_641); + g_unkGraphicsStruct.unk20 = 1; + self->step++; + break; + case 1: + DecelerateX(0x1000); + self->velocityY -= FIX(0.15625); + self->posX.val += self->velocityX; + self->posY.val += self->velocityY; + self->rotX += 12; + self->rotY = self->rotX; + self->ext.shield.unk82 = self->rotX * 0x28 / 256; + if (self->rotX >= 0x100) { + self->ext.shield.unk82 = 0x28; + self->rotY = self->rotX = 0x100; + self->ext.shield.unk80 = 0x40; + self->step++; + } + break; + case 2: + if (--self->ext.shield.unk80 == 0) { + self->ext.shield.unk80 = 0x10; + g_api.PlaySfx(SFX_UNK_668); + self->step++; + } + break; + case 3: + prim = &g_PrimBuf[self->primIndex]; + if (!(self->ext.shield.unk80 & 1)) { + prim->priority = 0x1FC; + } else { + prim->priority = self->zPriority - 2; + } + self->rotX -= 0x10; + if (self->rotX <= 0) { + self->rotX = 0; + } + self->rotY = self->rotX; + if (--self->ext.shield.unk80 == 0) { + self->animCurFrame = 0; + self->ext.shield.unk80 = 0x20; + self->step++; + } + break; + case 4: + self->ext.shield.unk82 += 8; + self->rotX += 0x10; + if (self->rotX >= 0x100) { + self->rotX = 0x100; + } + self->ext.shield.childPalette = self->rotX * 36 / 256; + self->ext.shield.unk8A = self->rotX * 28 / 256; + prim = &g_PrimBuf[self->primIndex]; + if (prim->b3 > 8) { + prim->b3 -= 4; + } + prim->r0 = prim->g0 = prim->b0 = prim->r1 = prim->g1 = prim->b1 = + prim->r2 = prim->g2 = prim->b2 = prim->r3 = prim->g3 = prim->b3; + self->ext.shield.unk86 += 4; + self->ext.shield.unk92 += self->ext.shield.unk86; + if (--self->ext.shield.unk80 == 0) { + self->ext.shield.unk80 = 0x28; + self->step++; + } + break; + case 5: + showQuestionMark = true; + if (--self->ext.shield.unk80 == 0) { + self->step++; + } + break; + case 6: + g_unkGraphicsStruct.unk20 = 0; + DestroyEntity(self); + return; + } + selfX = self->posX.i.hi; + selfY = self->posY.i.hi; + prim = &g_PrimBuf[self->primIndex]; + if (prim->b3 > 8) { + if (g_Timer & 1) { + prim->drawMode |= DRAW_HIDE; + } else { + prim->drawMode &= ~DRAW_HIDE; + } + } + prim->x0 = prim->x2 = selfX - self->ext.shield.unk82; + prim->x1 = prim->x3 = (selfX + self->ext.shield.unk82) - 1; + prim->y0 = prim->y1 = selfY - self->ext.shield.unk82; + prim->y2 = prim->y3 = (selfY + self->ext.shield.unk82) - 1; + prim = prim->next; + if (PLAYER.facingLeft) { + prim->x0 = prim->x2 = PLAYER.posX.i.hi + 2; + prim->x1 = prim->x3 = prim->x0 + 7; + + } else { + prim->x0 = prim->x2 = PLAYER.posX.i.hi - 6; + prim->x1 = prim->x3 = prim->x0 + 7; + } + + prim->y0 = prim->y1 = PLAYER.posY.i.hi - 0x22; + prim->y2 = prim->y3 = prim->y0 + 7; + if (showQuestionMark) { + prim->drawMode = DRAW_DEFAULT; + } else { + prim->drawMode = DRAW_HIDE; + } +} void func_ptr_80170024(Entity* self) {}