En_Wallmas (Wallmaster) OK and documented. object_wallmaster documented (#731)

* EnWallmas_Init and EnWallmas_Destroy OK

* func_80874B88 OK

* func_80874BE4 OK

* func_80874D1C OK

* func_80874DE8 OK

* func_80874F14 OK

* A bunch of small functions OK

* A bunch of smaller functions OK again

* func_808752CC OK

* func_808758C8 OK

* func_80875910 and func_8087596C OK

* func_808756AC and func_8087571C OK

* EnWallmas_Update OK

* func_80875A74 OK

* func_80874A88 and func_80874B04 OK

* A bunch of functions OK

* func_808759B8 and func_80875A0C

* EnWallmas_Draw OK

* func_808760A4 and func_80876118 OK

* func_80875F04 OK

* Use object symbols

* Import data to C

* Use generated reloc

* Document object_wallmaster

* Misc cleanup

* Name the DrawDamageEffects variables

* Name draw functions

* Enum for damage values

* Port function names from OoT

* Last cleanup before PR

* Respond to Elliptic's review

* Respond to Elliptic's second review

* gWallmasterWaitAnim -> gWallmasterIdleAnim

* Change all EnWallmas to Wallmaster (except the actor's name itself)

* Respond to hensldm's review

* Fix merge conflicts
This commit is contained in:
Tom Overton
2022-03-29 14:33:32 -07:00
committed by GitHub
parent b4842eb16c
commit 6faf186a95
10 changed files with 862 additions and 263 deletions
+71 -59
View File
@@ -1,63 +1,75 @@
<Root>
<!-- Assets for both Wallmasters and Floormasters. -->
<File Name="object_wallmaster" Segment="6">
<Animation Name="object_wallmaster_Anim_000590" Offset="0x590" />
<Animation Name="object_wallmaster_Anim_000EA4" Offset="0xEA4" />
<Animation Name="object_wallmaster_Anim_0019CC" Offset="0x19CC" />
<Animation Name="object_wallmaster_Anim_002158" Offset="0x2158" />
<Animation Name="object_wallmaster_Anim_00299C" Offset="0x299C" />
<Animation Name="object_wallmaster_Anim_003120" Offset="0x3120" />
<Animation Name="object_wallmaster_Anim_0039B0" Offset="0x39B0" />
<Animation Name="object_wallmaster_Anim_0041F4" Offset="0x41F4" />
<DList Name="object_wallmaster_DL_006660" Offset="0x6660" />
<DList Name="object_wallmaster_DL_006800" Offset="0x6800" />
<DList Name="object_wallmaster_DL_006A20" Offset="0x6A20" />
<DList Name="object_wallmaster_DL_006C58" Offset="0x6C58" />
<DList Name="object_wallmaster_DL_006E98" Offset="0x6E98" />
<DList Name="object_wallmaster_DL_007038" Offset="0x7038" />
<DList Name="object_wallmaster_DL_007258" Offset="0x7258" />
<DList Name="object_wallmaster_DL_007408" Offset="0x7408" />
<DList Name="object_wallmaster_DL_0075A8" Offset="0x75A8" />
<DList Name="object_wallmaster_DL_0077C8" Offset="0x77C8" />
<DList Name="object_wallmaster_DL_007978" Offset="0x7978" />
<DList Name="object_wallmaster_DL_007B18" Offset="0x7B18" />
<DList Name="object_wallmaster_DL_007CE8" Offset="0x7CE8" />
<DList Name="object_wallmaster_DL_007E98" Offset="0x7E98" />
<DList Name="object_wallmaster_DL_008688" Offset="0x8688" />
<Texture Name="object_wallmaster_Tex_0088F0" OutName="tex_0088F0" Format="rgba16" Width="8" Height="16" Offset="0x88F0" />
<Texture Name="object_wallmaster_Tex_0089F0" OutName="tex_0089F0" Format="rgba16" Width="8" Height="16" Offset="0x89F0" />
<Texture Name="object_wallmaster_Tex_008AF0" OutName="tex_008AF0" Format="rgba16" Width="8" Height="8" Offset="0x8AF0" />
<Texture Name="object_wallmaster_Tex_008B70" OutName="tex_008B70" Format="rgba16" Width="4" Height="16" Offset="0x8B70" />
<Texture Name="object_wallmaster_Tex_008BF0" OutName="tex_008BF0" Format="rgba16" Width="4" Height="8" Offset="0x8BF0" />
<Texture Name="object_wallmaster_Tex_008C30" OutName="tex_008C30" Format="rgba16" Width="8" Height="16" Offset="0x8C30" />
<Texture Name="object_wallmaster_Tex_008D30" OutName="tex_008D30" Format="rgba16" Width="8" Height="16" Offset="0x8D30" />
<Limb Name="object_wallmaster_Standardlimb_008E30" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_01" Offset="0x8E30" />
<Limb Name="object_wallmaster_Standardlimb_008E3C" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_02" Offset="0x8E3C" />
<Limb Name="object_wallmaster_Standardlimb_008E48" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_03" Offset="0x8E48" />
<Limb Name="object_wallmaster_Standardlimb_008E54" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_04" Offset="0x8E54" />
<Limb Name="object_wallmaster_Standardlimb_008E60" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_05" Offset="0x8E60" />
<Limb Name="object_wallmaster_Standardlimb_008E6C" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_06" Offset="0x8E6C" />
<Limb Name="object_wallmaster_Standardlimb_008E78" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_07" Offset="0x8E78" />
<Limb Name="object_wallmaster_Standardlimb_008E84" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_08" Offset="0x8E84" />
<Limb Name="object_wallmaster_Standardlimb_008E90" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_09" Offset="0x8E90" />
<Limb Name="object_wallmaster_Standardlimb_008E9C" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_0A" Offset="0x8E9C" />
<Limb Name="object_wallmaster_Standardlimb_008EA8" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_0B" Offset="0x8EA8" />
<Limb Name="object_wallmaster_Standardlimb_008EB4" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_0C" Offset="0x8EB4" />
<Limb Name="object_wallmaster_Standardlimb_008EC0" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_0D" Offset="0x8EC0" />
<Limb Name="object_wallmaster_Standardlimb_008ECC" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_0E" Offset="0x8ECC" />
<Limb Name="object_wallmaster_Standardlimb_008ED8" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_0F" Offset="0x8ED8" />
<Limb Name="object_wallmaster_Standardlimb_008EE4" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_10" Offset="0x8EE4" />
<Limb Name="object_wallmaster_Standardlimb_008EF0" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_11" Offset="0x8EF0" />
<Limb Name="object_wallmaster_Standardlimb_008EFC" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_12" Offset="0x8EFC" />
<Limb Name="object_wallmaster_Standardlimb_008F08" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_13" Offset="0x8F08" />
<Limb Name="object_wallmaster_Standardlimb_008F14" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_14" Offset="0x8F14" />
<Limb Name="object_wallmaster_Standardlimb_008F20" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_15" Offset="0x8F20" />
<Limb Name="object_wallmaster_Standardlimb_008F2C" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_16" Offset="0x8F2C" />
<Limb Name="object_wallmaster_Standardlimb_008F38" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_17" Offset="0x8F38" />
<Limb Name="object_wallmaster_Standardlimb_008F44" Type="Standard" EnumName="OBJECT_WALLMASTER_LIMB_18" Offset="0x8F44" />
<Skeleton Name="object_wallmaster_Skel_008FB0" Type="Flex" LimbType="Standard" LimbNone="OBJECT_WALLMASTER_LIMB_NONE" LimbMax="OBJECT_WALLMASTER_LIMB_MAX" EnumName="object_wallmaster_Limbs" Offset="0x8FB0" />
<Animation Name="object_wallmaster_Anim_009244" Offset="0x9244" />
<Animation Name="object_wallmaster_Anim_009520" Offset="0x9520" />
<Animation Name="object_wallmaster_Anim_009DB0" Offset="0x9DB0" />
<Animation Name="object_wallmaster_Anim_00A054" Offset="0xA054" />
<Animation Name="gWallmasterDamageAnim" Offset="0x590" /> <!-- Original name is "wm_damage" -->
<Animation Name="gWallmasterRecoverFromDamageAnim" Offset="0xEA4" /> <!-- Original name is "wm_damage_wait" -->
<Animation Name="gWallmasterJumpAnim" Offset="0x19CC" /> <!-- Original name is "wm_f_jump" -->
<Animation Name="gFloormasterTurnAnim" Offset="0x2158" /> <!-- Original name is "wm_l_turn" -->
<Animation Name="gWallmasterLungeAnim" Offset="0x299C" /> <!-- Original name is "wm_link_hangup" -->
<Animation Name="gWallmasterMissAnim" Offset="0x3120" /> <!-- Unused. Original name is "wm_miss" -->
<Animation Name="gFloormasterTapFingerAnim" Offset="0x39B0" /> <!-- Original name is "wm_motionA" -->
<Animation Name="gWallmasterWalkAnim" Offset="0x41F4" /> <!-- Original name is "wm_move" -->
<!-- Wallmaster/Floormaster Limb DisplayLists -->
<DList Name="gWallmasterThumbDistalDL" Offset="0x6660" />
<DList Name="gWallmasterThumbMiddleDL" Offset="0x6800" />
<DList Name="gWallmasterThumbProximalDL" Offset="0x6A20" />
<DList Name="gWallmasterWristDL" Offset="0x6C58" />
<DList Name="gWallmasterMiddleFingerDistalDL" Offset="0x6E98" />
<DList Name="gWallmasterMiddleFingerMiddleDL" Offset="0x7038" />
<DList Name="gWallmasterMiddleFingerProximalDL" Offset="0x7258" />
<DList Name="gWallmasterRingFingerDistalDL" Offset="0x7408" />
<DList Name="gWallmasterRingFingerMiddleDL" Offset="0x75A8" />
<DList Name="gWallmasterRingFingerProximalDL" Offset="0x77C8" />
<DList Name="gWallmasterIndexFingerDistalDL" Offset="0x7978" />
<DList Name="gWallmasterIndexFingerMiddleDL" Offset="0x7B18" />
<DList Name="gWallmasterIndexFingerProximalDL" Offset="0x7CE8" />
<DList Name="gWallmasterHandDL" Offset="0x7E98" />
<!-- Wallmaster/Floormaster Little Finger DisplayList. Not part of the skeleton, unlike the other fingers. -->
<DList Name="gWallmasterLittleFingerDL" Offset="0x8688" />
<!-- Wallmaster/Floormaster Textures -->
<Texture Name="gWallmasterWristTopTex" OutName="wallmaster_wrist_top" Format="rgba16" Width="8" Height="16" Offset="0x88F0" />
<Texture Name="gWallmasterWristSidesTex" OutName="wallmaster_wrist_sides" Format="rgba16" Width="8" Height="16" Offset="0x89F0" />
<Texture Name="gWallmasterHandBackTex" OutName="wallmaster_hand_back" Format="rgba16" Width="8" Height="8" Offset="0x8AF0" />
<Texture Name="gWallmasterFingerTipTex" OutName="wallmaster_finger_tip" Format="rgba16" Width="4" Height="16" Offset="0x8B70" />
<Texture Name="gWallmasterJointsAndSidesTex" OutName="wallmaster_joints_and_sides" Format="rgba16" Width="4" Height="8" Offset="0x8BF0" />
<Texture Name="gWallmasterPalmAndFingerPadTex" OutName="wallmaster_palm_and_finger_pad" Format="rgba16" Width="8" Height="16" Offset="0x8C30" />
<Texture Name="gWallmasterKnuckleAndFingerTopTex" OutName="wallmaster_knuckle_and_finger_top" Format="rgba16" Width="8" Height="16" Offset="0x8D30" />
<!-- Wallmaster/Floormaster Limbs -->
<Limb Name="gWallmasterRootLimb" Type="Standard" EnumName="WALLMASTER_LIMB_ROOT" Offset="0x8E30" />
<Limb Name="gWallmasterHandLimb" Type="Standard" EnumName="WALLMASTER_LIMB_HAND" Offset="0x8E3C" />
<Limb Name="gWallmasterIndexFingerRootLimb" Type="Standard" EnumName="WALLMASTER_LIMB_INDEX_FINGER_ROOT" Offset="0x8E48" />
<Limb Name="gWallmasterIndexFingerProximalLimb" Type="Standard" EnumName="WALLMASTER_LIMB_INDEX_FINGER_PROXIMAL" Offset="0x8E54" />
<Limb Name="gWallmasterIndexFingerDistalRootLimb" Type="Standard" EnumName="WALLMASTER_LIMB_INDEX_FINGER_DISTAL_ROOT" Offset="0x8E60" />
<Limb Name="gWallmasterIndexFingerMiddleLimb" Type="Standard" EnumName="WALLMASTER_LIMB_INDEX_FINGER_MIDDLE" Offset="0x8E6C" />
<Limb Name="gWallmasterIndexFingerDistalLimb" Type="Standard" EnumName="WALLMASTER_LIMB_INDEX_FINGER_DISTAL" Offset="0x8E78" />
<Limb Name="gWallmasterRingFingerRootLimb" Type="Standard" EnumName="WALLMASTER_LIMB_RING_FINGER_ROOT" Offset="0x8E84" />
<Limb Name="gWallmasterRingFingerProximalLimb" Type="Standard" EnumName="WALLMASTER_LIMB_RING_FINGER_PROXIMAL" Offset="0x8E90" />
<Limb Name="gWallmasterRingFingerDistalRootLimb" Type="Standard" EnumName="WALLMASTER_LIMB_RING_FINGER_DISTAL_ROOT" Offset="0x8E9C" />
<Limb Name="gWallmasterRingFingerMiddleLimb" Type="Standard" EnumName="WALLMASTER_LIMB_RING_FINGER_MIDDLE" Offset="0x8EA8" />
<Limb Name="gWallmasterRingFingerDistalLimb" Type="Standard" EnumName="WALLMASTER_LIMB_RING_FINGER_DISTAL" Offset="0x8EB4" />
<Limb Name="gWallmasterMiddleFingerRootLimb" Type="Standard" EnumName="WALLMASTER_LIMB_MIDDLE_FINGER_ROOT" Offset="0x8EC0" />
<Limb Name="gWallmasterMiddleFingerProximalLimb" Type="Standard" EnumName="WALLMASTER_LIMB_MIDDLE_FINGER_PROXIMAL" Offset="0x8ECC" />
<Limb Name="gWallmasterMiddleFingerDistalRootLimb" Type="Standard" EnumName="WALLMASTER_LIMB_MIDDLE_FINGER_DISTAL_ROOT" Offset="0x8ED8" />
<Limb Name="gWallmasterMiddleFingerMiddleLimb" Type="Standard" EnumName="WALLMASTER_LIMB_MIDDLE_FINGER_MIDDLE" Offset="0x8EE4" />
<Limb Name="gWallmasterMiddleFingerDistalLimb" Type="Standard" EnumName="WALLMASTER_LIMB_MIDDLE_FINGER_DISTAL" Offset="0x8EF0" />
<Limb Name="gWallmasterWristRootLimb" Type="Standard" EnumName="WALLMASTER_LIMB_WRIST_ROOT" Offset="0x8EFC" />
<Limb Name="gWallmasterWristLimb" Type="Standard" EnumName="WALLMASTER_LIMB_WRIST" Offset="0x8F08" />
<Limb Name="gWallmasterThumbRootLimb" Type="Standard" EnumName="WALLMASTER_LIMB_THUMB_ROOT" Offset="0x8F14" />
<Limb Name="gWallmasterThumbProximalLimb" Type="Standard" EnumName="WALLMASTER_LIMB_THUMB_PROXIMAL" Offset="0x8F20" />
<Limb Name="gWallmasterThumbDistalRootLimb" Type="Standard" EnumName="WALLMASTER_LIMB_THUMB_DISTAL_ROOT" Offset="0x8F2C" />
<Limb Name="gWallmasterThumbMiddleLimb" Type="Standard" EnumName="WALLMASTER_LIMB_THUMB_MIDDLE" Offset="0x8F38" />
<Limb Name="gWallmasterThumbDistalLimb" Type="Standard" EnumName="WALLMASTER_LIMB_THUMB_DISTAL" Offset="0x8F44" />
<!-- Wallmaster/Floormaster Skeleton-->
<Skeleton Name="gWallmasterSkel" Type="Flex" LimbType="Standard" LimbNone="WALLMASTER_LIMB_NONE" LimbMax="WALLMASTER_LIMB_MAX" EnumName="WallmasterLimbs" Offset="0x8FB0" />
<Animation Name="gWallmasterStopWalkAnim" Offset="0x9244" /> <!-- Original name is "wm_move_wait" -->
<Animation Name="gWallmasterHoverAnim" Offset="0x9520" /> <!-- Original name is "wm_success" -->
<Animation Name="gWallmasterIdleAnim" Offset="0x9DB0" /> <!-- Original name is "wm_wait" -->
<Animation Name="gWallmasterStandUpAnim" Offset="0xA054" /> <!-- Original name is "wm_wait_move" -->
</File>
</Root>
+1 -2
View File
@@ -800,8 +800,7 @@ beginseg
name "ovl_En_Wallmas"
compress
include "build/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.o"
include "build/data/ovl_En_Wallmas/ovl_En_Wallmas.data.o"
include "build/data/ovl_En_Wallmas/ovl_En_Wallmas.reloc.o"
include "build/src/overlays/actors/ovl_En_Wallmas/ovl_En_Wallmas_reloc.o"
endseg
beginseg
@@ -5,7 +5,6 @@
*/
#include "z_en_floormas.h"
#include "objects/object_wallmaster/object_wallmaster.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_400)
@@ -154,8 +153,8 @@ void EnFloormas_Init(Actor* thisx, GlobalContext* globalCtx2) {
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 50.0f);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_wallmaster_Skel_008FB0, &object_wallmaster_Anim_009DB0,
this->jointTable, this->morphTable, 25);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gWallmasterSkel, &gWallmasterIdleAnim, this->jointTable,
this->morphTable, WALLMASTER_LIMB_MAX);
Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
@@ -259,7 +258,7 @@ void func_808D0A48(EnFloormas* this, GlobalContext* globalCtx) {
}
void func_808D0B08(EnFloormas* this) {
Animation_PlayOnce(&this->skelAnime, &object_wallmaster_Anim_009DB0);
Animation_PlayOnce(&this->skelAnime, &gWallmasterIdleAnim);
this->actor.speedXZ = 0.0f;
this->actionFunc = func_808D0B50;
}
@@ -278,7 +277,7 @@ void func_808D0B50(EnFloormas* this, GlobalContext* globalCtx) {
}
void func_808D0C14(EnFloormas* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_wallmaster_Anim_00A054, -3.0f);
Animation_MorphToPlayOnce(&this->skelAnime, &gWallmasterStandUpAnim, -3.0f);
this->actionFunc = func_808D0C58;
}
@@ -296,7 +295,7 @@ void func_808D0C58(EnFloormas* this, GlobalContext* globalCtx) {
void func_808D0CE4(EnFloormas* this) {
if (this->actionFunc != func_808D0F80) {
Animation_PlayLoopSetSpeed(&this->skelAnime, &object_wallmaster_Anim_0041F4, 1.5f);
Animation_PlayLoopSetSpeed(&this->skelAnime, &gWallmasterWalkAnim, 1.5f);
} else {
this->skelAnime.playSpeed = 1.5f;
}
@@ -334,7 +333,7 @@ void func_808D0D70(EnFloormas* this, GlobalContext* globalCtx) {
}
void func_808D0ECC(EnFloormas* this) {
Animation_PlayOnce(&this->skelAnime, &object_wallmaster_Anim_009244);
Animation_PlayOnce(&this->skelAnime, &gWallmasterStopWalkAnim);
this->actor.speedXZ = 0.0f;
this->actionFunc = func_808D0F14;
}
@@ -373,10 +372,10 @@ void func_808D108C(EnFloormas* this) {
this->actor.speedXZ = 0.0f;
if (sp36 > 0) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_wallmaster_Anim_002158, -3.0f);
Animation_MorphToPlayOnce(&this->skelAnime, &gFloormasterTurnAnim, -3.0f);
} else {
Animation_Change(&this->skelAnime, &object_wallmaster_Anim_002158, -1.0f,
Animation_GetLastFrame(&object_wallmaster_Anim_002158.common), 0.0f, 2, -3.0f);
Animation_Change(&this->skelAnime, &gFloormasterTurnAnim, -1.0f, Animation_GetLastFrame(&gFloormasterTurnAnim),
0.0f, ANIMMODE_ONCE, -3.0f);
}
if (this->actor.scale.x > 0.009f) {
@@ -418,8 +417,8 @@ void func_808D11BC(EnFloormas* this, GlobalContext* globalCtx) {
}
void func_808D1380(EnFloormas* this, GlobalContext* globalCtx) {
Animation_Change(&this->skelAnime, &object_wallmaster_Anim_009520, 3.0f, 0.0f,
Animation_GetLastFrame(&object_wallmaster_Anim_009520.common), 2, -3.0f);
Animation_Change(&this->skelAnime, &gWallmasterHoverAnim, 3.0f, 0.0f, Animation_GetLastFrame(&gWallmasterHoverAnim),
ANIMMODE_ONCE, -3.0f);
this->actor.speedXZ = 0.0f;
this->actor.gravity = 0.0f;
func_808D08D0(this);
@@ -492,7 +491,7 @@ void func_808D1650(EnFloormas* this, GlobalContext* globalCtx) {
}
void func_808D1740(EnFloormas* this) {
Animation_Change(&this->skelAnime, &object_wallmaster_Anim_0019CC, 1.0f, 41.0f, 42.0f, 2, 5.0f);
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 1.0f, 41.0f, 42.0f, ANIMMODE_ONCE, 5.0f);
if ((this->actor.speedXZ < 0.0f) || (this->actionFunc != func_808D1650)) {
this->unk_18E = 30;
} else {
@@ -538,7 +537,7 @@ void func_808D17EC(EnFloormas* this, GlobalContext* globalCtx) {
if ((this->unk_18E == 0) && (sp24 != 0)) {
if (this->skelAnime.endFrame < 45.0f) {
this->skelAnime.endFrame = Animation_GetLastFrame(&object_wallmaster_Anim_0019CC.common);
this->skelAnime.endFrame = Animation_GetLastFrame(&gWallmasterJumpAnim);
} else if (this->actor.params == ENFLOORMAS_GET_7FFF_40) {
func_808D2700(this);
} else {
@@ -569,8 +568,8 @@ void func_808D19D4(EnFloormas* this) {
this->actor.shape.rot.y = parent->shape.rot.y + 0x5555;
this->actor.world.pos = parent->world.pos;
this->actor.params = ENFLOORMAS_GET_7FFF_10;
Animation_Change(&this->skelAnime, &object_wallmaster_Anim_0019CC, 1.0f, 41.0f,
Animation_GetLastFrame(&object_wallmaster_Anim_0019CC.common), 2, 0.0f);
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 1.0f, 41.0f, Animation_GetLastFrame(&gWallmasterJumpAnim),
ANIMMODE_ONCE, 0.0f);
this->collider.dim.radius = sCylinderInit.dim.radius * 0.6f;
this->collider.dim.height = sCylinderInit.dim.height * 0.6f;
this->actor.flags &= ~ACTOR_FLAG_400;
@@ -596,7 +595,7 @@ void func_808D1B44(EnFloormas* this, GlobalContext* globalCtx) {
}
void func_808D1BCC(EnFloormas* this) {
Animation_PlayLoopSetSpeed(&this->skelAnime, &object_wallmaster_Anim_0041F4, 4.5f);
Animation_PlayLoopSetSpeed(&this->skelAnime, &gWallmasterWalkAnim, 4.5f);
this->actor.speedXZ = 5.0f;
this->actionFunc = func_808D1C1C;
}
@@ -623,7 +622,7 @@ void func_808D1C1C(EnFloormas* this, GlobalContext* globalCtx) {
void func_808D1D0C(EnFloormas* this) {
if (this->actionFunc != func_808D1C1C) {
Animation_PlayLoopSetSpeed(&this->skelAnime, &object_wallmaster_Anim_0041F4, 4.5f);
Animation_PlayLoopSetSpeed(&this->skelAnime, &gWallmasterWalkAnim, 4.5f);
}
this->actor.speedXZ = 5.0f;
this->actionFunc = func_808D1D6C;
@@ -686,7 +685,7 @@ void func_808D1F7C(EnFloormas* this, GlobalContext* globalCtx) {
}
void func_808D1FD4(EnFloormas* this) {
Animation_Change(&this->skelAnime, &object_wallmaster_Anim_0019CC, 2.0f, 0.0f, 41.0f, 2, 0.0f);
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 2.0f, 0.0f, 41.0f, ANIMMODE_ONCE, 0.0f);
this->actor.speedXZ = 0.0f;
this->actionFunc = func_808D2040;
}
@@ -716,7 +715,7 @@ void func_808D217C(EnFloormas* this, Player* player) {
Vec3f* ptr;
u8 playerForm;
Animation_Change(&this->skelAnime, &object_wallmaster_Anim_0019CC, 1.0f, 36.0f, 45.0f, 2, -3.0f);
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 1.0f, 36.0f, 45.0f, ANIMMODE_ONCE, -3.0f);
this->actor.flags &= ~ACTOR_FLAG_1;
this->actor.speedXZ = 0.0f;
this->actor.velocity.y = 0.0f;
@@ -772,7 +771,7 @@ void func_808D22C8(EnFloormas* this, GlobalContext* globalCtx) {
}
void func_808D2484(EnFloormas* this) {
Animation_Change(&this->skelAnime, &object_wallmaster_Anim_0019CC, 2.0f, 0.0f, 41.0f, 2, 0.0f);
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 2.0f, 0.0f, 41.0f, ANIMMODE_ONCE, 0.0f);
this->actor.speedXZ = 0.0f;
this->actionFunc = func_808D24F0;
}
@@ -816,7 +815,7 @@ void func_808D24F0(EnFloormas* this, GlobalContext* globalCtx) {
}
void func_808D2700(EnFloormas* this) {
Animation_PlayOnce(&this->skelAnime, &object_wallmaster_Anim_009DB0);
Animation_PlayOnce(&this->skelAnime, &gWallmasterIdleAnim);
this->unk_18E = 0;
this->unk_194 = 1500;
this->actor.params = ENFLOORMAS_GET_7FFF_40;
@@ -881,10 +880,10 @@ void func_808D2764(EnFloormas* this, GlobalContext* globalCtx) {
this->actor.colChkInfo.health = sColChkInfoInit.health;
func_808D0C14(this);
} else if (this->unk_18E == 0) {
Animation_PlayOnce(&this->skelAnime, &object_wallmaster_Anim_0039B0);
Animation_PlayOnce(&this->skelAnime, &gFloormasterTapFingerAnim);
this->unk_18E = 1;
} else {
Animation_PlayOnce(&this->skelAnime, &object_wallmaster_Anim_009DB0);
Animation_PlayOnce(&this->skelAnime, &gWallmasterIdleAnim);
this->unk_18E = 0;
}
}
@@ -924,7 +923,7 @@ void func_808D2AF4(EnFloormas* this, GlobalContext* globalCtx) {
}
void func_808D2B18(EnFloormas* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_wallmaster_Anim_000590, -3.0f);
Animation_MorphToPlayOnce(&this->skelAnime, &gWallmasterDamageAnim, -3.0f);
func_800BE504(&this->actor, &this->collider);
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 20);
this->actor.speedXZ = 5.0f;
@@ -967,7 +966,7 @@ void func_808D2C08(EnFloormas* this, GlobalContext* globalCtx) {
}
void func_808D2CDC(EnFloormas* this) {
Animation_PlayOnce(&this->skelAnime, &object_wallmaster_Anim_000EA4);
Animation_PlayOnce(&this->skelAnime, &gWallmasterRecoverFromDamageAnim);
this->actor.speedXZ = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -1151,9 +1150,10 @@ s32 EnFloormas_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** d
Actor* thisx, Gfx** gfx) {
EnFloormas* this = THIS;
if (limbIndex == 1) {
if (limbIndex == WALLMASTER_LIMB_ROOT) {
pos->z += this->unk_192;
}
return false;
}
@@ -1165,13 +1165,10 @@ void EnFloormas_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dLis
Matrix_GetStateTranslation(&this->limbPos[D_808D393C[limbIndex]]);
}
if (limbIndex == 19) {
if (limbIndex == WALLMASTER_LIMB_WRIST) {
Matrix_GetStateTranslationAndScaledX(1000.0f, &this->limbPos[9]);
Matrix_GetStateTranslationAndScaledX(-1000.0f, &this->limbPos[10]);
return;
}
if (limbIndex == 2) {
} else if (limbIndex == WALLMASTER_LIMB_HAND) {
Matrix_StatePush();
Matrix_InsertTranslation(1600.0f, -700.0f, -1700.0f, MTXMODE_APPLY);
Matrix_InsertYRotation_f(M_PI / 3, MTXMODE_APPLY);
@@ -1179,7 +1176,7 @@ void EnFloormas_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dLis
Matrix_Scale(2.0f, 2.0f, 2.0f, MTXMODE_APPLY);
gSPMatrix((*gfx)++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList((*gfx)++, object_wallmaster_DL_008688);
gSPDisplayList((*gfx)++, gWallmasterLittleFingerDL);
Matrix_StatePop();
}
@@ -2,6 +2,7 @@
#define Z_EN_FLOORMAS_H
#include "global.h"
#include "objects/object_wallmaster/object_wallmaster.h"
struct EnFloormas;
@@ -26,8 +27,8 @@ typedef struct EnFloormas {
/* 0x0190 */ s16 unk_190;
/* 0x0192 */ s16 unk_192;
/* 0x0194 */ s16 unk_194;
/* 0x0196 */ Vec3s jointTable[25];
/* 0x022C */ Vec3s morphTable[25];
/* 0x0196 */ Vec3s jointTable[WALLMASTER_LIMB_MAX];
/* 0x022C */ Vec3s morphTable[WALLMASTER_LIMB_MAX];
/* 0x02C4 */ f32 drawDmgEffAlpha;
/* 0x02C8 */ f32 drawDmgEffScale;
/* 0x02CC */ f32 drawDmgEffFrozenSteamScale;
+3 -3
View File
@@ -186,10 +186,10 @@ void EnPr2_Destroy(Actor* thisx, GlobalContext* globalCtx) {
}
if (this->actor.parent != NULL) {
Actor* parent = this->actor.parent;
EnEncount1* encount1 = (EnEncount1*)this->actor.parent;
if ((parent->update != NULL) && (((EnEncount1*)parent)->unk_14E > 0)) {
((EnEncount1*)parent)->unk_14E--;
if ((encount1->actor.update != NULL) && (encount1->unk_14E > 0)) {
encount1->unk_14E--;
}
}
}
+678 -109
View File
@@ -5,6 +5,8 @@
*/
#include "z_en_wallmas.h"
#include "overlays/actors/ovl_En_Encount1/z_en_encount1.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_400)
@@ -15,22 +17,32 @@ void EnWallmas_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnWallmas_Update(Actor* thisx, GlobalContext* globalCtx);
void EnWallmas_Draw(Actor* thisx, GlobalContext* globalCtx);
void func_80874BE4(EnWallmas* this, GlobalContext* globalCtx);
void func_80874DE8(EnWallmas* this, GlobalContext* globalCtx);
void func_80874FD8(EnWallmas* this, GlobalContext* globalCtx);
void func_80875054(EnWallmas* this, GlobalContext* globalCtx);
void func_80875108(EnWallmas* this, GlobalContext* globalCtx);
void func_8087520C(EnWallmas* this, GlobalContext* globalCtx);
void func_808752CC(EnWallmas* this, GlobalContext* globalCtx);
void func_80875484(EnWallmas* this, GlobalContext* globalCtx);
void func_8087556C(EnWallmas* this, GlobalContext* globalCtx);
void func_80875638(EnWallmas* this, GlobalContext* globalCtx);
void func_8087571C(EnWallmas* this, GlobalContext* globalCtx);
void func_80875910(EnWallmas* this, GlobalContext* globalCtx);
void func_8087596C(EnWallmas* this, GlobalContext* globalCtx);
void func_80875A0C(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_TimerInit(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_WaitToDrop(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_SetupDrop(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_Drop(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_SetupLand(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_Land(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_SetupStand(EnWallmas* this);
void EnWallmas_Stand(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_SetupWalk(EnWallmas* this);
void EnWallmas_Walk(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_SetupJumpToCeiling(EnWallmas* this);
void EnWallmas_JumpToCeiling(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_SetupReturnToCeiling(EnWallmas* this);
void EnWallmas_ReturnToCeiling(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_Damage(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_SetupCooldown(EnWallmas* this);
void EnWallmas_Cooldown(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_SetupDie(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_Die(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_SetupTakePlayer(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_TakePlayer(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_ProximityOrSwitchInit(EnWallmas* this);
void EnWallmas_WaitForProximity(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_WaitForSwitchFlag(EnWallmas* this, GlobalContext* globalCtx);
void EnWallmas_Stun(EnWallmas* this, GlobalContext* globalCtx);
#if 0
const ActorInit En_Wallmas_InitVars = {
ACTOR_EN_WALLMAS,
ACTORCAT_ENEMY,
@@ -43,147 +55,704 @@ const ActorInit En_Wallmas_InitVars = {
(ActorFunc)EnWallmas_Draw,
};
// static ColliderCylinderInit sCylinderInit = {
static ColliderCylinderInit D_80876360 = {
{ COLTYPE_HIT0, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
{ ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON | BUMP_HOOKABLE, OCELEM_ON, },
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_HIT0,
AT_NONE,
AC_ON | AC_TYPE_PLAYER,
OC1_ON | OC1_TYPE_ALL,
OC2_TYPE_1,
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK0,
{ 0x00000000, 0x00, 0x00 },
{ 0xF7CFFFFF, 0x00, 0x00 },
TOUCH_NONE | TOUCH_SFX_NORMAL,
BUMP_ON | BUMP_HOOKABLE,
OCELEM_ON,
},
{ 30, 40, 0, { 0, 0, 0 } },
};
// static DamageTable sDamageTable = {
static DamageTable D_8087638C = {
/* Deku Nut */ DMG_ENTRY(0, 0x1),
/* Deku Stick */ DMG_ENTRY(1, 0x0),
/* Horse trample */ DMG_ENTRY(1, 0x0),
/* Explosives */ DMG_ENTRY(1, 0x0),
/* Zora boomerang */ DMG_ENTRY(1, 0x0),
/* Normal arrow */ DMG_ENTRY(1, 0x0),
/* UNK_DMG_0x06 */ DMG_ENTRY(1, 0x0),
/* Hookshot */ DMG_ENTRY(0, 0xF),
/* Goron punch */ DMG_ENTRY(1, 0x0),
/* Sword */ DMG_ENTRY(1, 0x0),
/* Goron pound */ DMG_ENTRY(1, 0x0),
/* Fire arrow */ DMG_ENTRY(2, 0x2),
/* Ice arrow */ DMG_ENTRY(1, 0x3),
/* Light arrow */ DMG_ENTRY(2, 0x4),
/* Goron spikes */ DMG_ENTRY(1, 0x0),
/* Deku spin */ DMG_ENTRY(0, 0x1),
/* Deku bubble */ DMG_ENTRY(1, 0x0),
/* Deku launch */ DMG_ENTRY(2, 0x0),
/* UNK_DMG_0x12 */ DMG_ENTRY(0, 0x1),
/* Zora barrier */ DMG_ENTRY(0, 0x5),
/* Normal shield */ DMG_ENTRY(0, 0x0),
/* Light ray */ DMG_ENTRY(0, 0x0),
/* Thrown object */ DMG_ENTRY(1, 0x0),
/* Zora punch */ DMG_ENTRY(1, 0x0),
/* Spin attack */ DMG_ENTRY(1, 0x0),
/* Sword beam */ DMG_ENTRY(0, 0x0),
/* Normal Roll */ DMG_ENTRY(0, 0x0),
/* UNK_DMG_0x1B */ DMG_ENTRY(0, 0x0),
/* UNK_DMG_0x1C */ DMG_ENTRY(0, 0x0),
/* Unblockable */ DMG_ENTRY(0, 0x0),
/* UNK_DMG_0x1E */ DMG_ENTRY(0, 0x0),
/* Powder Keg */ DMG_ENTRY(1, 0x0),
typedef enum {
/* 0x0 */ WALLMASTER_DMGEFF_NONE,
/* 0x1 */ WALLMASTER_DMGEFF_STUN,
/* 0x2 */ WALLMASTER_DMGEFF_FIRE_ARROW,
/* 0x3 */ WALLMASTER_DMGEFF_ICE_ARROW,
/* 0x4 */ WALLMASTER_DMGEFF_LIGHT_ARROW,
/* 0x5 */ WALLMASTER_DMGEFF_ZORA_MAGIC,
/* 0xF */ WALLMASTER_DMGEFF_HOOKSHOT = 0xF
} EnWallmasDamageEffect;
static DamageTable sDamageTable = {
/* Deku Nut */ DMG_ENTRY(0, WALLMASTER_DMGEFF_STUN),
/* Deku Stick */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Horse trample */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Explosives */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Zora boomerang */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Normal arrow */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* UNK_DMG_0x06 */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Hookshot */ DMG_ENTRY(0, WALLMASTER_DMGEFF_HOOKSHOT),
/* Goron punch */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Sword */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Goron pound */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Fire arrow */ DMG_ENTRY(2, WALLMASTER_DMGEFF_FIRE_ARROW),
/* Ice arrow */ DMG_ENTRY(1, WALLMASTER_DMGEFF_ICE_ARROW),
/* Light arrow */ DMG_ENTRY(2, WALLMASTER_DMGEFF_LIGHT_ARROW),
/* Goron spikes */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Deku spin */ DMG_ENTRY(0, WALLMASTER_DMGEFF_STUN),
/* Deku bubble */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Deku launch */ DMG_ENTRY(2, WALLMASTER_DMGEFF_NONE),
/* UNK_DMG_0x12 */ DMG_ENTRY(0, WALLMASTER_DMGEFF_STUN),
/* Zora barrier */ DMG_ENTRY(0, WALLMASTER_DMGEFF_ZORA_MAGIC),
/* Normal shield */ DMG_ENTRY(0, WALLMASTER_DMGEFF_NONE),
/* Light ray */ DMG_ENTRY(0, WALLMASTER_DMGEFF_NONE),
/* Thrown object */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Zora punch */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Spin attack */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
/* Sword beam */ DMG_ENTRY(0, WALLMASTER_DMGEFF_NONE),
/* Normal Roll */ DMG_ENTRY(0, WALLMASTER_DMGEFF_NONE),
/* UNK_DMG_0x1B */ DMG_ENTRY(0, WALLMASTER_DMGEFF_NONE),
/* UNK_DMG_0x1C */ DMG_ENTRY(0, WALLMASTER_DMGEFF_NONE),
/* Unblockable */ DMG_ENTRY(0, WALLMASTER_DMGEFF_NONE),
/* UNK_DMG_0x1E */ DMG_ENTRY(0, WALLMASTER_DMGEFF_NONE),
/* Powder Keg */ DMG_ENTRY(1, WALLMASTER_DMGEFF_NONE),
};
// sColChkInfoInit
static CollisionCheckInfoInit D_808763AC = { 3, 30, 40, 150 };
static CollisionCheckInfoInit sColChkInfoInit = { 3, 30, 40, 150 };
// static InitChainEntry sInitChain[] = {
static InitChainEntry D_808763B4[] = {
static InitChainEntry sInitChain[] = {
ICHAIN_S8(hintId, 48, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 5500, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1500, ICHAIN_STOP),
};
#endif
static f32 sYOffsetPerForm[] = { 50.0f, 55.0f, 50.0f, 20.0f, 30.0f };
extern ColliderCylinderInit D_80876360;
extern DamageTable D_8087638C;
extern CollisionCheckInfoInit D_808763AC;
extern InitChainEntry D_808763B4[];
/**
* This maps a given limb based on its limbIndex to its appropriate index
* in the limbPos array. An index of -1 indicates that the limb is not part
* of the limbPos array.
*/
static s8 sLimbIndexToLimbPosIndex[] = {
-1, -1, -1, -1, 0, -1, -1, 1, -1, 2, -1, -1, 3, -1, 4, -1, -1, 5, -1, -1, -1, 6, 7, -1, 8,
};
extern UNK_TYPE D_06000590;
extern UNK_TYPE D_06000EA4;
extern UNK_TYPE D_060019CC;
extern UNK_TYPE D_0600299C;
extern UNK_TYPE D_060041F4;
extern UNK_TYPE D_06008688;
extern UNK_TYPE D_06009244;
extern UNK_TYPE D_06009520;
extern UNK_TYPE D_06009DB0;
extern UNK_TYPE D_0600A054;
void EnWallmas_Init(Actor* thisx, GlobalContext* globalCtx) {
EnWallmas* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/EnWallmas_Init.s")
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.5f);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gWallmasterSkel, &gWallmasterIdleAnim, this->jointTable,
this->morphTable, WALLMASTER_LIMB_MAX);
Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/EnWallmas_Destroy.s")
this->switchFlag = WALLMASTER_GET_SWITCH_FLAG(thisx);
this->actor.params &= 0xFF;
this->detectionRadius = this->actor.shape.rot.x * 40.0f * 0.1f;
this->actor.shape.rot.x = 0;
this->actor.world.rot.x = 0;
if (this->detectionRadius <= 0.0f) {
this->detectionRadius = 200.0f;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80874A88.s")
Actor_SetFocus(&this->actor, 25.0f);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80874B04.s")
if (WALLMASTER_IS_FROZEN(&this->actor)) {
Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_OBJ_ICE_POLY, this->actor.world.pos.x,
this->actor.world.pos.y - 15.0f, this->actor.world.pos.z, this->actor.world.rot.x,
(this->actor.world.rot.y + 0x5900), this->actor.world.rot.z, 0xFF50);
this->actor.params &= ~0x80;
EnWallmas_SetupReturnToCeiling(this);
return;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80874B88.s")
if (WALLMASTER_GET_TYPE(&this->actor) == WALLMASTER_TYPE_FLAG) {
if (Flags_GetSwitch(globalCtx, this->switchFlag)) {
Actor_MarkForDeath(&this->actor);
return;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80874BE4.s")
EnWallmas_ProximityOrSwitchInit(this);
} else if (WALLMASTER_GET_TYPE(&this->actor) == WALLMASTER_TYPE_PROXIMITY) {
EnWallmas_ProximityOrSwitchInit(this);
} else {
EnWallmas_TimerInit(this, globalCtx);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80874D1C.s")
void EnWallmas_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnWallmas* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80874DE8.s")
Collider_DestroyCylinder(globalCtx, &this->collider);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80874F14.s")
if (this->actor.parent != NULL) {
EnEncount1* encount1 = (EnEncount1*)this->actor.parent;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80874FD8.s")
if ((encount1->actor.update != NULL) && (encount1->unk_14E > 0)) {
encount1->unk_14E--;
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80875014.s")
void EnWallmas_Freeze(EnWallmas* this) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
this->drawDmgEffScale = 0.55f;
this->drawDmgEffFrozenSteamScale = 0.82500005f;
this->drawDmgEffAlpha = 1.0f;
this->collider.base.colType = 3;
this->timer = 80;
this->actor.flags &= ~ACTOR_FLAG_400;
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 80);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80875054.s")
void EnWallmas_ThawIfFrozen(EnWallmas* this, GlobalContext* globalCtx) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->collider.base.colType = 0;
this->drawDmgEffAlpha = 0.0f;
Actor_SpawnIceEffects(globalCtx, &this->actor, this->limbPos, 11, 2, 0.3f, 0.2f);
this->actor.flags |= ACTOR_FLAG_400;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_808750B8.s")
void EnWallmas_TimerInit(EnWallmas* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80875108.s")
this->actor.flags &= ~ACTOR_FLAG_1;
this->actor.flags |= ACTOR_FLAG_20;
this->timer = 130;
this->actor.velocity.y = 0.0f;
this->actor.world.pos.y = player->actor.world.pos.y;
this->actor.floorHeight = player->actor.floorHeight;
this->actor.draw = EnWallmas_Draw;
this->actionFunc = EnWallmas_WaitToDrop;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_808751C4.s")
void EnWallmas_WaitToDrop(EnWallmas* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
Vec3f* playerPos = &player->actor.world.pos;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_8087520C.s")
this->actor.world.pos = *playerPos;
this->actor.floorHeight = player->actor.floorHeight;
this->actor.floorPoly = player->actor.floorPoly;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80875248.s")
if (this->timer != 0) {
this->timer--;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_808752CC.s")
if ((player->stateFlags1 & 0x08100000) || (player->stateFlags2 & 0x80) || (player->unk_B5E > 0) ||
(player->actor.freezeTimer > 0) || !(player->actor.bgCheckFlags & 1) ||
((WALLMASTER_GET_TYPE(&this->actor) == WALLMASTER_TYPE_PROXIMITY) &&
(Math_Vec3f_DistXZ(&this->actor.home.pos, playerPos) > (120.f + this->detectionRadius)))) {
func_801A75E8(NA_SE_EN_FALL_AIM);
this->timer = 130;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_808753F0.s")
if (this->timer == 80) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_AIM);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80875484.s")
if (this->timer == 0) {
EnWallmas_SetupDrop(this, globalCtx);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80875518.s")
void EnWallmas_SetupDrop(EnWallmas* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_8087556C.s")
Animation_Change(&this->skelAnime, &gWallmasterLungeAnim, 0.0f, 20.0f,
Animation_GetLastFrame(&gWallmasterLungeAnim), ANIMMODE_ONCE, 0.0f);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_808755A8.s")
this->yTarget = player->actor.world.pos.y;
this->actor.world.pos.y = player->actor.world.pos.y + 300.0f;
this->actor.shape.rot.y = player->actor.shape.rot.y + 0x8000;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.floorHeight = player->actor.floorHeight;
this->actor.flags |= ACTOR_FLAG_1;
this->actor.flags &= ~ACTOR_FLAG_20;
this->actionFunc = EnWallmas_Drop;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80875638.s")
void EnWallmas_Drop(EnWallmas* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_808756AC.s")
if ((player->stateFlags2 & 0x80) || (player->actor.freezeTimer > 0)) {
EnWallmas_SetupReturnToCeiling(this);
} else if (!Play_InCsMode(globalCtx) && !(player->stateFlags2 & 0x10) && (player->invincibilityTimer >= 0) &&
(this->actor.xzDistToPlayer < 30.0f) && (this->actor.playerHeightRel < -5.0f) &&
(-(f32)(player->cylinder.dim.height + 10) < this->actor.playerHeightRel)) {
EnWallmas_SetupTakePlayer(this, globalCtx);
} else if (this->actor.world.pos.y <= this->yTarget) {
this->actor.world.pos.y = this->yTarget;
this->actor.velocity.y = 0.0f;
EnWallmas_SetupLand(this, globalCtx);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_8087571C.s")
void EnWallmas_SetupLand(EnWallmas* this, GlobalContext* globalCtx) {
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 1.0f, 41.0f, Animation_GetLastFrame(&gWallmasterJumpAnim),
ANIMMODE_ONCE, -3.0f);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_808758C8.s")
Actor_SpawnFloorDustRing(globalCtx, &this->actor, &this->actor.world.pos, 15.0f, 6, 20.0f, 300, 100, true);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_LAND);
this->actionFunc = EnWallmas_Land;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80875910.s")
void EnWallmas_Land(EnWallmas* this, GlobalContext* globalCtx) {
if (SkelAnime_Update(&this->skelAnime)) {
EnWallmas_SetupStand(this);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_8087596C.s")
void EnWallmas_SetupStand(EnWallmas* this) {
Animation_PlayOnce(&this->skelAnime, &gWallmasterStandUpAnim);
this->actionFunc = EnWallmas_Stand;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_808759B8.s")
void EnWallmas_Stand(EnWallmas* this, GlobalContext* globalCtx) {
if (SkelAnime_Update(&this->skelAnime)) {
EnWallmas_SetupWalk(this);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80875A0C.s")
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer + 0x8000, 0xB6);
this->actor.world.rot.y = this->actor.shape.rot.y;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80875A74.s")
void EnWallmas_SetupWalk(EnWallmas* this) {
Animation_PlayOnceSetSpeed(&this->skelAnime, &gWallmasterWalkAnim, 3.0f);
this->actor.speedXZ = 3.0f;
this->actionFunc = EnWallmas_Walk;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/EnWallmas_Update.s")
void EnWallmas_Walk(EnWallmas* this, GlobalContext* globalCtx) {
if (SkelAnime_Update(&this->skelAnime)) {
EnWallmas_SetupJumpToCeiling(this);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80875F04.s")
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer + 0x8000, 0xB6);
this->actor.world.rot.y = this->actor.shape.rot.y;
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 12.0f) ||
Animation_OnFrame(&this->skelAnime, 24.0f) || Animation_OnFrame(&this->skelAnime, 36.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_WALK);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_808760A4.s")
void EnWallmas_SetupJumpToCeiling(EnWallmas* this) {
Animation_PlayOnce(&this->skelAnime, &gWallmasterStopWalkAnim);
this->actor.speedXZ = 0.0f;
this->actionFunc = EnWallmas_JumpToCeiling;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/func_80876118.s")
void EnWallmas_JumpToCeiling(EnWallmas* this, GlobalContext* globalCtx) {
if (SkelAnime_Update(&this->skelAnime)) {
EnWallmas_SetupReturnToCeiling(this);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wallmas/EnWallmas_Draw.s")
void EnWallmas_SetupReturnToCeiling(EnWallmas* this) {
this->timer = 0;
this->actor.speedXZ = 0.0f;
Animation_Change(&this->skelAnime, &gWallmasterJumpAnim, 3.0f, 0.0f, Animation_GetLastFrame(&gWallmasterJumpAnim),
ANIMMODE_ONCE, -3.0f);
this->actionFunc = EnWallmas_ReturnToCeiling;
}
void EnWallmas_ReturnToCeiling(EnWallmas* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
SkelAnime_Update(&this->skelAnime);
if (this->skelAnime.curFrame > 20.0f) {
this->actor.world.pos.y += 30.0f;
this->timer += 9;
this->actor.flags &= ~ACTOR_FLAG_2000;
}
if (Animation_OnFrame(&this->skelAnime, 20.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_UP);
}
if (this->actor.playerHeightRel < -900.0f) {
if (WALLMASTER_GET_TYPE(&this->actor) == WALLMASTER_TYPE_FLAG) {
Actor_MarkForDeath(&this->actor);
return;
}
if ((WALLMASTER_GET_TYPE(&this->actor) == WALLMASTER_TYPE_TIMER_ONLY) ||
(Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos) < this->detectionRadius)) {
EnWallmas_TimerInit(this, globalCtx);
} else {
EnWallmas_ProximityOrSwitchInit(this);
}
}
}
void EnWallmas_SetupDamage(EnWallmas* this, s32 arg1) {
Animation_MorphToPlayOnce(&this->skelAnime, &gWallmasterDamageAnim, -3.0f);
if (arg1) {
func_800BE504(&this->actor, &this->collider);
}
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 20);
this->actor.speedXZ = 5.0f;
this->actor.velocity.y = 10.0f;
this->actionFunc = EnWallmas_Damage;
}
void EnWallmas_Damage(EnWallmas* this, GlobalContext* globalCtx) {
if (SkelAnime_Update(&this->skelAnime)) {
if (this->actor.colChkInfo.health == 0) {
EnWallmas_SetupDie(this, globalCtx);
} else {
EnWallmas_SetupCooldown(this);
}
}
if (Animation_OnFrame(&this->skelAnime, 13.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_EYEGOLE_ATTACK);
}
Math_StepToF(&this->actor.speedXZ, 0.0f, 0.2f);
}
void EnWallmas_SetupCooldown(EnWallmas* this) {
Animation_PlayOnce(&this->skelAnime, &gWallmasterRecoverFromDamageAnim);
this->actor.speedXZ = 0.0f;
this->actor.velocity.y = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnWallmas_Cooldown;
}
void EnWallmas_Cooldown(EnWallmas* this, GlobalContext* globalCtx) {
if (SkelAnime_Update(&this->skelAnime)) {
EnWallmas_SetupReturnToCeiling(this);
}
}
void EnWallmas_SetupDie(EnWallmas* this, GlobalContext* globalCtx) {
this->actor.speedXZ = 0.0f;
this->actor.velocity.y = 0.0f;
func_800B3030(globalCtx, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f, 250, -10, 2);
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 11, NA_SE_EN_EXTINCT);
this->actionFunc = EnWallmas_Die;
}
void EnWallmas_Die(EnWallmas* this, GlobalContext* globalCtx) {
if (Math_StepToF(&this->actor.scale.x, 0.0f, 0.0015f)) {
Actor_SetScale(&this->actor, 0.01f);
Item_DropCollectibleRandom(globalCtx, &this->actor, &this->actor.world.pos, 0x90);
Actor_MarkForDeath(&this->actor);
}
this->actor.scale.z = this->actor.scale.x;
this->actor.scale.y = this->actor.scale.x;
}
void EnWallmas_SetupTakePlayer(EnWallmas* this, GlobalContext* globalCtx) {
Animation_MorphToPlayOnce(&this->skelAnime, &gWallmasterHoverAnim, -5.0f);
this->timer = -30;
this->actionFunc = EnWallmas_TakePlayer;
this->actor.speedXZ = 0.0f;
this->actor.velocity.y = 0.0f;
this->yTarget = this->actor.playerHeightRel;
func_800B724C(globalCtx, &this->actor, 18);
}
void EnWallmas_TakePlayer(EnWallmas* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
func_800B8E58(player, player->ageProperties->unk_92 + NA_SE_VO_LI_DAMAGE_S);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_CATCH);
}
if (SkelAnime_Update(&this->skelAnime)) {
player->actor.world.pos.x = this->actor.world.pos.x;
player->actor.world.pos.z = this->actor.world.pos.z;
if (this->timer < 0) {
this->actor.world.pos.y += 2.0f;
} else {
this->actor.world.pos.y += 10.0f;
}
player->actor.world.pos.y = this->actor.world.pos.y - sYOffsetPerForm[((void)0, gSaveContext.save.playerForm)];
if (this->timer == -30) {
func_800B8E58(player, player->ageProperties->unk_92 + NA_SE_VO_LI_TAKEN_AWAY);
}
if (this->timer == 0) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_UP);
}
this->timer += 2;
} else {
Math_StepToF(&this->actor.world.pos.y,
sYOffsetPerForm[((void)0, gSaveContext.save.playerForm)] + player->actor.world.pos.y, 5.0f);
}
Math_StepToF(&this->actor.world.pos.x, player->actor.world.pos.x, 3.0f);
Math_StepToF(&this->actor.world.pos.z, player->actor.world.pos.z, 3.0f);
if (this->timer == 30) {
play_sound(NA_SE_OC_ABYSS);
func_80169FDC(&globalCtx->state);
}
}
void EnWallmas_ProximityOrSwitchInit(EnWallmas* this) {
this->timer = 0;
this->actor.draw = NULL;
this->actor.flags &= ~ACTOR_FLAG_1;
if (WALLMASTER_GET_TYPE(&this->actor) == WALLMASTER_TYPE_PROXIMITY) {
this->actionFunc = EnWallmas_WaitForProximity;
} else {
this->actionFunc = EnWallmas_WaitForSwitchFlag;
}
}
void EnWallmas_WaitForProximity(EnWallmas* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
if (Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos) < this->detectionRadius) {
EnWallmas_TimerInit(this, globalCtx);
}
}
void EnWallmas_WaitForSwitchFlag(EnWallmas* this, GlobalContext* globalCtx) {
if (Flags_GetSwitch(globalCtx, this->switchFlag)) {
EnWallmas_TimerInit(this, globalCtx);
this->timer = 81;
}
}
void EnWallmas_SetupStun(EnWallmas* this) {
this->actor.speedXZ = 0.0f;
if (this->actor.velocity.y > 0.0f) {
this->actor.velocity.y = 0.0f;
}
func_800BE504(&this->actor, &this->collider);
this->actionFunc = EnWallmas_Stun;
}
void EnWallmas_Stun(EnWallmas* this, GlobalContext* globalCtx) {
if (this->timer != 0) {
this->timer--;
}
if (this->timer == 0) {
EnWallmas_ThawIfFrozen(this, globalCtx);
if (this->actor.colChkInfo.health == 0) {
EnWallmas_SetupDamage(this, false);
} else {
this->actor.world.rot.y = this->actor.shape.rot.y;
EnWallmas_SetupReturnToCeiling(this);
}
}
}
void EnWallmas_UpdateDamage(EnWallmas* this, GlobalContext* globalCtx) {
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
Actor_SetDropFlag(&this->actor, &this->collider.info);
if ((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) ||
(!(this->collider.info.acHitInfo->toucher.dmgFlags & 0xDB0B3))) {
if (Actor_ApplyDamage(&this->actor) == 0) {
Enemy_StartFinishingBlow(globalCtx, &this->actor);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_DAIOCTA_REVERSE);
this->actor.flags &= ~ACTOR_FLAG_1;
} else if (this->actor.colChkInfo.damage != 0) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_FALL_DAMAGE);
}
EnWallmas_ThawIfFrozen(this, globalCtx);
if (this->actor.colChkInfo.damageEffect != WALLMASTER_DMGEFF_HOOKSHOT) {
if (this->actor.colChkInfo.damageEffect == WALLMASTER_DMGEFF_ICE_ARROW) {
EnWallmas_Freeze(this);
if (this->actor.colChkInfo.health == 0) {
this->timer = 3;
this->collider.base.acFlags &= ~AC_ON;
}
EnWallmas_SetupStun(this);
} else if (this->actor.colChkInfo.damageEffect == WALLMASTER_DMGEFF_STUN) {
this->timer = 40;
Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
EnWallmas_SetupStun(this);
} else if (this->actor.colChkInfo.damageEffect == WALLMASTER_DMGEFF_ZORA_MAGIC) {
this->timer = 40;
Actor_SetColorFilter(&this->actor, 0, 255, 0, 40);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->drawDmgEffScale = 0.55f;
this->drawDmgEffAlpha = 2.0f;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_MEDIUM;
EnWallmas_SetupStun(this);
} else {
if (this->actor.colChkInfo.damageEffect == WALLMASTER_DMGEFF_FIRE_ARROW) {
this->drawDmgEffAlpha = 4.0f;
this->drawDmgEffScale = 0.55f;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
} else if (this->actor.colChkInfo.damageEffect == WALLMASTER_DMGEFF_LIGHT_ARROW) {
this->drawDmgEffAlpha = 4.0f;
this->drawDmgEffScale = 0.55f;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_CLEAR_TAG,
this->collider.info.bumper.hitPos.x, this->collider.info.bumper.hitPos.y,
this->collider.info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
}
EnWallmas_SetupDamage(this, true);
}
}
}
}
}
void EnWallmas_Update(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnWallmas* this = THIS;
EnWallmas_UpdateDamage(this, globalCtx);
this->actionFunc(this, globalCtx);
if ((this->actionFunc != EnWallmas_WaitToDrop) && (this->actionFunc != EnWallmas_WaitForProximity) &&
(this->actionFunc != EnWallmas_TakePlayer) && (this->actionFunc != EnWallmas_WaitForSwitchFlag)) {
if ((this->actionFunc != EnWallmas_ReturnToCeiling) && (this->actionFunc != EnWallmas_TakePlayer)) {
Actor_MoveWithGravity(&this->actor);
}
if (this->actionFunc != EnWallmas_Drop) {
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 20.0f, 25.0f, 0.0f, 0x1DU);
}
if ((this->actionFunc != EnWallmas_Die) && (this->actionFunc != EnWallmas_Drop)) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
if ((this->actionFunc != EnWallmas_Damage) && (this->actor.bgCheckFlags & 1) &&
(this->actor.freezeTimer == 0)) {
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
}
Actor_SetFocus(&this->actor, 25.0f);
if (this->drawDmgEffAlpha > 0.0f) {
if (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
Math_StepToF(&this->drawDmgEffAlpha, 0.0f, 0.05f);
this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.275f;
this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.55f);
} else if (Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.55f, 0.01375f) == 0) {
func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
}
}
}
void EnWallmas_DrawShadow(EnWallmas* this, GlobalContext* globalCtx) {
s32 pad;
f32 xzScale;
MtxF mf;
Gfx* gfx;
if ((this->actor.floorPoly != NULL) && ((this->timer < 81) || (this->actionFunc == EnWallmas_Stun))) {
OPEN_DISPS(globalCtx->state.gfxCtx);
gfx = POLY_OPA_DISP;
gSPDisplayList(&gfx[0], &sSetupDL[6 * 44]);
gDPSetPrimColor(&gfx[1], 0, 0, 0, 0, 0, 255);
func_800C0094(this->actor.floorPoly, this->actor.world.pos.x, this->actor.floorHeight, this->actor.world.pos.z,
&mf);
Matrix_InsertMatrix(&mf, MTXMODE_NEW);
if ((this->actionFunc != EnWallmas_WaitToDrop) && (this->actionFunc != EnWallmas_ReturnToCeiling) &&
(this->actionFunc != EnWallmas_TakePlayer) && (this->actionFunc != EnWallmas_WaitForSwitchFlag)) {
xzScale = this->actor.scale.x * 50.0f;
} else {
xzScale = CLAMP_MAX(80 - this->timer, 80) * 0.00625f;
}
Matrix_Scale(xzScale, 1.0f, xzScale, MTXMODE_APPLY);
gSPMatrix(&gfx[2], Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(&gfx[3], gCircleShadowDL);
POLY_OPA_DISP = &gfx[4];
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
}
s32 EnWallmas_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
Actor* thisx) {
EnWallmas* this = THIS;
if (limbIndex == WALLMASTER_LIMB_ROOT) {
if (this->actionFunc != EnWallmas_TakePlayer) {
pos->z -= 1600.0f;
} else {
pos->z -= (1600.0f * (this->skelAnime.endFrame - this->skelAnime.curFrame)) / this->skelAnime.endFrame;
}
}
return false;
}
void EnWallmas_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnWallmas* this = THIS;
Gfx* gfx;
if (sLimbIndexToLimbPosIndex[limbIndex] != -1) {
Matrix_GetStateTranslation(&this->limbPos[sLimbIndexToLimbPosIndex[limbIndex]]);
}
if (limbIndex == WALLMASTER_LIMB_WRIST) {
Matrix_GetStateTranslationAndScaledX(1000.0f, &this->limbPos[9]);
Matrix_GetStateTranslationAndScaledX(-1000.0f, &this->limbPos[10]);
} else if (limbIndex == WALLMASTER_LIMB_HAND) {
OPEN_DISPS(globalCtx->state.gfxCtx);
gfx = POLY_OPA_DISP;
Matrix_StatePush();
Matrix_InsertTranslation(1600.0f, -700.0f, -1700.0f, MTXMODE_APPLY);
Matrix_RotateY(0x2AAA, MTXMODE_APPLY);
Matrix_InsertZRotation_s(0xAAA, MTXMODE_APPLY);
Matrix_Scale(2.0f, 2.0f, 2.0f, MTXMODE_APPLY);
gSPMatrix(&gfx[0], Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(&gfx[1], gWallmasterLittleFingerDL);
POLY_OPA_DISP = &gfx[2];
Matrix_StatePop();
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
}
void EnWallmas_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnWallmas* this = THIS;
if (this->actionFunc != EnWallmas_WaitToDrop) {
func_8012C28C(globalCtx->state.gfxCtx);
SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnWallmas_OverrideLimbDraw, EnWallmas_PostLimbDraw,
&this->actor);
Actor_DrawDamageEffects(globalCtx, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
this->drawDmgEffScale, this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha,
this->drawDmgEffType);
}
if (this->actor.colorFilterTimer != 0) {
func_800AE5A0(globalCtx);
}
EnWallmas_DrawShadow(this, globalCtx);
}
@@ -2,16 +2,54 @@
#define Z_EN_WALLMAS_H
#include "global.h"
#include "objects/object_wallmaster/object_wallmaster.h"
#define WALLMASTER_GET_TYPE(thisx) ((thisx)->params)
#define WALLMASTER_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0xFF)
#define WALLMASTER_IS_FROZEN(thisx) ((thisx)->params & 0x80)
/**
* This type determines under what conditions the Wallmaster will drop from the ceiling.
* - WALLMASTER_TYPE_TIMER_ONLY: These Wallmasters don't check for anything to determine
* whether or not to drop; they just set a 130-frame timer and drop once it reaches 0.
* - WALLMASTER_TYPE_PROXIMITY: These Wallmasters ensure that the player in within a certain
* distance of their current position (as dictated by detectionRadius); once the player
* enters that range, they set a 130-frame timer and drop once it reaches 0.
* - WALLMASTER_TYPE_FLAG: These Wallmasters wait for a certain switch flag to be activated,
* as specified in their params. Once this switch is activated, they set an 81-frame timer
* and drop once it reaches 0.
*
* While in the "waiting to drop" state, all Wallmaster variations can be forced to reset the
* timer to 130 frames if the player enters certain states (e.g., if the player is no longer
* touching the ground). Additionally, WALLMASTER_TYPE_PROXIMITY-type Wallmasters will reset
* the timer to 130 frames if the player strays too far from the Wallmaster's current position.
*/
typedef enum {
/* 0x00 */ WALLMASTER_TYPE_TIMER_ONLY,
/* 0x01 */ WALLMASTER_TYPE_PROXIMITY,
/* 0x02 */ WALLMASTER_TYPE_FLAG
} WallmasterType;
struct EnWallmas;
typedef void (*EnWallmasActionFunc)(struct EnWallmas*, GlobalContext*);
typedef struct EnWallmas {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x44];
/* 0x0188 */ EnWallmasActionFunc actionFunc;
/* 0x018C */ char unk_18C[0x218];
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnWallmasActionFunc actionFunc;
/* 0x18C */ u8 drawDmgEffType;
/* 0x18E */ s16 timer;
/* 0x190 */ s16 switchFlag;
/* 0x192 */ Vec3s jointTable[WALLMASTER_LIMB_MAX];
/* 0x228 */ Vec3s morphTable[WALLMASTER_LIMB_MAX];
/* 0x2C0 */ f32 yTarget;
/* 0x2C4 */ f32 detectionRadius;
/* 0x2C8 */ f32 drawDmgEffAlpha;
/* 0x2CC */ f32 drawDmgEffScale;
/* 0x2D0 */ f32 drawDmgEffFrozenSteamScale;
/* 0x2D4 */ Vec3f limbPos[11];
/* 0x358 */ ColliderCylinder collider;
} EnWallmas; // size = 0x3A4
extern const ActorInit En_Wallmas_InitVars;
+33 -33
View File
@@ -5108,40 +5108,40 @@
0x80872BC0:("func_80872BC0",),
0x80874810:("EnWallmas_Init",),
0x80874A28:("EnWallmas_Destroy",),
0x80874A88:("func_80874A88",),
0x80874B04:("func_80874B04",),
0x80874B88:("func_80874B88",),
0x80874BE4:("func_80874BE4",),
0x80874D1C:("func_80874D1C",),
0x80874DE8:("func_80874DE8",),
0x80874F14:("func_80874F14",),
0x80874FD8:("func_80874FD8",),
0x80875014:("func_80875014",),
0x80875054:("func_80875054",),
0x808750B8:("func_808750B8",),
0x80875108:("func_80875108",),
0x808751C4:("func_808751C4",),
0x8087520C:("func_8087520C",),
0x80875248:("func_80875248",),
0x808752CC:("func_808752CC",),
0x808753F0:("func_808753F0",),
0x80875484:("func_80875484",),
0x80875518:("func_80875518",),
0x8087556C:("func_8087556C",),
0x808755A8:("func_808755A8",),
0x80875638:("func_80875638",),
0x808756AC:("func_808756AC",),
0x8087571C:("func_8087571C",),
0x808758C8:("func_808758C8",),
0x80875910:("func_80875910",),
0x8087596C:("func_8087596C",),
0x808759B8:("func_808759B8",),
0x80875A0C:("func_80875A0C",),
0x80875A74:("func_80875A74",),
0x80874A88:("EnWallmas_Freeze",),
0x80874B04:("EnWallmas_ThawIfFrozen",),
0x80874B88:("EnWallmas_TimerInit",),
0x80874BE4:("EnWallmas_WaitToDrop",),
0x80874D1C:("EnWallmas_SetupDrop",),
0x80874DE8:("EnWallmas_Drop",),
0x80874F14:("EnWallmas_SetupLand",),
0x80874FD8:("EnWallmas_Land",),
0x80875014:("EnWallmas_SetupStand",),
0x80875054:("EnWallmas_Stand",),
0x808750B8:("EnWallmas_SetupWalk",),
0x80875108:("EnWallmas_Walk",),
0x808751C4:("EnWallmas_SetupJumpToCeiling",),
0x8087520C:("EnWallmas_JumpToCeiling",),
0x80875248:("EnWallmas_SetupReturnToCeiling",),
0x808752CC:("EnWallmas_ReturnToCeiling",),
0x808753F0:("EnWallmas_SetupDamage",),
0x80875484:("EnWallmas_Damage",),
0x80875518:("EnWallmas_SetupCooldown",),
0x8087556C:("EnWallmas_Cooldown",),
0x808755A8:("EnWallmas_SetupDie",),
0x80875638:("EnWallmas_Die",),
0x808756AC:("EnWallmas_SetupTakePlayer",),
0x8087571C:("EnWallmas_TakePlayer",),
0x808758C8:("EnWallmas_ProximityOrSwitchInit",),
0x80875910:("EnWallmas_WaitForProximity",),
0x8087596C:("EnWallmas_WaitForSwitchFlag",),
0x808759B8:("EnWallmas_SetupStun",),
0x80875A0C:("EnWallmas_Stun",),
0x80875A74:("EnWallmas_Update",),
0x80875CF4:("EnWallmas_Update",),
0x80875F04:("func_80875F04",),
0x808760A4:("func_808760A4",),
0x80876118:("func_80876118",),
0x80875F04:("EnWallmas_DrawShadow",),
0x808760A4:("EnWallmas_OverrideLimbDraw",),
0x80876118:("EnWallmas_PostLimbDraw",),
0x80876268:("EnWallmas_Draw",),
0x80876670:("EnDodongo_Init",),
0x808768D0:("EnDodongo_Destroy",),
+1 -4
View File
@@ -5801,10 +5801,7 @@
0x808763AC:("D_808763AC","UNK_TYPE1","",0x1),
0x808763B4:("D_808763B4","UNK_TYPE1","",0x1),
0x808763C0:("D_808763C0","UNK_TYPE1","",0x1),
0x808763D4:("D_808763D4","UNK_TYPE1","",0x1),
0x808763D6:("D_808763D6","UNK_TYPE1","",0x1),
0x808763E6:("D_808763E6","UNK_TYPE1","",0x1),
0x808763E7:("D_808763E7","UNK_TYPE1","",0x1),
0x808763D4:("D_808763D4","s8","[25]",0x25),
0x808763F0:("D_808763F0","f32","",0x4),
0x808763F4:("D_808763F4","f32","",0x4),
0x808763F8:("D_808763F8","f32","",0x4),
-14
View File
@@ -1591,20 +1591,6 @@ D_0601A830 = 0x0601A830;
D_060014C8 = 0x060014C8;
D_06001C38 = 0x06001C38;
// ovl_En_Wallmas
D_06000590 = 0x06000590;
D_06000EA4 = 0x06000EA4;
D_060019CC = 0x060019CC;
D_0600299C = 0x0600299C;
D_060041F4 = 0x060041F4;
D_06008688 = 0x06008688;
D_06008FB0 = 0x06008FB0;
D_06009244 = 0x06009244;
D_06009520 = 0x06009520;
D_06009DB0 = 0x06009DB0;
D_0600A054 = 0x0600A054;
// ovl_En_Wdhand
D_060000F4 = 0x060000F4;