mirror of https://github.com/zeldaret/mm.git
dyna switches (#1731)
This commit is contained in:
parent
961899ca91
commit
19495ba8e9
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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",),
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in New Issue