1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-03 14:34:32 +00:00

EnJj and object_jj OK (#741)

* Shift to new branch

* object_jj decomped

* docs

* Documented blinking, various other things

* more naming

* Most stuff in the object named

* implement eye enums

* delete asm

* Changes from Fig's review

* Apply suggestions from code review

Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>

Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
This commit is contained in:
EllipticEllipsis 2021-03-29 01:02:09 +01:00 committed by GitHub
parent 1639417327
commit ed4021a6fe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 532 additions and 761 deletions

View file

@ -5,23 +5,31 @@
*/
#include "z_en_jj.h"
#include "objects/object_jj/object_jj.h"
#include "overlays/actors/ovl_Eff_Dust/z_eff_dust.h"
#define FLAGS 0x00000030
#define THIS ((EnJj*)thisx)
typedef enum {
/* 0 */ JABUJABU_EYE_OPEN,
/* 1 */ JABUJABU_EYE_HALF,
/* 2 */ JABUJABU_EYE_CLOSED,
/* 3 */ JABUJABU_EYE_MAX
} EnJjEyeState;
void EnJj_Init(Actor* thisx, GlobalContext* globalCtx);
void EnJj_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnJj_Update(Actor* thisx, GlobalContext* globalCtx);
void EnJj_Draw(Actor* thisx, GlobalContext* globalCtx);
extern UNK_TYPE D_06000A1C;
extern UNK_TYPE D_06001830;
extern UNK_TYPE D_06001F4C;
extern UNK_TYPE D_0600B9A8;
extern UNK_TYPE D_0600BA8C;
void EnJj_UpdateStaticCollision(Actor* thisx, GlobalContext* globalCtx);
void EnJj_WaitToOpenMouth(EnJj* this, GlobalContext* globalCtx);
void EnJj_WaitForFish(EnJj* this, GlobalContext* globalCtx);
void EnJj_BeginCutscene(EnJj* this, GlobalContext* globalCtx);
void EnJj_RemoveDust(EnJj* this, GlobalContext* globalCtx);
/*
const ActorInit En_Jj_InitVars = {
ACTOR_EN_JJ,
ACTORCAT_ITEMACTION,
@ -34,7 +42,13 @@ const ActorInit En_Jj_InitVars = {
(ActorFunc)EnJj_Draw,
};
static ColliderCylinderInit D_80A88CB4 = {
static s32 sUnused = 0;
#include "z_en_jj_cutscene_data.c" EARLY
static s32 sUnused2[] = { 0, 0 };
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_NONE,
AT_NONE,
@ -53,29 +67,263 @@ static ColliderCylinderInit D_80A88CB4 = {
},
{ 170, 150, 0, { 0, 0, 0 } },
};
*/
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/func_80A87800.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/EnJj_Init.s")
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 87, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneScale, 3300, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 1100, ICHAIN_STOP),
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/EnJj_Destroy.s")
void EnJj_SetupAction(EnJj* this, EnJjActionFunc actionFunc) {
this->actionFunc = actionFunc;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/func_80A87B1C.s")
void EnJj_Init(Actor* thisx, GlobalContext* globalCtx2) {
GlobalContext* globalCtx = globalCtx2;
EnJj* this = THIS;
CollisionHeader* colHeader = NULL;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/func_80A87B9C.s")
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
ActorShape_Init(&this->dyna.actor.shape, 0.0f, NULL, 0.0f);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/func_80A87BEC.s")
switch (this->dyna.actor.params) {
case JABUJABU_MAIN:
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gJabuJabuSkel, &gJabuJabuAnim, this->jointTable,
this->morphTable, 22);
Animation_PlayLoop(&this->skelAnime, &gJabuJabuAnim);
this->unk_30A = 0;
this->eyeIndex = 0;
this->blinkTimer = 0;
this->extraBlinkCounter = 0;
this->extraBlinkTotal = 0;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/func_80A87C30.s")
if (gSaveContext.eventChkInf[3] & 0x400) { // Fish given
EnJj_SetupAction(this, EnJj_WaitToOpenMouth);
} else {
EnJj_SetupAction(this, EnJj_WaitForFish);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/func_80A87CEC.s")
this->bodyCollisionActor = (DynaPolyActor*)Actor_SpawnAsChild(
&globalCtx->actorCtx, &this->dyna.actor, globalCtx, ACTOR_EN_JJ, this->dyna.actor.world.pos.x - 10.0f,
this->dyna.actor.world.pos.y, this->dyna.actor.world.pos.z, 0, this->dyna.actor.world.rot.y, 0,
JABUJABU_COLLISION);
DynaPolyActor_Init(&this->dyna, 0);
CollisionHeader_GetVirtual(&gJabuJabuHeadCol, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, colHeader);
Collider_InitCylinder(globalCtx, &this->collider);
Collider_SetCylinder(globalCtx, &this->collider, &this->dyna.actor, &sCylinderInit);
this->dyna.actor.colChkInfo.mass = MASS_IMMOVABLE;
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/func_80A87D94.s")
case JABUJABU_COLLISION:
DynaPolyActor_Init(&this->dyna, 0);
CollisionHeader_GetVirtual(&gJabuJabuBodyCol, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, colHeader);
func_8003ECA8(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.update = EnJj_UpdateStaticCollision;
this->dyna.actor.draw = NULL;
Actor_SetScale(&this->dyna.actor, 0.087f);
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/func_80A87EF0.s")
case JABUJABU_UNUSED_COLLISION:
DynaPolyActor_Init(&this->dyna, 0);
CollisionHeader_GetVirtual(&gJabuJabuUnusedCol, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, colHeader);
this->dyna.actor.update = EnJj_UpdateStaticCollision;
this->dyna.actor.draw = NULL;
Actor_SetScale(&this->dyna.actor, 0.087f);
break;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/func_80A87F44.s")
void EnJj_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnJj* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/EnJj_Update.s")
switch (this->dyna.actor.params) {
case JABUJABU_MAIN:
DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
Collider_DestroyCylinder(globalCtx, &this->collider);
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Jj/EnJj_Draw.s")
case JABUJABU_COLLISION:
case JABUJABU_UNUSED_COLLISION:
DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
break;
}
}
/**
* Blink routine. Blinks at the end of each randomised blinkTimer cycle. If extraBlinkCounter is not zero, blink that
* many more times before resuming random blinkTimer cycles. extraBlinkTotal can be set to a positive number to blink
* that many extra times at the end of every blinkTimer cycle, but the actor always sets it to zero, so only one
* multiblink happens when extraBlinkCounter is nonzero.
*/
void EnJj_Blink(EnJj* this) {
if (this->blinkTimer > 0) {
this->blinkTimer--;
} else {
this->eyeIndex++;
if (this->eyeIndex >= JABUJABU_EYE_MAX) {
this->eyeIndex = JABUJABU_EYE_OPEN;
if (this->extraBlinkCounter > 0) {
this->extraBlinkCounter--;
} else {
this->blinkTimer = Rand_S16Offset(20, 20);
this->extraBlinkCounter = this->extraBlinkTotal;
}
}
}
}
void EnJj_OpenMouth(EnJj* this, GlobalContext* globalCtx) {
DynaPolyActor* bodyCollisionActor = this->bodyCollisionActor;
if (this->mouthOpenAngle >= -5200) {
this->mouthOpenAngle -= 102;
if (this->mouthOpenAngle < -2600) {
func_8003EBF8(globalCtx, &globalCtx->colCtx.dyna, bodyCollisionActor->bgId);
}
}
}
void EnJj_WaitToOpenMouth(EnJj* this, GlobalContext* globalCtx) {
if (this->dyna.actor.xzDistToPlayer < 300.0f) {
EnJj_SetupAction(this, EnJj_OpenMouth);
}
}
void EnJj_WaitForFish(EnJj* this, GlobalContext* globalCtx) {
static Vec3f feedingSpot = { -1589.0f, 53.0f, -43.0f };
Player* player = PLAYER;
if ((Math_Vec3f_DistXZ(&feedingSpot, &player->actor.world.pos) < 300.0f) &&
globalCtx->isPlayerDroppingFish(globalCtx)) {
this->cutsceneCountdownTimer = 100;
EnJj_SetupAction(this, EnJj_BeginCutscene);
}
this->collider.dim.pos.x = -1245;
this->collider.dim.pos.y = 20;
this->collider.dim.pos.z = -48;
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
void EnJj_BeginCutscene(EnJj* this, GlobalContext* globalCtx) {
DynaPolyActor* bodyCollisionActor = this->bodyCollisionActor;
if (this->cutsceneCountdownTimer > 0) {
this->cutsceneCountdownTimer--;
} else {
EnJj_SetupAction(this, EnJj_RemoveDust);
globalCtx->csCtx.segment = &D_80A88164;
gSaveContext.cutsceneTrigger = 1;
func_8003EBF8(globalCtx, &globalCtx->colCtx.dyna, bodyCollisionActor->bgId);
func_8005B1A4(ACTIVE_CAM);
gSaveContext.eventChkInf[3] |= 0x400;
func_80078884(NA_SE_SY_CORRECT_CHIME);
}
}
void EnJj_CutsceneUpdate(EnJj* this, GlobalContext* globalCtx) {
switch (globalCtx->csCtx.npcActions[2]->action) {
case 1:
if (this->unk_30A & 2) {
this->eyeIndex = 0;
this->blinkTimer = Rand_S16Offset(20, 20);
this->extraBlinkCounter = 0;
this->extraBlinkTotal = 0;
this->unk_30A ^= 2;
}
break;
case 2:
this->unk_30A |= 1;
if (!(this->unk_30A & 8)) {
this->dust = Actor_SpawnAsChild(&globalCtx->actorCtx, &this->dyna.actor, globalCtx, ACTOR_EFF_DUST,
-1100.0f, 105.0f, -27.0f, 0, 0, 0, EFF_DUST_TYPE_0);
this->unk_30A |= 8;
}
break;
case 3:
if (!(this->unk_30A & 2)) {
this->eyeIndex = 0;
this->blinkTimer = 0;
this->extraBlinkCounter = 1;
this->extraBlinkTotal = 0;
this->unk_30A |= 2;
}
break;
}
if (this->unk_30A & 1) {
Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_JABJAB_BREATHE - SFX_FLAG);
if (this->mouthOpenAngle >= -5200) {
this->mouthOpenAngle -= 102;
}
}
}
void EnJj_RemoveDust(EnJj* this, GlobalContext* globalCtx) {
Actor* dust;
if (!(this->unk_30A & 4)) {
this->unk_30A |= 4;
dust = this->dust;
if (dust != NULL) {
Actor_Kill(dust);
this->dyna.actor.child = NULL;
}
}
}
void EnJj_UpdateStaticCollision(Actor* thisx, GlobalContext* globalCtx) {
}
void EnJj_Update(Actor* thisx, GlobalContext* globalCtx) {
EnJj* this = THIS;
if ((globalCtx->csCtx.state != 0) && (globalCtx->csCtx.npcActions[2] != NULL)) {
EnJj_CutsceneUpdate(this, globalCtx);
} else {
this->actionFunc(this, globalCtx);
if (this->skelAnime.curFrame == 41.0f) {
Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_JABJAB_GROAN);
}
}
EnJj_Blink(this);
SkelAnime_Update(&this->skelAnime);
Actor_SetScale(&this->dyna.actor, 0.087f);
// Head
this->skelAnime.jointTable[10].z = this->mouthOpenAngle;
}
static u64* sEyeTextures[] = {
gJabuJabuEyeOpenTex,
gJabuJabuEyeHalfTex,
gJabuJabuEyeClosedTex,
};
void EnJj_Draw(Actor* thisx, GlobalContext* globalCtx2) {
GlobalContext* globalCtx = globalCtx2;
EnJj* this = THIS;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_jj.c", 879);
func_800943C8(globalCtx->state.gfxCtx);
Matrix_Translate(0.0f, (cosf(this->skelAnime.curFrame * (M_PI / 41.0f)) * 10.0f) - 10.0f, 0.0f, MTXMODE_APPLY);
Matrix_Scale(10.0f, 10.0f, 10.0f, MTXMODE_APPLY);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeIndex]));
SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
0, 0, this);
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_jj.c", 898);
}

View file

@ -6,11 +6,33 @@
struct EnJj;
typedef void (*EnJjActionFunc)(struct EnJj*, GlobalContext*);
typedef struct EnJj {
/* 0x0000 */ Actor actor;
/* 0x014C */ char unk_14C[0x1C8];
/* 0x0000 */ DynaPolyActor dyna;
/* 0x0164 */ SkelAnime skelAnime;
/* 0x01A8 */ Vec3s jointTable[22];
/* 0x022C */ Vec3s morphTable[22];
/* 0x02B0 */ ColliderCylinder collider;
/* 0x02FC */ EnJjActionFunc actionFunc;
/* 0x0300 */ DynaPolyActor* bodyCollisionActor;
/* 0x0304 */ Actor* dust;
/* 0x0308 */ s16 mouthOpenAngle;
/* 0x030A */ u16 unk_30A;
/* 0x030C */ s16 cutsceneCountdownTimer;
/* 0x030E */ u8 eyeIndex;
/* 0x030F */ u8 blinkTimer;
/* 0x0310 */ u8 extraBlinkCounter;
/* 0x0311 */ u8 extraBlinkTotal;
} EnJj; // size = 0x0314
typedef enum {
/* -1 */ JABUJABU_MAIN = -1, // Head, drawn body, handles updating
/* 0 */ JABUJABU_COLLISION, // Static collision for body
/* 1 */ JABUJABU_UNUSED_COLLISION // Shaped like a screen
} EnJjType;
extern const ActorInit En_Jj_InitVars;
#endif

