EnBaba Documented (Bomb Shop Lady) (#825)

* Merge in sub_s_models

* Update subs DL names

* Unused Weight pathing

* Function headers for weightpathing

* TimePathing WIP

* Timepathing, still unsure about unk184

* Move subs functions from functions.h to z64subs.h

* Add fake comment

* Some cleanup and renames

* Renames/cleanup of actors that use timepath

* Cleanup

* More cleanup

* Rename unk stuff

* Merge in upstream/master

* TimeElapsed -> elapsedTime

* Fix

* Final cleanup

* SubS Time Paths

* Still needs dialog action functions

* Fix waypoint comments

* Review pt. 1

* Baba review

* ScheduleResult -> ScheduleOutput

* Forgot to update functions.txt oops

* Add clarifying comment to SubS_TimePathing_FillWeightArray

* format.sh

* Finish up docs

* Fix order comments

* Fix

* Change bombShopkeeper struct member to

* Fix a few merge mistakes

* Add ScheduleOutput to namefixer

* format

* Format and fix merge

* Review

* PR

* z64schedule.h

* text summary

Co-authored-by: Maide <34639600+Kelebek1@users.noreply.github.com>
Co-authored-by: Tom Overton <tom-overton@users.noreply.github.com>
This commit is contained in:
Derek Hensley 2022-07-21 21:05:28 -07:00 committed by GitHub
parent f0e4581e22
commit cbeeeb172a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 704 additions and 636 deletions

View File

@ -18,7 +18,7 @@
<DList Name="gBbaFeetDL" Offset="0x4180" /> <DList Name="gBbaFeetDL" Offset="0x4180" />
<!-- Animations --> <!-- Animations -->
<Animation Name="gBbaWalkingAnim" Offset="0x4910" /> <!-- Looks to be unused --> <Animation Name="gBbaSwayAnim" Offset="0x4910" />
<Animation Name="gBbaKnockedOverAnim" Offset="0x5154" /> <Animation Name="gBbaKnockedOverAnim" Offset="0x5154" />
<Animation Name="gBbaLyingDownAnim" Offset="0x58B8" /> <Animation Name="gBbaLyingDownAnim" Offset="0x58B8" />
<Animation Name="gBbaIdleHoldingBagAnim" Offset="0x5DC4" /> <Animation Name="gBbaIdleHoldingBagAnim" Offset="0x5DC4" />

View File

@ -2247,7 +2247,7 @@ s32 Entrance_GetSceneNum(u16 entranceIndex);
s32 Entrance_GetSceneNumAbsolute(u16 entranceIndex); s32 Entrance_GetSceneNumAbsolute(u16 entranceIndex);
s32 Entrance_GetSpawnNum(u16 entranceIndex); s32 Entrance_GetSpawnNum(u16 entranceIndex);
s32 Entrance_GetTransitionFlags(u16 entranceIndex); s32 Entrance_GetTransitionFlags(u16 entranceIndex);
s32 Schedule_RunScript(PlayState* play, u8* script, ScheduleResult* result); s32 Schedule_RunScript(PlayState* play, u8* script, ScheduleOutput* output);
void SkelAnime_DrawLimbLod(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, Actor* actor, s32 lod); void SkelAnime_DrawLimbLod(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, Actor* actor, s32 lod);
void SkelAnime_DrawLod(PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, Actor* actor, s32 lod); void SkelAnime_DrawLod(PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, Actor* actor, s32 lod);
void SkelAnime_DrawFlexLimbLod(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* jointTable, OverrideLimbDrawFlex overrideLimbDraw, PostLimbDrawFlex postLimbDraw, Actor* actor, s32 lod, Mtx** mtx); void SkelAnime_DrawFlexLimbLod(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* jointTable, OverrideLimbDrawFlex overrideLimbDraw, PostLimbDrawFlex postLimbDraw, Actor* actor, s32 lod, Mtx** mtx);

View File

@ -3,20 +3,28 @@
#include "ultra64.h" #include "ultra64.h"
/* /**
Schedule is a subsystem that acts as a way to make decisions based on the * Schedule is a subsystem that acts as a way to make decisions based on the
time and scene (and a limited selection of items). It is utilized by writing * time and scene (and a limited selection of items). It is utilized by writing
a script that is encoded into bytecode and ran, returning the result in a * a script that is encoded into bytecode and ran, returning the result in a
struct. The returned result can be a value or a encoded time value. * struct. The returned result can be a value or a encoded time value.
*
* The scripts contain 2 kinds of instructions:
* - Checks with branches (relative offsets, either 1-byte offsets (short, *_S),
* or 2-byte offsets (long, *_L))
* - Returns
*
* Scripts are stored as u8[]. They are built using the macros are the bottom of
* this file. The scheduledis.py script can be used to convert any scripts in
* actor data into the macros.
*/
The scripts contain 2 kinds of instructions: /**
- Checks with branches (relative offsets, either 1-byte offsets (short, *_S), * Actors that use this system generally create 3 functions to interact with it.
or 2-byte offsets (long, *_L)) *
- Returns * - FollowSchedule: The action function an actor sets to follow the schedule.
* - ProcessScheduleOutput: Holds the logic of processing the output received by running the schedule script, called by FollowSchedule
Scripts are stored as u8[]. They are built using the macros are the bottom of * - HandleSchedule: Holds the actual logic of how to actually follow the schedule based on the processed output, called by FollowSchedule
this file. The scheduledis.py script can be used to convert any scripts in
actor data into the macros.
*/ */
// Macro to convert the time format used in the save struct into the format used in Schedule // Macro to convert the time format used in the save struct into the format used in Schedule
@ -24,16 +32,16 @@
#define SCHEDULE_TIME_NOW SCHEDULE_CONVERT_TIME(gSaveContext.save.time) #define SCHEDULE_TIME_NOW SCHEDULE_CONVERT_TIME(gSaveContext.save.time)
typedef enum { typedef enum {
/* 00 */ SCHEDULE_CMD_ID_CHECK_FLAG_S, // Checks if a weekEventReg flag is set and branches if so, short range branch /* 0 */ SCHEDULE_CMD_ID_CHECK_FLAG_S, // Checks if a weekEventReg flag is set and branches if so, short range branch
/* 01 */ SCHEDULE_CMD_ID_CHECK_FLAG_L, // Checks if a weekEventReg flag is set and branches if so, long range branch /* 1 */ SCHEDULE_CMD_ID_CHECK_FLAG_L, // Checks if a weekEventReg flag is set and branches if so, long range branch
/* 02 */ SCHEDULE_CMD_ID_CHECK_TIME_RANGE_S, // Checks if the current time is within the range of the two provided times and branches if so, short range branch /* 2 */ SCHEDULE_CMD_ID_CHECK_TIME_RANGE_S, // Checks if the current time is within the range of the two provided times and branches if so, short range branch
/* 03 */ SCHEDULE_CMD_ID_CHECK_TIME_RANGE_L, // Checks if the current time is within the range of the two provided times and branches if so, long range branch /* 3 */ SCHEDULE_CMD_ID_CHECK_TIME_RANGE_L, // Checks if the current time is within the range of the two provided times and branches if so, long range branch
/* 04 */ SCHEDULE_CMD_ID_RET_VAL_L, // Ends script and returns 2-byte value (Note: bugged as the return value size is only 1 byte in the struct) /* 4 */ SCHEDULE_CMD_ID_RET_VAL_L, // Ends script and returns 2-byte value (Note: bugged as the return value size is only 1 byte in the struct)
/* 05 */ SCHEDULE_CMD_ID_RET_NONE, // Ends script without returning anything /* 5 */ SCHEDULE_CMD_ID_RET_NONE, // Ends script without returning anything
/* 06 */ SCHEDULE_CMD_ID_RET_EMPTY, // Ends script and indicates return without changing existing value /* 6 */ SCHEDULE_CMD_ID_RET_EMPTY, // Ends script and indicates return without changing existing value
/* 07 */ SCHEDULE_CMD_ID_NOP, // No-Op /* 7 */ SCHEDULE_CMD_ID_NOP, // No-Op
/* 08 */ SCHEDULE_CMD_ID_CHECK_MISC_S, // Special check based on items or masks and branches if check passes, short range branch /* 8 */ SCHEDULE_CMD_ID_CHECK_MISC_S, // Special check based on items or masks and branches if check passes, short range branch
/* 09 */ SCHEDULE_CMD_ID_RET_VAL_S, // Ends script and returns byte value /* 9 */ SCHEDULE_CMD_ID_RET_VAL_S, // Ends script and returns byte value
/* 10 */ SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_S, // Checks if the current scene is not SceneNum and branches if so, short range branch /* 10 */ SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_S, // Checks if the current scene is not SceneNum and branches if so, short range branch
/* 11 */ SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_L, // Checks if the current scene is not SceneNum and branches if so, long range branch /* 11 */ SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_L, // Checks if the current scene is not SceneNum and branches if so, long range branch
/* 12 */ SCHEDULE_CMD_ID_CHECK_NOT_IN_DAY_S, // Checks if the current day is not Day and branches if so, short range branch /* 12 */ SCHEDULE_CMD_ID_CHECK_NOT_IN_DAY_S, // Checks if the current day is not Day and branches if so, short range branch
@ -56,7 +64,7 @@ typedef struct {
/* 0x4 */ s32 time0; /* 0x4 */ s32 time0;
/* 0x8 */ s32 time1; /* 0x8 */ s32 time1;
/* 0xC */ s32 hasResult; /* 0xC */ s32 hasResult;
} ScheduleResult; // size = 0x10 } ScheduleOutput; // size = 0x10
typedef struct { typedef struct {
/* 0x0 */ u8 cmd; /* 0x0 */ u8 cmd;

View File

@ -122,7 +122,7 @@ void SubS_GenShadowTex(Vec3f bodyPartsPos[], Vec3f* worldPos, u8* tex, f32 tween
void SubS_DrawShadowTex(Actor* actor, struct GameState* gameState, u8* tex); void SubS_DrawShadowTex(Actor* actor, struct GameState* gameState, u8* tex);
s16 SubS_ComputeTrackPointRot(s16* rot, s16 rotMax, s16 target, f32 slowness, f32 stepMin, f32 stepMax); s16 SubS_ComputeTrackPointRot(s16* rot, s16 rotMax, s16 target, f32 slowness, f32 stepMin, f32 stepMax);
s32 SubS_TrackPoint(Vec3f* point, Vec3f* focusPos, Vec3s* shapeRot, Vec3s* turnTarget, Vec3s* headRot, Vec3s* torsoRot, TrackOptionsSet* options); s32 SubS_TrackPoint(Vec3f* point, Vec3f* focusPos, Vec3s* shapeRot, Vec3s* trackTarget, Vec3s* headRot, Vec3s* torsoRot, TrackOptionsSet* options);
s32 SubS_AngleDiffLessEqual(s16 angleA, s16 threshold, s16 angleB); s32 SubS_AngleDiffLessEqual(s16 angleA, s16 threshold, s16 angleB);

View File

@ -6,7 +6,7 @@
(dest) = (temp) * (0x10000 / 60 / 24.0f); \ (dest) = (temp) * (0x10000 / 60 / 24.0f); \
(dest) = SCHEDULE_CONVERT_TIME(dest); (dest) = SCHEDULE_CONVERT_TIME(dest);
s32 Schedule_CheckFlagS(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_CheckFlagS(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdCheckFlagS* cmd = (ScheduleCmdCheckFlagS*)*script; ScheduleCmdCheckFlagS* cmd = (ScheduleCmdCheckFlagS*)*script;
u16 flag = (cmd->flagByte << 8) | cmd->flagMask; u16 flag = (cmd->flagByte << 8) | cmd->flagMask;
@ -17,7 +17,7 @@ s32 Schedule_CheckFlagS(PlayState* play, u8** script, ScheduleResult* result) {
return false; return false;
} }
s32 Schedule_CheckFlagL(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_CheckFlagL(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdCheckFlagL* cmd = (ScheduleCmdCheckFlagL*)*script; ScheduleCmdCheckFlagL* cmd = (ScheduleCmdCheckFlagL*)*script;
u16 flag = (cmd->flagByte << 8) | cmd->flagMask; u16 flag = (cmd->flagByte << 8) | cmd->flagMask;
@ -28,7 +28,7 @@ s32 Schedule_CheckFlagL(PlayState* play, u8** script, ScheduleResult* result) {
return false; return false;
} }
s32 Schedule_CheckTimeRangeS(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_CheckTimeRangeS(PlayState* play, u8** script, ScheduleOutput* output) {
s32 inRange = false; s32 inRange = false;
ScheduleCmdCheckTimeRangeS* cmd = (ScheduleCmdCheckTimeRangeS*)*script; ScheduleCmdCheckTimeRangeS* cmd = (ScheduleCmdCheckTimeRangeS*)*script;
f32 f; f32 f;
@ -54,7 +54,7 @@ s32 Schedule_CheckTimeRangeS(PlayState* play, u8** script, ScheduleResult* resul
return false; return false;
} }
s32 Schedule_CheckTimeRangeL(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_CheckTimeRangeL(PlayState* play, u8** script, ScheduleOutput* output) {
s32 inRange = false; s32 inRange = false;
ScheduleCmdCheckTimeRangeL* cmd = (ScheduleCmdCheckTimeRangeL*)*script; ScheduleCmdCheckTimeRangeL* cmd = (ScheduleCmdCheckTimeRangeL*)*script;
f32 f; f32 f;
@ -80,33 +80,33 @@ s32 Schedule_CheckTimeRangeL(PlayState* play, u8** script, ScheduleResult* resul
return false; return false;
} }
s32 Schedule_ReturnValueL(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_ReturnValueL(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdReturnValueL* cmd = (ScheduleCmdReturnValueL*)*script; ScheduleCmdReturnValueL* cmd = (ScheduleCmdReturnValueL*)*script;
//! @bug result is a u8, value is truncated //! @bug result is a u8, value is truncated
result->result = (cmd->retH << 8) | cmd->retL; output->result = (cmd->retH << 8) | cmd->retL;
result->hasResult = true; output->hasResult = true;
return true; return true;
} }
s32 Schedule_ReturnNone(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_ReturnNone(PlayState* play, u8** script, ScheduleOutput* output) {
result->hasResult = false; output->hasResult = false;
return true; return true;
} }
s32 Schedule_ReturnEmpty(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_ReturnEmpty(PlayState* play, u8** script, ScheduleOutput* output) {
result->hasResult = true; output->hasResult = true;
return true; return true;
} }
s32 Schedule_Nop(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_Nop(PlayState* play, u8** script, ScheduleOutput* output) {
return false; return false;
} }
s32 Schedule_CheckMiscS(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_CheckMiscS(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdCheckMiscS* cmd = (ScheduleCmdCheckMiscS*)*script; ScheduleCmdCheckMiscS* cmd = (ScheduleCmdCheckMiscS*)*script;
if (((cmd->which == SCHEDULE_CHECK_MISC_ROOM_KEY) && (INV_CONTENT(ITEM_ROOM_KEY) == ITEM_ROOM_KEY)) || if (((cmd->which == SCHEDULE_CHECK_MISC_ROOM_KEY) && (INV_CONTENT(ITEM_ROOM_KEY) == ITEM_ROOM_KEY)) ||
@ -119,16 +119,16 @@ s32 Schedule_CheckMiscS(PlayState* play, u8** script, ScheduleResult* result) {
return false; return false;
} }
s32 Schedule_ReturnValueS(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_ReturnValueS(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdReturnValueS* cmd = (ScheduleCmdReturnValueS*)*script; ScheduleCmdReturnValueS* cmd = (ScheduleCmdReturnValueS*)*script;
result->result = cmd->result; output->result = cmd->result;
result->hasResult = true; output->hasResult = true;
return true; return true;
} }
s32 Schedule_CheckNotInSceneS(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_CheckNotInSceneS(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdCheckNotInSceneS* cmd = (ScheduleCmdCheckNotInSceneS*)*script; ScheduleCmdCheckNotInSceneS* cmd = (ScheduleCmdCheckNotInSceneS*)*script;
s16 scene = (cmd->sceneH << 8) | cmd->sceneL; s16 scene = (cmd->sceneH << 8) | cmd->sceneL;
@ -139,7 +139,7 @@ s32 Schedule_CheckNotInSceneS(PlayState* play, u8** script, ScheduleResult* resu
return false; return false;
} }
s32 Schedule_CheckNotInSceneL(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_CheckNotInSceneL(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdCheckNotInSceneL* cmd = (ScheduleCmdCheckNotInSceneL*)*script; ScheduleCmdCheckNotInSceneL* cmd = (ScheduleCmdCheckNotInSceneL*)*script;
s16 scene = (cmd->sceneH << 8) | cmd->sceneL; s16 scene = (cmd->sceneH << 8) | cmd->sceneL;
@ -150,7 +150,7 @@ s32 Schedule_CheckNotInSceneL(PlayState* play, u8** script, ScheduleResult* resu
return false; return false;
} }
s32 Schedule_CheckNotInDayS(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_CheckNotInDayS(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdCheckNotInDayS* cmd = (ScheduleCmdCheckNotInDayS*)*script; ScheduleCmdCheckNotInDayS* cmd = (ScheduleCmdCheckNotInDayS*)*script;
s16 day = (cmd->dayH << 8) | cmd->dayL; s16 day = (cmd->dayH << 8) | cmd->dayL;
@ -161,7 +161,7 @@ s32 Schedule_CheckNotInDayS(PlayState* play, u8** script, ScheduleResult* result
return false; return false;
} }
s32 Schedule_CheckNotInDayL(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_CheckNotInDayL(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdCheckNotInDayL* cmd = (ScheduleCmdCheckNotInDayL*)*script; ScheduleCmdCheckNotInDayL* cmd = (ScheduleCmdCheckNotInDayL*)*script;
s16 day = (cmd->dayH << 8) | cmd->dayL; s16 day = (cmd->dayH << 8) | cmd->dayL;
@ -172,7 +172,7 @@ s32 Schedule_CheckNotInDayL(PlayState* play, u8** script, ScheduleResult* result
return false; return false;
} }
s32 Schedule_ReturnTime(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_ReturnTime(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdReturnTime* cmd = (ScheduleCmdReturnTime*)*script; ScheduleCmdReturnTime* cmd = (ScheduleCmdReturnTime*)*script;
f32 f; f32 f;
u16 time0; u16 time0;
@ -183,15 +183,15 @@ s32 Schedule_ReturnTime(PlayState* play, u8** script, ScheduleResult* result) {
SCHEDULE_CALC_TIME(cmd->time1Hr, cmd->time1Min, time1, f); SCHEDULE_CALC_TIME(cmd->time1Hr, cmd->time1Min, time1, f);
time1--; time1--;
result->result = cmd->result; output->result = cmd->result;
result->time0 = time0; output->time0 = time0;
result->time1 = time1; output->time1 = time1;
result->hasResult = true; output->hasResult = true;
return true; return true;
} }
s32 Schedule_CheckBeforeTimeS(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_CheckBeforeTimeS(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdCheckBeforeTimeS* cmd = (ScheduleCmdCheckBeforeTimeS*)*script; ScheduleCmdCheckBeforeTimeS* cmd = (ScheduleCmdCheckBeforeTimeS*)*script;
f32 f; f32 f;
u16 testTime; u16 testTime;
@ -208,7 +208,7 @@ s32 Schedule_CheckBeforeTimeS(PlayState* play, u8** script, ScheduleResult* resu
return false; return false;
} }
s32 Schedule_CheckBeforeTimeL(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_CheckBeforeTimeL(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdCheckBeforeTimeL* cmd = (ScheduleCmdCheckBeforeTimeL*)*script; ScheduleCmdCheckBeforeTimeL* cmd = (ScheduleCmdCheckBeforeTimeL*)*script;
f32 f; f32 f;
u16 testTime; u16 testTime;
@ -225,21 +225,21 @@ s32 Schedule_CheckBeforeTimeL(PlayState* play, u8** script, ScheduleResult* resu
return false; return false;
} }
s32 Schedule_BranchS(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_BranchS(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdBranchS* cmd = (ScheduleCmdBranchS*)*script; ScheduleCmdBranchS* cmd = (ScheduleCmdBranchS*)*script;
*script += cmd->offset; *script += cmd->offset;
return false; return false;
} }
s32 Schedule_BranchL(PlayState* play, u8** script, ScheduleResult* result) { s32 Schedule_BranchL(PlayState* play, u8** script, ScheduleOutput* output) {
ScheduleCmdBranchL* cmd = (ScheduleCmdBranchL*)*script; ScheduleCmdBranchL* cmd = (ScheduleCmdBranchL*)*script;
*script += (s16)((cmd->offsetH << 8) | cmd->offsetL); *script += (s16)((cmd->offsetH << 8) | cmd->offsetL);
return false; return false;
} }
static s32 (*sScheduleCmdFuncs[])(PlayState*, u8**, ScheduleResult*) = { static s32 (*sScheduleCmdFuncs[])(PlayState*, u8**, ScheduleOutput*) = {
Schedule_CheckFlagS, Schedule_CheckFlagL, Schedule_CheckTimeRangeS, Schedule_CheckTimeRangeL, Schedule_CheckFlagS, Schedule_CheckFlagL, Schedule_CheckTimeRangeS, Schedule_CheckTimeRangeL,
Schedule_ReturnValueL, Schedule_ReturnNone, Schedule_ReturnEmpty, Schedule_Nop, Schedule_ReturnValueL, Schedule_ReturnNone, Schedule_ReturnEmpty, Schedule_Nop,
Schedule_CheckMiscS, Schedule_ReturnValueS, Schedule_CheckNotInSceneS, Schedule_CheckNotInSceneL, Schedule_CheckMiscS, Schedule_ReturnValueS, Schedule_CheckNotInSceneS, Schedule_CheckNotInSceneL,
@ -269,15 +269,15 @@ static u8 sScheduleCmdSizes[] = {
sizeof(ScheduleCmdBranchL), sizeof(ScheduleCmdBranchL),
}; };
s32 Schedule_RunScript(PlayState* play, u8* script, ScheduleResult* result) { s32 Schedule_RunScript(PlayState* play, u8* script, ScheduleOutput* output) {
u8 size; u8 size;
s32 stop; s32 stop;
do { do {
size = sScheduleCmdSizes[*script]; size = sScheduleCmdSizes[*script];
stop = (*sScheduleCmdFuncs[*script])(play, &script, result); stop = (*sScheduleCmdFuncs[*script])(play, &script, output);
script += size; script += size;
} while (!stop); } while (!stop);
return result->hasResult; return output->hasResult;
} }

View File

@ -480,13 +480,13 @@ void SubS_TimePathing_ComputeInitialY(PlayState* play, Path* path, s32 waypoint,
} }
} }
Path* SubS_GetAdditionalPath(PlayState* play, u8 pathIndex, s32 max) { Path* SubS_GetAdditionalPath(PlayState* play, u8 pathIndex, s32 limit) {
Path* path; Path* path;
s32 i = 0; s32 i = 0;
do { do {
path = &play->setupPathList[pathIndex]; path = &play->setupPathList[pathIndex];
if (i >= max) { if (i >= limit) {
break; break;
} }
pathIndex = path->unk1; pathIndex = path->unk1;

View File

@ -376,7 +376,7 @@ s32 func_80BD3320(EnAh* this, PlayState* play, u8 actorCat, s16 actorId) {
return ret; return ret;
} }
s32 func_80BD3374(EnAh* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BD3374(EnAh* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 pad; s32 pad;
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BD3EC4.pos); Math_Vec3f_Copy(&this->actor.world.pos, &D_80BD3EC4.pos);
@ -388,7 +388,7 @@ s32 func_80BD3374(EnAh* this, PlayState* play, ScheduleResult* arg2) {
return true; return true;
} }
s32 func_80BD33FC(EnAh* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BD33FC(EnAh* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 pad; s32 pad;
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BD3ED8.pos); Math_Vec3f_Copy(&this->actor.world.pos, &D_80BD3ED8.pos);
@ -400,7 +400,7 @@ s32 func_80BD33FC(EnAh* this, PlayState* play, ScheduleResult* arg2) {
return true; return true;
} }
s32 func_80BD3484(EnAh* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BD3484(EnAh* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
if (func_80BD3320(this, play, ACTORCAT_NPC, ACTOR_EN_AN)) { if (func_80BD3320(this, play, ACTORCAT_NPC, ACTOR_EN_AN)) {
@ -419,26 +419,26 @@ s32 func_80BD3484(EnAh* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80BD3548(EnAh* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BD3548(EnAh* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret; s32 ret;
this->unk_2D8 = 0; this->unk_2D8 = 0;
switch (arg2->result) { switch (scheduleOutput->result) {
default: default:
ret = false; ret = false;
break; break;
case 1: case 1:
ret = func_80BD3374(this, play, arg2); ret = func_80BD3374(this, play, scheduleOutput);
break; break;
case 2: case 2:
ret = func_80BD33FC(this, play, arg2); ret = func_80BD33FC(this, play, scheduleOutput);
break; break;
case 3: case 3:
ret = func_80BD3484(this, play, arg2); ret = func_80BD3484(this, play, scheduleOutput);
break; break;
} }
return ret; return ret;
@ -472,7 +472,7 @@ void func_80BD3658(EnAh* this, PlayState* play) {
} }
void func_80BD36B8(EnAh* this, PlayState* play) { void func_80BD36B8(EnAh* this, PlayState* play) {
ScheduleResult sp18; ScheduleOutput sp18;
if (!Schedule_RunScript(play, D_80BD3DB0, &sp18) || if (!Schedule_RunScript(play, D_80BD3DB0, &sp18) ||
((this->unk_1DC != sp18.result) && !func_80BD3548(this, play, &sp18))) { ((this->unk_1DC != sp18.result) && !func_80BD3548(this, play, &sp18))) {

View File

@ -635,7 +635,7 @@ s32 func_80BDF064(EnAl* this, PlayState* play) {
return false; return false;
} }
s32 func_80BDF244(EnAl* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BDF244(EnAl* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
Actor* sp20 = func_80BDE1A0(this, play, ACTORCAT_NPC, ACTOR_EN_GM); Actor* sp20 = func_80BDE1A0(this, play, ACTORCAT_NPC, ACTOR_EN_GM);
Actor* temp_v0 = func_80BDE1A0(this, play, ACTORCAT_NPC, ACTOR_EN_TOTO); Actor* temp_v0 = func_80BDE1A0(this, play, ACTORCAT_NPC, ACTOR_EN_TOTO);
@ -650,10 +650,10 @@ s32 func_80BDF244(EnAl* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80BDF308(EnAl* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BDF308(EnAl* this, PlayState* play, ScheduleOutput* scheduleOutput) {
SubS_UpdateFlags(&this->unk_4C2, 3, 7); SubS_UpdateFlags(&this->unk_4C2, 3, 7);
switch (arg2->result) { switch (scheduleOutput->result) {
case 1: case 1:
func_80BDE27C(this, 0); func_80BDE27C(this, 0);
break; break;
@ -667,7 +667,7 @@ s32 func_80BDF308(EnAl* this, PlayState* play, ScheduleResult* arg2) {
return true; return true;
} }
s32 func_80BDF390(EnAl* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BDF390(EnAl* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret; s32 ret;
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
@ -676,14 +676,14 @@ s32 func_80BDF390(EnAl* this, PlayState* play, ScheduleResult* arg2) {
this->unk_4C2 = 0; this->unk_4C2 = 0;
this->unk_4D4 = 40.0f; this->unk_4D4 = 40.0f;
switch (arg2->result) { switch (scheduleOutput->result) {
case 3: case 3:
ret = func_80BDF244(this, play, arg2); ret = func_80BDF244(this, play, scheduleOutput);
break; break;
case 1: case 1:
case 2: case 2:
ret = func_80BDF308(this, play, arg2); ret = func_80BDF308(this, play, scheduleOutput);
break; break;
default: default:
@ -746,7 +746,7 @@ void func_80BDF578(EnAl* this, PlayState* play) {
} }
void func_80BDF5E8(EnAl* this, PlayState* play) { void func_80BDF5E8(EnAl* this, PlayState* play) {
ScheduleResult sp20; ScheduleOutput sp20;
this->unk_4E0 = REG(15) + ((void)0, gSaveContext.save.daySpeed); this->unk_4E0 = REG(15) + ((void)0, gSaveContext.save.daySpeed);
if (!Schedule_RunScript(play, D_80BDFC70, &sp20) || if (!Schedule_RunScript(play, D_80BDFC70, &sp20) ||

View File

@ -5,29 +5,50 @@
*/ */
#include "z_en_baba.h" #include "z_en_baba.h"
#include "overlays/actors/ovl_En_Ossan/z_en_ossan.h"
#include "objects/object_bba/object_bba.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10) #define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
#define THIS ((EnBaba*)thisx) #define THIS ((EnBaba*)thisx)
#define BOMB_SHOP_LADY_STATE_END_CONVERSATION (1 << 0)
#define BOMB_SHOP_LADY_STATE_VISIBLE (1 << 1)
#define BOMB_SHOP_LADY_STATE_KNOCKED_OVER (1 << 2) // Don't track player
#define BOMB_SHOP_LADY_STATE_AUTOTALK (1 << 3)
#define BOMB_SHOP_LADY_STATE_GIVE_BLAST_MASK (1 << 5)
#define BOMB_SHOP_LADY_STATE_GAVE_BLAST_MASK (1 << 6)
#define BOMB_SHOP_LADY_STATE_DRAW_SHADOW (1 << 7)
void EnBaba_Init(Actor* thisx, PlayState* play); void EnBaba_Init(Actor* thisx, PlayState* play);
void EnBaba_Destroy(Actor* thisx, PlayState* play); void EnBaba_Destroy(Actor* thisx, PlayState* play);
void EnBaba_Update(Actor* thisx, PlayState* play); void EnBaba_Update(Actor* thisx, PlayState* play);
void EnBaba_Draw(Actor* thisx, PlayState* play); void EnBaba_Draw(Actor* thisx, PlayState* play);
void func_80BA9480(EnBaba* this, PlayState* play); void EnBaba_FinishInit(EnBaba* this, PlayState* play);
void func_80BA9758(EnBaba* this, PlayState* play); void EnBaba_Idle(EnBaba* this, PlayState* play);
void func_80BA9848(EnBaba* this, PlayState* play); void EnBaba_FollowSchedule_Talk(EnBaba* this, PlayState* play);
void func_80BA98EC(EnBaba* this, PlayState* play); void EnBaba_Talk(EnBaba* this, PlayState* play);
void func_80BA9AB8(EnBaba* this, PlayState* play); void EnBaba_GiveBlastMask(EnBaba* this, PlayState* play);
void func_80BA9B24(EnBaba* this, PlayState* play); void EnBaba_GaveBlastMask(EnBaba* this, PlayState* play);
void func_80BA9B80(EnBaba* this, PlayState* play); void EnBaba_FollowSchedule(EnBaba* this, PlayState* play);
void func_80BA9CD4(EnBaba* this, PlayState* play); void EnBaba_KnockedOver(EnBaba* this, PlayState* play);
void func_80BA9E00(EnBaba* this, PlayState* play); void EnBaba_DoNothing(EnBaba* this, PlayState* play);
void func_80BA9E10(EnBaba* this, PlayState* play); void EnBaba_Walk(EnBaba* this, PlayState* play);
void func_80BA9E48(EnBaba* this, PlayState* play); void EnBaba_FaceForward(EnBaba* this, PlayState* play);
typedef enum {
/* 0 */ BOMB_SHOP_LADY_ANIM_IDLE_HOLDING_BAG,
/* 1 */ BOMB_SHOP_LADY_ANIM_IDLE,
/* 2 */ BOMB_SHOP_LADY_ANIM_WALKING_HOLDING_BAG,
/* 3 */ BOMB_SHOP_LADY_ANIM_KNOCKED_OVER,
/* 4 */ BOMB_SHOP_LADY_ANIM_LYING_DOWN,
/* 5 */ BOMB_SHOP_LADY_ANIM_SWAY
} BombShopLadyAnimation;
typedef enum {
/* 0 */ BOMB_SHOP_LADY_SCH_NONE,
/* 1 */ BOMB_SHOP_LADY_SCH_KNOCKED_OVER,
/* 2 */ BOMB_SHOP_LADY_SCH_FOLLOW_TIME_PATH
} BombShopLadyScheduleResult;
const ActorInit En_Baba_InitVars = { const ActorInit En_Baba_InitVars = {
ACTOR_EN_BABA, ACTOR_EN_BABA,
@ -47,7 +68,7 @@ static AnimationInfo sAnimations[] = {
{ &gBbaWalkingHoldingBagAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, { &gBbaWalkingHoldingBagAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
{ &gBbaKnockedOverAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, { &gBbaKnockedOverAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
{ &gBbaLyingDownAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, { &gBbaLyingDownAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
{ &gBbaWalkingAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, { &gBbaSwayAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
}; };
static ColliderCylinderInit sCylinderInit = { static ColliderCylinderInit sCylinderInit = {
@ -107,19 +128,19 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(1, 0x0), /* Powder Keg */ DMG_ENTRY(1, 0x0),
}; };
static u8 D_80BAA488[] = { static u8 sSchedule[] = {
/* 0x00 */ SCHEDULE_CMD_CHECK_NOT_IN_DAY_S(1, 0x1D - 0x04), /* 0x00 */ SCHEDULE_CMD_CHECK_NOT_IN_DAY_S(1, 0x1D - 0x04),
/* 0x04 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_BACKTOWN, 0x1C - 0x08), /* 0x04 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_BACKTOWN, 0x1C - 0x08),
/* 0x08 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(0, 0, 0, 30, 0x16 - 0x0E), /* 0x08 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(0, 0, 0, 30, 0x16 - 0x0E),
/* 0x0E */ SCHEDULE_CMD_CHECK_BEFORE_TIME_S(0, 30, 0x15 - 0x12), /* 0x0E */ SCHEDULE_CMD_CHECK_BEFORE_TIME_S(0, 30, 0x15 - 0x12),
/* 0x12 */ SCHEDULE_CMD_RET_VAL_L(1), /* 0x12 */ SCHEDULE_CMD_RET_VAL_L(BOMB_SHOP_LADY_SCH_KNOCKED_OVER),
/* 0x15 */ SCHEDULE_CMD_RET_NONE(), /* 0x15 */ SCHEDULE_CMD_RET_NONE(),
/* 0x16 */ SCHEDULE_CMD_RET_TIME(0, 0, 0, 30, 2), /* 0x16 */ SCHEDULE_CMD_RET_TIME(0, 0, 0, 30, BOMB_SHOP_LADY_SCH_FOLLOW_TIME_PATH),
/* 0x1C */ SCHEDULE_CMD_RET_NONE(), /* 0x1C */ SCHEDULE_CMD_RET_NONE(),
/* 0x1D */ SCHEDULE_CMD_RET_NONE(), /* 0x1D */ SCHEDULE_CMD_RET_NONE(),
}; };
s32 D_80BAA4A8[] = { -1, -1, 0 }; static s32 sSearchTimePathLimit[] = { -1, -1, 0 };
static TrackOptionsSet sTrackOptions = { static TrackOptionsSet sTrackOptions = {
{ 0xFA0, 4, 1, 3 }, { 0xFA0, 4, 1, 3 },
@ -128,142 +149,164 @@ static TrackOptionsSet sTrackOptions = {
{ 0x1770, 4, 1, 6 }, { 0x1770, 4, 1, 6 },
}; };
s32 func_80BA8820(EnBaba* this, PlayState* play) { s32 EnBaba_FindBombShopkeeper(EnBaba* this, PlayState* play) {
this->unk_144 = (EnOssan*)SubS_FindActor(play, &this->unk_144->actor, ACTORCAT_NPC, ACTOR_EN_OSSAN); //! The bomb shopkeeper is an EnSob1, but initalizes itself with id `ACTOR_EN_OSSAN`
//! Note if there are other `EnOssan` actors, it may find that instance instead
//! in which case `EnSob1` struct acceses would be incorrect
this->bombShopkeeper = (EnSob1*)SubS_FindActor(play, &this->bombShopkeeper->actor, ACTORCAT_NPC, ACTOR_EN_OSSAN);
if (this->unk_144 != NULL) { if (this->bombShopkeeper != NULL) {
return true; return true;
} }
return false; return false;
} }
void func_80BA886C(EnBaba* this, PlayState* play) { void EnBaba_HandleConversation(EnBaba* this, PlayState* play) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
switch (this->unk_1E0) { switch (this->textId) {
case 0: case 0:
if (this->unk_40A & 8) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_AUTOTALK) {
if (gSaveContext.save.weekEventReg[33] & 8) { if (gSaveContext.save.weekEventReg[33] & 8) {
this->unk_1E0 = 0x2A34; // Thanks. Can stock Bomb Bags tomorrow
this->textId = 0x2A34;
break; break;
} }
if (gSaveContext.save.weekEventReg[79] & 0x40) { if (gSaveContext.save.weekEventReg[79] & 0x40) {
this->unk_40A |= 1; this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
this->unk_1E0 = 0x2A33; // Oh my, learned my lesson. Can't stock Bomb Bags tomorrow
this->textId = 0x2A33;
break; break;
} }
this->unk_40A |= 1; this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
this->unk_1E0 = 0x2A32; // Can't stock Bomb Bags tomorrow
this->textId = 0x2A32;
break; break;
} else if (player->transformation == PLAYER_FORM_DEKU) { } else if (player->transformation == PLAYER_FORM_DEKU) {
if (!(gSaveContext.save.weekEventReg[79] & 0x20)) { if (!(gSaveContext.save.weekEventReg[79] & 0x20)) {
gSaveContext.save.weekEventReg[79] |= 0x20; gSaveContext.save.weekEventReg[79] |= 0x20;
this->unk_40A |= 1; this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
this->unk_1E0 = 0x2A37; // Small customer, use bombs as adult
this->textId = 0x2A37;
break; break;
} else { } else {
this->unk_40A |= 1; this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
this->unk_1E0 = 0x2A38; // use bombs as adult
this->textId = 0x2A38;
} }
break; break;
} else if (!(gSaveContext.save.weekEventReg[33] & 8)) { } else if (!(gSaveContext.save.weekEventReg[33] & 8)) {
if (!(gSaveContext.save.weekEventReg[73] & 1)) { if (!(gSaveContext.save.weekEventReg[73] & 1)) {
this->unk_1E0 = 0x660; // Thought could sell Big Bomb Bags
this->textId = 0x660;
break; break;
} }
this->unk_1E0 = 0x662; // Can't judge people
this->textId = 0x662;
break; break;
} else { } else {
if (!(gSaveContext.save.weekEventReg[73] & 2)) { if (!(gSaveContext.save.weekEventReg[73] & 2)) {
this->unk_1E0 = 0x65A; // Someone helped me out
this->textId = 0x65A;
break; break;
} }
this->unk_1E0 = 0x65E; // Buy Big Bomb Bag
this->textId = 0x65E;
break; break;
} }
break; break;
case 0x660: case 0x660:
Actor_ChangeFocus(&this->actor, play, &this->unk_144->actor); Actor_ChangeFocus(&this->actor, play, &this->bombShopkeeper->actor);
this->unk_1E0 = 0x661; // Don't go by yourself
this->textId = 0x661;
break; break;
case 0x661: case 0x661:
Actor_ChangeFocus(&this->unk_144->actor, play, &this->actor); Actor_ChangeFocus(&this->bombShopkeeper->actor, play, &this->actor);
this->unk_1E0 = 0x662; // Can't judge people
this->textId = 0x662;
break; break;
case 0x662: case 0x662:
Actor_ChangeFocus(&this->actor, play, &this->unk_144->actor); Actor_ChangeFocus(&this->actor, play, &this->bombShopkeeper->actor);
this->unk_1E0 = 0x663; // I'll go next time
this->textId = 0x663;
gSaveContext.save.weekEventReg[73] |= 1; gSaveContext.save.weekEventReg[73] |= 1;
this->unk_40A |= 1; this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
break; break;
case 0x65A: case 0x65A:
Actor_ChangeFocus(&this->actor, play, &this->unk_144->actor); Actor_ChangeFocus(&this->actor, play, &this->bombShopkeeper->actor);
this->unk_1E0 = 0x65B; // Don't pick up Bomb bags at night
this->textId = 0x65B;
break; break;
case 0x65B: case 0x65B:
Actor_ChangeFocus(&this->unk_144->actor, play, &this->actor); Actor_ChangeFocus(&this->bombShopkeeper->actor, play, &this->actor);
this->unk_1E0 = 0x65C; // Lifelong dream to sell Big Bomb Bags
this->textId = 0x65C;
break; break;
case 0x65C: case 0x65C:
Actor_ChangeFocus(&this->actor, play, &this->unk_144->actor); Actor_ChangeFocus(&this->actor, play, &this->bombShopkeeper->actor);
this->unk_1E0 = 0x65D; // I worry about you
this->textId = 0x65D;
gSaveContext.save.weekEventReg[73] |= 2; gSaveContext.save.weekEventReg[73] |= 2;
this->unk_40A |= 1; this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
break; break;
case 0x65E: case 0x65E:
Actor_ChangeFocus(&this->actor, play, &this->unk_144->actor); Actor_ChangeFocus(&this->actor, play, &this->bombShopkeeper->actor);
this->unk_1E0 = 0x65F; // I worry about you
this->unk_40A |= 1; this->textId = 0x65F;
this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
break; break;
case 0x2A34: case 0x2A34:
if (INV_CONTENT(ITEM_MASK_BLAST) == ITEM_MASK_BLAST) { if (INV_CONTENT(ITEM_MASK_BLAST) == ITEM_MASK_BLAST) {
this->unk_40A |= 1; this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
this->unk_1E0 = 0x2A36; // Thank you
this->textId = 0x2A36;
break; break;
} }
this->unk_40A |= 0x20; this->stateFlags |= BOMB_SHOP_LADY_STATE_GIVE_BLAST_MASK;
this->unk_1E0 = 0x2A35; // It's a dangerous mask
this->textId = 0x2A35;
break; break;
case 0x2A35: case 0x2A35:
this->unk_40A |= 1; this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
this->unk_1E0 = 0x2A36; // Thank you
this->textId = 0x2A36;
break; break;
case 0x2A30: case 0x2A30:
case 0x2A31: case 0x2A31:
this->unk_40A |= 1; this->stateFlags |= BOMB_SHOP_LADY_STATE_END_CONVERSATION;
break; break;
} }
Message_StartTextbox(play, this->unk_1E0, &this->actor); Message_StartTextbox(play, this->textId, &this->actor);
if (this->unk_40A & 1) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_END_CONVERSATION) {
if (this->unk_40A & 0x40) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_GAVE_BLAST_MASK) {
this->unk_40A &= ~0x40; this->stateFlags &= ~BOMB_SHOP_LADY_STATE_GAVE_BLAST_MASK;
func_80151BB4(play, 0x33); func_80151BB4(play, 0x33);
} }
func_80151BB4(play, 4); func_80151BB4(play, 4);
} }
} }
void func_80BA8C4C(PlayState* play, u16 nextEntrance) { void EnBaba_TriggerTransition(PlayState* play, u16 nextEntrance) {
play->nextEntranceIndex = nextEntrance; play->nextEntranceIndex = nextEntrance;
play->unk_1887F = 0x40; play->unk_1887F = 0x40;
gSaveContext.nextTransition = 0x40; gSaveContext.nextTransition = 0x40;
play->sceneLoadFlag = 0x14; play->sceneLoadFlag = 0x14;
} }
void func_80BA8C90(EnBaba* this, PlayState* play) { void EnBaba_UpdateCollider(EnBaba* this, PlayState* play) {
this->collider.dim.pos.x = this->actor.world.pos.x + 5.0f; this->collider.dim.pos.x = this->actor.world.pos.x + 5.0f;
this->collider.dim.pos.y = this->actor.world.pos.y; this->collider.dim.pos.y = this->actor.world.pos.y;
this->collider.dim.pos.z = this->actor.world.pos.z + 22.0f; this->collider.dim.pos.z = this->actor.world.pos.z + 22.0f;
@ -272,30 +315,31 @@ void func_80BA8C90(EnBaba* this, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base); CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
} }
s32 func_80BA8D2C(EnBaba* this, f32 arg1) { s32 EnBaba_MoveForward(EnBaba* this, f32 speedTarget) {
s16 sp3E; s16 rotStep;
s32 ret = false; s32 reachedEnd = false;
Vec3f sp2C; Vec3f point;
Math_SmoothStepToF(&this->actor.speedXZ, arg1, 0.4f, 1000.0f, 0.0f); Math_SmoothStepToF(&this->actor.speedXZ, speedTarget, 0.4f, 1000.0f, 0.0f);
sp3E = this->actor.speedXZ * 400.0f; rotStep = this->actor.speedXZ * 400.0f;
if (SubS_CopyPointFromPath(this->path, this->unk_1E8, &sp2C) && SubS_MoveActorToPoint(&this->actor, &sp2C, sp3E)) { if (SubS_CopyPointFromPath(this->path, this->waypoint, &point) &&
this->unk_1E8++; SubS_MoveActorToPoint(&this->actor, &point, rotStep)) {
if (this->unk_1E8 >= this->path->count) { this->waypoint++;
ret = true; if (this->waypoint >= this->path->count) {
reachedEnd = true;
} }
} }
return ret; return reachedEnd;
} }
void func_80BA8DF4(EnBaba* this, PlayState* play) { void EnBaba_UpdateModel(EnBaba* this, PlayState* play) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
Vec3f point; Vec3f point;
SkelAnime_Update(&this->skelAnime); SkelAnime_Update(&this->skelAnime);
if (SubS_AngleDiffLessEqual(this->actor.shape.rot.y, 0x36B0, this->actor.yawTowardsPlayer) && if (SubS_AngleDiffLessEqual(this->actor.shape.rot.y, 0x36B0, this->actor.yawTowardsPlayer) &&
!(this->unk_40A & 4)) { !(this->stateFlags & BOMB_SHOP_LADY_STATE_KNOCKED_OVER)) {
point.x = player->actor.world.pos.x; point.x = player->actor.world.pos.x;
point.y = player->bodyPartsPos[7].y + 3.0f; point.y = player->bodyPartsPos[7].y + 3.0f;
point.z = player->actor.world.pos.z; point.z = player->actor.world.pos.z;
@ -311,214 +355,223 @@ void func_80BA8DF4(EnBaba* this, PlayState* play) {
Math_SmoothStepToS(&this->torsoRot.y, 0, 4, 0x3E8, 1); Math_SmoothStepToS(&this->torsoRot.y, 0, 4, 0x3E8, 1);
} }
SubS_FillLimbRotTables(play, this->unk_302, this->unk_326, ARRAY_COUNT(this->unk_302)); SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
if (this->unk_40A & 2) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_VISIBLE) {
func_80BA8C90(this, play); EnBaba_UpdateCollider(this, play);
} }
} }
s32 func_80BA8F88(EnBaba* this, PlayState* play, ScheduleResult* arg2) { s32 EnBaba_InitTimePath(EnBaba* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp26 = SCHEDULE_TIME_NOW; u16 now = SCHEDULE_TIME_NOW;
u16 temp; u16 startTime;
u8 sp23 = ENBABA_GET_3F00(&this->actor); u8 pathIndex = BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor);
u16 numWaypoints;
if (D_80BAA4A8[arg2->result] >= 0) { if (sSearchTimePathLimit[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp23, D_80BAA4A8[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, pathIndex, sSearchTimePathLimit[scheduleOutput->result]);
} }
if (this->timePath == NULL) { if (this->timePath == NULL) {
return false; return false;
} }
if ((this->unk_434 != 0) && (this->timePathTimeSpeed >= 0)) { if ((this->scheduleResult != BOMB_SHOP_LADY_SCH_NONE) && (this->timePathTimeSpeed >= 0)) {
temp = sp26; startTime = now;
} else { } else {
temp = arg2->time0; startTime = scheduleOutput->time0;
} }
if (arg2->time1 < temp) { if (scheduleOutput->time1 < startTime) {
this->timePathTotalTime = (temp - arg2->time1) + 0xFFFF; this->timePathTotalTime = (startTime - scheduleOutput->time1) + (DAY_LENGTH - 1);
} else { } else {
this->timePathTotalTime = arg2->time1 - temp; this->timePathTotalTime = scheduleOutput->time1 - startTime;
} }
this->timePathElapsedTime = sp26 - temp; this->timePathElapsedTime = now - startTime;
temp = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1);
this->timePathWaypointTime = this->timePathTotalTime / temp; numWaypoints = startTime = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1);
this->unk_438 = 0; this->timePathWaypointTime = this->timePathTotalTime / numWaypoints;
this->timePathIsSetup = false;
this->timePathWaypoint = (this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1); this->timePathWaypoint = (this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1);
this->unk_43C = 0; this->timePathHasReachedEnd = false;
return true; return true;
} }
s32 func_80BA9110(EnBaba* this, PlayState* play, ScheduleResult* arg2) { s32 EnBaba_ProcessScheduleOutput(EnBaba* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret; s32 success;
switch (arg2->result) { switch (scheduleOutput->result) {
default: default:
ret = false; success = false;
break; break;
case 2: case BOMB_SHOP_LADY_SCH_FOLLOW_TIME_PATH:
ret = func_80BA8F88(this, play, arg2); success = EnBaba_InitTimePath(this, play, scheduleOutput);
break; break;
case 1: case BOMB_SHOP_LADY_SCH_KNOCKED_OVER:
ret = true; success = true;
break; break;
} }
return ret; return success;
} }
s32 func_80BA9160(EnBaba* this, PlayState* play) { s32 EnBaba_FollowTimePath(EnBaba* this, PlayState* play) {
f32 knots[265]; f32 weightArray[265];
Vec3f sp70; Vec3f worldPos;
Vec3f sp64; Vec3f timePathPointNew; // used to compute yaw after update
Vec3f timePathTargetPos; Vec3f timePathPoint; // used in setup and to store a backup before update
s32 sp54 = 0; s32 prevTimePathElapsedTime = 0;
s32 sp50 = 0; s32 prevTimePathWaypoint = 0;
s32 pad; s32 pad;
SubS_TimePathing_FillKnots(knots, SUBS_TIME_PATHING_ORDER, this->timePath->count + SUBS_TIME_PATHING_ORDER); SubS_TimePathing_FillKnots(weightArray, SUBS_TIME_PATHING_ORDER, this->timePath->count + SUBS_TIME_PATHING_ORDER);
if (this->unk_438 == 0) { if (!this->timePathIsSetup) {
timePathTargetPos = gZeroVec3f; timePathPoint = gZeroVec3f;
SubS_TimePathing_Update(this->timePath, &this->timePathProgress, &this->timePathElapsedTime, SubS_TimePathing_Update(this->timePath, &this->timePathProgress, &this->timePathElapsedTime,
this->timePathWaypointTime, this->timePathTotalTime, &this->timePathWaypoint, knots, this->timePathWaypointTime, this->timePathTotalTime, &this->timePathWaypoint,
&timePathTargetPos, this->timePathTimeSpeed); weightArray, &timePathPoint, this->timePathTimeSpeed);
SubS_TimePathing_ComputeInitialY(play, this->timePath, this->timePathWaypoint, &timePathTargetPos); SubS_TimePathing_ComputeInitialY(play, this->timePath, this->timePathWaypoint, &timePathPoint);
this->actor.world.pos.y = timePathTargetPos.y; this->actor.world.pos.y = timePathPoint.y;
this->unk_438 = 1; this->timePathIsSetup = true;
} else { } else {
timePathTargetPos = this->timePathTargetPos; timePathPoint = this->timePathPoint;
} }
this->actor.world.pos.x = timePathTargetPos.x; this->actor.world.pos.x = timePathPoint.x;
this->actor.world.pos.z = timePathTargetPos.z; this->actor.world.pos.z = timePathPoint.z;
if (SubS_InCsMode(play)) { if (SubS_InCsMode(play)) {
sp54 = this->timePathElapsedTime; prevTimePathElapsedTime = this->timePathElapsedTime;
sp50 = this->timePathWaypoint; prevTimePathWaypoint = this->timePathWaypoint;
timePathTargetPos = this->actor.world.pos; timePathPoint = this->actor.world.pos;
} }
this->timePathTargetPos = gZeroVec3f; this->timePathPoint = gZeroVec3f;
if (SubS_TimePathing_Update(this->timePath, &this->timePathProgress, &this->timePathElapsedTime, if (SubS_TimePathing_Update(this->timePath, &this->timePathProgress, &this->timePathElapsedTime,
this->timePathWaypointTime, this->timePathTotalTime, &this->timePathWaypoint, knots, this->timePathWaypointTime, this->timePathTotalTime, &this->timePathWaypoint,
&this->timePathTargetPos, this->timePathTimeSpeed)) { weightArray, &this->timePathPoint, this->timePathTimeSpeed)) {
this->unk_43C = 1; this->timePathHasReachedEnd = true;
} else { } else {
sp70 = this->actor.world.pos; worldPos = this->actor.world.pos;
sp64 = this->timePathTargetPos; timePathPointNew = this->timePathPoint;
this->actor.world.rot.y = Math_Vec3f_Yaw(&sp70, &sp64); this->actor.world.rot.y = Math_Vec3f_Yaw(&worldPos, &timePathPointNew);
} }
if (SubS_InCsMode(play)) { if (SubS_InCsMode(play)) {
this->timePathElapsedTime = sp54; this->timePathElapsedTime = prevTimePathElapsedTime;
this->timePathWaypoint = sp50; this->timePathWaypoint = prevTimePathWaypoint;
this->timePathTargetPos = timePathTargetPos; this->timePathPoint = timePathPoint;
} }
return false; return false;
} }
void func_80BA93AC(EnBaba* this, PlayState* play) { void EnBaba_HandleSchedule(EnBaba* this, PlayState* play) {
if (this->unk_434 != 1) { switch (this->scheduleResult) {
if (this->unk_434 == 2) { case BOMB_SHOP_LADY_SCH_FOLLOW_TIME_PATH:
gSaveContext.save.weekEventReg[58] |= 0x40; gSaveContext.save.weekEventReg[58] |= 0x40;
this->unk_40A |= 2; this->stateFlags |= BOMB_SHOP_LADY_STATE_VISIBLE;
func_80BA9160(this, play); EnBaba_FollowTimePath(this, play);
} break;
} else {
this->unk_40C = 3; case BOMB_SHOP_LADY_SCH_KNOCKED_OVER:
this->unk_1E0 = 10800; this->animIndex = BOMB_SHOP_LADY_ANIM_KNOCKED_OVER;
// Ouch
this->textId = 0x2A30;
this->actor.speedXZ = 0.0f; this->actor.speedXZ = 0.0f;
Enemy_StartFinishingBlow(play, &this->actor); Enemy_StartFinishingBlow(play, &this->actor);
this->unk_40A |= 4; this->stateFlags |= BOMB_SHOP_LADY_STATE_KNOCKED_OVER;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->unk_40C); Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animIndex);
this->actionFunc = func_80BA9CD4; this->actionFunc = EnBaba_KnockedOver;
break;
} }
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 4, 0x1554); Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 4, 0x1554);
} }
void func_80BA9480(EnBaba* this, PlayState* play) { void EnBaba_FinishInit(EnBaba* this, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &gBbaSkel, &gBbaWalkingHoldingBagAnim, this->jointTable, SkelAnime_InitFlex(play, &this->skelAnime, &gBbaSkel, &gBbaWalkingHoldingBagAnim, this->jointTable,
this->morphTable, 0x12); this->morphTable, BBA_LIMB_MAX);
this->actor.draw = EnBaba_Draw; this->actor.draw = EnBaba_Draw;
this->unk_40A |= 0x80; this->stateFlags |= BOMB_SHOP_LADY_STATE_DRAW_SHADOW;
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
if (play->sceneNum == SCENE_BOMYA) { if (play->sceneNum == SCENE_BOMYA) {
this->unk_40A |= 2; this->stateFlags |= BOMB_SHOP_LADY_STATE_VISIBLE;
this->unk_40C = 1; this->animIndex = BOMB_SHOP_LADY_ANIM_IDLE;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 1); Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animIndex);
this->actionFunc = func_80BA9758; this->actionFunc = EnBaba_Idle;
} else if (play->sceneNum == SCENE_BACKTOWN) { } else if (play->sceneNum == SCENE_BACKTOWN) {
if ((ENBABA_GET_C000(&this->actor) == ENBABA_C000_0) && (gSaveContext.save.entranceIndex != 0xD670) && if ((BOMB_SHOP_LADY_GET_TYPE(&this->actor) == BOMB_SHOP_LADY_TYPE_FOLLOW_SCHEDULE) &&
((ENBABA_GET_3F00(&this->actor)) != ENBABA_3F00_3F)) { (gSaveContext.save.entranceIndex != 0xD670) && (BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor) != 0x3F)) {
if ((gSaveContext.save.weekEventReg[58] & 0x40) || if ((gSaveContext.save.weekEventReg[58] & 0x40) ||
(!(gSaveContext.save.time < CLOCK_TIME(0, 20)) && (gSaveContext.save.time < CLOCK_TIME(6, 0)))) { (gSaveContext.save.time >= CLOCK_TIME(0, 20) && (gSaveContext.save.time < CLOCK_TIME(6, 0)))) {
Actor_MarkForDeath(&this->actor); Actor_MarkForDeath(&this->actor);
return; return;
} }
this->unk_404 = 50; this->sakonDeadTimer = 50;
this->unk_40C = 2; this->animIndex = BOMB_SHOP_LADY_ANIM_WALKING_HOLDING_BAG;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 2); Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animIndex);
this->actionFunc = func_80BA9B80; this->actionFunc = EnBaba_FollowSchedule;
} else if ((ENBABA_GET_C000(&this->actor) == ENBABA_C000_1) && (gSaveContext.save.entranceIndex == 0xD670)) { } else if ((BOMB_SHOP_LADY_GET_TYPE(&this->actor) == BOMB_SHOP_LADY_TYPE_IDLE) &&
(gSaveContext.save.entranceIndex == 0xD670)) {
if (gSaveContext.save.weekEventReg[81] & 2) { if (gSaveContext.save.weekEventReg[81] & 2) {
Actor_MarkForDeath(&this->actor); Actor_MarkForDeath(&this->actor);
return; return;
} }
this->unk_40A |= 2; this->stateFlags |= BOMB_SHOP_LADY_STATE_VISIBLE;
if (gSaveContext.save.weekEventReg[33] & 8) { if (gSaveContext.save.weekEventReg[33] & 8) {
this->unk_40C = 0; this->animIndex = BOMB_SHOP_LADY_ANIM_IDLE_HOLDING_BAG;
} else { } else {
this->unk_40C = 1; this->animIndex = BOMB_SHOP_LADY_ANIM_IDLE;
} }
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->unk_40C); Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animIndex);
this->unk_40A |= 8; this->stateFlags |= BOMB_SHOP_LADY_STATE_AUTOTALK;
this->actionFunc = func_80BA9758; this->actionFunc = EnBaba_Idle;
} else { } else {
Actor_MarkForDeath(&this->actor); Actor_MarkForDeath(&this->actor);
return; return;
} }
} else { } else {
this->unk_40A |= 2; this->stateFlags |= BOMB_SHOP_LADY_STATE_VISIBLE;
if (ENBABA_GET_C000(&this->actor) == ENBABA_C000_2) { if (BOMB_SHOP_LADY_GET_TYPE(&this->actor) == BOMB_SHOP_LADY_TYPE_SWAY) {
this->actor.flags &= ~ACTOR_FLAG_1; this->actor.flags &= ~ACTOR_FLAG_1;
this->unk_40C = 5; this->animIndex = BOMB_SHOP_LADY_ANIM_SWAY;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 5); Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animIndex);
this->actionFunc = func_80BA9E00; this->actionFunc = EnBaba_DoNothing;
} else if ((ENBABA_GET_3F00(&this->actor)) != ENBABA_3F00_3F) { } else if (BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor) != 0x3F) {
this->unk_40C = 2; this->animIndex = BOMB_SHOP_LADY_ANIM_WALKING_HOLDING_BAG;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 2); Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animIndex);
this->actionFunc = func_80BA9E10; this->actionFunc = EnBaba_Walk;
} else { } else {
this->unk_40C = 0; this->animIndex = BOMB_SHOP_LADY_ANIM_IDLE_HOLDING_BAG;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 0); Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animIndex);
this->actionFunc = func_80BA9E48; this->actionFunc = EnBaba_FaceForward;
} }
} }
} }
void func_80BA9758(EnBaba* this, PlayState* play) { void EnBaba_Idle(EnBaba* this, PlayState* play) {
if ((this->unk_40A & 8) || (this->unk_144 != NULL) || func_80BA8820(this, play)) { if ((this->stateFlags & BOMB_SHOP_LADY_STATE_AUTOTALK) || (this->bombShopkeeper != NULL) ||
EnBaba_FindBombShopkeeper(this, play)) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
func_80BA886C(this, play); EnBaba_HandleConversation(this, play);
if (this->unk_40A & 8) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_AUTOTALK) {
this->actor.flags &= ~ACTOR_FLAG_10000; this->actor.flags &= ~ACTOR_FLAG_10000;
} }
this->actionFunc = func_80BA98EC; this->actionFunc = EnBaba_Talk;
} else if (this->actor.xzDistToPlayer < 100.0f) { } else if (this->actor.xzDistToPlayer < 100.0f) {
if (this->unk_40A & 8) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_AUTOTALK) {
this->actor.flags |= ACTOR_FLAG_10000; this->actor.flags |= ACTOR_FLAG_10000;
} }
func_800B8614(&this->actor, play, 100.0f); func_800B8614(&this->actor, play, 100.0f);
@ -526,99 +579,100 @@ void func_80BA9758(EnBaba* this, PlayState* play) {
} }
} }
void func_80BA9848(EnBaba* this, PlayState* play) { void EnBaba_FollowSchedule_Talk(EnBaba* this, PlayState* play) {
u8 temp_v0 = Message_GetState(&play->msgCtx); u8 talkState = Message_GetState(&play->msgCtx);
if (((temp_v0 == 5) || (temp_v0 == 6)) && Message_ShouldAdvance(play)) { if (((talkState == 5) || (talkState == 6)) && Message_ShouldAdvance(play)) {
play->msgCtx.msgMode = 0x43; play->msgCtx.msgMode = 0x43;
play->msgCtx.unk12023 = 4; play->msgCtx.unk12023 = 4;
this->actionFunc = func_80BA9B80; this->actionFunc = EnBaba_FollowSchedule;
} }
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x1000, 0x100); Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x1000, 0x100);
} }
void func_80BA98EC(EnBaba* this, PlayState* play) { void EnBaba_Talk(EnBaba* this, PlayState* play) {
u8 temp_v0 = Message_GetState(&play->msgCtx); u8 talkState = Message_GetState(&play->msgCtx);
if (temp_v0 == 5) { if (talkState == 5) {
if (Message_ShouldAdvance(play)) { if (Message_ShouldAdvance(play)) {
if (this->unk_40A & 1) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_END_CONVERSATION) {
this->unk_40A &= ~1; this->stateFlags &= ~BOMB_SHOP_LADY_STATE_END_CONVERSATION;
play->msgCtx.msgMode = 0x43; play->msgCtx.msgMode = 0x43;
play->msgCtx.unk12023 = 4; play->msgCtx.unk12023 = 4;
if (this->unk_40A & 8) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_AUTOTALK) {
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) { if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
if (play->msgCtx.unk120B1 == 0) { if (play->msgCtx.unk120B1 == 0) {
gSaveContext.save.weekEventReg[81] |= 2; gSaveContext.save.weekEventReg[81] |= 2;
func_80BA8C4C(play, 0xD670); EnBaba_TriggerTransition(play, 0xD670);
return; return;
} }
} else { } else {
gSaveContext.save.weekEventReg[81] |= 2; gSaveContext.save.weekEventReg[81] |= 2;
func_80BA8C4C(play, 0xD670); EnBaba_TriggerTransition(play, 0xD670);
} }
} else { } else {
this->unk_1E0 = 0; this->textId = 0;
this->actionFunc = func_80BA9758; this->actionFunc = EnBaba_Idle;
} }
} else if (this->unk_40A & 0x20) { } else if (this->stateFlags & BOMB_SHOP_LADY_STATE_GIVE_BLAST_MASK) {
this->unk_40A &= ~0x20; this->stateFlags &= ~BOMB_SHOP_LADY_STATE_GIVE_BLAST_MASK;
play->msgCtx.msgMode = 0x43; play->msgCtx.msgMode = 0x43;
play->msgCtx.unk12023 = 4; play->msgCtx.unk12023 = 4;
this->actionFunc = func_80BA9AB8; this->actionFunc = EnBaba_GiveBlastMask;
} else { } else {
func_80BA886C(this, play); EnBaba_HandleConversation(this, play);
} }
} }
} else if (temp_v0 == 6) { } else if (talkState == 6) {
if (Message_ShouldAdvance(play) && (play->msgCtx.unk120B1 == 0)) { if (Message_ShouldAdvance(play) && (play->msgCtx.unk120B1 == 0)) {
gSaveContext.save.weekEventReg[81] |= 2; gSaveContext.save.weekEventReg[81] |= 2;
func_80BA8C4C(play, 0xD670); EnBaba_TriggerTransition(play, 0xD670);
} }
} }
} }
void func_80BA9AB8(EnBaba* this, PlayState* play) { void EnBaba_GiveBlastMask(EnBaba* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) { if (Actor_HasParent(&this->actor, play)) {
this->actor.parent = NULL; this->actor.parent = NULL;
this->unk_40A |= 0x40; this->stateFlags |= BOMB_SHOP_LADY_STATE_GAVE_BLAST_MASK;
this->actionFunc = func_80BA9B24; this->actionFunc = EnBaba_GaveBlastMask;
} else { } else {
Actor_PickUp(&this->actor, play, GI_MASK_BLAST, 300.0f, 300.0f); Actor_PickUp(&this->actor, play, GI_MASK_BLAST, 300.0f, 300.0f);
} }
} }
void func_80BA9B24(EnBaba* this, PlayState* play) { void EnBaba_GaveBlastMask(EnBaba* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
func_80BA886C(this, play); EnBaba_HandleConversation(this, play);
this->actionFunc = func_80BA98EC; this->actionFunc = EnBaba_Talk;
} else { } else {
func_800B85E0(&this->actor, play, 400.0f, -1); func_800B85E0(&this->actor, play, 400.0f, EXCH_ITEM_MINUS1);
} }
} }
void func_80BA9B80(EnBaba* this, PlayState* play) { void EnBaba_FollowSchedule(EnBaba* this, PlayState* play) {
ScheduleResult sp20; ScheduleOutput scheduleOutput;
this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed);
if (!Schedule_RunScript(play, D_80BAA488, &sp20) || if (!Schedule_RunScript(play, sSchedule, &scheduleOutput) ||
((this->unk_434 != sp20.result) && !func_80BA9110(this, play, &sp20))) { ((this->scheduleResult != scheduleOutput.result) &&
this->unk_40A &= ~0x80; !EnBaba_ProcessScheduleOutput(this, play, &scheduleOutput))) {
this->stateFlags &= ~BOMB_SHOP_LADY_STATE_DRAW_SHADOW;
this->actor.flags &= ~ACTOR_FLAG_1; this->actor.flags &= ~ACTOR_FLAG_1;
sp20.result = false; scheduleOutput.result = BOMB_SHOP_LADY_SCH_NONE;
} else { } else {
this->unk_40A |= 0x80; this->stateFlags |= BOMB_SHOP_LADY_STATE_DRAW_SHADOW;
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
} }
this->unk_434 = sp20.result; this->scheduleResult = scheduleOutput.result;
func_80BA93AC(this, play); EnBaba_HandleSchedule(this, play);
if (this->unk_40A & 2) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_VISIBLE) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, 0x2A39, &this->actor); // "I'm sorry" Message_StartTextbox(play, 0x2A39, &this->actor); // "I'm sorry"
this->actionFunc = func_80BA9848; this->actionFunc = EnBaba_FollowSchedule_Talk;
} else if ((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) { } else if ((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) {
func_800B863C(&this->actor, play); func_800B863C(&this->actor, play);
} }
@ -626,42 +680,42 @@ void func_80BA9B80(EnBaba* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor); Actor_MoveWithGravity(&this->actor);
} }
void func_80BA9CD4(EnBaba* this, PlayState* play) { void EnBaba_KnockedOver(EnBaba* this, PlayState* play) {
s16 sp2E = this->skelAnime.curFrame; s16 curFrame = this->skelAnime.curFrame;
s16 sp2C = Animation_GetLastFrame(sAnimations[this->unk_40C].animation); s16 endFrame = Animation_GetLastFrame(sAnimations[this->animIndex].animation);
this->collider.dim.height = 37; this->collider.dim.height = 37;
this->collider.dim.radius = 23; this->collider.dim.radius = 23;
if (this->unk_40C == 3) { if (this->animIndex == BOMB_SHOP_LADY_ANIM_KNOCKED_OVER) {
if (Animation_OnFrame(&this->skelAnime, 0.0f)) { if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_BBVO00); Actor_PlaySfxAtPos(&this->actor, NA_SE_VO_BBVO00);
} }
if (sp2E == sp2C) { if (curFrame == endFrame) {
this->unk_40C = 4; this->animIndex = BOMB_SHOP_LADY_ANIM_LYING_DOWN;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 4); Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animIndex);
} }
} else { } else {
if ((gSaveContext.save.weekEventReg[79] & 0x40) && (DECR(this->unk_404) == 0)) { if ((gSaveContext.save.weekEventReg[79] & 0x40) && (DECR(this->sakonDeadTimer) == 0)) {
Audio_QueueSeqCmd(0x101400FF); Audio_QueueSeqCmd(0x101400FF);
func_80BA8C4C(play, 0xD670); EnBaba_TriggerTransition(play, 0xD670);
} else { } else {
Actor_MoveWithGravity(&this->actor); Actor_MoveWithGravity(&this->actor);
} }
} }
} }
void func_80BA9E00(EnBaba* this, PlayState* play) { void EnBaba_DoNothing(EnBaba* this, PlayState* play) {
} }
void func_80BA9E10(EnBaba* this, PlayState* play) { void EnBaba_Walk(EnBaba* this, PlayState* play) {
if (func_80BA8D2C(this, 1.0f)) { if (EnBaba_MoveForward(this, 1.0f)) {
this->unk_1E8 = 0; this->waypoint = 0;
} }
} }
void func_80BA9E48(EnBaba* this, PlayState* play) { void EnBaba_FaceForward(EnBaba* this, PlayState* play) {
this->actor.shape.rot = this->actor.world.rot; this->actor.shape.rot = this->actor.world.rot;
} }
@ -673,13 +727,13 @@ void EnBaba_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit); CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->path = SubS_GetPathByIndex(play, ENBABA_GET_3F00(&this->actor), ENBABA_3F00_3F); this->path = SubS_GetPathByIndex(play, BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor), 0x3F);
Actor_SetScale(&this->actor, 0.01f); Actor_SetScale(&this->actor, 0.01f);
this->actor.targetMode = 0; this->actor.targetMode = 0;
this->actor.gravity = -4.0f; this->actor.gravity = -4.0f;
this->actionFunc = func_80BA9480; this->actionFunc = EnBaba_FinishInit;
} }
void EnBaba_Destroy(Actor* thisx, PlayState* play) { void EnBaba_Destroy(Actor* thisx, PlayState* play) {
@ -694,46 +748,48 @@ void EnBaba_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play); this->actionFunc(this, play);
Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4); Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
func_80BA8DF4(this, play); EnBaba_UpdateModel(this, play);
} }
s32 EnBaba_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { s32 EnBaba_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnBaba* this = THIS; EnBaba* this = THIS;
if (limbIndex == 6) { if (limbIndex == BBA_LIMB_NECK) {
Matrix_Translate(1500.0f, 0.0f, 0.0f, MTXMODE_APPLY); Matrix_Translate(1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateXS(this->headRot.y, MTXMODE_APPLY); Matrix_RotateXS(this->headRot.y, MTXMODE_APPLY);
Matrix_RotateZS(-this->headRot.x, MTXMODE_APPLY); Matrix_RotateZS(-this->headRot.x, MTXMODE_APPLY);
Matrix_Translate(-1500.0f, 0.0f, 0.0f, MTXMODE_APPLY); Matrix_Translate(-1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
} }
if (limbIndex == 5) { if (limbIndex == BBA_LIMB_UPPER_ROOT) {
Matrix_RotateXS(-this->torsoRot.y, MTXMODE_APPLY); Matrix_RotateXS(-this->torsoRot.y, MTXMODE_APPLY);
Matrix_RotateZS(-this->torsoRot.x, MTXMODE_APPLY); Matrix_RotateZS(-this->torsoRot.x, MTXMODE_APPLY);
} }
if ((limbIndex == 6) && (this->unk_1E2 != 0) && ((play->state.frames % 2) == 0)) { if ((limbIndex == BBA_LIMB_NECK) && (this->inMsgState3 != 0) && ((play->state.frames % 2) == 0)) {
Matrix_Translate(40.0f, 0.0f, 0.0f, MTXMODE_APPLY); Matrix_Translate(40.0f, 0.0f, 0.0f, MTXMODE_APPLY);
} }
if ((limbIndex == 5) || (limbIndex == 10) || (limbIndex == 14)) { if ((limbIndex == BBA_LIMB_UPPER_ROOT) || (limbIndex == BBA_LIMB_LEFT_UPPER_ARM) ||
rot->y += (s16)(Math_SinS(this->unk_302[limbIndex]) * 200.0f); (limbIndex == BBA_LIMB_RIGHT_UPPER_ARM)) {
rot->z += (s16)(Math_CosS(this->unk_326[limbIndex]) * 200.0f); rot->y += (s16)(Math_SinS(this->limbRotTableY[limbIndex]) * 200.0f);
rot->z += (s16)(Math_CosS(this->limbRotTableZ[limbIndex]) * 200.0f);
} }
if (((this->unk_40C == 1) || (this->unk_40C == 3) || (this->unk_40C == 4) || if (((this->animIndex == BOMB_SHOP_LADY_ANIM_IDLE) || (this->animIndex == BOMB_SHOP_LADY_ANIM_KNOCKED_OVER) ||
(ENBABA_GET_C000(&this->actor) == ENBABA_C000_2)) && (this->animIndex == BOMB_SHOP_LADY_ANIM_LYING_DOWN) ||
(limbIndex == 8)) { (BOMB_SHOP_LADY_GET_TYPE(&this->actor) == BOMB_SHOP_LADY_TYPE_SWAY)) &&
(limbIndex == BBA_LIMB_BAG)) {
*dList = NULL; *dList = NULL;
} }
return 0; return false;
} }
void EnBaba_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { void EnBaba_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnBaba* this = THIS; EnBaba* this = THIS;
Vec3f sp18 = { 0.0f, 0.0f, 0.0f }; Vec3f sp18 = { 0.0f, 0.0f, 0.0f };
if (limbIndex == 7) { if (limbIndex == BBA_LIMB_HEAD) {
this->actor.focus.pos.x = this->actor.world.pos.x; this->actor.focus.pos.x = this->actor.world.pos.x;
this->actor.focus.pos.y = this->actor.world.pos.y; this->actor.focus.pos.y = this->actor.world.pos.y;
this->actor.focus.pos.z = this->actor.world.pos.z; this->actor.focus.pos.z = this->actor.world.pos.z;
@ -747,10 +803,10 @@ void EnBaba_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
void EnBaba_Draw(Actor* thisx, PlayState* play) { void EnBaba_Draw(Actor* thisx, PlayState* play) {
s32 pad; s32 pad;
EnBaba* this = THIS; EnBaba* this = THIS;
Vec3f sp4C; Vec3f pos;
Vec3f sp40; Vec3f scale;
if (this->unk_40A & 2) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_VISIBLE) {
OPEN_DISPS(play->state.gfxCtx); OPEN_DISPS(play->state.gfxCtx);
func_8012C5B0(play->state.gfxCtx); func_8012C5B0(play->state.gfxCtx);
@ -761,18 +817,19 @@ void EnBaba_Draw(Actor* thisx, PlayState* play) {
this->skelAnime.dListCount, EnBaba_OverrideLimbDraw, EnBaba_PostLimbDraw, this->skelAnime.dListCount, EnBaba_OverrideLimbDraw, EnBaba_PostLimbDraw,
EnBaba_TransformLimbDraw, &this->actor); EnBaba_TransformLimbDraw, &this->actor);
if (this->unk_40A & 0x80) { if (this->stateFlags & BOMB_SHOP_LADY_STATE_DRAW_SHADOW) {
if ((this->unk_40C == 3) || (this->unk_40C == 4)) { if ((this->animIndex == BOMB_SHOP_LADY_ANIM_KNOCKED_OVER) ||
(this->animIndex == BOMB_SHOP_LADY_ANIM_LYING_DOWN)) {
func_8012C2DC(play->state.gfxCtx); func_8012C2DC(play->state.gfxCtx);
sp4C.x = this->actor.world.pos.x + 20.0f; pos.x = this->actor.world.pos.x + 20.0f;
sp4C.y = this->actor.world.pos.y; pos.y = this->actor.world.pos.y;
sp4C.z = this->actor.world.pos.z + 20.0f; pos.z = this->actor.world.pos.z + 20.0f;
} else { } else {
sp4C = this->actor.world.pos; pos = this->actor.world.pos;
} }
sp40.x = sp40.y = sp40.z = 0.3f; scale.x = scale.y = scale.z = 0.3f;
func_800BC620(&sp4C, &sp40, 255, play); func_800BC620(&pos, &scale, 255, play);
} }
CLOSE_DISPS(play->state.gfxCtx); CLOSE_DISPS(play->state.gfxCtx);

View File

@ -2,58 +2,60 @@
#define Z_EN_BABA_H #define Z_EN_BABA_H
#include "global.h" #include "global.h"
#include "overlays/actors/ovl_En_Sob1/z_en_sob1.h"
#include "objects/object_bba/object_bba.h"
struct EnBaba; struct EnBaba;
typedef void (*EnBabaActionFunc)(struct EnBaba*, PlayState*); typedef void (*EnBabaActionFunc)(struct EnBaba*, PlayState*);
#define ENBABA_GET_3F00(thisx) (((thisx)->params & 0x3F00) >> 8) #define BOMB_SHOP_LADY_GET_PATH_INDEX(thisx) (((thisx)->params & 0x3F00) >> 8)
#define ENBABA_GET_C000(thisx) (((thisx)->params & 0xC000) >> 0xE) #define BOMB_SHOP_LADY_GET_TYPE(thisx) (((thisx)->params & 0xC000) >> 0xE)
#define ENBABA_3F00_3F 0x3F // Types BOMB_SHOP_LADY_TYPE_FOLLOW_SCHEDULE and BOMB_SHOP_LADY_TYPE_IDLE can only be used in SCENE_BACKTOWN
// Type BOMB_SHOP_LADY_TYPE_SWAY can be used anywhere except SCENE_BACKTOWN and SCENE_BOMYA
enum { typedef enum {
/* 0 */ ENBABA_C000_0, /* 0 */ BOMB_SHOP_LADY_TYPE_FOLLOW_SCHEDULE,
/* 1 */ ENBABA_C000_1, /* 1 */ BOMB_SHOP_LADY_TYPE_IDLE,
/* 2 */ ENBABA_C000_2, /* 2 */ BOMB_SHOP_LADY_TYPE_SWAY
}; } BombShopLadyType;
typedef struct EnBaba { typedef struct EnBaba {
/* 0x000 */ Actor actor; /* 0x000 */ Actor actor;
/* 0x144 */ struct EnOssan* unk_144; /* 0x144 */ EnSob1* bombShopkeeper;
/* 0x148 */ EnBabaActionFunc actionFunc; /* 0x148 */ EnBabaActionFunc actionFunc;
/* 0x14C */ UNK_TYPE1 unk14C[4]; /* 0x14C */ UNK_TYPE1 unk14C[4];
/* 0x150 */ SkelAnime skelAnime; /* 0x150 */ SkelAnime skelAnime;
/* 0x194 */ ColliderCylinder collider; /* 0x194 */ ColliderCylinder collider;
/* 0x1E0 */ u16 unk_1E0; /* 0x1E0 */ u16 textId;
/* 0x1E2 */ u8 unk_1E2; /* 0x1E2 */ u8 inMsgState3;
/* 0x1E4 */ Path* path; /* 0x1E4 */ Path* path;
/* 0x1E8 */ s16 unk_1E8; /* 0x1E8 */ s16 waypoint;
/* 0x1EA */ UNK_TYPE1 unk1EA[0x1C]; /* 0x1EA */ UNK_TYPE1 unk1EA[0x1C];
/* 0x206 */ Vec3s jointTable[18]; /* 0x206 */ Vec3s jointTable[BBA_LIMB_MAX];
/* 0x272 */ Vec3s morphTable[18]; /* 0x272 */ Vec3s morphTable[BBA_LIMB_MAX];
/* 0x2DE */ Vec3s trackTarget; /* 0x2DE */ Vec3s trackTarget;
/* 0x2E4 */ Vec3s headRot; /* 0x2E4 */ Vec3s headRot;
/* 0x2EA */ Vec3s torsoRot; /* 0x2EA */ Vec3s torsoRot;
/* 0x2F0 */ UNK_TYPE1 unk2F0[0x12]; /* 0x2F0 */ UNK_TYPE1 unk2F0[0x12];
/* 0x302 */ s16 unk_302[18]; /* 0x302 */ s16 limbRotTableY[18];
/* 0x326 */ s16 unk_326[18]; /* 0x326 */ s16 limbRotTableZ[18];
/* 0x34A */ UNK_TYPE1 unk34A[0xBA]; /* 0x34A */ UNK_TYPE1 unk34A[0xBA];
/* 0x404 */ s16 unk_404; /* 0x404 */ s16 sakonDeadTimer;
/* 0x406 */ UNK_TYPE1 unk406[4]; /* 0x406 */ UNK_TYPE1 unk406[4];
/* 0x40A */ u16 unk_40A; /* 0x40A */ u16 stateFlags;
/* 0x40C */ s32 unk_40C; /* 0x40C */ s32 animIndex;
/* 0x410 */ Path* timePath; /* 0x410 */ Path* timePath;
/* 0x414 */ Vec3f timePathTargetPos; /* 0x414 */ Vec3f timePathPoint;
/* 0x420 */ f32 timePathProgress; /* 0x420 */ f32 timePathProgress;
/* 0x424 */ s32 timePathTotalTime; /* 0x424 */ s32 timePathTotalTime;
/* 0x428 */ s32 timePathWaypointTime; /* 0x428 */ s32 timePathWaypointTime;
/* 0x42C */ s32 timePathWaypoint; /* 0x42C */ s32 timePathWaypoint;
/* 0x430 */ s32 timePathElapsedTime; /* 0x430 */ s32 timePathElapsedTime;
/* 0x434 */ u8 unk_434; /* 0x434 */ u8 scheduleResult;
/* 0x436 */ s16 timePathTimeSpeed; /* 0x436 */ s16 timePathTimeSpeed;
/* 0x438 */ s32 unk_438; /* 0x438 */ s32 timePathIsSetup;
/* 0x43C */ s32 unk_43C; /* 0x43C */ s32 timePathHasReachedEnd;
} EnBaba; // size = 0x440 } EnBaba; // size = 0x440
extern const ActorInit En_Baba_InitVars; extern const ActorInit En_Baba_InitVars;

View File

@ -162,7 +162,7 @@ void EnBba01_FinishInit(EnHy* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
this->actor.draw = EnBba01_Draw; this->actor.draw = EnBba01_Draw;
this->waitingOnInit = false; this->waitingOnInit = false;
if (ENBBA01_GET_PATH(&this->actor) == ENBBA01_NO_PATH) { if (ENBBA01_GET_PATH(&this->actor) == 0x3F) {
this->actionFunc = EnBba01_FaceFoward; this->actionFunc = EnBba01_FaceFoward;
} else { } else {
this->actionFunc = EnBba01_Walk; this->actionFunc = EnBba01_Walk;
@ -225,7 +225,7 @@ void EnBba01_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->enHy.collider, &this->enHy.actor, &sCylinderInit); Collider_SetCylinder(play, &this->enHy.collider, &this->enHy.actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->enHy.actor.colChkInfo, &sDamageTable, &sColChkInfoInit); CollisionCheck_SetInfo2(&this->enHy.actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->enHy.actor.flags &= ~ACTOR_FLAG_1; this->enHy.actor.flags &= ~ACTOR_FLAG_1;
this->enHy.path = SubS_GetPathByIndex(play, ENBBA01_GET_PATH(&this->enHy.actor), ENBBA01_NO_PATH); this->enHy.path = SubS_GetPathByIndex(play, ENBBA01_GET_PATH(&this->enHy.actor), 0x3F);
this->enHy.waitingOnInit = true; this->enHy.waitingOnInit = true;
Actor_SetScale(&this->enHy.actor, 0.01f); Actor_SetScale(&this->enHy.actor, 0.01f);
this->enHy.actionFunc = EnBba01_FinishInit; this->enHy.actionFunc = EnBba01_FinishInit;

View File

@ -8,7 +8,6 @@ struct EnBba01;
typedef void (*EnBba01ActionFunc)(struct EnBba01*, PlayState*); typedef void (*EnBba01ActionFunc)(struct EnBba01*, PlayState*);
#define ENBBA01_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9) #define ENBBA01_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
#define ENBBA01_NO_PATH 0x3F
typedef struct EnBba01 { typedef struct EnBba01 {
/* 0x000 */ EnHy enHy; /* 0x000 */ EnHy enHy;

View File

@ -152,7 +152,7 @@ void EnCne01_FinishInit(EnHy* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
this->actor.draw = EnCne01_Draw; this->actor.draw = EnCne01_Draw;
this->waitingOnInit = false; this->waitingOnInit = false;
if (ENCNE01_GET_PATH(&this->actor) == ENCNE01_NO_PATH) { if (ENCNE01_GET_PATH(&this->actor) == 0x3F) {
this->actionFunc = EnCne01_FaceForward; this->actionFunc = EnCne01_FaceForward;
} else { } else {
this->actionFunc = EnCne01_Walk; this->actionFunc = EnCne01_Walk;
@ -215,7 +215,7 @@ void EnCne01_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->enHy.collider, &this->enHy.actor, &sCylinderInit); Collider_SetCylinder(play, &this->enHy.collider, &this->enHy.actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->enHy.actor.colChkInfo, &sDamageTable, &sColChkInfoInit); CollisionCheck_SetInfo2(&this->enHy.actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->enHy.actor.flags &= ~ACTOR_FLAG_1; this->enHy.actor.flags &= ~ACTOR_FLAG_1;
this->enHy.path = SubS_GetPathByIndex(play, ENCNE01_GET_PATH(&this->enHy.actor), ENCNE01_NO_PATH); this->enHy.path = SubS_GetPathByIndex(play, ENCNE01_GET_PATH(&this->enHy.actor), 0x3F);
this->enHy.waitingOnInit = true; this->enHy.waitingOnInit = true;
Actor_SetScale(&this->enHy.actor, 0.01f); Actor_SetScale(&this->enHy.actor, 0.01f);
this->enHy.actionFunc = EnCne01_FinishInit; this->enHy.actionFunc = EnCne01_FinishInit;

View File

@ -8,7 +8,6 @@ struct EnCne01;
typedef void (*EnCne01ActionFunc)(struct EnCne01*, PlayState*); typedef void (*EnCne01ActionFunc)(struct EnCne01*, PlayState*);
#define ENCNE01_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9) #define ENCNE01_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
#define ENCNE01_NO_PATH 0x3F
typedef struct EnCne01 { typedef struct EnCne01 {
/* 0x000 */ EnHy enHy; /* 0x000 */ EnHy enHy;

View File

@ -532,7 +532,7 @@ void func_80866B20(EnDoor* this, PlayState* play) {
this->dyna.actor.textId = baseTextId + textIdOffset; this->dyna.actor.textId = baseTextId + textIdOffset;
} }
} else if ((this->unk_1A4 == 5) && (playerPosRelToDoor.z > 0.0f)) { } else if ((this->unk_1A4 == 5) && (playerPosRelToDoor.z > 0.0f)) {
ScheduleResult sp30; ScheduleOutput sp30;
if (Schedule_RunScript(play, D_8086778C[this->switchFlag], &sp30) != 0) { if (Schedule_RunScript(play, D_8086778C[this->switchFlag], &sp30) != 0) {
this->dyna.actor.textId = sp30.result + 0x1800; this->dyna.actor.textId = sp30.result + 0x1800;

View File

@ -53,20 +53,20 @@ typedef enum {
} EnFsnCutsceneState; } EnFsnCutsceneState;
typedef enum { typedef enum {
/* 00 */ FSN_ANIMATION_IDLE, /* 0 */ FSN_ANIM_IDLE,
/* 01 */ FSN_ANIMATION_SCRATCH_BACK, /* 1 */ FSN_ANIM_SCRATCH_BACK,
/* 02 */ FSN_ANIMATION_TURN_AROUND_FORWARD, /* 2 */ FSN_ANIM_TURN_AROUND_FORWARD,
/* 03 */ FSN_ANIMATION_TURN_AROUND_REVERSE, /* 3 */ FSN_ANIM_TURN_AROUND_REVERSE,
/* 04 */ FSN_ANIMATION_HANDS_ON_COUNTER_START, /* 4 */ FSN_ANIM_HANDS_ON_COUNTER_START,
/* 05 */ FSN_ANIMATION_HANDS_ON_COUNTER_LOOP, /* 5 */ FSN_ANIM_HANDS_ON_COUNTER_LOOP,
/* 06 */ FSN_ANIMATION_HAND_ON_FACE_START, /* 6 */ FSN_ANIM_HAND_ON_FACE_START,
/* 07 */ FSN_ANIMATION_HAND_ON_FACE_LOOP, /* 7 */ FSN_ANIM_HAND_ON_FACE_LOOP,
/* 08 */ FSN_ANIMATION_LEAN_FORWARD_START, /* 8 */ FSN_ANIM_LEAN_FORWARD_START,
/* 09 */ FSN_ANIMATION_LEAN_FORWARD_LOOP, /* 9 */ FSN_ANIM_LEAN_FORWARD_LOOP,
/* 10 */ FSN_ANIMATION_SLAM_COUNTER_START, /* 10 */ FSN_ANIM_SLAM_COUNTER_START,
/* 11 */ FSN_ANIMATION_SLAM_COUNTER_LOOP, /* 11 */ FSN_ANIM_SLAM_COUNTER_LOOP,
/* 12 */ FSN_ANIMATION_MAKE_OFFER, /* 12 */ FSN_ANIM_MAKE_OFFER,
/* 13 */ FSN_ANIMATION_MAX /* 13 */ FSN_ANIM_MAX
} FsnAnimation; } FsnAnimation;
const ActorInit En_Fsn_InitVars = { const ActorInit En_Fsn_InitVars = {
@ -711,7 +711,7 @@ void EnFsn_InitShop(EnFsn* this, PlayState* play) {
this->stickAnimTween = this->arrowAnimTween = 0.0f; this->stickAnimTween = this->arrowAnimTween = 0.0f;
} }
this->blinkTimer = 20; this->blinkTimer = 20;
this->animationIndex = FSN_ANIMATION_HANDS_ON_COUNTER_START; this->animationIndex = FSN_ANIM_HANDS_ON_COUNTER_START;
this->eyeTextureIdx = 0; this->eyeTextureIdx = 0;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex); SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex);
this->actionFunc = EnFsn_Idle; this->actionFunc = EnFsn_Idle;
@ -720,11 +720,11 @@ void EnFsn_InitShop(EnFsn* this, PlayState* play) {
void EnFsn_Idle(EnFsn* this, PlayState* play) { void EnFsn_Idle(EnFsn* this, PlayState* play) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
if (this->animationIndex == FSN_ANIMATION_HANDS_ON_COUNTER_START) { if (this->animationIndex == FSN_ANIM_HANDS_ON_COUNTER_START) {
s16 curFrame = this->skelAnime.curFrame; s16 curFrame = this->skelAnime.curFrame;
s16 frameCount = Animation_GetLastFrame(sAnimations[this->animationIndex].animation); s16 frameCount = Animation_GetLastFrame(sAnimations[this->animationIndex].animation);
if (curFrame == frameCount) { if (curFrame == frameCount) {
this->animationIndex = FSN_ANIMATION_HANDS_ON_COUNTER_LOOP; this->animationIndex = FSN_ANIM_HANDS_ON_COUNTER_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex); SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex);
} }
return; return;
@ -762,24 +762,24 @@ void EnFsn_Haggle(EnFsn* this, PlayState* play) {
if (this->flags & ENFSN_ANGRY) { if (this->flags & ENFSN_ANGRY) {
this->flags &= ~ENFSN_ANGRY; this->flags &= ~ENFSN_ANGRY;
this->animationIndex = FSN_ANIMATION_SLAM_COUNTER_LOOP; this->animationIndex = FSN_ANIM_SLAM_COUNTER_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex); SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex);
} else { } else {
if (this->animationIndex == FSN_ANIMATION_SLAM_COUNTER_LOOP && Animation_OnFrame(&this->skelAnime, 18.0f)) { if (this->animationIndex == FSN_ANIM_SLAM_COUNTER_LOOP && Animation_OnFrame(&this->skelAnime, 18.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HANKO); Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_HANKO);
} }
if (this->flags & ENFSN_CALM_DOWN) { if (this->flags & ENFSN_CALM_DOWN) {
this->flags &= ~ENFSN_CALM_DOWN; this->flags &= ~ENFSN_CALM_DOWN;
this->animationIndex = FSN_ANIMATION_HANDS_ON_COUNTER_LOOP; this->animationIndex = FSN_ANIM_HANDS_ON_COUNTER_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex); SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex);
} else if (this->flags & ENFSN_OFFER_FINAL_PRICE) { } else if (this->flags & ENFSN_OFFER_FINAL_PRICE) {
this->flags &= ~ENFSN_OFFER_FINAL_PRICE; this->flags &= ~ENFSN_OFFER_FINAL_PRICE;
this->animationIndex = FSN_ANIMATION_MAKE_OFFER; this->animationIndex = FSN_ANIM_MAKE_OFFER;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex); SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex);
} else { } else {
if (this->animationIndex == FSN_ANIMATION_MAKE_OFFER) { if (this->animationIndex == FSN_ANIM_MAKE_OFFER) {
if (curFrame == frameCount) { if (curFrame == frameCount) {
this->animationIndex = FSN_ANIMATION_HANDS_ON_COUNTER_LOOP; this->animationIndex = FSN_ANIM_HANDS_ON_COUNTER_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex); SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex);
} else { } else {
if (Animation_OnFrame(&this->skelAnime, 28.0f)) { if (Animation_OnFrame(&this->skelAnime, 28.0f)) {
@ -1430,7 +1430,7 @@ void EnFsn_Init(Actor* thisx, PlayState* play) {
this->eyeTextureIdx = 0; this->eyeTextureIdx = 0;
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
this->actor.targetMode = 0; this->actor.targetMode = 0;
this->animationIndex = FSN_ANIMATION_IDLE; this->animationIndex = FSN_ANIM_IDLE;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex); SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, this->animationIndex);
this->actionFunc = EnFsn_IdleBackroom; this->actionFunc = EnFsn_IdleBackroom;
} }

View File

@ -1027,7 +1027,7 @@ void EnGk_Init(Actor* thisx, PlayState* play) {
Actor_MarkForDeath(&this->actor); Actor_MarkForDeath(&this->actor);
} else { } else {
this->unk_318 = this->actor.cutscene; this->unk_318 = this->actor.cutscene;
this->path = SubS_GetPathByIndex(play, ENGK_GET_F0(&this->actor), 15); this->path = SubS_GetPathByIndex(play, ENGK_GET_F0(&this->actor), 0xF);
this->actionFunc = func_80B51760; this->actionFunc = func_80B51760;
} }
} else if (play->sceneNum == SCENE_GORONRACE) { } else if (play->sceneNum == SCENE_GORONRACE) {

View File

@ -969,7 +969,7 @@ s32 func_8094F53C(EnGm* this, PlayState* play) {
return false; return false;
} }
s32 func_8094F7D0(EnGm* this, PlayState* play, ScheduleResult* arg2, u8 arg3, s16 arg4) { s32 func_8094F7D0(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput, u8 arg3, s16 arg4) {
u8 sp4F = ENGM_GET_FF(&this->actor); u8 sp4F = ENGM_GET_FF(&this->actor);
Vec3s* sp48; Vec3s* sp48;
Vec3f sp3C; Vec3f sp3C;
@ -981,8 +981,8 @@ s32 func_8094F7D0(EnGm* this, PlayState* play, ScheduleResult* arg2, u8 arg3, s1
this->timePath = NULL; this->timePath = NULL;
actor = func_8094DEE0(this, play, arg3, arg4); actor = func_8094DEE0(this, play, arg3, arg4);
if (D_80951A0C[arg2->result] >= 0) { if (D_80951A0C[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80951A0C[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80951A0C[scheduleOutput->result]);
} }
if ((actor != NULL) && (actor->update != NULL)) { if ((actor != NULL) && (actor->update != NULL)) {
@ -999,7 +999,7 @@ s32 func_8094F7D0(EnGm* this, PlayState* play, ScheduleResult* arg2, u8 arg3, s1
return ret; return ret;
} }
s32 func_8094F904(EnGm* this, PlayState* play, ScheduleResult* arg2) { s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp56 = SCHEDULE_TIME_NOW; u16 sp56 = SCHEDULE_TIME_NOW;
u8 sp55 = ENGM_GET_FF(&this->actor); u8 sp55 = ENGM_GET_FF(&this->actor);
EnDoor* door; EnDoor* door;
@ -1010,10 +1010,10 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleResult* arg2) {
s32 ret = false; s32 ret = false;
this->timePath = NULL; this->timePath = NULL;
door = func_8094DF90(play, arg2->result); door = func_8094DF90(play, scheduleOutput->result);
if (D_80951A0C[arg2->result] >= 0) { if (D_80951A0C[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp55, D_80951A0C[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp55, D_80951A0C[scheduleOutput->result]);
} }
if ((door != NULL) && (door->dyna.actor.update != NULL)) { if ((door != NULL) && (door->dyna.actor.update != NULL)) {
@ -1032,8 +1032,8 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleResult* arg2) {
this->unk_261 = 75; this->unk_261 = 75;
} }
this->unk_3B8 = arg2->time1 - arg2->time0; this->unk_3B8 = scheduleOutput->time1 - scheduleOutput->time0;
this->unk_3BA = sp56 - arg2->time0; this->unk_3BA = sp56 - scheduleOutput->time0;
this->actor.flags &= ~ACTOR_FLAG_1; this->actor.flags &= ~ACTOR_FLAG_1;
this->unk_3A4 |= 0x100; this->unk_3A4 |= 0x100;
this->unk_3A4 |= 0x200; this->unk_3A4 |= 0x200;
@ -1045,16 +1045,17 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_8094FAC4(EnGm* this, PlayState* play, ScheduleResult* arg2) { s32 func_8094FAC4(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp2E = SCHEDULE_TIME_NOW; u16 sp2E = SCHEDULE_TIME_NOW;
u16 phi_v1; u16 phi_v1;
u8 sp2B = ENGM_GET_FF(&this->actor); u8 sp2B = ENGM_GET_FF(&this->actor);
s32 pad; u16 tmp;
s16 pad;
s32 ret = false; s32 ret = false;
this->timePath = NULL; this->timePath = NULL;
if (D_80951A0C[arg2->result] >= 0) { if (D_80951A0C[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80951A0C[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80951A0C[scheduleOutput->result]);
} }
if ((this->timePath != NULL) && (this->timePath->count < 3)) { if ((this->timePath != NULL) && (this->timePath->count < 3)) {
@ -1065,18 +1066,18 @@ s32 func_8094FAC4(EnGm* this, PlayState* play, ScheduleResult* arg2) {
if ((this->unk_258 < 9) && (this->unk_258 != 0) && (this->timePathTimeSpeed >= 0)) { if ((this->unk_258 < 9) && (this->unk_258 != 0) && (this->timePathTimeSpeed >= 0)) {
phi_v1 = sp2E; phi_v1 = sp2E;
} else { } else {
phi_v1 = arg2->time0; phi_v1 = scheduleOutput->time0;
} }
if (arg2->time1 < phi_v1) { if (scheduleOutput->time1 < phi_v1) {
this->timePathTotalTime = (phi_v1 - arg2->time1) + 0xFFFF; this->timePathTotalTime = (phi_v1 - scheduleOutput->time1) + 0xFFFF;
} else { } else {
this->timePathTotalTime = arg2->time1 - phi_v1; this->timePathTotalTime = scheduleOutput->time1 - phi_v1;
} }
this->timePathElapsedTime = sp2E - phi_v1; this->timePathElapsedTime = sp2E - phi_v1;
phi_v1 = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1); tmp = phi_v1 = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1);
this->timePathWaypointTime = this->timePathTotalTime / phi_v1; this->timePathWaypointTime = this->timePathTotalTime / tmp;
this->timePathWaypoint = this->timePathWaypoint =
(this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1); (this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1);
this->unk_3A4 &= ~0x8; this->unk_3A4 &= ~0x8;
@ -1091,11 +1092,11 @@ s32 func_8094FAC4(EnGm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_8094FCC4(EnGm* this, PlayState* play, ScheduleResult* arg2) { s32 func_8094FCC4(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
static Vec3f D_80951D90 = { 64.0f, 0.0f, -122.0f }; static Vec3f D_80951D90 = { 64.0f, 0.0f, -122.0f };
s32 ret = false; s32 ret = false;
if (func_8094F7D0(this, play, arg2, ACTORCAT_NPC, ACTOR_EN_TAB)) { if (func_8094F7D0(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_TAB)) {
if (this->unk_258 == 0) { if (this->unk_258 == 0) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_80951D90); Math_Vec3f_Copy(&this->actor.world.pos, &D_80951D90);
SubS_UpdateFlags(&this->unk_3A4, 3, 7); SubS_UpdateFlags(&this->unk_3A4, 3, 7);
@ -1111,10 +1112,10 @@ s32 func_8094FCC4(EnGm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_8094FD88(EnGm* this, PlayState* play, ScheduleResult* arg2) { s32 func_8094FD88(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
if (func_8094F7D0(this, play, arg2, ACTORCAT_NPC, ACTOR_EN_RECEPGIRL)) { if (func_8094F7D0(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_RECEPGIRL)) {
func_8094E054(this, play, 11); func_8094E054(this, play, 11);
SubS_UpdateFlags(&this->unk_3A4, 3, 7); SubS_UpdateFlags(&this->unk_3A4, 3, 7);
this->unk_3A4 |= 0x100; this->unk_3A4 |= 0x100;
@ -1124,12 +1125,13 @@ s32 func_8094FD88(EnGm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_8094FE10(EnGm* this, PlayState* play, ScheduleResult* arg2) { s32 func_8094FE10(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
Actor* al; Actor* al;
al = func_8094DEE0(this, play, ACTORCAT_NPC, ACTOR_EN_AL); al = func_8094DEE0(this, play, ACTORCAT_NPC, ACTOR_EN_AL);
if (func_8094F7D0(this, play, arg2, ACTORCAT_NPC, ACTOR_EN_TOTO) && (al != NULL) && (al->update != NULL)) { if (func_8094F7D0(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_TOTO) && (al != NULL) &&
(al->update != NULL)) {
func_8094E054(this, play, 11); func_8094E054(this, play, 11);
SubS_UpdateFlags(&this->unk_3A4, 3, 7); SubS_UpdateFlags(&this->unk_3A4, 3, 7);
this->unk_268 = al; this->unk_268 = al;
@ -1145,7 +1147,7 @@ s32 func_8094FE10(EnGm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_8094FF04(EnGm* this, PlayState* play, ScheduleResult* arg2) { s32 func_8094FF04(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
static Vec3f D_80951D9C = { 64.0f, 0.0f, -122.0f }; static Vec3f D_80951D9C = { 64.0f, 0.0f, -122.0f };
u8 sp4F = ENGM_GET_FF(&this->actor); u8 sp4F = ENGM_GET_FF(&this->actor);
Vec3s* sp48; Vec3s* sp48;
@ -1156,8 +1158,8 @@ s32 func_8094FF04(EnGm* this, PlayState* play, ScheduleResult* arg2) {
this->timePath = NULL; this->timePath = NULL;
if (D_80951A0C[arg2->result] >= 0) { if (D_80951A0C[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80951A0C[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80951A0C[scheduleOutput->result]);
} }
if (this->timePath != NULL) { if (this->timePath != NULL) {
@ -1187,7 +1189,7 @@ s32 func_8094FF04(EnGm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80950088(EnGm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80950088(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
static Vec3f D_80951DA8 = { 278.0f, 0.0f, 223.0f }; static Vec3f D_80951DA8 = { 278.0f, 0.0f, 223.0f };
static Vec3s D_80951DB4 = { 0x0000, 0xC000, 0x0000 }; static Vec3s D_80951DB4 = { 0x0000, 0xC000, 0x0000 };
s32 pad; s32 pad;
@ -1202,7 +1204,7 @@ s32 func_80950088(EnGm* this, PlayState* play, ScheduleResult* arg2) {
return true; return true;
} }
s32 func_80950120(EnGm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80950120(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
static Vec3f D_80951DBC = { -525.0f, 214.0f, 515.0f }; static Vec3f D_80951DBC = { -525.0f, 214.0f, 515.0f };
static Vec3s D_80951DC8 = { 0x0000, 0x38E0, 0x0000 }; static Vec3s D_80951DC8 = { 0x0000, 0x38E0, 0x0000 };
s32 pad; s32 pad;
@ -1217,7 +1219,7 @@ s32 func_80950120(EnGm* this, PlayState* play, ScheduleResult* arg2) {
return true; return true;
} }
s32 func_809501B8(EnGm* this, PlayState* play, ScheduleResult* arg2) { s32 func_809501B8(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
static Vec3f D_80951DD0 = { -334.0f, 225.0f, 903.0f }; static Vec3f D_80951DD0 = { -334.0f, 225.0f, 903.0f };
static Vec3s D_80951DDC = { 0x0000, 0x7FFF, 0x0000 }; static Vec3s D_80951DDC = { 0x0000, 0x7FFF, 0x0000 };
s32 pad; s32 pad;
@ -1238,7 +1240,7 @@ s32 func_809501B8(EnGm* this, PlayState* play, ScheduleResult* arg2) {
return true; return true;
} }
s32 func_80950280(EnGm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80950280(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 phi_v1; s32 phi_v1;
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
@ -1249,33 +1251,33 @@ s32 func_80950280(EnGm* this, PlayState* play, ScheduleResult* arg2) {
this->unk_3CC = 8; this->unk_3CC = 8;
this->unk_3B4 = 40.0f; this->unk_3B4 = 40.0f;
switch (arg2->result) { switch (scheduleOutput->result) {
case 1: case 1:
phi_v1 = func_8094FD88(this, play, arg2); phi_v1 = func_8094FD88(this, play, scheduleOutput);
break; break;
case 2: case 2:
phi_v1 = func_8094FE10(this, play, arg2); phi_v1 = func_8094FE10(this, play, scheduleOutput);
break; break;
case 3: case 3:
phi_v1 = func_8094FCC4(this, play, arg2); phi_v1 = func_8094FCC4(this, play, scheduleOutput);
break; break;
case 5: case 5:
phi_v1 = func_8094FF04(this, play, arg2); phi_v1 = func_8094FF04(this, play, scheduleOutput);
break; break;
case 6: case 6:
phi_v1 = func_80950088(this, play, arg2); phi_v1 = func_80950088(this, play, scheduleOutput);
break; break;
case 7: case 7:
phi_v1 = func_809501B8(this, play, arg2); phi_v1 = func_809501B8(this, play, scheduleOutput);
break; break;
case 8: case 8:
phi_v1 = func_80950120(this, play, arg2); phi_v1 = func_80950120(this, play, scheduleOutput);
break; break;
case 9: case 9:
@ -1290,7 +1292,7 @@ s32 func_80950280(EnGm* this, PlayState* play, ScheduleResult* arg2) {
case 18: case 18:
case 19: case 19:
case 20: case 20:
phi_v1 = func_8094F904(this, play, arg2); phi_v1 = func_8094F904(this, play, scheduleOutput);
break; break;
case 21: case 21:
@ -1303,7 +1305,7 @@ s32 func_80950280(EnGm* this, PlayState* play, ScheduleResult* arg2) {
case 28: case 28:
case 29: case 29:
case 30: case 30:
phi_v1 = func_8094FAC4(this, play, arg2); phi_v1 = func_8094FAC4(this, play, scheduleOutput);
break; break;
default: default:
@ -1576,7 +1578,7 @@ void func_80950C24(EnGm* this, PlayState* play) {
} }
void func_80950CDC(EnGm* this, PlayState* play) { void func_80950CDC(EnGm* this, PlayState* play) {
ScheduleResult sp20; ScheduleOutput sp20;
this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed);

View File

@ -496,7 +496,7 @@ s32 func_80BF1B40(EnIg* this, PlayState* play) {
return false; return false;
} }
s32 func_80BF1C44(EnIg* this, PlayState* play, ScheduleResult* arg2, s32 arg3, s32 arg4) { s32 func_80BF1C44(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput, s32 arg3, s32 arg4) {
u8 sp4F = ENIG_GET_FF(&this->actor); u8 sp4F = ENIG_GET_FF(&this->actor);
Vec3s* sp48; Vec3s* sp48;
Vec3f sp3C; Vec3f sp3C;
@ -508,8 +508,8 @@ s32 func_80BF1C44(EnIg* this, PlayState* play, ScheduleResult* arg2, s32 arg3, s
sp2C = func_80BF1150(this, play, arg3, arg4); sp2C = func_80BF1150(this, play, arg3, arg4);
this->timePath = NULL; this->timePath = NULL;
if (D_80BF3318[arg2->result] >= 0) { if (D_80BF3318[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80BF3318[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80BF3318[scheduleOutput->result]);
} }
if ((sp2C != NULL) && (sp2C->update != NULL)) { if ((sp2C != NULL) && (sp2C->update != NULL)) {
@ -526,10 +526,10 @@ s32 func_80BF1C44(EnIg* this, PlayState* play, ScheduleResult* arg2, s32 arg3, s
return sp24; return sp24;
} }
s32 func_80BF1D78(EnIg* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BF1D78(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 sp2C = 0; s32 sp2C = 0;
if (func_80BF1C44(this, play, arg2, ACTORCAT_NPC, ACTOR_EN_AN)) { if (func_80BF1C44(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_AN)) {
func_80BF1284(this, 0); func_80BF1284(this, 0);
SubS_UpdateFlags(&this->unk_3D0, 3, 7); SubS_UpdateFlags(&this->unk_3D0, 3, 7);
this->unk_3D0 |= 0x20; this->unk_3D0 |= 0x20;
@ -539,7 +539,7 @@ s32 func_80BF1D78(EnIg* this, PlayState* play, ScheduleResult* arg2) {
return sp2C; return sp2C;
} }
s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp56 = SCHEDULE_TIME_NOW; u16 sp56 = SCHEDULE_TIME_NOW;
u8 sp55 = ENIG_GET_FF(&this->actor); u8 sp55 = ENIG_GET_FF(&this->actor);
EnDoor* door; EnDoor* door;
@ -550,10 +550,10 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleResult* arg2) {
s32 ret = false; s32 ret = false;
this->timePath = NULL; this->timePath = NULL;
door = func_80BF1200(play, arg2->result); door = func_80BF1200(play, scheduleOutput->result);
if (D_80BF3318[arg2->result] >= 0) { if (D_80BF3318[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp55, D_80BF3318[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp55, D_80BF3318[scheduleOutput->result]);
} }
if ((door != NULL) && (door->dyna.actor.update != NULL)) { if ((door != NULL) && (door->dyna.actor.update != NULL)) {
@ -572,8 +572,8 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleResult* arg2) {
this->unk_2A4 = 75; this->unk_2A4 = 75;
} }
this->unk_3E0 = arg2->time1 - arg2->time0; this->unk_3E0 = scheduleOutput->time1 - scheduleOutput->time0;
this->unk_3E2 = sp56 - arg2->time0; this->unk_3E2 = sp56 - scheduleOutput->time0;
this->actor.flags &= ~ACTOR_FLAG_1; this->actor.flags &= ~ACTOR_FLAG_1;
this->unk_3D0 |= 0x100; this->unk_3D0 |= 0x100;
func_80BF1284(this, 3); func_80BF1284(this, 3);
@ -584,17 +584,18 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp2E = SCHEDULE_TIME_NOW; u16 sp2E = SCHEDULE_TIME_NOW;
u16 phi_v1; u16 phi_v1;
u8 sp2B = ENIG_GET_FF(&this->actor); u8 sp2B = ENIG_GET_FF(&this->actor);
s32 pad; u16 tmp;
s16 pad;
s32 ret = false; s32 ret = false;
this->timePath = NULL; this->timePath = NULL;
if (D_80BF3318[arg2->result] >= 0) { if (D_80BF3318[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80BF3318[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80BF3318[scheduleOutput->result]);
} }
if ((this->timePath != NULL) && (this->timePath->count < 3)) { if ((this->timePath != NULL) && (this->timePath->count < 3)) {
@ -605,20 +606,20 @@ s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleResult* arg2) {
if ((this->scheduleResult < 10) && (this->scheduleResult != 0) && (this->timePathTimeSpeed >= 0)) { if ((this->scheduleResult < 10) && (this->scheduleResult != 0) && (this->timePathTimeSpeed >= 0)) {
phi_v1 = sp2E; phi_v1 = sp2E;
} else { } else {
phi_v1 = arg2->time0; phi_v1 = scheduleOutput->time0;
} }
if (arg2->time1 < phi_v1) { if (scheduleOutput->time1 < phi_v1) {
this->timePathTotalTime = (phi_v1 - arg2->time1) + 0xFFFF; this->timePathTotalTime = (phi_v1 - scheduleOutput->time1) + 0xFFFF;
} else { } else {
this->timePathTotalTime = arg2->time1 - phi_v1; this->timePathTotalTime = scheduleOutput->time1 - phi_v1;
} }
this->timePathElapsedTime = sp2E - phi_v1; this->timePathElapsedTime = sp2E - phi_v1;
phi_v1 = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1); tmp = phi_v1 = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1);
this->timePathWaypointTime = this->timePathTotalTime / phi_v1; this->timePathWaypointTime = this->timePathTotalTime / tmp;
this->timePathWaypoint = this->timePathWaypoint =
(this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1); (this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1);
@ -633,7 +634,7 @@ s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u8 sp4F = ENIG_GET_FF(&this->actor); u8 sp4F = ENIG_GET_FF(&this->actor);
Vec3f sp40; Vec3f sp40;
Vec3f sp34; Vec3f sp34;
@ -643,8 +644,8 @@ s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleResult* arg2) {
this->timePath = NULL; this->timePath = NULL;
if (D_80BF3318[arg2->result] >= 0) { if (D_80BF3318[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80BF3318[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80BF3318[scheduleOutput->result]);
} }
if ((this->timePath != 0) && (this->timePath->count >= 2)) { if ((this->timePath != 0) && (this->timePath->count >= 2)) {
@ -656,7 +657,7 @@ s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleResult* arg2) {
Math_Vec3f_Copy(&this->actor.world.pos, &sp40); Math_Vec3f_Copy(&this->actor.world.pos, &sp40);
Math_Vec3f_Copy(&this->actor.prevPos, &sp40); Math_Vec3f_Copy(&this->actor.prevPos, &sp40);
switch (arg2->result) { switch (scheduleOutput->result) {
case 2: case 2:
this->actor.home.rot.y = this->actor.world.rot.y; this->actor.home.rot.y = this->actor.world.rot.y;
this->actor.home.rot.y += 0x8000; this->actor.home.rot.y += 0x8000;
@ -678,20 +679,20 @@ s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80BF2368(EnIg* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BF2368(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
this->actor.targetMode = 0; this->actor.targetMode = 0;
this->unk_3D0 = 0; this->unk_3D0 = 0;
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
switch (arg2->result) { switch (scheduleOutput->result) {
case 5: case 5:
case 6: case 6:
case 7: case 7:
case 8: case 8:
case 9: case 9:
ret = func_80BF1DF4(this, play, arg2); ret = func_80BF1DF4(this, play, scheduleOutput);
break; break;
case 10: case 10:
@ -699,16 +700,16 @@ s32 func_80BF2368(EnIg* this, PlayState* play, ScheduleResult* arg2) {
case 12: case 12:
case 13: case 13:
case 14: case 14:
ret = func_80BF1FA8(this, play, arg2); ret = func_80BF1FA8(this, play, scheduleOutput);
break; break;
case 2: case 2:
case 4: case 4:
ret = func_80BF219C(this, play, arg2); ret = func_80BF219C(this, play, scheduleOutput);
break; break;
case 3: case 3:
ret = func_80BF1D78(this, play, arg2); ret = func_80BF1D78(this, play, scheduleOutput);
break; break;
} }
return ret; return ret;
@ -873,7 +874,7 @@ void func_80BF2A50(EnIg* this, PlayState* play) {
} }
void func_80BF2AF8(EnIg* this, PlayState* play) { void func_80BF2AF8(EnIg* this, PlayState* play) {
ScheduleResult sp20; ScheduleOutput sp20;
this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed);

View File

@ -239,7 +239,7 @@ void func_80BC1E40(EnJa* this, PlayState* play) {
this->unk_374 = sp20; this->unk_374 = sp20;
} }
s32 func_80BC1FC8(EnJa* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BC1FC8(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
if (func_80BC1AE0(this, play)) { if (func_80BC1AE0(this, play)) {
@ -252,7 +252,7 @@ s32 func_80BC1FC8(EnJa* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80BC203C(EnJa* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BC203C(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
if (func_80BC1AE0(this, play)) { if (func_80BC1AE0(this, play)) {
@ -269,19 +269,19 @@ s32 func_80BC203C(EnJa* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80BC20D0(EnJa* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BC20D0(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
this->unk_340 = 0; this->unk_340 = 0;
switch (arg2->result) { switch (scheduleOutput->result) {
case 1: case 1:
ret = func_80BC1FC8(this, play, arg2); ret = func_80BC1FC8(this, play, scheduleOutput);
if (ret == 1) {} if (ret == true) {}
break; break;
case 2: case 2:
ret = func_80BC203C(this, play, arg2); ret = func_80BC203C(this, play, scheduleOutput);
break; break;
} }
return ret; return ret;
@ -299,7 +299,7 @@ void func_80BC2150(EnJa* this, PlayState* play) {
} }
void func_80BC21A8(EnJa* this, PlayState* play) { void func_80BC21A8(EnJa* this, PlayState* play) {
ScheduleResult sp18; ScheduleOutput sp18;
this->unk_35C = REG(15) + ((void)0, gSaveContext.save.daySpeed); this->unk_35C = REG(15) + ((void)0, gSaveContext.save.daySpeed);
if (!Schedule_RunScript(play, D_80BC35F0, &sp18) || if (!Schedule_RunScript(play, D_80BC35F0, &sp18) ||

View File

@ -1196,7 +1196,7 @@ s32 func_80AF8DD4(EnPm* this, PlayState* play) {
return 0; return 0;
} }
s32 func_80AF8ED4(EnPm* this, PlayState* play, ScheduleResult* arg2, u8 actorCat, s16 actorId) { s32 func_80AF8ED4(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput, u8 actorCat, s16 actorId) {
u8 sp4F = this->actor.params & 0xFF; u8 sp4F = this->actor.params & 0xFF;
Vec3s* sp48; Vec3s* sp48;
Vec3f sp3C; Vec3f sp3C;
@ -1207,8 +1207,8 @@ s32 func_80AF8ED4(EnPm* this, PlayState* play, ScheduleResult* arg2, u8 actorCat
this->timePath = NULL; this->timePath = NULL;
sp2C = func_80AF7CB0(this, play, actorCat, actorId); sp2C = func_80AF7CB0(this, play, actorCat, actorId);
if (D_80AFB430[arg2->result] >= 0) { if (D_80AFB430[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80AFB430[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80AFB430[scheduleOutput->result]);
} }
if ((sp2C != NULL) && (sp2C->update != NULL)) { if ((sp2C != NULL) && (sp2C->update != NULL)) {
@ -1226,7 +1226,7 @@ s32 func_80AF8ED4(EnPm* this, PlayState* play, ScheduleResult* arg2, u8 actorCat
return ret; return ret;
} }
s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp56 = SCHEDULE_TIME_NOW; u16 sp56 = SCHEDULE_TIME_NOW;
u8 sp55 = this->actor.params & 0xFF; u8 sp55 = this->actor.params & 0xFF;
EnDoor* door; EnDoor* door;
@ -1237,9 +1237,9 @@ s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleResult* arg2) {
s32 ret = false; s32 ret = false;
this->timePath = NULL; this->timePath = NULL;
door = func_80AF7D60(play, arg2->result); door = func_80AF7D60(play, scheduleOutput->result);
if (D_80AFB430[arg2->result] >= 0) { if (D_80AFB430[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp55, D_80AFB430[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp55, D_80AFB430[scheduleOutput->result]);
} }
if ((door != NULL) && (door->dyna.actor.update != NULL)) { if ((door != NULL) && (door->dyna.actor.update != NULL)) {
@ -1258,8 +1258,8 @@ s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleResult* arg2) {
this->unk_260 = 0x4B; this->unk_260 = 0x4B;
} }
this->unk_36C = arg2->time1 - arg2->time0; this->unk_36C = scheduleOutput->time1 - scheduleOutput->time0;
this->unk_36E = sp56 - arg2->time0; this->unk_36E = sp56 - scheduleOutput->time0;
this->actor.flags &= ~ACTOR_FLAG_1; this->actor.flags &= ~ACTOR_FLAG_1;
if (gSaveContext.save.weekEventReg[90] & 8) { if (gSaveContext.save.weekEventReg[90] & 8) {
this->unk_356 |= 0x800; this->unk_356 |= 0x800;
@ -1274,17 +1274,18 @@ s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp2E = SCHEDULE_TIME_NOW; u16 sp2E = SCHEDULE_TIME_NOW;
u16 phi_v1; u16 phi_v1;
u8 sp2B = this->actor.params & 0xFF; u8 sp2B = this->actor.params & 0xFF;
s32 pad; u16 tmp;
s16 pad;
s32 ret = false; s32 ret = false;
this->timePath = NULL; this->timePath = NULL;
if (D_80AFB430[arg2->result] >= 0) { if (D_80AFB430[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80AFB430[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80AFB430[scheduleOutput->result]);
} }
if ((this->timePath != NULL) && (this->timePath->count < 3)) { if ((this->timePath != NULL) && (this->timePath->count < 3)) {
@ -1295,18 +1296,18 @@ s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
if ((this->unk_258 < 38) && (this->unk_258 != 0) && (this->timePathTimeSpeed >= 0)) { if ((this->unk_258 < 38) && (this->unk_258 != 0) && (this->timePathTimeSpeed >= 0)) {
phi_v1 = sp2E; phi_v1 = sp2E;
} else { } else {
phi_v1 = arg2->time0; phi_v1 = scheduleOutput->time0;
} }
if (arg2->time1 < phi_v1) { if (scheduleOutput->time1 < phi_v1) {
this->timePathTotalTime = (phi_v1 - arg2->time1) + 0xFFFF; this->timePathTotalTime = (phi_v1 - scheduleOutput->time1) + 0xFFFF;
} else { } else {
this->timePathTotalTime = arg2->time1 - phi_v1; this->timePathTotalTime = scheduleOutput->time1 - phi_v1;
} }
this->timePathElapsedTime = sp2E - phi_v1; this->timePathElapsedTime = sp2E - phi_v1;
phi_v1 = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1); tmp = phi_v1 = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1);
this->timePathWaypointTime = this->timePathTotalTime / phi_v1; this->timePathWaypointTime = this->timePathTotalTime / tmp;
this->timePathWaypoint = this->timePathWaypoint =
(this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1); (this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1);
this->unk_356 &= ~8; this->unk_356 &= ~8;
@ -1316,7 +1317,7 @@ s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
Flags_UnsetSwitch(play, 0); Flags_UnsetSwitch(play, 0);
} }
switch (arg2->result) { switch (scheduleOutput->result) {
case 83: case 83:
case 84: case 84:
case 85: case 85:
@ -1355,7 +1356,7 @@ s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80AF94AC(EnPm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AF94AC(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u8 sp4F = this->actor.params & 0xFF; u8 sp4F = this->actor.params & 0xFF;
Vec3f sp40; Vec3f sp40;
Vec3f sp34; Vec3f sp34;
@ -1364,8 +1365,8 @@ s32 func_80AF94AC(EnPm* this, PlayState* play, ScheduleResult* arg2) {
s32 ret = false; s32 ret = false;
this->timePath = NULL; this->timePath = NULL;
if (D_80AFB430[arg2->result] >= 0) { if (D_80AFB430[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80AFB430[arg2->result]); this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80AFB430[scheduleOutput->result]);
} }
if ((this->timePath != 0) && (this->timePath->count >= 2)) { if ((this->timePath != 0) && (this->timePath->count >= 2)) {
@ -1376,7 +1377,7 @@ s32 func_80AF94AC(EnPm* this, PlayState* play, ScheduleResult* arg2) {
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot); Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
Math_Vec3f_Copy(&this->actor.world.pos, &sp40); Math_Vec3f_Copy(&this->actor.world.pos, &sp40);
Math_Vec3f_Copy(&this->actor.prevPos, &sp40); Math_Vec3f_Copy(&this->actor.prevPos, &sp40);
if (arg2->result == 24) { if (scheduleOutput->result == 24) {
Flags_UnsetSwitch(play, 0); Flags_UnsetSwitch(play, 0);
Flags_UnsetSwitch(play, 1); Flags_UnsetSwitch(play, 1);
this->unk_394 = EXCH_ITEM_NONE; this->unk_394 = EXCH_ITEM_NONE;
@ -1388,7 +1389,7 @@ s32 func_80AF94AC(EnPm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u8 sp4F = this->actor.params & 0xFF; u8 sp4F = this->actor.params & 0xFF;
Vec3f sp40; Vec3f sp40;
Vec3f sp34; Vec3f sp34;
@ -1397,13 +1398,13 @@ s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
s32 ret = false; s32 ret = false;
s32 phi_a3 = -1; s32 phi_a3 = -1;
switch (arg2->result) { switch (scheduleOutput->result) {
case 3: case 3:
case 4: case 4:
case 5: case 5:
case 6: case 6:
case 7: case 7:
phi_a3 = arg2->result - 3; phi_a3 = scheduleOutput->result - 3;
break; break;
case 19: case 19:
@ -1416,7 +1417,7 @@ s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
} }
this->timePath = NULL; this->timePath = NULL;
phi_a3 = D_80AFB430[arg2->result]; phi_a3 = D_80AFB430[scheduleOutput->result];
if (phi_a3 >= 0) { if (phi_a3 >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp4F, phi_a3); this->timePath = SubS_GetAdditionalPath(play, sp4F, phi_a3);
} }
@ -1430,7 +1431,7 @@ s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
Math_Vec3f_Copy(&this->actor.world.pos, &sp40); Math_Vec3f_Copy(&this->actor.world.pos, &sp40);
Math_Vec3f_Copy(&this->actor.prevPos, &sp40); Math_Vec3f_Copy(&this->actor.prevPos, &sp40);
switch (arg2->result) { switch (scheduleOutput->result) {
case 27: case 27:
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ROOM_CARTAIN); Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_ROOM_CARTAIN);
Flags_SetSwitch(play, 0); Flags_SetSwitch(play, 0);
@ -1462,7 +1463,7 @@ s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
gSaveContext.save.weekEventReg[60] |= 4; gSaveContext.save.weekEventReg[60] |= 4;
default: default:
if (arg2->result == 0x1D) { if (scheduleOutput->result == 29) {
this->actor.world.rot.y = BINANG_ROT180(this->actor.world.rot.y); this->actor.world.rot.y = BINANG_ROT180(this->actor.world.rot.y);
} }
SubS_UpdateFlags(&this->unk_356, 3, 7); SubS_UpdateFlags(&this->unk_356, 3, 7);
@ -1475,7 +1476,7 @@ s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80AF98A0(EnPm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AF98A0(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
if (Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_MM3, 116.0f, 26.0f, -219.0f, 0, -0x3F46, 0, if (Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_MM3, 116.0f, 26.0f, -219.0f, 0, -0x3F46, 0,
@ -1486,7 +1487,7 @@ s32 func_80AF98A0(EnPm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80AF992C(EnPm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AF992C(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
static Vec3f D_80AFB8EC = { 116.0f, 26.0f, -219.0f }; static Vec3f D_80AFB8EC = { 116.0f, 26.0f, -219.0f };
static Vec3s D_80AFB8F8 = { 0x0000, 0xC0BA, 0x0000 }; static Vec3s D_80AFB8F8 = { 0x0000, 0xC0BA, 0x0000 };
s32 pad; s32 pad;
@ -1498,7 +1499,7 @@ s32 func_80AF992C(EnPm* this, PlayState* play, ScheduleResult* arg2) {
this->actor.targetMode = 6; this->actor.targetMode = 6;
this->actor.gravity = -1.0f; this->actor.gravity = -1.0f;
this->unk_368 = 80.0f; this->unk_368 = 80.0f;
if (arg2->result == 14) { if (scheduleOutput->result == 14) {
this->unk_356 &= ~0x200; this->unk_356 &= ~0x200;
func_80AF7E98(this, 13); func_80AF7E98(this, 13);
} else { } else {
@ -1508,10 +1509,10 @@ s32 func_80AF992C(EnPm* this, PlayState* play, ScheduleResult* arg2) {
return true; return true;
} }
s32 func_80AF9A0C(EnPm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AF9A0C(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
if (func_80AF8ED4(this, play, arg2, ACTORCAT_NPC, ACTOR_EN_AN)) { if (func_80AF8ED4(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_AN)) {
SubS_UpdateFlags(&this->unk_356, 3, 7); SubS_UpdateFlags(&this->unk_356, 3, 7);
this->unk_356 |= 0x20; this->unk_356 |= 0x20;
this->unk_356 |= 0x9000; this->unk_356 |= 0x9000;
@ -1526,10 +1527,10 @@ s32 func_80AF9A0C(EnPm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80AF9AB0(EnPm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AF9AB0(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
if (func_80AF8ED4(this, play, arg2, ACTORCAT_NPC, ACTOR_EN_TEST3)) { if (func_80AF8ED4(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_TEST3)) {
SubS_UpdateFlags(&this->unk_356, 3, 7); SubS_UpdateFlags(&this->unk_356, 3, 7);
this->unk_356 |= 0x20; this->unk_356 |= 0x20;
this->unk_356 |= 0x9000; this->unk_356 |= 0x9000;
@ -1544,10 +1545,10 @@ s32 func_80AF9AB0(EnPm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80AF9B54(EnPm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AF9B54(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
if (func_80AF8ED4(this, play, arg2, ACTORCAT_NPC, ACTOR_EN_AL)) { if (func_80AF8ED4(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_AL)) {
SubS_UpdateFlags(&this->unk_356, 3, 7); SubS_UpdateFlags(&this->unk_356, 3, 7);
this->unk_356 |= 0x9000; this->unk_356 |= 0x9000;
this->unk_356 |= 0x20; this->unk_356 |= 0x20;
@ -1562,7 +1563,7 @@ s32 func_80AF9B54(EnPm* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80AF9BF8(EnPm* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AF9BF8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret; s32 ret;
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
@ -1571,25 +1572,25 @@ s32 func_80AF9BF8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
this->unk_356 = 0; this->unk_356 = 0;
this->unk_368 = 40.0f; this->unk_368 = 40.0f;
switch (arg2->result) { switch (scheduleOutput->result) {
case 16: case 16:
ret = func_80AF9A0C(this, play, arg2); ret = func_80AF9A0C(this, play, scheduleOutput);
break; break;
case 17: case 17:
ret = func_80AF9AB0(this, play, arg2); ret = func_80AF9AB0(this, play, scheduleOutput);
break; break;
case 28: case 28:
ret = func_80AF9B54(this, play, arg2); ret = func_80AF9B54(this, play, scheduleOutput);
break; break;
case 24: case 24:
ret = func_80AF94AC(this, play, arg2); ret = func_80AF94AC(this, play, scheduleOutput);
break; break;
case 29: case 29:
ret = func_80AF95E8(this, play, arg2); ret = func_80AF95E8(this, play, scheduleOutput);
break; break;
case 1: case 1:
@ -1604,7 +1605,7 @@ s32 func_80AF9BF8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
case 35: case 35:
case 36: case 36:
case 37: case 37:
ret = func_80AF9008(this, play, arg2); ret = func_80AF9008(this, play, scheduleOutput);
break; break;
case 3: case 3:
@ -1617,11 +1618,11 @@ s32 func_80AF9BF8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
case 23: case 23:
case 25: case 25:
case 27: case 27:
ret = func_80AF95E8(this, play, arg2); ret = func_80AF95E8(this, play, scheduleOutput);
break; break;
case 8: case 8:
ret = func_80AF98A0(this, play, arg2); ret = func_80AF98A0(this, play, scheduleOutput);
break; break;
case 9: case 9:
@ -1629,7 +1630,7 @@ s32 func_80AF9BF8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
case 20: case 20:
case 21: case 21:
case 22: case 22:
ret = func_80AF992C(this, play, arg2); ret = func_80AF992C(this, play, scheduleOutput);
break; break;
case 38: case 38:
@ -1686,7 +1687,7 @@ s32 func_80AF9BF8(EnPm* this, PlayState* play, ScheduleResult* arg2) {
case 89: case 89:
case 90: case 90:
case 91: case 91:
ret = func_80AF91E8(this, play, arg2); ret = func_80AF91E8(this, play, scheduleOutput);
break; break;
default: default:
@ -1988,7 +1989,7 @@ void func_80AFA4D0(EnPm* this, PlayState* play) {
}; };
u16 time = gSaveContext.save.time; u16 time = gSaveContext.save.time;
u16 sp3C = 0; u16 sp3C = 0;
ScheduleResult sp2C; ScheduleOutput sp2C;
this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed);
if (this->unk_38C != 0) { if (this->unk_38C != 0) {

View File

@ -673,16 +673,14 @@ void func_80BABB90(EnSuttari* this, s32 arg1) {
} }
} }
s32 func_80BABC48(EnSuttari* this, PlayState* play, ScheduleResult* scheduleResult) { s32 func_80BABC48(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp26 = SCHEDULE_TIME_NOW; u16 sp26 = SCHEDULE_TIME_NOW;
u16 pad1;
u8 sp23 = ENSUTTARI_GET_PATH(&this->actor);
u16 pad2;
s32 sp1C = D_80BAE8F8[scheduleResult->result];
u16 phi_a0; u16 phi_a0;
u8 sp23 = ENSUTTARI_GET_PATH(&this->actor);
u16 tmp;
if (sp1C >= 0) { if (D_80BAE8F8[scheduleOutput->result] >= 0) {
this->timePath = SubS_GetAdditionalPath(play, sp23, sp1C); this->timePath = SubS_GetAdditionalPath(play, sp23, D_80BAE8F8[scheduleOutput->result]);
} }
if (this->timePath == NULL) { if (this->timePath == NULL) {
return 0; return 0;
@ -690,23 +688,23 @@ s32 func_80BABC48(EnSuttari* this, PlayState* play, ScheduleResult* scheduleResu
if ((this->unk428 != 0 && this->unk428 < 0xC) && (this->timePathTimeSpeed >= 0)) { if ((this->unk428 != 0 && this->unk428 < 0xC) && (this->timePathTimeSpeed >= 0)) {
phi_a0 = sp26; phi_a0 = sp26;
} else { } else {
phi_a0 = scheduleResult->time0; phi_a0 = scheduleOutput->time0;
} }
if (scheduleResult->time1 < phi_a0) { if (scheduleOutput->time1 < phi_a0) {
this->timePathTotalTime = (phi_a0 - scheduleResult->time1) + 0xFFFF; this->timePathTotalTime = (phi_a0 - scheduleOutput->time1) + 0xFFFF;
} else { } else {
this->timePathTotalTime = scheduleResult->time1 - phi_a0; this->timePathTotalTime = scheduleOutput->time1 - phi_a0;
} }
this->timePathElapsedTime = sp26 - phi_a0; this->timePathElapsedTime = sp26 - phi_a0;
phi_a0 = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1); tmp = phi_a0 = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1);
this->unk42C = 0; this->unk42C = 0;
this->timePathWaypointTime = this->timePathTotalTime / phi_a0; this->timePathWaypointTime = this->timePathTotalTime / tmp;
this->timePathWaypoint = (this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1); this->timePathWaypoint = (this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1);
this->unk430 = 0; this->unk430 = 0;
return 1; return 1;
} }
s32 func_80BABDD8(EnSuttari* this, PlayState* play, ScheduleResult* scheduleResult) { s32 func_80BABDD8(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 pad; s32 pad;
EnDoor* sp48; EnDoor* sp48;
u8 sp47 = ENSUTTARI_GET_PATH(&this->actor); u8 sp47 = ENSUTTARI_GET_PATH(&this->actor);
@ -720,7 +718,7 @@ s32 func_80BABDD8(EnSuttari* this, PlayState* play, ScheduleResult* scheduleResu
return 0; return 0;
} }
sp48 = (EnDoor*)SubS_FindNearestActor(&this->actor, play, ACTORCAT_DOOR, ACTOR_EN_DOOR); sp48 = (EnDoor*)SubS_FindNearestActor(&this->actor, play, ACTORCAT_DOOR, ACTOR_EN_DOOR);
sp24 = D_80BAE8F8[scheduleResult->result]; sp24 = D_80BAE8F8[scheduleOutput->result];
if ((sp48 != NULL) && (sp24 >= 0)) { if ((sp48 != NULL) && (sp24 >= 0)) {
this->timePath = SubS_GetAdditionalPath(play, sp47, sp24); this->timePath = SubS_GetAdditionalPath(play, sp47, sp24);
} }
@ -730,9 +728,9 @@ s32 func_80BABDD8(EnSuttari* this, PlayState* play, ScheduleResult* scheduleResu
sp28 = Lib_SegmentedToVirtual(this->timePath->points); sp28 = Lib_SegmentedToVirtual(this->timePath->points);
Math_Vec3s_ToVec3f(&sp38, &sp28[0]); Math_Vec3s_ToVec3f(&sp38, &sp28[0]);
Math_Vec3s_ToVec3f(&sp2C, &sp28[1]); Math_Vec3s_ToVec3f(&sp2C, &sp28[1]);
this->unk434 = sp44 - scheduleResult->time0; this->unk434 = sp44 - scheduleOutput->time0;
this->unk436 = scheduleResult->time1 - scheduleResult->time0; this->unk436 = scheduleOutput->time1 - scheduleOutput->time0;
if (scheduleResult->result != 10 && scheduleResult->result != 11) { if (scheduleOutput->result != 10 && scheduleOutput->result != 11) {
sp48->unk_1A7 = 0x4B; sp48->unk_1A7 = 0x4B;
} }
Math_Vec3f_Copy(&this->unk438, &sp38); Math_Vec3f_Copy(&this->unk438, &sp38);
@ -742,15 +740,15 @@ s32 func_80BABDD8(EnSuttari* this, PlayState* play, ScheduleResult* scheduleResu
return 1; return 1;
} }
s32 func_80BABF64(EnSuttari* this, PlayState* play, ScheduleResult* scheduleResult) { s32 func_80BABF64(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret; s32 ret;
switch (scheduleResult->result) { switch (scheduleOutput->result) {
case 15: case 15:
case 14: case 14:
case 13: case 13:
case 12: case 12:
ret = func_80BABC48(this, play, scheduleResult); ret = func_80BABC48(this, play, scheduleOutput);
break; break;
case 11: case 11:
case 10: case 10:
@ -758,7 +756,7 @@ s32 func_80BABF64(EnSuttari* this, PlayState* play, ScheduleResult* scheduleResu
case 8: case 8:
case 7: case 7:
case 6: case 6:
ret = func_80BABDD8(this, play, scheduleResult); ret = func_80BABDD8(this, play, scheduleOutput);
break; break;
case 5: case 5:
case 4: case 4:
@ -1100,17 +1098,17 @@ void func_80BACE4C(EnSuttari* this, PlayState* play) {
} }
void func_80BACEE0(EnSuttari* this, PlayState* play) { void func_80BACEE0(EnSuttari* this, PlayState* play) {
ScheduleResult scheduleResult; ScheduleOutput scheduleOutput;
this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleResult) || if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleResult.result) && !func_80BABF64(this, play, &scheduleResult))) { ((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
this->actor.flags &= ~ACTOR_FLAG_1; this->actor.flags &= ~ACTOR_FLAG_1;
scheduleResult.result = 0; scheduleOutput.result = 0;
} else { } else {
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
} }
this->unk428 = scheduleResult.result; this->unk428 = scheduleOutput.result;
func_80BAC2FC(this, play); func_80BAC2FC(this, play);
func_80BAB434(this); func_80BAB434(this);
if (this->unk428 == 5) { if (this->unk428 == 5) {
@ -1124,17 +1122,17 @@ void func_80BACEE0(EnSuttari* this, PlayState* play) {
} }
void func_80BAD004(EnSuttari* this, PlayState* play) { void func_80BAD004(EnSuttari* this, PlayState* play) {
ScheduleResult scheduleResult; ScheduleOutput scheduleOutput;
this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleResult) || if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleResult.result) && !func_80BABF64(this, play, &scheduleResult))) { ((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
this->actor.flags &= ~ACTOR_FLAG_1; this->actor.flags &= ~ACTOR_FLAG_1;
scheduleResult.result = 0; scheduleOutput.result = 0;
} else { } else {
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
} }
this->unk428 = scheduleResult.result; this->unk428 = scheduleOutput.result;
func_80BAC2FC(this, play); func_80BAC2FC(this, play);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, 0x2A3A, &this->actor); Message_StartTextbox(play, 0x2A3A, &this->actor);
@ -1245,7 +1243,7 @@ void func_80BAD380(EnSuttari* this, PlayState* play) {
} }
void func_80BAD5F8(EnSuttari* this, PlayState* play) { void func_80BAD5F8(EnSuttari* this, PlayState* play) {
ScheduleResult scheduleResult; ScheduleOutput scheduleOutput;
s16 curFrame = this->skelAnime.curFrame; s16 curFrame = this->skelAnime.curFrame;
s16 frameCount = Animation_GetLastFrame(sAnimations[this->animationIndex].animation); s16 frameCount = Animation_GetLastFrame(sAnimations[this->animationIndex].animation);
@ -1254,21 +1252,21 @@ void func_80BAD5F8(EnSuttari* this, PlayState* play) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animationIndex); Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animationIndex);
} }
this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleResult) || if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleResult.result) && !func_80BABF64(this, play, &scheduleResult))) { ((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
this->actor.flags &= ~ACTOR_FLAG_1; this->actor.flags &= ~ACTOR_FLAG_1;
scheduleResult.result = 0; scheduleOutput.result = 0;
} else { } else {
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
} }
this->unk428 = scheduleResult.result; this->unk428 = scheduleOutput.result;
func_80BAC2FC(this, play); func_80BAC2FC(this, play);
if ((this->unk430 == 1) && (this->timePath->unk1 == 0xFF)) { if ((this->unk430 == 1) && (this->timePath->unk1 == 0xFF)) {
Actor_MarkForDeath(&this->actor); Actor_MarkForDeath(&this->actor);
return; return;
} }
func_80BAB434(this); func_80BAB434(this);
if ((this->flags1 & 0x20) && (this->unk430 == 0) && (scheduleResult.result != 7)) { if ((this->flags1 & 0x20) && (this->unk430 == 0) && (scheduleOutput.result != 7)) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, 0x2A02, &this->actor); Message_StartTextbox(play, 0x2A02, &this->actor);
this->actionFunc = func_80BAD130; this->actionFunc = func_80BAD130;
@ -1280,7 +1278,7 @@ void func_80BAD5F8(EnSuttari* this, PlayState* play) {
} }
void func_80BAD7F8(EnSuttari* this, PlayState* play) { void func_80BAD7F8(EnSuttari* this, PlayState* play) {
ScheduleResult scheduleResult; ScheduleOutput scheduleOutput;
s16 curFrame = this->skelAnime.curFrame; s16 curFrame = this->skelAnime.curFrame;
s16 frameCount = Animation_GetLastFrame(sAnimations[this->animationIndex].animation); s16 frameCount = Animation_GetLastFrame(sAnimations[this->animationIndex].animation);
@ -1292,20 +1290,20 @@ void func_80BAD7F8(EnSuttari* this, PlayState* play) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animationIndex); Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, this->animationIndex);
} }
this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed); this->timePathTimeSpeed = REG(15) + ((void)0, gSaveContext.save.daySpeed);
if (!Schedule_RunScript(play, D_80BAE820, &scheduleResult) || if (!Schedule_RunScript(play, D_80BAE820, &scheduleOutput) ||
((this->unk428 != scheduleResult.result) && !func_80BABF64(this, play, &scheduleResult))) { ((this->unk428 != scheduleOutput.result) && !func_80BABF64(this, play, &scheduleOutput))) {
this->actor.flags &= ~ACTOR_FLAG_1; this->actor.flags &= ~ACTOR_FLAG_1;
scheduleResult.result = 0; scheduleOutput.result = 0;
} else { } else {
this->actor.flags |= ACTOR_FLAG_1; this->actor.flags |= ACTOR_FLAG_1;
} }
this->unk428 = scheduleResult.result; this->unk428 = scheduleOutput.result;
func_80BAC2FC(this, play); func_80BAC2FC(this, play);
if ((this->unk430 == 1) && (this->timePath->unk1 == 0xFF)) { if ((this->unk430 == 1) && (this->timePath->unk1 == 0xFF)) {
Actor_MarkForDeath(&this->actor); Actor_MarkForDeath(&this->actor);
return; return;
} }
if ((this->flags1 & 0x20) && (scheduleResult.result != 9)) { if ((this->flags1 & 0x20) && (scheduleOutput.result != 9)) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, 0x2A02, &this->actor); Message_StartTextbox(play, 0x2A02, &this->actor);
this->actionFunc = func_80BAD130; this->actionFunc = func_80BAD130;

View File

@ -366,7 +366,7 @@ s32* func_80BE0E04(EnTab* this, PlayState* play) {
return NULL; return NULL;
} }
s32 func_80BE0F04(EnTab* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BE0F04(EnTab* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret = false; s32 ret = false;
EnGm* sp28 = func_80BE04E0(this, play, ACTORCAT_NPC, ACTOR_EN_GM); EnGm* sp28 = func_80BE04E0(this, play, ACTORCAT_NPC, ACTOR_EN_GM);
@ -385,7 +385,7 @@ s32 func_80BE0F04(EnTab* this, PlayState* play, ScheduleResult* arg2) {
return ret; return ret;
} }
s32 func_80BE0FC4(EnTab* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BE0FC4(EnTab* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 pad; s32 pad;
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BE1B04); Math_Vec3f_Copy(&this->actor.world.pos, &D_80BE1B04);
@ -399,18 +399,18 @@ s32 func_80BE0FC4(EnTab* this, PlayState* play, ScheduleResult* arg2) {
return true; return true;
} }
s32 func_80BE1060(EnTab* this, PlayState* play, ScheduleResult* arg2) { s32 func_80BE1060(EnTab* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 ret; s32 ret;
this->unk_2FC = 0; this->unk_2FC = 0;
switch (arg2->result) { switch (scheduleOutput->result) {
case 1: case 1:
ret = func_80BE0F04(this, play, arg2); ret = func_80BE0F04(this, play, scheduleOutput);
break; break;
case 2: case 2:
ret = func_80BE0FC4(this, play, arg2); ret = func_80BE0FC4(this, play, scheduleOutput);
break; break;
default: default:
@ -472,7 +472,7 @@ void func_80BE1224(EnTab* this, PlayState* play) {
} }
void func_80BE127C(EnTab* this, PlayState* play) { void func_80BE127C(EnTab* this, PlayState* play) {
ScheduleResult sp18; ScheduleOutput sp18;
this->unk_31A = REG(15) + ((void)0, gSaveContext.save.daySpeed); this->unk_31A = REG(15) + ((void)0, gSaveContext.save.daySpeed);

View File

@ -24,8 +24,8 @@ void func_80AECB0C(EnTk* this, PlayState* play);
void func_80AECB6C(EnTk* this, PlayState* play); void func_80AECB6C(EnTk* this, PlayState* play);
void func_80AECE0C(EnTk* this, PlayState* play); void func_80AECE0C(EnTk* this, PlayState* play);
s32 func_80AECE60(EnTk* this, PlayState* play); s32 func_80AECE60(EnTk* this, PlayState* play);
s32 func_80AED354(EnTk* this, PlayState* play, ScheduleResult* arg2); s32 func_80AED354(EnTk* this, PlayState* play, ScheduleOutput* scheduleOutput);
s32 func_80AED38C(EnTk* this, PlayState* play, ScheduleResult* arg2); s32 func_80AED38C(EnTk* this, PlayState* play, ScheduleOutput* scheduleOutput);
void func_80AED4F8(EnTk* this, PlayState* play); void func_80AED4F8(EnTk* this, PlayState* play);
void func_80AED610(EnTk* this, PlayState* play); void func_80AED610(EnTk* this, PlayState* play);
void func_80AED898(EnTk* this, PlayState* play); void func_80AED898(EnTk* this, PlayState* play);
@ -312,7 +312,7 @@ void func_80AECB6C(EnTk* this, PlayState* play) {
s32 temp3; s32 temp3;
f32 sp48; f32 sp48;
f32 sp44; f32 sp44;
ScheduleResult sp34; ScheduleOutput sp34;
u8 temp4; u8 temp4;
this->actor.textId = 0; this->actor.textId = 0;
@ -492,22 +492,23 @@ s32 func_80AECE60(EnTk* this, PlayState* play) {
return false; return false;
} }
s32 func_80AED354(EnTk* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AED354(EnTk* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 phi_v1 = false; s32 phi_v1 = false;
if (arg2->result != 0) { if (scheduleOutput->result != 0) {
phi_v1 = func_80AED38C(this, play, arg2); phi_v1 = func_80AED38C(this, play, scheduleOutput);
} }
return phi_v1; return phi_v1;
} }
s32 func_80AED38C(EnTk* this, PlayState* play, ScheduleResult* arg2) { s32 func_80AED38C(EnTk* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp1E = SCHEDULE_TIME_NOW; u16 sp1E = SCHEDULE_TIME_NOW;
u8 params = ENTK_GET_F800(&this->actor); u8 params = ENTK_GET_F800(&this->actor);
u16 phi_a1; u16 phi_a1;
s32 idx = arg2->result - 1; s32 index = scheduleOutput->result - 1;
u16 tmp;
this->timePath = SubS_GetAdditionalPath(play, params, D_80AEF8E8[idx + 1]); this->timePath = SubS_GetAdditionalPath(play, params, D_80AEF8E8[index + 1]);
if (this->timePath == NULL) { if (this->timePath == NULL) {
return false; return false;
} }
@ -515,13 +516,13 @@ s32 func_80AED38C(EnTk* this, PlayState* play, ScheduleResult* arg2) {
if ((this->unk_3CC <= 0) && (this->unk_3CC != 0) && (this->timePathTimeSpeed >= 0)) { if ((this->unk_3CC <= 0) && (this->unk_3CC != 0) && (this->timePathTimeSpeed >= 0)) {
phi_a1 = sp1E; phi_a1 = sp1E;
} else { } else {
phi_a1 = arg2->time0; phi_a1 = scheduleOutput->time0;
} }
this->timePathTotalTime = arg2->time1 - phi_a1; this->timePathTotalTime = scheduleOutput->time1 - phi_a1;
this->timePathElapsedTime = sp1E - phi_a1; this->timePathElapsedTime = sp1E - phi_a1;
phi_a1 = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1); tmp = phi_a1 = this->timePath->count - (SUBS_TIME_PATHING_ORDER - 1);
this->timePathWaypointTime = this->timePathTotalTime / phi_a1; this->timePathWaypointTime = this->timePathTotalTime / tmp;
this->timePathWaypoint = (this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1); this->timePathWaypoint = (this->timePathElapsedTime / this->timePathWaypointTime) + (SUBS_TIME_PATHING_ORDER - 1);
this->unk_3CE &= ~4; this->unk_3CE &= ~4;
this->unk_3CE &= ~8; this->unk_3CE &= ~8;

View File

@ -205,11 +205,11 @@ void EnZo_LookAtPlayer(EnZo* this, PlayState* play) {
} }
void EnZo_Walk(EnZo* this, PlayState* play) { void EnZo_Walk(EnZo* this, PlayState* play) {
if (ENZO_GET_PATH(&this->actor) != ENZO_NO_PATH) { if (ENZO_GET_PATH(&this->actor) != 0x3F) {
EnZo_SetAnimation(&this->skelAnime, 6); EnZo_SetAnimation(&this->skelAnime, 6);
} }
if (ENZO_GET_PATH(&this->actor) != ENZO_NO_PATH) { if (ENZO_GET_PATH(&this->actor) != 0x3F) {
this->actionFunc = EnZo_FollowPath; this->actionFunc = EnZo_FollowPath;
} else { } else {
this->actionFunc = EnZo_DoNothing; this->actionFunc = EnZo_DoNothing;
@ -263,7 +263,7 @@ void EnZo_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit); CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->path = SubS_GetPathByIndex(play, ENZO_GET_PATH(&this->actor), ENZO_NO_PATH); this->path = SubS_GetPathByIndex(play, ENZO_GET_PATH(&this->actor), 0x3F);
Actor_SetScale(&this->actor, 0.01f); Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = EnZo_Walk; this->actionFunc = EnZo_Walk;

View File

@ -9,7 +9,6 @@ struct EnZo;
typedef void (*EnZoActionFunc)(struct EnZo*, PlayState*); typedef void (*EnZoActionFunc)(struct EnZo*, PlayState*);
#define ENZO_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9) #define ENZO_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
#define ENZO_NO_PATH 0x3F
typedef struct EnZo { typedef struct EnZo {
/* 0x000 */ Actor actor; /* 0x000 */ Actor actor;

View File

@ -43,11 +43,11 @@ static u8 sScheduleScript[] = {
void ObjShutter_Update(Actor* thisx, PlayState* play2) { void ObjShutter_Update(Actor* thisx, PlayState* play2) {
ObjShutter* this = THIS; ObjShutter* this = THIS;
PlayState* play = play2; PlayState* play = play2;
ScheduleResult schedule; ScheduleOutput scheduleOutput;
Schedule_RunScript(play, sScheduleScript, &schedule); Schedule_RunScript(play, sScheduleScript, &scheduleOutput);
if (schedule.result == 1) { if (scheduleOutput.result == 1) {
if (this->scheduleResult != schedule.result) { if (this->scheduleResult != scheduleOutput.result) {
this->actor.velocity.y = 0.0f; this->actor.velocity.y = 0.0f;
} }
if ((this->verticalOffset >= 80.0f) || (this->scheduleResult == 0)) { if ((this->verticalOffset >= 80.0f) || (this->scheduleResult == 0)) {
@ -57,7 +57,7 @@ void ObjShutter_Update(Actor* thisx, PlayState* play2) {
this->verticalOffset += 10.0f; this->verticalOffset += 10.0f;
} }
} else { } else {
if (this->scheduleResult != schedule.result) { if (this->scheduleResult != scheduleOutput.result) {
this->actor.velocity.y = 0.0f; this->actor.velocity.y = 0.0f;
} }
if (this->verticalOffset != 0.0f) { if (this->verticalOffset != 0.0f) {
@ -72,7 +72,7 @@ void ObjShutter_Update(Actor* thisx, PlayState* play2) {
} }
} }
} }
this->scheduleResult = schedule.result; this->scheduleResult = scheduleOutput.result;
} }
void ObjShutter_Draw(Actor* thisx, PlayState* play) { void ObjShutter_Draw(Actor* thisx, PlayState* play) {

View File

@ -15168,27 +15168,27 @@
0x80BA7D30:("EnRailgibud_SinkIntoGround",), 0x80BA7D30:("EnRailgibud_SinkIntoGround",),
0x80BA7DC8:("EnRailgibud_PerformCutsceneActions",), 0x80BA7DC8:("EnRailgibud_PerformCutsceneActions",),
0x80BA8050:("EnRailgibud_Cutscene_Update",), 0x80BA8050:("EnRailgibud_Cutscene_Update",),
0x80BA8820:("func_80BA8820",), 0x80BA8820:("EnBaba_FindBombShopkeeper",),
0x80BA886C:("func_80BA886C",), 0x80BA886C:("EnBaba_HandleConversation",),
0x80BA8C4C:("func_80BA8C4C",), 0x80BA8C4C:("EnBaba_TriggerTransition",),
0x80BA8C90:("func_80BA8C90",), 0x80BA8C90:("EnBaba_UpdateCollider",),
0x80BA8D2C:("func_80BA8D2C",), 0x80BA8D2C:("EnBaba_MoveForward",),
0x80BA8DF4:("func_80BA8DF4",), 0x80BA8DF4:("EnBaba_UpdateModel",),
0x80BA8F88:("func_80BA8F88",), 0x80BA8F88:("EnBaba_InitTimePath",),
0x80BA9110:("func_80BA9110",), 0x80BA9110:("EnBaba_ProcessScheduleOutput",),
0x80BA9160:("func_80BA9160",), 0x80BA9160:("EnBaba_FollowTimePath",),
0x80BA93AC:("func_80BA93AC",), 0x80BA93AC:("EnBaba_HandleSchedule",),
0x80BA9480:("func_80BA9480",), 0x80BA9480:("EnBaba_FinishInit",),
0x80BA9758:("func_80BA9758",), 0x80BA9758:("EnBaba_Idle",),
0x80BA9848:("func_80BA9848",), 0x80BA9848:("EnBaba_FollowSchedule_Talk",),
0x80BA98EC:("func_80BA98EC",), 0x80BA98EC:("EnBaba_Talk",),
0x80BA9AB8:("func_80BA9AB8",), 0x80BA9AB8:("EnBaba_GiveBlastMask",),
0x80BA9B24:("func_80BA9B24",), 0x80BA9B24:("EnBaba_GaveBlastMask",),
0x80BA9B80:("func_80BA9B80",), 0x80BA9B80:("EnBaba_FollowSchedule",),
0x80BA9CD4:("func_80BA9CD4",), 0x80BA9CD4:("EnBaba_KnockedOver",),
0x80BA9E00:("func_80BA9E00",), 0x80BA9E00:("EnBaba_DoNothing",),
0x80BA9E10:("func_80BA9E10",), 0x80BA9E10:("EnBaba_Walk",),
0x80BA9E48:("func_80BA9E48",), 0x80BA9E48:("EnBaba_FaceForward",),
0x80BA9E6C:("EnBaba_Init",), 0x80BA9E6C:("EnBaba_Init",),
0x80BA9F24:("EnBaba_Destroy",), 0x80BA9F24:("EnBaba_Destroy",),
0x80BA9F50:("EnBaba_Update",), 0x80BA9F50:("EnBaba_Update",),

View File

@ -597,6 +597,7 @@ wordReplace = {
"GlobalContext": "PlayState", "GlobalContext": "PlayState",
"globalCtx": "play", "globalCtx": "play",
"globalCtx2": "play2", "globalCtx2": "play2",
"ScheduleResult": "ScheduleOutput",
# Struct members # Struct members
"skelAnime.unk03": "skelAnime.taper", "skelAnime.unk03": "skelAnime.taper",