mirror of
https://github.com/zeldaret/oot.git
synced 2025-08-05 22:00:15 +00:00
Graveyard objects: bg_spot02_objects (#751)
* BgSpot02Objects 4 non-matching * Bg_Spot02 3 non-matching but all down to regalloc * finish file * spec * asm * rename var * rename func * review Co-authored-by: Fig02 <fig02srl@gmail.com>
This commit is contained in:
parent
288320317c
commit
8b87e53b76
18 changed files with 310 additions and 1378 deletions
|
@ -1,3 +1,9 @@
|
|||
/*
|
||||
* File: z_bg_spot02_objects.c
|
||||
* Overlay: ovl_Bg_Spot02_Objects
|
||||
* Description: Graveyard Actors
|
||||
*/
|
||||
|
||||
#include "z_bg_spot02_objects.h"
|
||||
|
||||
#define FLAGS 0x00000030
|
||||
|
@ -8,15 +14,29 @@ void BgSpot02Objects_Init(Actor* thisx, GlobalContext* globalCtx);
|
|||
void BgSpot02Objects_Destroy(Actor* thisx, GlobalContext* globalCtx);
|
||||
void BgSpot02Objects_Update(Actor* thisx, GlobalContext* globalCtx);
|
||||
void BgSpot02Objects_Draw(Actor* thisx, GlobalContext* globalCtx);
|
||||
void func_808ACCB8(Actor* thisx, GlobalContext* globalCtx);
|
||||
void func_808AD450(Actor* thisx, GlobalContext* globalCtx);
|
||||
|
||||
extern UNK_TYPE D_060013F0;
|
||||
extern UNK_TYPE D_060126F0;
|
||||
extern UNK_TYPE D_060128D8;
|
||||
extern UNK_TYPE D_06012BA4;
|
||||
extern UNK_TYPE D_06012D30;
|
||||
extern UNK_TYPE D_060133EC;
|
||||
void func_808AC8FC(BgSpot02Objects* this, GlobalContext* globalCtx);
|
||||
void func_808AC908(BgSpot02Objects* this, GlobalContext* globalCtx);
|
||||
void func_808ACA08(BgSpot02Objects* this, GlobalContext* globalCtx);
|
||||
void func_808ACAFC(BgSpot02Objects* this, GlobalContext* globalCtx);
|
||||
void func_808ACB58(BgSpot02Objects* this, GlobalContext* globalCtx);
|
||||
void func_808ACC34(BgSpot02Objects* this, GlobalContext* globalCtx);
|
||||
void func_808AD3D4(BgSpot02Objects* this, GlobalContext* globalCtx);
|
||||
|
||||
extern CollisionHeader D_060128D8;
|
||||
extern CollisionHeader D_06012BA4;
|
||||
extern CollisionHeader D_060133EC;
|
||||
extern Gfx D_060013F0[];
|
||||
extern Gfx D_060126F0[];
|
||||
extern Gfx D_06012D30[];
|
||||
|
||||
static u64* D_808AD850[] = {
|
||||
0x060096B0, 0x0600A2B0, 0x0600AEB0, 0x0600BAB0, 0x0600C6B0, 0x0600D2B0,
|
||||
0x0600DEB0, 0x0600EAB0, 0x0600F6B0, 0x060102B0, 0x06010EB0, 0x06011AB0,
|
||||
};
|
||||
|
||||
/*
|
||||
const ActorInit Bg_Spot02_Objects_InitVars = {
|
||||
ACTOR_BG_SPOT02_OBJECTS,
|
||||
ACTORCAT_BG,
|
||||
|
@ -28,29 +48,287 @@ const ActorInit Bg_Spot02_Objects_InitVars = {
|
|||
(ActorFunc)BgSpot02Objects_Update,
|
||||
(ActorFunc)BgSpot02Objects_Draw,
|
||||
};
|
||||
*/
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/BgSpot02Objects_Init.s")
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/BgSpot02Objects_Destroy.s")
|
||||
static InitChainEntry sInitChain[] = {
|
||||
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
|
||||
};
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/func_808AC8FC.s")
|
||||
void BgSpot02Objects_Init(Actor* thisx, GlobalContext* globalCtx) {
|
||||
s32 pad;
|
||||
BgSpot02Objects* this = THIS;
|
||||
CollisionHeader* colHeader = NULL;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/func_808AC908.s")
|
||||
DynaPolyActor_Init(&this->dyna, 0);
|
||||
this->unk_16B = (u16)(thisx->params >> 8);
|
||||
thisx->params = (u16)(thisx->params & 0xFF);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/func_808ACA08.s")
|
||||
switch (thisx->params) {
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
Actor_ProcessInitChain(thisx, sInitChain);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/func_808ACAFC.s")
|
||||
if (thisx->params == 0) {
|
||||
if (Flags_GetSwitch(globalCtx, this->unk_16B)) {
|
||||
this->actionFunc = func_808AC8FC;
|
||||
thisx->world.pos.y += 255.0f;
|
||||
} else {
|
||||
this->actionFunc = func_808ACAFC;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/func_808ACB58.s")
|
||||
CollisionHeader_GetVirtual(&D_06012BA4, &colHeader);
|
||||
} else if (thisx->params == 1) {
|
||||
this->actionFunc = func_808AC8FC;
|
||||
CollisionHeader_GetVirtual(&D_060128D8, &colHeader);
|
||||
thisx->flags |= 0x400000;
|
||||
} else {
|
||||
if (globalCtx->sceneNum == SCENE_SPOT02) {
|
||||
this->actionFunc = func_808AC908;
|
||||
} else {
|
||||
this->actionFunc = func_808AC8FC;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/BgSpot02Objects_Update.s")
|
||||
CollisionHeader_GetVirtual(&D_060133EC, &colHeader);
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/BgSpot02Objects_Draw.s")
|
||||
this->dyna.bgId = DynaPoly_SetBgActor(globalCtx, &globalCtx->colCtx.dyna, thisx, colHeader);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/func_808ACC34.s")
|
||||
if (((gSaveContext.eventChkInf[1] & 0x2000) && (globalCtx->sceneNum == SCENE_SPOT02) &&
|
||||
(thisx->params == 2)) ||
|
||||
(LINK_IS_ADULT && (thisx->params == 1))) {
|
||||
Actor_Kill(thisx);
|
||||
}
|
||||
break;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/func_808ACCB8.s")
|
||||
case 3:
|
||||
this->unk_16A = 0;
|
||||
Actor_ChangeCategory(globalCtx, &globalCtx->actorCtx, thisx, ACTORCAT_ITEMACTION);
|
||||
this->actionFunc = func_808ACC34;
|
||||
thisx->draw = func_808ACCB8;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/func_808AD3D4.s")
|
||||
if (gSaveContext.eventChkInf[1] & 0x2000) {
|
||||
Actor_Kill(thisx);
|
||||
}
|
||||
break;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot02_Objects/func_808AD450.s")
|
||||
case 4:
|
||||
this->timer = -12;
|
||||
this->unk_170 = 0xFFFF;
|
||||
Actor_ChangeCategory(globalCtx, &globalCtx->actorCtx, thisx, ACTORCAT_ITEMACTION);
|
||||
this->actionFunc = func_808AD3D4;
|
||||
thisx->draw = func_808AD450;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void BgSpot02Objects_Destroy(Actor* thisx, GlobalContext* globalCtx) {
|
||||
BgSpot02Objects* this = THIS;
|
||||
|
||||
DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
|
||||
}
|
||||
|
||||
void func_808AC8FC(BgSpot02Objects* this, GlobalContext* globalCtx) {
|
||||
}
|
||||
|
||||
void func_808AC908(BgSpot02Objects* this, GlobalContext* globalCtx) {
|
||||
static Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
|
||||
Vec3f pos;
|
||||
|
||||
if (globalCtx->csCtx.state != 0) {
|
||||
if (globalCtx->csCtx.npcActions[3] != NULL && globalCtx->csCtx.npcActions[3]->action == 2) {
|
||||
Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_GRAVE_EXPLOSION);
|
||||
gSaveContext.eventChkInf[1] |= 0x2000;
|
||||
this->timer = 25;
|
||||
pos.x = (Math_SinS(this->dyna.actor.shape.rot.y) * 50.0f) + this->dyna.actor.world.pos.x;
|
||||
pos.y = this->dyna.actor.world.pos.y + 30.0f;
|
||||
pos.z = (Math_CosS(this->dyna.actor.shape.rot.y) * 50.0f) + this->dyna.actor.world.pos.z;
|
||||
EffectSsBomb2_SpawnLayered(globalCtx, &pos, &zeroVec, &zeroVec, 70, 30);
|
||||
this->actionFunc = func_808ACA08;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void func_808ACA08(BgSpot02Objects* this, GlobalContext* globalCtx) {
|
||||
Player* player = PLAYER;
|
||||
|
||||
if (this->timer != 0) {
|
||||
this->timer--;
|
||||
}
|
||||
|
||||
if (this->timer == 20) {
|
||||
this->dyna.actor.draw = NULL;
|
||||
EffectSsHahen_SpawnBurst(globalCtx, &this->dyna.actor.world.pos, 30.0f, 0, 25, 5, 40, OBJECT_SPOT02_OBJECTS, 20,
|
||||
D_06012D30);
|
||||
} else if (this->timer == 0) {
|
||||
Actor_Kill(&this->dyna.actor);
|
||||
}
|
||||
|
||||
if (globalCtx->csCtx.frames == 402) {
|
||||
if (LINK_IS_CHILD) {
|
||||
func_8002F7DC(&player->actor, NA_SE_VO_LI_DEMO_DAMAGE_KID);
|
||||
} else {
|
||||
func_8002F7DC(&player->actor, NA_SE_VO_LI_DEMO_DAMAGE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void func_808ACAFC(BgSpot02Objects* this, GlobalContext* globalCtx) {
|
||||
if (Flags_GetSwitch(globalCtx, this->unk_16B)) {
|
||||
Actor_SetFocus(&this->dyna.actor, 60.0f);
|
||||
OnePointCutscene_Attention(globalCtx, &this->dyna.actor);
|
||||
this->actionFunc = func_808ACB58;
|
||||
}
|
||||
}
|
||||
|
||||
void func_808ACB58(BgSpot02Objects* this, GlobalContext* globalCtx) {
|
||||
if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y + 255.0f, 1.0f)) {
|
||||
Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
|
||||
this->actionFunc = func_808AC8FC;
|
||||
} else {
|
||||
func_8002F974(&this->dyna.actor, NA_SE_EV_WALL_MOVE_SP - SFX_FLAG);
|
||||
}
|
||||
}
|
||||
|
||||
void BgSpot02Objects_Update(Actor* thisx, GlobalContext* globalCtx) {
|
||||
BgSpot02Objects* this = THIS;
|
||||
|
||||
this->actionFunc(this, globalCtx);
|
||||
}
|
||||
|
||||
void BgSpot02Objects_Draw(Actor* thisx, GlobalContext* globalCtx) {
|
||||
static Gfx* dLists[] = { 0x06012A50, 0x060127C0, 0x060130B0 };
|
||||
|
||||
Gfx_DrawDListOpa(globalCtx, dLists[thisx->params]);
|
||||
}
|
||||
|
||||
void func_808ACC34(BgSpot02Objects* this, GlobalContext* globalCtx) {
|
||||
if (globalCtx->csCtx.state != 0 && globalCtx->csCtx.npcActions[0] != NULL &&
|
||||
globalCtx->csCtx.npcActions[0]->action == 2) {
|
||||
this->unk_16A++;
|
||||
|
||||
if (this->unk_16A >= 12) {
|
||||
Actor_Kill(&this->dyna.actor);
|
||||
}
|
||||
}
|
||||
|
||||
if (globalCtx->csCtx.frames == 245 || globalCtx->csCtx.frames == 351) {
|
||||
func_800788CC(NA_SE_EV_LIGHTNING);
|
||||
}
|
||||
}
|
||||
|
||||
void func_808ACCB8(Actor* thisx, GlobalContext* globalCtx) {
|
||||
BgSpot02Objects* this = THIS;
|
||||
f32 rate;
|
||||
s32 pad;
|
||||
u8 redPrim;
|
||||
u8 greenPrim;
|
||||
u8 bluePrim;
|
||||
u8 redEnv;
|
||||
u8 greenEnv;
|
||||
u8 blueEnv;
|
||||
|
||||
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_bg_spot02_objects.c", 600);
|
||||
|
||||
if (globalCtx->csCtx.state != 0 && globalCtx->csCtx.npcActions[0] != NULL &&
|
||||
globalCtx->csCtx.npcActions[0]->action == 2) {
|
||||
if (this->unk_16A < 5) {
|
||||
rate = (this->unk_16A / 5.0f);
|
||||
redPrim = greenPrim = bluePrim = 255;
|
||||
redEnv = 100.0f + 155.0f * rate;
|
||||
greenEnv = 255;
|
||||
blueEnv = 255.0f - 155.0f * rate;
|
||||
} else {
|
||||
rate = ((this->unk_16A - 5) / 7.0f);
|
||||
redPrim = 255.0f - (255.0f * rate);
|
||||
greenPrim = 255.0f - (55.0f * rate);
|
||||
bluePrim = 255.0f - (255.0f * rate);
|
||||
redEnv = 255.0f - (105.0f * rate);
|
||||
greenEnv = 255.0f - (255.0f * rate);
|
||||
blueEnv = 100.0f + (100.0f * rate);
|
||||
}
|
||||
|
||||
Matrix_Translate(globalCtx->csCtx.npcActions[0]->startPos.x, globalCtx->csCtx.npcActions[0]->startPos.y,
|
||||
globalCtx->csCtx.npcActions[0]->startPos.z, MTXMODE_NEW);
|
||||
Matrix_RotateX(globalCtx->csCtx.npcActions[0]->urot.x * (M_PI / (f32)0x8000), MTXMODE_APPLY);
|
||||
Matrix_RotateY(globalCtx->csCtx.npcActions[0]->urot.y * (M_PI / (f32)0x8000), MTXMODE_APPLY);
|
||||
Matrix_RotateZ(globalCtx->csCtx.npcActions[0]->urot.z * (M_PI / (f32)0x8000), MTXMODE_APPLY);
|
||||
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
|
||||
func_80093D84(globalCtx->state.gfxCtx);
|
||||
|
||||
gDPPipeSync(POLY_XLU_DISP++);
|
||||
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, redPrim, greenPrim, bluePrim, 255);
|
||||
gDPSetEnvColor(POLY_XLU_DISP++, redEnv, greenEnv, blueEnv, 255);
|
||||
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_bg_spot02_objects.c", 679),
|
||||
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
gSPSegment(POLY_XLU_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(D_808AD850[this->unk_16A]));
|
||||
gDPPipeSync(POLY_XLU_DISP++);
|
||||
gSPDisplayList(POLY_XLU_DISP++, D_060126F0);
|
||||
gDPPipeSync(POLY_XLU_DISP++);
|
||||
}
|
||||
|
||||
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_bg_spot02_objects.c", 692);
|
||||
}
|
||||
|
||||
void func_808AD3D4(BgSpot02Objects* this, GlobalContext* globalCtx) {
|
||||
if (globalCtx->csCtx.state != 0 && globalCtx->csCtx.npcActions[2] != NULL &&
|
||||
globalCtx->csCtx.npcActions[2]->action == 2) {
|
||||
if (this->timer == 2) {
|
||||
Audio_PlayActorSound2(&this->dyna.actor, NA_SE_IT_EXPLOSION_ICE);
|
||||
}
|
||||
|
||||
if (this->timer < 32) {
|
||||
this->timer++;
|
||||
} else {
|
||||
Actor_Kill(&this->dyna.actor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void func_808AD450(Actor* thisx, GlobalContext* globalCtx) {
|
||||
BgSpot02Objects* this = THIS;
|
||||
s32 pad;
|
||||
f32 lerp;
|
||||
|
||||
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_bg_spot02_objects.c", 736);
|
||||
|
||||
if (globalCtx->csCtx.state != 0 && globalCtx->csCtx.npcActions[2] != NULL) {
|
||||
u16 temp_v1 = globalCtx->csCtx.npcActions[2]->urot.z * 0.00549325f;
|
||||
|
||||
if (this->unk_170 != temp_v1) {
|
||||
if (this->unk_170 == 0xFFFF) {
|
||||
this->unk_170 = temp_v1;
|
||||
this->unk_172 = temp_v1;
|
||||
} else {
|
||||
this->unk_172 = this->unk_170;
|
||||
this->unk_170 = temp_v1;
|
||||
}
|
||||
}
|
||||
|
||||
lerp = func_8006F93C(globalCtx->csCtx.npcActions[2]->endFrame, globalCtx->csCtx.npcActions[2]->startFrame,
|
||||
globalCtx->csCtx.frames);
|
||||
|
||||
// should be able to remove & 0xFFFF with some other change
|
||||
if ((globalCtx->csCtx.npcActions[2]->action & 0xFFFF) == 2) {
|
||||
Matrix_Translate(globalCtx->csCtx.npcActions[2]->startPos.x, globalCtx->csCtx.npcActions[2]->startPos.y,
|
||||
globalCtx->csCtx.npcActions[2]->startPos.z, MTXMODE_NEW);
|
||||
Matrix_RotateX(globalCtx->csCtx.npcActions[2]->urot.x * (M_PI / (f32)0x8000), MTXMODE_APPLY);
|
||||
Matrix_RotateY(globalCtx->csCtx.npcActions[2]->urot.y * (M_PI / (f32)0x8000), MTXMODE_APPLY);
|
||||
Matrix_Scale(0.9f, 0.9f, (((this->unk_170 - this->unk_172) * lerp) + this->unk_172) * 0.1f, MTXMODE_APPLY);
|
||||
func_80093D84(globalCtx->state.gfxCtx);
|
||||
|
||||
gDPPipeSync(POLY_XLU_DISP++);
|
||||
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 170, 128);
|
||||
gDPSetEnvColor(POLY_XLU_DISP++, 150, 120, 0, 128);
|
||||
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_bg_spot02_objects.c", 795),
|
||||
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
gSPSegment(POLY_XLU_DISP++, 0x08,
|
||||
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 2 * this->timer, -3 * this->timer, 32, 64, 1,
|
||||
4 * this->timer, -6 * this->timer, 32, 64));
|
||||
gDPPipeSync(POLY_XLU_DISP++);
|
||||
gSPDisplayList(POLY_XLU_DISP++, D_060013F0);
|
||||
gDPPipeSync(POLY_XLU_DISP++);
|
||||
}
|
||||
}
|
||||
|
||||
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_bg_spot02_objects.c", 818);
|
||||
}
|
||||
|
|
|
@ -6,9 +6,17 @@
|
|||
|
||||
struct BgSpot02Objects;
|
||||
|
||||
typedef void (*BgSpot02ObjectsActionFunc)(struct BgSpot02Objects*, GlobalContext*);
|
||||
|
||||
typedef struct BgSpot02Objects {
|
||||
/* 0x0000 */ Actor actor;
|
||||
/* 0x014C */ char unk_14C[0x28];
|
||||
/* 0x0000 */ DynaPolyActor dyna;
|
||||
/* 0x0164 */ BgSpot02ObjectsActionFunc actionFunc;
|
||||
/* 0x0168 */ s16 timer;
|
||||
/* 0x016A */ u8 unk_16A;
|
||||
/* 0x016B */ u8 unk_16B;
|
||||
/* 0x016C */ char unk_16C[4];
|
||||
/* 0x0170 */ u16 unk_170;
|
||||
/* 0x0172 */ u16 unk_172;
|
||||
} BgSpot02Objects; // size = 0x0174
|
||||
|
||||
extern const ActorInit Bg_Spot02_Objects_InitVars;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue