dyna switches (#1731)

This commit is contained in:
engineer124 2024-10-23 12:48:01 +11:00 committed by GitHub
parent 961899ca91
commit 19495ba8e9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 43 additions and 39 deletions

View File

@ -166,8 +166,8 @@ typedef enum {
#define DYNA_INTERACT_ACTOR_ON_TOP (1 << 0) // There is an actor standing on the collision of the dynapoly actor
#define DYNA_INTERACT_PLAYER_ON_TOP (1 << 1) // The player actor is standing on the collision of the dynapoly actor
#define DYNA_INTERACT_PLAYER_ABOVE (1 << 2) // The player is directly above the collision of the dynapoly actor (any distance above)
#define DYNA_INTERACT_ACTOR_ON_SWITCH (1 << 3) // Like the ACTOR_ON_TOP flag but only actors with ACTOR_FLAG_CAN_PRESS_SWITCH
#define DYNA_INTERACT_ACTOR_ON_HEAVY_SWITCH (1 << 4) // Like the ACTOR_ON_TOP flag but only actors with ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH
#define DYNA_INTERACT_ACTOR_SWITCH_PRESSED (1 << 3) // An actor that is capable of pressing switches is on top of the dynapoly actor
#define DYNA_INTERACT_ACTOR_HEAVY_SWITCH_PRESSED (1 << 4) // An actor that is capable of pressing heavy switches is on top of the dynapoly actor
typedef struct DynaPolyActor {
/* 0x000 */ Actor actor;
@ -491,8 +491,10 @@ typedef enum DoorLockType {
#define ACTOR_FLAG_8000 (1 << 15)
//
#define ACTOR_FLAG_10000 (1 << 16)
// actor can press and hold down heavy switches
#define ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH (1 << 17)
// Actor can press and hold down heavy switches.
// See usages of `DynaPolyActor_SetHeavySwitchPressed` and `DynaPolyActor_IsHeavySwitchPressed` for more context on how switches work.
#define ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCHES (1 << 17)
//
#define ACTOR_FLAG_40000 (1 << 18)
//
@ -512,8 +514,10 @@ typedef enum DoorLockType {
// Typically an actor will halt while the ocarina is active (depending on category).
// This flag allows a given actor to be an exception.
#define ACTOR_FLAG_UPDATE_DURING_OCARINA (1 << 25)
// actor can press and hold down switches
#define ACTOR_FLAG_CAN_PRESS_SWITCH (1 << 26)
// Actor can press and hold down switches.
// See usages of `DynaPolyActor_SetSwitchPressed` and `DynaPolyActor_IsSwitchPressed` for more context on how switches work.
#define ACTOR_FLAG_CAN_PRESS_SWITCHES (1 << 26)
// Player is not able to lock onto the actor.
// Tatl will still be able to hover over the actor, assuming `ACTOR_FLAG_ATTENTION_ENABLED` is set.
@ -891,8 +895,8 @@ void DynaPolyActor_SetPlayerOnTop(DynaPolyActor* dynaActor);
void DynaPoly_SetPlayerOnTop(struct CollisionContext* colCtx, s32 bgId);
void DynaPolyActor_SetPlayerAbove(DynaPolyActor* dynaActor);
void DynaPoly_SetPlayerAbove(struct CollisionContext* colCtx, s32 bgId);
void DynaPolyActor_SetActorOnSwitch(DynaPolyActor* dynaActor);
void DynaPolyActor_SetActorOnHeavySwitch(DynaPolyActor* dynaActor);
void DynaPolyActor_SetSwitchPressed(DynaPolyActor* dynaActor);
void DynaPolyActor_SetHeavySwitchPressed(DynaPolyActor* dynaActor);
s32 DynaPolyActor_IsActorOnTop(DynaPolyActor* dynaActor);
s32 DynaPolyActor_IsPlayerOnTop(DynaPolyActor* dynaActor);
s32 DynaPolyActor_IsPlayerAbove(DynaPolyActor* dynaActor);

View File

@ -72,11 +72,11 @@ void DynaPolyActor_AttachCarriedActor(CollisionContext* colCtx, Actor* carriedAc
if (dynaActor != NULL) {
DynaPolyActor_SetActorOnTop(dynaActor);
if (CHECK_FLAG_ALL(carriedActor->flags, ACTOR_FLAG_CAN_PRESS_SWITCH)) {
DynaPolyActor_SetActorOnSwitch(dynaActor);
if (CHECK_FLAG_ALL(carriedActor->flags, ACTOR_FLAG_CAN_PRESS_SWITCHES)) {
DynaPolyActor_SetSwitchPressed(dynaActor);
}
if (CHECK_FLAG_ALL(carriedActor->flags, ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH)) {
DynaPolyActor_SetActorOnHeavySwitch(dynaActor);
if (CHECK_FLAG_ALL(carriedActor->flags, ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCHES)) {
DynaPolyActor_SetHeavySwitchPressed(dynaActor);
}
}
}

View File

@ -51,12 +51,12 @@ void DynaPoly_SetPlayerAbove(CollisionContext* colCtx, s32 bgId) {
}
}
void DynaPolyActor_SetActorOnSwitch(DynaPolyActor* dynaActor) {
dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_SWITCH;
void DynaPolyActor_SetSwitchPressed(DynaPolyActor* dynaActor) {
dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_SWITCH_PRESSED;
}
void DynaPolyActor_SetActorOnHeavySwitch(DynaPolyActor* dynaActor) {
dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_HEAVY_SWITCH;
void DynaPolyActor_SetHeavySwitchPressed(DynaPolyActor* dynaActor) {
dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_HEAVY_SWITCH_PRESSED;
}
s32 DynaPolyActor_IsActorOnTop(DynaPolyActor* dynaActor) {
@ -84,7 +84,7 @@ s32 DynaPolyActor_IsPlayerAbove(DynaPolyActor* dynaActor) {
}
s32 DynaPolyActor_IsSwitchPressed(DynaPolyActor* dynaActor) {
if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_SWITCH) {
if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_SWITCH_PRESSED) {
return true;
} else {
return false;
@ -92,7 +92,7 @@ s32 DynaPolyActor_IsSwitchPressed(DynaPolyActor* dynaActor) {
}
s32 DynaPolyActor_IsHeavySwitchPressed(DynaPolyActor* dynaActor) {
if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_HEAVY_SWITCH) {
if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_HEAVY_SWITCH_PRESSED) {
return true;
} else {
return false;

View File

@ -3,7 +3,7 @@
#define FLAGS \
(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_200000 | \
ACTOR_FLAG_UPDATE_DURING_OCARINA | ACTOR_FLAG_CAN_PRESS_SWITCH | ACTOR_FLAG_80000000)
ACTOR_FLAG_UPDATE_DURING_OCARINA | ACTOR_FLAG_CAN_PRESS_SWITCHES | ACTOR_FLAG_80000000)
ActorFunc sPlayerCallInitFunc;
ActorFunc sPlayerCallDestroyFunc;

View File

@ -7,7 +7,7 @@
#include "z_dm_statue.h"
#include "assets/objects/object_smtower/object_smtower.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CAN_PRESS_SWITCHES)
#define THIS ((DmStatue*)thisx)

View File

@ -14,7 +14,7 @@
#include "assets/objects/gameplay_keep/gameplay_keep.h"
#include "assets/objects/object_mask_ki_tan/object_mask_ki_tan.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CAN_PRESS_SWITCHES)
#define THIS ((EnTest3*)thisx)

View File

@ -68,9 +68,9 @@ void EnTorch2_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
if (this->actor.params != TORCH2_PARAM_DEKU) {
this->actor.flags |= ACTOR_FLAG_CAN_PRESS_SWITCH;
this->actor.flags |= ACTOR_FLAG_CAN_PRESS_SWITCHES;
if (this->actor.params == TORCH2_PARAM_GORON) {
this->actor.flags |= ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH;
this->actor.flags |= ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCHES;
}
}
this->framesUntilNextState = 20;

View File

@ -7,7 +7,7 @@
#include "z_obj_armos.h"
#include "assets/objects/gameplay_keep/gameplay_keep.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_CAN_PRESS_SWITCHES)
#define THIS ((ObjArmos*)thisx)

View File

@ -8,7 +8,7 @@
#include "assets/objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h"
#include "assets/objects/object_kibako/object_kibako.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_CAN_PRESS_SWITCHES)
#define THIS ((ObjKibako*)thisx)
@ -349,7 +349,7 @@ void ObjKibako_Held(ObjKibako* this, PlayState* play) {
} else {
Actor_MoveWithGravity(&this->actor);
ObjKibako_SetupThrown(this);
this->actor.flags &= ~ACTOR_FLAG_CAN_PRESS_SWITCH;
this->actor.flags &= ~ACTOR_FLAG_CAN_PRESS_SWITCHES;
}
Actor_UpdateBgCheckInfo(play, &this->actor, 18.0f, 15.0f, 0.0f,
UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);

View File

@ -446,7 +446,7 @@ void ObjOshihiki_OnActor(ObjOshihiki* this, PlayState* play) {
dyna = DynaPoly_GetActor(&play->colCtx, this->floorBgIds[this->highestFloor]);
if (dyna != NULL) {
DynaPolyActor_SetActorOnTop(dyna);
DynaPolyActor_SetActorOnSwitch(dyna);
DynaPolyActor_SetSwitchPressed(dyna);
if ((this->timer <= 0) && (fabsf(this->dyna.pushForce) > 0.001f) &&
ObjOshihiki_StrongEnough(this, play) && ObjOshihiki_NoSwitchPress(this, dyna, play) &&
!ObjOshihiki_CheckWall(play, this->dyna.yRotation, this->dyna.pushForce, this)) {
@ -464,7 +464,7 @@ void ObjOshihiki_OnActor(ObjOshihiki* this, PlayState* play) {
dyna = DynaPoly_GetActor(&play->colCtx, this->floorBgIds[this->highestFloor]);
if ((dyna != NULL) && (dyna->transformFlags & DYNA_TRANSFORM_POS)) {
DynaPolyActor_SetActorOnTop(dyna);
DynaPolyActor_SetActorOnSwitch(dyna);
DynaPolyActor_SetSwitchPressed(dyna);
this->dyna.actor.world.pos.y = this->dyna.actor.floorHeight;
} else {
ObjOshihiki_SetupFall(this, play);

View File

@ -8,7 +8,7 @@
#include "assets/objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h"
#include "assets/objects/object_secom_obj/object_secom_obj.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_CAN_PRESS_SWITCHES)
#define THIS ((ObjPzlblock*)thisx)

View File

@ -10,7 +10,7 @@
#include "assets/objects/object_tsubo/object_tsubo.h"
#include "assets/objects/object_racetsubo/object_racetsubo.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_THROW_ONLY | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_THROW_ONLY | ACTOR_FLAG_CAN_PRESS_SWITCHES)
#define THIS ((ObjTsubo*)thisx)
@ -536,7 +536,7 @@ void func_80928D80(ObjTsubo* this, PlayState* play) {
if (Actor_HasNoParent(&this->actor, play)) {
this->actor.room = play->roomCtx.curRoom.num;
Actor_MoveWithGravity(&this->actor);
this->actor.flags &= ~ACTOR_FLAG_CAN_PRESS_SWITCH;
this->actor.flags &= ~ACTOR_FLAG_CAN_PRESS_SWITCHES;
Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f,
UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40 |
UPDBGCHECKINFO_FLAG_80);
@ -651,7 +651,7 @@ void func_8092926C(ObjTsubo* this, PlayState* play) {
} else {
scale = sPotTypeData[OBJ_TSUBO_GET_TYPE(&this->actor)].scale;
if (Math_StepToF(&this->actor.scale.x, scale, scale * 0.1f)) {
this->actor.flags |= ACTOR_FLAG_CAN_PRESS_SWITCH;
this->actor.flags |= ACTOR_FLAG_CAN_PRESS_SWITCHES;
func_809289B4(this);
}
this->actor.scale.z = this->actor.scale.y = this->actor.scale.x;

View File

@ -11011,11 +11011,11 @@ void Player_Init(Actor* thisx, PlayState* play) {
}
}
this->actor.flags &= ~(ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH | ACTOR_FLAG_CAN_PRESS_SWITCH);
this->actor.flags &= ~(ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCHES | ACTOR_FLAG_CAN_PRESS_SWITCHES);
if (this->transformation != PLAYER_FORM_DEKU) {
this->actor.flags |= ACTOR_FLAG_CAN_PRESS_SWITCH;
this->actor.flags |= ACTOR_FLAG_CAN_PRESS_SWITCHES;
if (this->transformation == PLAYER_FORM_GORON) {
this->actor.flags |= ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH;
this->actor.flags |= ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCHES;
}
}

View File

@ -1104,8 +1104,8 @@
0x800CAEB0:("DynaPoly_SetPlayerOnTop",),
0x800CAEE0:("DynaPolyActor_SetPlayerAbove",),
0x800CAEF4:("DynaPoly_SetPlayerAbove",),
0x800CAF24:("DynaPolyActor_SetActorOnSwitch",),
0x800CAF38:("DynaPolyActor_SetActorOnHeavySwitch",),
0x800CAF24:("DynaPolyActor_SetSwitchPressed",),
0x800CAF38:("DynaPolyActor_SetHeavySwitchPressed",),
0x800CAF4C:("DynaPolyActor_IsActorOnTop",),
0x800CAF70:("DynaPolyActor_IsPlayerOnTop",),
0x800CAF94:("DynaPolyActor_IsPlayerAbove",),

View File

@ -533,8 +533,8 @@ wordReplace = {
"DynaPolyActor_SetRidingMovingStateByIndex": "DynaPoly_SetPlayerOnTop",
"DynaPolyActor_SetRidingRotatingState": "DynaPolyActor_SetPlayerAbove",
"DynaPolyActor_SetRidingRotatingStateByIndex": "DynaPoly_SetPlayerAbove",
"DynaPolyActor_SetSwitchPressedState": "DynaPolyActor_SetActorOnSwitch",
"DynaPolyActor_SetHeavySwitchPressedState": "DynaPolyActor_SetActorOnHeavySwitch",
"DynaPolyActor_SetSwitchPressedState": "DynaPolyActor_SetSwitchPressed",
"DynaPolyActor_SetHeavySwitchPressedState": "DynaPolyActor_SetHeavySwitchPressed",
"DynaPolyActor_IsInRidingFallingState": "DynaPolyActor_IsActorOnTop",
"DynaPolyActor_IsInRidingMovingState": "DynaPolyActor_IsPlayerOnTop",
"DynaPolyActor_IsInRidingRotatingState": "DynaPolyActor_IsPlayerAbove",