1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-11-14 21:40:03 +00:00

Document Player Knockback related functions (#1601)

* document knockback related functions

* rotation -> yRot

* implement some changes

* Renames and comments

* mq bss

* format

* Intangibility and Invulnerability

* bss

* .bss

* add #pragma increment_block_number to z_en_item00.c

* .bss
This commit is contained in:
mzxrules 2024-09-23 18:31:00 -04:00 committed by GitHub
parent 0f725405d1
commit 56981d5297
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
62 changed files with 298 additions and 187 deletions

View file

@ -838,11 +838,11 @@ void Actor_SetClosestSecretDistance(Actor* actor, struct PlayState* play);
s32 Actor_IsMounted(struct PlayState* play, Actor* horse); s32 Actor_IsMounted(struct PlayState* play, Actor* horse);
u32 Actor_SetRideActor(struct PlayState* play, Actor* horse, s32 mountSide); u32 Actor_SetRideActor(struct PlayState* play, Actor* horse, s32 mountSide);
s32 Actor_NotMounted(struct PlayState* play, Actor* horse); s32 Actor_NotMounted(struct PlayState* play, Actor* horse);
void func_8002F698(struct PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5, u32 arg6); void Actor_SetPlayerKnockback(struct PlayState* play, Actor* actor, f32 speed, s16 rot, f32 yVelocity, u32 type, u32 damage);
void func_8002F6D4(struct PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5); void Actor_SetPlayerKnockbackLarge(struct PlayState* play, Actor* actor, f32 speed, s16 rot, f32 yVelocity, u32 damage);
void func_8002F71C(struct PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4); void Actor_SetPlayerKnockbackLargeNoDamage(struct PlayState* play, Actor* actor, f32 speed, s16 rot, f32 yVelocity);
void func_8002F758(struct PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5); void Actor_SetPlayerKnockbackSmall(struct PlayState* play, Actor* actor, f32 speed, s16 rot, f32 yVelocity, u32 damage);
void func_8002F7A0(struct PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4); void Actor_SetPlayerKnockbackSmallNoDamage(struct PlayState* play, Actor* actor, f32 speed, s16 rot, f32 yVelocity);
void Player_PlaySfx(struct Player* player, u16 sfxId); void Player_PlaySfx(struct Player* player, u16 sfxId);
void Actor_PlaySfx(Actor* actor, u16 sfxId); void Actor_PlaySfx(Actor* actor, u16 sfxId);
void Actor_PlaySfx_SurfaceBomb(struct PlayState* play, Actor* actor); void Actor_PlaySfx_SurfaceBomb(struct PlayState* play, Actor* actor);

View file

@ -604,6 +604,21 @@ typedef enum PlayerStickDirection {
/* 3 */ PLAYER_STICK_DIR_RIGHT /* 3 */ PLAYER_STICK_DIR_RIGHT
} PlayerStickDirection; } PlayerStickDirection;
typedef enum {
/* 0 */ PLAYER_KNOCKBACK_NONE, // No knockback
/* 1 */ PLAYER_KNOCKBACK_SMALL, // A small hop, remains standing up
/* 2 */ PLAYER_KNOCKBACK_LARGE, // Sent flying in the air and lands laying down on the floor
/* 3 */ PLAYER_KNOCKBACK_LARGE_SHOCK // Same as`PLAYER_KNOCKBACK_LARGE` with a shock effect
} PlayerKnockbackType;
typedef enum {
/* 0 */ PLAYER_HIT_RESPONSE_NONE,
/* 1 */ PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE,
/* 2 */ PLAYER_HIT_RESPONSE_KNOCKBACK_SMALL,
/* 3 */ PLAYER_HIT_RESPONSE_ICE_TRAP,
/* 4 */ PLAYER_HIT_RESPONSE_ELECTRIC_SHOCK
} PlayerDamageResponseType;
typedef struct PlayerAgeProperties { typedef struct PlayerAgeProperties {
/* 0x00 */ f32 ceilingCheckHeight; /* 0x00 */ f32 ceilingCheckHeight;
/* 0x04 */ f32 unk_04; /* 0x04 */ f32 unk_04;
@ -875,7 +890,7 @@ typedef struct Player {
/* 0x088C */ u8 ledgeClimbType; /* 0x088C */ u8 ledgeClimbType;
/* 0x088D */ u8 ledgeClimbDelayTimer; /* 0x088D */ u8 ledgeClimbDelayTimer;
/* 0x088E */ u8 unk_88E; /* 0x088E */ u8 unk_88E;
/* 0x088F */ u8 unk_88F; /* 0x088F */ u8 damageFlickerAnimCounter; // Used to flicker Link after taking damage
/* 0x0890 */ u8 unk_890; /* 0x0890 */ u8 unk_890;
/* 0x0891 */ u8 bodyShockTimer; /* 0x0891 */ u8 bodyShockTimer;
/* 0x0892 */ u8 unk_892; /* 0x0892 */ u8 unk_892;
@ -886,11 +901,11 @@ typedef struct Player {
/* 0x089A */ s16 floorPitchAlt; // the calculation for this value is bugged and doesn't represent anything meaningful /* 0x089A */ s16 floorPitchAlt; // the calculation for this value is bugged and doesn't represent anything meaningful
/* 0x089C */ s16 unk_89C; /* 0x089C */ s16 unk_89C;
/* 0x089E */ u16 floorSfxOffset; /* 0x089E */ u16 floorSfxOffset;
/* 0x08A0 */ u8 unk_8A0; /* 0x08A0 */ u8 knockbackDamage;
/* 0x08A1 */ u8 unk_8A1; /* 0x08A1 */ u8 knockbackType;
/* 0x08A2 */ s16 unk_8A2; /* 0x08A2 */ s16 knockbackRot;
/* 0x08A4 */ f32 unk_8A4; /* 0x08A4 */ f32 knockbackSpeed;
/* 0x08A8 */ f32 unk_8A8; /* 0x08A8 */ f32 knockbackYVelocity;
/* 0x08AC */ f32 pushedSpeed; // Pushing player, examples include water currents, floor conveyors, climbing sloped surfaces /* 0x08AC */ f32 pushedSpeed; // Pushing player, examples include water currents, floor conveyors, climbing sloped surfaces
/* 0x08B0 */ s16 pushedYaw; // Yaw direction of player being pushed /* 0x08B0 */ s16 pushedYaw; // Yaw direction of player being pushed
/* 0x08B4 */ WeaponInfo meleeWeaponInfo[3]; /* 0x08B4 */ WeaponInfo meleeWeaponInfo[3];
@ -901,7 +916,7 @@ typedef struct Player {
/* 0x0A61 */ u8 bodyFlameTimers[PLAYER_BODYPART_MAX]; // one flame per body part /* 0x0A61 */ u8 bodyFlameTimers[PLAYER_BODYPART_MAX]; // one flame per body part
/* 0x0A73 */ u8 unk_A73; /* 0x0A73 */ u8 unk_A73;
/* 0x0A74 */ AfterPutAwayFunc afterPutAwayFunc; // See `Player_SetupWaitForPutAway` and `Player_Action_WaitForPutAway` /* 0x0A74 */ AfterPutAwayFunc afterPutAwayFunc; // See `Player_SetupWaitForPutAway` and `Player_Action_WaitForPutAway`
/* 0x0A78 */ s8 invincibilityTimer; // prevents damage when nonzero (positive = visible, counts towards zero each frame) /* 0x0A78 */ s8 invincibilityTimer; // prevents damage when nonzero. Positive values are intangibility, negative are invulnerability
/* 0x0A79 */ u8 floorTypeTimer; // counts up every frame the current floor type is the same as the last frame /* 0x0A79 */ u8 floorTypeTimer; // counts up every frame the current floor type is the same as the last frame
/* 0x0A7A */ u8 floorProperty; /* 0x0A7A */ u8 floorProperty;
/* 0x0A7B */ u8 prevFloorType; /* 0x0A7B */ u8 prevFloorType;

View file

@ -27,7 +27,7 @@
#endif #endif
#pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ #pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \
"ntsc-1.2:108" "ntsc-1.2:102"
StackEntry sDmaMgrStackInfo; StackEntry sDmaMgrStackInfo;
OSMesgQueue sDmaMgrMsgQueue; OSMesgQueue sDmaMgrMsgQueue;

View file

@ -42,8 +42,8 @@
*/ */
#if PLATFORM_GC #if PLATFORM_GC
#pragma increment_block_number "gc-eu:208 gc-eu-mq:208 gc-eu-mq-dbg:192 gc-jp:208 gc-jp-ce:208 gc-jp-mq:208 gc-us:208" \ #pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-eu-mq-dbg:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192" \
"gc-us-mq:208" "gc-us-mq:192"
#include "global.h" #include "global.h"
#include "alloca.h" #include "alloca.h"

View file

@ -23,7 +23,7 @@ extern struct IrqMgr gIrqMgr;
#endif #endif
#pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \ #pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \
"ntsc-1.2:166" "ntsc-1.2:160"
extern u8 _buffersSegmentEnd[]; extern u8 _buffersSegmentEnd[];

View file

@ -1901,30 +1901,79 @@ s32 Actor_NotMounted(PlayState* play, Actor* horse) {
} }
} }
void func_8002F698(PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5, u32 arg6) { /**
* Sets the player's knockback properties
*
* @param play
* @param actor source actor applying knockback damage
* @param speed
* @param rot the direction the player will be pushed
* @param yVelocity
* @param type PlayerKnockbackType
* @param damage additional amount of damage to deal to the player
*/
void Actor_SetPlayerKnockback(PlayState* play, Actor* actor, f32 speed, s16 rot, f32 yVelocity, u32 type, u32 damage) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
player->unk_8A0 = arg6; player->knockbackDamage = damage;
player->unk_8A1 = arg5; player->knockbackType = type;
player->unk_8A4 = arg2; player->knockbackSpeed = speed;
player->unk_8A2 = arg3; player->knockbackRot = rot;
player->unk_8A8 = arg4; player->knockbackYVelocity = yVelocity;
} }
void func_8002F6D4(PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5) { /**
func_8002F698(play, actor, arg2, arg3, arg4, 2, arg5); * Knocks the player to the ground
*
* @param play
* @param actor source actor applying knockback damage
* @param speed
* @param rot the direction the player will be pushed
* @param yVelocity
* @param damage additional amount of damage to deal to the player
*/
void Actor_SetPlayerKnockbackLarge(PlayState* play, Actor* actor, f32 speed, s16 rot, f32 yVelocity, u32 damage) {
Actor_SetPlayerKnockback(play, actor, speed, rot, yVelocity, PLAYER_KNOCKBACK_LARGE, damage);
} }
void func_8002F71C(PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4) { /**
func_8002F6D4(play, actor, arg2, arg3, arg4, 0); * Knocks the player to the ground, without applying additional damage
*
* @param play
* @param actor source actor applying knockback damage
* @param speed
* @param rot the direction the player will be pushed
* @param yVelocity
*/
void Actor_SetPlayerKnockbackLargeNoDamage(PlayState* play, Actor* actor, f32 speed, s16 rot, f32 yVelocity) {
Actor_SetPlayerKnockbackLarge(play, actor, speed, rot, yVelocity, 0);
} }
void func_8002F758(PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5) { /**
func_8002F698(play, actor, arg2, arg3, arg4, 1, arg5); * Knocks the player back while keeping them on their feet
*
* @param play
* @param actor
* @param speed overridden
* @param rot the direction the player will be pushed
* @param yVelocity overridden
* @param damage additional amount of damage to deal to the player
*/
void Actor_SetPlayerKnockbackSmall(PlayState* play, Actor* actor, f32 speed, s16 rot, f32 yVelocity, u32 damage) {
Actor_SetPlayerKnockback(play, actor, speed, rot, yVelocity, PLAYER_KNOCKBACK_SMALL, damage);
} }
void func_8002F7A0(PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4) { /**
func_8002F758(play, actor, arg2, arg3, arg4, 0); * Knocks the player back while keeping them on their feet, without applying additional damage
*
* @param play
* @param actor
* @param speed overridden
* @param rot the direction the player will be pushed
* @param yVelocity overridden
*/
void Actor_SetPlayerKnockbackSmallNoDamage(PlayState* play, Actor* actor, f32 speed, s16 rot, f32 yVelocity) {
Actor_SetPlayerKnockbackSmall(play, actor, speed, rot, yVelocity, 0);
} }
/** /**

View file

@ -1,7 +1,7 @@
#include "global.h" #include "global.h"
#include "terminal.h" #include "terminal.h"
#pragma increment_block_number "ntsc-1.2:152" #pragma increment_block_number "ntsc-1.2:148"
u16 DynaSSNodeList_GetNextNodeIdx(DynaSSNodeList* nodeList); u16 DynaSSNodeList_GetNextNodeIdx(DynaSSNodeList* nodeList);
void BgCheck_GetStaticLookupIndicesFromPos(CollisionContext* colCtx, Vec3f* pos, Vec3i* sector); void BgCheck_GetStaticLookupIndicesFromPos(CollisionContext* colCtx, Vec3f* pos, Vec3i* sector);

View file

@ -3638,7 +3638,7 @@ s32 Camera_KeepOn3(Camera* camera) {
} }
#pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ #pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \
"ntsc-1.2:110" "ntsc-1.2:104"
s32 Camera_KeepOn4(Camera* camera) { s32 Camera_KeepOn4(Camera* camera) {
static Vec3f D_8015BD50; static Vec3f D_8015BD50;

View file

@ -5,7 +5,7 @@
#include "overlays/effects/ovl_Effect_Ss_HitMark/z_eff_ss_hitmark.h" #include "overlays/effects/ovl_Effect_Ss_HitMark/z_eff_ss_hitmark.h"
#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0 ntsc-1.2:224" #pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0 ntsc-1.2:216"
typedef s32 (*ColChkResetFunc)(PlayState*, Collider*); typedef s32 (*ColChkResetFunc)(PlayState*, Collider*);
typedef void (*ColChkApplyFunc)(PlayState*, CollisionCheckContext*, Collider*); typedef void (*ColChkApplyFunc)(PlayState*, CollisionCheckContext*, Collider*);

View file

@ -3,7 +3,7 @@
#include "versions.h" #include "versions.h"
#pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ #pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \
"ntsc-1.2:224" "ntsc-1.2:192"
ALIGNED(16) SaveContext gSaveContext; ALIGNED(16) SaveContext gSaveContext;
u32 D_8015FA88; u32 D_8015FA88;

View file

@ -124,7 +124,7 @@ u16 gCamAtSplinePointsAppliedFrame;
u16 gCamEyePointAppliedFrame; u16 gCamEyePointAppliedFrame;
u16 gCamAtPointAppliedFrame; u16 gCamAtPointAppliedFrame;
#pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \ #pragma increment_block_number "gc-eu:192 gc-eu-mq:176 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \
"ntsc-1.2:96" "ntsc-1.2:96"
// Cam ID to return to when a scripted cutscene is finished // Cam ID to return to when a scripted cutscene is finished

View file

@ -3,6 +3,9 @@
#include "assets/objects/gameplay_keep/gameplay_keep.h" #include "assets/objects/gameplay_keep/gameplay_keep.h"
#include "overlays/effects/ovl_Effect_Ss_Dead_Sound/z_eff_ss_dead_sound.h" #include "overlays/effects/ovl_Effect_Ss_Dead_Sound/z_eff_ss_dead_sound.h"
#pragma increment_block_number \
"gc-eu:0 gc-eu-mq:0 gc-eu-mq-dbg:0 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128"
#define FLAGS 0 #define FLAGS 0
void EnItem00_Init(Actor* thisx, PlayState* play); void EnItem00_Init(Actor* thisx, PlayState* play);

View file

@ -7,8 +7,7 @@
#include "assets/objects/gameplay_keep/gameplay_keep.h" #include "assets/objects/gameplay_keep/gameplay_keep.h"
#include "assets/objects/gameplay_field_keep/gameplay_field_keep.h" #include "assets/objects/gameplay_field_keep/gameplay_field_keep.h"
#pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ #pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0 ntsc-1.2:0"
"ntsc-1.2:0"
typedef enum LightningBoltState { typedef enum LightningBoltState {
/* 0x00 */ LIGHTNING_BOLT_START, /* 0x00 */ LIGHTNING_BOLT_START,
@ -213,7 +212,7 @@ s16 sLightningFlashAlpha;
s16 sSunDepthTestX; s16 sSunDepthTestX;
s16 sSunDepthTestY; s16 sSunDepthTestY;
#pragma increment_block_number "gc-eu:112 gc-eu-mq:112 gc-jp:96 gc-jp-ce:96 gc-jp-mq:96 gc-us:96 gc-us-mq:96" \ #pragma increment_block_number "gc-eu:240 gc-eu-mq:240 gc-jp:216 gc-jp-ce:216 gc-jp-mq:216 gc-us:216 gc-us-mq:216" \
"ntsc-1.2:224" "ntsc-1.2:224"
LightNode* sNGameOverLightNode; LightNode* sNGameOverLightNode;

View file

@ -114,7 +114,7 @@ void BgHakaTubo_Idle(BgHakaTubo* this, PlayState* play) {
// Colliding with flame circle // Colliding with flame circle
if (this->flamesCollider.base.atFlags & AT_HIT) { if (this->flamesCollider.base.atFlags & AT_HIT) {
this->flamesCollider.base.atFlags &= ~AT_HIT; this->flamesCollider.base.atFlags &= ~AT_HIT;
func_8002F71C(play, &this->dyna.actor, 5.0f, this->dyna.actor.yawTowardsPlayer, 5.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->dyna.actor, 5.0f, this->dyna.actor.yawTowardsPlayer, 5.0f);
} }
// Colliding with collider inside the pot // Colliding with collider inside the pot
if (this->potCollider.base.acFlags & AC_HIT) { if (this->potCollider.base.acFlags & AC_HIT) {

View file

@ -212,7 +212,7 @@ void BgHidanCurtain_Update(Actor* thisx, PlayState* play2) {
} else { } else {
if (this->collider.base.atFlags & AT_HIT) { if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT; this->collider.base.atFlags &= ~AT_HIT;
func_8002F71C(play, &this->actor, 5.0f, this->actor.yawTowardsPlayer, 1.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 5.0f, this->actor.yawTowardsPlayer, 1.0f);
} }
if ((this->type == 4) || (this->type == 5)) { if ((this->type == 4) || (this->type == 5)) {
this->actor.world.pos.y = (2.0f * this->actor.home.pos.y) - hcParams->riseDist - this->actor.world.pos.y; this->actor.world.pos.y = (2.0f * this->actor.home.pos.y) - hcParams->riseDist - this->actor.world.pos.y;

View file

@ -132,7 +132,7 @@ void BgHidanFirewall_Collide(BgHidanFirewall* this, PlayState* play) {
phi_a3 = this->actor.shape.rot.y + 0x8000; phi_a3 = this->actor.shape.rot.y + 0x8000;
} }
func_8002F71C(play, &this->actor, 5.0f, phi_a3, 1.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 5.0f, phi_a3, 1.0f);
} }
void BgHidanFirewall_ColliderFollowPlayer(BgHidanFirewall* this, PlayState* play) { void BgHidanFirewall_ColliderFollowPlayer(BgHidanFirewall* this, PlayState* play) {

View file

@ -222,7 +222,7 @@ void BgHidanFwbig_Update(Actor* thisx, PlayState* play) {
if (this->collider.base.atFlags & AT_HIT) { if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT; this->collider.base.atFlags &= ~AT_HIT;
func_8002F71C(play, &this->actor, 5.0f, this->actor.world.rot.y, 1.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 5.0f, this->actor.world.rot.y, 1.0f);
if (this->direction != 0) { if (this->direction != 0) {
this->actionFunc = BgHidanFwbig_Lower; this->actionFunc = BgHidanFwbig_Lower;
} }

View file

@ -259,7 +259,7 @@ void func_8088D750(BgHidanSekizou* this, PlayState* play) {
phi_a3 = -0x4000; phi_a3 = -0x4000;
} }
} }
func_8002F71C(play, &this->dyna.actor, 5.0f, phi_a3, 1.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->dyna.actor, 5.0f, phi_a3, 1.0f);
} }
void BgHidanSekizou_Update(Actor* thisx, PlayState* play2) { void BgHidanSekizou_Update(Actor* thisx, PlayState* play2) {

View file

@ -152,7 +152,7 @@ void BgJyaGoroiwa_Move(BgJyaGoroiwa* this, PlayState* play) {
thisx->world.rot.y += 0x8000; thisx->world.rot.y += 0x8000;
} }
func_8002F6D4(play, thisx, 2.0f, thisx->yawTowardsPlayer, 0.0f, 0); Actor_SetPlayerKnockbackLarge(play, thisx, 2.0f, thisx->yawTowardsPlayer, 0.0f, 0);
Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT); Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT);
this->yOffsetSpeed = 10.0f; this->yOffsetSpeed = 10.0f;

View file

@ -97,13 +97,13 @@ void func_8089B4C8(BgJyaZurerukabe* this, PlayState* play) {
case 3: case 3:
case 5: case 5:
if (fabsf(D_8089B9C0[D_8089BA30[i]]) > 1.0f) { if (fabsf(D_8089B9C0[D_8089BA30[i]]) > 1.0f) {
func_8002F6D4(play, &this->dyna.actor, 1.5f, this->dyna.actor.shape.rot.y, 0.0f, 0); Actor_SetPlayerKnockbackLarge(play, &this->dyna.actor, 1.5f, this->dyna.actor.shape.rot.y, 0.0f, 0);
} }
break; break;
case 1: case 1:
case 4: case 4:
if (fabsf(D_8089B9C0[D_8089BA30[i]] - D_8089B9C0[D_8089BA30[i + 1]]) > 1.0f) { if (fabsf(D_8089B9C0[D_8089BA30[i]] - D_8089B9C0[D_8089BA30[i + 1]]) > 1.0f) {
func_8002F6D4(play, &this->dyna.actor, 1.5f, this->dyna.actor.shape.rot.y, 0.0f, 0); Actor_SetPlayerKnockbackLarge(play, &this->dyna.actor, 1.5f, this->dyna.actor.shape.rot.y, 0.0f, 0);
} }
break; break;
} }

View file

@ -137,7 +137,7 @@ void BgYdanMaruta_Destroy(Actor* thisx, PlayState* play) {
void func_808BEFF4(BgYdanMaruta* this, PlayState* play) { void func_808BEFF4(BgYdanMaruta* this, PlayState* play) {
if (this->collider.base.atFlags & AT_HIT) { if (this->collider.base.atFlags & AT_HIT) {
func_8002F71C(play, &this->dyna.actor, 7.0f, this->dyna.actor.shape.rot.y, 6.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->dyna.actor, 7.0f, this->dyna.actor.shape.rot.y, 6.0f);
} }
this->dyna.actor.shape.rot.x += 0x360; this->dyna.actor.shape.rot.x += 0x360;
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);

View file

@ -1485,7 +1485,7 @@ void BossFd_UpdateEffects(BossFd* this, PlayState* play) {
diff.z = player->actor.world.pos.z - effect->pos.z; diff.z = player->actor.world.pos.z - effect->pos.z;
if ((this->timers[3] == 0) && (sqrtf(SQ(diff.x) + SQ(diff.y) + SQ(diff.z)) < 20.0f)) { if ((this->timers[3] == 0) && (sqrtf(SQ(diff.x) + SQ(diff.y) + SQ(diff.z)) < 20.0f)) {
this->timers[3] = 50; this->timers[3] = 50;
func_8002F6D4(play, NULL, 5.0f, effect->kbAngle, 0.0f, 0x30); Actor_SetPlayerKnockbackLarge(play, NULL, 5.0f, effect->kbAngle, 0.0f, 0x30);
if (!player->bodyIsBurning) { if (!player->bodyIsBurning) {
s16 i2; s16 i2;

View file

@ -295,7 +295,7 @@ void BossFd2_Emerge(BossFd2* this, PlayState* play) {
case 2: case 2:
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 0x7D0); Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 0x7D0);
if ((this->timers[0] == 1) && (this->actor.xzDistToPlayer < 120.0f)) { if ((this->timers[0] == 1) && (this->actor.xzDistToPlayer < 120.0f)) {
func_8002F6D4(play, &this->actor, 3.0f, this->actor.yawTowardsPlayer, 2.0f, 0x20); Actor_SetPlayerKnockbackLarge(play, &this->actor, 3.0f, this->actor.yawTowardsPlayer, 2.0f, 0x20);
Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT); Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
} }
if (Animation_OnFrame(&this->skelAnime, this->fwork[FD2_END_FRAME])) { if (Animation_OnFrame(&this->skelAnime, this->fwork[FD2_END_FRAME])) {

View file

@ -3981,7 +3981,7 @@ void BossGanon_LightBall_Update(Actor* thisx, PlayState* play2) {
} else { } else {
if (sqrtf(SQ(xDistFromLink) + SQ(yDistFromLink) + SQ(zDistFromLink)) <= 25.0f) { if (sqrtf(SQ(xDistFromLink) + SQ(yDistFromLink) + SQ(zDistFromLink)) <= 25.0f) {
spBA = 5; spBA = 5;
func_8002F6D4(play, &this->actor, 3.0f, this->actor.world.rot.y, 0.0f, 0x30); Actor_SetPlayerKnockbackLarge(play, &this->actor, 3.0f, this->actor.world.rot.y, 0.0f, 0x30);
SfxSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_GANON_HIT_THUNDER); SfxSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_GANON_HIT_THUNDER);
ganondorf->timers[2] = 20; ganondorf->timers[2] = 20;
@ -4453,7 +4453,7 @@ void func_808E2544(Actor* thisx, PlayState* play) {
this->actor.speed = 0.0f; this->actor.speed = 0.0f;
if (dorf->timers[2] == 0) { if (dorf->timers[2] == 0) {
func_8002F6D4(play, &this->actor, 3.0f, this->actor.world.rot.y, 0.0f, 0x50); Actor_SetPlayerKnockbackLarge(play, &this->actor, 3.0f, this->actor.world.rot.y, 0.0f, 0x50);
SfxSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_GANON_HIT_THUNDER); SfxSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_GANON_HIT_THUNDER);
dorf->timers[2] = 20; dorf->timers[2] = 20;
@ -4775,7 +4775,8 @@ void BossGanon_UpdateEffects(PlayState* play) {
if (((eff->scale * 150.0f) < distToPlayer) && (distToPlayer < (eff->scale * 300.0f))) { if (((eff->scale * 150.0f) < distToPlayer) && (distToPlayer < (eff->scale * 300.0f))) {
eff->timer = 150; eff->timer = 150;
func_8002F6D4(play, &sGanondorf->actor, 7.0f, sGanondorf->actor.yawTowardsPlayer, 0.0f, 0x20); Actor_SetPlayerKnockbackLarge(play, &sGanondorf->actor, 7.0f,
sGanondorf->actor.yawTowardsPlayer, 0.0f, 0x20);
} }
} }
} }

View file

@ -1859,7 +1859,8 @@ void func_80902348(BossGanon2* this, PlayState* play) {
phi_v0_2 = 0; phi_v0_2 = 0;
} }
func_8002F6D4(play, &this->actor, 15.0f, this->actor.yawTowardsPlayer + phi_v0_2, 2.0f, 0); Actor_SetPlayerKnockbackLarge(play, &this->actor, 15.0f, this->actor.yawTowardsPlayer + phi_v0_2, 2.0f,
0);
sZelda->unk_3C8 = 8; sZelda->unk_3C8 = 8;
this->unk_316 = 10; this->unk_316 = 10;
break; break;
@ -1880,7 +1881,7 @@ void func_80902348(BossGanon2* this, PlayState* play) {
} }
player->bodyIsBurning = true; player->bodyIsBurning = true;
func_8002F6D4(play, &this->actor, 10.0f, Math_Atan2S(temp_f12, temp_f2), 0.0f, 0x10); Actor_SetPlayerKnockbackLarge(play, &this->actor, 10.0f, Math_Atan2S(temp_f12, temp_f2), 0.0f, 0x10);
sZelda->unk_3C8 = 8; sZelda->unk_3C8 = 8;
} }
} }

View file

@ -825,7 +825,8 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) {
player->actor.parent = NULL; player->actor.parent = NULL;
player->csAction = PLAYER_CSACTION_NONE; player->csAction = PLAYER_CSACTION_NONE;
if (this->timers[0] == 0) { if (this->timers[0] == 0) {
func_8002F6D4(play, &this->actor, 20.0f, this->actor.shape.rot.y + 0x8000, 10.0f, 0); Actor_SetPlayerKnockbackLarge(play, &this->actor, 20.0f, this->actor.shape.rot.y + 0x8000,
10.0f, 0);
} }
} }
this->timers[0] = 75; this->timers[0] = 75;

View file

@ -769,7 +769,7 @@ void BossSst_HeadCharge(BossSst* this, PlayState* play) {
this->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT); this->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT);
sHands[LEFT]->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT); sHands[LEFT]->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT);
sHands[RIGHT]->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT); sHands[RIGHT]->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT);
func_8002F71C(play, &this->actor, 10.0f, this->actor.shape.rot.y, 5.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 10.0f, this->actor.shape.rot.y, 5.0f);
Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT); Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT);
} }
} }
@ -1524,7 +1524,7 @@ void BossSst_HandSlam(BossSst* this, PlayState* play) {
player->actor.world.pos.z = (Math_CosS(this->actor.yawTowardsPlayer) * 100.0f) + this->actor.world.pos.z; player->actor.world.pos.z = (Math_CosS(this->actor.yawTowardsPlayer) * 100.0f) + this->actor.world.pos.z;
this->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT); this->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT);
func_8002F71C(play, &this->actor, 5.0f, this->actor.yawTowardsPlayer, 0.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 5.0f, this->actor.yawTowardsPlayer, 0.0f);
} }
Math_ScaledStepToS(&this->actor.shape.rot.x, 0, 0x200); Math_ScaledStepToS(&this->actor.shape.rot.x, 0, 0x200);
@ -1584,7 +1584,8 @@ void BossSst_HandSweep(BossSst* this, PlayState* play) {
this->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT); this->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT);
this->ready = true; this->ready = true;
func_8002F71C(play, &this->actor, 5.0f, this->actor.shape.rot.y - (this->vParity * 0x3800), 0.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 5.0f,
this->actor.shape.rot.y - (this->vParity * 0x3800), 0.0f);
Player_PlaySfx(player, NA_SE_PL_BODY_HIT); Player_PlaySfx(player, NA_SE_PL_BODY_HIT);
newTargetYaw = this->actor.shape.rot.y - (this->vParity * 0x1400); newTargetYaw = this->actor.shape.rot.y - (this->vParity * 0x1400);
if (((s16)(newTargetYaw - this->targetYaw) * this->vParity) > 0) { if (((s16)(newTargetYaw - this->targetYaw) * this->vParity) > 0) {
@ -1643,7 +1644,7 @@ void BossSst_HandPunch(BossSst* this, PlayState* play) {
BossSst_HandSetupRetreat(this); BossSst_HandSetupRetreat(this);
} else if (this->colliderJntSph.base.atFlags & AT_HIT) { } else if (this->colliderJntSph.base.atFlags & AT_HIT) {
Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT); Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT);
func_8002F71C(play, &this->actor, 10.0f, this->actor.shape.rot.y, 5.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 10.0f, this->actor.shape.rot.y, 5.0f);
BossSst_HandSetupRetreat(this); BossSst_HandSetupRetreat(this);
} }
@ -1961,7 +1962,7 @@ void BossSst_HandSwing(BossSst* this, PlayState* play) {
BossSst_HandReleasePlayer(this, play, false); BossSst_HandReleasePlayer(this, play, false);
player->actor.world.pos.x += 70.0f * Math_SinS(this->actor.shape.rot.y); player->actor.world.pos.x += 70.0f * Math_SinS(this->actor.shape.rot.y);
player->actor.world.pos.z += 70.0f * Math_CosS(this->actor.shape.rot.y); player->actor.world.pos.z += 70.0f * Math_CosS(this->actor.shape.rot.y);
func_8002F71C(play, &this->actor, 15.0f, this->actor.shape.rot.y, 2.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 15.0f, this->actor.shape.rot.y, 2.0f);
Player_PlaySfx(player, NA_SE_PL_BODY_HIT); Player_PlaySfx(player, NA_SE_PL_BODY_HIT);
} }
@ -2083,7 +2084,7 @@ void BossSst_HandReadyCharge(BossSst* this, PlayState* play) {
this->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT); this->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT);
OTHER_HAND(this)->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT); OTHER_HAND(this)->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT);
sHead->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT); sHead->colliderJntSph.base.atFlags &= ~(AT_ON | AT_HIT);
func_8002F71C(play, &this->actor, 10.0f, this->actor.shape.rot.y, 5.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 10.0f, this->actor.shape.rot.y, 5.0f);
Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT); Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT);
} }
} }
@ -2433,7 +2434,7 @@ void BossSst_HandReleasePlayer(BossSst* this, PlayState* play, s32 dropPlayer) {
this->colliderJntSph.base.ocFlags1 |= OC1_ON; this->colliderJntSph.base.ocFlags1 |= OC1_ON;
OTHER_HAND(this)->colliderJntSph.base.ocFlags1 |= OC1_ON; OTHER_HAND(this)->colliderJntSph.base.ocFlags1 |= OC1_ON;
if (dropPlayer) { if (dropPlayer) {
func_8002F71C(play, &this->actor, 0.0f, this->actor.shape.rot.y, 0.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 0.0f, this->actor.shape.rot.y, 0.0f);
} }
} }
} }

View file

@ -804,7 +804,7 @@ s32 BossTw_BeamHitPlayerCheck(BossTw* this, PlayState* play) {
if (sTwinrovaPtr->timers[2] == 0) { if (sTwinrovaPtr->timers[2] == 0) {
sTwinrovaPtr->timers[2] = 150; sTwinrovaPtr->timers[2] = 150;
this->beamDist = sqrtf(SQ(offset.x) + SQ(offset.y) + SQ(offset.z)); this->beamDist = sqrtf(SQ(offset.x) + SQ(offset.y) + SQ(offset.z));
func_8002F6D4(play, &this->actor, 3.0f, this->actor.shape.rot.y, 0.0f, 0x20); Actor_SetPlayerKnockbackLarge(play, &this->actor, 3.0f, this->actor.shape.rot.y, 0.0f, 0x20);
if (this->actor.params == TW_KOTAKE) { if (this->actor.params == TW_KOTAKE) {
if (sFreezeState == 0) { if (sFreezeState == 0) {

View file

@ -1071,7 +1071,7 @@ void BossVa_BodyPhase1(BossVa* this, PlayState* play) {
if (this->colliderBody.base.atFlags & AT_HIT) { if (this->colliderBody.base.atFlags & AT_HIT) {
this->colliderBody.base.atFlags &= ~AT_HIT; this->colliderBody.base.atFlags &= ~AT_HIT;
if (this->colliderBody.base.at == &player->actor) { if (this->colliderBody.base.at == &player->actor) {
func_8002F71C(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f);
} }
} }
@ -1161,7 +1161,7 @@ void BossVa_BodyPhase2(BossVa* this, PlayState* play) {
sPhase2Timer = (sPhase2Timer + 0x18) & 0xFFF0; sPhase2Timer = (sPhase2Timer + 0x18) & 0xFFF0;
if (this->colliderBody.base.at == &player->actor) { if (this->colliderBody.base.at == &player->actor) {
func_8002F71C(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f);
Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT); Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
} }
} }
@ -1237,7 +1237,7 @@ void BossVa_BodyPhase3(BossVa* this, PlayState* play) {
if (this->colliderBody.base.atFlags & AT_HIT) { if (this->colliderBody.base.atFlags & AT_HIT) {
this->colliderBody.base.atFlags &= ~AT_HIT; this->colliderBody.base.atFlags &= ~AT_HIT;
if (this->colliderBody.base.at == &player->actor) { if (this->colliderBody.base.at == &player->actor) {
func_8002F71C(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f);
this->actor.world.rot.y += (s16)Rand_CenteredFloat(0x2EE0) + 0x8000; this->actor.world.rot.y += (s16)Rand_CenteredFloat(0x2EE0) + 0x8000;
Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT); Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
} }
@ -1358,7 +1358,7 @@ void BossVa_BodyPhase4(BossVa* this, PlayState* play) {
if (this->colliderBody.base.atFlags & AT_HIT) { if (this->colliderBody.base.atFlags & AT_HIT) {
this->colliderBody.base.atFlags &= ~AT_HIT; this->colliderBody.base.atFlags &= ~AT_HIT;
if (this->colliderBody.base.at == &player->actor) { if (this->colliderBody.base.at == &player->actor) {
func_8002F71C(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f);
this->actor.world.rot.y += (s16)Rand_CenteredFloat(0x2EE0) + 0x8000; this->actor.world.rot.y += (s16)Rand_CenteredFloat(0x2EE0) + 0x8000;
Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT); Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
} }
@ -2545,7 +2545,8 @@ void BossVa_BariPhase3Attack(BossVa* this, PlayState* play) {
this->vaBariUnused.y += this->vaBariUnused.z; this->vaBariUnused.y += this->vaBariUnused.z;
if ((this->colliderLightning.base.atFlags & AT_HIT) || (this->colliderSph.base.atFlags & AT_HIT)) { if ((this->colliderLightning.base.atFlags & AT_HIT) || (this->colliderSph.base.atFlags & AT_HIT)) {
if ((this->colliderLightning.base.at == &player->actor) || (this->colliderSph.base.at == &player->actor)) { if ((this->colliderLightning.base.at == &player->actor) || (this->colliderSph.base.at == &player->actor)) {
func_8002F71C(play, &this->actor, 8.0f, GET_BODY(this)->actor.yawTowardsPlayer, 8.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 8.0f, GET_BODY(this)->actor.yawTowardsPlayer,
8.0f);
Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT); Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
this->colliderSph.base.at = NULL; this->colliderSph.base.at = NULL;
this->colliderLightning.base.at = NULL; this->colliderLightning.base.at = NULL;
@ -2640,7 +2641,8 @@ void BossVa_BariPhase2Attack(BossVa* this, PlayState* play) {
if ((this->colliderLightning.base.atFlags & AT_HIT) || (this->colliderSph.base.atFlags & AT_HIT)) { if ((this->colliderLightning.base.atFlags & AT_HIT) || (this->colliderSph.base.atFlags & AT_HIT)) {
if ((this->colliderLightning.base.at == &player->actor) || (this->colliderSph.base.at == &player->actor)) { if ((this->colliderLightning.base.at == &player->actor) || (this->colliderSph.base.at == &player->actor)) {
func_8002F71C(play, &this->actor, 8.0f, GET_BODY(this)->actor.yawTowardsPlayer, 8.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 8.0f, GET_BODY(this)->actor.yawTowardsPlayer,
8.0f);
Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT); Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
this->colliderSph.base.at = NULL; this->colliderSph.base.at = NULL;
this->colliderLightning.base.at = NULL; this->colliderLightning.base.at = NULL;

View file

@ -188,7 +188,7 @@ void DemoKekkai_Update(Actor* thisx, PlayState* play2) {
if (this->energyAlpha > 0.99f) { if (this->energyAlpha > 0.99f) {
if ((this->collider1.base.atFlags & AT_HIT) || (this->collider2.base.atFlags & AT_HIT)) { if ((this->collider1.base.atFlags & AT_HIT) || (this->collider2.base.atFlags & AT_HIT)) {
func_8002F71C(play, &this->actor, 6.0f, this->actor.yawTowardsPlayer, 6.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 6.0f, this->actor.yawTowardsPlayer, 6.0f);
} }
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider1.base); CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider1.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider1.base); CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider1.base);
@ -246,7 +246,7 @@ void DemoKekkai_TrialBarrierIdle(Actor* thisx, PlayState* play) {
DemoKekkai* this = (DemoKekkai*)thisx; DemoKekkai* this = (DemoKekkai*)thisx;
if (this->collider1.base.atFlags & AT_HIT) { if (this->collider1.base.atFlags & AT_HIT) {
func_8002F71C(play, &this->actor, 5.0f, this->actor.yawTowardsPlayer, 5.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 5.0f, this->actor.yawTowardsPlayer, 5.0f);
} }
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider1.base); CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider1.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider1.base); CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider1.base);

View file

@ -353,7 +353,7 @@ void DoorKiller_FallOver(DoorKiller* this, PlayState* play) {
if ((fabsf(playerPosRelToDoor.y) < 20.0f) && (fabsf(playerPosRelToDoor.x) < 20.0f) && if ((fabsf(playerPosRelToDoor.y) < 20.0f) && (fabsf(playerPosRelToDoor.x) < 20.0f) &&
(playerPosRelToDoor.z < 100.0f) && (playerPosRelToDoor.z > 0.0f)) { (playerPosRelToDoor.z < 100.0f) && (playerPosRelToDoor.z > 0.0f)) {
this->hasHitPlayerOrGround |= 1; this->hasHitPlayerOrGround |= 1;
func_8002F6D4(play, &this->actor, 6.0f, this->actor.yawTowardsPlayer, 6.0f, 16); Actor_SetPlayerKnockbackLarge(play, &this->actor, 6.0f, this->actor.yawTowardsPlayer, 6.0f, 0x10);
Actor_PlaySfx(&this->actor, NA_SE_EN_KDOOR_HIT); Actor_PlaySfx(&this->actor, NA_SE_EN_KDOOR_HIT);
Player_PlaySfx(player, NA_SE_PL_BODY_HIT); Player_PlaySfx(player, NA_SE_PL_BODY_HIT);
} }

View file

@ -360,7 +360,7 @@ void EnAttackNiw_Update(Actor* thisx, PlayState* play) {
cucco = (EnNiw*)this->actor.parent; cucco = (EnNiw*)this->actor.parent;
if ((this->actor.parent->update != NULL) && (this->actor.parent != NULL) && (cucco != NULL) && if ((this->actor.parent->update != NULL) && (this->actor.parent != NULL) && (cucco != NULL) &&
(cucco->timer9 == 0) && (player->invincibilityTimer == 0)) { (cucco->timer9 == 0) && (player->invincibilityTimer == 0)) {
func_8002F6D4(play, &this->actor, 2.0f, this->actor.world.rot.y, 0.0f, 0x10); Actor_SetPlayerKnockbackLarge(play, &this->actor, 2.0f, this->actor.world.rot.y, 0.0f, 0x10);
cucco->timer9 = 0x46; cucco->timer9 = 0x46;
} }
} }

View file

@ -311,7 +311,7 @@ void EnBa_SwingAtPlayer(EnBa* this, PlayState* play) {
if (this->collider.base.atFlags & AT_HIT) { if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT; this->collider.base.atFlags &= ~AT_HIT;
if (this->collider.base.at == &player->actor) { if (this->collider.base.at == &player->actor) {
func_8002F71C(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f);
} }
} }

View file

@ -171,7 +171,7 @@ void func_809BC598(EnBdfire* this, PlayState* play) {
player->bodyFlameTimers[i] = Rand_S16Offset(0, 200); player->bodyFlameTimers[i] = Rand_S16Offset(0, 200);
} }
player->bodyIsBurning = true; player->bodyIsBurning = true;
func_8002F6D4(play, &this->actor, 20.0f, this->actor.world.rot.y, 0.0f, 8); Actor_SetPlayerKnockbackLarge(play, &this->actor, 20.0f, this->actor.world.rot.y, 0.0f, 8);
PRINTF("POWER\n"); PRINTF("POWER\n");
} }
} }

View file

@ -731,7 +731,7 @@ void func_809BE798(EnBigokuta* this, PlayState* play) {
} else { } else {
effectRot = -0x6000; effectRot = -0x6000;
} }
func_8002F71C(play, &this->actor, 10.0f, this->actor.world.rot.y + effectRot, 5.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 10.0f, this->actor.world.rot.y + effectRot, 5.0f);
if (this->actionFunc == func_809BDC08) { if (this->actionFunc == func_809BDC08) {
func_809BD4A4(this); func_809BD4A4(this);
this->unk_196 = 40; this->unk_196 = 40;

View file

@ -151,7 +151,8 @@ void EnBrob_Idle(EnBrob* this, PlayState* play) {
} }
if (this->timer == 0) { if (this->timer == 0) {
if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) { if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
func_8002F71C(play, &this->dyna.actor, 5.0f, this->dyna.actor.yawTowardsPlayer, 1.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->dyna.actor, 5.0f, this->dyna.actor.yawTowardsPlayer,
1.0f);
EnBrob_SetupMoveUp(this, play); EnBrob_SetupMoveUp(this, play);
} else if (this->dyna.actor.xzDistToPlayer < 300.0f) { } else if (this->dyna.actor.xzDistToPlayer < 300.0f) {
EnBrob_SetupMoveUp(this, play); EnBrob_SetupMoveUp(this, play);
@ -277,7 +278,8 @@ void EnBrob_Update(Actor* thisx, PlayState* play2) {
if (this->actionFunc == EnBrob_MoveUp && !(this->colliders[0].base.atFlags & AT_BOUNCED) && if (this->actionFunc == EnBrob_MoveUp && !(this->colliders[0].base.atFlags & AT_BOUNCED) &&
!(this->colliders[1].base.atFlags & AT_BOUNCED)) { !(this->colliders[1].base.atFlags & AT_BOUNCED)) {
func_8002F71C(play, &this->dyna.actor, 5.0f, this->dyna.actor.yawTowardsPlayer, 1.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->dyna.actor, 5.0f, this->dyna.actor.yawTowardsPlayer,
1.0f);
} else if (this->actionFunc != EnBrob_MoveUp) { } else if (this->actionFunc != EnBrob_MoveUp) {
EnBrob_SetupShock(this); EnBrob_SetupShock(this);
} }

View file

@ -115,7 +115,7 @@ void EnBubble_DamagePlayer(EnBubble* this, PlayState* play) {
s32 damage = -this->colliderSphere.elements[0].base.atDmgInfo.damage; s32 damage = -this->colliderSphere.elements[0].base.atDmgInfo.damage;
play->damagePlayer(play, damage); play->damagePlayer(play, damage);
func_8002F7A0(play, &this->actor, 6.0f, this->actor.yawTowardsPlayer, 6.0f); Actor_SetPlayerKnockbackSmallNoDamage(play, &this->actor, 6.0f, this->actor.yawTowardsPlayer, 6.0f);
} }
s32 EnBubble_Explosion(EnBubble* this, PlayState* play) { s32 EnBubble_Explosion(EnBubble* this, PlayState* play) {

View file

@ -146,14 +146,14 @@ void EnBx_Update(Actor* thisx, PlayState* play) {
} }
if ((&player->actor != this->collider.base.at) && (&player->actor != this->collider.base.ac) && if ((&player->actor != this->collider.base.at) && (&player->actor != this->collider.base.ac) &&
(&player->actor != this->colliderQuad.base.at) && (player->invincibilityTimer <= 0)) { (&player->actor != this->colliderQuad.base.at) && (player->invincibilityTimer <= 0)) {
if (player->invincibilityTimer < -39) { if (player->invincibilityTimer <= -40) {
player->invincibilityTimer = 0; player->invincibilityTimer = 0;
} else { } else {
player->invincibilityTimer = 0; player->invincibilityTimer = 0;
play->damagePlayer(play, -4); play->damagePlayer(play, -4);
} }
} }
func_8002F71C(play, &this->actor, 6.0f, tmp32, 6.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 6.0f, tmp32, 6.0f);
player->invincibilityTimer = tmp33; player->invincibilityTimer = tmp33;
} }

View file

@ -330,7 +330,7 @@ void EnDh_Attack(EnDh* this, PlayState* play) {
this->actionState++; this->actionState++;
} else if (this->collider2.base.atFlags & AT_HIT) { } else if (this->collider2.base.atFlags & AT_HIT) {
this->collider2.base.atFlags &= ~AT_HIT; this->collider2.base.atFlags &= ~AT_HIT;
func_8002F71C(play, &this->actor, 8.0f, this->actor.shape.rot.y, 8.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 8.0f, this->actor.shape.rot.y, 8.0f);
} }
break; break;
case 3: case 3:

View file

@ -338,7 +338,7 @@ void EnExRuppy_WaitToBlowUp(EnExRuppy* this, PlayState* play) {
explosionScaleStep = 6; explosionScaleStep = 6;
} }
EffectSsBomb2_SpawnLayered(play, &this->actor.world.pos, &velocity, &accel, explosionScale, explosionScaleStep); EffectSsBomb2_SpawnLayered(play, &this->actor.world.pos, &velocity, &accel, explosionScale, explosionScaleStep);
func_8002F71C(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f);
Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION); Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
Actor_Kill(&this->actor); Actor_Kill(&this->actor);
} }

View file

@ -303,7 +303,8 @@ s32 EnFd_ColliderCheck(EnFd* this, PlayState* play) {
} }
this->attackTimer = 30; this->attackTimer = 30;
Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT); Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
func_8002F71C(play, &this->actor, this->actor.speed + 2.0f, this->actor.yawTowardsPlayer, 6.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, this->actor.speed + 2.0f,
this->actor.yawTowardsPlayer, 6.0f);
} }
return false; return false;
} }
@ -525,7 +526,7 @@ void EnFd_SpinAndSpawnFire(EnFd* this, PlayState* play) {
f32 tgtSpeed; f32 tgtSpeed;
f32 rotSpeed; f32 rotSpeed;
if ((this->spinTimer < 31) && (this->invincibilityTimer == 0)) { if ((this->spinTimer <= 30) && (this->invincibilityTimer == 0)) {
Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FLAME_FIRE_ATTACK - SFX_FLAG); Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FLAME_FIRE_ATTACK - SFX_FLAG);
} else { } else {
Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FLAME_ROLL - SFX_FLAG); Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_FLAME_ROLL - SFX_FLAG);

View file

@ -535,7 +535,8 @@ void EnFhgFire_EnergyBall(EnFhgFire* this, PlayState* play) {
if ((bossGnd->flyMode >= GND_FLY_VOLLEY) && (this->work[FHGFIRE_RETURN_COUNT] >= 2)) { if ((bossGnd->flyMode >= GND_FLY_VOLLEY) && (this->work[FHGFIRE_RETURN_COUNT] >= 2)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_FANTOM_LAUGH); Actor_PlaySfx(&this->actor, NA_SE_EN_FANTOM_LAUGH);
} }
func_8002F698(play, &this->actor, 3.0f, this->actor.world.rot.y, 0.0f, 3, 0x10); Actor_SetPlayerKnockback(play, &this->actor, 3.0f, this->actor.world.rot.y, 0.0f,
PLAYER_KNOCKBACK_LARGE_SHOCK, 0x10);
} }
break; break;
case FHGFIRE_LIGHT_BLUE: case FHGFIRE_LIGHT_BLUE:

View file

@ -367,7 +367,7 @@ void EnFireRock_Update(Actor* thisx, PlayState* play) {
this->collider.base.atFlags &= ~AT_HIT; this->collider.base.atFlags &= ~AT_HIT;
if (this->collider.base.at == playerActor) { if (this->collider.base.at == playerActor) {
if (!(player->stateFlags1 & PLAYER_STATE1_26)) { if (!(player->stateFlags1 & PLAYER_STATE1_26)) {
func_8002F758(play, thisx, 2.0f, -player->actor.world.rot.y, 3.0f, 4); Actor_SetPlayerKnockbackSmall(play, thisx, 2.0f, -player->actor.world.rot.y, 3.0f, 4);
} }
return; return;
} }

View file

@ -923,7 +923,7 @@ void EnGeldB_SpinAttack(EnGeldB* this, PlayState* play) {
} else if (this->swordCollider.base.atFlags & AT_HIT) { } else if (this->swordCollider.base.atFlags & AT_HIT) {
this->swordCollider.base.atFlags &= ~AT_HIT; this->swordCollider.base.atFlags &= ~AT_HIT;
if (&player->actor == this->swordCollider.base.at) { if (&player->actor == this->swordCollider.base.at) {
func_8002F71C(play, &this->actor, 6.0f, this->actor.yawTowardsPlayer, 6.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 6.0f, this->actor.yawTowardsPlayer, 6.0f);
this->spinAttackState = 2; this->spinAttackState = 2;
Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_24); Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_24);
Message_StartTextbox(play, 0x6003, &this->actor); Message_StartTextbox(play, 0x6003, &this->actor);

View file

@ -714,7 +714,7 @@ void EnGo_StopRolling(EnGo* this, PlayState* play) {
if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) { if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) {
this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER; this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER;
play->damagePlayer(play, -4); play->damagePlayer(play, -4);
func_8002F71C(play, &this->actor, 4.0f, this->actor.yawTowardsPlayer, 6.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 4.0f, this->actor.yawTowardsPlayer, 6.0f);
this->unk_20E = 0x10; this->unk_20E = 0x10;
} }
} }

View file

@ -900,7 +900,7 @@ s32 func_80A44AB0(EnGo2* this, PlayState* play) {
arg2 = this->actionFunc == EnGo2_ContinueRolling ? 1.5f : this->actor.speed * 1.5f; arg2 = this->actionFunc == EnGo2_ContinueRolling ? 1.5f : this->actor.speed * 1.5f;
play->damagePlayer(play, -4); play->damagePlayer(play, -4);
func_8002F71C(play, &this->actor, arg2, this->actor.yawTowardsPlayer, 6.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, arg2, this->actor.yawTowardsPlayer, 6.0f);
Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT); Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
this->collider.base.ocFlags1 &= ~OC1_TYPE_PLAYER; this->collider.base.ocFlags1 &= ~OC1_TYPE_PLAYER;
} }

View file

@ -609,7 +609,7 @@ void EnGoroiwa_Roll(EnGoroiwa* this, PlayState* play) {
EnGoroiwa_FaceNextWaypoint(this, play); EnGoroiwa_FaceNextWaypoint(this, play);
} }
} }
func_8002F6D4(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 0); Actor_SetPlayerKnockbackLarge(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 0);
PRINTF(VT_FGCOL(CYAN)); PRINTF(VT_FGCOL(CYAN));
PRINTF("Player ぶっ飛ばし\n"); // "Player knocked down" PRINTF("Player ぶっ飛ばし\n"); // "Player knocked down"
PRINTF(VT_RST); PRINTF(VT_RST);
@ -695,7 +695,7 @@ void EnGoroiwa_SetupMoveUp(EnGoroiwa* this) {
void EnGoroiwa_MoveUp(EnGoroiwa* this, PlayState* play) { void EnGoroiwa_MoveUp(EnGoroiwa* this, PlayState* play) {
if (this->collider.base.atFlags & AT_HIT) { if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT; this->collider.base.atFlags &= ~AT_HIT;
func_8002F6D4(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 4); Actor_SetPlayerKnockbackLarge(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 4);
Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT); Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT);
if ((this->actor.home.rot.z & 1) == 1) { if ((this->actor.home.rot.z & 1) == 1) {
this->collisionDisabledTimer = 50; this->collisionDisabledTimer = 50;
@ -720,7 +720,7 @@ void EnGoroiwa_SetupMoveDown(EnGoroiwa* this) {
void EnGoroiwa_MoveDown(EnGoroiwa* this, PlayState* play) { void EnGoroiwa_MoveDown(EnGoroiwa* this, PlayState* play) {
if (this->collider.base.atFlags & AT_HIT) { if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT; this->collider.base.atFlags &= ~AT_HIT;
func_8002F6D4(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 4); Actor_SetPlayerKnockbackLarge(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 4);
Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT); Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT);
if ((this->actor.home.rot.z & 1) == 1) { if ((this->actor.home.rot.z & 1) == 1) {
this->collisionDisabledTimer = 50; this->collisionDisabledTimer = 50;

View file

@ -319,7 +319,7 @@ void EnHonotrap_SetupFlameDrop(EnHonotrap* this) {
void EnHonotrap_FlameDrop(EnHonotrap* this, PlayState* play) { void EnHonotrap_FlameDrop(EnHonotrap* this, PlayState* play) {
if ((this->collider.cyl.base.atFlags & AT_HIT) || (this->timer <= 0)) { if ((this->collider.cyl.base.atFlags & AT_HIT) || (this->timer <= 0)) {
if ((this->collider.cyl.base.atFlags & AT_HIT) && !(this->collider.cyl.base.atFlags & AT_BOUNCED)) { if ((this->collider.cyl.base.atFlags & AT_HIT) && !(this->collider.cyl.base.atFlags & AT_BOUNCED)) {
func_8002F71C(play, &this->actor, 5.0f, this->actor.yawTowardsPlayer, 0.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 5.0f, this->actor.yawTowardsPlayer, 0.0f);
} }
this->actor.velocity.x = this->actor.velocity.y = this->actor.velocity.z = 0.0f; this->actor.velocity.x = this->actor.velocity.y = this->actor.velocity.z = 0.0f;
EnHonotrap_SetupFlameVanish(this); EnHonotrap_SetupFlameVanish(this);

View file

@ -820,7 +820,7 @@ void EnIk_UpdateEnemy(Actor* thisx, PlayState* play) {
prevInvincibilityTimer = player->invincibilityTimer; prevInvincibilityTimer = player->invincibilityTimer;
if (player->invincibilityTimer <= 0) { if (player->invincibilityTimer <= 0) {
if (player->invincibilityTimer < -39) { if (player->invincibilityTimer <= -40) {
player->invincibilityTimer = 0; player->invincibilityTimer = 0;
} else { } else {
player->invincibilityTimer = 0; player->invincibilityTimer = 0;
@ -829,7 +829,7 @@ void EnIk_UpdateEnemy(Actor* thisx, PlayState* play) {
} }
} }
func_8002F71C(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f);
player->invincibilityTimer = prevInvincibilityTimer; player->invincibilityTimer = prevInvincibilityTimer;
} }
} }

View file

@ -606,7 +606,7 @@ void EnMb_Stunned(EnMb* this, PlayState* play) {
player->stateFlags2 &= ~PLAYER_STATE2_7; player->stateFlags2 &= ~PLAYER_STATE2_7;
player->actor.parent = NULL; player->actor.parent = NULL;
player->av2.actionVar2 = 200; player->av2.actionVar2 = 200;
func_8002F71C(play, &this->actor, 4.0f, this->actor.world.rot.y, 4.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 4.0f, this->actor.world.rot.y, 4.0f);
this->attack = ENMB_ATTACK_NONE; this->attack = ENMB_ATTACK_NONE;
} }
@ -723,7 +723,7 @@ void EnMb_SpearPatrolEndCharge(EnMb* this, PlayState* play) {
player->stateFlags2 &= ~PLAYER_STATE2_7; player->stateFlags2 &= ~PLAYER_STATE2_7;
player->actor.parent = NULL; player->actor.parent = NULL;
player->av2.actionVar2 = 200; player->av2.actionVar2 = 200;
func_8002F71C(play, &this->actor, 4.0f, this->actor.world.rot.y, 4.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 4.0f, this->actor.world.rot.y, 4.0f);
} }
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) { if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
@ -840,8 +840,9 @@ void EnMb_ClubAttack(EnMb* this, PlayState* play) {
} }
} }
func_8002F71C(play, &this->actor, (650.0f - this->actor.xzDistToPlayer) * 0.04f + 4.0f, Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor,
this->actor.world.rot.y, 8.0f); (650.0f - this->actor.xzDistToPlayer) * 0.04f + 4.0f,
this->actor.world.rot.y, 8.0f);
player->invincibilityTimer = prevPlayerInvincibilityTimer; player->invincibilityTimer = prevPlayerInvincibilityTimer;
} }
@ -911,7 +912,7 @@ void EnMb_SpearPatrolPrepareAndCharge(EnMb* this, PlayState* play) {
if (this->attackCollider.base.at == &player->actor) { if (this->attackCollider.base.at == &player->actor) {
if (!endCharge && !(player->stateFlags2 & PLAYER_STATE2_7)) { if (!endCharge && !(player->stateFlags2 & PLAYER_STATE2_7)) {
if (player->invincibilityTimer < 0) { if (player->invincibilityTimer < 0) {
if (player->invincibilityTimer < -39) { if (player->invincibilityTimer <= -40) {
player->invincibilityTimer = 0; player->invincibilityTimer = 0;
} else { } else {
player->invincibilityTimer = 0; player->invincibilityTimer = 0;
@ -956,7 +957,7 @@ void EnMb_SpearPatrolPrepareAndCharge(EnMb* this, PlayState* play) {
player->stateFlags2 &= ~PLAYER_STATE2_7; player->stateFlags2 &= ~PLAYER_STATE2_7;
player->actor.parent = NULL; player->actor.parent = NULL;
player->av2.actionVar2 = 200; player->av2.actionVar2 = 200;
func_8002F71C(play, &this->actor, 4.0f, this->actor.world.rot.y, 4.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 4.0f, this->actor.world.rot.y, 4.0f);
} }
#endif #endif
} }
@ -1033,7 +1034,7 @@ void EnMb_SpearPatrolImmediateCharge(EnMb* this, PlayState* play) {
player->stateFlags2 &= ~PLAYER_STATE2_7; player->stateFlags2 &= ~PLAYER_STATE2_7;
player->actor.parent = NULL; player->actor.parent = NULL;
player->av2.actionVar2 = 200; player->av2.actionVar2 = 200;
func_8002F71C(play, &this->actor, 4.0f, this->actor.world.rot.y, 4.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 4.0f, this->actor.world.rot.y, 4.0f);
} }
#endif #endif
this->attack = ENMB_ATTACK_NONE; this->attack = ENMB_ATTACK_NONE;
@ -1316,7 +1317,7 @@ void EnMb_SpearDead(EnMb* this, PlayState* play) {
player->stateFlags2 &= ~PLAYER_STATE2_7; player->stateFlags2 &= ~PLAYER_STATE2_7;
player->actor.parent = NULL; player->actor.parent = NULL;
player->av2.actionVar2 = 200; player->av2.actionVar2 = 200;
func_8002F71C(play, &this->actor, 4.0f, this->actor.world.rot.y, 4.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 4.0f, this->actor.world.rot.y, 4.0f);
this->attack = ENMB_ATTACK_NONE; this->attack = ENMB_ATTACK_NONE;
} }
@ -1399,7 +1400,7 @@ void EnMb_CheckColliding(EnMb* this, PlayState* play) {
player->stateFlags2 &= ~PLAYER_STATE2_7; player->stateFlags2 &= ~PLAYER_STATE2_7;
player->actor.parent = NULL; player->actor.parent = NULL;
player->av2.actionVar2 = 200; player->av2.actionVar2 = 200;
func_8002F71C(play, &this->actor, 6.0f, this->actor.world.rot.y, 6.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 6.0f, this->actor.world.rot.y, 6.0f);
} }
this->damageEffect = this->actor.colChkInfo.damageEffect; this->damageEffect = this->actor.colChkInfo.damageEffect;
this->attack = ENMB_ATTACK_NONE; this->attack = ENMB_ATTACK_NONE;

View file

@ -462,7 +462,7 @@ void func_80AAE294(EnMm* this, PlayState* play) {
} }
if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) { if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) {
func_8002F71C(play, &this->actor, 3.0f, this->actor.yawTowardsPlayer, 4.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 3.0f, this->actor.yawTowardsPlayer, 4.0f);
} }
} }
} }

View file

@ -1056,7 +1056,7 @@ void EnNiw_Update(Actor* thisx, PlayState* play) {
dist = 20.0f; dist = 20.0f;
if (this->unk_2A8 != 0 && thisx->xyzDistToPlayerSq < SQ(dist) && player->invincibilityTimer == 0) { if (this->unk_2A8 != 0 && thisx->xyzDistToPlayerSq < SQ(dist) && player->invincibilityTimer == 0) {
func_8002F6D4(play, &this->actor, 2.0f, thisx->world.rot.y, 0.0f, 0x10); Actor_SetPlayerKnockbackLarge(play, &this->actor, 2.0f, thisx->world.rot.y, 0.0f, 0x10);
} }
func_80AB747C(this, play); func_80AB747C(this, play);

View file

@ -196,8 +196,9 @@ void func_80ACE5C8(EnPart* this, PlayState* play) {
play->damagePlayer(play, -8); play->damagePlayer(play, -8);
} }
} }
func_8002F71C(play, this->actor.parent, (650.0f - this->actor.parent->xzDistToPlayer) * 0.04f + 4.0f, Actor_SetPlayerKnockbackLargeNoDamage(play, this->actor.parent,
this->actor.parent->world.rot.y, 8.0f); (650.0f - this->actor.parent->xzDistToPlayer) * 0.04f + 4.0f,
this->actor.parent->world.rot.y, 8.0f);
player->invincibilityTimer = prevInvincibilityTimer; player->invincibilityTimer = prevInvincibilityTimer;
this->timer = 1; this->timer = 1;
} }

View file

@ -324,7 +324,7 @@ void EnRr_SetupReleasePlayer(EnRr* this, PlayState* play) {
break; break;
} }
PRINTF(VT_FGCOL(YELLOW) "%s[%d] : Rr_Catch_Cancel" VT_RST "\n", "../z_en_rr.c", 650); PRINTF(VT_FGCOL(YELLOW) "%s[%d] : Rr_Catch_Cancel" VT_RST "\n", "../z_en_rr.c", 650);
func_8002F6D4(play, &this->actor, 4.0f, this->actor.shape.rot.y, 12.0f, 8); Actor_SetPlayerKnockbackLarge(play, &this->actor, 4.0f, this->actor.shape.rot.y, 12.0f, 8);
if (this->actor.colorFilterTimer == 0) { if (this->actor.colorFilterTimer == 0) {
this->actionFunc = EnRr_Approach; this->actionFunc = EnRr_Approach;
Actor_PlaySfx(&this->actor, NA_SE_EN_LIKE_THROW); Actor_PlaySfx(&this->actor, NA_SE_EN_LIKE_THROW);

View file

@ -471,7 +471,7 @@ s32 EnSsh_CheckHitPlayer(EnSsh* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_STALTU_ROLL); Actor_PlaySfx(&this->actor, NA_SE_EN_STALTU_ROLL);
Actor_PlaySfx(&this->actor, NA_SE_VO_ST_ATTACK); Actor_PlaySfx(&this->actor, NA_SE_VO_ST_ATTACK);
play->damagePlayer(play, -8); play->damagePlayer(play, -8);
func_8002F71C(play, &this->actor, 4.0f, this->actor.yawTowardsPlayer, 6.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 4.0f, this->actor.yawTowardsPlayer, 6.0f);
this->hitCount--; this->hitCount--;
return true; return true;
} }

View file

@ -404,7 +404,7 @@ s32 EnSt_CheckHitPlayer(EnSt* this, PlayState* play) {
this->gaveDamageSpinTimer = 30; this->gaveDamageSpinTimer = 30;
play->damagePlayer(play, -8); play->damagePlayer(play, -8);
Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT); Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
func_8002F71C(play, &this->actor, 4.0f, this->actor.yawTowardsPlayer, 6.0f); Actor_SetPlayerKnockbackLargeNoDamage(play, &this->actor, 4.0f, this->actor.yawTowardsPlayer, 6.0f);
return true; return true;
} }

View file

@ -581,11 +581,11 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) {
if (!Actor_ApplyDamage(&this->actor)) { if (!Actor_ApplyDamage(&this->actor)) {
func_800F5B58(); func_800F5B58();
this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE); this->actor.flags &= ~(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE);
this->unk_8A1 = 2; this->knockbackType = PLAYER_KNOCKBACK_LARGE;
this->unk_8A4 = 6.0f; this->knockbackSpeed = 6.0f;
this->unk_8A8 = 6.0f; this->knockbackYVelocity = 6.0f;
this->unk_8A0 = this->actor.colChkInfo.damage; this->knockbackDamage = this->actor.colChkInfo.damage;
this->unk_8A2 = this->actor.yawTowardsPlayer + 0x8000; this->knockbackRot = this->actor.yawTowardsPlayer + 0x8000;
sDeathFlag++; sDeathFlag++;
sActionState = ENTORCH2_DEATH; sActionState = ENTORCH2_DEATH;
Enemy_StartFinishingBlow(play, &this->actor); Enemy_StartFinishingBlow(play, &this->actor);
@ -601,11 +601,11 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) {
} }
} else { } else {
this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED;
this->unk_8A0 = this->actor.colChkInfo.damage; this->knockbackDamage = this->actor.colChkInfo.damage;
this->unk_8A1 = 1; this->knockbackType = PLAYER_KNOCKBACK_SMALL;
this->unk_8A8 = 6.0f; this->knockbackYVelocity = 6.0f;
this->unk_8A4 = 8.0f; this->knockbackSpeed = 8.0f;
this->unk_8A2 = this->actor.yawTowardsPlayer + 0x8000; this->knockbackRot = this->actor.yawTowardsPlayer + 0x8000;
Actor_SetDropFlag(&this->actor, &this->cylinder.elem, true); Actor_SetDropFlag(&this->actor, &this->cylinder.elem, true);
this->stateFlags3 &= ~PLAYER_STATE3_2; this->stateFlags3 &= ~PLAYER_STATE3_2;
this->stateFlags3 |= PLAYER_STATE3_0; this->stateFlags3 |= PLAYER_STATE3_0;
@ -618,7 +618,7 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) {
} }
} }
this->actor.colChkInfo.damage = 0; this->actor.colChkInfo.damage = 0;
this->unk_8A0 = 0; this->knockbackDamage = PLAYER_KNOCKBACK_NONE;
} }
// Handles being frozen by a deku nut // Handles being frozen by a deku nut

View file

@ -175,7 +175,7 @@ void EnTrap_Update(Actor* thisx, PlayState* play) {
angleToKnockPlayer = thisx->yawTowardsPlayer; angleToKnockPlayer = thisx->yawTowardsPlayer;
} }
play->damagePlayer(play, -4); play->damagePlayer(play, -4);
func_8002F7A0(play, thisx, 6.0f, angleToKnockPlayer, 6.0f); Actor_SetPlayerKnockbackSmallNoDamage(play, thisx, 6.0f, angleToKnockPlayer, 6.0f);
this->playerDmgTimer = 15; this->playerDmgTimer = 15;
} }
if (thisx->params & SPIKETRAP_MODE_LINEAR) { if (thisx->params & SPIKETRAP_MODE_LINEAR) {

View file

@ -1395,8 +1395,7 @@ void func_80B3F3D8(void) {
Sfx_PlaySfxCentered2(NA_SE_PL_SKIP); Sfx_PlaySfxCentered2(NA_SE_PL_SKIP);
} }
#pragma increment_block_number "gc-eu:64 gc-eu-mq:64 gc-jp:64 gc-jp-ce:64 gc-jp-mq:64 gc-us:64 gc-us-mq:64" \ #pragma increment_block_number "gc-eu:64 gc-eu-mq:64 gc-jp:64 gc-jp-ce:64 gc-jp-mq:64 gc-us:64 gc-us-mq:64 ntsc-1.2:64"
"ntsc-1.2:128"
void EnXc_PlayDiveSFX(Vec3f* src, PlayState* play) { void EnXc_PlayDiveSFX(Vec3f* src, PlayState* play) {
static Vec3f D_80B42DA0; static Vec3f D_80B42DA0;

View file

@ -2070,7 +2070,7 @@ void func_80B58014(EnZl3* this, PlayState* play) {
this->action = 34; this->action = 34;
this->unk_3D0 = 0; this->unk_3D0 = 0;
func_80B57AE0(this, play); func_80B57AE0(this, play);
} else if ((invincibilityTimer > 0) || (player->fallDistance >= 0x33)) { } else if ((invincibilityTimer > 0) || (player->fallDistance >= 51)) {
func_80B54E14(this, &gZelda2Anime2Anim_007664, 0, -11.0f, 0); func_80B54E14(this, &gZelda2Anime2Anim_007664, 0, -11.0f, 0);
this->action = 30; this->action = 30;
func_80B537E8(this); func_80B537E8(this);
@ -2225,7 +2225,7 @@ s32 func_80B5899C(EnZl3* this, PlayState* play) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
s8 invincibilityTimer = player->invincibilityTimer; s8 invincibilityTimer = player->invincibilityTimer;
if ((invincibilityTimer > 0) || (player->fallDistance >= 0x33)) { if ((invincibilityTimer > 0) || (player->fallDistance >= 51)) {
func_80B54E14(this, &gZelda2Anime2Anim_007664, 2, -11.0f, 0); func_80B54E14(this, &gZelda2Anime2Anim_007664, 2, -11.0f, 0);
this->action = 35; this->action = 35;
func_80B56DC8(this); func_80B56DC8(this);

View file

@ -16,7 +16,7 @@
#include "cic6105.h" #include "cic6105.h"
#endif #endif
#pragma increment_block_number "gc-eu:131 gc-eu-mq:131 gc-jp:133 gc-jp-ce:133 gc-jp-mq:133 gc-us:133 gc-us-mq:133" #pragma increment_block_number "gc-eu:125 gc-eu-mq:125 gc-jp:127 gc-jp-ce:127 gc-jp-mq:127 gc-us:127 gc-us-mq:127"
#define FLAGS ACTOR_FLAG_4 #define FLAGS ACTOR_FLAG_4

View file

@ -4302,23 +4302,46 @@ void func_80837948(PlayState* play, Player* this, s32 arg2) {
func_80837918(this, 1, dmgFlags); func_80837918(this, 1, dmgFlags);
} }
void func_80837AE0(Player* this, s32 timer) { /**
* Gives the player intangibility frames. Used for when the player takes damage.
*
* If the player is already intangible, it will be overridden by the new intangibility duration.
* If the player is already invunerable, no intangibility will be applied.
*
* @param timer must be a positive value representing the number of intangibility frames.
* @note Intangibility prevents taking damage and responses to damage like knockback, while invulnerability only
* prevents taking damage.
*/
void Player_SetIntangibility(Player* this, s32 timer) {
if (this->invincibilityTimer >= 0) { if (this->invincibilityTimer >= 0) {
this->invincibilityTimer = timer; this->invincibilityTimer = timer;
this->unk_88F = 0; this->damageFlickerAnimCounter = 0;
} }
} }
void func_80837AFC(Player* this, s32 timer) { /**
* Gives the player invulnerability frames. Used for when the player performs a dodging maneuver like a roll.
*
* If the player is already intangible, they will become invulnerable instead.
* If the player is already invulnerable, the longer of the two invulnerability periods is kept.
*
* @param timer must be a negative value representing the number of invulnerability frames.
* @note Intangibility prevents taking damage and responses to damage like knockback, while invulnerability only
* prevents taking damage.
*/
void Player_SetInvulnerability(Player* this, s32 timer) {
if (this->invincibilityTimer > timer) { if (this->invincibilityTimer > timer) {
this->invincibilityTimer = timer; this->invincibilityTimer = timer;
} }
this->unk_88F = 0; this->damageFlickerAnimCounter = 0;
} }
/**
* @return false if player is out of health
*/
s32 func_80837B18(PlayState* play, Player* this, s32 damage) { s32 func_80837B18(PlayState* play, Player* this, s32 damage) {
if ((this->invincibilityTimer != 0) || (this->actor.category != ACTORCAT_PLAYER)) { if ((this->invincibilityTimer != 0) || (this->actor.category != ACTORCAT_PLAYER)) {
return 1; return true;
} }
return Health_ChangeBy(play, damage); return Health_ChangeBy(play, damage);
@ -4344,7 +4367,8 @@ static LinkAnimationHeader* D_808544B0[] = {
&gPlayerAnim_link_normal_back_hit, &gPlayerAnim_link_anchor_back_hitR, &gPlayerAnim_link_normal_back_hit, &gPlayerAnim_link_anchor_back_hitR,
}; };
void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4, s16 arg5, s32 arg6) { void func_80837C0C(PlayState* play, Player* this, s32 damageResponseType, f32 speed, f32 yVelocity, s16 yRot,
s32 invincibilityTimer) {
LinkAnimationHeader* anim = NULL; LinkAnimationHeader* anim = NULL;
LinkAnimationHeader** sp28; LinkAnimationHeader** sp28;
@ -4364,9 +4388,9 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4,
return; return;
} }
func_80837AE0(this, arg6); Player_SetIntangibility(this, invincibilityTimer);
if (arg2 == 3) { if (damageResponseType == PLAYER_HIT_RESPONSE_ICE_TRAP) {
Player_SetupAction(play, this, Player_Action_8084FB10, 0); Player_SetupAction(play, this, Player_Action_8084FB10, 0);
anim = &gPlayerAnim_link_normal_ice_down; anim = &gPlayerAnim_link_normal_ice_down;
@ -4376,7 +4400,7 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4,
Player_PlaySfx(this, NA_SE_PL_FREEZE_S); Player_PlaySfx(this, NA_SE_PL_FREEZE_S);
Player_PlayVoiceSfx(this, NA_SE_VO_LI_FREEZE); Player_PlayVoiceSfx(this, NA_SE_VO_LI_FREEZE);
} else if (arg2 == 4) { } else if (damageResponseType == PLAYER_HIT_RESPONSE_ELECTRIC_SHOCK) {
Player_SetupAction(play, this, Player_Action_8084FBF4, 0); Player_SetupAction(play, this, Player_Action_8084FBF4, 0);
Player_RequestRumble(this, 255, 80, 150, 0); Player_RequestRumble(this, 255, 80, 150, 0);
@ -4386,7 +4410,7 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4,
this->av2.actionVar2 = 20; this->av2.actionVar2 = 20;
} else { } else {
arg5 -= this->actor.shape.rot.y; yRot -= this->actor.shape.rot.y;
if (this->stateFlags1 & PLAYER_STATE1_27) { if (this->stateFlags1 & PLAYER_STATE1_27) {
Player_SetupAction(play, this, Player_Action_8084E30C, 0); Player_SetupAction(play, this, Player_Action_8084E30C, 0);
Player_RequestRumble(this, 180, 20, 50, 0); Player_RequestRumble(this, 180, 20, 50, 0);
@ -4397,7 +4421,9 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4,
anim = &gPlayerAnim_link_swimer_swim_hit; anim = &gPlayerAnim_link_swimer_swim_hit;
Player_PlayVoiceSfx(this, NA_SE_VO_LI_DAMAGE_S); Player_PlayVoiceSfx(this, NA_SE_VO_LI_DAMAGE_S);
} else if ((arg2 == 1) || (arg2 == 2) || !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || } else if ((damageResponseType == PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE) ||
(damageResponseType == PLAYER_HIT_RESPONSE_KNOCKBACK_SMALL) ||
!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
(this->stateFlags1 & (PLAYER_STATE1_13 | PLAYER_STATE1_14 | PLAYER_STATE1_21))) { (this->stateFlags1 & (PLAYER_STATE1_13 | PLAYER_STATE1_14 | PLAYER_STATE1_21))) {
Player_SetupAction(play, this, Player_Action_8084377C, 0); Player_SetupAction(play, this, Player_Action_8084377C, 0);
@ -4406,7 +4432,7 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4,
Player_RequestRumble(this, 255, 20, 150, 0); Player_RequestRumble(this, 255, 20, 150, 0);
func_80832224(this); func_80832224(this);
if (arg2 == 2) { if (damageResponseType == PLAYER_HIT_RESPONSE_KNOCKBACK_SMALL) {
this->av2.actionVar2 = 4; this->av2.actionVar2 = 4;
this->actor.speed = 3.0f; this->actor.speed = 3.0f;
@ -4416,11 +4442,11 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4,
Player_AnimChangeFreeze(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_damage_run, this->modelAnimType)); Player_AnimChangeFreeze(play, this, GET_PLAYER_ANIM(PLAYER_ANIMGROUP_damage_run, this->modelAnimType));
Player_PlayVoiceSfx(this, NA_SE_VO_LI_DAMAGE_S); Player_PlayVoiceSfx(this, NA_SE_VO_LI_DAMAGE_S);
} else { } else {
this->actor.speed = arg3; this->actor.speed = speed;
this->speedXZ = arg3; this->speedXZ = speed;
this->actor.velocity.y = arg4; this->actor.velocity.y = yVelocity;
if (ABS(arg5) > 0x4000) { if (ABS(yRot) > 0x4000) {
anim = &gPlayerAnim_link_normal_front_downA; anim = &gPlayerAnim_link_normal_front_downA;
} else { } else {
anim = &gPlayerAnim_link_normal_back_downA; anim = &gPlayerAnim_link_normal_back_downA;
@ -4456,7 +4482,7 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4,
sp28 += 4; sp28 += 4;
} }
if (ABS(arg5) <= 0x4000) { if (ABS(yRot) <= 0x4000) {
sp28 += 2; sp28 += 2;
} }
@ -4469,10 +4495,10 @@ void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4,
Player_PlayVoiceSfx(this, NA_SE_VO_LI_DAMAGE_S); Player_PlayVoiceSfx(this, NA_SE_VO_LI_DAMAGE_S);
} }
this->actor.shape.rot.y += arg5; this->actor.shape.rot.y += yRot;
this->yaw = this->actor.shape.rot.y; this->yaw = this->actor.shape.rot.y;
this->actor.world.rot.y = this->actor.shape.rot.y; this->actor.world.rot.y = this->actor.shape.rot.y;
if (ABS(arg5) > 0x4000) { if (ABS(yRot) > 0x4000) {
this->actor.shape.rot.y += 0x8000; this->actor.shape.rot.y += 0x8000;
} }
} }
@ -4578,17 +4604,23 @@ s32 func_808382DC(Player* this, PlayState* play) {
Player_PlayVoiceSfx(this, NA_SE_VO_LI_TAKEN_AWAY); Player_PlayVoiceSfx(this, NA_SE_VO_LI_TAKEN_AWAY);
play->haltAllActors = true; play->haltAllActors = true;
Sfx_PlaySfxCentered(NA_SE_OC_ABYSS); Sfx_PlaySfxCentered(NA_SE_OC_ABYSS);
} else if ((this->unk_8A1 != 0) && ((this->unk_8A1 >= 2) || (this->invincibilityTimer == 0))) { } else if ((this->knockbackType != PLAYER_KNOCKBACK_NONE) &&
u8 sp5C[] = { 2, 1, 1 }; ((this->knockbackType >= PLAYER_KNOCKBACK_LARGE) || (this->invincibilityTimer == 0))) {
u8 knockbackResponse[] = {
PLAYER_HIT_RESPONSE_KNOCKBACK_SMALL,
PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE,
PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE,
};
func_80838280(this); func_80838280(this);
if (this->unk_8A1 == 3) { if (this->knockbackType == PLAYER_KNOCKBACK_LARGE_SHOCK) {
this->bodyShockTimer = 40; this->bodyShockTimer = 40;
} }
this->actor.colChkInfo.damage += this->unk_8A0; this->actor.colChkInfo.damage += this->knockbackDamage;
func_80837C0C(play, this, sp5C[this->unk_8A1 - 1], this->unk_8A4, this->unk_8A8, this->unk_8A2, 20); func_80837C0C(play, this, knockbackResponse[this->knockbackType - 1], this->knockbackSpeed,
this->knockbackYVelocity, this->knockbackRot, 20);
} else { } else {
sp64 = (this->shieldQuad.base.acFlags & AC_BOUNCED) != 0; sp64 = (this->shieldQuad.base.acFlags & AC_BOUNCED) != 0;
@ -4652,16 +4684,16 @@ s32 func_808382DC(Player* this, PlayState* play) {
} }
if (this->stateFlags1 & PLAYER_STATE1_27) { if (this->stateFlags1 & PLAYER_STATE1_27) {
sp4C = 0; sp4C = PLAYER_HIT_RESPONSE_NONE;
} else if (this->actor.colChkInfo.acHitEffect == 2) { } else if (this->actor.colChkInfo.acHitEffect == 2) {
sp4C = 3; sp4C = PLAYER_HIT_RESPONSE_ICE_TRAP;
} else if (this->actor.colChkInfo.acHitEffect == 3) { } else if (this->actor.colChkInfo.acHitEffect == 3) {
sp4C = 4; sp4C = PLAYER_HIT_RESPONSE_ELECTRIC_SHOCK;
} else if (this->actor.colChkInfo.acHitEffect == 4) { } else if (this->actor.colChkInfo.acHitEffect == 4) {
sp4C = 1; sp4C = PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE;
} else { } else {
func_80838280(this); func_80838280(this);
sp4C = 0; sp4C = PLAYER_HIT_RESPONSE_NONE;
} }
func_80837C0C(play, this, sp4C, 4.0f, 5.0f, Actor_WorldYawTowardActor(ac, &this->actor), 20); func_80837C0C(play, this, sp4C, 4.0f, 5.0f, Actor_WorldYawTowardActor(ac, &this->actor), 20);
@ -4679,7 +4711,7 @@ s32 func_808382DC(Player* this, PlayState* play) {
((this->currentTunic != PLAYER_TUNIC_GORON) || (this->floorTypeTimer >= D_808544F4[sp48])))) { ((this->currentTunic != PLAYER_TUNIC_GORON) || (this->floorTypeTimer >= D_808544F4[sp48])))) {
this->floorTypeTimer = 0; this->floorTypeTimer = 0;
this->actor.colChkInfo.damage = 4; this->actor.colChkInfo.damage = 4;
func_80837C0C(play, this, 0, 4.0f, 5.0f, this->actor.shape.rot.y, 20); func_80837C0C(play, this, PLAYER_HIT_RESPONSE_NONE, 4.0f, 5.0f, this->actor.shape.rot.y, 20);
} else { } else {
return 0; return 0;
} }
@ -8718,7 +8750,8 @@ s32 func_80842DF4(PlayState* play, Player* this) {
if (this->actor.colChkInfo.atHitEffect == 1) { if (this->actor.colChkInfo.atHitEffect == 1) {
this->actor.colChkInfo.damage = 8; this->actor.colChkInfo.damage = 8;
func_80837C0C(play, this, 4, 0.0f, 0.0f, this->actor.shape.rot.y, 20); func_80837C0C(play, this, PLAYER_HIT_RESPONSE_ELECTRIC_SHOCK, 0.0f, 0.0f, this->actor.shape.rot.y,
20);
return 1; return 1;
} }
} }
@ -8872,14 +8905,15 @@ void Player_Action_8084377C(Player* this, PlayState* play) {
func_808382BC(this); func_808382BC(this);
if (!(this->stateFlags1 & PLAYER_STATE1_29) && (this->av2.actionVar2 == 0) && (this->unk_8A1 != 0)) { if (!(this->stateFlags1 & PLAYER_STATE1_29) && (this->av2.actionVar2 == 0) &&
s16 temp = this->actor.shape.rot.y - this->unk_8A2; (this->knockbackType != PLAYER_KNOCKBACK_NONE)) {
s16 temp = this->actor.shape.rot.y - this->knockbackRot;
this->yaw = this->actor.shape.rot.y = this->unk_8A2; this->yaw = this->actor.shape.rot.y = this->knockbackRot;
this->speedXZ = this->unk_8A4; this->speedXZ = this->knockbackSpeed;
if (ABS(temp) > 0x4000) { if (ABS(temp) > 0x4000) {
this->actor.shape.rot.y = this->unk_8A2 + 0x8000; this->actor.shape.rot.y = this->knockbackRot + 0x8000;
} }
if (this->actor.velocity.y < 0.0f) { if (this->actor.velocity.y < 0.0f) {
@ -8895,7 +8929,7 @@ void Player_Action_8084377C(Player* this, PlayState* play) {
func_80853080(this, play); func_80853080(this, play);
} }
} else if ((this->stateFlags1 & PLAYER_STATE1_29) || } else if ((this->stateFlags1 & PLAYER_STATE1_29) ||
(!(this->cylinder.base.acFlags & AC_HIT) && (this->unk_8A1 == 0))) { (!(this->cylinder.base.acFlags & AC_HIT) && (this->knockbackType == PLAYER_KNOCKBACK_NONE))) {
if (this->stateFlags1 & PLAYER_STATE1_29) { if (this->stateFlags1 & PLAYER_STATE1_29) {
this->av2.actionVar2++; this->av2.actionVar2++;
} else { } else {
@ -8987,7 +9021,7 @@ void func_80843AE8(PlayState* play, Player* this) {
func_80853080(this, play); func_80853080(this, play);
} }
this->unk_A87 = 20; this->unk_A87 = 20;
func_80837AFC(this, -20); Player_SetInvulnerability(this, -20);
Audio_SetBgmVolumeOnDuringFanfare(); Audio_SetBgmVolumeOnDuringFanfare();
} }
} else if (this->av1.actionVar1 != 0) { } else if (this->av1.actionVar1 != 0) {
@ -9048,19 +9082,19 @@ static FallImpactInfo D_80854600[] = {
}; };
s32 func_80843E64(PlayState* play, Player* this) { s32 func_80843E64(PlayState* play, Player* this) {
s32 sp34; s32 fallDistance;
if ((sFloorType == FLOOR_TYPE_6) || (sFloorType == FLOOR_TYPE_9)) { if ((sFloorType == FLOOR_TYPE_6) || (sFloorType == FLOOR_TYPE_9)) {
sp34 = 0; fallDistance = 0;
} else { } else {
sp34 = this->fallDistance; fallDistance = this->fallDistance;
} }
Math_StepToF(&this->speedXZ, 0.0f, 1.0f); Math_StepToF(&this->speedXZ, 0.0f, 1.0f);
this->stateFlags1 &= ~(PLAYER_STATE1_18 | PLAYER_STATE1_19); this->stateFlags1 &= ~(PLAYER_STATE1_18 | PLAYER_STATE1_19);
if (sp34 >= 400) { if (fallDistance >= 400) {
s32 impactIndex; s32 impactIndex;
FallImpactInfo* impactInfo; FallImpactInfo* impactInfo;
@ -9076,7 +9110,7 @@ s32 func_80843E64(PlayState* play, Player* this) {
return -1; return -1;
} }
func_80837AE0(this, 40); Player_SetIntangibility(this, 40);
Player_RequestQuake(play, 32967, 2, 30); Player_RequestQuake(play, 32967, 2, 30);
Player_RequestRumble(this, impactInfo->rumbleStrength, impactInfo->rumbleDuration, Player_RequestRumble(this, impactInfo->rumbleStrength, impactInfo->rumbleDuration,
impactInfo->rumbleDecreaseRate, 0); impactInfo->rumbleDecreaseRate, 0);
@ -9086,14 +9120,14 @@ s32 func_80843E64(PlayState* play, Player* this) {
return impactIndex + 1; return impactIndex + 1;
} }
if (sp34 > 200) { if (fallDistance > 200) {
sp34 *= 2; fallDistance *= 2;
if (sp34 > 255) { if (fallDistance > 255) {
sp34 = 255; fallDistance = 255;
} }
Player_RequestRumble(this, (u8)sp34, (u8)(sp34 * 0.1f), (u8)sp34, 0); Player_RequestRumble(this, (u8)fallDistance, (u8)(fallDistance * 0.1f), (u8)fallDistance, 0);
if (sFloorType == FLOOR_TYPE_6) { if (sFloorType == FLOOR_TYPE_6) {
Player_PlayVoiceSfx(this, NA_SE_VO_LI_CLIMB_END); Player_PlayVoiceSfx(this, NA_SE_VO_LI_CLIMB_END);
@ -9258,7 +9292,7 @@ void Player_Action_80844708(Player* this, PlayState* play) {
sp44 = LinkAnimation_Update(play, &this->skelAnime); sp44 = LinkAnimation_Update(play, &this->skelAnime);
if (LinkAnimation_OnFrame(&this->skelAnime, 8.0f)) { if (LinkAnimation_OnFrame(&this->skelAnime, 8.0f)) {
func_80837AFC(this, FRAMERATE_CONST(-10, -8)); Player_SetInvulnerability(this, FRAMERATE_CONST(-10, -8));
} }
if (func_80842964(this, play) == 0) { if (func_80842964(this, play) == 0) {
@ -9337,7 +9371,7 @@ void Player_Action_80844A44(Player* this, PlayState* play) {
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) { if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->actor.colChkInfo.damage = 0x10; this->actor.colChkInfo.damage = 0x10;
func_80837C0C(play, this, 1, 4.0f, 5.0f, this->actor.shape.rot.y, 20); func_80837C0C(play, this, PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE, 4.0f, 5.0f, this->actor.shape.rot.y, 20);
} }
} }
@ -9382,7 +9416,7 @@ s32 func_80844BE4(Player* this, PlayState* play) {
} }
func_80837948(play, this, temp); func_80837948(play, this, temp);
func_80837AFC(this, -8); Player_SetInvulnerability(this, -8);
this->stateFlags2 |= PLAYER_STATE2_17; this->stateFlags2 |= PLAYER_STATE2_17;
if (this->controlStickDirections[this->controlStickDataIndex] == PLAYER_STICK_DIR_FORWARD) { if (this->controlStickDirections[this->controlStickDataIndex] == PLAYER_STICK_DIR_FORWARD) {
@ -10140,7 +10174,7 @@ void func_808468E8(PlayState* play, Player* this) {
} }
void func_80846978(PlayState* play, Player* this) { void func_80846978(PlayState* play, Player* this) {
func_80837C0C(play, this, 1, 2.0f, 2.0f, this->actor.shape.rot.y + 0x8000, 0); func_80837C0C(play, this, PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE, 2.0f, 2.0f, this->actor.shape.rot.y + 0x8000, 0);
} }
void func_808469BC(PlayState* play, Player* this) { void func_808469BC(PlayState* play, Player* this) {
@ -11537,7 +11571,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) {
temp_f0 = this->actor.world.pos.y - this->actor.prevPos.y; temp_f0 = this->actor.world.pos.y - this->actor.prevPos.y;
this->doorType = PLAYER_DOORTYPE_NONE; this->doorType = PLAYER_DOORTYPE_NONE;
this->unk_8A1 = 0; this->knockbackType = PLAYER_KNOCKBACK_NONE;
this->autoLockOnActor = NULL; this->autoLockOnActor = NULL;
phi_f12 = phi_f12 =
@ -11778,9 +11812,9 @@ void Player_Draw(Actor* thisx, PlayState* play2) {
Gfx_SetupDL_25Xlu(play->state.gfxCtx); Gfx_SetupDL_25Xlu(play->state.gfxCtx);
if (this->invincibilityTimer > 0) { if (this->invincibilityTimer > 0) {
this->unk_88F += CLAMP(50 - this->invincibilityTimer, 8, 40); this->damageFlickerAnimCounter += CLAMP(50 - this->invincibilityTimer, 8, 40);
POLY_OPA_DISP = POLY_OPA_DISP = Gfx_SetFog2(POLY_OPA_DISP, 255, 0, 0, 0, 0,
Gfx_SetFog2(POLY_OPA_DISP, 255, 0, 0, 0, 0, 4000 - (s32)(Math_CosS(this->unk_88F * 256) * 2000.0f)); 4000 - (s32)(Math_CosS(this->damageFlickerAnimCounter * 256) * 2000.0f));
} }
func_8002EBCC(&this->actor, play, 0); func_8002EBCC(&this->actor, play, 0);
@ -13403,7 +13437,7 @@ void Player_Action_8084E6D4(Player* this, PlayState* play) {
func_8083C0E8(this, play); func_8083C0E8(this, play);
} else { } else {
this->actor.colChkInfo.damage = 0; this->actor.colChkInfo.damage = 0;
func_80837C0C(play, this, 3, 0.0f, 0.0f, 0, 20); func_80837C0C(play, this, PLAYER_HIT_RESPONSE_ICE_TRAP, 0.0f, 0.0f, 0, 20);
} }
return; return;
} }
@ -13917,7 +13951,7 @@ void Player_Action_8084FB10(Player* this, PlayState* play) {
} else { } else {
if (LinkAnimation_Update(play, &this->skelAnime)) { if (LinkAnimation_Update(play, &this->skelAnime)) {
func_80839F90(this, play); func_80839F90(this, play);
func_80837AFC(this, -20); Player_SetInvulnerability(this, -20);
} }
} }
} }