View file

@ -0,0 +1,158 @@
#include "z_en_jj.h"
#include "z64cutscene_commands.h"
// clang-format off
static CutsceneData D_80A88164[] = {
CS_BEGIN_CUTSCENE(26, 1629),
CS_PLAYER_ACTION_LIST(4),
CS_PLAYER_ACTION(0x0005, 0, 240, 0x0000, 0x4000, 0x0000, -1732, 52, -44, -1732, 52, -44, 1.1393037e-29f, 0.0f, 1.4e-45f),
CS_PLAYER_ACTION(0x0003, 240, 255, 0x0000, 0x4000, 0x0000, -1732, 52, -44, -1732, 52, -44, 1.1393037e-29f, 0.0f, 1.4e-45f),
CS_PLAYER_ACTION(0x0006, 255, 285, 0x0000, 0x4000, 0x0000, -1732, 52, -44, -1732, 52, -44, 1.1393037e-29f, 0.0f, 1.4e-45f),
CS_PLAYER_ACTION(0x0020, 285, 300, 0x0000, 0xC000, 0x0000, -1732, 52, -44, -1537, 109, -44, 1.1393037e-29f, 0.0f, 1.4e-45f),
CS_NPC_ACTION_LIST(68, 4),
CS_NPC_ACTION(0x0001, 0, 234, 0x0000, 0x4000, 0x0000, -1665, 52, -44, -1665, 52, -44, 1.1393037e-29f, 0.0f, 1.4e-45f),
CS_NPC_ACTION(0x0002, 234, 241, 0x41F8, 0x0000, 0x0000, -1665, 52, -44, -1603, 130, -47, 8.857142448425293f, 11.142857551574707f, -8.857142448425293f),
CS_NPC_ACTION(0x0002, 241, 280, 0x4031, 0x0000, 0x0000, -1603, 130, -47, -549, 130, -52, 27.0256404876709f, 0.0f, -27.0256404876709f),
CS_NPC_ACTION(0x0003, 280, 300, 0x0000, 0x0000, 0x0000, -549, 130, -52, -549, 130, -52, 0.0f, 0.0f, 0.0f),
CS_NPC_ACTION_LIST(67, 5),
CS_NPC_ACTION(0x0001, 0, 93, 0x0000, 0x0000, 0x0000, 0, 51, 124, 0, 51, 124, 0.0f, 0.0f, 0.0f),
CS_NPC_ACTION(0x0003, 93, 121, 0x0000, 0x0000, 0x0000, 0, 51, 124, 0, 51, 124, 0.0f, 0.0f, 0.0f),
CS_NPC_ACTION(0x0001, 121, 146, 0x0000, 0x0000, 0x0000, 0, 51, 124, 0, 51, 124, 0.0f, 0.0f, 0.0f),
CS_NPC_ACTION(0x0002, 146, 241, 0x0000, 0x0000, 0x0000, 0, 51, 124, 0, 51, 124, 0.0f, 0.0f, 0.0f),
CS_NPC_ACTION(0x0001, 241, 441, 0x0000, 0x0000, 0x0000, 0, 51, 124, 0, 51, 124, 0.0f, 0.0f, 0.0f),
CS_NPC_ACTION_LIST(69, 3),
CS_NPC_ACTION(0x0001, 0, 90, 0x0000, 0x0000, 0x0000, 0, -33, 9, 0, -33, 9, 0.0f, 0.0f, 0.0f),
CS_NPC_ACTION(0x0002, 90, 330, 0x0000, 0x0000, 0x0000, 0, -33, 9, 0, -62, 22, 0.0f, -0.12083332985639572f, 0.0f),
CS_NPC_ACTION(0x0003, 330, 380, 0x0000, 0x0000, 0x0000, 0, -62, 22, 0, -62, 22, 0.0f, 0.0f, 0.0f),
CS_MISC_LIST(1),
CS_MISC(0x000C, 1095, 1161, 0x0000, 0x00000000, 0xFFFFFFD2, 0x00000000, 0xFFFFFFD0, 0xFFFFFFD2, 0x00000000, 0xFFFFFFD0, 0x00000000, 0x00000000, 0x00000000),
CS_SCENE_TRANS_FX(0x0009, 0, 10),
CS_PLAYER_ACTION_LIST(1),
CS_PLAYER_ACTION(0x0035, 300, 1629, 0x0000, 0x0000, 0x0000, -1630, 52, -52, -1630, 52, -52, 0.0f, 0.0f, 0.0f),
CS_CAM_POS_LIST(0, 1091),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1641, 95, -41, 0x015C),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1641, 95, -41, 0x016D),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1641, 95, -41, 0x017E),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1641, 95, -41, 0x0223),
CS_CAM_POS(CS_CMD_STOP, 0x00, 0, 45.399944f, -1641, 95, -41, 0x7065),
CS_CAM_POS_LIST(60, 1151),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1532, 251, 222, 0x015C),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1532, 251, 222, 0x016D),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1532, 251, 222, 0x017E),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1532, 251, 222, 0x0223),
CS_CAM_POS(CS_CMD_STOP, 0x00, 0, 45.399944f, -1532, 251, 222, 0x7065),
CS_CAM_POS_LIST(90, 351),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1698, 382, 455, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1698, 382, 455, 0xAC34),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1698, 382, 455, 0x4428),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1694, 380, 451, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 32.99989700317383f, -1694, 380, 451, 0xAC10),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 32.99989700317383f, -1694, 380, 451, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 32.99989700317383f, -1694, 380, 451, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 32.99989700317383f, -1694, 380, 451, 0x0164),
CS_CAM_POS(CS_CMD_STOP, 0x00, 0, 32.99989700317383f, -1694, 380, 451, 0xAD78),
CS_CAM_POS_LIST(220, 392),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1641, 95, -41, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1641, 95, -41, 0xAC34),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1641, 95, -41, 0x4428),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1641, 95, -41, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1641, 95, -41, 0xAC10),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1641, 95, -41, 0x0000),
CS_CAM_POS(CS_CMD_STOP, 0x00, 0, 45.399944f, -1641, 95, -41, 0x0000),
CS_CAM_POS_LIST(240, 1331),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.599945068359375f, -1810, 65, -15, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.599945068359375f, -1810, 65, -15, 0xAC34),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.599945068359375f, -1810, 65, -15, 0x4428),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.599945068359375f, -1810, 65, -15, 0x0000),
CS_CAM_POS(CS_CMD_STOP, 0x00, 0, 45.599945068359375f, -1810, 65, -15, 0xAC10),
CS_CAM_POS_LIST(280, 1371),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.599945068359375f, -1531, 95, -7, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.599945068359375f, -1531, 95, -7, 0xAC34),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.599945068359375f, -1531, 95, -7, 0x4428),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.599945068359375f, -1531, 95, -7, 0x0000),
CS_CAM_POS(CS_CMD_STOP, 0x00, 0, 45.599945068359375f, -1531, 95, -7, 0xAC10),
CS_CAM_POS_LIST(310, 1421),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1717, 83, -59, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1717, 83, -59, 0xAC34),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1649, 177, -59, 0x4428),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1533, 224, -59, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -1243, 180, -59, 0xAC10),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -953, 71, -55, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -953, 71, -55, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 45.399944f, -953, 71, -55, 0x0164),
CS_CAM_POS(CS_CMD_STOP, 0x00, 0, 45.399944f, -953, 71, -55, 0xAD78),
CS_CAM_POS_LIST(355, 1466),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 60.60000228881836f, -1830, 103, 18, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 60.60000228881836f, -1830, 103, 18, 0xAC34),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 60.60000228881836f, -1830, 103, 18, 0x4428),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 60.60000228881836f, -1830, 103, 18, 0x0000),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 60.60000228881836f, -1830, 103, 18, 0xAC10),
CS_CAM_POS(CS_CMD_CONTINUE, 0x00, 0, 60.60000228881836f, -1830, 103, 18, 0x0000),
CS_CAM_POS(CS_CMD_STOP, 0x00, 0, 60.60000228881836f, -1830, 103, 18, 0x0000),
CS_CAM_FOCUS_POINT_LIST(0, 1120),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -1724, -5, -45, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -1724, -5, -45, 0xAC34),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 1000, 45.399944f, -1724, -5, -45, 0x4428),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -1724, -5, -45, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_STOP, 0x00, 30, 45.399944f, -1724, -5, -45, 0xAC10),
CS_CAM_FOCUS_POINT_LIST(60, 1180),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -1440, 241, 134, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -1440, 241, 134, 0xAC34),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 1000, 45.399944f, -1440, 241, 134, 0x4428),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -1440, 241, 134, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_STOP, 0x00, 30, 45.399944f, -1440, 241, 134, 0xAC10),
CS_CAM_FOCUS_POINT_LIST(90, 380),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -1610, 348, 373, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -1610, 348, 373, 0xAC34),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 50, 45.399944f, -1610, 348, 373, 0x4428),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 35.399906158447266f, -1614, 338, 367, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 32.99989700317383f, -1614, 338, 367, 0xAC10),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 32.99989700317383f, -1614, 338, 367, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 32.99989700317383f, -1614, 338, 367, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 32.99989700317383f, -1614, 338, 367, 0x0164),
CS_CAM_FOCUS_POINT(CS_CMD_STOP, 0x00, 30, 32.99989700317383f, -1614, 338, 367, 0xAD78),
CS_CAM_FOCUS_POINT_LIST(220, 421),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -1724, -5, -45, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 70, 45.399944f, -1724, -5, -45, 0xAC34),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 5, 45.399944f, -1724, -5, -45, 0x4428),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 6, 45.79994583129883f, -1593, 150, -146, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -1531, 152, -75, 0xAC10),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -1531, 152, -75, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_STOP, 0x00, 30, 45.399944f, -1531, 152, -75, 0x0000),
CS_CAM_FOCUS_POINT_LIST(240, 1360),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.599945068359375f, -1712, 74, -37, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.599945068359375f, -1712, 74, -37, 0xAC34),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 1000, 45.599945068359375f, -1712, 74, -37, 0x4428),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.599945068359375f, -1712, 74, -37, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_STOP, 0x00, 30, 45.599945068359375f, -1712, 74, -37, 0xAC10),
CS_CAM_FOCUS_POINT_LIST(280, 1400),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.599945068359375f, -1619, 99, -50, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.599945068359375f, -1619, 99, -50, 0xAC34),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 1000, 45.599945068359375f, -1619, 99, -50, 0x4428),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.599945068359375f, -1619, 99, -50, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_STOP, 0x00, 30, 45.599945068359375f, -1619, 99, -50, 0xAC10),
CS_CAM_FOCUS_POINT_LIST(310, 1450),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x0B, 30, 90.99960327148438f, -1610, 141, -59, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x09, 10, 90.79960632324219f, -1599, 114, -57, 0xAC34),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0xFC, 10, 90.39961242675781f, -1528, 192, -54, 0x4428),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 10, 90.599609375f, -1427, 164, -54, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0xCB, 10, 90.39961242675781f, -1138, 119, -37, 0xAC10),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x20, 10, 90.39961242675781f, -832, 50, -51, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 1000, 45.399944f, -836, 35, -51, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 45.399944f, -836, 35, -51, 0x0164),
CS_CAM_FOCUS_POINT(CS_CMD_STOP, 0x00, 30, 45.399944f, -836, 35, -51, 0xAD78),
CS_CAM_FOCUS_POINT_LIST(355, 1495),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 60.60000228881836f, -1706, 111, -6, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 60.60000228881836f, -1706, 111, -6, 0xAC34),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 10, 60.60000228881836f, -1706, 111, -6, 0x4428),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 10, 60.60000228881836f, -1721, 82, -42, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 1000, 60.60000228881836f, -1721, 82, -42, 0xAC10),
CS_CAM_FOCUS_POINT(CS_CMD_CONTINUE, 0x00, 30, 60.60000228881836f, -1721, 82, -42, 0x0000),
CS_CAM_FOCUS_POINT(CS_CMD_STOP, 0x00, 30, 60.60000228881836f, -1721, 82, -42, 0x0000),
CS_SCENE_TRANS_FX(0x000B, 335, 342),
CS_TERMINATOR(JABU_JABU_INTRO, 345, 395),
CS_NPC_ACTION_LIST(62, 1),
CS_NPC_ACTION(0x0001, 305, 494, 0x0000, 0x0000, 0x0000, -1399, 452, -53, -1399, 452, -53, 0.0f, 0.0f, 0.0f),
CS_END(),
};
// clang-format on

View file

@ -350,7 +350,7 @@ void MagicFire_UpdateBeforeCast(Actor* thisx, GlobalContext* globalCtx) {
if (this->actionTimer > 0) {
this->actionTimer--;
} else {
this->actor.update = &MagicFire_Update;
this->actor.update = MagicFire_Update;
func_8002F7DC(&player->actor, NA_SE_PL_MAGIC_FIRE);
}
this->actor.world.pos = player->actor.world.pos;