mirror of
https://github.com/zeldaret/oot.git
synced 2025-02-19 05:15:18 +00:00
Polish up docs on EnDaiku and EnDaikuKakariko (#2463)
This commit is contained in:
parent
3dd893c210
commit
ae89a8e47b
2 changed files with 48 additions and 42 deletions
|
@ -5,6 +5,8 @@
|
|||
#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED)
|
||||
|
||||
#define ENDAIKU_GET_TYPE(thisx) PARAMS_GET_U((thisx)->params, 0, 2)
|
||||
#define ENDAIKU_GET_PATH_INDEX(thisx) PARAMS_GET_U((thisx)->params, 4, 4)
|
||||
#define ENDAIKU_GET_DOOR_SWITCH_FLAG(thisx) PARAMS_GET_U((thisx)->params, 8, 6)
|
||||
|
||||
typedef struct EnDaikuEscapeSubCamParam {
|
||||
Vec3f eyePosDeltaLocal;
|
||||
|
@ -13,10 +15,10 @@ typedef struct EnDaikuEscapeSubCamParam {
|
|||
|
||||
// state flags
|
||||
|
||||
// probably related to animating torso and head to look towards the player
|
||||
#define ENDAIKU_STATEFLAG_1 (1 << 1)
|
||||
// same
|
||||
#define ENDAIKU_STATEFLAG_2 (1 << 2)
|
||||
// the carpenter tracks the player position
|
||||
#define ENDAIKU_STATEFLAG_TRACK_PLAYER (1 << 1)
|
||||
// if tracking the player, track with the carpenter's full body
|
||||
#define ENDAIKU_STATEFLAG_TRACK_WITH_FULL_BODY (1 << 2)
|
||||
// the gerudo guard appeared (after talking to the carpenter)
|
||||
#define ENDAIKU_STATEFLAG_GERUDOFIGHTING (1 << 3)
|
||||
// the gerudo guard was defeated
|
||||
|
@ -121,9 +123,9 @@ typedef enum EnDaikuAnimation {
|
|||
} EnDaikuAnimation;
|
||||
|
||||
static AnimationFrameCountInfo sAnimationInfo[] = {
|
||||
{ &object_daiku_Anim_001AB0, 1.0f, 0, 0 }, { &object_daiku_Anim_007DE0, 1.0f, 0, 0 },
|
||||
{ &object_daiku_Anim_00885C, 1.0f, 0, 0 }, { &object_daiku_Anim_000C44, 1.0f, 0, 0 },
|
||||
{ &object_daiku_Anim_008164, 1.0f, 0, 0 },
|
||||
{ &object_daiku_Anim_001AB0, 1.0f, ANIMMODE_LOOP, 0 }, { &object_daiku_Anim_007DE0, 1.0f, ANIMMODE_LOOP, 0 },
|
||||
{ &object_daiku_Anim_00885C, 1.0f, ANIMMODE_LOOP, 0 }, { &object_daiku_Anim_000C44, 1.0f, ANIMMODE_LOOP, 0 },
|
||||
{ &object_daiku_Anim_008164, 1.0f, ANIMMODE_LOOP, 0 },
|
||||
};
|
||||
|
||||
static EnDaikuEscapeSubCamParam sEscapeSubCamParams[] = {
|
||||
|
@ -199,15 +201,15 @@ void EnDaiku_Init(Actor* thisx, PlayState* play) {
|
|||
|
||||
if (play->sceneId == SCENE_THIEVES_HIDEOUT) {
|
||||
EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_STAND, &this->currentAnimIndex);
|
||||
this->stateFlags |= ENDAIKU_STATEFLAG_1 | ENDAIKU_STATEFLAG_2;
|
||||
this->stateFlags |= ENDAIKU_STATEFLAG_TRACK_PLAYER | ENDAIKU_STATEFLAG_TRACK_WITH_FULL_BODY;
|
||||
this->actionFunc = EnDaiku_Jailed;
|
||||
} else {
|
||||
if (ENDAIKU_GET_TYPE(&this->actor) == ENDAIKU_TYPE1 || ENDAIKU_GET_TYPE(&this->actor) == ENDAIKU_TYPE3) {
|
||||
EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_SIT, &this->currentAnimIndex);
|
||||
this->stateFlags |= ENDAIKU_STATEFLAG_1;
|
||||
this->stateFlags |= ENDAIKU_STATEFLAG_TRACK_PLAYER;
|
||||
} else {
|
||||
EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_SHOUT, &this->currentAnimIndex);
|
||||
this->stateFlags |= ENDAIKU_STATEFLAG_1 | ENDAIKU_STATEFLAG_2;
|
||||
this->stateFlags |= ENDAIKU_STATEFLAG_TRACK_PLAYER | ENDAIKU_STATEFLAG_TRACK_WITH_FULL_BODY;
|
||||
}
|
||||
|
||||
this->skelAnime.curFrame = (s32)(Rand_ZeroOne() * this->skelAnime.endFrame);
|
||||
|
@ -257,17 +259,17 @@ s32 EnDaiku_UpdateTalking(EnDaiku* this, PlayState* play) {
|
|||
void EnDaiku_UpdateText(EnDaiku* this, PlayState* play) {
|
||||
s32 carpenterType;
|
||||
s32 rescuedCount;
|
||||
s16 sp2E;
|
||||
s16 sp2C;
|
||||
s16 screenX;
|
||||
s16 screenY;
|
||||
|
||||
if (this->talkState == ENDAIKU_STATE_TALKING) {
|
||||
this->talkState = EnDaiku_UpdateTalking(this, play);
|
||||
} else if (Actor_TalkOfferAccepted(&this->actor, play)) {
|
||||
this->talkState = ENDAIKU_STATE_TALKING;
|
||||
} else {
|
||||
Actor_GetScreenPos(play, &this->actor, &sp2E, &sp2C);
|
||||
if (sp2E >= 0 && sp2E <= 320 && sp2C >= 0 && sp2C <= 240 && this->talkState == ENDAIKU_STATE_CAN_TALK &&
|
||||
Actor_OfferTalk(&this->actor, play, 100.0f) == 1) {
|
||||
Actor_GetScreenPos(play, &this->actor, &screenX, &screenY);
|
||||
if ((screenX >= 0) && (screenX <= SCREEN_WIDTH) && (screenY >= 0) && (screenY <= SCREEN_HEIGHT) &&
|
||||
(this->talkState == ENDAIKU_STATE_CAN_TALK) && (Actor_OfferTalk(&this->actor, play, 100.0f) == true)) {
|
||||
if (play->sceneId == SCENE_THIEVES_HIDEOUT) {
|
||||
if (this->stateFlags & ENDAIKU_STATEFLAG_GERUDODEFEATED) {
|
||||
rescuedCount = 0;
|
||||
|
@ -352,8 +354,6 @@ void EnDaiku_TentIdle(EnDaiku* this, PlayState* play) {
|
|||
*/
|
||||
void EnDaiku_Jailed(EnDaiku* this, PlayState* play) {
|
||||
EnGeldB* gerudo;
|
||||
s32 temp_t9;
|
||||
s32 temp_v1;
|
||||
|
||||
if (!(this->stateFlags & ENDAIKU_STATEFLAG_GERUDOFIGHTING)) {
|
||||
EnDaiku_UpdateText(this, play);
|
||||
|
@ -379,7 +379,7 @@ void EnDaiku_Jailed(EnDaiku* this, PlayState* play) {
|
|||
void EnDaiku_WaitFreedom(EnDaiku* this, PlayState* play) {
|
||||
SkelAnime_Update(&this->skelAnime);
|
||||
|
||||
if (Flags_GetSwitch(play, PARAMS_GET_U(this->actor.params, 8, 6))) {
|
||||
if (Flags_GetSwitch(play, ENDAIKU_GET_DOOR_SWITCH_FLAG(&this->actor))) {
|
||||
this->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY;
|
||||
EnDaiku_UpdateText(this, play);
|
||||
}
|
||||
|
@ -398,7 +398,7 @@ void EnDaiku_InitEscape(EnDaiku* this, PlayState* play) {
|
|||
|
||||
Audio_PlayFanfare(NA_BGM_APPEAR);
|
||||
EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_RUN, &this->currentAnimIndex);
|
||||
this->stateFlags &= ~(ENDAIKU_STATEFLAG_1 | ENDAIKU_STATEFLAG_2);
|
||||
this->stateFlags &= ~(ENDAIKU_STATEFLAG_TRACK_PLAYER | ENDAIKU_STATEFLAG_TRACK_WITH_FULL_BODY);
|
||||
|
||||
ENDAIKU_SET_CARPENTER_RESCUED(ENDAIKU_GET_TYPE(&this->actor));
|
||||
|
||||
|
@ -407,7 +407,7 @@ void EnDaiku_InitEscape(EnDaiku* this, PlayState* play) {
|
|||
EnDaiku_InitSubCamera(this, play);
|
||||
|
||||
exitLoop = false;
|
||||
path = &play->pathList[PARAMS_GET_U(this->actor.params, 4, 4)];
|
||||
path = &play->pathList[ENDAIKU_GET_PATH_INDEX(&this->actor)];
|
||||
while (!exitLoop) {
|
||||
pointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->waypoint;
|
||||
dx = pointPos->x - this->actor.world.pos.x;
|
||||
|
@ -524,7 +524,7 @@ void EnDaiku_EscapeRun(EnDaiku* this, PlayState* play) {
|
|||
f32 dxz;
|
||||
Vec3s* pointPos;
|
||||
|
||||
path = &play->pathList[PARAMS_GET_U(this->actor.params, 4, 4)];
|
||||
path = &play->pathList[ENDAIKU_GET_PATH_INDEX(&this->actor)];
|
||||
pointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->waypoint;
|
||||
dx = pointPos->x - this->actor.world.pos.x;
|
||||
dz = pointPos->z - this->actor.world.pos.z;
|
||||
|
@ -574,12 +574,12 @@ void EnDaiku_Update(Actor* thisx, PlayState* play) {
|
|||
|
||||
this->actionFunc(this, play);
|
||||
|
||||
if (this->stateFlags & ENDAIKU_STATEFLAG_1) {
|
||||
if (this->stateFlags & ENDAIKU_STATEFLAG_TRACK_PLAYER) {
|
||||
this->interactInfo.trackPos.x = player->actor.focus.pos.x;
|
||||
this->interactInfo.trackPos.y = player->actor.focus.pos.y;
|
||||
this->interactInfo.trackPos.z = player->actor.focus.pos.z;
|
||||
|
||||
if (this->stateFlags & ENDAIKU_STATEFLAG_2) {
|
||||
if (this->stateFlags & ENDAIKU_STATEFLAG_TRACK_WITH_FULL_BODY) {
|
||||
Npc_TrackPoint(&this->actor, &this->interactInfo, 0, NPC_TRACKING_FULL_BODY);
|
||||
} else {
|
||||
Npc_TrackPoint(&this->actor, &this->interactInfo, 0, NPC_TRACKING_HEAD_AND_TORSO);
|
||||
|
|
|
@ -9,6 +9,9 @@
|
|||
|
||||
#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED)
|
||||
|
||||
#define ENDAIKUKAKARIKO_GET_TYPE(thisx) PARAMS_GET_U((thisx)->params, 0, 2)
|
||||
#define ENDAIKUKAKARIKO_GET_PATH_INDEX(thisx) PARAMS_GET_U((thisx)->params, 8, 8)
|
||||
|
||||
typedef enum KakarikoCarpenterType {
|
||||
/* 0x0 */ CARPENTER_ICHIRO, // Red and purple pants, normal hair
|
||||
/* 0x1 */ CARPENTER_SABOORO, // Light blue pants
|
||||
|
@ -103,9 +106,12 @@ typedef enum EnDaikuKakarikoAnimation {
|
|||
} EnDaikuKakarikoAnimation;
|
||||
|
||||
static AnimationFrameCountInfo sAnimationInfo[] = {
|
||||
{ &object_daiku_Anim_001AB0, 1.0f, 2, -7.0f }, { &object_daiku_Anim_007DE0, 1.0f, 0, -7.0f },
|
||||
{ &object_daiku_Anim_00885C, 1.0f, 0, -7.0f }, { &object_daiku_Anim_000C44, 1.0f, 0, -7.0f },
|
||||
{ &object_daiku_Anim_000600, 1.0f, 0, -7.0f }, { &object_daiku_Anim_008164, 1.0f, 0, -7.0f },
|
||||
{ &object_daiku_Anim_001AB0, 1.0f, ANIMMODE_ONCE, -7.0f },
|
||||
{ &object_daiku_Anim_007DE0, 1.0f, ANIMMODE_LOOP, -7.0f },
|
||||
{ &object_daiku_Anim_00885C, 1.0f, ANIMMODE_LOOP, -7.0f },
|
||||
{ &object_daiku_Anim_000C44, 1.0f, ANIMMODE_LOOP, -7.0f },
|
||||
{ &object_daiku_Anim_000600, 1.0f, ANIMMODE_LOOP, -7.0f },
|
||||
{ &object_daiku_Anim_008164, 1.0f, ANIMMODE_LOOP, -7.0f },
|
||||
};
|
||||
|
||||
void EnDaikuKakariko_ChangeAnim(EnDaikuKakariko* this, s32 index, s32* currentIndex) {
|
||||
|
@ -133,7 +139,7 @@ void EnDaikuKakariko_Init(Actor* thisx, PlayState* play) {
|
|||
case SCENE_KAKARIKO_VILLAGE:
|
||||
if (IS_DAY) {
|
||||
this->flags |= 1;
|
||||
this->flags |= initFlags[PARAMS_GET_U(this->actor.params, 0, 2)];
|
||||
this->flags |= initFlags[ENDAIKUKAKARIKO_GET_TYPE(&this->actor)];
|
||||
}
|
||||
break;
|
||||
case SCENE_KAKARIKO_CENTER_GUEST_HOUSE:
|
||||
|
@ -184,8 +190,8 @@ void EnDaikuKakariko_Init(Actor* thisx, PlayState* play) {
|
|||
this->actionFunc = EnDaikuKakariko_Run;
|
||||
} else {
|
||||
if (this->flags & 8) {
|
||||
if ((PARAMS_GET_U(this->actor.params, 0, 2) == CARPENTER_SABOORO) ||
|
||||
(PARAMS_GET_U(this->actor.params, 0, 2) == CARPENTER_SHIRO)) {
|
||||
if ((ENDAIKUKAKARIKO_GET_TYPE(&this->actor) == CARPENTER_SABOORO) ||
|
||||
(ENDAIKUKAKARIKO_GET_TYPE(&this->actor) == CARPENTER_SHIRO)) {
|
||||
EnDaikuKakariko_ChangeAnim(this, ENDAIKUKAKARIKO_ANIM_5, &this->currentAnimIndex);
|
||||
this->flags |= 0x800;
|
||||
} else {
|
||||
|
@ -233,23 +239,23 @@ void EnDaikuKakariko_HandleTalking(EnDaikuKakariko* this, PlayState* play) {
|
|||
MASK_REACTION_SET_CARPENTER_3,
|
||||
MASK_REACTION_SET_CARPENTER_4,
|
||||
};
|
||||
s16 sp26;
|
||||
s16 sp24;
|
||||
s16 screenX;
|
||||
s16 screenY;
|
||||
|
||||
if (this->talkState == 2) {
|
||||
this->talkState = EnDaikuKakariko_GetTalkState(this, play);
|
||||
} else if (Actor_TalkOfferAccepted(&this->actor, play)) {
|
||||
this->talkState = 2;
|
||||
} else {
|
||||
Actor_GetScreenPos(play, &this->actor, &sp26, &sp24);
|
||||
Actor_GetScreenPos(play, &this->actor, &screenX, &screenY);
|
||||
|
||||
if ((sp26 >= 0) && (sp26 <= 320) && (sp24 >= 0) && (sp24 <= 240) && (this->talkState == 0) &&
|
||||
(Actor_OfferTalk(&this->actor, play, 100.0f) == 1)) {
|
||||
if ((screenX >= 0) && (screenX <= SCREEN_WIDTH) && (screenY >= 0) && (screenY <= SCREEN_HEIGHT) &&
|
||||
(this->talkState == 0) && (Actor_OfferTalk(&this->actor, play, 100.0f) == true)) {
|
||||
this->actor.textId =
|
||||
MaskReaction_GetTextId(play, sMaskReactionSets[PARAMS_GET_U(this->actor.params, 0, 2)]);
|
||||
MaskReaction_GetTextId(play, sMaskReactionSets[ENDAIKUKAKARIKO_GET_TYPE(&this->actor)]);
|
||||
|
||||
if (this->actor.textId == 0) {
|
||||
switch (PARAMS_GET_U(this->actor.params, 0, 2)) {
|
||||
switch (ENDAIKUKAKARIKO_GET_TYPE(&this->actor)) {
|
||||
case 0:
|
||||
if (this->flags & 8) {
|
||||
this->actor.textId = 0x5076;
|
||||
|
@ -366,7 +372,7 @@ void EnDaikuKakariko_Run(EnDaikuKakariko* this, PlayState* play) {
|
|||
s32 run;
|
||||
|
||||
do {
|
||||
path = &play->pathList[PARAMS_GET_U(this->actor.params, 8, 8)];
|
||||
path = &play->pathList[ENDAIKUKAKARIKO_GET_PATH_INDEX(&this->actor)];
|
||||
pathPos = &((Vec3s*)SEGMENTED_TO_VIRTUAL(path->points))[this->waypoint];
|
||||
xDist = pathPos->x - this->actor.world.pos.x;
|
||||
zDist = pathPos->z - this->actor.world.pos.z;
|
||||
|
@ -538,7 +544,7 @@ void EnDaikuKakariko_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, V
|
|||
|
||||
if (limbIndex == 15) {
|
||||
Matrix_MultVec3f(&unkVec, &this->actor.focus.pos);
|
||||
gSPDisplayList(POLY_OPA_DISP++, carpenterHeadDLists[PARAMS_GET_U(this->actor.params, 0, 2)]);
|
||||
gSPDisplayList(POLY_OPA_DISP++, carpenterHeadDLists[ENDAIKUKAKARIKO_GET_TYPE(&this->actor)]);
|
||||
}
|
||||
|
||||
CLOSE_DISPS(play->state.gfxCtx, "../z_en_daiku_kakariko.c", 1113);
|
||||
|
@ -551,13 +557,13 @@ void EnDaikuKakariko_Draw(Actor* thisx, PlayState* play) {
|
|||
|
||||
Gfx_SetupDL_25Opa(play->state.gfxCtx);
|
||||
|
||||
if (PARAMS_GET_U(thisx->params, 0, 2) == CARPENTER_ICHIRO) {
|
||||
if (ENDAIKUKAKARIKO_GET_TYPE(thisx) == CARPENTER_ICHIRO) {
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, 170, 10, 70, 255);
|
||||
} else if (PARAMS_GET_U(thisx->params, 0, 2) == CARPENTER_SABOORO) {
|
||||
} else if (ENDAIKUKAKARIKO_GET_TYPE(thisx) == CARPENTER_SABOORO) {
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, 170, 200, 255, 255);
|
||||
} else if (PARAMS_GET_U(thisx->params, 0, 2) == CARPENTER_JIRO) {
|
||||
} else if (ENDAIKUKAKARIKO_GET_TYPE(thisx) == CARPENTER_JIRO) {
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, 0, 230, 70, 255);
|
||||
} else if (PARAMS_GET_U(thisx->params, 0, 2) == CARPENTER_SHIRO) {
|
||||
} else if (ENDAIKUKAKARIKO_GET_TYPE(thisx) == CARPENTER_SHIRO) {
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, 200, 0, 150, 255);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue