Create new entity structs for NPCs

This commit is contained in:
octorock
2023-07-05 21:34:08 +02:00
parent 0d6b9052ba
commit 488196754e
116 changed files with 4001 additions and 3461 deletions
+34 -32
View File
@@ -97,7 +97,7 @@ void ScriptCommand_0807E974(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_AddInteractableWhenBigObject(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_RemoveInteractableObject(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_AddInteractableWhenBigFuser(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_0807E9F0(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_UpdateFusion(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_0807EA4C(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_AddInteractableFuser(Entity* entity, ScriptExecutionContext* context);
void ScriptCommand_WaitUntilTextboxCloses(Entity* entity, ScriptExecutionContext* context);
@@ -313,9 +313,10 @@ void HandlePostScriptActions(Entity* entity, ScriptExecutionContext* context) {
}
}
void sub_0807DD50(Entity* entity) {
// Init some script related variables, execute the script and do something regarding the animation.
void InitScriptForNPC(Entity* entity) {
sub_0807DD64(entity);
sub_0807DD94(entity, 0);
ExecuteScriptAndHandleAnimation(entity, NULL);
}
void sub_0807DD64(Entity* entity) {
@@ -330,8 +331,8 @@ void sub_0807DD80(Entity* entity, Script* script) {
sub_0807DD64(entity);
}
void sub_0807DD94(Entity* entity, void (*function)(Entity*, ScriptExecutionContext*)) {
ExecuteScriptForEntity(entity, function);
void ExecuteScriptAndHandleAnimation(Entity* entity, void (*postScriptCallback)(Entity*, ScriptExecutionContext*)) {
ExecuteScriptForEntity(entity, postScriptCallback);
HandleEntity0x82Actions(entity);
sub_0807DE80(entity);
}
@@ -390,6 +391,7 @@ void HandleEntity0x82Actions(Entity* entity) {
}
}
// Handles animation for NPCs? Uses u16 0x80 and 0x82 of the entity.
void sub_0807DE80(Entity* entity) {
u32 local1;
u16 local2;
@@ -546,7 +548,7 @@ void ExecuteScript(Entity* entity, ScriptExecutionContext* context) {
ScriptCommand_AddInteractableWhenBigObject,
ScriptCommand_RemoveInteractableObject,
ScriptCommand_AddInteractableWhenBigFuser,
ScriptCommand_0807E9F0,
ScriptCommand_UpdateFusion,
ScriptCommand_0807EA4C,
ScriptCommand_AddInteractableFuser,
ScriptCommand_WaitUntilTextboxCloses,
@@ -801,13 +803,13 @@ void ScriptCommand_CheckEntityInteractType(Entity* entity, ScriptExecutionContex
void ScriptCommand_FacePlayerAndCheckDist(Entity* entity, ScriptExecutionContext* context) {
if ((context->unk_1A & 0xF) == 0 && (gPlayerState.flags & PL_MINISH) == 0 &&
EntityInRectRadius(entity, &gPlayerEntity, 40, 40)) {
entity->animationState = sub_0806F5B0(GetFacingDirection(entity, &gPlayerEntity));
entity->animationState = GetAnimationStateForDirection8(GetFacingDirection(entity, &gPlayerEntity));
}
context->unk_1A++;
if (entity->interactType) {
entity->interactType = 0;
context->condition = 1;
entity->animationState = sub_0806F5B0(GetFacingDirection(entity, &gPlayerEntity));
entity->animationState = GetAnimationStateForDirection8(GetFacingDirection(entity, &gPlayerEntity));
} else {
context->condition = 0;
}
@@ -1148,25 +1150,25 @@ void ScriptCommand_AddInteractableWhenBigFuser(Entity* entity, ScriptExecutionCo
AddInteractableWhenBigFuser(entity, context->scriptInstructionPointer[1]);
}
void ScriptCommand_0807E9F0(Entity* entity, ScriptExecutionContext* context) {
bool32 tmp;
sub_0801E00C();
tmp = TRUE;
switch (gFuseInfo._0) {
void ScriptCommand_UpdateFusion(Entity* entity, ScriptExecutionContext* context) {
bool32 isFusionSuccessful;
PerformFuseAction();
isFusionSuccessful = TRUE;
switch (gFuseInfo.fusionState) {
default:
tmp = FALSE;
isFusionSuccessful = FALSE;
break;
case 2:
case FUSION_STATE_2:
gPlayerState.controlMode = CONTROL_DISABLED;
gPauseMenuOptions.disabled = tmp;
context->condition = tmp;
gPauseMenuOptions.disabled = isFusionSuccessful;
context->condition = isFusionSuccessful;
break;
case 1:
case FUSION_STATE_1:
context->condition = 0;
break;
}
if (tmp) {
if (isFusionSuccessful) {
PlayerResetStateFromFusion();
gPlayerState.controlMode = CONTROL_1;
} else {
@@ -1176,7 +1178,7 @@ void ScriptCommand_0807E9F0(Entity* entity, ScriptExecutionContext* context) {
void ScriptCommand_0807EA4C(Entity* entity, ScriptExecutionContext* context) {
if (entity->interactType == 2) {
sub_0801DFB4(entity, 0, 0, 0);
InitializeFuseInfo(entity, 0, 0, 0);
entity->interactType = 0;
gActiveScriptInfo.flags |= 1;
} else {
@@ -1234,17 +1236,17 @@ void ScriptCommand_SetAnimationState(Entity* entity, ScriptExecutionContext* con
}
void ScriptCommand_0807EB4C(Entity* entity, ScriptExecutionContext* context) {
entity->animationState =
sub_0806F5B0(sub_080045B4(entity, context->scriptInstructionPointer[1] + gRoomControls.origin_x,
context->scriptInstructionPointer[2] + gRoomControls.origin_y));
entity->animationState = GetAnimationStateForDirection8(
sub_080045B4(entity, context->scriptInstructionPointer[1] + gRoomControls.origin_x,
context->scriptInstructionPointer[2] + gRoomControls.origin_y));
}
void ScriptCommand_FacePlayer(Entity* entity, ScriptExecutionContext* context) {
entity->animationState = sub_0806F5B0(GetFacingDirection(entity, &gPlayerEntity));
entity->animationState = GetAnimationStateForDirection8(GetFacingDirection(entity, &gPlayerEntity));
}
void ScriptCommand_FaceAwayFromPlayer(Entity* entity, ScriptExecutionContext* context) {
gPlayerEntity.animationState = sub_0806F5B0(GetFacingDirection(&gPlayerEntity, entity)) & ~1;
gPlayerEntity.animationState = GetAnimationStateForDirection8(GetFacingDirection(&gPlayerEntity, entity)) & ~1;
}
void ScriptCommand_SetEntityDirection(Entity* entity, ScriptExecutionContext* context) {
@@ -1352,9 +1354,9 @@ void ScriptCommand_0807ED24(Entity* entity, ScriptExecutionContext* context) {
tmp = context->scriptInstructionPointer[2];
tmp3 = entity->y.HALF.HI - gRoomControls.origin_y;
context->y.WORD = ((tmp - tmp3) << 0x10) / context->unk_12;
entity->animationState =
sub_0806F5B0(sub_080045B4(entity, context->scriptInstructionPointer[1] + gRoomControls.origin_x,
context->scriptInstructionPointer[2] + gRoomControls.origin_y));
entity->animationState = GetAnimationStateForDirection8(
sub_080045B4(entity, context->scriptInstructionPointer[1] + gRoomControls.origin_x,
context->scriptInstructionPointer[2] + gRoomControls.origin_y));
context->postScriptActions |= 2;
} else {
if (!--context->unk_12) {
@@ -1817,14 +1819,14 @@ void WaitForCameraTouchRoomBorder(Entity* entity, ScriptExecutionContext* contex
}
void sub_0807F634(Entity* entity, ScriptExecutionContext* context) {
u16* p = (u16*)context->intVariable;
sub_0801DFB4(entity, p[0], p[1], p[2]);
u16* textIndices = (u16*)context->intVariable;
InitializeFuseInfo(entity, textIndices[0], textIndices[1], textIndices[2]);
gPlayerState.controlMode = CONTROL_DISABLED;
}
void sub_0807F650(Entity* entity, ScriptExecutionContext* context) {
u32 p = GetFuserId(entity);
sub_0801DFB4(entity, gUnk_08001A7C[p][0], gUnk_08001A7C[p][1], gUnk_08001A7C[p][2]);
u32 fuserId = GetFuserId(entity);
InitializeFuseInfo(entity, gUnk_08001A7C[fuserId][0], gUnk_08001A7C[fuserId][1], gUnk_08001A7C[fuserId][2]);
gPlayerState.controlMode = CONTROL_DISABLED;
}