player anim + collider surface types (#769)

* player anim + collider surface types

* added default surface type

* remove unused flags and define surface mask

* revised action table

* checkpoint

* player sprite stuff

* remove currentAnim union

* more actions

* enough

* discharged

Co-authored-by: HailSanta <Hail2Santa@gmail.com>
This commit is contained in:
HailSanta 2022-09-13 02:26:57 -04:00 committed by GitHub
parent 3e91a3fd53
commit f7e39c0802
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
149 changed files with 2149 additions and 1974 deletions

View File

@ -189,10 +189,7 @@ typedef struct Npc {
NpcQuizmoBlur* quizmo; NpcQuizmoBlur* quizmo;
} blur; } blur;
/* 0x024 */ s32 spriteInstanceID; /* 0x024 */ s32 spriteInstanceID;
/* 0x028 */ union { /* 0x028 */ AnimID currentAnim;
/* */ u16 h;
/* */ u32 w;
/* */ } currentAnim;
/* 0x02C */ s32 unk_2C; /* 0x02C */ s32 unk_2C;
/* 0x030 */ f32 animationSpeed; /* 0x030 */ f32 animationSpeed;
/* 0x034 */ f32 renderYaw; /* 0x034 */ f32 renderYaw;
@ -989,7 +986,7 @@ typedef struct CollisionData {
/* 0x04 */ Collider* colliderList; /* 0x04 */ Collider* colliderList;
/* 0x08 */ union { /* 0x08 */ union {
struct ColliderBoundingBox* aabbs; struct ColliderBoundingBox* aabbs;
CameraControlSettings* camSettings; struct CameraControlSettings* camSettings;
}; };
/* 0x0C */ s16 numColliders; /* 0x0C */ s16 numColliders;
/* 0x0E */ char unk_0E[2]; /* 0x0E */ char unk_0E[2];
@ -1888,6 +1885,14 @@ typedef struct FontData {
/* 0x00 */ char unk_00[24]; /* 0x00 */ char unk_00[24];
} FontData; // size = 0x18 } FontData; // size = 0x18
typedef struct SlideParams {
f32 heading;
f32 maxDescendAccel;
f32 launchVelocity;
f32 maxDescendVelocity;
f32 integrator[4];
} SlideParams;
typedef struct PlayerStatus { typedef struct PlayerStatus {
/* 0x000 */ s32 flags; // PlayerStatusFlags /* 0x000 */ s32 flags; // PlayerStatusFlags
/* 0x004 */ u32 animFlags; /* 0x004 */ u32 animFlags;
@ -1922,31 +1927,31 @@ typedef struct PlayerStatus {
/* 0x084 */ f32 currentYaw; /* 0x084 */ f32 currentYaw;
/* 0x088 */ f32 overlapPushYaw; /* 0x088 */ f32 overlapPushYaw;
/* 0x08C */ f32 pitch; /* 0x08C */ f32 pitch;
/* 0x090 */ f32 unk_90[4]; /* 0x090 */ f32 flipYaw[4];
/* 0x0A0 */ f32 heading; /* 0x0A0 */ f32 heading;
/* 0x0A4 */ s32 trueAnimation; ///< Encoding back-facing sprite /* 0x0A4 */ AnimID trueAnimation; ///< Encoding back-facing sprite
/* 0x0A8 */ f32 spriteFacingAngle; /* angle of sprite, relative to camera, from 0 to 180 */ /* 0x0A8 */ f32 spriteFacingAngle; /* angle of sprite, relative to camera, from 0 to 180 */
/* 0x0AC */ char unk_AC[4]; /* 0x0AC */ char unk_AC[4];
/* 0x0B0 */ s16 colliderHeight; /* 0x0B0 */ s16 colliderHeight;
/* 0x0B2 */ s16 colliderDiameter; /* 0x0B2 */ s16 colliderDiameter;
/* 0x0B4 */ s8 actionState; /* 0x0B4 */ s8 actionState;
/* 0x0B5 */ s8 prevActionState; /* 0x0B5 */ s8 prevActionState;
/* 0x0B6 */ s8 fallState; ///< Also used as sleep state in Peach idle action /* 0x0B6 */ s8 actionSubstate;
/* 0x0B7 */ char unk_B7; /* 0x0B7 */ char unk_B7;
/* 0x0B8 */ u32 anim; /* 0x0B8 */ AnimID anim;
/* 0x0BC */ u16 unk_BC; /* 0x0BC */ u16 unk_BC;
/* 0x0BE */ s8 renderMode; /* 0x0BE */ s8 renderMode;
/* 0x0BF */ s8 unk_BF; /* 0x0BF */ s8 hazardType;
/* 0x0C0 */ s16 timeInAir; /* 0x0C0 */ s16 timeInAir;
/* 0x0C2 */ s16 unk_C2; /* 0x0C2 */ s16 unk_C2;
/* 0x0C4 */ char unk_C4; /* 0x0C4 */ s8 peachItemHeld;
/* 0x0C5 */ s8 unk_C5; /* 0x0C5 */ s8 unk_C5;
/* 0x0C6 */ s16 interactingWithID; /* 0x0C6 */ s16 interactingWithID;
/* 0x0C8 */ Npc* encounteredNPC; /* 0x0C8 */ Npc* encounteredNPC;
/* 0x0CC */ s32 shadowID; /* 0x0CC */ s32 shadowID;
/* 0x0D0 */ f32* unk_D0; /* 0x0D0 */ SlideParams* slideParams;
/* 0x0D4 */ f32 spinRate; /* 0x0D4 */ f32 spinRate;
/* 0x0D8 */ struct EffectInstance* unk_D8; // effect 46 /* 0x0D8 */ struct EffectInstance* specialDecorationEffect;
/* 0x0DC */ s32 currentButtons; /* 0x0DC */ s32 currentButtons;
/* 0x0E0 */ s32 pressedButtons; /* 0x0E0 */ s32 pressedButtons;
/* 0x0E4 */ s32 heldButtons; /* 0x0E4 */ s32 heldButtons;
@ -1958,7 +1963,7 @@ typedef struct PlayerStatus {
/* 0x190 */ s32 stickYBuffer[10]; /* 0x190 */ s32 stickYBuffer[10];
/* 0x1B8 */ s32 inputBufPos; /* 0x1B8 */ s32 inputBufPos;
/* 0x1BC */ char unk_1BC[196]; /* 0x1BC */ char unk_1BC[196];
/* 0x280 */ s8 unk_280; /* 0x280 */ s8 poundImpactDelay; // governs period of immobility after landing a ground pound
/* 0x281 */ char unk_281[7]; /* 0x281 */ char unk_281[7];
} PlayerStatus; // size = 0x288 } PlayerStatus; // size = 0x288

View File

@ -654,11 +654,11 @@ enum SoundIDs {
SOUND_139 = 0x00000139, SOUND_139 = 0x00000139,
SOUND_13D = 0x0000013D, SOUND_13D = 0x0000013D,
SOUND_13E = 0x0000013E, SOUND_13E = 0x0000013E,
SOUND_STEP1 = 0x00000141, SOUND_STEP_NORMAL1 = 0x00000141,
SOUND_STEP2 = 0x00000142, SOUND_STEP_NORMAL2 = 0x00000142,
SOUND_143 = 0x00000143, SOUND_STEP_CRUNCHY1 = 0x00000143,
SOUND_144 = 0x00000144, SOUND_STEP_CRUNCHY2 = 0x00000144,
SOUND_146 = 0x00000146, SOUND_SPIN_JUMP = 0x00000146,
SOUND_TORNADO_JUMP = 0x00000147, SOUND_TORNADO_JUMP = 0x00000147,
SOUND_SOFT_LAND = 0x00000148, SOUND_SOFT_LAND = 0x00000148,
SOUND_149 = 0x00000149, SOUND_149 = 0x00000149,
@ -679,7 +679,7 @@ enum SoundIDs {
SOUND_166 = 0x00000166, SOUND_166 = 0x00000166,
SOUND_167 = 0x00000167, SOUND_167 = 0x00000167,
SOUND_168 = 0x00000168, SOUND_168 = 0x00000168,
SOUND_172 = 0x00000172, SOUND_DUST_OFF = 0x00000172,
SOUND_173 = 0x00000173, SOUND_173 = 0x00000173,
SOUND_174 = 0x00000174, SOUND_174 = 0x00000174,
SOUND_175 = 0x00000175, SOUND_175 = 0x00000175,
@ -872,7 +872,7 @@ enum SoundIDs {
SOUND_2F1 = 0x000002F1, SOUND_2F1 = 0x000002F1,
SOUND_2F3 = 0x000002F3, SOUND_2F3 = 0x000002F3,
SOUND_2F4 = 0x000002F4, SOUND_2F4 = 0x000002F4,
SOUND_2F6 = 0x000002F6, SOUND_TWEESTER_LAUNCH = 0x000002F6,
SOUND_2F7 = 0x000002F7, SOUND_2F7 = 0x000002F7,
SOUND_2F9 = 0x000002F9, SOUND_2F9 = 0x000002F9,
SOUND_CLOSE_SHELL = 0x000002FF, SOUND_CLOSE_SHELL = 0x000002FF,
@ -1268,6 +1268,9 @@ enum SoundIDs {
SOUND_8000006B = 0x8000006B, SOUND_8000006B = 0x8000006B,
SOUND_8000006C = 0x8000006C, SOUND_8000006C = 0x8000006C,
SOUND_B000000A = 0xB000000A, SOUND_B000000A = 0xB000000A,
SOUND_B000000C = 0xB000000C,
SOUND_B000000D = 0xB000000D,
SOUND_B000000E = 0xB000000E,
SOUND_B0000010 = 0xB0000010, SOUND_B0000010 = 0xB0000010,
SOUND_B0000011 = 0xB0000011, SOUND_B0000011 = 0xB0000011,
SOUND_B0000012 = 0xB0000012, SOUND_B0000012 = 0xB0000012,
@ -1374,9 +1377,9 @@ enum AuxCameraParams {
enum ItemIDs { enum ItemIDs {
ITEM_NONE = 0x00000000, ITEM_NONE = 0x00000000,
ITEM_JUMP = 0x00000001, ITEM_BOOTS = 0x00000001,
ITEM_SPIN_JUMP = 0x00000002, ITEM_SUPER_BOOTS = 0x00000002,
ITEM_TORNADO_JUMP = 0x00000003, ITEM_ULTRA_BOOTS = 0x00000003,
ITEM_HAMMER = 0x00000004, ITEM_HAMMER = 0x00000004,
ITEM_SUPER_HAMMER = 0x00000005, ITEM_SUPER_HAMMER = 0x00000005,
ITEM_ULTRA_HAMMER = 0x00000006, ITEM_ULTRA_HAMMER = 0x00000006,
@ -1619,7 +1622,7 @@ enum ItemIDs {
ITEM_ATTACK_FX_A = 0x000000F3, ITEM_ATTACK_FX_A = 0x000000F3,
ITEM_ALLOR_NOTHING = 0x000000F4, ITEM_ALLOR_NOTHING = 0x000000F4,
ITEM_HP_DRAIN = 0x000000F5, ITEM_HP_DRAIN = 0x000000F5,
ITEM_JUMP_CHARGE0 = 0x000000F6, ITEM_BOOTS_CHARGE0 = 0x000000F6,
ITEM_SLOW_GO = 0x000000F7, ITEM_SLOW_GO = 0x000000F7,
ITEM_FP_PLUS_A = 0x000000F8, ITEM_FP_PLUS_A = 0x000000F8,
ITEM_MEGA_RUSH = 0x000000F9, ITEM_MEGA_RUSH = 0x000000F9,
@ -1639,7 +1642,7 @@ enum ItemIDs {
ITEM_HAMMER_THROW = 0x00000107, ITEM_HAMMER_THROW = 0x00000107,
ITEM_MEGA_QUAKE = 0x00000108, ITEM_MEGA_QUAKE = 0x00000108,
ITEM_SMASH_CHARGE = 0x00000109, ITEM_SMASH_CHARGE = 0x00000109,
ITEM_JUMP_CHARGE = 0x0000010A, ITEM_BOOTS_CHARGE = 0x0000010A,
ITEM_S_SMASH_CHG = 0x0000010B, ITEM_S_SMASH_CHG = 0x0000010B,
ITEM_S_JUMP_CHG = 0x0000010C, ITEM_S_JUMP_CHG = 0x0000010C,
ITEM_POWER_RUSH = 0x0000010D, ITEM_POWER_RUSH = 0x0000010D,
@ -1783,6 +1786,22 @@ enum ItemTargetFlags {
ITEM_TARGET_FLAG_8000 = 0x8000 ITEM_TARGET_FLAG_8000 = 0x8000
}; };
enum PlayerSprites {
SPR_Mario_1 = 0x1,
SPR_Mario_2 = 0x2,
SPR_Mario_3 = 0x3,
SPR_Mario_4 = 0x4,
SPR_Mario_5 = 0x5,
SPR_Mario_6 = 0x6,
SPR_Mario_7 = 0x7,
SPR_Mario_8 = 0x8,
SPR_Mario_9 = 0x9,
SPR_Peach_A = 0xA,
SPR_Peach_B = 0xB,
SPR_Peach_C = 0xC,
SPR_Peach_D = 0xD,
};
// TODO: extract player sprite + animations // TODO: extract player sprite + animations
enum PlayerAnims { enum PlayerAnims {
ANIM_Mario_StandStill = 0x00010000, ANIM_Mario_StandStill = 0x00010000,
@ -2638,13 +2657,13 @@ enum ActionStates {
// Following action states prohibit movement (see set_action_state()) // Following action states prohibit movement (see set_action_state())
ACTION_STATE_TALK = 0x0000000C, ///< Reading signs doesn't count ACTION_STATE_TALK = 0x0000000C, ///< Reading signs doesn't count
ACTION_STATE_SPIN_JUMP = 0x0000000D, ACTION_STATE_SPIN_JUMP = 0x0000000D,
ACTION_STATE_GROUND_POUND = 0x0000000E, ACTION_STATE_SPIN_POUND = 0x0000000E,
ACTION_STATE_ULTRA_JUMP = 0x0000000F, ACTION_STATE_TORNADO_JUMP = 0x0000000F,
ACTION_STATE_ULTRA_POUND = 0x00000010, ACTION_STATE_TORNADO_POUND = 0x00000010,
ACTION_STATE_SLIDING = 0x00000011, ACTION_STATE_SLIDING = 0x00000011,
ACTION_STATE_HAMMER = 0x00000012, ACTION_STATE_HAMMER = 0x00000012,
ACTION_STATE_13 = 0x00000013, ACTION_STATE_13 = 0x00000013,
ACTION_STATE_14 = 0x00000014, ACTION_STATE_PUSHING_BLOCK = 0x00000014,
ACTION_STATE_HIT_FIRE = 0x00000015, ///< Causes Mario to fly up and take damage. Used for fire bars. ACTION_STATE_HIT_FIRE = 0x00000015, ///< Causes Mario to fly up and take damage. Used for fire bars.
ACTION_STATE_KNOCKBACK = 0x00000016, // some kind of knockback, does no damage ACTION_STATE_KNOCKBACK = 0x00000016, // some kind of knockback, does no damage
ACTION_STATE_HIT_LAVA = 0x00000017, ACTION_STATE_HIT_LAVA = 0x00000017,
@ -2661,10 +2680,21 @@ enum ActionStates {
ACTION_STATE_STEP_UP = 0x00000022, ACTION_STATE_STEP_UP = 0x00000022,
ACTION_STATE_23 = 0x00000023, ACTION_STATE_23 = 0x00000023,
ACTION_STATE_24 = 0x00000024, ACTION_STATE_24 = 0x00000024,
ACTION_STATE_25 = 0x00000025, ACTION_STATE_INVALID_25 = 0x00000025,
ACTION_STATE_USE_SPRING = 0x00000026, ACTION_STATE_USE_SPRING = 0x00000026,
}; };
enum JumpSubstate {
JUMP_SUBSTATE_0 = 0,
JUMP_SUBSTATE_1 = 1,
};
enum LandOnSwitchSubstate {
LANDING_ON_SWITCH_SUBSTATE_0 = 0,
LANDING_ON_SWITCH_SUBSTATE_1 = 1,
LANDING_ON_SWITCH_SUBSTATE_2 = 2,
};
/* (1 = isPeach, 2 = isTransformed, 4 = hasUmbrella) */ /* (1 = isPeach, 2 = isTransformed, 4 = hasUmbrella) */
enum PeachStatusFlags { enum PeachStatusFlags {
PEACH_STATUS_FLAG_IS_PEACH = 0x01, PEACH_STATUS_FLAG_IS_PEACH = 0x01,
@ -3093,6 +3123,7 @@ enum NpcFlags {
}; };
enum PlayerStatusFlags { enum PlayerStatusFlags {
PLAYER_STATUS_FLAGS_AIRBORNE = 0x0000000E,
PLAYER_STATUS_FLAGS_JUMPING = 0x00000002, PLAYER_STATUS_FLAGS_JUMPING = 0x00000002,
PLAYER_STATUS_FLAGS_FALLING = 0x00000004, PLAYER_STATUS_FLAGS_FALLING = 0x00000004,
PLAYER_STATUS_FLAGS_FLYING = 0x00000008, PLAYER_STATUS_FLAGS_FLYING = 0x00000008,
@ -3109,7 +3140,7 @@ enum PlayerStatusFlags {
PLAYER_STATUS_FLAGS_4000 = 0x00004000, PLAYER_STATUS_FLAGS_4000 = 0x00004000,
PLAYER_STATUS_FLAGS_8000 = 0x00008000, PLAYER_STATUS_FLAGS_8000 = 0x00008000,
PLAYER_STATUS_FLAGS_20000 = 0x00020000, PLAYER_STATUS_FLAGS_20000 = 0x00020000,
PLAYER_STATUS_FLAGS_40000 = 0x00040000, PLAYER_STATUS_FLAGS_40000 = 0x00040000, // physics and animations run at half speed
PLAYER_STATUS_FLAGS_80000 = 0x00080000, PLAYER_STATUS_FLAGS_80000 = 0x00080000,
PLAYER_STATUS_FLAGS_100000 = 0x00100000, PLAYER_STATUS_FLAGS_100000 = 0x00100000,
PLAYER_STATUS_FLAGS_200000 = 0x00200000, // using hammer? PLAYER_STATUS_FLAGS_200000 = 0x00200000, // using hammer?
@ -3407,6 +3438,13 @@ enum ActionCommand {
ACTION_COMMAND_TIDAL_WAVE = 0x00000017, ACTION_COMMAND_TIDAL_WAVE = 0x00000017,
}; };
enum HazardType {
HAZARD_TYPE_NONE = 0,
HAZARD_TYPE_LAVA = 1,
HAZARD_TYPE_SPIKES = 2,
HAZARD_TYPE_FIRE_BAR = 3,
};
enum EffectGfxDataFlags { enum EffectGfxDataFlags {
FX_GRAPHICS_DISABLED = 0x00000000, FX_GRAPHICS_DISABLED = 0x00000000,
FX_GRAPHICS_ENABLED = 0x00000001, FX_GRAPHICS_ENABLED = 0x00000001,
@ -4078,16 +4116,23 @@ enum MusicSettingsFlags {
MUSIC_SETTINGS_FLAGS_80000000 = 0x80000000, MUSIC_SETTINGS_FLAGS_80000000 = 0x80000000,
}; };
// the lower byte of Collider::flags
enum SurfaceType {
SURFACE_TYPE_DEFAULT = 0,
SURFACE_TYPE_WATER = 1,
SURFACE_TYPE_SPIKES = 2,
SURFACE_TYPE_LAVA = 3,
SURFACE_TYPE_DOCK_WALL = 4,
SURFACE_TYPE_SLIDE = 5,
SURFACE_TYPE_FLOWERS = 6,
SURFACE_TYPE_CLOUD = 7, ///< used with clouds in flo_19 and flo_21
SURFACE_TYPE_SNOW = 8,
SURFACE_TYPE_HEDGES = 9, ///< used within hedge maze in flo_11
};
enum ColliderFlags { enum ColliderFlags {
COLLIDER_FLAGS_UPPER_MASK = 0x7FFFFE00, // map data dumper needs this to be first COLLIDER_FLAGS_UPPER_MASK = 0x7FFFFE00, // map data dumper needs this to be first
COLLIDER_FLAGS_WATER_FLOOR = 0x00000001, COLLIDER_FLAGS_SURFACE_TYPE_MASK = 0x000000FF,
COLLIDER_FLAGS_LAVA_FLOOR = 0x00000002,
COLLIDER_FLAGS_SUSHIE_DOCK_WALL = 0x00000004,
COLLIDER_FLAGS_SNOW_FLOOR = 0x00000008,
COLLIDER_FLAGS_10 = 0x00000010,
COLLIDER_FLAGS_20 = 0x00000020,
COLLIDER_FLAGS_40 = 0x00000040,
COLLIDER_FLAGS_80 = 0x00000080,
COLLIDER_FLAGS_100 = 0x00000100, COLLIDER_FLAGS_100 = 0x00000100,
COLLIDER_FLAGS_200 = 0x00000200, COLLIDER_FLAGS_200 = 0x00000200,
COLLIDER_FLAGS_400 = 0x00000400, COLLIDER_FLAGS_400 = 0x00000400,

View File

@ -608,9 +608,9 @@ s32 add_star_pieces(s32 amt);
s32 make_item_entity_at_player(s32 itemID, s32 arg1, s32 pickupMsgFlags); s32 make_item_entity_at_player(s32 itemID, s32 arg1, s32 pickupMsgFlags);
void set_action_state(s32 actionState); void set_action_state(s32 actionState);
s32 get_collider_type_by_id(s32 colliderID); s32 get_collider_flags(s32 colliderID);
void suggest_player_anim_setUnkFlag(s32 arg0); void suggest_player_anim_setUnkFlag(AnimID anim);
void suggest_player_anim_clearUnkFlag(s32 arg0); void suggest_player_anim_clearUnkFlag(AnimID anim);
void subtract_hp(s32 amt); void subtract_hp(s32 amt);
void draw_status_ui(void); void draw_status_ui(void);
void open_status_menu_long(void); void open_status_menu_long(void);
@ -740,7 +740,7 @@ void func_802B71C8(void);
void func_802B71D4(void); void func_802B71D4(void);
void func_802B72C0_E22870(void); void func_802B72C0_E22870(void);
s32 func_802BD7DC(void); s32 func_802BD7DC(void);
void func_802BE070_31DBE0(void); void world_watt_sync_held_position(void);
void func_802BFB44_323694(f32 arg0); void func_802BFB44_323694(f32 arg0);
void initialize_curtains(void); void initialize_curtains(void);

View File

@ -83,8 +83,7 @@
// Should be 1.0f / 0x7FFF, but precision is wrong for a double // Should be 1.0f / 0x7FFF, but precision is wrong for a double
#define SHT_MINV 3.051851e-05 #define SHT_MINV 3.051851e-05
#define SPRITE_WORLD_SCALE_F (5.0f/7.0f)
#define SPRITE_WORLD_SCALE (5.0f/7.0f)
#define SPRITE_WORLD_SCALE_D (5.0/7.0) #define SPRITE_WORLD_SCALE_D (5.0/7.0)
#define BATTLE_ENTITY_ID_MASK 0x800 #define BATTLE_ENTITY_ID_MASK 0x800
@ -112,10 +111,16 @@
#define ASCII_TO_U32(a, b, c, d) ((u32)((a << 24) | (b << 16) | (c << 8) | (d << 0))) #define ASCII_TO_U32(a, b, c, d) ((u32)((a << 24) | (b << 16) | (c << 8) | (d << 0)))
#define SPRITE_PIXEL_SCALE (5.0 / 7.0)
#define ITEM_VIS_GROUP(itemID, visGroupID) ((visGroupID) << 16 | (itemID)) #define ITEM_VIS_GROUP(itemID, visGroupID) ((visGroupID) << 16 | (itemID))
// loads integrator with standard parameter set used for falling
#define LOAD_INTEGRATOR_FALL(ptr) \
(ptr)[0] = 0.11430f; \
(ptr)[1] = -0.28710f; \
(ptr)[2] = -0.18230f; \
(ptr)[3] = 0.01152f; \
/* common AI function and script variables */ /* common AI function and script variables */
// ai script // ai script
#define AI_TEMP_STATE functionTemp[0] #define AI_TEMP_STATE functionTemp[0]

View File

@ -404,11 +404,11 @@ void init_npc_list(void);
/// Presumably did something once upon a time but got commented out. /// Presumably did something once upon a time but got commented out.
void npc_iter_no_op(void); void npc_iter_no_op(void);
s32 _create_npc(NpcBlueprint* blueprint, u32** animList, s32 skipLoadingAnims); s32 _create_npc(NpcBlueprint* blueprint, AnimID** animList, s32 skipLoadingAnims);
s32 _create_npc_basic(NpcBlueprint* blueprint); s32 _create_npc_basic(NpcBlueprint* blueprint);
s32 _create_npc_standard(NpcBlueprint* blueprint, u32** animList); s32 _create_npc_standard(NpcBlueprint* blueprint, AnimID** animList);
s32 _create_npc_partner(NpcBlueprint* blueprint); s32 _create_npc_partner(NpcBlueprint* blueprint);

View File

@ -72,7 +72,7 @@ extern CollisionData gCollisionData;
extern s8 D_800A0900; extern s8 D_800A0900;
extern f32 GravityParamsStartFall[]; extern f32 GravityParamsStartFall[];
extern s16 D_800F7B80; extern s16 FootstepSoundSelector;
extern u8* D_801512F0; extern u8* D_801512F0;
extern u16 D_80151308; extern u16 D_80151308;
extern s32 gEntityHideMode; extern s32 gEntityHideMode;
@ -192,11 +192,11 @@ extern UNK_FUN_PTR(D_8010C940);
extern Entity* TweesterTouchingPartner; extern Entity* TweesterTouchingPartner;
extern Entity* TweesterTouchingPlayer; extern Entity* TweesterTouchingPlayer;
extern UNK_FUN_PTR(D_8010C958); extern UNK_FUN_PTR(D_8010C958);
extern s32 D_8010C95C; extern s32 PrevPlayerDirection;
extern s32 D_8010C96C; extern s32 D_8010C96C;
extern s32 D_8010C980; extern s32 D_8010C980;
extern s32 D_8010C9A0; extern s32 D_8010C9A0;
extern s32 D_800F7B40; extern s32 PrevPlayerCamRelativeYaw;
extern s32 D_800F7B44; extern s32 D_800F7B44;
extern f32 D_8010C938; extern f32 D_8010C938;
extern f32 D_8010C990; extern f32 D_8010C990;
@ -258,8 +258,8 @@ extern s32 D_80292110[];
extern s32 D_8029FBD0; extern s32 D_8029FBD0;
extern s32 KoopatrolDisguiseExtraAnims[]; extern AnimID KoopatrolDisguiseExtraAnims[];
extern s32 HammerBroDisguiseExtraAnims[]; extern AnimID HammerBroDisguiseExtraAnims[];
//various //various
extern s32 D_802C05CC; extern s32 D_802C05CC;

View File

@ -348,9 +348,9 @@ void appendGfx_player_actor_blur(Actor* actor) {
guRotateF(mtxRotZ, rotZ, 0.0f, 0.0f, 1.0f); guRotateF(mtxRotZ, rotZ, 0.0f, 0.0f, 1.0f);
guMtxCatF(mtxRotX, mtxRotY, mtxTransform); guMtxCatF(mtxRotX, mtxRotY, mtxTransform);
guMtxCatF(mtxTransform, mtxRotZ, mtxRotation); guMtxCatF(mtxTransform, mtxRotZ, mtxRotation);
guScaleF(mtxScale, actor->scale.x * SPRITE_PIXEL_SCALE * actor->scalingFactor, guScaleF(mtxScale, actor->scale.x * SPRITE_WORLD_SCALE_D * actor->scalingFactor,
actor->scale.y * SPRITE_PIXEL_SCALE * actor->scalingFactor * partTable->verticalStretch, actor->scale.y * SPRITE_WORLD_SCALE_D * actor->scalingFactor * partTable->verticalStretch,
actor->scale.z * SPRITE_PIXEL_SCALE); actor->scale.z * SPRITE_WORLD_SCALE_D);
guMtxCatF(mtxScale, mtxPivotOn, mtxTemp); guMtxCatF(mtxScale, mtxPivotOn, mtxTemp);
guMtxCatF(mtxTemp, mtxRotation, mtxTransform); guMtxCatF(mtxTemp, mtxRotation, mtxTransform);
guMtxCatF(mtxTransform, mtxPivotOff, mtxTemp); guMtxCatF(mtxTransform, mtxPivotOff, mtxTemp);
@ -424,9 +424,9 @@ void func_802552EC(s32 arg0, Actor* actor) {
guRotateF(mtxRotZ, actor->rotation.z, 0.0f, 0.0f, 1.0f); guRotateF(mtxRotZ, actor->rotation.z, 0.0f, 0.0f, 1.0f);
guMtxCatF(mtxRotX, mtxRotY, mtxTemp); guMtxCatF(mtxRotX, mtxRotY, mtxTemp);
guMtxCatF(mtxTemp, mtxRotZ, mtxRotation); guMtxCatF(mtxTemp, mtxRotZ, mtxRotation);
guScaleF(mtxScale, actor->scale.x * SPRITE_PIXEL_SCALE * actor->scalingFactor, guScaleF(mtxScale, actor->scale.x * SPRITE_WORLD_SCALE_D * actor->scalingFactor,
actor->scale.y * SPRITE_PIXEL_SCALE * actor->scalingFactor, actor->scale.y * SPRITE_WORLD_SCALE_D * actor->scalingFactor,
actor->scale.z * SPRITE_PIXEL_SCALE); actor->scale.z * SPRITE_WORLD_SCALE_D);
guMtxCatF(mtxScale, mtxRotation, mtxActor); guMtxCatF(mtxScale, mtxRotation, mtxActor);
numParts = actor->numParts; numParts = actor->numParts;
@ -453,7 +453,7 @@ void func_802552EC(s32 arg0, Actor* actor) {
} }
if (partTable->flags & ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION) { if (partTable->flags & ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION) {
guScaleF(mtxPartScale, actor->scale.x * SPRITE_PIXEL_SCALE, actor->scale.y * SPRITE_PIXEL_SCALE, actor->scale.z * SPRITE_PIXEL_SCALE); guScaleF(mtxPartScale, actor->scale.x * SPRITE_WORLD_SCALE_D, actor->scale.y * SPRITE_WORLD_SCALE_D, actor->scale.z * SPRITE_WORLD_SCALE_D);
} }
j = decorationTable->unk_7D9; j = decorationTable->unk_7D9;
@ -3705,7 +3705,7 @@ void func_8025DA68(ActorPart* part, s32 decorationIndex) {
x = part->currentPos.x; x = part->currentPos.x;
y = part->currentPos.y + (part->size.y / 2); y = part->currentPos.y + (part->size.y / 2);
z = part->currentPos.z - 5.0f; z = part->currentPos.z - 5.0f;
// bug? perhaps this should be % 4? // @bug? perhaps this should be % 4?
if ((gGameStatusPtr->frameCounter / 4) == 0) { if ((gGameStatusPtr->frameCounter / 4) == 0) {
fx_sparkles(FX_SPARKLES_1, x, y, z, 10.0f); fx_sparkles(FX_SPARKLES_1, x, y, z, 10.0f);
} }

View File

@ -3,19 +3,19 @@
extern s32 D_8010C968; extern s32 D_8010C968;
extern s32 D_8010C98C; extern s32 D_8010C98C;
s32 func_80262130(f32 inX, f32 inY, f32 inZ, f32 arg3, f32 radius) { s32 func_80262130(f32 inX, f32 inY, f32 inZ, f32 height, f32 radius) {
f32 x = inX; f32 x = inX;
f32 y = inY; f32 y = inY;
f32 z = inZ; f32 z = inZ;
f32 hitDepth = arg3; f32 hitDepth = height;
s32 ret = FALSE; s32 ret = FALSE;
s32 phi_s0 = 0; s32 phi_s0 = 0;
if (npc_raycast_down_around(0, &x, &y, &z, &hitDepth, 90.0f, radius) && hitDepth <= arg3) { if (npc_raycast_down_around(0, &x, &y, &z, &hitDepth, 90.0f, radius) && hitDepth <= height) {
s32 type = get_collider_type_by_id(D_8010C98C & 0xFF); s32 colliderFlagsA = get_collider_flags(D_8010C98C & 0xFF);
s32 type2 = get_collider_type_by_id(D_8010C968 & 0xFF); s32 colliderFlagsB = get_collider_flags(D_8010C968 & 0xFF);
phi_s0 = type & type2; phi_s0 = colliderFlagsA & colliderFlagsB;
if (phi_s0 != (D_8010C98C & 0xFF)) { if (phi_s0 != (D_8010C98C & 0xFF)) {
phi_s0 = 0; phi_s0 = 0;
} }

View File

@ -36,7 +36,7 @@ extern ActorPartBlueprint bMarioParts[];
extern PartnerDMAData D_80283F10[]; extern PartnerDMAData D_80283F10[];
s32 func_80265CE8(u32*, s32); s32 func_80265CE8(AnimID*, s32);
void create_target_list(Actor* actor, s32 arg1); void create_target_list(Actor* actor, s32 arg1);
INCLUDE_ASM(s32, "190B20", create_target_list); INCLUDE_ASM(s32, "190B20", create_target_list);
@ -1218,7 +1218,7 @@ void load_partner_actor(void) {
if (part->idleAnimations != NULL) { if (part->idleAnimations != NULL) {
part->currentAnimation = func_80265CE8(part->idleAnimations, 1); part->currentAnimation = func_80265CE8(part->idleAnimations, 1);
part->unk_84 = spr_load_npc_sprite(part->currentAnimation | 0x80000000, NULL); part->unk_84 = spr_load_npc_sprite(part->currentAnimation | SPRITE_ID_TAIL_ALLOCATE, NULL);
} }
if (i + 1 >= partCount) { if (i + 1 >= partCount) {
@ -1484,7 +1484,7 @@ Actor* create_actor(Formation formation) {
part->unk_84 = -1; part->unk_84 = -1;
if (part->idleAnimations != NULL) { if (part->idleAnimations != NULL) {
part->currentAnimation = func_80265CE8(part->idleAnimations, 1) & ~0x80000000; part->currentAnimation = func_80265CE8(part->idleAnimations, 1) & ~SPRITE_ID_TAIL_ALLOCATE;
part->unk_84 = spr_load_npc_sprite(part->currentAnimation, NULL); part->unk_84 = spr_load_npc_sprite(part->currentAnimation, NULL);
} }

View File

@ -1351,9 +1351,9 @@ ApiStatus PlayerRunToGoal(Evt* script, s32 isInitialCall) {
player->footStepCounter++; player->footStepCounter++;
playerState->distance = 0.0f; playerState->distance = 0.0f;
if ((player->footStepCounter % 2) != 0) { if ((player->footStepCounter % 2) != 0) {
sfx_play_sound_at_position(SOUND_STEP1, 0, player->currentPos.x, player->currentPos.y, player->currentPos.z); sfx_play_sound_at_position(SOUND_STEP_NORMAL1, 0, player->currentPos.x, player->currentPos.y, player->currentPos.z);
} else { } else {
sfx_play_sound_at_position(SOUND_STEP2, 0, player->currentPos.x, player->currentPos.y, player->currentPos.z); sfx_play_sound_at_position(SOUND_STEP_NORMAL2, 0, player->currentPos.x, player->currentPos.y, player->currentPos.z);
} }
} }
@ -1426,9 +1426,9 @@ ApiStatus CancelablePlayerRunToGoal(Evt* script, s32 isInitialCall) {
player->footStepCounter++; player->footStepCounter++;
playerState->distance = 0.0f; playerState->distance = 0.0f;
if ((player->footStepCounter % 2) != 0) { if ((player->footStepCounter % 2) != 0) {
sfx_play_sound_at_position(SOUND_STEP1, 0, player->currentPos.x, player->currentPos.y, player->currentPos.z); sfx_play_sound_at_position(SOUND_STEP_NORMAL1, 0, player->currentPos.x, player->currentPos.y, player->currentPos.z);
} else { } else {
sfx_play_sound_at_position(SOUND_STEP2, 0, player->currentPos.x, player->currentPos.y, player->currentPos.z); sfx_play_sound_at_position(SOUND_STEP_NORMAL2, 0, player->currentPos.x, player->currentPos.y, player->currentPos.z);
} }
} }

View File

@ -269,7 +269,7 @@ void basic_ai_wander_init(Evt* script, MobileAISettings* npcAISettings, EnemyDet
// chose a random direction and move time // chose a random direction and move time
npc->duration = (npcAISettings->moveTime / 2) + rand_int((npcAISettings->moveTime / 2) + 1); npc->duration = (npcAISettings->moveTime / 2) + rand_int((npcAISettings->moveTime / 2) + 1);
npc->yaw = clamp_angle(npc->yaw + rand_int(60) - 30.0f); npc->yaw = clamp_angle(npc->yaw + rand_int(60) - 30.0f);
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_WALK]; npc->currentAnim = enemy->animList[ENEMY_ANIM_WALK];
script->functionTemp[1] = 0; script->functionTemp[1] = 0;
if (enemy->territory->wander.moveSpeedOverride < 0) { if (enemy->territory->wander.moveSpeedOverride < 0) {
@ -379,7 +379,7 @@ void basic_ai_loiter_init(Evt* script, MobileAISettings* aiSettings, EnemyDetect
npc->duration = (aiSettings->waitTime / 2) + rand_int((aiSettings->waitTime / 2) + 1); npc->duration = (aiSettings->waitTime / 2) + rand_int((aiSettings->waitTime / 2) + 1);
npc->yaw = clamp_angle(npc->yaw + rand_int(180) - 90.0f); npc->yaw = clamp_angle(npc->yaw + rand_int(180) - 90.0f);
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
script->AI_TEMP_STATE = AI_STATE_LOITER; script->AI_TEMP_STATE = AI_STATE_LOITER;
} }
@ -430,7 +430,7 @@ void basic_ai_found_player_jump_init(Evt* script, MobileAISettings* npcAISetting
Npc* npc = get_npc_unsafe(enemy->npcID); Npc* npc = get_npc_unsafe(enemy->npcID);
ai_enemy_play_sound(npc, SOUND_3E1, 0); ai_enemy_play_sound(npc, SOUND_3E1, 0);
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_JUMP]; npc->currentAnim = enemy->animList[ENEMY_ANIM_JUMP];
npc->jumpVelocity = 10.0f; npc->jumpVelocity = 10.0f;
npc->jumpScale = 2.5f; npc->jumpScale = 2.5f;
npc->moveToPos.y = npc->pos.y; npc->moveToPos.y = npc->pos.y;
@ -489,7 +489,7 @@ void basic_ai_chase_init(Evt* script, MobileAISettings* npcAISettings, EnemyDete
npc->duration = 0; npc->duration = 0;
} }
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_CHASE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_CHASE];
npc->moveSpeed = npcAISettings->chaseSpeed; npc->moveSpeed = npcAISettings->chaseSpeed;
script->AI_TEMP_STATE = AI_STATE_CHASE; script->AI_TEMP_STATE = AI_STATE_CHASE;
} }
@ -502,7 +502,7 @@ void basic_ai_chase(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume
if (!basic_ai_check_player_dist(territory, enemy, aiSettings->chaseRadius, aiSettings->chaseOffsetDist, 1)) { if (!basic_ai_check_player_dist(territory, enemy, aiSettings->chaseRadius, aiSettings->chaseOffsetDist, 1)) {
fx_emote(EMOTE_QUESTION, npc, 0, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 15, &sp28); fx_emote(EMOTE_QUESTION, npc, 0, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 15, &sp28);
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
npc->duration = 20; npc->duration = 20;
script->AI_TEMP_STATE = AI_STATE_LOSE_PLAYER; script->AI_TEMP_STATE = AI_STATE_LOSE_PLAYER;
return; return;
@ -515,7 +515,7 @@ void basic_ai_chase(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume
z = npc->pos.z; z = npc->pos.z;
if (npc_test_move_simple_with_slipping(npc->collisionChannel, &x, &y, &z, 1.0f, npc->yaw, npc->collisionHeight, npc->collisionRadius)) { if (npc_test_move_simple_with_slipping(npc->collisionChannel, &x, &y, &z, 1.0f, npc->yaw, npc->collisionHeight, npc->collisionRadius)) {
fx_emote(EMOTE_QUESTION, npc, 0, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 0xC, &sp28); fx_emote(EMOTE_QUESTION, npc, 0, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 0xC, &sp28);
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
npc->duration = 15; npc->duration = 15;
script->AI_TEMP_STATE = AI_STATE_LOSE_PLAYER; script->AI_TEMP_STATE = AI_STATE_LOSE_PLAYER;
return; return;
@ -570,7 +570,7 @@ ApiStatus BasicAI_Main(Evt* script, s32 isInitialCall) {
script->AI_TEMP_STATE = AI_STATE_WANDER_INIT; script->AI_TEMP_STATE = AI_STATE_WANDER_INIT;
npc->duration = 0; npc->duration = 0;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
npc->flags &= ~NPC_FLAG_JUMPING; npc->flags &= ~NPC_FLAG_JUMPING;
if (!enemy->territory->wander.isFlying) { if (!enemy->territory->wander.isFlying) {

View File

@ -105,7 +105,7 @@ ApiStatus func_8005DB00(Evt* script, s32 isInitialCall) {
npc->duration = evt_get_variable(script, LVar1); npc->duration = evt_get_variable(script, LVar1);
script->functionTemp[1] = evt_get_variable(script, LVar2); script->functionTemp[1] = evt_get_variable(script, LVar2);
script->functionTemp[2] = evt_get_variable(script, LVar3) / 2; script->functionTemp[2] = evt_get_variable(script, LVar3) / 2;
npc->currentAnim.w = script->varTable[10]; npc->currentAnim = script->varTable[10];
script->functionTemp[0] = 1; script->functionTemp[0] = 1;
break; break;
case 1: case 1:

View File

@ -2665,7 +2665,7 @@ void btl_state_update_select_target(void) {
} }
} }
if (battleStatus->currentTargetListFlags < 0) { if (battleStatus->currentTargetListFlags & 0x80000000) {
if (!(gBattleStatus.flags1 & BS_FLAGS1_80000)) { if (!(gBattleStatus.flags1 & BS_FLAGS1_80000)) {
gBattleState2 = battleStatus->unk_6E; gBattleState2 = battleStatus->unk_6E;
if (gBattleStatus.flags2 & BS_FLAGS2_40) { if (gBattleStatus.flags2 & BS_FLAGS2_40) {

View File

@ -40,6 +40,7 @@ s32 get_player_back_anim(s32 arg0);
void appendGfx_player(void* data); void appendGfx_player(void* data);
void appendGfx_player_spin(void* data); void appendGfx_player_spin(void* data);
void update_player_shadow(void); void update_player_shadow(void);
s32 partner_use_ability(void);
s32 player_raycast_below(f32 yaw, f32 diameter, f32* outX, f32* outY, f32* outZ, f32* outLength, f32* hitRx, f32* hitRz, s32 player_raycast_below(f32 yaw, f32 diameter, f32* outX, f32* outY, f32* outZ, f32* outLength, f32* hitRx, f32* hitRz,
f32* hitDirX, f32* hitDirZ) { f32* hitDirX, f32* hitDirZ) {
@ -366,7 +367,7 @@ s32 player_test_lateral_overlap(s32 mode, PlayerStatus* playerStatus, f32* x, f3
radius = playerStatus->colliderDiameter * 0.5f; radius = playerStatus->colliderDiameter * 0.5f;
ret = -1; ret = -1;
if ((playerStatus->flags & (PLAYER_STATUS_FLAGS_FALLING | PLAYER_STATUS_FLAGS_JUMPING)) == 0) { if (!(playerStatus->flags & (PLAYER_STATUS_FLAGS_FALLING | PLAYER_STATUS_FLAGS_JUMPING))) {
height = playerStatus->colliderHeight * 0.286f; height = playerStatus->colliderHeight * 0.286f;
} else { } else {
height = 1.0f; height = 1.0f;
@ -544,7 +545,7 @@ s32 player_test_move_with_slipping(PlayerStatus* playerStatus, f32* x, f32* y, f
s32 ret = -1; s32 ret = -1;
height = 0.0f; height = 0.0f;
if ((playerStatus->flags & (PLAYER_STATUS_FLAGS_JUMPING | PLAYER_STATUS_FLAGS_FALLING)) == 0) { if (!(playerStatus->flags & (PLAYER_STATUS_FLAGS_JUMPING | PLAYER_STATUS_FLAGS_FALLING))) {
height = 10.01f; height = 10.01f;
} }
radius = playerStatus->colliderDiameter * 0.5f; radius = playerStatus->colliderDiameter * 0.5f;
@ -698,14 +699,14 @@ void phys_update_standard(void) {
check_input_use_partner(); check_input_use_partner();
phys_update_action_state(); phys_update_action_state();
if (!(playerStatus->flags & 8)) { if (!(playerStatus->flags & PLAYER_STATUS_FLAGS_FLYING)) {
if (playerStatus->flags & 2) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_JUMPING) {
phys_update_jump(); phys_update_jump();
} }
} }
if (playerStatus->flags & 4) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_FALLING) {
if (!(playerStatus->flags & 8)) { if (!(playerStatus->flags & PLAYER_STATUS_FLAGS_FLYING)) {
phys_update_falling(); phys_update_falling();
} }
} }
@ -716,11 +717,8 @@ void phys_update_standard(void) {
collision_main_lateral(); collision_main_lateral();
collision_check_player_overlaps(); collision_check_player_overlaps();
if ( if (collision_main_above() < 0 && playerStatus->timeInAir == 0 &&
collision_main_above() < 0 && playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
playerStatus->timeInAir == 0 &&
playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS
) {
func_800E4F10(); func_800E4F10();
} }
@ -730,8 +728,8 @@ void phys_update_standard(void) {
} }
} }
if (playerStatus->animFlags & 2) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_2) {
func_802BE070_31DBE0(); world_watt_sync_held_position();
} }
if (!(playerStatus->flags & PLAYER_STATUS_FLAGS_CAMERA_DOESNT_FOLLOW)) { if (!(playerStatus->flags & PLAYER_STATUS_FLAGS_CAMERA_DOESNT_FOLLOW)) {
@ -823,7 +821,8 @@ s32 get_overriding_player_anim(s32 anim) {
return -1; return -1;
} }
} else if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) { } else if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
if (playerStatus->unk_C4 && (anim == ANIM_Peach_C0000 || anim == ANIM_Peach_C0001 || anim == ANIM_Peach_C0002)) { if ((playerStatus->peachItemHeld != 0)
&& (anim == ANIM_Peach_C0000 || anim == ANIM_Peach_C0001 || anim == ANIM_Peach_C0002)) {
anim = ANIM_Peach_D0000; anim = ANIM_Peach_D0000;
} }
} }
@ -835,9 +834,9 @@ s32 get_overriding_player_anim(s32 anim) {
return anim; return anim;
} }
void suggest_player_anim_clearUnkFlag(s32 anim) { void suggest_player_anim_clearUnkFlag(AnimID anim) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
s32 newAnim = get_overriding_player_anim(anim); AnimID newAnim = get_overriding_player_anim(anim);
if (newAnim != -1) { if (newAnim != -1) {
playerStatus->anim = newAnim; playerStatus->anim = newAnim;
@ -846,7 +845,7 @@ void suggest_player_anim_clearUnkFlag(s32 anim) {
} }
} }
void force_player_anim(s32 anim) { void force_player_anim(AnimID anim) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
playerStatus->anim = anim; playerStatus->anim = anim;
@ -854,9 +853,9 @@ void force_player_anim(s32 anim) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_10000000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_10000000;
} }
void suggest_player_anim_setUnkFlag(s32 anim) { void suggest_player_anim_setUnkFlag(AnimID anim) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
s32 newAnim = get_overriding_player_anim(anim); AnimID newAnim = get_overriding_player_anim(anim);
if (newAnim != -1) { if (newAnim != -1) {
playerStatus->anim = newAnim; playerStatus->anim = newAnim;
@ -867,34 +866,34 @@ void suggest_player_anim_setUnkFlag(s32 anim) {
void update_player_blink(void) { void update_player_blink(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
s32 phi_a2 = 0; s32 outtaSight = FALSE;
u8 phi_v1; u8 phi_v1;
u8* alpha; u8* alpha;
if (gPartnerActionStatus.actingPartner == PARTNER_BOW) { if (gPartnerActionStatus.actingPartner == PARTNER_BOW) {
phi_a2 = gPartnerActionStatus.partnerActionState != PARTNER_ACTION_NONE; outtaSight = gPartnerActionStatus.partnerActionState != PARTNER_ACTION_NONE;
} }
if (playerStatus->blinkTimer > 0) { if (playerStatus->blinkTimer > 0) {
playerStatus->blinkTimer--; playerStatus->blinkTimer--;
alpha = &playerStatus->alpha1; alpha = &playerStatus->alpha1;
if (!(gGameStatusPtr->frameCounter & 1)) { if (!(gGameStatusPtr->frameCounter & 1)) {
if (phi_a2) { if (outtaSight) {
phi_v1 = 0xC0; phi_v1 = 192;
} else { } else {
phi_v1 = 0xFF; phi_v1 = 255;
} }
} else { } else {
phi_v1 = 0x60; phi_v1 = 96;
} }
*alpha = phi_v1; *alpha = phi_v1;
if (!playerStatus->blinkTimer) { if (!playerStatus->blinkTimer) {
if (phi_a2) { if (outtaSight) {
playerStatus->alpha1 = 0x80; playerStatus->alpha1 = 128;
playerStatus->flags |= PLAYER_STATUS_FLAGS_8000; playerStatus->flags |= PLAYER_STATUS_FLAGS_8000;
} else { } else {
playerStatus->alpha1 = 0xFF; playerStatus->alpha1 = 255;
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_8000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_8000;
} }
} else { } else {
@ -965,9 +964,7 @@ void func_800E01DC(void) {
s32 func_800E0208(void) { s32 func_800E0208(void) {
s32 ret = FALSE; s32 ret = FALSE;
if (gGameStatusPtr->disableScripts && if (gGameStatusPtr->disableScripts && (gGameStatusPtr->currentButtons[0] & BUTTON_R)) {
(gGameStatusPtr->currentButtons[0] & PLAYER_STATUS_FLAGS_10))
{
if (gPartnerActionStatus.partnerActionState == PARTNER_ACTION_NONE) { if (gPartnerActionStatus.partnerActionState == PARTNER_ACTION_NONE) {
set_action_state(ACTION_STATE_IDLE); set_action_state(ACTION_STATE_IDLE);
} }
@ -1284,7 +1281,7 @@ void update_partner_timers(void) {
for (i = 1; i < ARRAY_COUNT(playerData->partnerUnlockedTime); i++) { for (i = 1; i < ARRAY_COUNT(playerData->partnerUnlockedTime); i++) {
if (playerData->partners[i].enabled) { if (playerData->partners[i].enabled) {
playerData->partnerUnlockedTime[i] += 1; playerData->partnerUnlockedTime[i]++;
} }
} }
} }
@ -1293,73 +1290,74 @@ void update_partner_timers(void) {
void func_800E0B90(void) { void func_800E0B90(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 cameraYaw = gCameras[gCurrentCameraID].currentYaw; f32 cameraYaw = gCameras[gCurrentCameraID].currentYaw;
f32 temp_f20 = get_clamped_angle_diff(cameraYaw, playerStatus->currentYaw); f32 camRelativeYaw = get_clamped_angle_diff(cameraYaw, playerStatus->currentYaw);
s32 trueAnim; s32 trueAnim;
s32 animByte; s32 sprIndex;
f32 unk_90; f32 angle;
s32 phi_v1; s32 direction;
f32 phi_f0; f32 timescale;
D_800F7B48 = 0.0f; D_800F7B48 = 0.0f;
if (temp_f20 < -5.0f && temp_f20 > -175.0f) { if (camRelativeYaw < -5.0f && camRelativeYaw > -175.0f) {
temp_f20 = 0.0f; camRelativeYaw = 0.0f;
phi_v1 = 0; direction = 0;
} else if (temp_f20 > 5.0f && temp_f20 < 175.0f) { } else if (camRelativeYaw > 5.0f && camRelativeYaw < 175.0f) {
temp_f20 = 180.0f; camRelativeYaw = 180.0f;
phi_v1 = 1; direction = 1;
} else { } else {
temp_f20 = D_800F7B40; // direction is close to flipping, use saved value
phi_v1 = 2; camRelativeYaw = PrevPlayerCamRelativeYaw;
direction = 2;
} }
if (D_8010C95C != phi_v1 && phi_v1 != 2) { // detect direction change
D_8010C95C = phi_v1; if (PrevPlayerDirection != direction && direction != 2) {
playerStatus->unk_90[gCurrentCameraID] = (phi_v1 != 0) ? 180.0f : -180.0f; PrevPlayerDirection = direction;
playerStatus->flipYaw[gCurrentCameraID] = (direction != 0) ? 180.0f : -180.0f;
if (fabsf(get_clamped_angle_diff(cameraYaw, playerStatus->currentYaw)) >= 90.0f) { if (fabsf(get_clamped_angle_diff(cameraYaw, playerStatus->currentYaw)) >= 90.0f) {
playerStatus->unk_90[gCurrentCameraID] = -playerStatus->unk_90[gCurrentCameraID]; playerStatus->flipYaw[gCurrentCameraID] = -playerStatus->flipYaw[gCurrentCameraID];
} }
} }
// handle sprite 'flipping' when changing direction
unk_90 = playerStatus->unk_90[gCurrentCameraID]; angle = playerStatus->flipYaw[gCurrentCameraID];
if (unk_90 != 0.0f) { if (angle != 0.0f) {
if (unk_90 < 0.0f) { if (angle < 0.0f) {
unk_90 += 28.0f; angle += 28.0f;
if (unk_90 > 0.0f) { if (angle > 0.0f) {
unk_90 = 0.0f; angle = 0.0f;
} }
} }
if (angle > 0.0f) {
if (unk_90 > 0.0f) { angle -= 28.0f;
unk_90 -= 28.0f; if (angle < 0.0f) {
if (unk_90 < 0.0f) { angle = 0.0f;
unk_90 = 0.0f;
} }
} }
} }
if (playerStatus->flags & 0x200000) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_200000) {
unk_90 = 0.0f; angle = 0.0f;
} }
playerStatus->unk_90[gCurrentCameraID] = unk_90; playerStatus->flipYaw[gCurrentCameraID] = angle;
D_800F7B40 = unk_90 = clamp_angle(temp_f20); PrevPlayerCamRelativeYaw = angle = clamp_angle(camRelativeYaw);
unk_90 = clamp_angle(playerStatus->unk_90[gCurrentCameraID] + unk_90); angle = clamp_angle(playerStatus->flipYaw[gCurrentCameraID] + angle);
if (playerStatus->currentSpeed == 0.0f) { if (playerStatus->currentSpeed == 0.0f) {
D_800F7B48 = 0.0f; D_800F7B48 = 0.0f;
} }
trueAnim = playerStatus->anim; trueAnim = playerStatus->anim;
if (playerStatus->flags & 0x20000) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_20000) {
playerStatus->trueAnimation = trueAnim; playerStatus->trueAnimation = trueAnim;
} else { } else {
animByte = (trueAnim >> 0x10) & 0xFF; sprIndex = (trueAnim >> 0x10) & 0xFF;
if (playerStatus->actionState != 0xF && !(playerStatus->flags & 0x100000)) { if (playerStatus->actionState != ACTION_STATE_TORNADO_JUMP && !(playerStatus->flags & PLAYER_STATUS_FLAGS_100000)) {
playerStatus->spriteFacingAngle = unk_90 + D_800F7B48; playerStatus->spriteFacingAngle = angle + D_800F7B48;
trueAnim = playerStatus->anim; trueAnim = playerStatus->anim;
if (!(playerStatus->flags & 0x10000000) && if (!(playerStatus->flags & PLAYER_STATUS_FLAGS_10000000) &&
(animByte == 1 || animByte == 6 || animByte == 10) && (sprIndex == SPR_Mario_1 || sprIndex == SPR_Mario_6 || sprIndex == SPR_Peach_A) &&
fabsf(get_clamped_angle_diff(cameraYaw, playerStatus->currentYaw)) < 60.0f) fabsf(get_clamped_angle_diff(cameraYaw, playerStatus->currentYaw)) < 60.0f)
{ {
trueAnim = get_player_back_anim(trueAnim); trueAnim = get_player_back_anim(trueAnim);
@ -1368,10 +1366,9 @@ void func_800E0B90(void) {
playerStatus->currentYaw = playerStatus->targetYaw; playerStatus->currentYaw = playerStatus->targetYaw;
} else { } else {
trueAnim = playerStatus->anim; trueAnim = playerStatus->anim;
if (!(playerStatus->flags & 0x10000000) && if (!(playerStatus->flags & PLAYER_STATUS_FLAGS_10000000) &&
(animByte == 1 || animByte == 6 || animByte == 10) && (sprIndex == SPR_Mario_1 || sprIndex == SPR_Mario_6 || sprIndex == SPR_Peach_A) &&
playerStatus->spriteFacingAngle < 350.0f && playerStatus->spriteFacingAngle < 350.0f && playerStatus->spriteFacingAngle > 190.0f)
playerStatus->spriteFacingAngle > 190.0f)
{ {
trueAnim = get_player_back_anim(trueAnim); trueAnim = get_player_back_anim(trueAnim);
} }
@ -1379,61 +1376,61 @@ void func_800E0B90(void) {
} }
} }
phi_f0 = 1.0f; timescale = 1.0f;
if (playerStatus->flags & 0x40000) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_40000) {
phi_f0 = 0.5f; timescale = 0.5f;
} }
if (playerStatus->flags & 0x20000000) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_20000000) {
phi_f0 = 0.0f; timescale = 0.0f;
} }
playerStatus->unk_BC = spr_update_player_sprite(0, playerStatus->trueAnimation, phi_f0); playerStatus->unk_BC = spr_update_player_sprite(0, playerStatus->trueAnimation, timescale);
playerStatus->flags |= 0x40000000; playerStatus->flags |= PLAYER_STATUS_FLAGS_40000000;
} }
s32 get_player_back_anim(s32 arg0) { s32 get_player_back_anim(s32 anim) {
s32 animByte = (arg0 >> 16) & 0xff; s32 sprIndex = (anim >> 16) & 0xff;
s32 ret = 0; s32 outAnim = 0;
if (animByte != 1) { if (sprIndex != SPR_Mario_1) {
if (animByte != 6 && animByte != 10) { if (sprIndex != SPR_Mario_6 && sprIndex != SPR_Peach_A) {
return arg0; return anim;
} }
if (animByte == 1) { if (sprIndex == SPR_Mario_1) {
if (arg0 > 0x1000C) { if (anim > ANIM_Mario_1000C) {
return arg0; return anim;
} }
} else if (animByte == 6) { } else if (sprIndex == SPR_Mario_6) {
if (arg0 == 0x6000C) { if (anim == ANIM_Mario_6000C) {
ret = 0x6000D; outAnim = ANIM_Mario_6000D;
} else if (arg0 == 0x6000E) { } else if (anim == ANIM_Mario_6000E) {
ret = 0x6000F; outAnim = ANIM_Mario_6000F;
} else if (arg0 == 0x60010) { } else if (anim == ANIM_Mario_60010) {
ret = 0x60011; outAnim = ANIM_Mario_60011;
} else if (arg0 == 0x60012) { } else if (anim == ANIM_Mario_60012) {
ret = 0x60013; outAnim = ANIM_Mario_60013;
} else if (arg0 == 0x60014) { } else if (anim == ANIM_Mario_60014) {
ret = 0x60015; outAnim = ANIM_Mario_60015;
} else if (arg0 == 0x60016) { } else if (anim == ANIM_Mario_60016) {
ret = 0x60017; outAnim = ANIM_Mario_60017;
} else if (arg0 == 0x60018) { } else if (anim == ANIM_Mario_60018) {
ret = 0x60019; outAnim = ANIM_Mario_60019;
} else if (arg0 == 0x6001A) { } else if (anim == ANIM_Mario_6001A) {
ret = 0x6001B; outAnim = ANIM_Mario_6001B;
} }
} else if (animByte == 10) { } else if (sprIndex == SPR_Peach_A) {
if (arg0 > 0xA0006) { if (anim > ANIM_Peach_A0006) {
ret = arg0 + 1; outAnim = anim + 1;
} }
} }
} else if (arg0 > 0x1000C) { } else if (anim > ANIM_Mario_1000C) {
return arg0; return anim;
} }
if (ret != 0) { if (outAnim != 0) {
return ret; return outAnim;
} else { } else {
return arg0 | 0x1000000; return anim | SPRITE_ID_BACK_FACING;
} }
} }
@ -1505,10 +1502,10 @@ void appendGfx_player(void* data) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
Matrix4f sp20, sp60, spA0, spE0; Matrix4f sp20, sp60, spA0, spE0;
f32 temp_f0 = -gCameras[gCurrentCamID].currentYaw; f32 temp_f0 = -gCameras[gCurrentCamID].currentYaw;
s32 phi_a0; s32 flags;
if (playerStatus->actionState == ACTION_STATE_SLIDING) { if (playerStatus->actionState == ACTION_STATE_SLIDING) {
guScaleF(spE0, SPRITE_PIXEL_SCALE, SPRITE_PIXEL_SCALE, SPRITE_PIXEL_SCALE); guScaleF(spE0, SPRITE_WORLD_SCALE_D, SPRITE_WORLD_SCALE_D, SPRITE_WORLD_SCALE_D);
guRotateF(sp20, temp_f0, 0.0f, 1.0f, 0.0f); guRotateF(sp20, temp_f0, 0.0f, 1.0f, 0.0f);
guMtxCatF(spE0, sp20, sp20); guMtxCatF(spE0, sp20, sp20);
guRotateF(spA0, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f); guRotateF(spA0, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f);
@ -1528,7 +1525,7 @@ void appendGfx_player(void* data) {
guMtxCatF(sp20, spA0, sp20); guMtxCatF(sp20, spA0, sp20);
guTranslateF(sp60, 0.0f, playerStatus->colliderHeight * 0.5f, 0.0f); guTranslateF(sp60, 0.0f, playerStatus->colliderHeight * 0.5f, 0.0f);
guMtxCatF(sp20, sp60, sp20); guMtxCatF(sp20, sp60, sp20);
guScaleF(spE0, SPRITE_PIXEL_SCALE, SPRITE_PIXEL_SCALE, SPRITE_PIXEL_SCALE); guScaleF(spE0, SPRITE_WORLD_SCALE_F, SPRITE_WORLD_SCALE_D, SPRITE_WORLD_SCALE_D);
guMtxCatF(sp20, spE0, sp20); guMtxCatF(sp20, spE0, sp20);
guTranslateF(sp60, playerStatus->position.x, playerStatus->position.y, playerStatus->position.z); guTranslateF(sp60, playerStatus->position.x, playerStatus->position.y, playerStatus->position.z);
guMtxCatF(sp20, sp60, sp20); guMtxCatF(sp20, sp60, sp20);
@ -1546,14 +1543,14 @@ void appendGfx_player(void* data) {
func_802DDEE4(0, -1, 0, 0, 0, 0, 0, 0); func_802DDEE4(0, -1, 0, 0, 0, 0, 0, 0);
} }
} }
phi_a0 = 0;
if (playerStatus->spriteFacingAngle >= 90.0f && playerStatus->spriteFacingAngle < 270.0f) { if (playerStatus->spriteFacingAngle >= 90.0f && playerStatus->spriteFacingAngle < 270.0f) {
phi_a0 = PLAYER_STATUS_ANIM_FLAGS_10000000; flags = 0x10000000;
} else {
flags = 0;
} }
spr_draw_player_sprite(phi_a0, 0, 0, 0, sp20); spr_draw_player_sprite(flags, 0, 0, 0, sp20);
} }
D_800F7B4C++; D_800F7B4C++;
@ -1634,7 +1631,7 @@ void appendGfx_player_spin(void* data) {
guMtxCatF(mtx, rotation, mtx); guMtxCatF(mtx, rotation, mtx);
guTranslateF(translation, 0.0f, playerStatus->colliderHeight * 0.5f, 0.0f); guTranslateF(translation, 0.0f, playerStatus->colliderHeight * 0.5f, 0.0f);
guMtxCatF(mtx, translation, mtx); guMtxCatF(mtx, translation, mtx);
guScaleF(scale, SPRITE_PIXEL_SCALE, SPRITE_PIXEL_SCALE, SPRITE_PIXEL_SCALE); guScaleF(scale, SPRITE_WORLD_SCALE_D, SPRITE_WORLD_SCALE_D, SPRITE_WORLD_SCALE_D);
guMtxCatF(mtx, scale, mtx); guMtxCatF(mtx, scale, mtx);
guTranslateF(translation, px, py, pz); guTranslateF(translation, px, py, pz);
guMtxCatF(mtx, translation, mtx); guMtxCatF(mtx, translation, mtx);

View File

@ -48,9 +48,9 @@ void reset_player_status(void) {
D_8010C940 = 0; D_8010C940 = 0;
D_8010C958 = 0; D_8010C958 = 0;
D_8010C92C = 0; D_8010C92C = 0;
D_8010C95C = 0; PrevPlayerDirection = 0;
D_8010C980 = 0; D_8010C980 = 0;
D_800F7B40 = 0; PrevPlayerCamRelativeYaw = 0;
D_800F7B44 = 0; D_800F7B44 = 0;
D_8010C938 = 0; D_8010C938 = 0;
D_8010C990 = 0.0f; D_8010C990 = 0.0f;
@ -97,10 +97,10 @@ void reset_player_status(void) {
playerStatus->position.y = 0.0f; playerStatus->position.y = 0.0f;
playerStatus->position.z = 0.0f; playerStatus->position.z = 0.0f;
playerStatus->currentYaw = 0.0f; playerStatus->currentYaw = 0.0f;
playerStatus->unk_90[CAM_DEFAULT] = 0.0f; playerStatus->flipYaw[CAM_DEFAULT] = 0.0f;
playerStatus->unk_90[CAM_BATTLE] = 0.0f; playerStatus->flipYaw[CAM_BATTLE] = 0.0f;
playerStatus->unk_90[CAM_TATTLE] = 0.0f; playerStatus->flipYaw[CAM_TATTLE] = 0.0f;
playerStatus->unk_90[CAM_3] = 0.0f; playerStatus->flipYaw[CAM_3] = 0.0f;
mapSettings = gAreas[gGameStatusPtr->areaID].maps[gGameStatusPtr->mapID].settings; mapSettings = gAreas[gGameStatusPtr->areaID].maps[gGameStatusPtr->mapID].settings;

View File

@ -145,9 +145,11 @@ s32 phys_adjust_cam_on_landing(void) {
} }
if (ret == 1) { if (ret == 1) {
if ((get_collider_type_by_id(gCollisionStatus.currentFloor) & 0xFF) == 3) { s32 surfaceType = get_collider_flags(gCollisionStatus.currentFloor) & COLLIDER_FLAGS_SURFACE_TYPE_MASK;
ret = 0;
if (surfaceType == SURFACE_TYPE_LAVA) {
gCameras[0].moveFlags |= CAMERA_MOVE_FLAGS_1; gCameras[0].moveFlags |= CAMERA_MOVE_FLAGS_1;
ret = 0;
} else { } else {
gCameras[0].moveFlags &= ~CAMERA_MOVE_FLAGS_1; gCameras[0].moveFlags &= ~CAMERA_MOVE_FLAGS_1;
} }
@ -347,11 +349,11 @@ void set_action_state(s32 actionState) {
if (actionState == ACTION_STATE_HIT_FIRE || actionState == ACTION_STATE_HIT_LAVA) { if (actionState == ACTION_STATE_HIT_FIRE || actionState == ACTION_STATE_HIT_LAVA) {
s8 partner; s8 partner;
if (playerStatus->unk_BF == 3) { if (playerStatus->hazardType == HAZARD_TYPE_FIRE_BAR) {
actionState = ACTION_STATE_HIT_FIRE; actionState = ACTION_STATE_HIT_FIRE;
} }
// Whilst Sushie, Lakilester, Parakarry's ability is active, hazards have no effect. // Whilst Sushie, Lakilester, or Parakarry's ability is active, hazards have no effect.
partner = playerData->currentPartner; partner = playerData->currentPartner;
if (partner == PARTNER_SUSHIE || partner == PARTNER_LAKILESTER || partner == PARTNER_PARAKARRY) { if (partner == PARTNER_SUSHIE || partner == PARTNER_LAKILESTER || partner == PARTNER_PARAKARRY) {
@ -391,9 +393,9 @@ void set_action_state(s32 actionState) {
sfx_stop_sound(spinState->spinSoundID); sfx_stop_sound(spinState->spinSoundID);
} }
if (playerStatus->unk_D8 != NULL) { if (playerStatus->specialDecorationEffect != NULL) {
playerStatus->unk_D8->data.unk_46->unk_24 = 10; playerStatus->specialDecorationEffect->data.unk_46->unk_24 = 10;
playerStatus->unk_D8 = NULL; playerStatus->specialDecorationEffect = NULL;
} }
} }
@ -413,10 +415,7 @@ void start_falling(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
set_action_state(ACTION_STATE_FALLING); set_action_state(ACTION_STATE_FALLING);
playerStatus->gravityIntegrator[0] = 0.1143f; LOAD_INTEGRATOR_FALL(playerStatus->gravityIntegrator);
playerStatus->gravityIntegrator[1] = -0.2871f;
playerStatus->gravityIntegrator[2] = -0.1823f;
playerStatus->gravityIntegrator[3] = 0.01152f;
} }
void start_bounce_a(void) { void start_bounce_a(void) {
@ -466,12 +465,15 @@ s32 check_input_hammer(void) {
s32 check_input_jump(void) { s32 check_input_jump(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
CollisionStatus* collisionStatus = &gCollisionStatus; CollisionStatus* collisionStatus = &gCollisionStatus;
s32 surfaceType;
if (!(playerStatus->pressedButtons & BUTTON_A)) { if (!(playerStatus->pressedButtons & BUTTON_A)) {
return FALSE; return FALSE;
} }
if ((get_collider_type_by_id((u16)collisionStatus->currentFloor) == 5) && phys_should_player_be_sliding()) { // @bug? collider flags not properly masked with COLLIDER_FLAGS_SURFACE_TYPE
surfaceType = get_collider_flags((u16)gCollisionStatus.currentFloor);
if ((surfaceType == SURFACE_TYPE_SLIDE) && phys_should_player_be_sliding()) {
return FALSE; return FALSE;
} }
@ -542,7 +544,7 @@ void peach_set_disguise_anim(s32 arg0) {
s32 listIndex = D_8010C96C; s32 listIndex = D_8010C96C;
if (listIndex >= 0) { if (listIndex >= 0) {
get_npc_by_index(listIndex)->currentAnim.w = arg0; get_npc_by_index(listIndex)->currentAnim = arg0;
} }
} }

View File

@ -3,8 +3,8 @@
extern f32 GravityParamsStartJump[]; extern f32 GravityParamsStartJump[];
extern f32 D_8010C928; extern f32 D_8010C928;
extern f32 D_8010C960; extern f32 JumpedOnSwitchX;
extern f32 D_8010C97C; extern f32 JumpedOnSwitchZ;
extern f32 D_8010C984; extern f32 D_8010C984;
void func_800E315C(s32 colliderID); void func_800E315C(s32 colliderID);
@ -103,7 +103,7 @@ s32 collision_main_above(void) {
} while (0); } while (0);
playerStatus->position.y = y - ((playerStatus->colliderHeight / 5.0f) * 3.0f); playerStatus->position.y = y - ((playerStatus->colliderHeight / 5.0f) * 3.0f);
if (playerStatus->actionState != ACTION_STATE_ULTRA_JUMP && if (playerStatus->actionState != ACTION_STATE_TORNADO_JUMP &&
playerStatus->actionState != ACTION_STATE_SPIN_JUMP) playerStatus->actionState != ACTION_STATE_SPIN_JUMP)
{ {
playerStatus->gravityIntegrator[0] = 0.0f; playerStatus->gravityIntegrator[0] = 0.0f;
@ -121,16 +121,16 @@ s32 collision_main_above(void) {
void func_800E29C8(void) { void func_800E29C8(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
s32 colliderID; s32 colliderID;
f32 temp_f20; f32 groundPosY;
s32 phi_a0; AnimID anim;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->fallState = 0; playerStatus->actionSubstate = LANDING_ON_SWITCH_SUBSTATE_0;
} }
if (playerStatus->fallState == 0) { if (playerStatus->actionSubstate == LANDING_ON_SWITCH_SUBSTATE_0) {
if (dist2D(D_8010C960, D_8010C97C, playerStatus->position.x, playerStatus->position.z) <= 22.0f) { if (dist2D(JumpedOnSwitchX, JumpedOnSwitchZ, playerStatus->position.x, playerStatus->position.z) <= 22.0f) {
add_vec2D_polar(&playerStatus->position.x, &playerStatus->position.z, 5.0f, playerStatus->targetYaw); add_vec2D_polar(&playerStatus->position.x, &playerStatus->position.z, 5.0f, playerStatus->targetYaw);
} }
integrate_gravity(); integrate_gravity();
@ -138,26 +138,26 @@ void func_800E29C8(void) {
record_jump_apex(); record_jump_apex();
gravity_use_fall_parms(); gravity_use_fall_parms();
integrate_gravity(); integrate_gravity();
playerStatus->fallState = 1; playerStatus->actionSubstate = LANDING_ON_SWITCH_SUBSTATE_1;
} }
if (playerStatus->gravityIntegrator[0] > playerStatus->maxJumpSpeed) { if (playerStatus->gravityIntegrator[0] > playerStatus->maxJumpSpeed) {
playerStatus->gravityIntegrator[0] = playerStatus->maxJumpSpeed; playerStatus->gravityIntegrator[0] = playerStatus->maxJumpSpeed;
} }
playerStatus->position.y += playerStatus->gravityIntegrator[0]; playerStatus->position.y += playerStatus->gravityIntegrator[0];
} else if (playerStatus->fallState == 2) { } else if (playerStatus->actionSubstate == LANDING_ON_SWITCH_SUBSTATE_2) {
if (dist2D(D_8010C960, D_8010C97C, playerStatus->position.x, playerStatus->position.z) <= 22.0f) { if (dist2D(JumpedOnSwitchX, JumpedOnSwitchZ, playerStatus->position.x, playerStatus->position.z) <= 22.0f) {
add_vec2D_polar(&playerStatus->position.x, &playerStatus->position.z, 5.0f, playerStatus->targetYaw); add_vec2D_polar(&playerStatus->position.x, &playerStatus->position.z, 5.0f, playerStatus->targetYaw);
} }
temp_f20 = player_check_collision_below(func_800E34D8(), &colliderID); groundPosY = player_check_collision_below(func_800E34D8(), &colliderID);
func_800E315C(colliderID); func_800E315C(colliderID);
playerStatus->position.y = temp_f20; playerStatus->position.y = groundPosY;
if (colliderID >= 0) { if (colliderID >= 0) {
if (!(playerStatus->animFlags & 1)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) {
phi_a0 = 0x10009; anim = ANIM_Mario_10009;
} else { } else {
phi_a0 = 0x6000B; anim = ANIM_Mario_6000B;
} }
suggest_player_anim_clearUnkFlag(phi_a0); suggest_player_anim_clearUnkFlag(anim);
enable_player_input(); enable_player_input();
phys_player_land(); phys_player_land();
} }
@ -192,10 +192,7 @@ void func_800E2BB0(void) {
if (cond) { if (cond) {
record_jump_apex(); record_jump_apex();
playerStatus->gravityIntegrator[0] = 0.1143f; LOAD_INTEGRATOR_FALL(playerStatus->gravityIntegrator);
playerStatus->gravityIntegrator[1] = -0.2871f;
playerStatus->gravityIntegrator[2] = -0.1823f;
playerStatus->gravityIntegrator[3] = 0.01152f;
set_action_state(ACTION_STATE_FALLING); set_action_state(ACTION_STATE_FALLING);
} }
} }
@ -272,7 +269,7 @@ void phys_update_jump(void) {
void phys_init_integrator_for_current_state(void) { void phys_init_integrator_for_current_state(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32* temp_a0; f32* params;
switch (playerStatus->actionState) { switch (playerStatus->actionState) {
case ACTION_STATE_LANDING_ON_SWITCH: case ACTION_STATE_LANDING_ON_SWITCH:
@ -283,22 +280,22 @@ void phys_init_integrator_for_current_state(void) {
break; break;
case ACTION_STATE_JUMP: case ACTION_STATE_JUMP:
case ACTION_STATE_SPIN_JUMP: case ACTION_STATE_SPIN_JUMP:
case ACTION_STATE_GROUND_POUND: case ACTION_STATE_SPIN_POUND:
case ACTION_STATE_ULTRA_JUMP: case ACTION_STATE_TORNADO_JUMP:
case ACTION_STATE_ULTRA_POUND: case ACTION_STATE_TORNADO_POUND:
case ACTION_STATE_HIT_FIRE: case ACTION_STATE_HIT_FIRE:
case ACTION_STATE_HIT_LAVA: case ACTION_STATE_HIT_LAVA:
temp_a0 = GravityParamsStartJump; params = GravityParamsStartJump;
if (!(playerStatus->flags & PLAYER_STATUS_FLAGS_40000)) { if (!(playerStatus->flags & PLAYER_STATUS_FLAGS_40000)) {
playerStatus->gravityIntegrator[0] = *temp_a0++; playerStatus->gravityIntegrator[0] = *params++;
playerStatus->gravityIntegrator[1] = *temp_a0++; playerStatus->gravityIntegrator[1] = *params++;
playerStatus->gravityIntegrator[2] = *temp_a0++; playerStatus->gravityIntegrator[2] = *params++;
playerStatus->gravityIntegrator[3] = *temp_a0++; playerStatus->gravityIntegrator[3] = *params++;
} else { } else {
playerStatus->gravityIntegrator[0] = *temp_a0++ * 0.5f; playerStatus->gravityIntegrator[0] = *params++ * 0.5f;
playerStatus->gravityIntegrator[1] = *temp_a0++ * 0.5f; playerStatus->gravityIntegrator[1] = *params++ * 0.5f;
playerStatus->gravityIntegrator[2] = *temp_a0++ * 0.5f; playerStatus->gravityIntegrator[2] = *params++ * 0.5f;
playerStatus->gravityIntegrator[3] = *temp_a0++ * 0.5f; playerStatus->gravityIntegrator[3] = *params++ * 0.5f;
} }
break; break;
} }
@ -308,21 +305,21 @@ static const f32 padding = 0.0f;
// This function is wack. This weird stuff is needed to match // This function is wack. This weird stuff is needed to match
void gravity_use_fall_parms(void) { void gravity_use_fall_parms(void) {
f32* floats = GravityParamsStartFall; f32* params = GravityParamsStartFall;
PlayerStatus* playerStatus; PlayerStatus* playerStatus;
do {} while (0); do {} while (0);
playerStatus = &gPlayerStatus; playerStatus = &gPlayerStatus;
if (playerStatus->flags & 0x40000) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_40000) {
playerStatus->gravityIntegrator[0] = *floats++ / 12.0f; playerStatus->gravityIntegrator[0] = *params++ / 12.0f;
playerStatus->gravityIntegrator[1] = *floats++ / 12.0f; playerStatus->gravityIntegrator[1] = *params++ / 12.0f;
playerStatus->gravityIntegrator[2] = *floats++ / 12.0f; playerStatus->gravityIntegrator[2] = *params++ / 12.0f;
playerStatus->gravityIntegrator[3] = *floats++ / 12.0f; playerStatus->gravityIntegrator[3] = *params++ / 12.0f;
} else { } else {
playerStatus->gravityIntegrator[0] = *floats++; playerStatus->gravityIntegrator[0] = *params++;
playerStatus->gravityIntegrator[1] = *floats++; playerStatus->gravityIntegrator[1] = *params++;
playerStatus->gravityIntegrator[2] = *floats++; playerStatus->gravityIntegrator[2] = *params++;
playerStatus->gravityIntegrator[3] = *floats++; playerStatus->gravityIntegrator[3] = *params++;
} }
} }
@ -331,9 +328,7 @@ void phys_update_falling(void) {
gPlayerStatus.actionState != ACTION_STATE_BOUNCE) gPlayerStatus.actionState != ACTION_STATE_BOUNCE)
{ {
s32 colliderID; s32 colliderID;
gPlayerStatus.position.y = player_check_collision_below(func_800E34D8(), &colliderID); gPlayerStatus.position.y = player_check_collision_below(func_800E34D8(), &colliderID);
func_800E315C(colliderID); func_800E315C(colliderID);
} }
} }
@ -343,19 +338,18 @@ void func_800E315C(s32 colliderID) {
PartnerActionStatus* partnerActionStatus = &gPartnerActionStatus; PartnerActionStatus* partnerActionStatus = &gPartnerActionStatus;
if (colliderID >= 0) { if (colliderID >= 0) {
u8 colliderType = get_collider_type_by_id(colliderID); s32 surfaceType = get_collider_flags(colliderID) & COLLIDER_FLAGS_SURFACE_TYPE_MASK;
switch (surfaceType) {
switch (colliderType) { case SURFACE_TYPE_WATER:
case 1: case SURFACE_TYPE_DOCK_WALL:
case 4: case SURFACE_TYPE_SLIDE:
case 5:
set_action_state(ACTION_STATE_LAND); set_action_state(ACTION_STATE_LAND);
break; break;
case 3: case SURFACE_TYPE_LAVA:
if ((*(s32*)(&partnerActionStatus->partnerActionState) & 0xFF0000FF) != 0x01000009) { if ((*(s32*)(&partnerActionStatus->partnerActionState) & 0xFF0000FF) != 0x01000009) {
if (playerStatus->blinkTimer == 0) { if (playerStatus->blinkTimer == 0) {
if (playerStatus->actionState != ACTION_STATE_HIT_LAVA) { if (playerStatus->actionState != ACTION_STATE_HIT_LAVA) {
playerStatus->unk_BF = 1; playerStatus->hazardType = HAZARD_TYPE_LAVA;
set_action_state(ACTION_STATE_HIT_LAVA); set_action_state(ACTION_STATE_HIT_LAVA);
} }
} else { } else {
@ -363,11 +357,11 @@ void func_800E315C(s32 colliderID) {
} }
} }
break; break;
case 2: case SURFACE_TYPE_SPIKES:
if ((*(s32*)(&partnerActionStatus->partnerActionState) & 0xFF0000FF) != 0x01000009) { if ((*(s32*)(&partnerActionStatus->partnerActionState) & 0xFF0000FF) != 0x01000009) {
if (playerStatus->blinkTimer == 0) { if (playerStatus->blinkTimer == 0) {
if (playerStatus->actionState != ACTION_STATE_HIT_FIRE) { if (playerStatus->actionState != ACTION_STATE_HIT_FIRE) {
playerStatus->unk_BF = 2; playerStatus->hazardType = HAZARD_TYPE_SPIKES;
set_action_state(ACTION_STATE_HIT_LAVA); set_action_state(ACTION_STATE_HIT_LAVA);
} }
break; break;
@ -393,7 +387,7 @@ void phys_player_land(void) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_800000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_800000;
playerStatus->landPos.x = playerStatus->position.x; playerStatus->landPos.x = playerStatus->position.x;
playerStatus->landPos.z = playerStatus->position.z; playerStatus->landPos.z = playerStatus->position.z;
playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_FLYING | PLAYER_STATUS_FLAGS_FALLING | PLAYER_STATUS_FLAGS_JUMPING); playerStatus->flags &= ~PLAYER_STATUS_FLAGS_AIRBORNE;
sfx_play_sound_at_player(SOUND_SOFT_LAND, 0); sfx_play_sound_at_player(SOUND_SOFT_LAND, 0);
if (!(collisionStatus->currentFloor & COLLISION_WITH_ENTITY_BIT)) { if (!(collisionStatus->currentFloor & COLLISION_WITH_ENTITY_BIT)) {
phys_adjust_cam_on_landing(); phys_adjust_cam_on_landing();
@ -408,22 +402,22 @@ void phys_player_land(void) {
Entity* entity = get_entity_by_index(collisionStatus->currentFloor); Entity* entity = get_entity_by_index(collisionStatus->currentFloor);
entity->collisionFlags |= ENTITY_COLLISION_PLAYER_TOUCH_FLOOR; entity->collisionFlags |= ENTITY_COLLISION_PLAYER_TOUCH_FLOOR;
if (playerStatus->actionState != ACTION_STATE_ULTRA_JUMP && if (playerStatus->actionState != ACTION_STATE_TORNADO_JUMP &&
playerStatus->actionState != ACTION_STATE_ULTRA_POUND && playerStatus->actionState != ACTION_STATE_TORNADO_POUND &&
playerStatus->actionState != ACTION_STATE_SPIN_JUMP && playerStatus->actionState != ACTION_STATE_SPIN_JUMP &&
playerStatus->actionState != ACTION_STATE_GROUND_POUND) playerStatus->actionState != ACTION_STATE_SPIN_POUND)
{ {
set_action_state(ACTION_STATE_LANDING_ON_SWITCH); set_action_state(ACTION_STATE_LANDING_ON_SWITCH);
} else { } else {
disable_player_input(); disable_player_input();
playerStatus->fallState = 0xB; playerStatus->actionSubstate = 11;
} }
return; return;
} }
} }
} }
if (playerStatus->flags & 0x4000) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_4000) {
set_action_state(ACTION_STATE_RUN); set_action_state(ACTION_STATE_RUN);
return; return;
} }
@ -465,12 +459,12 @@ f32 integrate_gravity(void) {
} }
f32 func_800E34D8(void) { f32 func_800E34D8(void) {
f32 ret = integrate_gravity(); f32 velocity = integrate_gravity();
if (func_800E0208()) { if (func_800E0208()) {
ret = 0.0f; velocity = 0.0f;
} }
return ret; return velocity;
} }
f32 player_check_collision_below(f32 offset, s32* colliderID) { f32 player_check_collision_below(f32 offset, s32* colliderID) {
@ -549,8 +543,8 @@ void collision_main_lateral(void) {
} }
} }
break; break;
case ACTION_STATE_GROUND_POUND: case ACTION_STATE_SPIN_POUND:
case ACTION_STATE_ULTRA_POUND: case ACTION_STATE_TORNADO_POUND:
playerStatus->position.x += playerStatus->extraVelocity.x; playerStatus->position.x += playerStatus->extraVelocity.x;
playerStatus->position.y += playerStatus->extraVelocity.y; playerStatus->position.y += playerStatus->extraVelocity.y;
playerStatus->position.z += playerStatus->extraVelocity.z; playerStatus->position.z += playerStatus->extraVelocity.z;
@ -624,7 +618,7 @@ void collision_main_lateral(void) {
} }
sin_cos_rad(yaw * TAU / 360.0f, &sinTheta, &cosTheta); sin_cos_rad(yaw * TAU / 360.0f, &sinTheta, &cosTheta);
if (playerStatus->actionState == ACTION_STATE_14) { if (playerStatus->actionState == ACTION_STATE_PUSHING_BLOCK) {
if (fabsf(sinTheta) > fabsf(cosTheta)) { if (fabsf(sinTheta) > fabsf(cosTheta)) {
xBump = speed * sinTheta; xBump = speed * sinTheta;
zBump = 0.0f; zBump = 0.0f;
@ -751,7 +745,7 @@ void collision_main_lateral(void) {
case ACTION_STATE_LANDING_ON_SWITCH: case ACTION_STATE_LANDING_ON_SWITCH:
case ACTION_STATE_LAND: case ACTION_STATE_LAND:
case ACTION_STATE_STEP_DOWN_LAND: case ACTION_STATE_STEP_DOWN_LAND:
case ACTION_STATE_ULTRA_JUMP: case ACTION_STATE_TORNADO_JUMP:
case ACTION_STATE_SLIDING: case ACTION_STATE_SLIDING:
case ACTION_STATE_HIT_FIRE: case ACTION_STATE_HIT_FIRE:
case ACTION_STATE_HIT_LAVA: case ACTION_STATE_HIT_LAVA:
@ -888,20 +882,20 @@ void phys_main_collision_below(void) {
f32 temp_f24 = (2.0f * playerStatus->colliderHeight) / 7.0f; f32 temp_f24 = (2.0f * playerStatus->colliderHeight) / 7.0f;
f32 hitRx, hitRz; f32 hitRx, hitRz;
f32 hitDirX, hitDirZ; f32 hitDirX, hitDirZ;
s32 result; s32 colliderID;
s32 cond; s32 cond;
result = player_raycast_below_cam_relative(playerStatus, &playerX, &playerY, &playerZ, &outLength, &hitRx, &hitRz, colliderID = player_raycast_below_cam_relative(playerStatus, &playerX, &playerY, &playerZ, &outLength, &hitRx, &hitRz,
&hitDirX, &hitDirZ); &hitDirX, &hitDirZ);
playerStatus->groundNormalPitch = get_player_normal_pitch(); playerStatus->groundNormalPitch = get_player_normal_pitch();
if (collHeightHalf + (temp_f24 * 0.5f) < outLength) { if (collHeightHalf + (temp_f24 * 0.5f) < outLength) {
result = -1; colliderID = -1;
} }
if (playerStatus->timeInAir == 0) { if (playerStatus->timeInAir == 0) {
collisionStatus->currentFloor = result; collisionStatus->currentFloor = colliderID;
} }
if (result >= 0) { if (colliderID >= 0) {
playerStatus->groundAnglesXZ.x = hitDirX; playerStatus->groundAnglesXZ.x = hitDirX;
playerStatus->groundAnglesXZ.y = hitDirZ; playerStatus->groundAnglesXZ.y = hitDirZ;
} }
@ -910,7 +904,7 @@ void phys_main_collision_below(void) {
return; return;
} }
if (playerStatus->flags & (PLAYER_STATUS_FLAGS_FLYING | PLAYER_STATUS_FLAGS_FALLING | PLAYER_STATUS_FLAGS_JUMPING)) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_AIRBORNE) {
return; return;
} }
@ -922,13 +916,14 @@ void phys_main_collision_below(void) {
(phys_adjust_cam_on_landing(), !phys_should_player_be_sliding()) || (phys_adjust_cam_on_landing(), !phys_should_player_be_sliding()) ||
(set_action_state(ACTION_STATE_SLIDING), (playerStatus->actionState != ACTION_STATE_SLIDING)))) (set_action_state(ACTION_STATE_SLIDING), (playerStatus->actionState != ACTION_STATE_SLIDING))))
{ {
if (result >= 0) { if (colliderID >= 0) {
switch (get_collider_type_by_id(result) & 0xFF) { s32 surfaceType = get_collider_flags(colliderID) & COLLIDER_FLAGS_SURFACE_TYPE_MASK;
case 2: switch (surfaceType) {
case SURFACE_TYPE_SPIKES:
if (partnerActionStatus->partnerActionState == PARTNER_ACTION_NONE || partnerActionStatus->actingPartner != PARTNER_BOW) { if (partnerActionStatus->partnerActionState == PARTNER_ACTION_NONE || partnerActionStatus->actingPartner != PARTNER_BOW) {
if (playerStatus->blinkTimer == 0) { if (playerStatus->blinkTimer == 0) {
if (playerStatus->actionState != ACTION_STATE_HIT_LAVA) { if (playerStatus->actionState != ACTION_STATE_HIT_LAVA) {
playerStatus->unk_BF = 2; playerStatus->hazardType = HAZARD_TYPE_SPIKES;
set_action_state(ACTION_STATE_HIT_LAVA); set_action_state(ACTION_STATE_HIT_LAVA);
} }
} else { } else {
@ -936,11 +931,11 @@ void phys_main_collision_below(void) {
} }
} }
break; break;
case 3: case SURFACE_TYPE_LAVA:
if (partnerActionStatus->partnerActionState == PARTNER_ACTION_NONE || partnerActionStatus->actingPartner != PARTNER_BOW) { if (partnerActionStatus->partnerActionState == PARTNER_ACTION_NONE || partnerActionStatus->actingPartner != PARTNER_BOW) {
if (playerStatus->blinkTimer == 0) { if (playerStatus->blinkTimer == 0) {
if (playerStatus->actionState != ACTION_STATE_HIT_LAVA) { if (playerStatus->actionState != ACTION_STATE_HIT_LAVA) {
playerStatus->unk_BF = 1; playerStatus->hazardType = HAZARD_TYPE_LAVA;
set_action_state(ACTION_STATE_HIT_LAVA); set_action_state(ACTION_STATE_HIT_LAVA);
} }
} else { } else {
@ -1000,7 +995,7 @@ void collision_lava_reset_check_additional_overlaps(void) {
f32 x, y, z; f32 x, y, z;
f32 temp_f0; f32 temp_f0;
if (playerStatus->animFlags & 0x1000) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
func_800E4F10(); func_800E4F10();
return; return;
} }
@ -1098,7 +1093,7 @@ void check_input_midair_jump(void) {
gPlayerStatus.flags |= 8; gPlayerStatus.flags |= 8;
break; break;
case 2: case 2:
set_action_state(ACTION_STATE_ULTRA_JUMP); set_action_state(ACTION_STATE_TORNADO_JUMP);
gPlayerStatus.flags |= 8; gPlayerStatus.flags |= 8;
break; break;
} }
@ -1109,26 +1104,25 @@ s8 get_current_partner_id(void) {
return gPlayerData.currentPartner; return gPlayerData.currentPartner;
} }
void try_player_footstep_sounds(s32 arg0) { void try_player_footstep_sounds(s32 interval) {
if (gGameStatusPtr->frameCounter % arg0 == 0) { if (gGameStatusPtr->frameCounter % interval == 0) {
u8 colliderType = get_collider_type_by_id(gCollisionStatus.currentFloor); s32 surfaceType = get_collider_flags(gCollisionStatus.currentFloor) & COLLIDER_FLAGS_SURFACE_TYPE_MASK;
s32 soundID; s32 soundID, altSoundID;
s32 soundID2;
if (colliderType == 6 || colliderType == 9) { if (surfaceType == SURFACE_TYPE_FLOWERS || surfaceType == SURFACE_TYPE_HEDGES) {
soundID = SOUND_143; soundID = SOUND_STEP_CRUNCHY1;
soundID2 = SOUND_144; altSoundID = SOUND_STEP_CRUNCHY2;
} else { } else {
soundID = SOUND_STEP1; soundID = SOUND_STEP_NORMAL1;
soundID2 = SOUND_STEP2; altSoundID = SOUND_STEP_NORMAL2;
} }
if (D_800F7B80 == 0) { if (FootstepSoundSelector == 0) {
soundID = soundID2; soundID = altSoundID;
} }
sfx_play_sound_at_player(soundID, 0); sfx_play_sound_at_player(soundID, 0);
D_800F7B80 ^= 1; FootstepSoundSelector ^= 1;
} }
} }
@ -1186,16 +1180,16 @@ s32 phys_can_player_interact(void) {
} }
f32 func_800E5348(void) { f32 func_800E5348(void) {
f32 temp_f0 = get_clamped_angle_diff(gCameras[gCurrentCameraID].currentYaw, gPlayerStatus.currentYaw); f32 deltaYaw = get_clamped_angle_diff(gCameras[gCurrentCameraID].currentYaw, gPlayerStatus.currentYaw);
if (temp_f0 < -5.0f && temp_f0 > -175.0f) { if (deltaYaw < -5.0f && deltaYaw > -175.0f) {
temp_f0 = 0.0f; deltaYaw = 0.0f;
} else if (temp_f0 > 5.0f && temp_f0 < 175.0f) { } else if (deltaYaw > 5.0f && deltaYaw < 175.0f) {
temp_f0 = 180.0f; deltaYaw = 180.0f;
} else { } else {
temp_f0 = D_800F7B40; deltaYaw = PrevPlayerCamRelativeYaw;
} }
return clamp_angle(temp_f0 - 90.0f + gCameras[gCurrentCameraID].currentYaw); return clamp_angle(deltaYaw - 90.0f + gCameras[gCurrentCameraID].currentYaw);
} }
f32 player_get_camera_facing_angle(void) { f32 player_get_camera_facing_angle(void) {

View File

@ -29,7 +29,7 @@ void func_800EFD08(void) {
colliderType = D_80109480; colliderType = D_80109480;
} }
D_80109480 = get_collider_type_by_id((u16)gCollisionStatus.currentFloor) & 0xFF; D_80109480 = get_collider_flags((u16)gCollisionStatus.currentFloor) & COLLIDER_FLAGS_SURFACE_TYPE_MASK;
if (playerStatus->actionState != ACTION_STATE_JUMP) { if (playerStatus->actionState != ACTION_STATE_JUMP) {
colliderType = D_80109480; colliderType = D_80109480;
@ -42,19 +42,19 @@ void func_800EFD08(void) {
D_8010CFF0 = playerStatus->timeInAir; D_8010CFF0 = playerStatus->timeInAir;
switch (colliderType) { switch (colliderType) {
case 6: case SURFACE_TYPE_FLOWERS:
func_800F0248(); func_800F0248();
break; break;
case 7: case SURFACE_TYPE_CLOUD:
func_800F0490(); func_800F0490();
break; break;
case 8: case SURFACE_TYPE_SNOW:
func_800F0864(); func_800F0864();
break; break;
case 9: case SURFACE_TYPE_HEDGES:
func_800F09EC(); func_800F09EC();
break; break;
case 1: case SURFACE_TYPE_WATER:
func_800F0B3C(); func_800F0B3C();
break; break;
default: default:
@ -89,7 +89,7 @@ void func_800F0248(void) {
if ( if (
playerStatus->actionState != ACTION_STATE_WALK && playerStatus->actionState != ACTION_STATE_RUN && playerStatus->actionState != ACTION_STATE_WALK && playerStatus->actionState != ACTION_STATE_RUN &&
(playerStatus->actionState != ACTION_STATE_SPIN || playerStatus->fallState != 0) !(playerStatus->actionState == ACTION_STATE_SPIN && playerStatus->actionSubstate == 0)
) { ) {
D_80109490 = 0; D_80109490 = 0;
return; return;
@ -128,7 +128,7 @@ void func_800F0864(void) {
if ( if (
( (
playerStatus->actionState != ACTION_STATE_WALK && playerStatus->actionState != ACTION_STATE_RUN && playerStatus->actionState != ACTION_STATE_WALK && playerStatus->actionState != ACTION_STATE_RUN &&
(playerStatus->actionState != ACTION_STATE_SPIN || playerStatus->fallState != 0) && !(playerStatus->actionState == ACTION_STATE_SPIN && playerStatus->actionSubstate == 0) &&
playerStatus->actionState != ACTION_STATE_LAND && playerStatus->actionState != ACTION_STATE_IDLE playerStatus->actionState != ACTION_STATE_LAND && playerStatus->actionState != ACTION_STATE_IDLE
) || playerStatus->flags >= 0 ) || playerStatus->flags >= 0
) { ) {

View File

@ -1854,7 +1854,7 @@ void update_item_entity_temp(ItemEntity* itemEntity) {
actionState != ACTION_STATE_LAUNCH && actionState != ACTION_STATE_LAUNCH &&
actionState != ACTION_STATE_RIDE && actionState != ACTION_STATE_RIDE &&
actionState != ACTION_STATE_IDLE && actionState != ACTION_STATE_IDLE &&
(actionState != ACTION_STATE_USE_SPINNING_FLOWER || playerStatus->fallState != 1) !(actionState == ACTION_STATE_USE_SPINNING_FLOWER && playerStatus->actionSubstate == 1)
) { ) {
break; break;
} }
@ -1874,7 +1874,7 @@ void update_item_entity_temp(ItemEntity* itemEntity) {
} }
} }
D_801568E0 = hud_element_create(gItemHudScripts[gItemTable[itemEntity->itemID].hudElemID].enabled); D_801568E0 = hud_element_create(gItemHudScripts[gItemTable[itemEntity->itemID].hudElemID].enabled);
hud_element_set_flags(D_801568E0, 0x80); hud_element_set_flags(D_801568E0, HUD_ELEMENT_FLAGS_80);
hud_element_set_render_pos(D_801568E0, -100, -100); hud_element_set_render_pos(D_801568E0, -100, -100);
itemEntity->state = 2; itemEntity->state = 2;
@ -1942,9 +1942,9 @@ void update_item_entity_temp(ItemEntity* itemEntity) {
playerData->hammerLevel = itemEntity->itemID - 4; playerData->hammerLevel = itemEntity->itemID - 4;
} }
if (itemEntity->itemID == ITEM_JUMP || if (itemEntity->itemID == ITEM_BOOTS ||
itemEntity->itemID == ITEM_SPIN_JUMP || itemEntity->itemID == ITEM_SUPER_BOOTS ||
itemEntity->itemID == ITEM_TORNADO_JUMP) itemEntity->itemID == ITEM_ULTRA_BOOTS)
{ {
playerData->bootsLevel = itemEntity->itemID - 1; playerData->bootsLevel = itemEntity->itemID - 1;
} }
@ -1975,7 +1975,7 @@ block_47: // TODO required to match
itemEntity->position.x = playerStatus->position.x; itemEntity->position.x = playerStatus->position.x;
itemEntity->position.y = playerStatus->position.y + playerStatus->colliderHeight; itemEntity->position.y = playerStatus->position.y + playerStatus->colliderHeight;
itemEntity->position.z = playerStatus->position.z; itemEntity->position.z = playerStatus->position.z;
suggest_player_anim_setUnkFlag(0x6000C); suggest_player_anim_setUnkFlag(ANIM_Mario_6000C);
} }
if (gItemTable[itemEntity->itemID].typeFlags & ITEM_TYPE_FLAG_GEAR) { if (gItemTable[itemEntity->itemID].typeFlags & ITEM_TYPE_FLAG_GEAR) {
@ -1998,7 +1998,7 @@ block_47: // TODO required to match
(itemEntity->flags & ITEM_ENTITY_FLAGS_4000000) || (itemEntity->flags & ITEM_ENTITY_FLAGS_4000000) ||
(itemEntity->pickupMsgFlags & 2)) (itemEntity->pickupMsgFlags & 2))
{ {
suggest_player_anim_setUnkFlag(0x6000C); suggest_player_anim_setUnkFlag(ANIM_Mario_6000C);
} }
} }
@ -2170,7 +2170,7 @@ block_47: // TODO required to match
sort_items(); sort_items();
add_item(itemEntity->itemID); add_item(itemEntity->itemID);
} }
suggest_player_anim_setUnkFlag(0x6000C); suggest_player_anim_setUnkFlag(ANIM_Mario_6000C);
func_801363A0(itemEntity); func_801363A0(itemEntity);
set_window_update(0xC, (s32) basic_window_update); set_window_update(0xC, (s32) basic_window_update);
D_801568E4 = 50; D_801568E4 = 50;
@ -2192,7 +2192,7 @@ block_47: // TODO required to match
} }
break; break;
case 15: case 15:
suggest_player_anim_setUnkFlag(0x10002); suggest_player_anim_setUnkFlag(ANIM_Mario_10002);
set_time_freeze_mode(TIME_FREEZE_NORMAL); set_time_freeze_mode(TIME_FREEZE_NORMAL);
enable_player_input(); enable_player_input();
partner_enable_input(); partner_enable_input();

View File

@ -55,18 +55,18 @@ ApiStatus func_80240158_EC2358(Evt* script, s32 isInitialCall) {
osSyncPrintf("cccc\n"); osSyncPrintf("cccc\n");
} }
} }
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_RUN]; npc->currentAnim = enemy->animList[ENEMY_ANIM_RUN];
npc->yaw = atan2(npc->pos.x, npc->pos.z, sp10, sp14); npc->yaw = atan2(npc->pos.x, npc->pos.z, sp10, sp14);
npc_move_heading(npc, 2.0f, npc->yaw); npc_move_heading(npc, 2.0f, npc->yaw);
} else if (temp_f4 > 0.2) { } else if (temp_f4 > 0.2) {
npc->yaw = atan2(npc->pos.x, npc->pos.z, sp10, sp14); npc->yaw = atan2(npc->pos.x, npc->pos.z, sp10, sp14);
npc->pos.x = sp10; npc->pos.x = sp10;
npc->pos.z = sp14; npc->pos.z = sp14;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_WALK]; npc->currentAnim = enemy->animList[ENEMY_ANIM_WALK];
} else { } else {
npc->pos.x = sp10; npc->pos.x = sp10;
npc->pos.z = sp14; npc->pos.z = sp14;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
} }
return ApiStatus_BLOCK; return ApiStatus_BLOCK;
} }

View File

@ -9,9 +9,9 @@
ApiStatus func_802429A0_EEFAA0(Evt* script, s32 isInitialCall) { ApiStatus func_802429A0_EEFAA0(Evt* script, s32 isInitialCall) {
script->varTable[0] = 0; script->varTable[0] = 0;
do {} while (0); do {} while (0);
if (gPlayerStatus.actionState == ACTION_STATE_GROUND_POUND) { if (gPlayerStatus.actionState == ACTION_STATE_SPIN_POUND) {
script->varTable[0] = 1; script->varTable[0] = 1;
} else if (gPlayerStatus.actionState == ACTION_STATE_ULTRA_POUND) { } else if (gPlayerStatus.actionState == ACTION_STATE_TORNADO_POUND) {
script->varTable[0] = 1; script->varTable[0] = 1;
} }
return ApiStatus_DONE2; return ApiStatus_DONE2;

View File

@ -23,8 +23,8 @@ BSS s32 D_8010C94C;
BSS s32 D_8010C950; BSS s32 D_8010C950;
BSS s32 TweesterTouchingPartner; BSS s32 TweesterTouchingPartner;
BSS s32 D_8010C958; BSS s32 D_8010C958;
BSS s32 D_8010C95C; BSS s32 PrevPlayerDirection;
BSS s32 D_8010C960; BSS s32 JumpedOnSwitchX;
BSS s32 D_8010C964; BSS s32 D_8010C964;
BSS s32 D_8010C968; BSS s32 D_8010C968;
BSS s32 D_8010C96C; BSS s32 D_8010C96C;
@ -32,7 +32,7 @@ BSS s32 D_8010C970;
BSS s32 D_8010C974; BSS s32 D_8010C974;
BSS s16 D_8010C978; BSS s16 D_8010C978;
BSS s16 D_8010C97A; BSS s16 D_8010C97A;
BSS s32 D_8010C97C; BSS s32 JumpedOnSwitchZ;
BSS s32 D_8010C980; BSS s32 D_8010C980;
BSS s32 D_8010C984; BSS s32 D_8010C984;
BSS char D_8010C988[0x4]; BSS char D_8010C988[0x4];

View File

@ -284,7 +284,7 @@ void load_hit_data(s32 idx, HitFile* hit) {
e21_y = triangle->e21.y; e21_y = triangle->e21.y;
e21_z = triangle->e21.z; e21_z = triangle->e21.z;
// vector product // cross product
normalX = e13_y * e21_z - e13_z * e21_y; normalX = e13_y * e21_z - e13_z * e21_y;
normalY = e13_z * e21_x - e13_x * e21_z; normalY = e13_z * e21_x - e13_x * e21_z;
normalZ = e13_x * e21_y - e13_y * e21_x; normalZ = e13_x * e21_y - e13_y * e21_x;
@ -465,7 +465,7 @@ void update_collider_transform(s16 colliderID) {
} }
} }
s32 get_collider_type_by_id(s32 colliderID) { s32 get_collider_flags(s32 colliderID) {
if (colliderID & COLLISION_WITH_ENTITY_BIT) { if (colliderID & COLLISION_WITH_ENTITY_BIT) {
return 0; return 0;
} else { } else {

View File

@ -189,7 +189,7 @@ void peach_star_beam_appendGfx(void* effect) {
} }
if (!(data->pos.z < partZ)) { if (!(data->pos.z < partZ)) {
shim_guPositionF(sp20, 0.0f, 0.0f, 0.0f, SPRITE_WORLD_SCALE, partX, partY, partZ); shim_guPositionF(sp20, 0.0f, 0.0f, 0.0f, SPRITE_WORLD_SCALE_F, partX, partY, partZ);
shim_guMtxF2L(sp20, &gDisplayContext->matrixStack[gMatrixListPos]); shim_guMtxF2L(sp20, &gDisplayContext->matrixStack[gMatrixListPos]);
gSPMatrix(gMasterGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++], gSPMatrix(gMasterGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++],

View File

@ -163,7 +163,7 @@ void throw_spiny_appendGfx(void* effect) {
ThrowSpinyFXData* data = ((EffectInstance*)effect)->data.throwSpiny; ThrowSpinyFXData* data = ((EffectInstance*)effect)->data.throwSpiny;
s32 temp_s5 = data->rgba; s32 temp_s5 = data->rgba;
s32 temp_s6 = data->unk_00; s32 temp_s6 = data->unk_00;
f32 scale = data->unk_40 * SPRITE_PIXEL_SCALE; f32 scale = data->unk_40 * SPRITE_WORLD_SCALE_D;
gDPPipeSync(gMasterGfxPos++); gDPPipeSync(gMasterGfxPos++);
gSPSegment(gMasterGfxPos++, 0x09, VIRTUAL_TO_PHYSICAL(((EffectInstance*)effect)->graphics->data)); gSPSegment(gMasterGfxPos++, 0x09, VIRTUAL_TO_PHYSICAL(((EffectInstance*)effect)->graphics->data));

View File

@ -169,7 +169,7 @@ ApiStatus DoNpcDefeat(Evt* script, s32 isInitialCall) {
Evt* newScript; Evt* newScript;
kill_script(script); kill_script(script);
npc->currentAnim.w = owner->animList[6]; npc->currentAnim = owner->animList[6];
newScript = start_script(&SCRIPT_NpcDefeat, EVT_PRIORITY_A, 0); newScript = start_script(&SCRIPT_NpcDefeat, EVT_PRIORITY_A, 0);
owner->defeatScript = newScript; owner->defeatScript = newScript;
owner->defeatScriptID = newScript->id; owner->defeatScriptID = newScript->id;
@ -812,7 +812,7 @@ ApiStatus func_80045900(Evt* script, s32 isInitialCall) {
s32 unk; s32 unk;
if (!(enemy->aiFlags & ENEMY_AI_FLAGS_10)) { if (!(enemy->aiFlags & ENEMY_AI_FLAGS_10)) {
npc->currentAnim.w = *enemy->animList; npc->currentAnim = *enemy->animList;
} }
if (!(enemy->aiFlags & ENEMY_AI_FLAGS_8)) { if (!(enemy->aiFlags & ENEMY_AI_FLAGS_8)) {

View File

@ -343,11 +343,11 @@ s32 entity_block_handle_collision(Entity* entity) {
breakBlock = FALSE; breakBlock = FALSE;
if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) { if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) {
if (playerStatus->actionState == ACTION_STATE_SPIN_JUMP || playerStatus->actionState == ACTION_STATE_ULTRA_JUMP) { if (playerStatus->actionState == ACTION_STATE_SPIN_JUMP || playerStatus->actionState == ACTION_STATE_TORNADO_JUMP) {
return FALSE; return FALSE;
} }
if (playerStatus->actionState == ACTION_STATE_GROUND_POUND || playerStatus->actionState == ACTION_STATE_ULTRA_POUND) { if (playerStatus->actionState == ACTION_STATE_SPIN_POUND || playerStatus->actionState == ACTION_STATE_TORNADO_POUND) {
breakBlock = TRUE; breakBlock = TRUE;
} else { } else {
return TRUE; return TRUE;

View File

@ -330,7 +330,7 @@ void entity_GiantChest_open(Entity* entity) {
chest->giveItemHeightInterpPhase = 180.0f; chest->giveItemHeightInterpPhase = 180.0f;
chest->state++; chest->state++;
if (chest->itemID != 0) { if (chest->itemID != 0) {
suggest_player_anim_setUnkFlag(0x6000C); suggest_player_anim_setUnkFlag(ANIM_Mario_6000C);
sin_cos_rad((90.0f - gCameras[CAM_DEFAULT].currentYaw) * TAU / 360.0f, &sinRight, &cosRight); sin_cos_rad((90.0f - gCameras[CAM_DEFAULT].currentYaw) * TAU / 360.0f, &sinRight, &cosRight);
sin_cos_rad((180.0f - gCameras[CAM_DEFAULT].currentYaw) * TAU / 360.0f, &sinFwd, &cosFwd); sin_cos_rad((180.0f - gCameras[CAM_DEFAULT].currentYaw) * TAU / 360.0f, &sinFwd, &cosFwd);
horizontalOffset = 0.0f; horizontalOffset = 0.0f;
@ -360,13 +360,13 @@ void entity_GiantChest_give_equipment(Entity* entity) {
s32 flagIndex; s32 flagIndex;
switch (data->itemID) { switch (data->itemID) {
case ITEM_JUMP: case ITEM_BOOTS:
gPlayerData.bootsLevel = 0; gPlayerData.bootsLevel = 0;
break; break;
case ITEM_SPIN_JUMP: case ITEM_SUPER_BOOTS:
gPlayerData.bootsLevel = 1; gPlayerData.bootsLevel = 1;
break; break;
case ITEM_TORNADO_JUMP: case ITEM_ULTRA_BOOTS:
gPlayerData.bootsLevel = 2; gPlayerData.bootsLevel = 2;
break; break;
case ITEM_HAMMER: case ITEM_HAMMER:
@ -412,7 +412,7 @@ void entity_GiantChest_await_got_item(Entity* entity) {
if (data->unk_30 != 0) { if (data->unk_30 != 0) {
exec_entity_commandlist(entity); exec_entity_commandlist(entity);
remove_item_entity_by_index(data->itemEntityIndex); remove_item_entity_by_index(data->itemEntityIndex);
suggest_player_anim_clearUnkFlag(0x10002); suggest_player_anim_clearUnkFlag(ANIM_Mario_10002);
enable_player_input(); enable_player_input();
data->itemID = -1; data->itemID = -1;
} }

View File

@ -15,8 +15,8 @@ void entity_GreenStompSwitch_idle(Entity* entity) {
SwitchData* data = entity->dataBuf.swtch; SwitchData* data = entity->dataBuf.swtch;
if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) { if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) {
if ((playerStatus->actionState == ACTION_STATE_GROUND_POUND) if ((playerStatus->actionState == ACTION_STATE_SPIN_POUND)
|| (playerStatus->actionState == ACTION_STATE_ULTRA_POUND)) { || (playerStatus->actionState == ACTION_STATE_TORNADO_POUND)) {
exec_entity_commandlist(entity); exec_entity_commandlist(entity);
data->greenMotionTimer = 8; data->greenMotionTimer = 8;
} }
@ -75,8 +75,8 @@ void entity_HugeBlueSwitch_idle(Entity* entity) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) { if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) {
if ((playerStatus->actionState == ACTION_STATE_GROUND_POUND) if ((playerStatus->actionState == ACTION_STATE_SPIN_POUND)
|| (playerStatus->actionState == ACTION_STATE_ULTRA_POUND)) { || (playerStatus->actionState == ACTION_STATE_TORNADO_POUND)) {
exec_entity_commandlist(entity); exec_entity_commandlist(entity);
} }
} }

View File

@ -220,8 +220,8 @@ s32 entity_WoodenCrate_idle(Entity* entity) {
s32 shouldBreak = FALSE; s32 shouldBreak = FALSE;
if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) { if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) {
if ((playerStatus->actionState == ACTION_STATE_GROUND_POUND) if ((playerStatus->actionState == ACTION_STATE_SPIN_POUND)
|| (playerStatus->actionState == ACTION_STATE_ULTRA_POUND)) { || (playerStatus->actionState == ACTION_STATE_TORNADO_POUND)) {
set_action_state(ACTION_STATE_FALLING); set_action_state(ACTION_STATE_FALLING);
shouldBreak = TRUE; shouldBreak = TRUE;
} }

View File

@ -207,8 +207,8 @@ void Entity_BoardedFloor_idle(Entity* entity) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) { if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) {
if (playerStatus->actionState == ACTION_STATE_GROUND_POUND if (playerStatus->actionState == ACTION_STATE_SPIN_POUND
|| playerStatus->actionState == ACTION_STATE_ULTRA_POUND) { || playerStatus->actionState == ACTION_STATE_TORNADO_POUND) {
entity_start_script(entity); entity_start_script(entity);
exec_entity_commandlist(entity); exec_entity_commandlist(entity);
} }

View File

@ -60,7 +60,7 @@ void entity_Padlock_push_player(Entity* entity) {
if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) { if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) {
if (data->pushSpeed == 0.0f) { if (data->pushSpeed == 0.0f) {
suggest_player_anim_clearUnkFlag(0x10005); suggest_player_anim_clearUnkFlag(ANIM_Mario_Running);
} }
data->pushSpeed += 0.5; data->pushSpeed += 0.5;

View File

@ -148,7 +148,7 @@ void func_802BC2B4_E2EBE4(Entity* entity) {
gPlayerStatus.prevActionState = 0; gPlayerStatus.prevActionState = 0;
gPlayerStatus.actionState = 0; gPlayerStatus.actionState = 0;
gPlayerStatus.flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; gPlayerStatus.flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
suggest_player_anim_setUnkFlag(0x8001F); suggest_player_anim_setUnkFlag(ANIM_Mario_8001F);
} }
void func_802BC308_E2EC38(Entity* entity) { void func_802BC308_E2EC38(Entity* entity) {

View File

@ -79,7 +79,7 @@ void entity_StarBoxLauncher_check_launch(Entity* entity) {
result = get_entity_type(D_8010C978) == ENTITY_TYPE_STAR_BOX_LAUCHER; result = get_entity_type(D_8010C978) == ENTITY_TYPE_STAR_BOX_LAUCHER;
} }
} }
} else if ((entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) && (actionState == ACTION_STATE_GROUND_POUND || actionState == ACTION_STATE_ULTRA_POUND)) { } else if ((entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) && (actionState == ACTION_STATE_SPIN_POUND || actionState == ACTION_STATE_TORNADO_POUND)) {
result = 1; result = 1;
} else if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_HAMMER) { } else if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_HAMMER) {
result = -1; result = -1;

View File

@ -37,7 +37,7 @@ static s32 PollMusicEvents(Evt* script, s32 isInitialCall) {
} }
cur++; cur++;
} }
// bug? can cur ever be NULL here? // @bug? can cur ever be NULL here?
// condition should probably be if (cur->musicEventID != -1) // condition should probably be if (cur->musicEventID != -1)
if (cur != NULL) { if (cur != NULL) {
EvtScript* newSource = cur->scripts[scriptSelector]; EvtScript* newSource = cur->scripts[scriptSelector];

View File

@ -84,7 +84,7 @@ s32 _show_message(Evt* script, s32 isInitialCall, s32 arg2) {
npc = resolve_npc(script, temp_fp); npc = resolve_npc(script, temp_fp);
get_screen_coords(gCurrentCameraID, npc->pos.x, npc->pos.y + npc->collisionHeight, npc->pos.z, get_screen_coords(gCurrentCameraID, npc->pos.x, npc->pos.y + npc->collisionHeight, npc->pos.z,
&screenX, &screenY, &screenZ); &screenX, &screenY, &screenZ);
script->functionTemp[3] = npc->currentAnim.w; script->functionTemp[3] = npc->currentAnim;
script->varTable[15] = npc->yaw; script->varTable[15] = npc->yaw;
} }

View File

@ -18,11 +18,11 @@ void set_npc_animation(Npc* npc, u32 animID) {
PlayerData* playerData = &gPlayerData; PlayerData* playerData = &gPlayerData;
if (animID - PARTNER_ANIM_WALK < 9) { if (animID - PARTNER_ANIM_WALK < 9) {
npc->currentAnim.w = gPartnerAnimations[playerData->currentPartner].anims[animID - PARTNER_ANIM_WALK]; npc->currentAnim = gPartnerAnimations[playerData->currentPartner].anims[animID - PARTNER_ANIM_WALK];
} else if ((animID - 0x201) < 0x10) { } else if ((animID - 0x201) < 0x10) {
npc->currentAnim.w = get_enemy(npc->npcID)->animList[animID - 0x201]; npc->currentAnim = get_enemy(npc->npcID)->animList[animID - 0x201];
} else { } else {
npc->currentAnim.w = animID; npc->currentAnim = animID;
} }
} }
@ -207,7 +207,7 @@ ApiStatus GetNpcAnimation(Evt* script, s32 isInitialCall) {
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }
evt_set_variable(script, outVar, npc->currentAnim.w); evt_set_variable(script, outVar, npc->currentAnim);
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }
@ -840,7 +840,7 @@ s32 BringPartnerOut(Evt *script, s32 isInitialCall) {
} }
npc->jumpVelocity = ((playerY - targetY) + (npc->jumpScale * npc->duration * npc->duration * 0.5f)) / npc->duration; npc->jumpVelocity = ((playerY - targetY) + (npc->jumpScale * npc->duration * npc->duration * 0.5f)) / npc->duration;
npc->currentAnim.w = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_WALK]; npc->currentAnim = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_WALK];
return ApiStatus_BLOCK; return ApiStatus_BLOCK;
} }
@ -848,7 +848,7 @@ s32 BringPartnerOut(Evt *script, s32 isInitialCall) {
npc->jumpVelocity -= npc->jumpScale; npc->jumpVelocity -= npc->jumpScale;
npc->pos.y += npc->jumpVelocity; npc->pos.y += npc->jumpVelocity;
if (npc->jumpVelocity <= 0.0f) { if (npc->jumpVelocity <= 0.0f) {
npc->currentAnim.w = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_JUMP]; npc->currentAnim = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_JUMP];
} }
npc_move_heading(npc, npc->moveSpeed, npc->yaw); npc_move_heading(npc, npc->moveSpeed, npc->yaw);
duration = npc->duration; duration = npc->duration;
@ -861,7 +861,7 @@ s32 BringPartnerOut(Evt *script, s32 isInitialCall) {
npc->duration--; npc->duration--;
if (npc->duration < 0) { if (npc->duration < 0) {
npc->currentAnim.w = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_IDLE]; npc->currentAnim = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_IDLE];
npc->jumpVelocity = 0.0f; npc->jumpVelocity = 0.0f;
npc->pos.y = npc->moveToPos.y; npc->pos.y = npc->moveToPos.y;
npc->scale.x = 1.0f; npc->scale.x = 1.0f;
@ -910,7 +910,7 @@ ApiStatus PutPartnerAway(Evt* script, s32 isInitialCall) {
partnerY = targetY - partnerY; partnerY = targetY - partnerY;
partner->jumpVelocity = (partnerY + (partner->jumpScale * partner->duration * partner->duration * 0.5f)) / partner->duration; partner->jumpVelocity = (partnerY + (partner->jumpScale * partner->duration * partner->duration * 0.5f)) / partner->duration;
partner->currentAnim.w = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_WALK]; partner->currentAnim = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_WALK];
return ApiStatus_BLOCK; return ApiStatus_BLOCK;
} else { } else {
return ApiStatus_DONE2; return ApiStatus_DONE2;
@ -920,7 +920,7 @@ ApiStatus PutPartnerAway(Evt* script, s32 isInitialCall) {
partner->jumpVelocity -= partner->jumpScale; partner->jumpVelocity -= partner->jumpScale;
partner->pos.y += partner->jumpVelocity; partner->pos.y += partner->jumpVelocity;
if (partner->jumpVelocity <= 0.0f) { if (partner->jumpVelocity <= 0.0f) {
partner->currentAnim.w = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_JUMP]; partner->currentAnim = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_JUMP];
} }
npc_move_heading(partner, partner->moveSpeed, partner->yaw); npc_move_heading(partner, partner->moveSpeed, partner->yaw);
@ -935,7 +935,7 @@ ApiStatus PutPartnerAway(Evt* script, s32 isInitialCall) {
partner->duration--; partner->duration--;
if (partner->duration < 0) { if (partner->duration < 0) {
partner->currentAnim.w = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_FALL]; partner->currentAnim = gPartnerAnimations[wExtraPartnerID].anims[PARTNER_ANIM_INDEX_FALL];
partner->jumpVelocity = 0.0f; partner->jumpVelocity = 0.0f;
partner->pos.y = partner->moveToPos.y; partner->pos.y = partner->moveToPos.y;
free_npc_by_index(wExtraPartnerNpcID); free_npc_by_index(wExtraPartnerNpcID);

View File

@ -82,7 +82,7 @@ ApiStatus SetPlayerCollisionSize(Evt* script, s32 isInitialCall) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
Bytecode* args = script->ptrReadPos; Bytecode* args = script->ptrReadPos;
s32 height = evt_get_variable(script, *args++); s32 height = evt_get_variable(script, *args++);
s32 radius = evt_get_variable(script, *args); s32 radius = evt_get_variable(script, *args++);
playerNpc->collisionHeight = height; playerNpc->collisionHeight = height;
playerNpc->collisionRadius = radius; playerNpc->collisionRadius = radius;
@ -94,27 +94,26 @@ ApiStatus SetPlayerCollisionSize(Evt* script, s32 isInitialCall) {
} }
ApiStatus SetPlayerSpeed(Evt* script, s32 isInitialCall) { ApiStatus SetPlayerSpeed(Evt* script, s32 isInitialCall) {
playerNpc->moveSpeed = evt_get_float_variable(script, *script->ptrReadPos); Bytecode* args = script->ptrReadPos;
playerNpc->moveSpeed = evt_get_float_variable(script, *args++);
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }
ApiStatus SetPlayerJumpscale(Evt* script, s32 isInitialCall) { ApiStatus SetPlayerJumpscale(Evt* script, s32 isInitialCall) {
playerNpc->jumpScale = evt_get_float_variable(script, *script->ptrReadPos); Bytecode* args = script->ptrReadPos;
playerNpc->jumpScale = evt_get_float_variable(script, *args++);
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }
ApiStatus SetPlayerAnimation(Evt* script, s32 isInitialCall) { ApiStatus SetPlayerAnimation(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos; Bytecode* args = script->ptrReadPos;
s32 currentAnim = evt_get_variable(script, *args++); AnimID anim = evt_get_variable(script, *args++);
s32 shakeAnim = 0x80003;
playerNpc->currentAnim.w = currentAnim; gPlayerStatus.anim = playerNpc->currentAnim = anim;
do { } while (0); // Needed to match for some reason if (gPlayerStatus.anim == ANIM_Mario_80003) {
gPlayerStatus.anim = playerNpc->currentAnim.w;
if (gPlayerStatus.anim == shakeAnim) {
exec_ShakeCam1(0, 0, 2); exec_ShakeCam1(0, 0, 2);
} }
@ -122,12 +121,16 @@ ApiStatus SetPlayerAnimation(Evt* script, s32 isInitialCall) {
} }
ApiStatus SetPlayerActionState(Evt* script, s32 isInitialCall) { ApiStatus SetPlayerActionState(Evt* script, s32 isInitialCall) {
set_action_state(evt_get_variable(script, *script->ptrReadPos)); Bytecode* args = script->ptrReadPos;
set_action_state(evt_get_variable(script, *args++));
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }
ApiStatus SetPlayerAnimationSpeed(Evt* script, s32 isInitialCall) { ApiStatus SetPlayerAnimationSpeed(Evt* script, s32 isInitialCall) {
playerNpc->animationSpeed = evt_get_float_variable(script, *script->ptrReadPos); Bytecode* args = script->ptrReadPos;
playerNpc->animationSpeed = evt_get_float_variable(script, *args++);
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }
@ -216,7 +219,7 @@ s32 player_jump(Evt* script, s32 isInitialCall, s32 mode) {
f32 zTemp; f32 zTemp;
f32 jumpVelocity; f32 jumpVelocity;
s32 duration; s32 duration;
s32 animID; AnimID anim;
f32 dist; f32 dist;
if (isInitialCall) { if (isInitialCall) {
@ -252,20 +255,20 @@ s32 player_jump(Evt* script, s32 isInitialCall, s32 mode) {
} }
playerNpc->jumpVelocity = (playerNpc->jumpScale * (playerNpc->duration - 1) / 2) + (yTemp / playerNpc->duration); playerNpc->jumpVelocity = (playerNpc->jumpScale * (playerNpc->duration - 1) / 2) + (yTemp / playerNpc->duration);
playerStatus->flags |= 8; playerStatus->flags |= PLAYER_STATUS_FLAGS_FLYING;
playerStatus->animFlags |= 0x10000000; playerStatus->animFlags |= PLAYER_STATUS_ANIM_FLAGS_10000000;
if (mode == 0) { if (mode == 0) {
if (!(playerStatus->animFlags & 0x4000)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO)) {
if (!(playerStatus->animFlags & 1)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) {
animID = 0x10007; anim = ANIM_Mario_AnimMidairStill;
} else { } else {
animID = 0x60009; anim = ANIM_Mario_60009;
} }
} else { } else {
animID = 0x90005; anim = ANIM_Mario_90005;
} }
suggest_player_anim_clearUnkFlag(animID); suggest_player_anim_clearUnkFlag(anim);
sfx_play_sound_at_player(SOUND_JUMP_2081, 0); sfx_play_sound_at_player(SOUND_JUMP_2081, 0);
} }
script->functionTemp[0] = 1; script->functionTemp[0] = 1;
@ -277,16 +280,16 @@ s32 player_jump(Evt* script, s32 isInitialCall, s32 mode) {
playerNpc->jumpVelocity -= playerNpc->jumpScale; playerNpc->jumpVelocity -= playerNpc->jumpScale;
if (mode == 0 && jumpVelocity > 0.0f && playerNpc->jumpVelocity <= 0.0f) { if (mode == 0 && jumpVelocity > 0.0f && playerNpc->jumpVelocity <= 0.0f) {
if (!(playerStatus->animFlags & 0x4000)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO)) {
if (!(playerStatus->animFlags & 1)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) {
animID = 0x10008; anim = ANIM_Mario_AnimMidair;
} else { } else {
animID = 0x6000A; anim = ANIM_Mario_6000A;
} }
} else { } else {
animID = 0x90005; anim = ANIM_Mario_90005;
} }
suggest_player_anim_clearUnkFlag(animID); suggest_player_anim_clearUnkFlag(anim);
} }
playerStatus->position.x = playerNpc->pos.x; playerStatus->position.x = playerNpc->pos.x;
@ -299,20 +302,20 @@ s32 player_jump(Evt* script, s32 isInitialCall, s32 mode) {
playerNpc->duration--; playerNpc->duration--;
if (playerNpc->duration == 0) { if (playerNpc->duration == 0) {
playerStatus->flags &= -9; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_FLYING;
playerStatus->animFlags &= ~0x10000000; playerStatus->animFlags &= ~PLAYER_STATUS_ANIM_FLAGS_10000000;
if (mode == 0) { if (mode == 0) {
if (!(playerStatus->animFlags & 0x4000)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO)) {
if (!(playerStatus->animFlags & 1)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) {
animID = 0x10009; anim = ANIM_Mario_10009;
} else { } else {
animID = 0x6000B; anim = ANIM_Mario_6000B;
} }
} else { } else {
animID = 0x10003; anim = ANIM_Mario_AnimPanting;
} }
suggest_player_anim_clearUnkFlag(animID); suggest_player_anim_clearUnkFlag(anim);
func_8003D660(playerNpc, 2); func_8003D660(playerNpc, 2);
} }
@ -581,8 +584,8 @@ ApiStatus UseExitHeading(Evt* script, s32 isInitialCall) {
s32 func_802D23F8(void) { s32 func_802D23F8(void) {
if (gPlayerStatus.actionState == ACTION_STATE_IDLE || gPlayerStatus.actionState == ACTION_STATE_WALK || if (gPlayerStatus.actionState == ACTION_STATE_IDLE || gPlayerStatus.actionState == ACTION_STATE_WALK ||
gPlayerStatus.actionState == ACTION_STATE_RUN || gPlayerStatus.actionState == ACTION_STATE_LAND || gPlayerStatus.actionState == ACTION_STATE_RUN || gPlayerStatus.actionState == ACTION_STATE_LAND ||
gPlayerStatus.actionState == ACTION_STATE_STEP_DOWN_LAND || gPlayerStatus.actionState == ACTION_STATE_GROUND_POUND || gPlayerStatus.actionState == ACTION_STATE_STEP_DOWN_LAND || gPlayerStatus.actionState == ACTION_STATE_SPIN_POUND ||
gPlayerStatus.actionState == ACTION_STATE_ULTRA_POUND || gPlayerStatus.actionState == ACTION_STATE_SPIN) { gPlayerStatus.actionState == ACTION_STATE_TORNADO_POUND || gPlayerStatus.actionState == ACTION_STATE_SPIN) {
return TRUE; return TRUE;
} }
return FALSE; return FALSE;

View File

@ -66,7 +66,7 @@ void npc_iter_no_op(void) {
} }
} }
s32 _create_npc(NpcBlueprint* blueprint, u32** animList, s32 skipLoadingAnims) { s32 _create_npc(NpcBlueprint* blueprint, AnimID** animList, s32 skipLoadingAnims) {
Npc* npc; Npc* npc;
s32 i; s32 i;
s32 j; s32 j;
@ -115,7 +115,7 @@ s32 _create_npc(NpcBlueprint* blueprint, u32** animList, s32 skipLoadingAnims) {
npc->scale.x = 1.0f; npc->scale.x = 1.0f;
npc->scale.y = 1.0f; npc->scale.y = 1.0f;
npc->scale.z = 1.0f; npc->scale.z = 1.0f;
npc->currentAnim.w = blueprint->initialAnim; npc->currentAnim = blueprint->initialAnim;
npc->animationSpeed = 1.0f; npc->animationSpeed = 1.0f;
npc->renderYaw = 0.0f; npc->renderYaw = 0.0f;
npc->unk_98 = 0; npc->unk_98 = 0;
@ -150,9 +150,9 @@ s32 _create_npc(NpcBlueprint* blueprint, u32** animList, s32 skipLoadingAnims) {
npc->extraAnimList = animList; npc->extraAnimList = animList;
if (!(npc->flags & NPC_FLAG_1000000)) { if (!(npc->flags & NPC_FLAG_1000000)) {
if (!(npc->flags & NPC_FLAG_PARTICLE)) { if (!(npc->flags & NPC_FLAG_PARTICLE)) {
npc->spriteInstanceID = spr_load_npc_sprite(npc->currentAnim.w, animList); npc->spriteInstanceID = spr_load_npc_sprite(npc->currentAnim, animList);
} else { } else {
npc->spriteInstanceID = spr_load_npc_sprite(npc->currentAnim.w | 0x80000000, animList); npc->spriteInstanceID = spr_load_npc_sprite(npc->currentAnim | SPRITE_ID_TAIL_ALLOCATE, animList);
} }
} else { } else {
npc->flags |= NPC_FLAG_2; npc->flags |= NPC_FLAG_2;
@ -172,7 +172,7 @@ s32 _create_npc_basic(NpcBlueprint* blueprint) {
return _create_npc(blueprint, NULL, FALSE); return _create_npc(blueprint, NULL, FALSE);
} }
s32 _create_npc_standard(NpcBlueprint* blueprint, u32** animList) { s32 _create_npc_standard(NpcBlueprint* blueprint, AnimID** animList) {
return _create_npc(blueprint, animList, FALSE); return _create_npc(blueprint, animList, FALSE);
} }
@ -552,14 +552,14 @@ void update_npcs(void) {
if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) { if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) {
if (!(npc->flags & NPC_FLAG_1000000)) { if (!(npc->flags & NPC_FLAG_1000000)) {
if (npc->currentAnim.w != 0) { if (npc->currentAnim != 0) {
if (npc->spriteInstanceID >= 0) { if (npc->spriteInstanceID >= 0) {
spr_update_sprite(npc->spriteInstanceID, npc->currentAnim.w, npc->animationSpeed); spr_update_sprite(npc->spriteInstanceID, npc->currentAnim, npc->animationSpeed);
} }
} }
} }
} else { } else {
spr_update_player_sprite(1, npc->currentAnim.w, npc->animationSpeed); spr_update_player_sprite(1, npc->currentAnim, npc->animationSpeed);
} }
if (npc->flags & NPC_FLAG_HAS_SHADOW) { if (npc->flags & NPC_FLAG_HAS_SHADOW) {
@ -617,9 +617,9 @@ void update_npcs(void) {
if (npc->spriteInstanceID < 0) { if (npc->spriteInstanceID < 0) {
npc->spriteInstanceID++; npc->spriteInstanceID++;
if (npc->spriteInstanceID == -1) { if (npc->spriteInstanceID == -1) {
npc->spriteInstanceID = spr_load_npc_sprite(npc->currentAnim.w, npc->extraAnimList); npc->spriteInstanceID = spr_load_npc_sprite(npc->currentAnim, npc->extraAnimList);
ASSERT(npc->spriteInstanceID >= 0); ASSERT(npc->spriteInstanceID >= 0);
spr_update_sprite(npc->spriteInstanceID, npc->currentAnim.w, npc->animationSpeed); spr_update_sprite(npc->spriteInstanceID, npc->currentAnim, npc->animationSpeed);
} }
} }
} }
@ -734,15 +734,15 @@ void appendGfx_npc(Npc* npc) {
guMtxCatF(mtx2, mtx1, mtx1); guMtxCatF(mtx2, mtx1, mtx1);
} }
if ((npc->scale.x * SPRITE_PIXEL_SCALE != 1.0f) || ((npc->scale.y * npc->verticalStretch) * SPRITE_PIXEL_SCALE != 1.0f) if ((npc->scale.x * SPRITE_WORLD_SCALE_D != 1.0f) || ((npc->scale.y * npc->verticalStretch) * SPRITE_WORLD_SCALE_D != 1.0f)
|| (npc->scale.z * SPRITE_PIXEL_SCALE != 1.0f)) { || (npc->scale.z * SPRITE_WORLD_SCALE_D != 1.0f)) {
guScaleF(mtx2, npc->scale.x * SPRITE_PIXEL_SCALE, (npc->scale.y * npc->verticalStretch) * SPRITE_PIXEL_SCALE, guScaleF(mtx2, npc->scale.x * SPRITE_WORLD_SCALE_D, (npc->scale.y * npc->verticalStretch) * SPRITE_WORLD_SCALE_D,
npc->scale.z * SPRITE_PIXEL_SCALE); npc->scale.z * SPRITE_WORLD_SCALE_D);
guMtxCatF(mtx2, mtx1, mtx1); guMtxCatF(mtx2, mtx1, mtx1);
} }
if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) { if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) {
if (!(npc->flags & NPC_FLAG_1000000) && (npc->currentAnim.w != 0) && (npc->spriteInstanceID >= 0)) { if (!(npc->flags & NPC_FLAG_1000000) && (npc->currentAnim != 0) && (npc->spriteInstanceID >= 0)) {
npc_draw_with_palswap(npc, renderYaw, mtx1); npc_draw_with_palswap(npc, renderYaw, mtx1);
npc->unk_2C = func_802DE5C8(npc->spriteInstanceID); npc->unk_2C = func_802DE5C8(npc->spriteInstanceID);
} }
@ -763,20 +763,20 @@ void appendGfx_npc(Npc* npc) {
} }
if ((npc->scale.x * SPRITE_PIXEL_SCALE != 1.0f) || ((npc->scale.y * npc->verticalStretch) * SPRITE_PIXEL_SCALE != 1.0f) if ((npc->scale.x * SPRITE_WORLD_SCALE_D != 1.0f) || ((npc->scale.y * npc->verticalStretch) * SPRITE_WORLD_SCALE_D != 1.0f)
|| (npc->scale.z * SPRITE_PIXEL_SCALE != 1.0f)) || (npc->scale.z * SPRITE_WORLD_SCALE_D != 1.0f))
{ {
do { do {
guScaleF(mtx2, npc->scale.x * SPRITE_PIXEL_SCALE, guScaleF(mtx2, npc->scale.x * SPRITE_WORLD_SCALE_D,
(npc->scale.y * npc->verticalStretch) * SPRITE_PIXEL_SCALE, (npc->scale.y * npc->verticalStretch) * SPRITE_WORLD_SCALE_D,
npc->scale.z * SPRITE_PIXEL_SCALE); npc->scale.z * SPRITE_WORLD_SCALE_D);
} while (0); // required to match (macro?) } while (0); // required to match (macro?)
guMtxCatF(mtx2, mtx1, mtx1); guMtxCatF(mtx2, mtx1, mtx1);
} }
if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) { if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) {
if (!(npc->flags & NPC_FLAG_1000000) && (npc->currentAnim.w != 0)) { if (!(npc->flags & NPC_FLAG_1000000) && (npc->currentAnim != 0)) {
spr_draw_npc_sprite(npc->spriteInstanceID, renderYaw, 0, 0, mtx1); spr_draw_npc_sprite(npc->spriteInstanceID, renderYaw, 0, 0, mtx1);
} }
} else { } else {
@ -794,19 +794,19 @@ void appendGfx_npc(Npc* npc) {
guMtxCatF(mtx2, mtx1, mtx1); guMtxCatF(mtx2, mtx1, mtx1);
} }
if ((npc->scale.x * SPRITE_PIXEL_SCALE != 1.0f) || ((npc->scale.y * npc->verticalStretch) * SPRITE_PIXEL_SCALE != 1.0f) if ((npc->scale.x * SPRITE_WORLD_SCALE_D != 1.0f) || ((npc->scale.y * npc->verticalStretch) * SPRITE_WORLD_SCALE_D != 1.0f)
|| (npc->scale.z * SPRITE_PIXEL_SCALE != 1.0f)) || (npc->scale.z * SPRITE_WORLD_SCALE_D != 1.0f))
{ {
do { do {
guScaleF(mtx2, npc->scale.x * SPRITE_PIXEL_SCALE, guScaleF(mtx2, npc->scale.x * SPRITE_WORLD_SCALE_D,
(npc->scale.y * npc->verticalStretch) * SPRITE_PIXEL_SCALE, (npc->scale.y * npc->verticalStretch) * SPRITE_WORLD_SCALE_D,
npc->scale.z * SPRITE_PIXEL_SCALE); npc->scale.z * SPRITE_WORLD_SCALE_D);
} while (0); // required to match (macro?) } while (0); // required to match (macro?)
guMtxCatF(mtx2, mtx1, mtx1); guMtxCatF(mtx2, mtx1, mtx1);
} }
if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) { if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) {
if (!(npc->flags & NPC_FLAG_1000000) && (npc->currentAnim.w != 0)) { if (!(npc->flags & NPC_FLAG_1000000) && (npc->currentAnim != 0)) {
spr_draw_npc_sprite(npc->spriteInstanceID, renderYaw, 0, 0, mtx1); spr_draw_npc_sprite(npc->spriteInstanceID, renderYaw, 0, 0, mtx1);
} }
} else { } else {
@ -945,7 +945,7 @@ void set_npc_sprite(Npc* npc, s32 anim, u32** extraAnimList) {
ASSERT(npc->spriteInstanceID >= 0); ASSERT(npc->spriteInstanceID >= 0);
} }
npc->currentAnim.w = anim; npc->currentAnim = anim;
if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) { if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) {
if (!(npc->flags & NPC_FLAG_1000000)) { if (!(npc->flags & NPC_FLAG_1000000)) {
@ -1023,19 +1023,19 @@ void npc_reload_all(void) {
if (npc->flags && !(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) { if (npc->flags && !(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) {
if (!(npc->flags & NPC_FLAG_1000000)) { if (!(npc->flags & NPC_FLAG_1000000)) {
if (!(npc->flags & NPC_FLAG_PARTICLE)) { if (!(npc->flags & NPC_FLAG_PARTICLE)) {
npc->spriteInstanceID = spr_load_npc_sprite(npc->currentAnim.w, npc->extraAnimList); npc->spriteInstanceID = spr_load_npc_sprite(npc->currentAnim, npc->extraAnimList);
} else { } else {
npc->spriteInstanceID = spr_load_npc_sprite(npc->currentAnim.w | 0x80000000, npc->extraAnimList); npc->spriteInstanceID = spr_load_npc_sprite(npc->currentAnim | SPRITE_ID_TAIL_ALLOCATE, npc->extraAnimList);
} }
} }
if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) { if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) {
if (!(npc->flags & NPC_FLAG_1000000) && (npc->palSwapType != 0)) { if (!(npc->flags & NPC_FLAG_1000000) && (npc->palSwapType != 0)) {
npc->spritePaletteList = spr_get_npc_palettes(npc->currentAnim.h); npc->spritePaletteList = spr_get_npc_palettes(npc->currentAnim >> 16);
npc->paletteCount = 0; npc->paletteCount = 0;
while (npc->spritePaletteList[npc->paletteCount] != -1) { while (npc->spritePaletteList[npc->paletteCount] != -1) {
npc->paletteCount++; npc->paletteCount++;
} }
npc->unk_C0 = spr_get_npc_color_variations(npc->currentAnim.h); npc->unk_C0 = spr_get_npc_color_variations(npc->currentAnim >> 16);
} }
if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) { if (!(npc->flags & NPC_FLAG_NO_ANIMS_LOADED)) {
if (!(npc->flags & NPC_FLAG_1000000)) { if (!(npc->flags & NPC_FLAG_1000000)) {
@ -1606,29 +1606,30 @@ void func_8003D660(Npc* npc, s32 arg1) {
if ((npc->flags & (NPC_FLAG_400000 | NPC_FLAG_2)) == NPC_FLAG_400000) { if ((npc->flags & (NPC_FLAG_400000 | NPC_FLAG_2)) == NPC_FLAG_400000) {
if (npc->moveSpeed != 0.0f) { if (npc->moveSpeed != 0.0f) {
switch (get_collider_type_by_id((u16)npc->currentFloor) & 0xFF) { s32 surfaceType = get_collider_flags((u16)npc->currentFloor) & COLLIDER_FLAGS_SURFACE_TYPE_MASK;
case 6: switch (surfaceType) {
case SURFACE_TYPE_FLOWERS:
func_8003DA38(npc, arg1); func_8003DA38(npc, arg1);
return; return;
case 7: case SURFACE_TYPE_CLOUD:
func_8003DC38(npc, arg1); func_8003DC38(npc, arg1);
return; return;
case 8: case SURFACE_TYPE_SNOW:
if ((temp->partnerActionState == PARTNER_ACTION_NONE) || (temp->actingPartner != PARTNER_LAKILESTER)) { if ((temp->partnerActionState == PARTNER_ACTION_NONE) || (temp->actingPartner != PARTNER_LAKILESTER)) {
func_8003DFA0(npc, arg1); func_8003DFA0(npc, arg1);
return; return;
} }
break; break;
case 9: case SURFACE_TYPE_HEDGES:
func_8003E0D4(npc, arg1); func_8003E0D4(npc, arg1);
return; return;
case 1: case SURFACE_TYPE_WATER:
func_8003E1D0(npc, arg1); func_8003E1D0(npc, arg1);
return; return;
case 2: case SURFACE_TYPE_SPIKES:
case 3: case SURFACE_TYPE_LAVA:
case 4: case SURFACE_TYPE_DOCK_WALL:
case 5: case SURFACE_TYPE_SLIDE:
default: default:
func_8003D788(npc, arg1); func_8003D788(npc, arg1);
return; return;

View File

@ -5,6 +5,14 @@
#define SPR_PLAYER_COLOR_VARIATIONS 6 #define SPR_PLAYER_COLOR_VARIATIONS 6
enum SpriteIDFields {
SPRITE_ID_ANIM_MASK = 0x000000FF,
SPRITE_ID_PAL_MASK = 0x0000FF00,
SPRITE_ID_SPR_MASK = 0x00FF0000,
SPRITE_ID_BACK_FACING = 0x01000000,
SPRITE_ID_TAIL_ALLOCATE = 0x80000000,
};
typedef struct SpriteComponent { typedef struct SpriteComponent {
/* 0x00 */ s32 initialized; /* 0x00 */ s32 initialized;
/* 0x04 */ s32 unk_04; /* 0x04 */ s32 unk_04;
@ -111,7 +119,7 @@ void spr_render_init(void);
void spr_update_player_raster_cache(void); void spr_update_player_raster_cache(void);
s32 spr_update_player_sprite(s32 arg0, s32 arg1, f32 arg2); s32 spr_update_player_sprite(s32 arg0, s32 arg1, f32 timescale);
s32 spr_draw_player_sprite(s32 spriteInstanceID, s32 yaw, s32 arg2, PAL_PTR* paletteList, Matrix4f mtx); s32 spr_draw_player_sprite(s32 spriteInstanceID, s32 yaw, s32 arg2, PAL_PTR* paletteList, Matrix4f mtx);

View File

@ -1,5 +1,12 @@
#include "common.h" #include "common.h"
#include "effects.h" #include "effects.h"
#include "sprite.h"
enum {
SUBSTATE_HAMMER_0 = 0,
SUBSTATE_HAMMER_1 = 1,
SUBSTATE_HAMMER_2 = 2
};
typedef struct HammerHitData { typedef struct HammerHitData {
/* 0x00 */ Vec3f hitPos; /* 0x00 */ Vec3f hitPos;
@ -15,18 +22,18 @@ extern HammerHitData* HammerHit;
void func_802B6820_E256F0(void); void func_802B6820_E256F0(void);
s32 action_hammer_is_swinging_away(s32 animID) { s32 action_hammer_is_swinging_away(s32 animID) {
if (animID & 0x1000000) { if (animID & SPRITE_ID_BACK_FACING) {
return TRUE; return TRUE;
} }
// away-facing swing anims // back facing swing anims
switch (animID) { switch (animID) {
case 0x60011: case ANIM_Mario_60011:
case 0x60013: case ANIM_Mario_60013:
case 0x60015: case ANIM_Mario_60015:
case 0x60017: case ANIM_Mario_60017:
case 0x60019: case ANIM_Mario_60019:
case 0x6001B: case ANIM_Mario_6001B:
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
@ -101,7 +108,7 @@ void action_hammer_play_hit_fx(s32 hitID) {
} }
sfx_play_sound_at_player(soundID, 0); sfx_play_sound_at_player(soundID, 0);
start_rumble(0x100, 50); start_rumble(256, 50);
} }
s32 func_802B62A4_E25174(void) { s32 func_802B62A4_E25174(void) {
@ -115,6 +122,7 @@ s32 func_802B62A4_E25174(void) {
s32 ret; s32 ret;
s32 i; s32 i;
// first attempt
yaw = func_800E5348(); yaw = func_800E5348();
if (action_hammer_is_swinging_away(playerStatus->trueAnimation)) { if (action_hammer_is_swinging_away(playerStatus->trueAnimation)) {
angle = clamp_angle(yaw + 90.0f - gCameras[gCurrentCameraID].currentYaw); angle = clamp_angle(yaw + 90.0f - gCameras[gCurrentCameraID].currentYaw);
@ -143,7 +151,8 @@ s32 func_802B62A4_E25174(void) {
} }
} }
if (i >= 0x10) { // second attempt
if (i >= 16) {
yaw = func_800E5348(); yaw = func_800E5348();
if (!action_hammer_is_swinging_away(playerStatus->trueAnimation)) { if (!action_hammer_is_swinging_away(playerStatus->trueAnimation)) {
angle = clamp_angle(yaw + 90.0f - gCameras[gCurrentCameraID].currentYaw); angle = clamp_angle(yaw + 90.0f - gCameras[gCurrentCameraID].currentYaw);
@ -213,47 +222,47 @@ s32 func_802B62A4_E25174(void) {
return ret; return ret;
} }
void action_hammer_update(void) { void action_update_hammer(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
HammerHit->unk_1C = 0; HammerHit->unk_1C = 0;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
s32 animID; AnimID anim;
s32 soundID; s32 soundID;
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->flags |= PLAYER_STATUS_FLAGS_200000; playerStatus->flags |= PLAYER_STATUS_FLAGS_200000;
HammerHit->timer = 0; HammerHit->timer = 0;
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_HAMMER_0;
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
playerStatus->unk_BC = 0; playerStatus->unk_BC = 0;
HammerHit->hitID = func_802B62A4_E25174(); HammerHit->hitID = func_802B62A4_E25174();
if (gPlayerData.hammerLevel == 2) { if (gPlayerData.hammerLevel == 2) {
soundID = SOUND_2117; soundID = SOUND_2117;
animID = 0x6001A; anim = ANIM_Mario_6001A;
if (HammerHit->hitID < 0) { if (HammerHit->hitID < 0) {
soundID = SOUND_2117; soundID = SOUND_2117;
animID = 0x60018; anim = ANIM_Mario_60018;
} }
} else if (gPlayerData.hammerLevel == 1) { } else if (gPlayerData.hammerLevel == 1) {
soundID = SOUND_2116; soundID = SOUND_2116;
animID = 0x60016; anim = ANIM_Mario_60016;
if (HammerHit->hitID < 0) { if (HammerHit->hitID < 0) {
soundID = SOUND_2116; soundID = SOUND_2116;
animID = 0x60014; anim = ANIM_Mario_60014;
} }
} else { } else {
soundID = SOUND_2115; soundID = SOUND_2115;
animID = 0x60012; anim = ANIM_Mario_60012;
if (HammerHit->hitID < 0) { if (HammerHit->hitID < 0) {
soundID = SOUND_2115; soundID = SOUND_2115;
animID = 0x60010; anim = ANIM_Mario_60010;
} }
} }
suggest_player_anim_clearUnkFlag(animID); suggest_player_anim_clearUnkFlag(anim);
sfx_play_sound_at_player(soundID, 0); sfx_play_sound_at_player(soundID, 0);
HammerHit->unk_0C = 0; HammerHit->unk_0C = 0;
HammerHit->unk_14 = 0; HammerHit->unk_14 = 0;
@ -305,6 +314,7 @@ void func_802B6820_E256F0(void) {
playerY = playerStatus->position.y; playerY = playerStatus->position.y;
playerZ = playerStatus->position.z; playerZ = playerStatus->position.z;
// check collision allong 16 points in a line away from the player
for (i = 1; i < 16; i++) { for (i = 1; i < 16; i++) {
x = playerX + (outSinTheta * i); x = playerX + (outSinTheta * i);
y = playerY; y = playerY;
@ -382,13 +392,13 @@ void func_802B6820_E256F0(void) {
} }
} }
if (playerStatus->fallState == 0 && result >= 0 && HammerHit->unk_14 == 0) { if (playerStatus->actionSubstate == SUBSTATE_HAMMER_0 && result >= 0 && HammerHit->unk_14 == 0) {
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
if (playerStatus->fallState == 1 && result < 0) { if (playerStatus->actionSubstate == SUBSTATE_HAMMER_1 && result < 0) {
playerStatus->fallState = 2; playerStatus->actionSubstate = SUBSTATE_HAMMER_2;
} }
HammerHit->timer += 1; HammerHit->timer++;
if (result >= 0) { if (result >= 0) {
HammerHit->unk_14 = 1; HammerHit->unk_14 = 1;
} }

View File

@ -1,58 +1,65 @@
#include "common.h" #include "common.h"
extern f32 D_802B62B0; enum {
SUBSTATE_FLYING = 0,
SUBSTATE_FALLING = 1
};
void func_802B6000_E27C90(void) { void action_update_hit_fire(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 sinTheta; f32 dx, dy;
f32 cosTheta;
f32 speed; f32 speed;
static f32 ReturnAngle;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->animFlags |= PLAYER_STATUS_ANIM_FLAGS_4; playerStatus->animFlags |= PLAYER_STATUS_ANIM_FLAGS_4;
playerStatus->flags |= (PLAYER_STATUS_FLAGS_800 | PLAYER_STATUS_FLAGS_FLYING); playerStatus->flags |= (PLAYER_STATUS_FLAGS_800 | PLAYER_STATUS_FLAGS_FLYING);
suggest_player_anim_setUnkFlag(0x10019);
playerStatus->fallState = 0; suggest_player_anim_setUnkFlag(ANIM_Mario_Scared);
playerStatus->actionSubstate = SUBSTATE_FLYING;
playerStatus->gravityIntegrator[0] = 18.3473f; playerStatus->gravityIntegrator[0] = 18.3473f;
playerStatus->gravityIntegrator[1] = -3.738f; playerStatus->gravityIntegrator[1] = -3.738f;
playerStatus->gravityIntegrator[2] = 0.8059f; playerStatus->gravityIntegrator[2] = 0.8059f;
playerStatus->gravityIntegrator[3] = -0.0987f; playerStatus->gravityIntegrator[3] = -0.0987f;
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1; gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1;
D_802B62B0 = atan2(playerStatus->position.x, playerStatus->position.z, playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z); ReturnAngle = atan2(playerStatus->position.x, playerStatus->position.z, playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z);
playerStatus->currentSpeed = get_xz_dist_to_player(playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z) / 18.0f; playerStatus->currentSpeed = get_xz_dist_to_player(playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z) / 18.0f;
subtract_hp(1); subtract_hp(1);
open_status_menu_long(); open_status_menu_long();
gOverrideFlags |= GLOBAL_OVERRIDES_40; gOverrideFlags |= GLOBAL_OVERRIDES_40;
} }
sin_cos_rad(D_802B62B0 * TAU / 360.0f, &sinTheta, &cosTheta); sin_cos_rad(ReturnAngle * TAU / 360.0f, &dx, &dy);
speed = playerStatus->currentSpeed; speed = playerStatus->currentSpeed;
if (playerStatus->flags & 0x40000) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_40000) {
speed *= 0.5; speed *= 0.5;
} }
playerStatus->position.x += speed * sinTheta; playerStatus->position.x += speed * dx;
playerStatus->position.z -= speed * cosTheta; playerStatus->position.z -= speed * dy;
if (playerStatus->fallState == 0) { if (playerStatus->actionSubstate == SUBSTATE_FLYING) {
integrate_gravity(); integrate_gravity();
playerStatus->position.y += playerStatus->gravityIntegrator[0]; playerStatus->position.y += playerStatus->gravityIntegrator[0];
if (playerStatus->gravityIntegrator[0] < 0.0f) { if (playerStatus->gravityIntegrator[0] < 0.0f) {
playerStatus->fallState = 1; playerStatus->actionSubstate = SUBSTATE_FALLING;
playerStatus->flags |= 4; playerStatus->flags |= PLAYER_STATUS_FLAGS_FALLING;
} }
} else { } else {
s32 collider; s32 colliderID;
playerStatus->position.y = player_check_collision_below(func_800E34D8(), &collider); playerStatus->position.y = player_check_collision_below(func_800E34D8(), &colliderID);
if (collider >= 0) { if (colliderID >= 0) {
collider = get_collider_type_by_id(collider); colliderID = get_collider_flags(colliderID); //TODO surfaceType
set_action_state(ACTION_STATE_LAND); set_action_state(ACTION_STATE_LAND);
playerStatus->blinkTimer = 60; playerStatus->blinkTimer = 60;
playerStatus->unk_BF = 0; playerStatus->hazardType = HAZARD_TYPE_NONE;
playerStatus->flags &= ~0x800; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_800;
gOverrideFlags &= ~GLOBAL_OVERRIDES_40; gOverrideFlags &= ~GLOBAL_OVERRIDES_40;
} }
} }

View File

@ -1,196 +1,206 @@
#include "common.h" #include "common.h"
#include "effects.h" #include "effects.h"
extern f32 D_802B68B0; enum {
extern f32 D_802B68B4; SUBSTATE_INIT = 0,
extern f32 D_802B68B8; SUBSTATE_DELAY_LAUNCH = 1,
extern f32 D_802B68BC; SUBSTATE_LAUNCH = 2,
SUBSTATE_END_LAUNCH = 3,
SUBSTATE_RETURN_INIT = 4,
SUBSTATE_RETURN_MOTION = 5,
SUBSTATE_HOVER = 6,
SUBSTATE_BOUNCE = 7,
SUBSTATE_DELAY_DONE = 8,
SUBSTATE_DELAY_INIT_SINK = 20,
SUBSTATE_DELAY_INIT = 21
};
void func_802B6000_E27F40(void) { void action_update_hit_lava(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 sp18; f32 resetPosX, resetPosY, resetPosZ;
f32 sp1C; f32 returnRadians;
f32 sp20; f32 dx, dy;
f32 sp24; f32 componentSpeed;
f32 sp28; s32 completeAxes; // number of axes along which the 'return motion' is complete
s32 sp2C;
f32 tempGravityIntegrator;
f32 theta;
f32 tempCurrentSpeed;
if (playerStatus->flags & (1 << 31)) { static s32 pad[2]; // curious
playerStatus->flags &= ~0x80000000; static f32 LaunchVelocity;
playerStatus->flags |= 0x800008; static f32 LaunchInterpPhase; // used to interp launch velocity
playerStatus->animFlags |= 4; static f32 ReturnAngle;
playerStatus->flags |= 0x800; static f32 InitialPosY;
if (playerStatus->unk_BF == 1) {
playerStatus->fallState = 0x14; if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->flags |= (PLAYER_STATUS_FLAGS_800000 | PLAYER_STATUS_FLAGS_FLYING);
playerStatus->animFlags |= PLAYER_STATUS_ANIM_FLAGS_4;
playerStatus->flags |= PLAYER_STATUS_FLAGS_800;
if (playerStatus->hazardType == HAZARD_TYPE_LAVA) {
playerStatus->actionSubstate = SUBSTATE_DELAY_INIT_SINK;
playerStatus->currentStateTime = 2; playerStatus->currentStateTime = 2;
} else { } else {
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_INIT;
} }
D_802B68BC = playerStatus->position.y; InitialPosY = playerStatus->position.y;
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
D_802B68B0 = 0.0f; LaunchVelocity = 0.0f;
gCameras[CAM_DEFAULT].moveFlags |= (CAMERA_MOVE_FLAGS_1 | CAMERA_MOVE_FLAGS_2); gCameras[CAM_DEFAULT].moveFlags |= (CAMERA_MOVE_FLAGS_1 | CAMERA_MOVE_FLAGS_2);
D_802B68B4 = 90.0f; LaunchInterpPhase = 90.0f;
subtract_hp(1); subtract_hp(1);
open_status_menu_long(); open_status_menu_long();
gOverrideFlags |= GLOBAL_OVERRIDES_40; gOverrideFlags |= GLOBAL_OVERRIDES_40;
sfx_play_sound_at_player(SOUND_E8, 0); sfx_play_sound_at_player(SOUND_E8, 0);
} }
switch (playerStatus->fallState) { switch (playerStatus->actionSubstate) {
case 21: case SUBSTATE_DELAY_INIT:
if (--playerStatus->currentStateTime == -1) { if (--playerStatus->currentStateTime == -1) {
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_INIT;
} }
break; break;
case 20: case SUBSTATE_DELAY_INIT_SINK:
if (--playerStatus->currentStateTime == -1) { if (--playerStatus->currentStateTime == -1) {
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_INIT;
} }
playerStatus->position.y -= 4.0f; playerStatus->position.y -= 4.0f;
break; break;
case 0: case SUBSTATE_INIT:
if (playerStatus->unk_BF == 1) { if (playerStatus->hazardType == HAZARD_TYPE_LAVA) {
fx_smoke_burst(0, playerStatus->position.x, playerStatus->position.y, playerStatus->position.z, 1.0f, 40); fx_smoke_burst(0, playerStatus->position.x, playerStatus->position.y, playerStatus->position.z, 1.0f, 40);
} }
suggest_player_anim_setUnkFlag(0x80000 | 2); suggest_player_anim_setUnkFlag(ANIM_Mario_80002);
playerStatus->gravityIntegrator[1] = 0.0f; playerStatus->gravityIntegrator[1] = 0.0f;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
playerStatus->fallState = 2; playerStatus->actionSubstate = SUBSTATE_LAUNCH;
playerStatus->currentStateTime = 1; playerStatus->currentStateTime = 1;
playerStatus->gravityIntegrator[0] = 20.0f; playerStatus->gravityIntegrator[0] = 20.0f;
playerStatus->gravityIntegrator[2] = 250.0f; playerStatus->gravityIntegrator[2] = 250.0f;
playerStatus->gravityIntegrator[3] = D_802B68BC; playerStatus->gravityIntegrator[3] = InitialPosY;
playerStatus->jumpFromPos.x = playerStatus->position.x; playerStatus->jumpFromPos.x = playerStatus->position.x;
playerStatus->jumpFromPos.z = playerStatus->position.z; playerStatus->jumpFromPos.z = playerStatus->position.z;
playerStatus->jumpFromHeight = playerStatus->position.y; playerStatus->jumpFromHeight = playerStatus->position.y;
playerStatus->flags |= 0x2; playerStatus->flags |= PLAYER_STATUS_FLAGS_JUMPING;
break; break;
case 1: case SUBSTATE_DELAY_LAUNCH:
if (--playerStatus->currentStateTime << 16 <= 0) { if (--playerStatus->currentStateTime <= 0) {
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
break; break;
case 2: case SUBSTATE_LAUNCH:
if (playerStatus->unk_BF == 1 && (playerStatus->timeInAir % 2) == 0) { if (playerStatus->hazardType == HAZARD_TYPE_LAVA && (playerStatus->timeInAir % 2) == 0) {
fx_smoke_burst(0, playerStatus->position.x, playerStatus->position.y, playerStatus->position.z, 0.7f, 18); fx_smoke_burst(0, playerStatus->position.x, playerStatus->position.y, playerStatus->position.z, 0.7f, 18);
} }
if (playerStatus->position.y < playerStatus->gravityIntegrator[3] + playerStatus->gravityIntegrator[2]) { if (playerStatus->position.y < playerStatus->gravityIntegrator[3] + playerStatus->gravityIntegrator[2]) {
sin_cos_rad((D_802B68B4 * TAU) / 360.0f, &sp18, &sp1C); sin_cos_rad((LaunchInterpPhase * TAU) / 360.0f, &dx, &dy);
D_802B68B0 = sin_rad((D_802B68B4 * TAU) / 360.0f) * 16.0f; LaunchVelocity = sin_rad((LaunchInterpPhase * TAU) / 360.0f) * 16.0f;
if (D_802B68B0 < -1.0f) { if (LaunchVelocity < -1.0f) {
D_802B68B0 = -1.0f; LaunchVelocity = -1.0f;
} }
playerStatus->position.y += D_802B68B0; playerStatus->position.y += LaunchVelocity;
D_802B68B4 += 3.0f; LaunchInterpPhase += 3.0f;
if (D_802B68B4 > 180.0f) { if (LaunchInterpPhase > 180.0f) {
D_802B68B4 = 180.0f; LaunchInterpPhase = 180.0f;
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
} else { } else {
playerStatus->position.y = playerStatus->gravityIntegrator[3] + playerStatus->gravityIntegrator[2]; playerStatus->position.y = playerStatus->gravityIntegrator[3] + playerStatus->gravityIntegrator[2];
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
break; break;
case 3: case SUBSTATE_END_LAUNCH:
if (playerStatus->unk_BF == 1 && (playerStatus->timeInAir % 2) == 0) { if (playerStatus->hazardType == HAZARD_TYPE_LAVA && (playerStatus->timeInAir % 2) == 0) {
fx_smoke_burst(0, playerStatus->position.x, playerStatus->position.y, playerStatus->position.z, 0.7f, 18); fx_smoke_burst(0, playerStatus->position.x, playerStatus->position.y, playerStatus->position.z, 0.7f, 18);
} }
if (get_lava_reset_pos(&sp20, &sp24, &sp28) == 0) { if (get_lava_reset_pos(&resetPosX, &resetPosY, &resetPosZ) == 0) {
sp20 = playerStatus->position.x; resetPosX = playerStatus->position.x;
sp28 = playerStatus->position.z; resetPosZ = playerStatus->position.z;
} }
playerStatus->lastGoodPosition.x = sp20; playerStatus->lastGoodPosition.x = resetPosX;
playerStatus->lastGoodPosition.z = sp28; playerStatus->lastGoodPosition.z = resetPosZ;
playerStatus->jumpApexHeight = playerStatus->position.y; playerStatus->jumpApexHeight = playerStatus->position.y;
playerStatus->gravityIntegrator[0] = 0.1143f; LOAD_INTEGRATOR_FALL(playerStatus->gravityIntegrator);
playerStatus->gravityIntegrator[1] = -0.2871f; playerStatus->actionSubstate++;
playerStatus->gravityIntegrator[2] = -0.1823f;
playerStatus->gravityIntegrator[3] = 0.01152f;
playerStatus->fallState++;
break; break;
case 4: case SUBSTATE_RETURN_INIT:
D_802B68B8 = atan2(playerStatus->position.x, playerStatus->position.z, playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z); ReturnAngle = atan2(playerStatus->position.x, playerStatus->position.z, playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z);
playerStatus->currentSpeed = get_xz_dist_to_player(playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z) / 18.0f; playerStatus->currentSpeed = get_xz_dist_to_player(playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z) / 18.0f;
playerStatus->fallState++; playerStatus->actionSubstate++;
break; break;
case 5: case SUBSTATE_RETURN_MOTION:
D_802B68B8 = atan2(playerStatus->position.x, playerStatus->position.z, playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z); ReturnAngle = atan2(playerStatus->position.x, playerStatus->position.z, playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z);
theta = D_802B68B8 * TAU / 360.0f; returnRadians = ReturnAngle * TAU / 360.0f;
tempCurrentSpeed = playerStatus->currentSpeed * sin_rad(theta); // update motion along x axis
playerStatus->position.x += tempCurrentSpeed; componentSpeed = playerStatus->currentSpeed * sin_rad(returnRadians);
sp2C = 0; playerStatus->position.x += componentSpeed;
if (tempCurrentSpeed >= 0.0f) { completeAxes = 0;
if (componentSpeed >= 0.0f) {
if (playerStatus->lastGoodPosition.x <= playerStatus->position.x) { if (playerStatus->lastGoodPosition.x <= playerStatus->position.x) {
playerStatus->position.x = playerStatus->lastGoodPosition.x; playerStatus->position.x = playerStatus->lastGoodPosition.x;
sp2C = 1; completeAxes++;
} }
} else { } else {
if (playerStatus->position.x <= playerStatus->lastGoodPosition.x) { if (playerStatus->position.x <= playerStatus->lastGoodPosition.x) {
playerStatus->position.x = playerStatus->lastGoodPosition.x; playerStatus->position.x = playerStatus->lastGoodPosition.x;
sp2C = 1; completeAxes++;
} }
} }
tempCurrentSpeed = playerStatus->currentSpeed * cos_rad(theta); // update motion along z axis
playerStatus->position.z -= tempCurrentSpeed; componentSpeed = playerStatus->currentSpeed * cos_rad(returnRadians);
if (tempCurrentSpeed >= 0.0f) { playerStatus->position.z -= componentSpeed;
if (componentSpeed >= 0.0f) {
if (playerStatus->position.z <= playerStatus->lastGoodPosition.z) { if (playerStatus->position.z <= playerStatus->lastGoodPosition.z) {
playerStatus->position.z = playerStatus->lastGoodPosition.z; playerStatus->position.z = playerStatus->lastGoodPosition.z;
sp2C++; completeAxes++;
} }
} else { } else {
if (playerStatus->lastGoodPosition.z <= playerStatus->position.z) { if (playerStatus->lastGoodPosition.z <= playerStatus->position.z) {
playerStatus->position.z = playerStatus->lastGoodPosition.z; playerStatus->position.z = playerStatus->lastGoodPosition.z;
sp2C++; completeAxes++;
} }
} }
if (sp2C == 2) { // if both axes are done, continue to next substate
playerStatus->fallState++; if (completeAxes == 2) {
playerStatus->actionSubstate++;
} }
break; break;
case 6: case SUBSTATE_HOVER:
if (playerStatus->unk_BF == 1 && (playerStatus->timeInAir % 2) == 0) { if (playerStatus->hazardType == HAZARD_TYPE_LAVA && (playerStatus->timeInAir % 2) == 0) {
fx_smoke_burst(0, playerStatus->position.x, playerStatus->position.y, playerStatus->position.z, 0.7f, 18); fx_smoke_burst(0, playerStatus->position.x, playerStatus->position.y, playerStatus->position.z, 0.7f, 18);
} }
playerStatus->position.y = player_check_collision_below(func_800E34D8(), &sp2C); playerStatus->position.y = player_check_collision_below(func_800E34D8(), &completeAxes);
if (sp2C >= 0) { if (completeAxes >= 0) {
exec_ShakeCamX(0, 2, 1, 0.8f); exec_ShakeCamX(0, 2, 1, 0.8f);
start_rumble(0x100, 0x32); start_rumble(256, 50);
phys_adjust_cam_on_landing(); phys_adjust_cam_on_landing();
gCameras[CAM_DEFAULT].moveFlags &= ~CAMERA_MOVE_FLAGS_2; gCameras[CAM_DEFAULT].moveFlags &= ~CAMERA_MOVE_FLAGS_2;
sfx_play_sound_at_player(SOUND_3FB, 0); sfx_play_sound_at_player(SOUND_3FB, 0);
suggest_player_anim_setUnkFlag(0x8001A); suggest_player_anim_setUnkFlag(ANIM_Mario_8001A);
playerStatus->flags &= ~0x800; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_800;
playerStatus->flags &= ~8; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_FLYING;
playerStatus->unk_BF = 0; playerStatus->hazardType = HAZARD_TYPE_NONE;
playerStatus->gravityIntegrator[0] = 6.0f; playerStatus->gravityIntegrator[0] = 6.0f;
playerStatus->position.y += 6.0f; playerStatus->position.y += 6.0f;
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
break; break;
case 7: case SUBSTATE_BOUNCE:
tempGravityIntegrator = playerStatus->gravityIntegrator[0] - 1.0; playerStatus->gravityIntegrator[0] -= 1.0;
playerStatus->gravityIntegrator[0] = tempGravityIntegrator; playerStatus->position.y = player_check_collision_below(playerStatus->gravityIntegrator[0], &completeAxes);
playerStatus->position.y = player_check_collision_below(tempGravityIntegrator, &sp2C); if (completeAxes >= 0) {
if (sp2C >= 0) { playerStatus->currentStateTime = 10;
playerStatus->currentStateTime = 0xA; playerStatus->actionSubstate++;
playerStatus->fallState++;
} }
break; break;
case 8: case SUBSTATE_DELAY_DONE:
if (--playerStatus->currentStateTime << 16 <= 0) { if (--playerStatus->currentStateTime <= 0) {
set_action_state(ACTION_STATE_LAND); set_action_state(ACTION_STATE_LAND);
playerStatus->flags &= ~0x800000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_800000;
gOverrideFlags &= ~GLOBAL_OVERRIDES_40; gOverrideFlags &= ~GLOBAL_OVERRIDES_40;
} }
break; break;
} }
if (playerStatus->fallState < 7) { if (playerStatus->actionSubstate < SUBSTATE_BOUNCE) {
playerStatus->timeInAir++; playerStatus->timeInAir++;
} }
} }

View File

@ -1,54 +1,58 @@
#include "common.h" #include "common.h"
#include "../actions.h" #include "../actions.h"
s32 IdlePeachAnims[] = { AnimID IdlePeachAnims[] = {
0x000A0001, // none ANIM_Peach_A0001, // none
0x000A0007, // cream ANIM_Peach_A0007, // cream
0x000A0009, // strawberry ANIM_Peach_A0009, // strawberry
0x000A000B, // butter ANIM_Peach_A000B, // butter
0x000A000D, // cleanser ANIM_Peach_A000D, // cleanser
0x000A000F, // water ANIM_Peach_A000F, // water
0x000A0011, // milk ANIM_Peach_A0011, // milk
0x000A0013, // flour ANIM_Peach_A0013, // flour
0x000A0015, // egg ANIM_Peach_A0015, // egg
0x000A0017, // complete cake ANIM_Peach_A0017, // complete cake
0x000A0019, // cake bowl ANIM_Peach_A0019, // cake bowl
0x000A001B, // cake mixed ANIM_Peach_A001B, // cake mixed
0x000A001D, // cake pan ANIM_Peach_A001D, // cake pan
0x000A001F, // cake batter ANIM_Peach_A001F, // cake batter
0x000A0021, // cake bare ANIM_Peach_A0021, // cake bare
0x000A0023, // salt ANIM_Peach_A0023, // salt
0x000A0025, // sugar ANIM_Peach_A0025, // sugar
0x000A0027, // cake with icing ANIM_Peach_A0027, // cake with icing
0x000A0029, // cake with berries ANIM_Peach_A0029, // cake with berries
0x00000000, 0x00000000,
}; };
void action_idle_update_peach(void); enum {
SUBSTATE_IDLE_DEFAULT = 0,
SUBSTATE_IDLE_STRETCH = 1,
SUBSTATE_DELAY_SLEEP = 2,
SUBSTATE_IDLE_SLEEP = 3,
};
void action_idle_update(void) { void action_update_idle_peach(void);
void action_update_idle(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
PlayerData* playerData = &gPlayerData; PlayerData* playerData = &gPlayerData;
s32 wasMoving = FALSE; s32 wasMoving = FALSE;
f32 angle, magnitude;
AnimID anim;
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
action_idle_update_peach(); action_update_idle_peach();
return; return;
} }
playerStatus->currentStateTime++; playerStatus->currentStateTime++;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
s32 anim;
playerStatus->flags &= playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED
~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_80000 | PLAYER_STATUS_FLAGS_AIRBORNE);
| PLAYER_STATUS_FLAGS_80000
| PLAYER_STATUS_FLAGS_JUMPING
| PLAYER_STATUS_FLAGS_FALLING
| PLAYER_STATUS_FLAGS_FLYING);
wasMoving = TRUE; wasMoving = TRUE;
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_IDLE_DEFAULT;
playerStatus->currentStateTime = 0; playerStatus->currentStateTime = 0;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
@ -56,13 +60,13 @@ void action_idle_update(void) {
playerStatus->pitch = 0.0f; playerStatus->pitch = 0.0f;
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) {
anim = 0x90002; anim = ANIM_Mario_90002;
} else if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) { } else if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) {
anim = 0x10002; anim = ANIM_Mario_10002;
} else if ((s8)playerStatus->prevActionState == ACTION_STATE_IDLE) { } else if (playerStatus->prevActionState == ACTION_STATE_IDLE) {
anim = 0x60005; anim = ANIM_Mario_60005;
} else { } else {
anim = 0x60007; anim = ANIM_Mario_60007;
} }
suggest_player_anim_clearUnkFlag(anim); suggest_player_anim_clearUnkFlag(anim);
} }
@ -70,9 +74,6 @@ void action_idle_update(void) {
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_RAISED_ARMS) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_RAISED_ARMS) {
set_action_state(ACTION_STATE_RAISE_ARMS); set_action_state(ACTION_STATE_RAISE_ARMS);
} else { } else {
f32 angle;
f32 magnitude;
player_input_to_move_vector(&angle, &magnitude); player_input_to_move_vector(&angle, &magnitude);
phys_update_interact_collider(); phys_update_interact_collider();
@ -95,29 +96,25 @@ void action_idle_update(void) {
} }
} }
void action_idle_update_peach(void) { void action_update_idle_peach(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
PlayerData* playerData = &gPlayerData; PlayerData* playerData = &gPlayerData;
f32 angle; f32 angle, magnitude;
f32 magnitude;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_IDLE_DEFAULT;
playerStatus->currentStateTime = 0; playerStatus->currentStateTime = 0;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
playerStatus->flags &= playerStatus->flags &= ~PLAYER_STATUS_FLAGS_AIRBORNE;
~(PLAYER_STATUS_FLAGS_JUMPING
| PLAYER_STATUS_FLAGS_FALLING
| PLAYER_STATUS_FLAGS_FLYING);
if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_IN_DISGUISE)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_IN_DISGUISE)) {
if (!(gGameStatusPtr->peachFlags & PEACH_STATUS_FLAG_HAS_INGREDIENT)) { if (!(gGameStatusPtr->peachFlags & PEACH_STATUS_FLAG_HAS_INGREDIENT)) {
suggest_player_anim_clearUnkFlag(IdlePeachAnims[gGameStatusPtr->peachCookingIngredient]); suggest_player_anim_clearUnkFlag(IdlePeachAnims[gGameStatusPtr->peachCookingIngredient]);
} else { } else {
suggest_player_anim_clearUnkFlag(0xC000E); suggest_player_anim_clearUnkFlag(ANIM_Peach_C000E);
} }
} else { } else {
peach_set_disguise_anim(BasicPeachDisguiseAnims[gPlayerStatus.peachDisguise].idle); peach_set_disguise_anim(BasicPeachDisguiseAnims[gPlayerStatus.peachDisguise].idle);
@ -125,38 +122,42 @@ void action_idle_update_peach(void) {
} }
if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_IN_DISGUISE)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_IN_DISGUISE)) {
switch (playerStatus->fallState) { switch (playerStatus->actionSubstate) {
case 0: case SUBSTATE_IDLE_DEFAULT:
if (!(playerStatus->flags & (PLAYER_STATUS_FLAGS_1000 | PLAYER_STATUS_FLAGS_INPUT_DISABLED)) && (playerStatus->unk_C4 == 0)) { if (!(playerStatus->flags & (PLAYER_STATUS_FLAGS_1000 | PLAYER_STATUS_FLAGS_INPUT_DISABLED))
&& (playerStatus->peachItemHeld == 0)) {
if (playerStatus->currentStateTime > 1800) { if (playerStatus->currentStateTime > 1800) {
playerStatus->fallState++; // begin first yawm
suggest_player_anim_clearUnkFlag(0xC0003); playerStatus->actionSubstate++;
suggest_player_anim_clearUnkFlag(ANIM_Peach_C0003);
return; return;
} }
playerStatus->currentStateTime++; playerStatus->currentStateTime++;
} }
break; break;
case 1: case SUBSTATE_IDLE_STRETCH:
// waiting for yawn to finish
if (playerStatus->unk_BC != 0) { if (playerStatus->unk_BC != 0) {
playerStatus->fallState++; playerStatus->actionSubstate++;
playerStatus->currentStateTime = 0; playerStatus->currentStateTime = 0;
suggest_player_anim_clearUnkFlag(0xA0001); suggest_player_anim_clearUnkFlag(ANIM_Peach_A0001);
} }
break; break;
case 2: { case SUBSTATE_DELAY_SLEEP:
// delay before next yawn and sleep
playerStatus->currentStateTime++; playerStatus->currentStateTime++;
if (playerStatus->currentStateTime > 200) { if (playerStatus->currentStateTime > 200) {
playerStatus->fallState++; playerStatus->actionSubstate++;
suggest_player_anim_clearUnkFlag(0xC0003); suggest_player_anim_clearUnkFlag(ANIM_Peach_C0003);
} }
break; break;
} case SUBSTATE_IDLE_SLEEP:
case 3: // peach is asleep
if (playerStatus->flags & (PLAYER_STATUS_FLAGS_1000 | PLAYER_STATUS_FLAGS_INPUT_DISABLED)) { if (playerStatus->flags & (PLAYER_STATUS_FLAGS_1000 | PLAYER_STATUS_FLAGS_INPUT_DISABLED)) {
suggest_player_anim_clearUnkFlag(0xA0001); suggest_player_anim_clearUnkFlag(ANIM_Peach_A0001);
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_IDLE_DEFAULT;
} else if (playerStatus->unk_BC != 0) { } else if (playerStatus->unk_BC != 0) {
suggest_player_anim_clearUnkFlag(0xC0004); suggest_player_anim_clearUnkFlag(ANIM_Peach_C0004);
} }
break; break;
} }

View File

@ -1,21 +1,23 @@
#include "common.h" #include "common.h"
extern f32 D_8010C960; extern f32 JumpedOnSwitchX;
extern f32 D_8010C97C; extern f32 JumpedOnSwitchZ;
void func_802B6508_E24548(void); // private functions
void func_802B647C_E244BC(void); void initialize_jump(void);
void action_update_peach_step_down(void);
void action_update_peach_falling(void);
void func_802B6000_E24040(void) { void initialize_jump(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
CollisionStatus* collisionStatus = &gCollisionStatus; CollisionStatus* collisionStatus = &gCollisionStatus;
s32 temp_v1; AnimID anim;
playerStatus->fallState = 0; playerStatus->actionSubstate = JUMP_SUBSTATE_0;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
playerStatus->flags &= ~0x80000008; playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_FLYING);
playerStatus->flags |= 2; playerStatus->flags |= PLAYER_STATUS_FLAGS_JUMPING;
playerStatus->jumpFromPos.x = playerStatus->position.x; playerStatus->jumpFromPos.x = playerStatus->position.x;
playerStatus->jumpFromPos.z = playerStatus->position.z; playerStatus->jumpFromPos.z = playerStatus->position.z;
playerStatus->jumpFromHeight = playerStatus->position.y; playerStatus->jumpFromHeight = playerStatus->position.y;
@ -23,25 +25,25 @@ void func_802B6000_E24040(void) {
phys_init_integrator_for_current_state(); phys_init_integrator_for_current_state();
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) {
temp_v1 = 0x90005; anim = ANIM_Mario_90005;
} else if (!(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) { } else if (!(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) {
temp_v1 = 0x10007; anim = ANIM_Mario_AnimMidairStill;
} else { } else {
temp_v1 = 0x60009; anim = ANIM_Mario_60009;
} }
suggest_player_anim_clearUnkFlag(temp_v1); suggest_player_anim_clearUnkFlag(anim);
collisionStatus->lastTouchedFloor = collisionStatus->currentFloor; collisionStatus->lastTouchedFloor = collisionStatus->currentFloor;
collisionStatus->currentFloor = -1; collisionStatus->currentFloor = -1;
} }
void func_802B60B4_E240F4(void) { void action_update_jump(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
s32 anim; AnimID anim;
if (playerStatus->flags < 0) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~0x80000000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
func_802B6000_E24040(); initialize_jump();
if (playerStatus->actionState == ACTION_STATE_LAUNCH) { if (playerStatus->actionState == ACTION_STATE_LAUNCH) {
phys_adjust_cam_on_landing(); phys_adjust_cam_on_landing();
@ -60,35 +62,35 @@ void func_802B60B4_E240F4(void) {
} }
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) {
anim = 0x90005; anim = ANIM_Mario_90005;
} else if (!(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) { } else if (!(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) {
anim = 0x10007; anim = ANIM_Mario_AnimMidairStill;
} else { } else {
anim = 0x60009; anim = ANIM_Mario_60009;
} }
suggest_player_anim_clearUnkFlag(anim); suggest_player_anim_clearUnkFlag(anim);
playerStatus->timeInAir++; playerStatus->timeInAir++;
} }
void func_802B6198_E241D8(void) { void action_update_landing_on_switch(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
CollisionStatus* collisionStatus = &gCollisionStatus; CollisionStatus* collisionStatus = &gCollisionStatus;
s32 anim; AnimID anim;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
Entity* entity = get_entity_by_index(collisionStatus->currentFloor); Entity* entity = get_entity_by_index(collisionStatus->currentFloor);
D_8010C960 = entity->position.x; JumpedOnSwitchX = entity->position.x;
D_8010C97C = entity->position.z; JumpedOnSwitchZ = entity->position.z;
func_802B6000_E24040(); initialize_jump();
playerStatus->flags |= 0x880000; playerStatus->flags |= (PLAYER_STATUS_FLAGS_800000 | PLAYER_STATUS_FLAGS_80000);
disable_player_input(); disable_player_input();
} }
playerStatus->timeInAir++; playerStatus->timeInAir++;
if (playerStatus->fallState != 1) { if (playerStatus->actionSubstate != JUMP_SUBSTATE_1) {
return; return;
} }
@ -96,60 +98,57 @@ void func_802B6198_E241D8(void) {
playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_JUMPING | PLAYER_STATUS_FLAGS_FLYING); playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_JUMPING | PLAYER_STATUS_FLAGS_FLYING);
playerStatus->flags |= PLAYER_STATUS_FLAGS_FALLING; playerStatus->flags |= PLAYER_STATUS_FLAGS_FALLING;
if (!(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) { if (!(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) {
anim = 0x10008; anim = ANIM_Mario_AnimMidair;
} else { } else {
anim = 0x6000A; anim = ANIM_Mario_6000A;
} }
suggest_player_anim_clearUnkFlag(anim); suggest_player_anim_clearUnkFlag(anim);
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1; gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1;
} }
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
void func_802B6294_E242D4(void) { void action_update_falling(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
func_802B647C_E244BC(); action_update_peach_falling();
return; return;
} }
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
s32 phi_a0; s32 anim;
playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_JUMPING | PLAYER_STATUS_FLAGS_FLYING); playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_JUMPING | PLAYER_STATUS_FLAGS_FLYING);
playerStatus->flags |= PLAYER_STATUS_FLAGS_FALLING; playerStatus->flags |= PLAYER_STATUS_FLAGS_FALLING;
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) {
phi_a0 = 0x90005; anim = ANIM_Mario_90005;
} else if (!(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) { } else if (!(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) {
phi_a0 = 0x10008; anim = ANIM_Mario_AnimMidair;
} else { } else {
phi_a0 = 0x6000A; anim = ANIM_Mario_6000A;
} }
suggest_player_anim_clearUnkFlag(phi_a0); suggest_player_anim_clearUnkFlag(anim);
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1; gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1;
} }
playerStatus->timeInAir++; playerStatus->timeInAir++;
} }
void func_802B6348_E24388(void) { void action_update_step_down(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 sub_arg5; s32 colliderID;
f32 sub_arg6; s32 surfaceType;
f32 sub_arg7; f32 posX, posY, posZ;
f32 sub_arg8; f32 hitRx, hitRz;
f32 sp28; f32 hitDirX, hitDirZ;
f32 sp2C; f32 height;
f32 sp30;
f32 sp34;
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
func_802B6508_E24548(); action_update_peach_step_down();
return; return;
} }
@ -161,23 +160,23 @@ void func_802B6348_E24388(void) {
playerStatus->timeInAir++; playerStatus->timeInAir++;
phys_update_interact_collider(); phys_update_interact_collider();
sp28 = playerStatus->position.x; posX = playerStatus->position.x;
sp2C = playerStatus->position.y; posY = playerStatus->position.y;
sp30 = playerStatus->position.z; posZ = playerStatus->position.z;
sp34 = playerStatus->colliderHeight; height = playerStatus->colliderHeight;
if (((get_collider_type_by_id(player_raycast_below_cam_relative(playerStatus, &sp28, &sp2C, &sp30, &sp34,
&sub_arg5, &sub_arg6, &sub_arg7, &sub_arg8)) & 0xFF) - 2 >= 2U) && check_input_jump()) {
colliderID = player_raycast_below_cam_relative(playerStatus, &posX, &posY, &posZ, &height, &hitRx, &hitRz, &hitDirX, &hitDirZ);
surfaceType = get_collider_flags(colliderID) & COLLIDER_FLAGS_SURFACE_TYPE_MASK;
if (!(surfaceType == SURFACE_TYPE_SPIKES || surfaceType == SURFACE_TYPE_LAVA) && check_input_jump()) {
set_action_state(ACTION_STATE_JUMP); set_action_state(ACTION_STATE_JUMP);
playerStatus->flags &= ~0xE; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_AIRBORNE;
func_802B60B4_E240F4(); action_update_jump();
} }
} }
void func_802B647C_E244BC(void) { void action_update_peach_falling(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
s32 temp_v1; AnimID anim;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
@ -185,18 +184,18 @@ void func_802B647C_E244BC(void) {
playerStatus->flags |= PLAYER_STATUS_FLAGS_FALLING; playerStatus->flags |= PLAYER_STATUS_FLAGS_FALLING;
if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS)) {
temp_v1 = 0x10008; anim = ANIM_Mario_AnimMidair;
} else { } else {
temp_v1 = 0xA0006; anim = ANIM_Peach_A0006;
} }
suggest_player_anim_clearUnkFlag(temp_v1); suggest_player_anim_clearUnkFlag(anim);
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1; gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1;
} }
playerStatus->timeInAir++; playerStatus->timeInAir++;
} }
void func_802B6508_E24548(void) { void action_update_peach_step_down(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
@ -206,7 +205,7 @@ void func_802B6508_E24548(void) {
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1; gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1;
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
suggest_player_anim_clearUnkFlag(0xA0006); suggest_player_anim_clearUnkFlag(ANIM_Peach_A0006);
} }
} }
playerStatus->timeInAir++; playerStatus->timeInAir++;

View File

@ -1,20 +1,25 @@
#include "common.h" #include "common.h"
extern f32 D_802B6240; // bss? angle to lastGoodPosition enum {
SUBSTATE_FLYING = 0,
SUBSTATE_FALLING = 1
};
void func_802B6000_E287F0(void) { void action_update_knockback(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 dx; f32 dx, dy;
f32 dy;
f32 speed; f32 speed;
if (playerStatus->flags & 0x80000000) { static f32 ReturnAngle;
playerStatus->flags &= ~0x80000000;
suggest_player_anim_setUnkFlag(0x10017); if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
suggest_player_anim_setUnkFlag(ANIM_Mario_FallBack);
playerStatus->flags |= PLAYER_STATUS_FLAGS_FLYING;
playerStatus->flags |= 8; playerStatus->actionSubstate = SUBSTATE_FLYING;
playerStatus->fallState = 0;
playerStatus->gravityIntegrator[0] = 18.3473f; playerStatus->gravityIntegrator[0] = 18.3473f;
playerStatus->gravityIntegrator[1] = -3.738f; playerStatus->gravityIntegrator[1] = -3.738f;
playerStatus->gravityIntegrator[2] = 0.8059f; playerStatus->gravityIntegrator[2] = 0.8059f;
@ -22,30 +27,30 @@ void func_802B6000_E287F0(void) {
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1; gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1;
D_802B6240 = atan2(playerStatus->position.x, playerStatus->position.z, playerStatus->lastGoodPosition.x, ReturnAngle = atan2(playerStatus->position.x, playerStatus->position.z, playerStatus->lastGoodPosition.x,
playerStatus->lastGoodPosition.z); playerStatus->lastGoodPosition.z);
playerStatus->currentSpeed = get_xz_dist_to_player(playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z) / 18.0f; playerStatus->currentSpeed = get_xz_dist_to_player(playerStatus->lastGoodPosition.x, playerStatus->lastGoodPosition.z) / 18.0f;
} }
sin_cos_rad((D_802B6240 * TAU) / 360.0f, &dx, &dy); sin_cos_rad((ReturnAngle * TAU) / 360.0f, &dx, &dy);
speed = playerStatus->currentSpeed; speed = playerStatus->currentSpeed;
if (playerStatus->flags & 0x40000) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_40000) {
speed *= 0.5f; speed *= 0.5f;
} }
playerStatus->position.x += speed * dx; playerStatus->position.x += speed * dx;
playerStatus->position.z -= speed * dy; playerStatus->position.z -= speed * dy;
if (playerStatus->fallState == 0) { if (playerStatus->actionSubstate == SUBSTATE_FLYING) {
integrate_gravity(); integrate_gravity();
playerStatus->position.y += playerStatus->gravityIntegrator[0]; playerStatus->position.y += playerStatus->gravityIntegrator[0];
if (playerStatus->gravityIntegrator[0] < 0.0f) { if (playerStatus->gravityIntegrator[0] < 0.0f) {
playerStatus->fallState = 1; // Now start checking for floor playerStatus->actionSubstate = SUBSTATE_FALLING;
playerStatus->flags |= 4; playerStatus->flags |= PLAYER_STATUS_FLAGS_FALLING;
} }
} else { } else {
s32 colliderID; s32 colliderID;
@ -53,7 +58,7 @@ void func_802B6000_E287F0(void) {
playerStatus->position.y = player_check_collision_below(func_800E34D8(), &colliderID); playerStatus->position.y = player_check_collision_below(func_800E34D8(), &colliderID);
if (colliderID >= 0) { if (colliderID >= 0) {
colliderID = get_collider_type_by_id(colliderID); // what colliderID = get_collider_flags(colliderID); //TODO surfaceType
set_action_state(ACTION_STATE_LAND); set_action_state(ACTION_STATE_LAND);
} }
} }

View File

@ -1,19 +1,24 @@
#include "common.h" #include "common.h"
void func_802B62CC_E24BEC(void); enum {
void func_802B644C_E24D6C(void); SUBSTATE_INIT = 0,
SUBSTATE_DONE = 1,
};
void func_802B6000_E24920(void) { void action_update_peach_land(void);
void action_update_peach_step_down_land(void);
void action_update_land(void) {
CollisionStatus* collisionStatus = &gCollisionStatus; CollisionStatus* collisionStatus = &gCollisionStatus;
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
Camera* camera = &gCameras[CAM_DEFAULT]; Camera* camera = &gCameras[CAM_DEFAULT];
f32 inputMoveMagnitude; f32 inputMoveMagnitude;
f32 inputMoveAngle; f32 inputMoveAngle;
s32 jumpInputCheck; s32 jumpInputCheck;
s32 phi_a0; AnimID anim;
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
func_802B62CC_E24BEC(); action_update_peach_land();
return; return;
} }
@ -22,25 +27,23 @@ void func_802B6000_E24920(void) {
PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED |
PLAYER_STATUS_FLAGS_800000 | PLAYER_STATUS_FLAGS_800000 |
PLAYER_STATUS_FLAGS_80000 | PLAYER_STATUS_FLAGS_80000 |
PLAYER_STATUS_FLAGS_FLYING | PLAYER_STATUS_FLAGS_AIRBORNE
PLAYER_STATUS_FLAGS_FALLING |
PLAYER_STATUS_FLAGS_JUMPING
); );
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_INIT;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
playerStatus->landPos.x = playerStatus->position.x; playerStatus->landPos.x = playerStatus->position.x;
playerStatus->landPos.z = playerStatus->position.z; playerStatus->landPos.z = playerStatus->position.z;
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) {
phi_a0 = 0x90002; anim = ANIM_Mario_90002;
} else if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) { } else if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) {
phi_a0 = 0x10009; anim = ANIM_Mario_10009;
} else { } else {
phi_a0 = 0x6000B; anim = ANIM_Mario_6000B;
} }
suggest_player_anim_clearUnkFlag(phi_a0); suggest_player_anim_clearUnkFlag(anim);
sfx_play_sound_at_player(SOUND_8161, 0); sfx_play_sound_at_player(SOUND_8161, 0);
sfx_play_sound_at_player(SOUND_SOFT_LAND, 0); sfx_play_sound_at_player(SOUND_SOFT_LAND, 0);
@ -52,13 +55,13 @@ void func_802B6000_E24920(void) {
playerStatus->animFlags &= ~PLAYER_STATUS_ANIM_FLAGS_40000; playerStatus->animFlags &= ~PLAYER_STATUS_ANIM_FLAGS_40000;
camera->moveFlags &= ~CAMERA_MOVE_FLAGS_4; camera->moveFlags &= ~CAMERA_MOVE_FLAGS_4;
} }
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_DONE
playerStatus->currentSpeed *= 0.6f; playerStatus->currentSpeed *= 0.6f;
player_input_to_move_vector(&inputMoveAngle, &inputMoveMagnitude); player_input_to_move_vector(&inputMoveAngle, &inputMoveMagnitude);
jumpInputCheck = check_input_jump(); jumpInputCheck = check_input_jump();
if (jumpInputCheck != 0 || jumpInputCheck < playerStatus->fallState) { if (jumpInputCheck != 0 || jumpInputCheck < playerStatus->actionSubstate) {
if (inputMoveMagnitude == 0.0f) { if (inputMoveMagnitude == 0.0f) {
set_action_state(ACTION_STATE_IDLE); set_action_state(ACTION_STATE_IDLE);
return; return;
@ -70,14 +73,14 @@ void func_802B6000_E24920(void) {
} }
} }
void func_802B61C0_E24AE0(void) { void action_update_step_down_land(void) {
CollisionStatus* collisionStatus = &gCollisionStatus; CollisionStatus* collisionStatus = &gCollisionStatus;
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 inputMoveMagnitude; f32 inputMoveMagnitude;
f32 inputMoveAngle; f32 inputMoveAngle;
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
func_802B644C_E24D6C(); action_update_peach_step_down_land();
return; return;
} }
@ -86,11 +89,9 @@ void func_802B61C0_E24AE0(void) {
PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED |
PLAYER_STATUS_FLAGS_800000 | PLAYER_STATUS_FLAGS_800000 |
PLAYER_STATUS_FLAGS_80000 | PLAYER_STATUS_FLAGS_80000 |
PLAYER_STATUS_FLAGS_FLYING | PLAYER_STATUS_FLAGS_AIRBORNE
PLAYER_STATUS_FLAGS_FALLING |
PLAYER_STATUS_FLAGS_JUMPING
); );
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_INIT;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
playerStatus->landPos.x = playerStatus->position.x; playerStatus->landPos.x = playerStatus->position.x;
@ -103,7 +104,7 @@ void func_802B61C0_E24AE0(void) {
collisionStatus->lastTouchedFloor = -1; collisionStatus->lastTouchedFloor = -1;
} }
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_DONE
playerStatus->currentSpeed *= 0.6f; playerStatus->currentSpeed *= 0.6f;
player_input_to_move_vector(&inputMoveAngle, &inputMoveMagnitude); player_input_to_move_vector(&inputMoveAngle, &inputMoveMagnitude);
@ -116,7 +117,7 @@ void func_802B61C0_E24AE0(void) {
update_locomotion_state(); update_locomotion_state();
} }
void func_802B62CC_E24BEC(void) { void action_update_peach_land(void) {
CollisionStatus* collisionStatus = &gCollisionStatus; CollisionStatus* collisionStatus = &gCollisionStatus;
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 inputMoveMagnitude; f32 inputMoveMagnitude;
@ -124,10 +125,10 @@ void func_802B62CC_E24BEC(void) {
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_INIT;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_FLYING | PLAYER_STATUS_FLAGS_FALLING | PLAYER_STATUS_FLAGS_JUMPING); playerStatus->flags &= ~PLAYER_STATUS_FLAGS_AIRBORNE;
playerStatus->landPos.x = playerStatus->position.x; playerStatus->landPos.x = playerStatus->position.x;
playerStatus->landPos.z = playerStatus->position.z; playerStatus->landPos.z = playerStatus->position.z;
@ -140,7 +141,7 @@ void func_802B62CC_E24BEC(void) {
collisionStatus->lastTouchedFloor = -1; collisionStatus->lastTouchedFloor = -1;
} }
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_DONE
playerStatus->currentSpeed *= 0.6f; playerStatus->currentSpeed *= 0.6f;
player_input_to_move_vector(&inputMoveAngle, &inputMoveMagnitude); player_input_to_move_vector(&inputMoveAngle, &inputMoveMagnitude);
@ -160,7 +161,7 @@ void func_802B62CC_E24BEC(void) {
} }
} }
void func_802B644C_E24D6C(void) { void action_update_peach_step_down_land(void) {
CollisionStatus* collisionStatus = &gCollisionStatus; CollisionStatus* collisionStatus = &gCollisionStatus;
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 inputMoveMagnitude; f32 inputMoveMagnitude;
@ -168,10 +169,10 @@ void func_802B644C_E24D6C(void) {
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_INIT;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_FLYING | PLAYER_STATUS_FLAGS_FALLING | PLAYER_STATUS_FLAGS_JUMPING); playerStatus->flags &= ~PLAYER_STATUS_FLAGS_AIRBORNE;
playerStatus->landPos.x = playerStatus->position.x; playerStatus->landPos.x = playerStatus->position.x;
playerStatus->landPos.z = playerStatus->position.z; playerStatus->landPos.z = playerStatus->position.z;
@ -181,7 +182,7 @@ void func_802B644C_E24D6C(void) {
collisionStatus->lastTouchedFloor = -1; collisionStatus->lastTouchedFloor = -1;
} }
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_DONE
playerStatus->currentSpeed *= 0.6f; playerStatus->currentSpeed *= 0.6f;
player_input_to_move_vector(&inputMoveAngle, &inputMoveMagnitude); player_input_to_move_vector(&inputMoveAngle, &inputMoveMagnitude);

View File

@ -2,17 +2,16 @@
#include "world/actions.h" #include "world/actions.h"
#include "world/partner/goombario.h" #include "world/partner/goombario.h"
s32 func_802B6000_E28A30(void) { s32 action_update_ride(void) {
PartnerActionStatus* partnerActionStatus = &gPartnerActionStatus; PartnerActionStatus* partnerActionStatus = &gPartnerActionStatus;
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
s32 oldFlags = playerStatus->flags; s32 oldFlags = playerStatus->flags;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~( playerStatus->flags &= ~(
PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_80000 | PLAYER_STATUS_FLAGS_FLYING | PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_80000 | PLAYER_STATUS_FLAGS_AIRBORNE
PLAYER_STATUS_FLAGS_FALLING | PLAYER_STATUS_FLAGS_JUMPING
); );
playerStatus->fallState = 0; playerStatus->actionSubstate = 0;
playerStatus->currentStateTime = 0; playerStatus->currentStateTime = 0;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
@ -36,7 +35,7 @@ s32 func_802B6000_E28A30(void) {
extern f32 D_802B6770_E27C80; extern f32 D_802B6770_E27C80;
void func_802B609C_E28ACC(void) { void action_update_state_23(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 hitDirZ; f32 hitDirZ;
f32 hitDirX; f32 hitDirX;
@ -55,11 +54,9 @@ void func_802B609C_E28ACC(void) {
f32 playerOffsetTempVar; f32 playerOffsetTempVar;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~( playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED
PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_80000 | PLAYER_STATUS_FLAGS_FLYING | | PLAYER_STATUS_FLAGS_80000 | PLAYER_STATUS_FLAGS_AIRBORNE);
PLAYER_STATUS_FLAGS_FALLING | PLAYER_STATUS_FLAGS_JUMPING playerStatus->actionSubstate = 0;
);
playerStatus->fallState = 0;
playerStatus->currentStateTime = 0; playerStatus->currentStateTime = 0;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
@ -68,9 +65,9 @@ void func_802B609C_E28ACC(void) {
D_802B6770_E27C80 = D_8010C938; D_802B6770_E27C80 = D_8010C938;
} }
switch (playerStatus->fallState) { switch (playerStatus->actionSubstate) {
case 0: case 0:
playerStatus->fallState++; playerStatus->actionSubstate++;
case 1: case 1:
break; break;
default: default:
@ -125,19 +122,19 @@ void func_802B609C_E28ACC(void) {
} }
} }
void func_802B6350_E28D80(void) { void action_update_launch(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~(0x80000000 | 0x80000 | 0x8 | 0x4 | 0x2); playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_80000 | PLAYER_STATUS_FLAGS_AIRBORNE);
playerStatus->fallState = 0; playerStatus->actionSubstate = 0;
playerStatus->currentStateTime = 0; playerStatus->currentStateTime = 0;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
playerStatus->pitch = 0.0f; playerStatus->pitch = 0.0f;
if (playerStatus->animFlags & 0x1000) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
return; return;
} }
playerStatus->currentStateTime = 5; playerStatus->currentStateTime = 5;
@ -149,17 +146,17 @@ void func_802B6350_E28D80(void) {
} }
} }
void func_802B63D4_E28E04(void) { void action_update_first_strike(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~(0x80000000 | 0x8 | 0x4 | 0x2); playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_AIRBORNE);
playerStatus->fallState = 0; playerStatus->actionSubstate = 0;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
playerStatus->pitch = 0.0f; playerStatus->pitch = 0.0f;
suggest_player_anim_setUnkFlag(0x10017); suggest_player_anim_setUnkFlag(ANIM_Mario_FallBack);
playerStatus->currentStateTime = 30; playerStatus->currentStateTime = 30;
} }
@ -170,48 +167,48 @@ void func_802B63D4_E28E04(void) {
} }
} }
void func_802B6478_E28EA8(void) { void action_update_raise_arms(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~0x80000000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->flags |= 0x80000; playerStatus->flags |= PLAYER_STATUS_FLAGS_80000;
playerStatus->currentStateTime = 0; playerStatus->currentStateTime = 0;
playerStatus->fallState = 0; playerStatus->actionSubstate = 0;
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
playerStatus->pitch = 0.0f; playerStatus->pitch = 0.0f;
suggest_player_anim_setUnkFlag(0x1001F); suggest_player_anim_setUnkFlag(ANIM_Mario_GotItem);
} }
if (!(playerStatus->animFlags & 0x200)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_RAISED_ARMS)) {
set_action_state(ACTION_STATE_IDLE); set_action_state(ACTION_STATE_IDLE);
playerStatus->flags &= ~0x80000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_80000;
} }
} }
void func_802B6508_E28F38(void) { void action_update_pushing_block(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
f32 angle; f32 angle;
f32 magnitude; f32 magnitude;
playerStatus->flags &= ~0x80000000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
playerStatus->unk_60 = 0; playerStatus->unk_60 = 0;
playerStatus->currentStateTime = 5; playerStatus->currentStateTime = 5;
player_input_to_move_vector(&angle, &magnitude); player_input_to_move_vector(&angle, &magnitude);
if (((angle >= 45.0f) && (angle <= 135.0f)) || ((angle >= 225.0f) && (angle <= 315.0f))) { if (((angle >= 45.0f) && (angle <= 135.0f)) || ((angle >= 225.0f) && (angle <= 315.0f))) {
suggest_player_anim_setUnkFlag(0x80000 | 0x20); suggest_player_anim_setUnkFlag(ANIM_Mario_80020);
} else { } else {
suggest_player_anim_clearUnkFlag(0x60000 | 0x4); suggest_player_anim_clearUnkFlag(ANIM_Mario_60004);
} }
} }
check_input_jump(); check_input_jump();
if (playerStatus->animFlags & 0x800000) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_800000) {
if (playerStatus->currentStateTime != 0) { if (playerStatus->currentStateTime != 0) {
playerStatus->currentStateTime--; playerStatus->currentStateTime--;
if (playerStatus->currentStateTime == 0) { if (playerStatus->currentStateTime == 0) {
@ -221,7 +218,7 @@ void func_802B6508_E28F38(void) {
} }
} }
void func_802B6638_E29068(void) { void action_update_talk(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
@ -229,11 +226,11 @@ void func_802B6638_E29068(void) {
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
playerStatus->unk_60 = 0; playerStatus->unk_60 = 0;
if (!(playerStatus->animFlags & 0x1000)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS)) {
suggest_player_anim_setUnkFlag(0x80007); suggest_player_anim_setUnkFlag(ANIM_Mario_80007);
} else if (playerStatus->unk_C4 == 0) { } else if (playerStatus->peachItemHeld == 0) {
if (!(playerStatus->animFlags & 0x2000)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_IN_DISGUISE)) {
suggest_player_anim_setUnkFlag(0xC0000); suggest_player_anim_setUnkFlag(ANIM_Peach_C0000);
} else { } else {
peach_set_disguise_anim(BasicPeachDisguiseAnims[playerStatus->peachDisguise].talk); peach_set_disguise_anim(BasicPeachDisguiseAnims[playerStatus->peachDisguise].talk);
} }
@ -241,12 +238,12 @@ void func_802B6638_E29068(void) {
playerStatus->currentStateTime = 30; playerStatus->currentStateTime = 30;
} }
if (playerStatus->animFlags & 0x1000) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
if (playerStatus->currentStateTime != 0) { if (playerStatus->currentStateTime != 0) {
playerStatus->currentStateTime--; playerStatus->currentStateTime--;
} else if (playerStatus->unk_C4 == 0) { } else if (playerStatus->peachItemHeld == 0) {
if (!(playerStatus->animFlags & 0x2000)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_IN_DISGUISE)) {
suggest_player_anim_setUnkFlag(0xA0001); suggest_player_anim_setUnkFlag(ANIM_Peach_A0001);
} else { } else {
peach_set_disguise_anim(BasicPeachDisguiseAnims[playerStatus->peachDisguise].idle); peach_set_disguise_anim(BasicPeachDisguiseAnims[playerStatus->peachDisguise].idle);
} }

View File

@ -1,77 +1,82 @@
#include "common.h" #include "common.h"
extern f32 D_802B6780; static f32 SlideAcceleration;
extern f32 D_802B6784; static f32 MaxSlideAccel;
extern f32 D_802B6788; static f32 MaxSlideVelocity;
extern f32 D_802B678C; static f32 SlideLaunchSpeed;
extern f32 D_802B6790; static f32 D_802B6790;
extern f32 D_802B6794; static f32 D_802B6794;
extern f32 D_802B6798; static f32 D_802B6798;
extern s32 D_802B679C; static s32 D_802B679C;
enum {
SUBSTATE_SLIDING = 0,
SUBSTATE_STOP = 1,
SUBSTATE_LAUNCH = 2,
SUBSTATE_FALL = 3,
SUBSTATE_CRASH = 4,
SUBSTATE_GET_UP = 5,
SUBSTATE_DUST_OFF = 6,
SUBSTATE_DONE = 7,
};
void func_802B6000_E27510(void) { void func_802B6000_E27510(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32* temp_v0 = playerStatus->unk_D0; SlideParams* slide = playerStatus->slideParams;
playerStatus->gravityIntegrator[0] = temp_v0[4]; playerStatus->gravityIntegrator[0] = slide->integrator[0];
playerStatus->gravityIntegrator[1] = temp_v0[5]; playerStatus->gravityIntegrator[1] = slide->integrator[1];
playerStatus->gravityIntegrator[2] = temp_v0[6]; playerStatus->gravityIntegrator[2] = slide->integrator[2];
playerStatus->gravityIntegrator[3] = temp_v0[7]; playerStatus->gravityIntegrator[3] = slide->integrator[3];
playerStatus->heading = *temp_v0; playerStatus->heading = slide->heading;
D_802B6784 = temp_v0[1]; MaxSlideAccel = slide->maxDescendAccel;
D_802B678C = temp_v0[2]; SlideLaunchSpeed = slide->launchVelocity;
D_802B6788 = temp_v0[3]; MaxSlideVelocity = slide->maxDescendVelocity;
} }
void func_802B6060_E27570(void) { void action_update_sliding(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
CollisionStatus* collisionStatus; CollisionStatus* collisionStatus;
f32 cosA; s32 surfaceType;
f32 sinA; f32 sinA, cosA;
f32 speed;
f32 posX, posY, posZ, depth;
f32 hitRx, hitRy, hitDirX, hitDirZ;
s32 hitID; s32 hitID;
f32 hitDirZ;
f32 hitDirX;
f32 hitRy;
f32 hitRx;
f32 depth;
f32 posZ;
f32 posY;
f32 posX;
f32 tempCurrentSpeed;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_SLIDING;
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
playerStatus->animFlags |= 4; playerStatus->animFlags |= 4;
func_802B6000_E27510(); func_802B6000_E27510();
D_802B6780 = 0.0f; SlideAcceleration = 0.0f;
D_802B6790 = 0.0f; D_802B6790 = 0.0f;
D_802B6794 = 0.0f; D_802B6794 = 0.0f;
D_802B6798 = 0.0f; D_802B6798 = 0.0f;
D_802B679C = 0; D_802B679C = 0;
suggest_player_anim_clearUnkFlag(0x1000A); suggest_player_anim_clearUnkFlag(ANIM_Mario_1000A);
sfx_play_sound_at_player(SOUND_167, 0); sfx_play_sound_at_player(SOUND_167, 0);
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1; gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1;
} }
tempCurrentSpeed = playerStatus->currentSpeed; speed = playerStatus->currentSpeed;
posX = playerStatus->position.x; posX = playerStatus->position.x;
posY = playerStatus->position.y; posY = playerStatus->position.y;
posZ = playerStatus->position.z; posZ = playerStatus->position.z;
hitID = player_test_move_with_slipping(playerStatus, &posX, &posY, &posZ, tempCurrentSpeed, playerStatus->heading); hitID = player_test_move_with_slipping(playerStatus, &posX, &posY, &posZ, speed, playerStatus->heading);
playerStatus->position.x = posX; playerStatus->position.x = posX;
playerStatus->position.z = posZ; playerStatus->position.z = posZ;
playerStatus->position.y = posY; playerStatus->position.y = posY;
switch (playerStatus->fallState) { switch (playerStatus->actionSubstate) {
case 0: case SUBSTATE_SLIDING:
D_802B6780 += 0.1; SlideAcceleration += 0.1;
if (D_802B6784 <= D_802B6780) { if (MaxSlideAccel <= SlideAcceleration) {
D_802B6780 = D_802B6784; SlideAcceleration = MaxSlideAccel;
} }
playerStatus->currentSpeed += D_802B6780; playerStatus->currentSpeed += SlideAcceleration;
if (D_802B6788 <= playerStatus->currentSpeed) { if (MaxSlideVelocity <= playerStatus->currentSpeed) {
playerStatus->currentSpeed = D_802B6788; playerStatus->currentSpeed = MaxSlideVelocity;
} }
posX = playerStatus->position.x; posX = playerStatus->position.x;
depth = 100.0f; depth = 100.0f;
@ -82,111 +87,109 @@ void func_802B6060_E27570(void) {
D_802B6798 = hitRy; D_802B6798 = hitRy;
if (hitID >= 0) { if (hitID >= 0) {
collisionStatus = &gCollisionStatus; collisionStatus = &gCollisionStatus;
if ((u8)get_collider_type_by_id(hitID) == 5) { surfaceType = get_collider_flags(hitID) & COLLIDER_FLAGS_SURFACE_TYPE_MASK;
if (surfaceType == SURFACE_TYPE_SLIDE) {
collisionStatus->currentFloor = hitID; collisionStatus->currentFloor = hitID;
playerStatus->position.y = posY; playerStatus->position.y = posY;
D_802B6790 = hitRy + 180.0f; D_802B6790 = hitRy + 180.0f;
break; break;
} }
if (!(fabs(D_802B6794 - D_802B6798) >= 50.0)) { if (!(fabs(D_802B6794 - D_802B6798) >= 50.0)) {
playerStatus->fallState = 1; playerStatus->actionSubstate = SUBSTATE_STOP;
} else { } else {
playerStatus->fallState = 2; playerStatus->actionSubstate = SUBSTATE_LAUNCH;
} }
} else { } else {
playerStatus->fallState = 2; playerStatus->actionSubstate = SUBSTATE_LAUNCH;
} }
sin_cos_rad((D_802B6790 * TAU) / 360.0f, &sinA, &cosA); sin_cos_rad((D_802B6790 * TAU) / 360.0f, &sinA, &cosA);
playerStatus->position.y += fabsf((sinA / cosA) * playerStatus->currentSpeed); playerStatus->position.y += fabsf((sinA / cosA) * playerStatus->currentSpeed);
snd_stop_sound(SOUND_167); snd_stop_sound(SOUND_167);
break; break;
case 1: case SUBSTATE_STOP:
posX = playerStatus->position.x; posX = playerStatus->position.x;
depth = 50.0f; depth = 50.0f;
posZ = playerStatus->position.z; posZ = playerStatus->position.z;
posY = playerStatus->position.y + (playerStatus->colliderHeight * 0.5f); posY = playerStatus->position.y + (playerStatus->colliderHeight * 0.5f);
hitID = player_raycast_below_cam_relative(playerStatus, &posX, &posY, &posZ, &depth, &hitRx, &hitRy, &hitDirX, &hitDirZ); hitID = player_raycast_below_cam_relative(playerStatus, &posX, &posY, &posZ, &depth, &hitRx, &hitRy, &hitDirX, &hitDirZ);
if (hitID >= 0) { if (hitID >= 0) {
tempCurrentSpeed = playerStatus->currentSpeed / 3.0f; speed = playerStatus->currentSpeed / 3.0f;
if (tempCurrentSpeed < 0.01) { if (speed < 0.01) {
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
} }
playerStatus->currentSpeed -= tempCurrentSpeed; playerStatus->currentSpeed -= speed;
if (playerStatus->currentSpeed <= 0.0f) { if (playerStatus->currentSpeed <= 0.0f) {
sfx_play_sound_at_player(SOUND_172, 0); sfx_play_sound_at_player(SOUND_DUST_OFF, 0);
suggest_player_anim_setUnkFlag(0x10031); suggest_player_anim_setUnkFlag(ANIM_Mario_DustOff);
playerStatus->fallState = 6; playerStatus->actionSubstate = SUBSTATE_DUST_OFF;
playerStatus->currentStateTime = 15; playerStatus->currentStateTime = 15;
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
playerStatus->position.y = posY; playerStatus->position.y = posY;
} }
break; break;
} }
case 2: case SUBSTATE_LAUNCH:
playerStatus->currentSpeed += D_802B678C; playerStatus->currentSpeed += SlideLaunchSpeed;
if (playerStatus->currentSpeed <= 0.0f) { if (playerStatus->currentSpeed <= 0.0f) {
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
} }
playerStatus->gravityIntegrator[0] += playerStatus->gravityIntegrator[1]; playerStatus->gravityIntegrator[0] += playerStatus->gravityIntegrator[1];
playerStatus->position.y += playerStatus->gravityIntegrator[0]; playerStatus->position.y += playerStatus->gravityIntegrator[0];
if (playerStatus->gravityIntegrator[0] <= 0.0f) { if (playerStatus->gravityIntegrator[0] <= 0.0f) {
playerStatus->fallState = 3; playerStatus->actionSubstate = SUBSTATE_FALL;
playerStatus->gravityIntegrator[0] = 0.1143f; LOAD_INTEGRATOR_FALL(playerStatus->gravityIntegrator);
playerStatus->gravityIntegrator[1] = -0.2871f;
playerStatus->gravityIntegrator[2] = -0.1823f;
playerStatus->gravityIntegrator[3] = 0.01152f;
} }
break; break;
case 3: case SUBSTATE_FALL:
playerStatus->currentSpeed += D_802B678C; playerStatus->currentSpeed += SlideLaunchSpeed;
if (playerStatus->currentSpeed <= 0.0f) { if (playerStatus->currentSpeed <= 0.0f) {
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
} }
playerStatus->position.y = player_check_collision_below(func_800E34D8(), &hitID); playerStatus->position.y = player_check_collision_below(func_800E34D8(), &hitID);
if (hitID >= 0) { if (hitID >= 0) {
D_802B678C = -1; SlideLaunchSpeed = -1;
suggest_player_anim_setUnkFlag(0x80003); suggest_player_anim_setUnkFlag(ANIM_Mario_80003);
sfx_play_sound_at_player(SOUND_162, 0); sfx_play_sound_at_player(SOUND_162, 0);
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_CRASH
} }
break; break;
case 4: case SUBSTATE_CRASH:
playerStatus->currentSpeed += D_802B678C; playerStatus->currentSpeed += SlideLaunchSpeed;
if (playerStatus->currentSpeed <= 0.0f) { if (playerStatus->currentSpeed <= 0.0f) {
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
} }
if (playerStatus->unk_BC != 0) { if (playerStatus->unk_BC != 0) {
suggest_player_anim_setUnkFlag(0x10030); suggest_player_anim_setUnkFlag(ANIM_Mario_GetUp);
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_GET_UP
} }
break; break;
case 5: case SUBSTATE_GET_UP:
playerStatus->currentSpeed += D_802B678C; playerStatus->currentSpeed += SlideLaunchSpeed;
if (playerStatus->currentSpeed <= 0.0f) { if (playerStatus->currentSpeed <= 0.0f) {
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
} }
if (playerStatus->unk_BC != 0) { if (playerStatus->unk_BC != 0) {
suggest_player_anim_setUnkFlag(0x10031); suggest_player_anim_setUnkFlag(ANIM_Mario_DustOff);
sfx_play_sound_at_player(SOUND_172, 0); sfx_play_sound_at_player(SOUND_DUST_OFF, 0);
playerStatus->currentStateTime = 15; playerStatus->currentStateTime = 15;
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_DUST_OFF
} }
break; break;
case 6: case SUBSTATE_DUST_OFF:
playerStatus->currentSpeed += D_802B678C; playerStatus->currentSpeed += SlideLaunchSpeed;
if (playerStatus->currentSpeed <= 0.0f) { if (playerStatus->currentSpeed <= 0.0f) {
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
} }
if (--playerStatus->currentStateTime == 0) { if (--playerStatus->currentStateTime == 0) {
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_DONE
} }
break; break;
case 7: case SUBSTATE_DONE:
tempCurrentSpeed = playerStatus->currentSpeed / 3.0f; speed = playerStatus->currentSpeed / 3.0f;
if (tempCurrentSpeed < 0.01) { if (speed < 0.01) {
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
} }
playerStatus->currentSpeed -= tempCurrentSpeed; playerStatus->currentSpeed -= speed;
if (playerStatus->currentSpeed <= 0.0f) { if (playerStatus->currentSpeed <= 0.0f) {
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
set_action_state(ACTION_STATE_IDLE); set_action_state(ACTION_STATE_IDLE);

View File

@ -40,7 +40,7 @@ Npc* func_802B6000_E2A6B0(void) {
} while (0); } while (0);
} }
void func_802B6120_E2A7D0(void) { void action_update_parasol(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
SneakyParasolUnk* parasolStruct = &D_802B6E80; SneakyParasolUnk* parasolStruct = &D_802B6E80;
Camera* cam = &gCameras[gCurrentCameraID]; Camera* cam = &gCameras[gCurrentCameraID];
@ -78,13 +78,13 @@ void func_802B6120_E2A7D0(void) {
phi_f4 = 2; phi_f4 = 2;
} }
*tempUnk_1C = phi_f4; *tempUnk_1C = phi_f4;
if (!(playerStatus->animFlags & 0x2000)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_IN_DISGUISE)) {
playerStatus->currentStateTime = 20; playerStatus->currentStateTime = 20;
playerStatus->fallState = 0; playerStatus->actionSubstate = 0;
parasolStruct->unk_08 = 0xF; parasolStruct->unk_08 = 0xF;
parasolStruct->npc = func_802B6000_E2A6B0(); parasolStruct->npc = func_802B6000_E2A6B0();
} else { } else {
playerStatus->fallState = 0x14; playerStatus->actionSubstate = 0x14;
playerStatus->currentStateTime = 40; playerStatus->currentStateTime = 40;
parasolStruct->unk_04 = 1; parasolStruct->unk_04 = 1;
parasolStruct->unk_0C = 0xC; parasolStruct->unk_0C = 0xC;
@ -95,26 +95,26 @@ void func_802B6120_E2A7D0(void) {
} }
} }
switch (playerStatus->fallState) { switch (playerStatus->actionSubstate) {
case 0: case 0:
if (playerStatus->unk_90[CAM_DEFAULT] == 0) { if (playerStatus->flipYaw[CAM_DEFAULT] == 0) {
if (peach_disguise_check_overlaps() < 0) { if (peach_disguise_check_overlaps() < 0) {
suggest_player_anim_clearUnkFlag(0xC0024); suggest_player_anim_clearUnkFlag(ANIM_Peach_C0024);
sfx_play_sound_at_player(SOUND_92, 0); sfx_play_sound_at_player(SOUND_92, 0);
playerStatus->fallState++; playerStatus->actionSubstate++;
} else { } else {
suggest_player_anim_clearUnkFlag(0xC0027); suggest_player_anim_clearUnkFlag(ANIM_Peach_C0027);
playerStatus->fallState = 0x32; playerStatus->actionSubstate = 0x32;
playerStatus->currentStateTime = 10; playerStatus->currentStateTime = 10;
parasolStruct->unk_08 = 0; parasolStruct->unk_08 = 0;
} }
} }
case 1: case 1:
if (--playerStatus->currentStateTime == 0) { if (--playerStatus->currentStateTime == 0) {
suggest_player_anim_clearUnkFlag(0xC0025); suggest_player_anim_clearUnkFlag(ANIM_Peach_C0025);
playerStatus->fallState = 2; playerStatus->actionSubstate = 2;
if (parasolStruct->npc == NULL) { if (parasolStruct->npc == NULL) {
playerStatus->fallState = 0x28; playerStatus->actionSubstate = 0x28;
} else { } else {
set_time_freeze_mode(TIME_FREEZE_FULL); set_time_freeze_mode(TIME_FREEZE_FULL);
} }
@ -124,7 +124,7 @@ void func_802B6120_E2A7D0(void) {
if (playerStatus->unk_BC != 0) { if (playerStatus->unk_BC != 0) {
playerStatus->currentStateTime = 12; playerStatus->currentStateTime = 12;
playerStatus->flags |= 0x100000; playerStatus->flags |= 0x100000;
playerStatus->fallState++; playerStatus->actionSubstate++;
sfx_play_sound_at_player(SOUND_FD, 0); sfx_play_sound_at_player(SOUND_FD, 0);
} }
break; break;
@ -132,7 +132,7 @@ void func_802B6120_E2A7D0(void) {
if (--playerStatus->currentStateTime == 0) { if (--playerStatus->currentStateTime == 0) {
playerStatus->currentStateTime = 10; playerStatus->currentStateTime = 10;
parasolStruct->unk_0C = 0xA; parasolStruct->unk_0C = 0xA;
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
func_802B6CF0_E2B3A0(); func_802B6CF0_E2B3A0();
break; break;
@ -151,10 +151,10 @@ void func_802B6120_E2A7D0(void) {
phi_v0 = 1; phi_v0 = 1;
} }
if (phi_v0 != 0) { if (phi_v0 != 0) {
playerStatus->fallState = 6; playerStatus->actionSubstate = 6;
playerStatus->currentStateTime = 2; playerStatus->currentStateTime = 2;
if (peach_make_disguise_npc(playerStatus->unk_0D) != 0) { if (peach_make_disguise_npc(playerStatus->unk_0D) != 0) {
playerStatus->fallState = 5; playerStatus->actionSubstate = 5;
peach_sync_disguise_npc(); peach_sync_disguise_npc();
} }
} }
@ -166,10 +166,10 @@ void func_802B6120_E2A7D0(void) {
gameStatus = gGameStatusPtr; gameStatus = gGameStatusPtr;
playerStatus->animFlags |= 0x2000; playerStatus->animFlags |= 0x2000;
gameStatus->peachFlags |= 2; gameStatus->peachFlags |= 2;
playerStatus->fallState++; playerStatus->actionSubstate++;
case 6: case 6:
if (--playerStatus->currentStateTime == 0) { if (--playerStatus->currentStateTime == 0) {
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
func_802B6CF0_E2B3A0(); func_802B6CF0_E2B3A0();
break; break;
@ -179,7 +179,7 @@ void func_802B6120_E2A7D0(void) {
if (parasolStruct->unk_20 <= 0) { if (parasolStruct->unk_20 <= 0) {
parasolStruct->unk_20 = 0; parasolStruct->unk_20 = 0;
playerStatus->currentStateTime = 10; playerStatus->currentStateTime = 10;
playerStatus->fallState++; playerStatus->actionSubstate++;
playerStatus->spriteFacingAngle = 180; playerStatus->spriteFacingAngle = 180;
temp_v0 = get_npc_by_index(D_8010C96C); temp_v0 = get_npc_by_index(D_8010C96C);
temp_v0->isFacingAway = 1; temp_v0->isFacingAway = 1;
@ -194,7 +194,7 @@ void func_802B6120_E2A7D0(void) {
parasolStruct->unk_20 = 0; parasolStruct->unk_20 = 0;
playerStatus->currentStateTime = 10; playerStatus->currentStateTime = 10;
playerStatus->spriteFacingAngle = 0; playerStatus->spriteFacingAngle = 0;
playerStatus->fallState++; playerStatus->actionSubstate++;
temp_v0 = get_npc_by_index(D_8010C96C); temp_v0 = get_npc_by_index(D_8010C96C);
temp_v0->isFacingAway = 0; temp_v0->isFacingAway = 0;
temp_f0_3 = clamp_angle((cam->currentYaw - playerStatus->spriteFacingAngle) - 90); temp_f0_3 = clamp_angle((cam->currentYaw - playerStatus->spriteFacingAngle) - 90);
@ -221,7 +221,7 @@ void func_802B6120_E2A7D0(void) {
break; break;
case 20: case 20:
if (--playerStatus->currentStateTime == 0) { if (--playerStatus->currentStateTime == 0) {
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
func_802B6CF0_E2B3A0(); func_802B6CF0_E2B3A0();
playerStatus->targetYaw = clamp_angle(cam->currentYaw - playerStatus->spriteFacingAngle - 90); playerStatus->targetYaw = clamp_angle(cam->currentYaw - playerStatus->spriteFacingAngle - 90);
@ -242,7 +242,7 @@ void func_802B6120_E2A7D0(void) {
} }
if (phi_v0_2 != 0) { if (phi_v0_2 != 0) {
playerStatus->currentStateTime = 2; playerStatus->currentStateTime = 2;
playerStatus->fallState++; playerStatus->actionSubstate++;
gameStatus2 = gGameStatusPtr; gameStatus2 = gGameStatusPtr;
playerStatus->animFlags &= -0x2001; playerStatus->animFlags &= -0x2001;
gameStatus2->peachFlags &= 0xFD; gameStatus2->peachFlags &= 0xFD;
@ -257,7 +257,7 @@ void func_802B6120_E2A7D0(void) {
break; break;
case 22: case 22:
if (--playerStatus->currentStateTime == 0) { if (--playerStatus->currentStateTime == 0) {
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
func_802B6CF0_E2B3A0(); func_802B6CF0_E2B3A0();
break; break;
@ -267,12 +267,12 @@ void func_802B6120_E2A7D0(void) {
if (parasolStruct->unk_20 <= 0) { if (parasolStruct->unk_20 <= 0) {
parasolStruct->unk_20 = 0; parasolStruct->unk_20 = 0;
playerStatus->currentStateTime = 10; playerStatus->currentStateTime = 10;
playerStatus->fallState++; playerStatus->actionSubstate++;
playerStatus->spriteFacingAngle = 180; playerStatus->spriteFacingAngle = 180;
D_8010C95C = 1; PrevPlayerDirection = 1;
phi_f12 = (cam->currentYaw - 180) - 90; phi_f12 = (cam->currentYaw - 180) - 90;
temp_f0_3 = clamp_angle((cam->currentYaw - 180) - 90); temp_f0_3 = clamp_angle((cam->currentYaw - 180) - 90);
D_800F7B40 = temp_f0_3; PrevPlayerCamRelativeYaw = temp_f0_3;
playerStatus->currentYaw = temp_f0_3; playerStatus->currentYaw = temp_f0_3;
} }
} else { } else {
@ -281,11 +281,11 @@ void func_802B6120_E2A7D0(void) {
parasolStruct->unk_20 = 0; parasolStruct->unk_20 = 0;
playerStatus->currentStateTime = 10; playerStatus->currentStateTime = 10;
playerStatus->spriteFacingAngle = 0; playerStatus->spriteFacingAngle = 0;
playerStatus->fallState++; playerStatus->actionSubstate++;
D_8010C95C = 0; PrevPlayerDirection = 0;
phi_f12 = (cam->currentYaw - 0) - 90; phi_f12 = (cam->currentYaw - 0) - 90;
temp_f0_3 = clamp_angle(phi_f12); temp_f0_3 = clamp_angle(phi_f12);
D_800F7B40 = temp_f0_3; PrevPlayerCamRelativeYaw = temp_f0_3;
playerStatus->currentYaw = temp_f0_3; playerStatus->currentYaw = temp_f0_3;
} }
} }

View File

@ -6,25 +6,43 @@ extern s32 gSpinHistoryPosY[5];
extern s32 gSpinHistoryPosX[5]; extern s32 gSpinHistoryPosX[5];
extern s32 gSpinHistoryPosZ[5]; extern s32 gSpinHistoryPosZ[5];
extern s16 gSpinHistoryPosAngle[5]; extern s16 gSpinHistoryPosAngle[5];
void phys_clear_spin_history(void); void phys_clear_spin_history(void);
void func_802B6000_E25D60(void) { enum {
SUBSTATE_SPIN_0 = 0,
SUBSTATE_SPIN_1 = 1,
SUBSTATE_SPIN_2 = 2,
SUBSTATE_SPIN_3 = 3,
};
enum SpinTypeFlag {
SPIN_TYPE_DEFAULT = 0,
SPIN_TYPE_SPEEDY = 1,
SPIN_TYPE_DIZZY = 2,
SPIN_TYPE_ATTACK = 4,
};
void action_update_spin(void) {
PlayerSpinState* playerSpinState = &gPlayerSpinState; PlayerSpinState* playerSpinState = &gPlayerSpinState;
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 sp10, sp14, temp_f24; f32 angle, magnitude, speedModifier;
s32 phi_s2, phi_s3, phi_s4;
s32 temp_v1_2;
s32 phi_s5 = 0;
s32 spinFlags, nonDizzyFlags;
s32 effectType;
AnimID anim;
s32 firstCall = FALSE;
// initialization
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_80000); playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_80000);
playerStatus->animFlags &= ~PLAYER_STATUS_ANIM_FLAGS_40000; playerStatus->animFlags &= ~PLAYER_STATUS_ANIM_FLAGS_40000;
playerStatus->animFlags |= PLAYER_STATUS_ANIM_FLAGS_SPINNING; playerStatus->animFlags |= PLAYER_STATUS_ANIM_FLAGS_SPINNING;
playerStatus->flags |= PLAYER_STATUS_FLAGS_20000; playerStatus->flags |= PLAYER_STATUS_FLAGS_20000;
playerStatus->currentStateTime = 0; playerStatus->currentStateTime = 0;
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_SPIN_0;
playerSpinState->stopSoundTimer = 0; playerSpinState->stopSoundTimer = 0;
playerSpinState->hasBufferedSpin = 0; playerSpinState->hasBufferedSpin = FALSE;
playerSpinState->spinDirectionMagnitude = 0.0f; playerSpinState->spinDirectionMagnitude = 0.0f;
playerSpinState->spinDirection.x = 0.0f; playerSpinState->spinDirection.x = 0.0f;
playerSpinState->spinDirection.y = 0.0f; playerSpinState->spinDirection.y = 0.0f;
@ -32,127 +50,128 @@ void func_802B6000_E25D60(void) {
playerSpinState->bufferedStickAxis.x = 0; playerSpinState->bufferedStickAxis.x = 0;
playerSpinState->bufferedStickAxis.y = 0; playerSpinState->bufferedStickAxis.y = 0;
playerSpinState->spinSoundID = 0; playerSpinState->spinSoundID = 0;
playerStatus->unk_D8 = NULL; playerStatus->specialDecorationEffect = NULL;
playerSpinState->initialSpinTime = 25; playerSpinState->initialSpinTime = 25;
playerSpinState->fullSpeedSpinTime = 15; playerSpinState->fullSpeedSpinTime = 15;
playerSpinState->spinRate = 40.0f; playerSpinState->spinRate = 40.0f;
playerSpinState->speedScale = 2.0f; playerSpinState->speedScale = 2.0f;
playerSpinState->frictionScale = 0.5f; playerSpinState->frictionScale = 0.5f;
playerSpinState->spinCountdown = playerSpinState->initialSpinTime; //was unk2D access? playerSpinState->spinCountdown = playerSpinState->initialSpinTime;
phi_s5 = 1; spinFlags = SPIN_TYPE_DEFAULT;
firstCall = TRUE;
if (is_ability_active(ABILITY_SPIN_ATTACK)) { if (is_ability_active(ABILITY_SPIN_ATTACK)) {
phi_s2 = 1 << 2; spinFlags |= SPIN_TYPE_ATTACK;
} else {
phi_s2 = 0;
} }
if (is_ability_active(ABILITY_DIZZY_ATTACK)) { if (is_ability_active(ABILITY_DIZZY_ATTACK)) {
phi_s2 = phi_s2 | 2; spinFlags |= SPIN_TYPE_DIZZY;
} }
if (is_ability_active(ABILITY_SPEEDY_SPIN)) { if (is_ability_active(ABILITY_SPEEDY_SPIN)) {
playerSpinState->initialSpinTime = 30; playerSpinState->initialSpinTime = 30;
playerSpinState->spinRate = 40.0f; playerSpinState->spinRate = 40.0f;
playerSpinState->fullSpeedSpinTime = 20; playerSpinState->fullSpeedSpinTime = 20;
playerSpinState->spinCountdown = playerSpinState->initialSpinTime; //was unk2D access? playerSpinState->spinCountdown = playerSpinState->initialSpinTime;
playerSpinState->speedScale = 2.7f; playerSpinState->speedScale = 2.7f;
playerSpinState->frictionScale = 0.9f; playerSpinState->frictionScale = 0.9f;
phi_s2 |= 1; spinFlags |= SPIN_TYPE_SPEEDY;
} }
phi_s4 = -1; effectType = -1;
phi_s3 = 0x10010; anim = ANIM_Mario_10010;
if (phi_s2) { if (spinFlags) {
if (phi_s2 & 4) { if (spinFlags & SPIN_TYPE_ATTACK) {
phi_s4 = 2; effectType = 2;
phi_s3 = 0x10012; anim = ANIM_Mario_Flailing;
} else if (phi_s2 & 2) { } else if (spinFlags & SPIN_TYPE_DIZZY) {
phi_s4 = 4; effectType = 4;
} else if (phi_s2 & 1) { anim = ANIM_Mario_10010;
phi_s4 = 0; } else if (spinFlags & SPIN_TYPE_SPEEDY) {
phi_s3 = 0x10011; effectType = 0;
anim = ANIM_Mario_Spinning;
} }
} }
playerSpinState->spinSoundID = SOUND_2111; playerSpinState->spinSoundID = SOUND_2111;
temp_v1_2 = phi_s2 & ~2; nonDizzyFlags = spinFlags & ~SPIN_TYPE_DIZZY;
if (temp_v1_2 == 4) { if (nonDizzyFlags == SPIN_TYPE_ATTACK) {
playerSpinState->spinSoundID = SOUND_2113; playerSpinState->spinSoundID = SOUND_2113;
} }
if (temp_v1_2 == 1) { if (nonDizzyFlags == SPIN_TYPE_SPEEDY) {
playerSpinState->spinSoundID = SOUND_2112; playerSpinState->spinSoundID = SOUND_2112;
} }
if (temp_v1_2 == 5) { if (nonDizzyFlags == (SPIN_TYPE_ATTACK | SPIN_TYPE_SPEEDY)) {
playerSpinState->spinSoundID = SOUND_2114; playerSpinState->spinSoundID = SOUND_2114;
} }
sfx_play_sound_at_player(playerSpinState->spinSoundID, 0); sfx_play_sound_at_player(playerSpinState->spinSoundID, 0);
suggest_player_anim_setUnkFlag(phi_s3); suggest_player_anim_setUnkFlag(anim);
if ((clamp_angle(playerStatus->targetYaw - gCameras[gCurrentCameraID].currentYaw) <= 180.0f)) { if ((clamp_angle(playerStatus->targetYaw - gCameras[gCurrentCameraID].currentYaw) <= 180.0f)) {
playerStatus->spinRate = playerSpinState->spinRate; playerStatus->spinRate = playerSpinState->spinRate;
} else { } else {
phi_s4++; effectType++;
playerStatus->spinRate = -playerSpinState->spinRate; playerStatus->spinRate = -playerSpinState->spinRate;
} }
if (phi_s2 != 0) { if (spinFlags != 0) {
playerStatus->unk_D8 = fx_46(phi_s4, playerStatus, 1.0f, 1000); playerStatus->specialDecorationEffect = fx_46(effectType, playerStatus, 1.0f, 1000);
} }
phys_clear_spin_history(); phys_clear_spin_history();
player_input_to_move_vector(&sp10, &sp14); player_input_to_move_vector(&angle, &magnitude);
playerStatus->targetYaw = sp10; playerStatus->targetYaw = angle;
playerSpinState->inputMagnitude = sp14; playerSpinState->inputMagnitude = magnitude;
} }
// update saved position and rotation values for motion blur effect
gSpinHistoryPosAngle[gSpinHistoryBufferPos++] = playerStatus->spriteFacingAngle; gSpinHistoryPosAngle[gSpinHistoryBufferPos++] = playerStatus->spriteFacingAngle;
if (gSpinHistoryBufferPos > ARRAY_COUNT(gSpinHistoryPosX)) {
if (gSpinHistoryBufferPos >= 6) {
gSpinHistoryBufferPos = 0; gSpinHistoryBufferPos = 0;
} }
gSpinHistoryPosX[gSpinHistoryBufferPos] = playerStatus->position.x; gSpinHistoryPosX[gSpinHistoryBufferPos] = playerStatus->position.x;
gSpinHistoryPosY[gSpinHistoryBufferPos] = playerStatus->position.y; gSpinHistoryPosY[gSpinHistoryBufferPos] = playerStatus->position.y;
gSpinHistoryPosZ[gSpinHistoryBufferPos] = playerStatus->position.z; gSpinHistoryPosZ[gSpinHistoryBufferPos] = playerStatus->position.z;
gSpinHistoryPosAngle[gSpinHistoryBufferPos] = playerStatus->spriteFacingAngle; gSpinHistoryPosAngle[gSpinHistoryBufferPos] = playerStatus->spriteFacingAngle;
gSpinHistoryBufferPos++; gSpinHistoryBufferPos++;
if (gSpinHistoryBufferPos > ARRAY_COUNT(gSpinHistoryPosX)) {
if (gSpinHistoryBufferPos >= 6) {
gSpinHistoryBufferPos = 0; gSpinHistoryBufferPos = 0;
} }
if (phi_s5 == 0 && (check_input_hammer() || check_input_jump())) { // check for spin cancel
if (!firstCall && (check_input_hammer() || check_input_jump())) {
playerStatus->animFlags &= ~PLAYER_STATUS_ANIM_FLAGS_SPINNING; playerStatus->animFlags &= ~PLAYER_STATUS_ANIM_FLAGS_SPINNING;
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_20000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_20000;
sfx_stop_sound(playerSpinState->spinSoundID); sfx_stop_sound(playerSpinState->spinSoundID);
player_input_to_move_vector(&sp10, &sp14); player_input_to_move_vector(&angle, &magnitude);
playerStatus->targetYaw = sp10; playerStatus->targetYaw = angle;
return; return;
} }
if (playerSpinState->spinCountdown < 11 && playerStatus->pressedButtons & Z_TRIG) { // check for buffered next spin
playerSpinState->hasBufferedSpin = 1; if (playerSpinState->spinCountdown < 11 && playerStatus->pressedButtons & BUTTON_Z) {
playerSpinState->hasBufferedSpin = TRUE;
playerSpinState->prevActionState = playerStatus->prevActionState; playerSpinState->prevActionState = playerStatus->prevActionState;
playerSpinState->bufferedStickAxis.x = playerStatus->stickAxis[0]; playerSpinState->bufferedStickAxis.x = playerStatus->stickAxis[0];
playerSpinState->bufferedStickAxis.y = playerStatus->stickAxis[1]; playerSpinState->bufferedStickAxis.y = playerStatus->stickAxis[1];
} }
if (playerStatus->fallState >= 2) { // check for action finished
playerSpinState->spinDirectionMagnitude = playerSpinState->spinDirectionMagnitude - 1.0f;; if (playerStatus->actionSubstate >= SUBSTATE_SPIN_2) {
playerSpinState->spinDirectionMagnitude -= 1.0f;
if (playerSpinState->spinDirectionMagnitude < 0.0f) { if (playerSpinState->spinDirectionMagnitude < 0.0f) {
playerSpinState->spinDirectionMagnitude = 0.0f; playerSpinState->spinDirectionMagnitude = 0.0f;
} }
sp10 = clamp_angle(playerStatus->targetYaw - gCameras[gCurrentCameraID].currentYaw); angle = clamp_angle(playerStatus->targetYaw - gCameras[gCurrentCameraID].currentYaw);
playerSpinState->spinDirection.x = sin_rad(sp10 * TAU / 360.0f) * playerSpinState->spinDirectionMagnitude; playerSpinState->spinDirection.x = sin_rad(angle * TAU / 360.0f) * playerSpinState->spinDirectionMagnitude;
playerSpinState->spinDirection.y = -cos_rad((sp10 * TAU) / 360.0f) * playerSpinState->spinDirectionMagnitude; playerSpinState->spinDirection.y = -cos_rad((angle * TAU) / 360.0f) * playerSpinState->spinDirectionMagnitude;
playerStatus->currentStateTime--; playerStatus->currentStateTime--;
if ((playerStatus->currentStateTime) == 0) { if ((playerStatus->currentStateTime) == 0) {
playerSpinState->stopSoundTimer = 4; playerSpinState->stopSoundTimer = 4;
set_action_state(0); set_action_state(ACTION_STATE_IDLE);
playerStatus->flags &= ~PLAYER_STATUS_ANIM_FLAGS_20000; playerStatus->flags &= ~PLAYER_STATUS_ANIM_FLAGS_20000;
playerStatus->animFlags &= ~PLAYER_STATUS_ANIM_FLAGS_SPINNING; playerStatus->animFlags &= ~PLAYER_STATUS_ANIM_FLAGS_SPINNING;
sfx_stop_sound(playerSpinState->spinSoundID); sfx_stop_sound(playerSpinState->spinSoundID);
@ -161,36 +180,36 @@ void func_802B6000_E25D60(void) {
return; return;
} }
if (playerStatus->fallState == 0) { if (playerStatus->actionSubstate == SUBSTATE_SPIN_0) {
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_40000) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_40000) {
playerStatus->fallState = 1; playerStatus->actionSubstate = SUBSTATE_SPIN_1;
} else if (gCollisionStatus.pushingAgainstWall >= 0) { } else if (gCollisionStatus.pushingAgainstWall >= 0) {
playerSpinState->hitWallTime++; playerSpinState->hitWallTime++;
if (playerSpinState->hitWallTime >= 10) { if (playerSpinState->hitWallTime >= 10) {
playerStatus->fallState = 1; playerStatus->actionSubstate = SUBSTATE_SPIN_1;
} }
} }
} }
if (!(playerStatus->currentStateTime > playerSpinState->fullSpeedSpinTime)) { if (!(playerStatus->currentStateTime > playerSpinState->fullSpeedSpinTime)) {
temp_f24 = (playerSpinState->inputMagnitude) ? playerSpinState->speedScale : 0.0f; speedModifier = (playerSpinState->inputMagnitude) ? playerSpinState->speedScale : 0.0f;
playerSpinState->spinDirectionMagnitude = playerSpinState->spinDirectionMagnitude + 0.9; playerSpinState->spinDirectionMagnitude = playerSpinState->spinDirectionMagnitude + 0.9;
if (playerSpinState->spinDirectionMagnitude > 9.0f) { if (playerSpinState->spinDirectionMagnitude > 9.0f) {
playerSpinState->spinDirectionMagnitude = 9.0f; playerSpinState->spinDirectionMagnitude = 9.0f;
} }
sp10 = clamp_angle(playerStatus->targetYaw - gCameras[gCurrentCameraID].currentYaw); angle = clamp_angle(playerStatus->targetYaw - gCameras[gCurrentCameraID].currentYaw);
playerSpinState->spinDirection.x = sin_rad(sp10 * TAU / 360.0f) * playerSpinState->spinDirectionMagnitude; playerSpinState->spinDirection.x = sin_rad(angle * TAU / 360.0f) * playerSpinState->spinDirectionMagnitude;
playerSpinState->spinDirection.y = -cos_rad(sp10 * TAU / 360.0f) * playerSpinState->spinDirectionMagnitude; playerSpinState->spinDirection.y = -cos_rad(angle * TAU / 360.0f) * playerSpinState->spinDirectionMagnitude;
} else { } else {
temp_f24 = playerSpinState->speedScale - (playerStatus->currentStateTime - playerSpinState->fullSpeedSpinTime - 1) * playerSpinState->frictionScale; speedModifier = playerSpinState->speedScale - (playerStatus->currentStateTime - playerSpinState->fullSpeedSpinTime - 1) * playerSpinState->frictionScale;
if (temp_f24 < 0.1) { if (speedModifier < 0.1) {
temp_f24 = 0.1f; speedModifier = 0.1f;
} }
if (playerSpinState->inputMagnitude == 0.0f) { if (playerSpinState->inputMagnitude == 0.0f) {
temp_f24 = 0.0f; speedModifier = 0.0f;
} }
playerSpinState->spinDirectionMagnitude -= 1.0f; playerSpinState->spinDirectionMagnitude -= 1.0f;
@ -202,22 +221,22 @@ void func_802B6000_E25D60(void) {
playerStatus->currentStateTime++; playerStatus->currentStateTime++;
switch (playerStatus->prevActionState) { switch (playerStatus->prevActionState) {
case 0: case ACTION_STATE_IDLE:
player_input_to_move_vector(&sp10, &sp14); player_input_to_move_vector(&angle, &magnitude);
phys_update_interact_collider(); phys_update_interact_collider();
if (check_input_jump()) { if (check_input_jump()) {
if (sp14 != 0.0f || playerStatus->targetYaw != sp10) { if (magnitude != 0.0f || playerStatus->targetYaw != angle) {
playerStatus->targetYaw = sp10; playerStatus->targetYaw = angle;
} }
} }
playerStatus->currentSpeed = (sp14 != 0.0f) ? playerStatus->runSpeed * temp_f24 : 0.0f; playerStatus->currentSpeed = (magnitude != 0.0f) ? playerStatus->runSpeed * speedModifier : 0.0f;
break; break;
case 1: case ACTION_STATE_WALK:
case 2: case ACTION_STATE_RUN:
playerStatus->currentSpeed = playerStatus->runSpeed * temp_f24; playerStatus->currentSpeed = playerStatus->runSpeed * speedModifier;
break; break;
} }
if (playerStatus->fallState == 0) { if (playerStatus->actionSubstate == SUBSTATE_SPIN_0) {
playerSpinState->spinCountdown--; playerSpinState->spinCountdown--;
if (playerSpinState->spinCountdown > 0) { if (playerSpinState->spinCountdown > 0) {
if (playerStatus->currentStateTime >= 2) { if (playerStatus->currentStateTime >= 2) {
@ -225,33 +244,33 @@ void func_802B6000_E25D60(void) {
} }
return; return;
} else { } else {
playerStatus->fallState = 1; playerStatus->actionSubstate = SUBSTATE_SPIN_1;
} }
} }
if (playerStatus->fallState == 1) { if (playerStatus->actionSubstate == SUBSTATE_SPIN_1) {
sp10 = playerStatus->spriteFacingAngle; angle = playerStatus->spriteFacingAngle;
playerStatus->spriteFacingAngle = sp10 + playerStatus->spinRate; playerStatus->spriteFacingAngle = angle + playerStatus->spinRate;
if (playerSpinState->hasBufferedSpin != 0) { if (playerSpinState->hasBufferedSpin) {
playerStatus->currentStateTime = 2; playerStatus->currentStateTime = 2;
playerStatus->fallState = 2; playerStatus->actionSubstate = SUBSTATE_SPIN_2;
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_20000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_20000;
suggest_player_anim_clearUnkFlag(0x10002); suggest_player_anim_clearUnkFlag(ANIM_Mario_10002);
} else if (sp10 < playerStatus->spriteFacingAngle) { } else if (angle < playerStatus->spriteFacingAngle) {
if (playerStatus->spriteFacingAngle >= 180.0f && sp10 < 180.0f) { if (playerStatus->spriteFacingAngle >= 180.0f && angle < 180.0f) {
playerStatus->spriteFacingAngle = 180.0f; playerStatus->spriteFacingAngle = 180.0f;
playerStatus->currentStateTime = 2; playerStatus->currentStateTime = 2;
playerStatus->fallState = 2; playerStatus->actionSubstate = SUBSTATE_SPIN_2;
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_20000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_20000;
suggest_player_anim_clearUnkFlag(0x10002); suggest_player_anim_clearUnkFlag(ANIM_Mario_10002);
} }
} else if (playerStatus->spriteFacingAngle <= 0.0f && sp10 < 90.0f) { } else if (playerStatus->spriteFacingAngle <= 0.0f && angle < 90.0f) {
playerStatus->spriteFacingAngle = 0.0f; playerStatus->spriteFacingAngle = 0.0f;
playerStatus->currentStateTime = 2; playerStatus->currentStateTime = 2;
playerStatus->fallState = 2; playerStatus->actionSubstate = SUBSTATE_SPIN_2;
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_20000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_20000;
suggest_player_anim_clearUnkFlag(0x10002); suggest_player_anim_clearUnkFlag(ANIM_Mario_10002);
} }
playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle); playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle);
} }

View File

@ -1,40 +1,52 @@
#include "common.h" #include "common.h"
extern f32 D_802B6730; enum {
SUBSTATE_SPIN = 0,
SUBSTATE_RISE = 2,
SUBSTATE_HOVER = 3,
SUBSTATE_DESCEND = 4,
SUBSTATE_IMPACT = 5,
SUBSTATE_HOLD = 6,
SUBSTATE_ABORT = 7,
SUBSTATE_HIT_SWITCH = 11,
SUBSTATE_DONE_SWITCH = 12
};
s32 func_802B6648_E27428(void); static s32 get_collider_below_spin_jump(void);
void func_802B6000_E26DE0(void) { void action_update_spin_jump(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
CollisionStatus* collisionStatus = &gCollisionStatus; CollisionStatus* collisionStatus = &gCollisionStatus;
Entity* entity;
HiddenPanelsData* panels; HiddenPanelsData* panels;
s32 sp10; Entity* entity;
s32 tempCondition; s32 belowColliderID;
f32 temp_f20; s32 landed;
f32 velocity;
u32 entityType; u32 entityType;
u8 colliderType; s32 surfaceType;
static f32 RotationRate;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_JUMPING | PLAYER_STATUS_FLAGS_FALLING); playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED | PLAYER_STATUS_FLAGS_JUMPING | PLAYER_STATUS_FLAGS_FALLING);
playerStatus->flags |= (PLAYER_STATUS_FLAGS_JUMPING | PLAYER_STATUS_FLAGS_FLYING); playerStatus->flags |= (PLAYER_STATUS_FLAGS_JUMPING | PLAYER_STATUS_FLAGS_FLYING);
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_SPIN;
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
D_802B6730 = 0.0f; RotationRate = 0.0f;
playerStatus->gravityIntegrator[0] = 5.2f; playerStatus->gravityIntegrator[0] = 5.2f;
suggest_player_anim_clearUnkFlag(0x1000A); suggest_player_anim_clearUnkFlag(ANIM_Mario_1000A);
disable_player_input(); disable_player_input();
playerStatus->flags |= PLAYER_STATUS_FLAGS_200; playerStatus->flags |= PLAYER_STATUS_FLAGS_200;
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1; gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1;
sfx_play_sound_at_player(SOUND_146, 0); sfx_play_sound_at_player(SOUND_SPIN_JUMP, 0);
} }
tempCondition = 0; landed = FALSE;
switch (playerStatus->fallState) { switch (playerStatus->actionSubstate) {
case 0: case SUBSTATE_SPIN:
D_802B6730 = 40.0f; RotationRate = 40.0f;
playerStatus->pitch += 40.0f; playerStatus->pitch += RotationRate;
if (playerStatus->pitch >= 360.0f) { if (playerStatus->pitch >= 360.0f) {
playerStatus->pitch = 360.0f; playerStatus->pitch = 360.0f;
} }
@ -52,13 +64,13 @@ void func_802B6000_E26DE0(void) {
if (playerStatus->pitch == 360.0f) { if (playerStatus->pitch == 360.0f) {
if (playerStatus->gravityIntegrator[0] <= 0.0f) { if (playerStatus->gravityIntegrator[0] <= 0.0f) {
playerStatus->currentStateTime = 5; playerStatus->currentStateTime = 5;
playerStatus->fallState = 2; playerStatus->actionSubstate = SUBSTATE_RISE;
playerStatus->gravityIntegrator[0] = 2.0f; playerStatus->gravityIntegrator[0] = 2.0f;
} }
} }
collisionStatus->currentCeiling = -1; collisionStatus->currentCeiling = -1;
break; break;
case 2: case SUBSTATE_RISE:
if (playerStatus->gravityIntegrator[0] >= 0.0f) { if (playerStatus->gravityIntegrator[0] >= 0.0f) {
playerStatus->gravityIntegrator[0] -= 1.4; playerStatus->gravityIntegrator[0] -= 1.4;
if (collisionStatus->currentCeiling < 0) { if (collisionStatus->currentCeiling < 0) {
@ -66,65 +78,65 @@ void func_802B6000_E26DE0(void) {
} }
} }
if (--playerStatus->currentStateTime <= 0) { if (--playerStatus->currentStateTime <= 0) {
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
break; break;
case 3: case SUBSTATE_HOVER:
playerStatus->position.y = player_check_collision_below(0.0f, &sp10); playerStatus->position.y = player_check_collision_below(0.0f, &belowColliderID);
D_802B6730 = 45.0f; RotationRate = 45.0f;
playerStatus->pitch += 45.0f; playerStatus->pitch += RotationRate;
if (playerStatus->pitch >= 360.0) { if (playerStatus->pitch >= 360.0) {
playerStatus->pitch = 0.0f; playerStatus->pitch = 0.0f;
playerStatus->fallState++; playerStatus->actionSubstate++;
playerStatus->gravityIntegrator[1] = -3.4744f; playerStatus->gravityIntegrator[1] = -3.4744f;
playerStatus->gravityIntegrator[2] = 0.4704f; playerStatus->gravityIntegrator[2] = 0.4704f;
playerStatus->gravityIntegrator[3] = -1.1904f; playerStatus->gravityIntegrator[3] = -1.1904f;
playerStatus->gravityIntegrator[0] = playerStatus->gravityIntegrator[1]; playerStatus->gravityIntegrator[0] = playerStatus->gravityIntegrator[1];
suggest_player_anim_clearUnkFlag(0x1000B); suggest_player_anim_clearUnkFlag(ANIM_Mario_1000B);
} }
break; break;
case 4: case SUBSTATE_DESCEND:
temp_f20 = func_800E34D8(); velocity = func_800E34D8();
playerStatus->position.y = player_check_collision_below(temp_f20, &sp10); playerStatus->position.y = player_check_collision_below(velocity, &belowColliderID);
if (temp_f20 < -100.0f) { if (velocity < -100.0f) {
playerStatus->gravityIntegrator[3] = 0.0f; playerStatus->gravityIntegrator[3] = 0.0f;
playerStatus->gravityIntegrator[2] = 0.0f; playerStatus->gravityIntegrator[2] = 0.0f;
playerStatus->gravityIntegrator[1] = 0.0f; playerStatus->gravityIntegrator[1] = 0.0f;
playerStatus->gravityIntegrator[0] = -100.0f; playerStatus->gravityIntegrator[0] = -100.0f;
} }
if (sp10 >= 0) { if (belowColliderID >= 0) {
if (collisionStatus->currentFloor & COLLISION_WITH_ENTITY_BIT && (entityType = get_entity_type(collisionStatus->currentFloor), if (collisionStatus->currentFloor & COLLISION_WITH_ENTITY_BIT && (entityType = get_entity_type(collisionStatus->currentFloor),
entityType == ENTITY_TYPE_RED_SWITCH || entityType == ENTITY_TYPE_BLUE_SWITCH)) { entityType == ENTITY_TYPE_RED_SWITCH || entityType == ENTITY_TYPE_BLUE_SWITCH)) {
get_entity_by_index(collisionStatus->currentFloor)->collisionFlags |= ENTITY_COLLISION_PLAYER_TOUCH_FLOOR; get_entity_by_index(collisionStatus->currentFloor)->collisionFlags |= ENTITY_COLLISION_PLAYER_TOUCH_FLOOR;
playerStatus->fallState = 0xB; playerStatus->actionSubstate = SUBSTATE_HIT_SWITCH;
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_FLYING; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_FLYING;
break; break;
} else { } else {
colliderType = get_collider_type_by_id(sp10); surfaceType = get_collider_flags(belowColliderID) & COLLIDER_FLAGS_SURFACE_TYPE_MASK;
if (colliderType == 3) { if (surfaceType == SURFACE_TYPE_LAVA) {
playerStatus->unk_BF = 1; playerStatus->hazardType = HAZARD_TYPE_LAVA;
set_action_state(ACTION_STATE_HIT_LAVA); set_action_state(ACTION_STATE_HIT_LAVA);
playerStatus->flags |= PLAYER_STATUS_FLAGS_800; playerStatus->flags |= PLAYER_STATUS_FLAGS_800;
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_FLYING; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_FLYING;
return; return;
} else if (colliderType == 2) { } else if (surfaceType == SURFACE_TYPE_SPIKES) {
set_action_state(ACTION_STATE_HIT_LAVA); set_action_state(ACTION_STATE_HIT_LAVA);
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_FLYING; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_FLYING;
return; return;
} else { } else {
playerStatus->gravityIntegrator[1] = -3.4744f; playerStatus->gravityIntegrator[1] = -3.4744f;
playerStatus->gravityIntegrator[2] = 0.4704f; playerStatus->gravityIntegrator[2] = 0.4704f;
playerStatus->gravityIntegrator[3] = -1.1904f; playerStatus->gravityIntegrator[3] = -1.1904f;
playerStatus->gravityIntegrator[0] = 10.0f; playerStatus->gravityIntegrator[0] = 10.0f;
suggest_player_anim_clearUnkFlag(0x1000B); suggest_player_anim_clearUnkFlag(ANIM_Mario_1000B);
playerStatus->actionState = ACTION_STATE_GROUND_POUND; playerStatus->actionState = ACTION_STATE_SPIN_POUND;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_280 = 0xC; playerStatus->poundImpactDelay = 12;
playerStatus->pitch = 0.0f; playerStatus->pitch = 0.0f;
playerStatus->fallState++; playerStatus->actionSubstate++;
exec_ShakeCam1(0, 0, 4); exec_ShakeCam1(0, 0, 4);
sfx_play_sound_at_player(SOUND_149, 0); sfx_play_sound_at_player(SOUND_149, 0);
start_rumble(0x80, 0x19); start_rumble(128, 25);
panels = &gCurrentHiddenPanels; panels = &gCurrentHiddenPanels;
panels->tryFlipTrigger = TRUE; panels->tryFlipTrigger = TRUE;
panels->flipTriggerPosY = playerStatus->position.y; panels->flipTriggerPosY = playerStatus->position.y;
@ -133,70 +145,65 @@ void func_802B6000_E26DE0(void) {
} }
} }
break; break;
case 5: case SUBSTATE_IMPACT:
temp_f20 = integrate_gravity(); velocity = integrate_gravity();
if (temp_f20 == 0.0f) { if (velocity == 0.0f) {
tempCondition = 1; landed = TRUE;
} else { } else {
if (playerStatus->gravityIntegrator[0] > 0.0f) { if (playerStatus->gravityIntegrator[0] > 0.0f) {
playerStatus->position.y += temp_f20; playerStatus->position.y += velocity;
} else { } else {
playerStatus->position.y = player_check_collision_below(temp_f20, &sp10); playerStatus->position.y = player_check_collision_below(velocity, &belowColliderID);
if (playerStatus->gravityIntegrator[0] < 0.0f && sp10 >= 0) { if (playerStatus->gravityIntegrator[0] < 0.0f && belowColliderID >= 0) {
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
} }
playerStatus->position.y = player_check_collision_below(0.0f, &sp10); playerStatus->position.y = player_check_collision_below(0.0f, &belowColliderID);
} }
break; break;
case 6: case SUBSTATE_HOLD:
playerStatus->position.y = player_check_collision_below(0.0f, &sp10); playerStatus->position.y = player_check_collision_below(0.0f, &belowColliderID);
if (sp10 >= 0) { if (belowColliderID >= 0) {
playerStatus->gravityIntegrator[0] = 0.0f; playerStatus->gravityIntegrator[0] = 0.0f;
playerStatus->gravityIntegrator[1] = 0.0f; playerStatus->gravityIntegrator[1] = 0.0f;
playerStatus->gravityIntegrator[2] = 0.0f; playerStatus->gravityIntegrator[2] = 0.0f;
playerStatus->gravityIntegrator[3] = 0.0f; playerStatus->gravityIntegrator[3] = 0.0f;
} }
case 7: // fallthrough
if (--playerStatus->unk_280 <= 0) { case SUBSTATE_ABORT:
tempCondition = 1; if (--playerStatus->poundImpactDelay <= 0) {
landed = TRUE;
} }
break; break;
case 11: case SUBSTATE_HIT_SWITCH:
set_action_state(ACTION_STATE_LANDING_ON_SWITCH); set_action_state(ACTION_STATE_LANDING_ON_SWITCH);
playerStatus->fallState++; playerStatus->actionSubstate++;
enable_player_input(); enable_player_input();
break; break;
case 12: case SUBSTATE_DONE_SWITCH:
break; break;
} }
if (tempCondition != 0) { if (landed) {
set_action_state(ACTION_STATE_LAND); set_action_state(ACTION_STATE_LAND);
playerStatus->flags &= ~0x8; playerStatus->flags &= ~PLAYER_STATUS_ANIM_FLAGS_8;
} }
if (playerStatus->gravityIntegrator[0] < 0.0f) { if (playerStatus->gravityIntegrator[0] < 0.0f) {
sp10 = func_802B6648_E27428(); belowColliderID = get_collider_below_spin_jump();
if (sp10 >= 0) { if (belowColliderID >= 0) {
collisionStatus->lastTouchedFloor = -1; collisionStatus->lastTouchedFloor = -1;
collisionStatus->currentFloor = sp10; collisionStatus->currentFloor = belowColliderID;
} }
} }
} }
s32 func_802B6648_E27428(void) { static s32 get_collider_below_spin_jump(void) {
f32 sp28; f32 posX, posY, posZ, height;
f32 sp2C; f32 hitRx, hitRz, hitDirX, hitDirZ;
f32 sp30;
f32 sp34;
f32 sp38;
f32 sp3C;
f32 sp40;
f32 sp44;
sp28 = gPlayerStatus.position.x; posX = gPlayerStatus.position.x;
sp34 = gPlayerStatus.colliderHeight; posZ = gPlayerStatus.position.z;
sp30 = gPlayerStatus.position.z; height = gPlayerStatus.colliderHeight;
sp2C = gPlayerStatus.position.y + (sp34 * 0.5f); posY = gPlayerStatus.position.y + (height * 0.5f);
return player_raycast_below_cam_relative(&gPlayerStatus, &sp28, &sp2C, &sp30, &sp34, &sp38, &sp3C, &sp40, &sp44); return player_raycast_below_cam_relative(&gPlayerStatus, &posX, &posY, &posZ, &height, &hitRx, &hitRz, &hitDirX, &hitDirZ);
} }

View File

@ -1,51 +1,50 @@
#include "common.h" #include "common.h"
#include "world/actions.h" #include "world/actions.h"
s32 State18PeachAnims[] = { AnimID StepUpPeachAnims[] = {
0x000A0002, // none ANIM_Peach_A0002, // none
0x000A002B, // cream ANIM_Peach_A002B, // cream
0x000A002D, // strawberry ANIM_Peach_A002D, // strawberry
0x000A002F, // butter ANIM_Peach_A002F, // butter
0x000A0031, // cleanser ANIM_Peach_A0031, // cleanser
0x000A0033, // water ANIM_Peach_A0033, // water
0x000A0035, // milk ANIM_Peach_A0035, // milk
0x000A0037, // flour ANIM_Peach_A0037, // flour
0x000A0039, // egg ANIM_Peach_A0039, // egg
0x000A003B, // complete cake ANIM_Peach_A003B, // complete cake
0x000A003D, // cake bowl ANIM_Peach_A003D, // cake bowl
0x000A003F, // cake mixed ANIM_Peach_A003F, // cake mixed
0x000A0041, // cake pan ANIM_Peach_A0041, // cake pan
0x000A0043, // cake batter ANIM_Peach_A0043, // cake batter
0x000A0045, // cake bare ANIM_Peach_A0045, // cake bare
0x000A0047, // salt ANIM_Peach_A0047, // salt
0x000A0049, // sugar ANIM_Peach_A0049, // sugar
0x000A004B, // cake with icing ANIM_Peach_A004B, // cake with icing
0x000A004D, // cake with berries ANIM_Peach_A004D, // cake with berries
0x00000000 0x00000000
}; };
void func_802B6000_E245D0(void) { void action_update_step_up(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 cosTheta; f32 cosTheta;
f32 sinTheta; f32 sinTheta;
s32 colliderID; s32 colliderID;
AnimID anim;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
phys_adjust_cam_on_landing(); phys_adjust_cam_on_landing();
if (!(playerStatus->animFlags & 0x1000)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS)) {
s32 temp; if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) {
anim = ANIM_Mario_Walking;
if (!(playerStatus->animFlags & 1)) {
temp = 0x10004;
} else { } else {
temp = 0x60000; anim = ANIM_Mario_60000;
} }
suggest_player_anim_clearUnkFlag(temp); suggest_player_anim_clearUnkFlag(anim);
} else { } else {
func_802B6198_E24768(); func_802B6198_E24768();
} }
playerStatus->fallState = 0; playerStatus->actionSubstate = 0;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->unk_C2 = 0; playerStatus->unk_C2 = 0;
playerStatus->gravityIntegrator[0] = 17.7566f; playerStatus->gravityIntegrator[0] = 17.7566f;
@ -76,23 +75,23 @@ void func_802B6000_E245D0(void) {
} }
void func_802B6198_E24768(void) { void func_802B6198_E24768(void) {
if (!(gPlayerStatus.animFlags & 0x2000)) { if (!(gPlayerStatus.animFlags & PLAYER_STATUS_ANIM_FLAGS_IN_DISGUISE)) {
if (!(gGameStatusPtr->peachFlags & 0x10)) { if (!(gGameStatusPtr->peachFlags & PEACH_STATUS_FLAG_HAS_INGREDIENT)) {
suggest_player_anim_clearUnkFlag((State18PeachAnims)[gGameStatusPtr->peachCookingIngredient]); suggest_player_anim_clearUnkFlag((StepUpPeachAnims)[gGameStatusPtr->peachCookingIngredient]);
} else { } else {
suggest_player_anim_clearUnkFlag(0xD000D); // doood suggest_player_anim_clearUnkFlag(ANIM_Peach_D000D);
} }
} else { } else {
peach_set_disguise_anim(BasicPeachDisguiseAnims[gPlayerStatus.peachDisguise].walk); peach_set_disguise_anim(BasicPeachDisguiseAnims[gPlayerStatus.peachDisguise].walk);
} }
} }
void func_802B6230_E24800(void) { void action_update_step_up_peach(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
suggest_player_anim_clearUnkFlag(0xA0005); suggest_player_anim_clearUnkFlag(ANIM_Peach_A0005);
playerStatus->currentStateTime = 8; playerStatus->currentStateTime = 8;
} }
@ -102,12 +101,12 @@ void func_802B6230_E24800(void) {
try_player_footstep_sounds(1); try_player_footstep_sounds(1);
} }
} else { } else {
if (!(playerStatus->flags & 0x4000)) { if (!(playerStatus->flags & PLAYER_STATUS_FLAGS_4000)) {
set_action_state(0); set_action_state(ACTION_STATE_IDLE);
} else if (playerStatus->currentSpeed >= playerStatus->runSpeed) { } else if (playerStatus->currentSpeed >= playerStatus->runSpeed) {
set_action_state(2); set_action_state(ACTION_STATE_RUN);
} else { } else {
set_action_state(1); set_action_state(ACTION_STATE_WALK);
} }
} }
} }

View File

@ -4,15 +4,27 @@ extern s32 gSpinHistoryBufferPos;
extern s32 gSpinHistoryPosY[5]; extern s32 gSpinHistoryPosY[5];
extern s16 gSpinHistoryPosAngle[5]; extern s16 gSpinHistoryPosAngle[5];
s32 func_802B65F8_E26D08(void); void phys_clear_spin_history(void);
void record_jump_apex(void);
void func_802B6000_E26710(void) { enum {
SUBSTATE_ASCEND = 0,
SUBSTATE_HOVER = 1,
SUBSTATE_DESCEND = 2,
SUBSTATE_IMPACT = 3,
SUBSTATE_HIT_SWITCH = 11,
SUBSTATE_DONE_SWITCH = 12,
};
static s32 get_collider_below_tornado_jump(void);
void action_update_tornado_jump(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
CollisionStatus* collisionStatus = &gCollisionStatus; CollisionStatus* collisionStatus = &gCollisionStatus;
f32 temp_f0; f32 cameraRelativeYaw;
f32 fallVelocity; f32 fallVelocity;
u8 colliderType; s32 surfaceType;
f32 phi_f4; f32 spinRate;
s32 colliderBelow; s32 colliderBelow;
u32 entityType; u32 entityType;
@ -20,24 +32,25 @@ void func_802B6000_E26710(void) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->flags |= (PLAYER_STATUS_FLAGS_20000 | PLAYER_STATUS_FLAGS_FLYING | PLAYER_STATUS_FLAGS_JUMPING); playerStatus->flags |= (PLAYER_STATUS_FLAGS_20000 | PLAYER_STATUS_FLAGS_FLYING | PLAYER_STATUS_FLAGS_JUMPING);
phys_clear_spin_history(); phys_clear_spin_history();
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_ASCEND;
playerStatus->currentSpeed = 0.0f; playerStatus->currentSpeed = 0.0f;
playerStatus->gravityIntegrator[0] = 16.0f; playerStatus->gravityIntegrator[0] = 16.0f;
playerStatus->gravityIntegrator[1] = -7.38624f; playerStatus->gravityIntegrator[1] = -7.38624f;
playerStatus->gravityIntegrator[2] = 3.44694f; playerStatus->gravityIntegrator[2] = 3.44694f;
playerStatus->gravityIntegrator[3] = -0.75f; playerStatus->gravityIntegrator[3] = -0.75f;
suggest_player_anim_setUnkFlag(0x80000); suggest_player_anim_setUnkFlag(ANIM_Mario_80000);
disable_player_input(); disable_player_input();
playerStatus->flags |= 0x200; playerStatus->flags |= PLAYER_STATUS_FLAGS_200;
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1; gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAGS_1;
temp_f0 = clamp_angle(playerStatus->targetYaw - gCameras[gCurrentCameraID].currentYaw); cameraRelativeYaw = clamp_angle(playerStatus->targetYaw - gCameras[gCurrentCameraID].currentYaw);
phi_f4 = -60.0f; if (cameraRelativeYaw <= 180.0f) {
if (temp_f0 <= 180.0f) { spinRate = 60.0f;
phi_f4 = 60.0f; } else {
spinRate = -60.0f;
} }
playerStatus->spinRate = phi_f4; playerStatus->spinRate = spinRate;
} }
if (playerStatus->fallState < 4) { if (playerStatus->actionSubstate <= SUBSTATE_IMPACT) {
if (playerStatus->spinRate >= 0.0f) { if (playerStatus->spinRate >= 0.0f) {
playerStatus->spriteFacingAngle += playerStatus->spinRate; playerStatus->spriteFacingAngle += playerStatus->spinRate;
if (playerStatus->spriteFacingAngle >= 360.0f) { if (playerStatus->spriteFacingAngle >= 360.0f) {
@ -60,8 +73,8 @@ void func_802B6000_E26710(void) {
gSpinHistoryBufferPos = 0; gSpinHistoryBufferPos = 0;
} }
switch (playerStatus->fallState) { switch (playerStatus->actionSubstate) {
case 0: case SUBSTATE_ASCEND:
fallVelocity = integrate_gravity(); fallVelocity = integrate_gravity();
playerStatus->position.y = player_check_collision_below(fallVelocity, &colliderBelow); playerStatus->position.y = player_check_collision_below(fallVelocity, &colliderBelow);
if (colliderBelow >= 0 && collisionStatus->currentFloor & COLLISION_WITH_ENTITY_BIT ) { if (colliderBelow >= 0 && collisionStatus->currentFloor & COLLISION_WITH_ENTITY_BIT ) {
@ -69,7 +82,7 @@ void func_802B6000_E26710(void) {
if (entityType == ENTITY_TYPE_BLUE_SWITCH || entityType == ENTITY_TYPE_RED_SWITCH) { if (entityType == ENTITY_TYPE_BLUE_SWITCH || entityType == ENTITY_TYPE_RED_SWITCH) {
get_entity_by_index(collisionStatus->currentFloor)->collisionFlags |= ENTITY_COLLISION_PLAYER_TOUCH_FLOOR; get_entity_by_index(collisionStatus->currentFloor)->collisionFlags |= ENTITY_COLLISION_PLAYER_TOUCH_FLOOR;
disable_player_input(); disable_player_input();
playerStatus->fallState = 0xB; playerStatus->actionSubstate = SUBSTATE_HIT_SWITCH;
break; break;
} }
} }
@ -77,7 +90,7 @@ void func_802B6000_E26710(void) {
record_jump_apex(); record_jump_apex();
playerStatus->currentStateTime = 3; playerStatus->currentStateTime = 3;
playerStatus->flags |= PLAYER_STATUS_FLAGS_FALLING; playerStatus->flags |= PLAYER_STATUS_FLAGS_FALLING;
playerStatus->fallState++; playerStatus->actionSubstate++;
sfx_play_sound_at_player(SOUND_TORNADO_JUMP, 0); sfx_play_sound_at_player(SOUND_TORNADO_JUMP, 0);
} }
if (colliderBelow >= 0) { if (colliderBelow >= 0) {
@ -85,12 +98,12 @@ void func_802B6000_E26710(void) {
set_action_state(ACTION_STATE_LAND); set_action_state(ACTION_STATE_LAND);
} }
break; break;
case 1: case SUBSTATE_HOVER:
if (--playerStatus->currentStateTime <= 0) { if (--playerStatus->currentStateTime <= 0) {
playerStatus->fallState++; playerStatus->actionSubstate++;
} }
break; break;
case 2: case SUBSTATE_DESCEND:
fallVelocity = integrate_gravity(); fallVelocity = integrate_gravity();
playerStatus->position.y = player_check_collision_below(fallVelocity, &colliderBelow); playerStatus->position.y = player_check_collision_below(fallVelocity, &colliderBelow);
if (fallVelocity < -100.0f) { if (fallVelocity < -100.0f) {
@ -120,22 +133,22 @@ void func_802B6000_E26710(void) {
} }
} }
colliderType = get_collider_type_by_id(colliderBelow); surfaceType = get_collider_flags(colliderBelow) & COLLIDER_FLAGS_SURFACE_TYPE_MASK;
if (colliderType == 3) { if (surfaceType == SURFACE_TYPE_LAVA) {
playerStatus->unk_BF = 1; playerStatus->hazardType = HAZARD_TYPE_LAVA;
playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_20000 | PLAYER_STATUS_FLAGS_FLYING); playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_20000 | PLAYER_STATUS_FLAGS_FLYING);
set_action_state(ACTION_STATE_HIT_LAVA); set_action_state(ACTION_STATE_HIT_LAVA);
playerStatus->flags |= PLAYER_STATUS_FLAGS_800; playerStatus->flags |= PLAYER_STATUS_FLAGS_800;
return; return;
} else if (colliderType == 2) { } else if (surfaceType == SURFACE_TYPE_SPIKES) {
set_action_state(ACTION_STATE_HIT_LAVA); set_action_state(ACTION_STATE_HIT_LAVA);
playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_20000 | PLAYER_STATUS_FLAGS_FLYING); playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_20000 | PLAYER_STATUS_FLAGS_FLYING);
return; return;
} }
playerStatus->currentStateTime = 8; playerStatus->currentStateTime = 8;
playerStatus->timeInAir = 0; playerStatus->timeInAir = 0;
playerStatus->actionState = ACTION_STATE_ULTRA_POUND; playerStatus->actionState = ACTION_STATE_TORNADO_POUND;
playerStatus->fallState++; playerStatus->actionSubstate++;
exec_ShakeCam1(0, 0, 4); exec_ShakeCam1(0, 0, 4);
sfx_play_sound_at_player(SOUND_14A, 0); sfx_play_sound_at_player(SOUND_14A, 0);
start_rumble(256, 50); start_rumble(256, 50);
@ -145,24 +158,24 @@ void func_802B6000_E26710(void) {
playerStatus->flags |= PLAYER_STATUS_FLAGS_400; playerStatus->flags |= PLAYER_STATUS_FLAGS_400;
} }
break; break;
case 3: case SUBSTATE_IMPACT:
if (--playerStatus->currentStateTime == 0) { if (--playerStatus->currentStateTime == 0) {
playerStatus->fallState++; playerStatus->actionSubstate++;
playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_20000 | PLAYER_STATUS_FLAGS_FLYING); playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_20000 | PLAYER_STATUS_FLAGS_FLYING);
set_action_state(ACTION_STATE_LAND); set_action_state(ACTION_STATE_LAND);
} }
break; break;
case 11: case SUBSTATE_HIT_SWITCH:
set_action_state(ACTION_STATE_LANDING_ON_SWITCH); set_action_state(ACTION_STATE_LANDING_ON_SWITCH);
playerStatus->fallState++; playerStatus->actionSubstate++;
enable_player_input(); enable_player_input();
break; break;
case 12: case SUBSTATE_DONE_SWITCH:
break; break;
} }
if (playerStatus->gravityIntegrator[0] < 0.0f) { if (playerStatus->gravityIntegrator[0] < 0.0f) {
colliderBelow = func_802B65F8_E26D08(); colliderBelow = get_collider_below_tornado_jump();
if (colliderBelow >= 0) { if (colliderBelow >= 0) {
collisionStatus->lastTouchedFloor = -1; collisionStatus->lastTouchedFloor = -1;
collisionStatus->currentFloor = colliderBelow; collisionStatus->currentFloor = colliderBelow;
@ -170,19 +183,13 @@ void func_802B6000_E26710(void) {
} }
} }
s32 func_802B65F8_E26D08(void) { static s32 get_collider_below_tornado_jump(void) {
f32 sp28; f32 posX, posY, posZ, height;
f32 sp2C; f32 hitRx, hitRz, hitDirX, hitDirZ;
f32 sp30;
f32 sp34;
f32 sp38;
f32 sp3C;
f32 sp40;
f32 sp44;
sp28 = gPlayerStatus.position.x; posX = gPlayerStatus.position.x;
sp34 = gPlayerStatus.colliderHeight; posZ = gPlayerStatus.position.z;
sp30 = gPlayerStatus.position.z; height = gPlayerStatus.colliderHeight;
sp2C = gPlayerStatus.position.y + (sp34 * 0.5f); posY = gPlayerStatus.position.y + (height * 0.5f);
return player_raycast_below_cam_relative(&gPlayerStatus, &sp28, &sp2C, &sp30, &sp34, &sp38, &sp3C, &sp40, &sp44); return player_raycast_below_cam_relative(&gPlayerStatus, &posX, &posY, &posZ, &height, &hitRx, &hitRz, &hitDirX, &hitDirZ);
} }

View File

@ -1,71 +1,79 @@
#include "common.h" #include "common.h"
extern f32 D_802B62D0; extern f32 Munchlesia_LaunchVelocity;
extern f32 D_802B62D4; extern f32 Munchlesia_LateralVelocity;
extern f32 D_802B62D8; extern f32 Munchlesia_LaunchAccel;
extern f32 D_802B62DC; extern f32 Munchlesia_LaunchYaw;
extern s32 D_802B62E0; extern s32 D_802B62E0;
void func_802B6000_E291A0(void) { enum {
PlayerStatus* playerStatus = &gPlayerStatus; SUBSTATE_INIT = 0,
s32 sp10; SUBSTATE_EJECT = 1,
f32 tempCollision; SUBSTATE_FALL = 2,
SUBSTATE_CRASH = 3,
SUBSTATE_GET_UP = 5,
};
if (playerStatus->flags & (1 << 31)) { void action_update_use_munchlesia(void) {
playerStatus->flags &= ~0x80000000; PlayerStatus* playerStatus = &gPlayerStatus;
playerStatus->fallState = 0; s32 colliderID;
f32 hitPosY;
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
playerStatus->actionSubstate = SUBSTATE_INIT;
gOverrideFlags |= GLOBAL_OVERRIDES_40; gOverrideFlags |= GLOBAL_OVERRIDES_40;
disable_player_static_collisions(); disable_player_static_collisions();
disable_player_input(); disable_player_input();
} }
switch (playerStatus->fallState) { switch (playerStatus->actionSubstate) {
case 0: case SUBSTATE_INIT:
suggest_player_anim_clearUnkFlag(0x1002E); suggest_player_anim_clearUnkFlag(ANIM_Mario_1002E);
D_802B62E0 = 0x20; D_802B62E0 = 32;
D_802B62D0 = 16.0f; Munchlesia_LaunchVelocity = 16.0f;
D_802B62D4 = 4.0f; Munchlesia_LateralVelocity = 4.0f;
D_802B62D8 = 1.0f; Munchlesia_LaunchAccel = 1.0f;
D_802B62D4 = 1.875f; Munchlesia_LateralVelocity = 1.875f;
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_EJECT
D_802B62DC = playerStatus->targetYaw; Munchlesia_LaunchYaw = playerStatus->targetYaw;
break; break;
case 1: case SUBSTATE_EJECT:
playerStatus->position.y += D_802B62D0; playerStatus->position.y += Munchlesia_LaunchVelocity;
D_802B62D0 -= D_802B62D8; Munchlesia_LaunchVelocity -= Munchlesia_LaunchAccel;
add_vec2D_polar(&playerStatus->position, &playerStatus->position.z, D_802B62D4, D_802B62DC); add_vec2D_polar(&playerStatus->position.x, &playerStatus->position.z, Munchlesia_LateralVelocity, Munchlesia_LaunchYaw);
gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x; gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x;
gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y; gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y;
gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z; gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z;
if (D_802B62D0 <= 0.0f) { if (Munchlesia_LaunchVelocity <= 0.0f) {
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_FALL
} }
break; break;
case 2: case SUBSTATE_FALL:
playerStatus->position.y += D_802B62D0; playerStatus->position.y += Munchlesia_LaunchVelocity;
D_802B62D0 -= D_802B62D8; Munchlesia_LaunchVelocity -= Munchlesia_LaunchAccel;
add_vec2D_polar(&playerStatus->position, &playerStatus->position.z, D_802B62D4, D_802B62DC); add_vec2D_polar(&playerStatus->position.x, &playerStatus->position.z, Munchlesia_LateralVelocity, Munchlesia_LaunchYaw);
gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x; gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x;
gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y; gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y;
gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z; gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z;
tempCollision = player_check_collision_below(D_802B62D0, &sp10); hitPosY = player_check_collision_below(Munchlesia_LaunchVelocity, &colliderID);
if (sp10 >= 0) { if (colliderID >= 0) {
sfx_play_sound_at_player(SOUND_162, 0); sfx_play_sound_at_player(SOUND_162, 0);
suggest_player_anim_setUnkFlag(0x80003); suggest_player_anim_setUnkFlag(ANIM_Mario_80003);
playerStatus->position.y = tempCollision; playerStatus->position.y = hitPosY;
D_802B62E0 = 0xA; D_802B62E0 = 10;
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_CRASH
} }
break; break;
case 3: case SUBSTATE_CRASH:
if (playerStatus->unk_BC != 0) { if (playerStatus->unk_BC != 0) {
suggest_player_anim_setUnkFlag(0x10030); suggest_player_anim_setUnkFlag(ANIM_Mario_GetUp);
playerStatus->fallState = 5; playerStatus->actionSubstate = SUBSTATE_GET_UP;
playerStatus->currentStateTime = 15; playerStatus->currentStateTime = 15;
break; break;
} }
break; break;
case 5: case SUBSTATE_GET_UP:
if (playerStatus->currentStateTime != 0) { if (playerStatus->currentStateTime != 0) {
playerStatus->currentStateTime--; playerStatus->currentStateTime--;
break; break;

View File

@ -1,54 +1,58 @@
#include "common.h" #include "common.h"
extern s32 D_802B6ED0; // some entity index extern s32 SpinningFlower_EntityIndex;
extern f32 D_802B6ED4; extern f32 D_802B6ED4;
extern f32 D_802B6ED8; extern f32 D_802B6ED8;
extern f32 D_802B6EDC; extern f32 D_802B6EDC;
extern f32 D_802B6EE0; extern f32 D_802B6EE0;
extern f32 D_802B6EE4; extern f32 D_802B6EE4;
extern f32 D_802B6EE8; extern f32 D_802B6EE8;
extern f32 D_802B6EEC; extern f32 SpinningFlower_AngleToCenter;
extern f32 D_802B6EF0; extern f32 D_802B6EF0;
extern f32 D_802B6EF4; extern f32 D_802B6EF4;
extern s16 D_802BCE30; extern s16 D_802BCE30;
extern s16 D_802BCE32; extern s16 D_802BCE32;
extern s16 D_802BCE34; extern s16 D_802BCE34;
s32 func_802B6000_E29470(void) { enum {
f32 sp28; SUBSTATE_ATTRACT = 1,
f32 sp2C; SUBSTATE_EJECT = 2,
f32 sp30; SUBSTATE_SPIN_UP = 3,
f32 sp34; SUBSTATE_ASCEND_A = 4,
f32 sp38; SUBSTATE_ASCEND_B = 5,
f32 sp3C; SUBSTATE_BOOST = 10,
f32 sp40; SUBSTATE_FINISH = 11,
f32 sp44; };
sp28 = gPlayerStatus.position.x; static s32 get_entity_below_spinning_flower(void) {
sp34 = gPlayerStatus.colliderHeight; f32 posX, posY, posZ, height;
sp30 = gPlayerStatus.position.z; f32 hitRx, hitRz, hitDirX, hitDirZ;
sp2C = gPlayerStatus.position.y + (sp34 * 0.5);
return player_raycast_below_cam_relative(&gPlayerStatus, &sp28, &sp2C, &sp30, &sp34, &sp38, &sp3C, &sp40, &sp44); posX = gPlayerStatus.position.x;
posZ = gPlayerStatus.position.z;
height = gPlayerStatus.colliderHeight;
posY = gPlayerStatus.position.y + (height * 0.5);
return player_raycast_below_cam_relative(&gPlayerStatus, &posX, &posY, &posZ, &height, &hitRx, &hitRz, &hitDirX, &hitDirZ);
} }
void func_802B60A4_E29514(void) { void action_update_use_spinning_flower(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
Entity* entityByIndex; Entity* entityByIndex;
s32* TempPointer; s32* TempPointer;
s32 sp20; s32 entityID;
f32 sp1C; f32 inputMagnitude;
f32 sp18; f32 inputAngle;
f32 sp14; f32 dz;
f32 sp10; f32 dx;
f32 tempY; f32 ascentVelocity;
f32 tempDistance; f32 distToCenter;
s8 switchCondition; s8 switchCondition;
if (playerStatus->flags & (1 << 31)) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~0x80000000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED;
gOverrideFlags |= GLOBAL_OVERRIDES_40; gOverrideFlags |= GLOBAL_OVERRIDES_40;
func_800EF300(); func_800EF300();
playerStatus->fallState = 1; playerStatus->actionSubstate = SUBSTATE_ATTRACT;
playerStatus->currentStateTime = 0; playerStatus->currentStateTime = 0;
D_802B6EE4 = 0.0f; D_802B6EE4 = 0.0f;
D_802B6EE8 = 0.0f; D_802B6EE8 = 0.0f;
@ -56,27 +60,29 @@ void func_802B60A4_E29514(void) {
D_802B6EDC = 3.0f; D_802B6EDC = 3.0f;
disable_player_static_collisions(); disable_player_static_collisions();
disable_player_input(); disable_player_input();
playerStatus->flags |= 0x100000; playerStatus->flags |= PLAYER_STATUS_FLAGS_100000;
sp20 = gCollisionStatus.currentFloor; entityID = gCollisionStatus.currentFloor;
TempPointer = &D_802B6ED0; TempPointer = &SpinningFlower_EntityIndex;
if (sp20 >= 0){ if (entityID >= 0){
if (!(sp20 & COLLISION_WITH_ENTITY_BIT)) { if (!(entityID & COLLISION_WITH_ENTITY_BIT)) {
D_802B6ED0 = -1; SpinningFlower_EntityIndex = -1;
} else { } else {
D_802B6ED0 = sp20 & 0x3FF; SpinningFlower_EntityIndex = entityID & 0x3FF;
} }
} else { } else {
D_802B6ED0 = -1; SpinningFlower_EntityIndex = -1;
} }
if (!(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) { if (!(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) {
suggest_player_anim_clearUnkFlag(0x1002B); suggest_player_anim_clearUnkFlag(ANIM_Mario_1002B);
} }
} }
switch (playerStatus->fallState) {
case 1: switch (playerStatus->actionSubstate) {
case SUBSTATE_ATTRACT:
gOverrideFlags |= GLOBAL_OVERRIDES_40; gOverrideFlags |= GLOBAL_OVERRIDES_40;
if (++D_802B6EE4 >= 20.0f) { D_802B6EE4 += 1.0f;
if (D_802B6EE4 >= 20.0f) {
D_802B6EE4 = 20.0f; D_802B6EE4 = 20.0f;
} }
playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4); playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4);
@ -86,72 +92,73 @@ void func_802B60A4_E29514(void) {
} }
D_802B6EE8 += 8.0f; D_802B6EE8 += 8.0f;
playerStatus->position.y = D_802B6EF4 + sin_rad(clamp_angle(D_802B6EE8) * TAU / 360.0f) * 4.0f; playerStatus->position.y = D_802B6EF4 + sin_rad(clamp_angle(D_802B6EE8) * TAU / 360.0f) * 4.0f;
if (D_802B6ED0 >= 0) { if (SpinningFlower_EntityIndex >= 0) {
entityByIndex = get_entity_by_index(D_802B6ED0); entityByIndex = get_entity_by_index(SpinningFlower_EntityIndex);
tempDistance = dist2D(entityByIndex->position.x, entityByIndex->position.z, playerStatus->position.x, playerStatus->position.z); distToCenter = dist2D(entityByIndex->position.x, entityByIndex->position.z, playerStatus->position.x, playerStatus->position.z);
D_802B6EEC = atan2(entityByIndex->position.x, entityByIndex->position.z, playerStatus->position.x, playerStatus->position.z); SpinningFlower_AngleToCenter = atan2(entityByIndex->position.x, entityByIndex->position.z, playerStatus->position.x, playerStatus->position.z);
if (tempDistance > 4.0f) { if (distToCenter > 4.0f) {
tempDistance--; distToCenter--;
} }
sin_cos_rad(D_802B6EEC * TAU / 360.0f, &sp10, &sp14); sin_cos_rad(SpinningFlower_AngleToCenter * TAU / 360.0f, &dx, &dz);
playerStatus->position.x = entityByIndex->position.x + (sp10 * tempDistance); playerStatus->position.x = entityByIndex->position.x + (dx * distToCenter);
playerStatus->position.z = entityByIndex->position.z - (sp14 * tempDistance); playerStatus->position.z = entityByIndex->position.z - (dz * distToCenter);
sin_cos_rad((D_802B6EEC - 91.0f) * TAU / 360.0f, &sp10, &sp14); sin_cos_rad((SpinningFlower_AngleToCenter - 91.0f) * TAU / 360.0f, &dx, &dz);
D_802B6ED4 = sp10 * D_802B6EDC; D_802B6ED4 = dx * D_802B6EDC;
D_802B6ED8 = -sp14 * D_802B6EDC; D_802B6ED8 = -dz * D_802B6EDC;
} }
game_input_to_move_vector(&sp18, &sp1C); game_input_to_move_vector(&inputAngle, &inputMagnitude);
if (sp1C != 0.0f) { if (inputMagnitude != 0.0f) {
sin_cos_rad((sp18 * TAU) / 360.0f, &sp10, &sp14); sin_cos_rad((inputAngle * TAU) / 360.0f, &dx, &dz);
sp1C *= 0.03125f; inputMagnitude *= 0.03125f;
if (sp1C < 0.1) { if (inputMagnitude < 0.1) {
sp1C = 0.1f; inputMagnitude = 0.1f;
} }
playerStatus->position.x += sp10 * sp1C; playerStatus->position.x += dx * inputMagnitude;
playerStatus->position.z -= sp14 * sp1C; playerStatus->position.z -= dz * inputMagnitude;
} }
gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x; gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x;
gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y; gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y;
gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z; gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z;
sp20 = func_802B6000_E29470(); entityID = get_entity_below_spinning_flower();
if (sp20 < 0 || !(sp20 & COLLISION_WITH_ENTITY_BIT)) { if (entityID < 0 || !(entityID & COLLISION_WITH_ENTITY_BIT)) {
playerStatus->currentStateTime = 20; playerStatus->currentStateTime = 20;
D_802B6EE8 = 0.0f; D_802B6EE8 = 0.0f;
D_802B6EF4 = playerStatus->position.y; D_802B6EF4 = playerStatus->position.y;
playerStatus->fallState++; playerStatus->actionSubstate++;
D_802B6EF0 = 1.6f; D_802B6EF0 = 1.6f;
playerStatus->flags |= 0x800000; playerStatus->flags |= PLAYER_STATUS_FLAGS_800000;
} }
if (gGameStatusPtr->pressedButtons[0] & BUTTON_Z && !(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) { if (gGameStatusPtr->pressedButtons[0] & BUTTON_Z &&
suggest_player_anim_setUnkFlag(0x10007); !(playerStatus->animFlags & (PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT | PLAYER_STATUS_ANIM_FLAGS_2))) {
playerStatus->fallState = 3; suggest_player_anim_setUnkFlag(ANIM_Mario_AnimMidairStill);
playerStatus->actionSubstate = SUBSTATE_SPIN_UP;
playerStatus->currentStateTime = 30; playerStatus->currentStateTime = 30;
D_802B6EE0 = 0.0f; D_802B6EE0 = 0.0f;
gCollisionStatus.currentFloor = -1; gCollisionStatus.currentFloor = -1;
exec_entity_commandlist(get_entity_by_index(D_802B6ED0)); exec_entity_commandlist(get_entity_by_index(SpinningFlower_EntityIndex));
} }
break; break;
case 2: case SUBSTATE_EJECT:
gOverrideFlags |= GLOBAL_OVERRIDES_40; gOverrideFlags |= GLOBAL_OVERRIDES_40;
if (--D_802B6EE4 < 0.0f) { if (--D_802B6EE4 < 0.0f) {
D_802B6EE4 = 0.0f; D_802B6EE4 = 0.0f;
playerStatus->flags &= ~0x100000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_100000;
} }
playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4); playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4);
sin_cos_rad((D_802B6EEC - 60.0f) * TAU / 360.0f, &sp10, &sp14); sin_cos_rad((SpinningFlower_AngleToCenter - 60.0f) * TAU / 360.0f, &dx, &dz);
D_802B6EDC += 0.2; D_802B6EDC += 0.2;
D_802B6EF0 -= 0.72; D_802B6EF0 -= 0.72;
D_802B6ED4 = sp10 * D_802B6EDC; D_802B6ED4 = dx * D_802B6EDC;
D_802B6ED8 = -sp14 * D_802B6EDC; D_802B6ED8 = -dz * D_802B6EDC;
playerStatus->position.x += D_802B6ED4; playerStatus->position.x += D_802B6ED4;
playerStatus->position.z += D_802B6ED8; playerStatus->position.z += D_802B6ED8;
collision_lava_reset_check_additional_overlaps(); collision_lava_reset_check_additional_overlaps();
playerStatus->position.y = player_check_collision_below(D_802B6EF0, &sp20); playerStatus->position.y = player_check_collision_below(D_802B6EF0, &entityID);
gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x; gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x;
gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y; gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y;
gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z; gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z;
if (sp20 >= 0) { if (entityID >= 0) {
playerStatus->flags &= ~0x100000; playerStatus->flags &= ~PLAYER_STATUS_FLAGS_100000;
enable_player_input(); enable_player_input();
enable_player_static_collisions(); enable_player_static_collisions();
set_action_state(ACTION_STATE_LAND); set_action_state(ACTION_STATE_LAND);
@ -161,22 +168,21 @@ void func_802B60A4_E29514(void) {
} }
} }
switchCondition = playerStatus->fallState - 3; switch (playerStatus->actionSubstate) {
switch (switchCondition) { case SUBSTATE_SPIN_UP:
case 0: if (SpinningFlower_EntityIndex >= 0) {
if (D_802B6ED0 >= 0) { entityByIndex = get_entity_by_index(SpinningFlower_EntityIndex);
entityByIndex = get_entity_by_index(D_802B6ED0); distToCenter = dist2D(entityByIndex->position.x, entityByIndex->position.z, playerStatus->position.x, playerStatus->position.z);
tempDistance = dist2D(entityByIndex->position.x, entityByIndex->position.z, playerStatus->position.x, playerStatus->position.z); SpinningFlower_AngleToCenter = atan2(entityByIndex->position.x, entityByIndex->position.z, playerStatus->position.x, playerStatus->position.z);
D_802B6EEC = atan2(entityByIndex->position.x, entityByIndex->position.z, playerStatus->position.x, playerStatus->position.z); if (distToCenter > 4.0f) {
if (tempDistance > 4.0f) { distToCenter -= 1.0f;
tempDistance -= 1.0f;
} }
sin_cos_rad(D_802B6EEC * TAU / 360.0f, &sp10, &sp14); sin_cos_rad(SpinningFlower_AngleToCenter * TAU / 360.0f, &dx, &dz);
playerStatus->position.x = entityByIndex->position.x + (sp10 * tempDistance); playerStatus->position.x = entityByIndex->position.x + (dx * distToCenter);
playerStatus->position.z = entityByIndex->position.z - (sp14 * tempDistance); playerStatus->position.z = entityByIndex->position.z - (dz * distToCenter);
sin_cos_rad((D_802B6EEC - 91.0f) * TAU / 360.0f, &sp10, &sp14); sin_cos_rad((SpinningFlower_AngleToCenter - 91.0f) * TAU / 360.0f, &dx, &dz);
D_802B6ED4 = sp10 * D_802B6EDC; D_802B6ED4 = dx * D_802B6EDC;
D_802B6ED8 = -sp14 * D_802B6EDC; D_802B6ED8 = -dz * D_802B6EDC;
} }
D_802B6EE8 += 8.0f; D_802B6EE8 += 8.0f;
@ -193,11 +199,11 @@ void func_802B60A4_E29514(void) {
playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4); playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4);
break; break;
} }
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_ASCEND_A
playerStatus->currentStateTime = 30; playerStatus->currentStateTime = 30;
phys_adjust_cam_on_landing(); phys_adjust_cam_on_landing();
break; break;
case 1: case SUBSTATE_ASCEND_A:
D_802B6EE4 += 2.0f; D_802B6EE4 += 2.0f;
if (D_802B6EE4 >= 45.0f) { if (D_802B6EE4 >= 45.0f) {
D_802B6EE4 = 45.0f; D_802B6EE4 = 45.0f;
@ -208,51 +214,52 @@ void func_802B60A4_E29514(void) {
D_802B6EE0 = 45.0f; D_802B6EE0 = 45.0f;
} }
tempY = sin_rad(D_802B6EE0 * TAU / 360.0f) * 4.0f; ascentVelocity = sin_rad(D_802B6EE0 * TAU / 360.0f) * 4.0f;
playerStatus->position.y += tempY; playerStatus->position.y += ascentVelocity;
gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x; gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x;
gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y; gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y;
gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z; gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z;
tempDistance = fabsf(dist2D(D_802BCE34, D_802BCE32, playerStatus->position.x, playerStatus->position.z)); distToCenter = fabsf(dist2D(D_802BCE34, D_802BCE32, playerStatus->position.x, playerStatus->position.z));
if (tempDistance > 40.0f) { if (distToCenter > 40.0f) {
if (D_802BCE30 + 30 < playerStatus->position.y) { if (D_802BCE30 + 30 < playerStatus->position.y) {
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_ASCEND_B
sp18 = atan2(playerStatus->position.x, playerStatus->position.z, D_802BCE34, D_802BCE32); inputAngle = atan2(playerStatus->position.x, playerStatus->position.z, D_802BCE34, D_802BCE32);
sin_cos_rad(sp18 * TAU / 360.0f, &sp10, &sp14); sin_cos_rad(inputAngle * TAU / 360.0f, &dx, &dz);
playerStatus->currentStateTime = 64; playerStatus->currentStateTime = 64;
D_802B6EEC = sp18; SpinningFlower_AngleToCenter = inputAngle;
D_802B6ED4 = (sp10 * tempDistance) * 0.015625; D_802B6ED4 = (dx * distToCenter) * 0.015625;
D_802B6ED8 = (-sp14 * tempDistance) * 0.015625; D_802B6ED8 = (-dz * distToCenter) * 0.015625;
} }
break; break;
} }
if (playerStatus->currentStateTime == 0) { if (playerStatus->currentStateTime == 0) {
playerStatus->fallState = 0xA; playerStatus->actionSubstate = SUBSTATE_BOOST;
playerStatus->currentStateTime = 20; playerStatus->currentStateTime = 20;
} else { } else {
playerStatus->currentStateTime--; playerStatus->currentStateTime--;
} }
break; break;
case 2: case SUBSTATE_ASCEND_B:
playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4); playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4);
if (playerStatus->currentStateTime != 0) { if (playerStatus->currentStateTime != 0) {
playerStatus->currentStateTime--; playerStatus->currentStateTime--;
if (D_802B6EE0-- < 0.0f) { if (D_802B6EE0-- < 0.0f) {
D_802B6EE0 = 0.0f; D_802B6EE0 = 0.0f;
} }
tempY = 2.0f * sin_rad(D_802B6EE0 * TAU / 360.0f); ascentVelocity = 2.0f * sin_rad(D_802B6EE0 * TAU / 360.0f);
playerStatus->position.x += D_802B6ED4; playerStatus->position.x += D_802B6ED4;
playerStatus->position.y += tempY; playerStatus->position.y += ascentVelocity;
playerStatus->position.z += D_802B6ED8; playerStatus->position.z += D_802B6ED8;
} else { } else {
playerStatus->fallState = 0xB; playerStatus->actionSubstate = SUBSTATE_FINISH;
} }
gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x; gCameras[CAM_DEFAULT].targetPos.x = playerStatus->position.x;
gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y; gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y;
gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z; gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z;
break; break;
case 7: case SUBSTATE_BOOST:
if (++D_802B6EE4 >= 45.0f) { D_802B6EE4 += 1.0f;
if (D_802B6EE4 >= 45.0f) {
D_802B6EE4 = 45.0f; D_802B6EE4 = 45.0f;
} }
playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4); playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4);
@ -260,13 +267,13 @@ void func_802B60A4_E29514(void) {
if (D_802B6EE0 > 45.0f) { if (D_802B6EE0 > 45.0f) {
D_802B6EE0 = 45.0f; D_802B6EE0 = 45.0f;
} }
tempY = sin_rad(D_802B6EE0 * TAU / 360.0f) * 3.0f; ascentVelocity = sin_rad(D_802B6EE0 * TAU / 360.0f) * 3.0f;
playerStatus->position.y += tempY; playerStatus->position.y += ascentVelocity;
if (playerStatus->currentStateTime != 0) { if (playerStatus->currentStateTime != 0) {
playerStatus->currentStateTime--; playerStatus->currentStateTime--;
break; break;
} }
case 8: case SUBSTATE_FINISH:
enable_player_static_collisions(); enable_player_static_collisions();
enable_player_input(); enable_player_input();
playerStatus->flags &= ~0x100000; playerStatus->flags &= ~0x100000;

View File

@ -4,7 +4,12 @@
extern struct TweesterPhysics* PlayerTweesterPhysics; extern struct TweesterPhysics* PlayerTweesterPhysics;
void func_802B6000_E2A340(void) { enum {
SUBSTATE_LAUNCH = 0,
SUBSTATE_DONE = 1
};
void action_update_use_tweester(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 sinAngle, cosAngle, liftoffVelocity; f32 sinAngle, cosAngle, liftoffVelocity;
Entity* entity; Entity* entity;
@ -15,19 +20,19 @@ void func_802B6000_E2A340(void) {
disable_player_static_collisions(); disable_player_static_collisions();
disable_player_input(); disable_player_input();
playerStatus->flags |= (PLAYER_STATUS_FLAGS_100000 | PLAYER_STATUS_FLAGS_FLYING); playerStatus->flags |= (PLAYER_STATUS_FLAGS_100000 | PLAYER_STATUS_FLAGS_FLYING);
suggest_player_anim_clearUnkFlag(0x8001F); suggest_player_anim_clearUnkFlag(ANIM_Mario_8001F);
playerStatus->fallState = 0; playerStatus->actionSubstate = SUBSTATE_LAUNCH;
mem_clear(PlayerTweesterPhysics, sizeof(TweesterPhysics)); mem_clear(PlayerTweesterPhysics, sizeof(*PlayerTweesterPhysics));
PlayerTweesterPhysics->radius = fabsf(dist2D(playerStatus->position.x, playerStatus->position.z, entity->position.x, entity->position.z)); PlayerTweesterPhysics->radius = fabsf(dist2D(playerStatus->position.x, playerStatus->position.z, entity->position.x, entity->position.z));
PlayerTweesterPhysics->angle = atan2(entity->position.x, entity->position.z, playerStatus->position.x, playerStatus->position.z); PlayerTweesterPhysics->angle = atan2(entity->position.x, entity->position.z, playerStatus->position.x, playerStatus->position.z);
PlayerTweesterPhysics->angularVelocity = 6.0f; PlayerTweesterPhysics->angularVelocity = 6.0f;
PlayerTweesterPhysics->liftoffVelocityPhase = 50.0f; PlayerTweesterPhysics->liftoffVelocityPhase = 50.0f;
PlayerTweesterPhysics->countdown = 0x78; PlayerTweesterPhysics->countdown = 120;
sfx_play_sound_at_player(SOUND_2F6, 0); sfx_play_sound_at_player(SOUND_TWEESTER_LAUNCH, 0);
} }
switch (playerStatus->fallState) { switch (playerStatus->actionSubstate) {
case 0: case SUBSTATE_LAUNCH:
sin_cos_rad((PlayerTweesterPhysics->angle * TAU) / 360.0f, &sinAngle, &cosAngle); sin_cos_rad((PlayerTweesterPhysics->angle * TAU) / 360.0f, &sinAngle, &cosAngle);
playerStatus->position.x = entity->position.x + (sinAngle * PlayerTweesterPhysics->radius); playerStatus->position.x = entity->position.x + (sinAngle * PlayerTweesterPhysics->radius);
@ -54,14 +59,14 @@ void func_802B6000_E2A340(void) {
PlayerTweesterPhysics->angularVelocity = 40.0f; PlayerTweesterPhysics->angularVelocity = 40.0f;
} }
if (--PlayerTweesterPhysics->countdown == 0) { if (--PlayerTweesterPhysics->countdown == 0) {
playerStatus->fallState++; playerStatus->actionSubstate++; // SUBSTATE_DONE
entity_start_script(entity); entity_start_script(entity);
} }
break; break;
case 1: case SUBSTATE_DONE:
disable_player_shadow(); disable_player_shadow();
disable_npc_shadow(wPartnerNpc); disable_npc_shadow(wPartnerNpc);
playerStatus->blinkTimer = 0x32; playerStatus->blinkTimer = 50;
enable_player_static_collisions(); enable_player_static_collisions();
enable_player_input(); enable_player_input();
playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_100000 | PLAYER_STATUS_FLAGS_FLYING); playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_100000 | PLAYER_STATUS_FLAGS_FLYING);

View File

@ -1,44 +1,43 @@
#include "common.h" #include "common.h"
#include "world/actions.h" #include "world/actions.h"
s32 WalkPeachAnims[] = { AnimID WalkPeachAnims[] = {
0x000A0002, // none ANIM_Peach_A0002, // none
0x000A002B, // cream ANIM_Peach_A002B, // cream
0x000A002D, // strawberry ANIM_Peach_A002D, // strawberry
0x000A002F, // butter ANIM_Peach_A002F, // butter
0x000A0031, // cleanser ANIM_Peach_A0031, // cleanser
0x000A0033, // water ANIM_Peach_A0033, // water
0x000A0035, // milk ANIM_Peach_A0035, // milk
0x000A0037, // flour ANIM_Peach_A0037, // flour
0x000A0039, // egg ANIM_Peach_A0039, // egg
0x000A003B, // complete cake ANIM_Peach_A003B, // complete cake
0x000A003D, // cake bowl ANIM_Peach_A003D, // cake bowl
0x000A003F, // cake mixed ANIM_Peach_A003F, // cake mixed
0x000A0041, // cake pan ANIM_Peach_A0041, // cake pan
0x000A0043, // cake batter ANIM_Peach_A0043, // cake batter
0x000A0045, // cake bare ANIM_Peach_A0045, // cake bare
0x000A0047, // salt ANIM_Peach_A0047, // salt
0x000A0049, // sugar ANIM_Peach_A0049, // sugar
0x000A004B, // cake with icing ANIM_Peach_A004B, // cake with icing
0x000A004D, // cake with berries ANIM_Peach_A004D, // cake with berries
0x00000000 0x00000000
}; };
void action_run_update_peach(void); static void action_update_run_peach(void);
void func_802B65E8_E23CC8(void); static void action_update_walk_peach(void);
// walk void action_update_walk(void) {
void func_802B6000_E236E0(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
PlayerData* playerData = &gPlayerData; PlayerData* playerData = &gPlayerData;
f32 moveVectorMagnitude; f32 moveVectorMagnitude;
f32 moveVectorAngle; f32 moveVectorAngle;
s32 stickAxisX; s32 stickAxisX;
s32 stickAxisY; s32 stickAxisY;
s32 playerAnim; AnimID anim;
s32 changedAnim = FALSE; s32 changedAnim = FALSE;
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
func_802B65E8_E23CC8(); action_update_walk_peach();
return; return;
} }
@ -53,15 +52,15 @@ void func_802B6000_E236E0(void) {
} }
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) {
playerAnim = 0x90003; anim = ANIM_Mario_90003;
} }
else if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) { else if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) {
playerAnim = 0x10004; anim = ANIM_Mario_Walking;
} }
else { else {
playerAnim = 0x60000; anim = ANIM_Mario_60000;
} }
suggest_player_anim_clearUnkFlag(playerAnim); suggest_player_anim_clearUnkFlag(anim);
} }
if (playerStatus->flags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) { if (playerStatus->flags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) {
@ -81,7 +80,7 @@ void func_802B6000_E236E0(void) {
return; return;
} }
if (fabsf(D_800F7B40 - moveVectorAngle) <= 90.0f && abs(moveVectorMagnitude - D_800F7B44) < 20) { if (fabsf(PrevPlayerCamRelativeYaw - moveVectorAngle) <= 90.0f && abs(moveVectorMagnitude - D_800F7B44) < 20) {
if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_80000000)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_80000000)) {
if (moveVectorMagnitude >= 20.0f) { if (moveVectorMagnitude >= 20.0f) {
playerStatus->targetYaw = moveVectorAngle; playerStatus->targetYaw = moveVectorAngle;
@ -111,25 +110,25 @@ void func_802B6000_E236E0(void) {
} }
} }
// run void action_update_run(void) {
void action_run_update(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
PlayerData* playerData = &gPlayerData; PlayerData* playerData = &gPlayerData;
f32 moveX; f32 moveX;
f32 moveY; f32 moveY;
s32 temp_v1; s32 temp_v1;
s32 phi_a0; AnimID anim;
f32 phi_f2; f32 runSpeedModifier;
s32 phi_s3; s32 phi_s3;
phi_s3 = 0; phi_s3 = 0;
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_USING_PEACH_PHYSICS) {
action_run_update_peach(); action_update_run_peach();
return; return;
} }
if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED) {
playerStatus->flags &= ~0x80880000; playerStatus->flags &= ~(PLAYER_STATUS_FLAGS_ACTION_STATE_CHANGED |
PLAYER_STATUS_FLAGS_800000 | PLAYER_STATUS_FLAGS_80000);
D_8010C980 = 0; D_8010C980 = 0;
playerStatus->unk_60 = 0; playerStatus->unk_60 = 0;
phi_s3 = 1; phi_s3 = 1;
@ -138,31 +137,31 @@ void action_run_update(void) {
playerStatus->currentSpeed = playerStatus->runSpeed; playerStatus->currentSpeed = playerStatus->runSpeed;
} }
if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_8BIT_MARIO) {
phi_a0 = 0x90003; anim = ANIM_Mario_90003;
} else { } else {
if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) { if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT)) {
phi_a0 = 0x10005; anim = ANIM_Mario_Running;
} else { } else {
phi_a0 = 0x60002; anim = ANIM_Mario_60002;
} }
} }
suggest_player_anim_clearUnkFlag(phi_a0); suggest_player_anim_clearUnkFlag(anim);
} }
if (playerStatus->flags & 0x00004000) { if (playerStatus->flags & PLAYER_STATUS_FLAGS_4000) {
playerStatus->targetYaw = playerStatus->heading; playerStatus->targetYaw = playerStatus->heading;
try_player_footstep_sounds(4); try_player_footstep_sounds(4);
return; return;
} }
D_8010C980++; D_8010C980++;
phi_f2 = 1.0f; runSpeedModifier = 1.0f;
if (playerStatus->animFlags & 0x10000) { if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_SPINNING) {
phi_f2 = 1.5f; runSpeedModifier = 1.5f;
} }
playerStatus->currentSpeed = playerStatus->runSpeed * phi_f2; playerStatus->currentSpeed = playerStatus->runSpeed * runSpeedModifier;
player_input_to_move_vector(&moveX, &moveY); player_input_to_move_vector(&moveX, &moveY);
phys_update_interact_collider(); phys_update_interact_collider();
if (check_input_jump() == FALSE) { if (check_input_jump() == FALSE) {
@ -178,19 +177,16 @@ void action_run_update(void) {
return; return;
} }
if (fabsf(D_800F7B40 - moveX) <= 90.0f) { if (fabsf(PrevPlayerCamRelativeYaw - moveX) <= 90.0f) {
temp_v1 = playerStatus->animFlags; if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_80000000)) {
if (temp_v1 >= 0) {
playerStatus->targetYaw = moveX; playerStatus->targetYaw = moveX;
} }
playerStatus->animFlags &= ~0x80000000; playerStatus->animFlags &= ~PLAYER_STATUS_ANIM_FLAGS_80000000;
} else { } else {
temp_v1 = playerStatus->animFlags; if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_80000000) {
temp_v1 = temp_v1 < 0;
if (temp_v1) {
playerStatus->targetYaw = moveX; playerStatus->targetYaw = moveX;
} else { } else {
playerStatus->animFlags |= 0x80000000; playerStatus->animFlags |= PLAYER_STATUS_ANIM_FLAGS_80000000;
} }
} }
@ -214,13 +210,13 @@ void func_802B6550_E23C30(void) {
suggest_player_anim_clearUnkFlag(WalkPeachAnims[gGameStatusPtr->peachCookingIngredient]); suggest_player_anim_clearUnkFlag(WalkPeachAnims[gGameStatusPtr->peachCookingIngredient]);
return; return;
} }
suggest_player_anim_clearUnkFlag(0xD000D); suggest_player_anim_clearUnkFlag(ANIM_Peach_D000D);
return; return;
} }
peach_set_disguise_anim(BasicPeachDisguiseAnims[gPlayerStatus.peachDisguise].walk); peach_set_disguise_anim(BasicPeachDisguiseAnims[gPlayerStatus.peachDisguise].walk);
} }
void func_802B65E8_E23CC8(void) { static void action_update_walk_peach(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
f32 magnitude; f32 magnitude;
f32 angle; f32 angle;
@ -256,7 +252,7 @@ void func_802B65E8_E23CC8(void) {
try_player_footstep_sounds(8); try_player_footstep_sounds(8);
} }
void action_run_update_peach(void) { static void action_update_run_peach(void) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
GameStatus* gameStatus; GameStatus* gameStatus;
f32 moveX; f32 moveX;
@ -273,12 +269,12 @@ void action_run_update_peach(void) {
gameStatus = gGameStatusPtr; gameStatus = gGameStatusPtr;
if (!(gameStatus->peachFlags & PEACH_STATUS_FLAG_HAS_INGREDIENT)) { if (!(gameStatus->peachFlags & PEACH_STATUS_FLAG_HAS_INGREDIENT)) {
if (!gameStatus->peachCookingIngredient) { if (!gameStatus->peachCookingIngredient) {
suggest_player_anim_clearUnkFlag(0xA0003); suggest_player_anim_clearUnkFlag(ANIM_Peach_A0003);
} else { } else {
suggest_player_anim_clearUnkFlag(WalkPeachAnims[gameStatus->peachCookingIngredient]); suggest_player_anim_clearUnkFlag(WalkPeachAnims[gameStatus->peachCookingIngredient]);
} }
} else { } else {
suggest_player_anim_clearUnkFlag(0xD000D); suggest_player_anim_clearUnkFlag(ANIM_Peach_D000D);
} }
} else { } else {
peach_set_disguise_anim(BasicPeachDisguiseAnims[playerStatus->peachDisguise].run); peach_set_disguise_anim(BasicPeachDisguiseAnims[playerStatus->peachDisguise].run);

View File

@ -2,27 +2,38 @@
#include "ld_addrs.h" #include "ld_addrs.h"
#include "actions.h" #include "actions.h"
void action_idle_update(void); void action_update_idle(void);
void func_802B6000_E24920(void); void action_update_walk(void);
void action_run_update(void); void action_update_run(void);
void func_802B60B4_E240F4(void); void action_update_land(void);
void func_802B6198_E241D8(void); void action_update_jump(void);
void func_802B6294_E242D4(void); void action_update_landing_on_switch(void);
void func_802B6348_E24388(void); void action_update_falling(void);
void func_802B61C0_E24AE0(void); void action_update_step_down(void);
void func_802B6638_E29068(void); void action_update_step_down_land(void);
void func_802B6060_E27570(void); void action_update_spin_jump(void);
void action_hammer_update(void); void action_update_tornado_jump(void);
void func_802B6350_E28D80(void); void action_update_talk(void);
void func_802B6508_E28F38(void); void action_update_sliding(void);
void func_802B6230_E24800(void); void action_update_hammer(void);
void func_802B6120_E2A7D0(void); void action_update_launch(void);
void func_802B63D4_E28E04(void); void action_update_pushing_block(void);
void func_802B6478_E28EA8(void); void action_update_hit_fire(void);
void func_802B60A4_E29514(void); void action_update_knockback(void);
void func_802B609C_E28ACC(void); void action_update_hit_lava(void);
void action_update_parasol(void);
void action_update_spin(void);
void action_update_step_up_peach(void);
void action_update_ride(void);
void action_update_step_up(void);
void action_update_first_strike(void);
void action_update_raise_arms(void);
void action_update_use_spinning_flower(void);
void action_update_use_munchlesia(void);
void action_update_use_tweester(void);
void action_update_state_23(void);
s32 D_800F7B40 = 0; s32 PrevPlayerCamRelativeYaw = 0;
s32 D_800F7B44 = 0; s32 D_800F7B44 = 0;
f32 D_800F7B48 = 0.0f; f32 D_800F7B48 = 0.0f;
s32 D_800F7B4C = 0; s32 D_800F7B4C = 0;
@ -36,15 +47,15 @@ f32 D_800F7B74 = 4.0f; // run
f32 D_800F7B78 = 32.0f; // max jump f32 D_800F7B78 = 32.0f; // max jump
f32 D_800F7B7C = -32.0f; // ??? f32 D_800F7B7C = -32.0f; // ???
s16 D_800F7B80 = 0; s16 FootstepSoundSelector = 0;
s32 D_800F7B84[] = { 0, 0, 0}; s32 D_800F7B84[] = { 0, 0, 0};
f32 D_800F7B90 = 0.0; f32 D_800F7B90 = 0.0;
s32 ClubbaDisguiseExtraAnims[] = { 0x00390000, 0x00390002, 0x00390003, 0x00390004, 0x00390005, 0x00390008, 0x00390007, 0x00390013, 0x00390014, ANIM_LIST_END }; AnimID ClubbaDisguiseExtraAnims[] = { 0x00390000, 0x00390002, 0x00390003, 0x00390004, 0x00390005, 0x00390008, 0x00390007, 0x00390013, 0x00390014, ANIM_LIST_END };
s32 HammerBroDisguiseExtraAnims[] = { 0x005A0000, 0x005A0002, 0x005A0003, 0x005A0004, 0x005A0006, 0x005A0007, 0x005A0009, 0x005A000A, 0x005A000B, 0x005A001A, ANIM_LIST_END }; AnimID HammerBroDisguiseExtraAnims[] = { 0x005A0000, 0x005A0002, 0x005A0003, 0x005A0004, 0x005A0006, 0x005A0007, 0x005A0009, 0x005A000A, 0x005A000B, 0x005A001A, ANIM_LIST_END };
s32 KoopatrolDisguiseExtraAnims[] = { 0x00580000, 0x00580001, 0x00580002, 0x00580004, 0x00580005, 0x00580006, 0x00580007, 0x00580008, 0x00580009, 0x00580012, 0x00580014, 0x0058001B, ANIM_LIST_END }; AnimID KoopatrolDisguiseExtraAnims[] = { 0x00580000, 0x00580001, 0x00580002, 0x00580004, 0x00580005, 0x00580006, 0x00580007, 0x00580008, 0x00580009, 0x00580012, 0x00580014, 0x0058001B, ANIM_LIST_END };
DisguiseAnims BasicPeachDisguiseAnims[4] = { DisguiseAnims BasicPeachDisguiseAnims[4] = {
{0x00580001, 0x00580004, 0x00580006, 0x00580008, 0x00580000, 0x0058001B}, {0x00580001, 0x00580004, 0x00580006, 0x00580008, 0x00580000, 0x0058001B},
@ -53,46 +64,49 @@ DisguiseAnims BasicPeachDisguiseAnims[4] = {
{0x00390002, 0x00390003, 0x00390004, 0x00390005, 0x00390000, 0x00390014}, {0x00390002, 0x00390003, 0x00390004, 0x00390005, 0x00390000, 0x00390014},
}; };
s32* PeachDisguiseExtraAnims[4] = { KoopatrolDisguiseExtraAnims, KoopatrolDisguiseExtraAnims, HammerBroDisguiseExtraAnims, ClubbaDisguiseExtraAnims }; AnimID* PeachDisguiseExtraAnims[4] = { KoopatrolDisguiseExtraAnims, KoopatrolDisguiseExtraAnims, HammerBroDisguiseExtraAnims, ClubbaDisguiseExtraAnims };
#define ACTION_FILE(name) world_action_##name##_ROM_START, world_action_##name##_ROM_END
Action PlayerActionsTable[] = { Action PlayerActionsTable[] = {
{ action_idle_update, world_action_idle_ROM_START, world_action_idle_ROM_END, TRUE }, [ACTION_STATE_IDLE] { action_update_idle, ACTION_FILE(idle), TRUE },
{ func_802B6000_E24920, world_action_walk_ROM_START, world_action_walk_ROM_END, TRUE }, [ACTION_STATE_WALK] { action_update_walk, ACTION_FILE(walk), TRUE },
{ action_run_update, world_action_walk_ROM_START, world_action_walk_ROM_END, TRUE }, [ACTION_STATE_RUN] { action_update_run, ACTION_FILE(walk), TRUE },
{ func_802B60B4_E240F4, world_action_jump_ROM_START, world_action_jump_ROM_END, TRUE }, [ACTION_STATE_JUMP] { action_update_jump, ACTION_FILE(jump), TRUE },
{ func_802B60B4_E240F4, world_action_jump_ROM_START, world_action_jump_ROM_END, TRUE }, [ACTION_STATE_BOUNCE] { action_update_jump, ACTION_FILE(jump), TRUE },
{ func_802B60B4_E240F4, world_action_jump_ROM_START, world_action_jump_ROM_END, FALSE }, [ACTION_STATE_HOP] { action_update_jump, ACTION_FILE(jump), FALSE },
{ func_802B60B4_E240F4, world_action_jump_ROM_START, world_action_jump_ROM_END, FALSE }, [ACTION_STATE_LAUNCH] { action_update_jump, ACTION_FILE(jump), FALSE },
{ func_802B6198_E241D8, world_action_jump_ROM_START, world_action_jump_ROM_END, FALSE }, [ACTION_STATE_LANDING_ON_SWITCH] { action_update_landing_on_switch, ACTION_FILE(jump), FALSE },
{ func_802B6294_E242D4, world_action_jump_ROM_START, world_action_jump_ROM_END, TRUE }, [ACTION_STATE_FALLING] { action_update_falling, ACTION_FILE(jump), TRUE },
{ func_802B6348_E24388, world_action_jump_ROM_START, world_action_jump_ROM_END, TRUE }, [ACTION_STATE_STEP_DOWN] { action_update_step_down, ACTION_FILE(jump), TRUE },
{ func_802B6000_E24920, world_action_land_ROM_START, world_action_land_ROM_END, TRUE }, [ACTION_STATE_LAND] { action_update_land, ACTION_FILE(land), TRUE },
{ func_802B61C0_E24AE0, world_action_land_ROM_START, world_action_land_ROM_END, TRUE }, [ACTION_STATE_STEP_DOWN_LAND] { action_update_step_down_land, ACTION_FILE(land), TRUE },
{ func_802B6638_E29068, world_action_encounter_ROM_START, world_action_encounter_ROM_END, TRUE }, [ACTION_STATE_TALK] { action_update_talk, ACTION_FILE(misc), TRUE },
{ func_802B6000_E24920, world_action_super_boots_ROM_START, world_action_super_boots_ROM_END, FALSE }, [ACTION_STATE_SPIN_JUMP] { action_update_spin_jump, ACTION_FILE(spin_jump), FALSE },
{ func_802B6000_E24920, world_action_super_boots_ROM_START, world_action_super_boots_ROM_END, FALSE }, [ACTION_STATE_SPIN_POUND] { action_update_spin_jump, ACTION_FILE(spin_jump), FALSE },
{ func_802B6000_E24920, world_action_ultra_boots_ROM_START, world_action_ultra_boots_ROM_END, FALSE }, [ACTION_STATE_TORNADO_JUMP] { action_update_tornado_jump, ACTION_FILE(tornado_jump), FALSE },
{ func_802B6000_E24920, world_action_ultra_boots_ROM_START, world_action_ultra_boots_ROM_END, FALSE }, [ACTION_STATE_TORNADO_POUND] { action_update_tornado_jump, ACTION_FILE(tornado_jump), FALSE },
{ func_802B6060_E27570, world_action_slide_ROM_START, world_action_slide_ROM_END, FALSE }, [ACTION_STATE_SLIDING] { action_update_sliding, ACTION_FILE(slide), FALSE },
{ action_hammer_update, world_action_hammer_ROM_START, world_action_hammer_ROM_END, FALSE }, [ACTION_STATE_HAMMER] { action_update_hammer, ACTION_FILE(hammer), FALSE },
{ func_802B6350_E28D80, world_action_encounter_ROM_START, world_action_encounter_ROM_END, TRUE }, [ACTION_STATE_13] { action_update_launch, ACTION_FILE(misc), TRUE },
{ func_802B6508_E28F38, world_action_encounter_ROM_START, world_action_encounter_ROM_END, FALSE }, [ACTION_STATE_PUSHING_BLOCK] { action_update_pushing_block, ACTION_FILE(misc), FALSE },
{ func_802B6000_E24920, world_action_hit_fire_ROM_START, world_action_hit_fire_ROM_END, FALSE }, [ACTION_STATE_HIT_FIRE] { action_update_hit_fire, ACTION_FILE(hit_fire), FALSE },
{ func_802B6000_E24920, world_action_16_ROM_START, world_action_16_ROM_END, FALSE }, [ACTION_STATE_KNOCKBACK] { action_update_knockback, ACTION_FILE(knockback), FALSE },
{ func_802B6000_E24920, world_action_hit_lava_ROM_START, world_action_hit_lava_ROM_END, FALSE }, [ACTION_STATE_HIT_LAVA] { action_update_hit_lava, ACTION_FILE(hit_lava), FALSE },
{ func_802B6230_E24800, world_action_18_ROM_START, world_action_18_ROM_END, TRUE }, [ACTION_STATE_STEP_UP_PEACH] { action_update_step_up_peach, ACTION_FILE(step_up), TRUE },
{ func_802B6120_E2A7D0, world_action_sneaky_parasol_ROM_START, world_action_sneaky_parasol_ROM_END, TRUE }, [ACTION_STATE_USE_SNEAKY_PARASOL] { action_update_parasol, ACTION_FILE(sneaky_parasol), TRUE },
{ func_802B6000_E24920, world_action_spin_ROM_START, world_action_spin_ROM_END, FALSE }, [ACTION_STATE_SPIN] { action_update_spin, ACTION_FILE(spin), FALSE },
{ func_802B63D4_E28E04, world_action_encounter_ROM_START, world_action_encounter_ROM_END, FALSE }, [ACTION_STATE_ENEMY_FIRST_STRIKE] { action_update_first_strike, ACTION_FILE(misc), FALSE },
{ func_802B6478_E28EA8, world_action_encounter_ROM_START, world_action_encounter_ROM_END, FALSE }, [ACTION_STATE_RAISE_ARMS] { action_update_raise_arms, ACTION_FILE(misc), FALSE },
{ func_802B60A4_E29514, world_action_use_spinning_flower_ROM_START, world_action_use_spinning_flower_ROM_END, FALSE }, [ACTION_STATE_USE_SPINNING_FLOWER] { action_update_use_spinning_flower, ACTION_FILE(use_spinning_flower), FALSE },
{ func_802B6000_E24920, world_action_use_munchlesia_ROM_START, world_action_use_munchlesia_ROM_END, FALSE }, [ACTION_STATE_USE_MUNCHLESIA] { action_update_use_munchlesia, ACTION_FILE(use_munchlesia), FALSE },
{ func_802B6000_E24920, world_action_use_tweester_ROM_START, world_action_use_tweester_ROM_END, FALSE }, [ACTION_STATE_USE_TWEESTER] { action_update_use_tweester, ACTION_FILE(use_tweester), FALSE },
{ func_802B6350_E28D80, world_action_encounter_ROM_START, world_action_encounter_ROM_END, TRUE }, [ACTION_STATE_BOUNCE_OFF_SWITCH] { action_update_launch, ACTION_FILE(misc), TRUE },
{ func_802B6000_E24920, world_action_encounter_ROM_START, world_action_encounter_ROM_END, FALSE }, [ACTION_STATE_RIDE] { action_update_ride, ACTION_FILE(misc), FALSE },
{ func_802B6000_E24920, world_action_18_ROM_START, world_action_18_ROM_END, TRUE }, [ACTION_STATE_STEP_UP] { action_update_step_up, ACTION_FILE(step_up), TRUE },
{ func_802B609C_E28ACC, world_action_encounter_ROM_START, world_action_encounter_ROM_END, FALSE }, [ACTION_STATE_23] { action_update_state_23, ACTION_FILE(misc), FALSE },
{ func_802B6350_E28D80, world_action_encounter_ROM_START, world_action_encounter_ROM_END, FALSE }, [ACTION_STATE_24] { action_update_launch, ACTION_FILE(misc), FALSE },
{ func_802B6350_E28D80, world_action_walk_ROM_START, world_action_walk_ROM_END, FALSE }, //@bug function does not exist in world_action_walk, causes jump to middle of action_update_run and crashes
{ func_802B6350_E28D80, world_action_encounter_ROM_START, world_action_encounter_ROM_END, TRUE }, [ACTION_STATE_INVALID_25] { action_update_launch, ACTION_FILE(walk), FALSE },
[ACTION_STATE_USE_SPRING] { action_update_launch, ACTION_FILE(misc), TRUE },
}; };

View File

@ -23,6 +23,6 @@ extern f32 D_800F7B90;
extern Action PlayerActionsTable[39]; extern Action PlayerActionsTable[39];
extern DisguiseAnims BasicPeachDisguiseAnims[4]; extern DisguiseAnims BasicPeachDisguiseAnims[4];
extern s32* PeachDisguiseExtraAnims[4]; extern AnimID* PeachDisguiseExtraAnims[4];
#endif #endif

View File

@ -151,7 +151,7 @@ void N(func_80241068_BDFDF8)(Evt* script, MobileAISettings* aiSettings, EnemyDet
npc->duration = aiSettings->waitTime / 2 + rand_int(aiSettings->waitTime / 2 + 1); npc->duration = aiSettings->waitTime / 2 + rand_int(aiSettings->waitTime / 2 + 1);
} else { } else {
script->functionTemp[0] = 4; script->functionTemp[0] = 4;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
} }
} }
} }

View File

@ -1086,7 +1086,7 @@ void N(func_80241068_BE8C48)(Evt* script, MobileAISettings* aiSettings, EnemyDet
npc->duration = aiSettings->waitTime / 2 + rand_int(aiSettings->waitTime / 2 + 1); npc->duration = aiSettings->waitTime / 2 + rand_int(aiSettings->waitTime / 2 + 1);
} else { } else {
script->functionTemp[0] = 4; script->functionTemp[0] = 4;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
} }
} }
} }

View File

@ -7,7 +7,7 @@ ApiStatus N(func_80240000_BF47A0)(Evt* script, s32 isInitialCall) {
if (isInitialCall) { if (isInitialCall) {
script->functionTemp[0] = 0; script->functionTemp[0] = 0;
suggest_player_anim_clearUnkFlag(0x10007); suggest_player_anim_clearUnkFlag(ANIM_Mario_AnimMidairStill);
} }
temp_f20 = func_800E34D8(); temp_f20 = func_800E34D8();

View File

@ -2515,7 +2515,7 @@ void N(func_80242214_96B3D4)(s32 arg0, f32* arg1, f32* arg2, f32* arg3, f32* arg
Matrix4f sp60; Matrix4f sp60;
Matrix4f spA0; Matrix4f spA0;
guPositionF(spA0, 0.0f, -gCameras[gCurrentCameraID].currentYaw, 0.0f, SPRITE_WORLD_SCALE, guPositionF(spA0, 0.0f, -gCameras[gCurrentCameraID].currentYaw, 0.0f, SPRITE_WORLD_SCALE_F,
evt_get_variable(N(D_8024EFCC), ArrayVar(4)), evt_get_variable(N(D_8024EFCC), ArrayVar(5)), evt_get_variable(N(D_8024EFCC), ArrayVar(4)), evt_get_variable(N(D_8024EFCC), ArrayVar(5)),
evt_get_variable(N(D_8024EFCC), ArrayVar(6))); evt_get_variable(N(D_8024EFCC), ArrayVar(6)));
@ -2539,7 +2539,7 @@ void N(func_80242EAC_96C06C)(Evt* script, s32 isInitialCall) {
Matrix4f sp20; Matrix4f sp20;
u32 temp_s1; u32 temp_s1;
guPositionF(sp20, 0.0f, -gCameras[gCurrentCameraID].currentYaw, 0.0f, SPRITE_WORLD_SCALE, guPositionF(sp20, 0.0f, -gCameras[gCurrentCameraID].currentYaw, 0.0f, SPRITE_WORLD_SCALE_F,
evt_get_variable(N(D_8024EFCC), ArrayVar(4)), evt_get_variable(N(D_8024EFCC), ArrayVar(5)), evt_get_variable(N(D_8024EFCC), ArrayVar(4)), evt_get_variable(N(D_8024EFCC), ArrayVar(5)),
evt_get_variable(N(D_8024EFCC), ArrayVar(6))); evt_get_variable(N(D_8024EFCC), ArrayVar(6)));

View File

@ -1145,18 +1145,18 @@ ApiStatus N(func_80240158_CA73F8)(Evt* script, s32 isInitialCall) {
add_vec2D_polar(&sp10, &sp14, 46.0f, clamp); add_vec2D_polar(&sp10, &sp14, 46.0f, clamp);
} }
} }
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_RUN]; npc->currentAnim = enemy->animList[ENEMY_ANIM_RUN];
npc->yaw = atan2(npc->pos.x, npc->pos.z, sp10, sp14); npc->yaw = atan2(npc->pos.x, npc->pos.z, sp10, sp14);
npc_move_heading(npc, 2.0f, npc->yaw); npc_move_heading(npc, 2.0f, npc->yaw);
} else if (temp_f4 > 0.2) { } else if (temp_f4 > 0.2) {
npc->yaw = atan2(npc->pos.x, npc->pos.z, sp10, sp14); npc->yaw = atan2(npc->pos.x, npc->pos.z, sp10, sp14);
npc->pos.x = sp10; npc->pos.x = sp10;
npc->pos.z = sp14; npc->pos.z = sp14;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_WALK]; npc->currentAnim = enemy->animList[ENEMY_ANIM_WALK];
} else { } else {
npc->pos.x = sp10; npc->pos.x = sp10;
npc->pos.z = sp14; npc->pos.z = sp14;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
} }
return ApiStatus_BLOCK; return ApiStatus_BLOCK;
} }

View File

@ -3,7 +3,7 @@
ApiStatus N(func_80242940_CD4770)(Evt* script, s32 isInitialCall) { ApiStatus N(func_80242940_CD4770)(Evt* script, s32 isInitialCall) {
script->varTable[0] = 0; script->varTable[0] = 0;
do {} while (0); do {} while (0);
if (gPlayerStatus.actionState == ACTION_STATE_GROUND_POUND || gPlayerStatus.actionState == ACTION_STATE_ULTRA_POUND) { if (gPlayerStatus.actionState == ACTION_STATE_SPIN_POUND || gPlayerStatus.actionState == ACTION_STATE_TORNADO_POUND) {
script->varTable[0] = 1; script->varTable[0] = 1;
} }
return ApiStatus_DONE2; return ApiStatus_DONE2;

View File

@ -99,9 +99,9 @@ ApiStatus func_80241B28_97F5F8(Evt* script, s32 isInitialCall) {
ambush->rot.x = 0; ambush->rot.x = 0;
ambush->rot.y = 0; ambush->rot.y = 0;
ambush->rot.z = 0; ambush->rot.z = 0;
ambush->scale.x = SPRITE_WORLD_SCALE; ambush->scale.x = SPRITE_WORLD_SCALE_F;
ambush->scale.y = SPRITE_WORLD_SCALE; ambush->scale.y = SPRITE_WORLD_SCALE_F;
ambush->scale.z = SPRITE_WORLD_SCALE; ambush->scale.z = SPRITE_WORLD_SCALE_F;
ambush->renderYaw = 85.0f; ambush->renderYaw = 85.0f;
ambush->alpha = 0.0f; ambush->alpha = 0.0f;

View File

@ -107,9 +107,9 @@ ApiStatus func_80241BA8_991388(Evt* script, s32 isInitialCall) {
ambush->rot.x = 0.0f; ambush->rot.x = 0.0f;
ambush->rot.y = 0.0f; ambush->rot.y = 0.0f;
ambush->rot.z = 90.0f; ambush->rot.z = 90.0f;
ambush->scale.x = SPRITE_WORLD_SCALE; ambush->scale.x = SPRITE_WORLD_SCALE_F;
ambush->scale.y = SPRITE_WORLD_SCALE; ambush->scale.y = SPRITE_WORLD_SCALE_F;
ambush->scale.z = SPRITE_WORLD_SCALE; ambush->scale.z = SPRITE_WORLD_SCALE_F;
ambush->renderYaw = 60.0f; ambush->renderYaw = 60.0f;
ambush->color.r = 255.0f; ambush->color.r = 255.0f;
ambush->color.g = 128.0f; ambush->color.g = 128.0f;

View File

@ -97,9 +97,9 @@ ApiStatus func_80241AF0_994220(Evt* script, s32 isInitialCall) {
ambush->rot.x = 0; ambush->rot.x = 0;
ambush->rot.y = 0; ambush->rot.y = 0;
ambush->rot.z = 0; ambush->rot.z = 0;
ambush->scale.x = SPRITE_WORLD_SCALE; ambush->scale.x = SPRITE_WORLD_SCALE_F;
ambush->scale.y = SPRITE_WORLD_SCALE; ambush->scale.y = SPRITE_WORLD_SCALE_F;
ambush->scale.z = SPRITE_WORLD_SCALE; ambush->scale.z = SPRITE_WORLD_SCALE_F;
ambush->renderYaw = 270.0f; ambush->renderYaw = 270.0f;
ambush->foldID = 0; ambush->foldID = 0;

View File

@ -1,7 +1,7 @@
#include "iwa_00.h" #include "iwa_00.h"
ApiStatus func_802402B0_90CEF0(Evt* script, s32 isInitialCall) { ApiStatus func_802402B0_90CEF0(Evt* script, s32 isInitialCall) {
gPlayerStatus.unk_D0 = script->varTablePtr[0]; gPlayerStatus.slideParams = script->varTablePtr[0];
gPlayerStatus.flags |= PLAYER_STATUS_FLAGS_10; gPlayerStatus.flags |= PLAYER_STATUS_FLAGS_10;
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }

View File

@ -1,7 +1,7 @@
#include "iwa_01.h" #include "iwa_01.h"
ApiStatus func_802432B0_912960(Evt* script, s32 isInitialCall) { ApiStatus func_802432B0_912960(Evt* script, s32 isInitialCall) {
gPlayerStatus.unk_D0 = script->varTablePtr[0]; gPlayerStatus.slideParams = script->varTablePtr[0];
gPlayerStatus.flags |= PLAYER_STATUS_ANIM_FLAGS_INTERACT_PROMPT_AVAILABLE; gPlayerStatus.flags |= PLAYER_STATUS_ANIM_FLAGS_INTERACT_PROMPT_AVAILABLE;
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }

View File

@ -3,7 +3,7 @@
#include "world/common/enemy/CleftAI.inc.c" #include "world/common/enemy/CleftAI.inc.c"
ApiStatus func_80241320_919ED0(Evt* script, s32 isInitialCall) { ApiStatus func_80241320_919ED0(Evt* script, s32 isInitialCall) {
gPlayerStatus.unk_D0 = script->varTablePtr[0]; gPlayerStatus.slideParams = script->varTablePtr[0];
gPlayerStatus.flags |= PLAYER_STATUS_FLAGS_10; gPlayerStatus.flags |= PLAYER_STATUS_FLAGS_10;
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }

View File

@ -16,12 +16,12 @@ ApiStatus func_80240000_ABB290(Evt* script, s32 isInitialCall) {
ApiStatus func_80240040_ABB2D0(Evt* script, s32 isInitialCall) { ApiStatus func_80240040_ABB2D0(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos; Bytecode* args = script->ptrReadPos;
PlayerStatus *status = &gPlayerStatus; PlayerStatus* status = &gPlayerStatus;
if (evt_get_variable(script, *args++) == 0) { if (evt_get_variable(script, *args++) == 0) {
status->unk_D0 = &D_8024160C_ABC89C; status->slideParams = &D_8024160C_ABC89C;
} else { } else {
status->unk_D0 = &D_8024162C_ABC8BC; status->slideParams = &D_8024162C_ABC8BC;
} }
status->flags |= PLAYER_STATUS_FLAGS_10; status->flags |= PLAYER_STATUS_FLAGS_10;

View File

@ -83,8 +83,8 @@ ApiStatus func_80240694_AF3334(Evt* script, s32 isInitialCall) {
ApiStatus func_80240730_AF33D0(Evt* script, s32 isInitialCall) { ApiStatus func_80240730_AF33D0(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos; Bytecode* args = script->ptrReadPos;
gPlayerStatus.unk_C4 = evt_get_float_variable(script, *args++); gPlayerStatus.peachItemHeld = evt_get_float_variable(script, *args++);
gGameStatusPtr->peachCookingIngredient = gPlayerStatus.unk_C4; gGameStatusPtr->peachCookingIngredient = gPlayerStatus.peachItemHeld;
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }

View File

@ -251,8 +251,8 @@ ApiStatus func_80240B8C_AF84DC(Evt* script, s32 isInitialCall) {
ApiStatus func_80240C10_AF8560(Evt* script, s32 isInitialCall) { ApiStatus func_80240C10_AF8560(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos; Bytecode* args = script->ptrReadPos;
gPlayerStatus.unk_C4 = evt_get_variable(script, *args++); gPlayerStatus.peachItemHeld = evt_get_variable(script, *args++);
gGameStatusPtr->peachCookingIngredient = gPlayerStatus.unk_C4; gGameStatusPtr->peachCookingIngredient = gPlayerStatus.peachItemHeld;
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }

View File

@ -19,9 +19,9 @@ ApiStatus func_802406EC_B070EC(Evt* script, s32 isInitialCall) {
unkStruct->rot.x = 0.0f; unkStruct->rot.x = 0.0f;
unkStruct->rot.y = 0.0f; unkStruct->rot.y = 0.0f;
unkStruct->rot.z = 0.0f; unkStruct->rot.z = 0.0f;
unkStruct->scale.x = SPRITE_WORLD_SCALE; unkStruct->scale.x = SPRITE_WORLD_SCALE_F;
unkStruct->scale.y = SPRITE_WORLD_SCALE; unkStruct->scale.y = SPRITE_WORLD_SCALE_F;
unkStruct->scale.z = SPRITE_WORLD_SCALE; unkStruct->scale.z = SPRITE_WORLD_SCALE_F;
unkStruct->foldID = func_8013A704(1); unkStruct->foldID = func_8013A704(1);
unkStruct->entityID = create_generic_entity_world(NULL, kkj_25_UnkFoldFunc); unkStruct->entityID = create_generic_entity_world(NULL, kkj_25_UnkFoldFunc);

View File

@ -2,6 +2,25 @@
#include "world/common/CheckPartnerFlags1000.inc.c" #include "world/common/CheckPartnerFlags1000.inc.c"
#ifdef NON_MATCHING
ApiStatus func_8024366C_8B36DC(Evt* script, s32 isInitialCall) {
static s32* D_8025578C_8C57FC[4]; // EnemyTerritoryWander
Bytecode* args = script->ptrReadPos;
s32 enemyIndex = evt_get_variable(script, *args++);
s32 territoryIndex = evt_get_variable(script, *args++);
s32* src = D_8025578C_8C57FC[territoryIndex];
Enemy* enemy = get_enemy(enemyIndex);
s32 i;
for (i = 0; i < 0xE; i++) {
enemy->territory.raw[i] = src[i];
}
return ApiStatus_DONE2;
}
#else
INCLUDE_ASM(s32, "world/area_kmr/kmr_02/8B36B0", func_8024366C_8B36DC); INCLUDE_ASM(s32, "world/area_kmr/kmr_02/8B36B0", func_8024366C_8B36DC);
#endif
#include "world/common/UnkFunc42.inc.c" #include "world/common/UnkFunc42.inc.c"

View File

@ -28,7 +28,7 @@ ApiStatus func_8024073C_A57BEC(Evt* script, s32 isInitialCall) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
if (gCollisionStatus.currentFloor == floor || gCollisionStatus.lastTouchedFloor == floor) { if (gCollisionStatus.currentFloor == floor || gCollisionStatus.lastTouchedFloor == floor) {
if (playerStatus->actionState != ACTION_STATE_ULTRA_JUMP && if (playerStatus->actionState != ACTION_STATE_TORNADO_JUMP &&
playerStatus->actionState != ACTION_STATE_SPIN_JUMP && playerStatus->actionState != ACTION_STATE_SPIN_JUMP &&
temp_a0 == 0) temp_a0 == 0)
{ {

View File

@ -30,7 +30,7 @@ ApiStatus func_80240050_A6ACF0(Evt* script, s32 isInitialCall) {
} else { } else {
animID = 0xA0003; animID = 0xA0003;
} }
npc->currentAnim.w = animID; npc->currentAnim = animID;
evt_set_variable(script, outVar, playerStatus->targetYaw); evt_set_variable(script, outVar, playerStatus->targetYaw);
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }

View File

@ -40,9 +40,9 @@ ApiStatus func_80243380_803C00(Evt* script, s32 isInitialCall) {
temp_v0->rot.x = 0.0f; temp_v0->rot.x = 0.0f;
temp_v0->rot.y = 0.0f; temp_v0->rot.y = 0.0f;
temp_v0->rot.z = 0.0f; temp_v0->rot.z = 0.0f;
temp_v0->scale.x = SPRITE_WORLD_SCALE; temp_v0->scale.x = SPRITE_WORLD_SCALE_F;
temp_v0->scale.y = SPRITE_WORLD_SCALE; temp_v0->scale.y = SPRITE_WORLD_SCALE_F;
temp_v0->scale.z = SPRITE_WORLD_SCALE; temp_v0->scale.z = SPRITE_WORLD_SCALE_F;
temp_v0->foldID = func_8013A704(1); temp_v0->foldID = func_8013A704(1);
temp_v0->entityID = create_generic_entity_world(NULL, mac_01_UnkFoldFunc); temp_v0->entityID = create_generic_entity_world(NULL, mac_01_UnkFoldFunc);
evt_set_variable(script, MapVar(10), (s32) temp_v0); evt_set_variable(script, MapVar(10), (s32) temp_v0);

View File

@ -436,7 +436,7 @@ ApiStatus N(RunMinigame)(Evt* script, s32 isInitialCall) {
case BOX_STATE_FUZZY_IDLE: case BOX_STATE_FUZZY_IDLE:
data->box[i].stateTimer--; data->box[i].stateTimer--;
if (data->box[i].stateTimer <= 0) { if (data->box[i].stateTimer <= 0) {
npc->currentAnim.w = NPC_ANIM_fuzzy_Palette_00_Anim_2; npc->currentAnim = NPC_ANIM_fuzzy_Palette_00_Anim_2;
data->box[i].state = BOX_STATE_FUZZY_POPUP; data->box[i].state = BOX_STATE_FUZZY_POPUP;
sfx_play_sound_at_position(enemy->varTable[8], 0x100000, npc->pos.x, npc->pos.y, npc->pos.z); sfx_play_sound_at_position(enemy->varTable[8], 0x100000, npc->pos.x, npc->pos.y, npc->pos.z);
get_model_center_and_size(data->box[i].modelID, &centerX, &centerY, &centerZ, &sizeX, &sizeY, &sizeZ); get_model_center_and_size(data->box[i].modelID, &centerX, &centerY, &centerZ, &sizeX, &sizeY, &sizeZ);
@ -482,7 +482,7 @@ ApiStatus N(RunMinigame)(Evt* script, s32 isInitialCall) {
sfx_play_sound(enemy->varTable[8]); sfx_play_sound(enemy->varTable[8]);
data->box[i].state = BOX_STATE_FUZZY_ATTACH; data->box[i].state = BOX_STATE_FUZZY_ATTACH;
gPlayerStatusPtr->anim = ANIM_Mario_CrouchStill; gPlayerStatusPtr->anim = ANIM_Mario_CrouchStill;
npc->currentAnim.w = NPC_ANIM_fuzzy_Palette_00_Anim_3; npc->currentAnim = NPC_ANIM_fuzzy_Palette_00_Anim_3;
get_model_center_and_size(data->box[i].modelID, &centerX, &centerY, &centerZ, &sizeX, &sizeY, &sizeZ); get_model_center_and_size(data->box[i].modelID, &centerX, &centerY, &centerZ, &sizeX, &sizeY, &sizeZ);
npc->pos.x = centerX; npc->pos.x = centerX;
npc->pos.y = centerY; npc->pos.y = centerY;
@ -509,7 +509,7 @@ ApiStatus N(RunMinigame)(Evt* script, s32 isInitialCall) {
gPlayerStatusPtr->anim = ANIM_Mario_CrouchStill; gPlayerStatusPtr->anim = ANIM_Mario_CrouchStill;
npc->duration--; npc->duration--;
if (npc->duration <= 0) { if (npc->duration <= 0) {
npc->currentAnim.w = NPC_ANIM_fuzzy_Palette_00_Anim_F; npc->currentAnim = NPC_ANIM_fuzzy_Palette_00_Anim_F;
gPlayerStatusPtr->anim = ANIM_Mario_RunPanic; gPlayerStatusPtr->anim = ANIM_Mario_RunPanic;
data->mashProgress = 0; data->mashProgress = 0;
npc->pos.x = gPlayerStatusPtr->position.x; npc->pos.x = gPlayerStatusPtr->position.x;
@ -535,7 +535,7 @@ ApiStatus N(RunMinigame)(Evt* script, s32 isInitialCall) {
hud_element_set_script(data->hudElemID_AButton, &HES_AButton); hud_element_set_script(data->hudElemID_AButton, &HES_AButton);
hud_element_set_alpha(data->hudElemID_AButton, 160); hud_element_set_alpha(data->hudElemID_AButton, 160);
hud_element_set_alpha(data->hudElemID_Meter, 160); hud_element_set_alpha(data->hudElemID_Meter, 160);
npc->currentAnim.w = NPC_ANIM_fuzzy_Palette_00_Anim_8; npc->currentAnim = NPC_ANIM_fuzzy_Palette_00_Anim_8;
npc->pos.y += 3.0; npc->pos.y += 3.0;
} }
break; break;
@ -600,7 +600,7 @@ ApiStatus N(RunMinigame)(Evt* script, s32 isInitialCall) {
case BOX_STATE_BOMB_HIT: case BOX_STATE_BOMB_HIT:
enable_npc_shadow(npc); enable_npc_shadow(npc);
npc->duration = 15; npc->duration = 15;
npc->currentAnim.w = NPC_ANIM_bob_omb_Palette_00_Anim_5; npc->currentAnim = NPC_ANIM_bob_omb_Palette_00_Anim_5;
data->stunFlags |= (STUN_FLAGS_STUNNED | STUN_FLAGS_CHANGED); data->stunFlags |= (STUN_FLAGS_STUNNED | STUN_FLAGS_CHANGED);
data->box[i].state = BOX_STATE_BOMB_ATTACK; data->box[i].state = BOX_STATE_BOMB_ATTACK;
get_model_center_and_size(data->box[i].modelID, &centerX, &centerY, &centerZ, &sizeX, &sizeY, &sizeZ); get_model_center_and_size(data->box[i].modelID, &centerX, &centerY, &centerZ, &sizeX, &sizeY, &sizeZ);
@ -934,7 +934,7 @@ ApiStatus N(CleanupGame)(Evt* script, s32 isInitialCall) {
if (data->box[i].state != BOX_STATE_FUZZY_END) { if (data->box[i].state != BOX_STATE_FUZZY_END) {
data->box[i].state = BOX_STATE_FUZZY_END; data->box[i].state = BOX_STATE_FUZZY_END;
fx_emote(EMOTE_QUESTION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, 0.0f, 30, &writeback); fx_emote(EMOTE_QUESTION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, 0.0f, 30, &writeback);
npc->currentAnim.w = NPC_ANIM_fuzzy_Palette_00_Anim_E; npc->currentAnim = NPC_ANIM_fuzzy_Palette_00_Anim_E;
enable_npc_shadow(npc); enable_npc_shadow(npc);
} }
break; break;
@ -943,7 +943,7 @@ ApiStatus N(CleanupGame)(Evt* script, s32 isInitialCall) {
if (data->box[i].state != BOX_STATE_BOMB_END) { if (data->box[i].state != BOX_STATE_BOMB_END) {
data->box[i].state = BOX_STATE_BOMB_END; data->box[i].state = BOX_STATE_BOMB_END;
fx_emote(EMOTE_QUESTION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, 0.0f, 30, &writeback); fx_emote(EMOTE_QUESTION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, 0.0f, 30, &writeback);
npc->currentAnim.w = NPC_ANIM_bob_omb_Palette_00_Anim_1C; npc->currentAnim = NPC_ANIM_bob_omb_Palette_00_Anim_1C;
enable_npc_shadow(npc); enable_npc_shadow(npc);
} }
break; break;

View File

@ -28,7 +28,7 @@ ApiStatus func_802423CC_D8F61C(Evt *script, s32 isInitialCall) {
if (isInitialCall || (enemy->aiFlags & ENEMY_AI_FLAGS_4)) { if (isInitialCall || (enemy->aiFlags & ENEMY_AI_FLAGS_4)) {
script->functionTemp[0] = 0; script->functionTemp[0] = 0;
npc->duration = 0; npc->duration = 0;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
npc->flags &= ~NPC_FLAG_JUMPING; npc->flags &= ~NPC_FLAG_JUMPING;
if (!enemy->territory->patrol.isFlying) { if (!enemy->territory->patrol.isFlying) {
npc->flags |= NPC_FLAG_GRAVITY; npc->flags |= NPC_FLAG_GRAVITY;

View File

@ -14,7 +14,7 @@ ApiStatus func_80240960_86F460(Evt* script, s32 isInitialCall) {
if (gCollisionStatus.currentFloor != D_80242930_871430[i]) { if (gCollisionStatus.currentFloor != D_80242930_871430[i]) {
continue; continue;
} }
if ((player->actionState == ACTION_STATE_GROUND_POUND) || (player->actionState == ACTION_STATE_ULTRA_POUND)) { if ((player->actionState == ACTION_STATE_SPIN_POUND) || (player->actionState == ACTION_STATE_TORNADO_POUND)) {
return ApiStatus_BLOCK; return ApiStatus_BLOCK;
} }
} }

View File

@ -63,7 +63,7 @@ ApiStatus func_80240C20_872650(Evt* script, s32 isInitialCall) {
PlayerStatus* player = &gPlayerStatus; PlayerStatus* player = &gPlayerStatus;
if ((gCollisionStatus.currentFloor == 9) || (gCollisionStatus.currentFloor == 0xB)) { if ((gCollisionStatus.currentFloor == 9) || (gCollisionStatus.currentFloor == 0xB)) {
if ((player->actionState == ACTION_STATE_GROUND_POUND) || (player->actionState == ACTION_STATE_ULTRA_POUND)) { if ((player->actionState == ACTION_STATE_SPIN_POUND) || (player->actionState == ACTION_STATE_TORNADO_POUND)) {
return ApiStatus_BLOCK; return ApiStatus_BLOCK;
} }
} }

View File

@ -12,7 +12,7 @@ ApiStatus func_80241390_87AF70(Evt* script, s32 isInitialCall) {
if (gCollisionStatus.currentFloor != D_802449B0_87E590[i]) { if (gCollisionStatus.currentFloor != D_802449B0_87E590[i]) {
continue; continue;
} }
if ((player->actionState == ACTION_STATE_GROUND_POUND) || (player->actionState == ACTION_STATE_ULTRA_POUND)) { if ((player->actionState == ACTION_STATE_SPIN_POUND) || (player->actionState == ACTION_STATE_TORNADO_POUND)) {
return ApiStatus_BLOCK; return ApiStatus_BLOCK;
} }
} }

View File

@ -87,14 +87,14 @@ void func_80240020_9AE720(void) {
ApiStatus func_80240404_9AEB04(Evt* script, s32 isInitialCall) { ApiStatus func_80240404_9AEB04(Evt* script, s32 isInitialCall) {
N(D_80243090).pos.x = gPlayerStatus.position.x; N(D_80243090).pos.x = gPlayerStatus.position.x;
N(D_80243090).pos.y = gPlayerStatus.position.y + (gPlayerStatus.colliderHeight * SPRITE_PIXEL_SCALE * 0.5); N(D_80243090).pos.y = gPlayerStatus.position.y + (gPlayerStatus.colliderHeight * SPRITE_WORLD_SCALE_D * 0.5);
N(D_80243090).pos.z = gPlayerStatus.position.z; N(D_80243090).pos.z = gPlayerStatus.position.z;
N(D_80243090).rot.x = 0.0f; N(D_80243090).rot.x = 0.0f;
N(D_80243090).rot.y = 0.0f; N(D_80243090).rot.y = 0.0f;
N(D_80243090).rot.z = 0.0f; N(D_80243090).rot.z = 0.0f;
N(D_80243090).scale.x = SPRITE_WORLD_SCALE; N(D_80243090).scale.x = SPRITE_WORLD_SCALE_F;
N(D_80243090).scale.y = SPRITE_WORLD_SCALE; N(D_80243090).scale.y = SPRITE_WORLD_SCALE_F;
N(D_80243090).scale.z = SPRITE_WORLD_SCALE; N(D_80243090).scale.z = SPRITE_WORLD_SCALE_F;
N(D_80243090).foldStateID = func_8013A704(1); N(D_80243090).foldStateID = func_8013A704(1);
N(D_80243090).entityID = create_generic_entity_world(0, func_80240020_9AE720); N(D_80243090).entityID = create_generic_entity_world(0, func_80240020_9AE720);
return ApiStatus_DONE2; return ApiStatus_DONE2;
@ -113,7 +113,7 @@ ApiStatus func_80240508_9AEC08(Evt* script, s32 isInitialCall) {
s32 z = evt_get_float_variable(script, *args++); s32 z = evt_get_float_variable(script, *args++);
N(D_80243090).pos.x = x; N(D_80243090).pos.x = x;
N(D_80243090).pos.y = y + (gPlayerStatus.colliderHeight * SPRITE_PIXEL_SCALE * 0.5); N(D_80243090).pos.y = y + (gPlayerStatus.colliderHeight * SPRITE_WORLD_SCALE_D * 0.5);
N(D_80243090).pos.z = z; N(D_80243090).pos.z = z;
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }

View File

@ -109,7 +109,7 @@ void func_80240360_B1B8D0(void* data) {
guMtxCatF(main, rotation, main); guMtxCatF(main, rotation, main);
guRotateF(rotation, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f); guRotateF(rotation, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f);
guMtxCatF(main, rotation, main); guMtxCatF(main, rotation, main);
guScaleF(scale, SPRITE_WORLD_SCALE, SPRITE_WORLD_SCALE, SPRITE_WORLD_SCALE); guScaleF(scale, SPRITE_WORLD_SCALE_F, SPRITE_WORLD_SCALE_F, SPRITE_WORLD_SCALE_F);
guMtxCatF(main, scale, main); guMtxCatF(main, scale, main);
guTranslateF(translation, playerStatus->position.x, playerStatus->position.y, -playerStatus->position.z); guTranslateF(translation, playerStatus->position.x, playerStatus->position.y, -playerStatus->position.z);
guMtxCatF(main, translation, main); guMtxCatF(main, translation, main);

View File

@ -51,11 +51,11 @@ void func_80240100_B1CB50(void* data) {
guMtxCatF(main, rotation, main); guMtxCatF(main, rotation, main);
guRotateF(rotation, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f); guRotateF(rotation, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f);
guMtxCatF(main, rotation, main); guMtxCatF(main, rotation, main);
guScaleF(scale, SPRITE_WORLD_SCALE, SPRITE_WORLD_SCALE, SPRITE_WORLD_SCALE); guScaleF(scale, SPRITE_WORLD_SCALE_F, SPRITE_WORLD_SCALE_F, SPRITE_WORLD_SCALE_F);
guMtxCatF(main, scale, main); guMtxCatF(main, scale, main);
guTranslateF(translation, playerStatus->position.x, playerStatus->position.y, -playerStatus->position.z); guTranslateF(translation, playerStatus->position.x, playerStatus->position.y, -playerStatus->position.z);
guMtxCatF(main, translation, main); guMtxCatF(main, translation, main);
spr_update_player_sprite(1, playerStatus->trueAnimation ^ 0x1000000, 1.0f); spr_update_player_sprite(1, playerStatus->trueAnimation ^ SPRITE_ID_BACK_FACING, 1.0f);
spr_draw_player_sprite(1, 0, 0, NULL, main); spr_draw_player_sprite(1, 0, 0, NULL, main);
} }
@ -104,7 +104,7 @@ void func_802403B8_B1CE08(void* data) {
guMtxCatF(sp20, spA0, sp20); guMtxCatF(sp20, spA0, sp20);
guRotateF(spA0, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f); guRotateF(spA0, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f);
guMtxCatF(sp20, spA0, sp20); guMtxCatF(sp20, spA0, sp20);
guScaleF(spE0, SPRITE_PIXEL_SCALE, -SPRITE_PIXEL_SCALE, SPRITE_PIXEL_SCALE); guScaleF(spE0, SPRITE_WORLD_SCALE_D, -SPRITE_WORLD_SCALE_D, SPRITE_WORLD_SCALE_D);
guMtxCatF(sp20, spE0, sp20); guMtxCatF(sp20, spE0, sp20);
guTranslateF(sp60, playerStatus->position.x, -playerStatus->position.y, playerStatus->position.z); guTranslateF(sp60, playerStatus->position.x, -playerStatus->position.y, playerStatus->position.z);
guMtxCatF(sp20, sp60, sp20); guMtxCatF(sp20, sp60, sp20);
@ -116,7 +116,7 @@ void func_802403B8_B1CE08(void* data) {
guMtxCatF(sp20, spA0, sp20); guMtxCatF(sp20, spA0, sp20);
guRotateF(spA0, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f); guRotateF(spA0, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f);
guMtxCatF(sp20, spA0, sp20); guMtxCatF(sp20, spA0, sp20);
guScaleF(spE0, SPRITE_PIXEL_SCALE, SPRITE_PIXEL_SCALE, SPRITE_PIXEL_SCALE); guScaleF(spE0, SPRITE_WORLD_SCALE_D, SPRITE_WORLD_SCALE_D, SPRITE_WORLD_SCALE_D);
guMtxCatF(sp20, spE0, sp20); guMtxCatF(sp20, spE0, sp20);
guTranslateF(sp60, playerStatus->position.x, playerStatus->position.y, 0.0f); guTranslateF(sp60, playerStatus->position.x, playerStatus->position.y, 0.0f);
guMtxCatF(sp20, sp60, sp20); guMtxCatF(sp20, sp60, sp20);

View File

@ -8,7 +8,7 @@ ApiStatus func_80240000_B1D760(Evt* script, s32 isInitialCall) {
f32 dist = dist2D(playerStatus->position.x, playerStatus->position.z, script->array[2], script->array[3]); f32 dist = dist2D(playerStatus->position.x, playerStatus->position.z, script->array[2], script->array[3]);
script->varTable[0] = 1; script->varTable[0] = 1;
if (playerStatus->actionState != ACTION_STATE_GROUND_POUND && playerStatus->actionState != ACTION_STATE_ULTRA_POUND) { if (playerStatus->actionState != ACTION_STATE_SPIN_POUND && playerStatus->actionState != ACTION_STATE_TORNADO_POUND) {
script->varTable[0] = 0; script->varTable[0] = 0;
} }
if (script->array[4] <= dist) { if (script->array[4] <= dist) {

View File

@ -45,14 +45,14 @@ ApiStatus N(LetterDelivery_CalcLetterPos)(Evt* script, s32 isInitialCall) {
ApiStatus N(LetterDelivery_SaveNpcAnim)(Evt* script, s32 isInitialCall) { ApiStatus N(LetterDelivery_SaveNpcAnim)(Evt* script, s32 isInitialCall) {
Npc* npc = get_npc_unsafe(script->varTable[2]); Npc* npc = get_npc_unsafe(script->varTable[2]);
N(LetterDelivery_SavedNpcAnim) = npc->currentAnim.w; N(LetterDelivery_SavedNpcAnim) = npc->currentAnim;
npc->currentAnim.w = script->varTable[4]; npc->currentAnim = script->varTable[4];
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }
ApiStatus N(LetterDelivery_RestoreNpcAnim)(Evt* script, s32 isInitialCall) { ApiStatus N(LetterDelivery_RestoreNpcAnim)(Evt* script, s32 isInitialCall) {
Npc* npc = get_npc_unsafe(script->varTable[2]); Npc* npc = get_npc_unsafe(script->varTable[2]);
npc->currentAnim.w = N(LetterDelivery_SavedNpcAnim); npc->currentAnim = N(LetterDelivery_SavedNpcAnim);
return ApiStatus_DONE2; return ApiStatus_DONE2;
} }

View File

@ -20,10 +20,10 @@ ApiStatus N(UnkAngleFunc001)(Evt* script, s32 isInitialCall) {
} }
y = npc->pos.y; y = npc->pos.y;
if (npc->currentAnim.w == 0xB60000 || if (npc->currentAnim == 0xB60000 ||
npc->currentAnim.w == 0xB60004 || npc->currentAnim == 0xB60004 ||
npc->currentAnim.w == 0xB60008 || npc->currentAnim == 0xB60008 ||
npc->currentAnim.w == 0xB6000C) npc->currentAnim == 0xB6000C)
{ {
y += 2.0f * sin_deg(N(unkAngle1)); y += 2.0f * sin_deg(N(unkAngle1));
} }

View File

@ -43,7 +43,7 @@ ApiStatus N(UnkFunc001)(Evt* script, s32 isInitialCall) {
switch (script->functionTemp[0]) { switch (script->functionTemp[0]) {
case 0: case 0:
npc->currentAnim.w = enemy->animList[0]; npc->currentAnim = enemy->animList[0];
npc->verticalRenderOffset = npc->collisionHeight; npc->verticalRenderOffset = npc->collisionHeight;
npc->flags |= NPC_FLAG_UPSIDE_DOWN; npc->flags |= NPC_FLAG_UPSIDE_DOWN;
script->functionTemp[1] = 0; script->functionTemp[1] = 0;
@ -63,7 +63,7 @@ ApiStatus N(UnkFunc001)(Evt* script, s32 isInitialCall) {
break; break;
} }
case 10: case 10:
npc->currentAnim.w = enemy->animList[3]; npc->currentAnim = enemy->animList[3];
npc->planarFlyDist = atan2(npc->pos.x, npc->pos.z, playerStatus->position.x, playerStatus->position.z); npc->planarFlyDist = atan2(npc->pos.x, npc->pos.z, playerStatus->position.x, playerStatus->position.z);
npc->jumpScale = 1.3f; npc->jumpScale = 1.3f;
npc->jumpVelocity = 0.0f; npc->jumpVelocity = 0.0f;
@ -173,7 +173,7 @@ ApiStatus N(UnkFunc001)(Evt* script, s32 isInitialCall) {
break; break;
} }
case 14: case 14:
npc->currentAnim.w = enemy->animList[8]; npc->currentAnim = enemy->animList[8];
npc->verticalRenderOffset = npc->collisionHeight; npc->verticalRenderOffset = npc->collisionHeight;
npc->flags |= NPC_FLAG_UPSIDE_DOWN; npc->flags |= NPC_FLAG_UPSIDE_DOWN;
npc->duration = 15; npc->duration = 15;

View File

@ -6,7 +6,7 @@ ApiStatus N(UnkFunc11)(Evt* script, s32 isInitialCall) {
PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus = &gPlayerStatus;
CollisionStatus* collisionStatus = &gCollisionStatus; CollisionStatus* collisionStatus = &gCollisionStatus;
if (((collisionStatus->pushingAgainstWall != pushableColliderID) && (playerStatus->actionState == ACTION_STATE_14)) || if (((collisionStatus->pushingAgainstWall != pushableColliderID) && (playerStatus->actionState == ACTION_STATE_PUSHING_BLOCK)) ||
playerStatus->enableCollisionOverlapsCheck || playerStatus->inputEnabledCounter) { playerStatus->enableCollisionOverlapsCheck || playerStatus->inputEnabledCounter) {
set_action_state(ACTION_STATE_IDLE); set_action_state(ACTION_STATE_IDLE);
script->varTable[0] = 0; script->varTable[0] = 0;
@ -15,7 +15,7 @@ ApiStatus N(UnkFunc11)(Evt* script, s32 isInitialCall) {
if (collisionStatus->pushingAgainstWall != pushableColliderID) { if (collisionStatus->pushingAgainstWall != pushableColliderID) {
script->varTable[0] = 0; script->varTable[0] = 0;
} else if ((playerStatus->actionState != ACTION_STATE_14) && (playerStatus->actionState != ACTION_STATE_WALK) && } else if ((playerStatus->actionState != ACTION_STATE_PUSHING_BLOCK) && (playerStatus->actionState != ACTION_STATE_WALK) &&
(playerStatus->actionState != ACTION_STATE_RUN)) { (playerStatus->actionState != ACTION_STATE_RUN)) {
script->varTable[0] = 0; script->varTable[0] = 0;
} else if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT) { } else if (playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_HOLDING_WATT) {

View File

@ -4,9 +4,9 @@
ApiStatus N(UnkFunc44)(Evt* script, s32 isInitialCall) { ApiStatus N(UnkFunc44)(Evt* script, s32 isInitialCall) {
script->varTable[0] = 0; script->varTable[0] = 0;
do {} while (0); do {} while (0);
if (gPlayerStatus.actionState == ACTION_STATE_GROUND_POUND) { if (gPlayerStatus.actionState == ACTION_STATE_SPIN_POUND) {
script->varTable[0] = 1; script->varTable[0] = 1;
} else if (gPlayerStatus.actionState == ACTION_STATE_ULTRA_POUND) { } else if (gPlayerStatus.actionState == ACTION_STATE_TORNADO_POUND) {
script->varTable[0] = 1; script->varTable[0] = 1;
} }
return ApiStatus_DONE2; return ApiStatus_DONE2;

View File

@ -7,18 +7,18 @@
// temporarily copied from StashVars to allow static varStash // temporarily copied from StashVars to allow static varStash
ApiStatus N(StashVars)(Evt* script, s32 isInitialCall) { ApiStatus N(StashVars)(Evt* script, s32 isInitialCall) {
static s32** varStash = NULL; static s32* varStash = NULL;
s32 i; s32 i;
if (varStash == NULL) { if (varStash == NULL) {
varStash = heap_malloc(sizeof(script->varTable)); varStash = heap_malloc(sizeof(script->varTable));
for (i = 0; i < ARRAY_COUNT(script->varTable); i++) { for (i = 0; i < ARRAY_COUNT(script->varTable); i++) {
varStash[i] = (s32*) script->varTable[i]; varStash[i] = script->varTable[i];
} }
} else { } else {
for (i = 0; i < ARRAY_COUNT(script->varTable); i++) { for (i = 0; i < ARRAY_COUNT(script->varTable); i++) {
script->varTable[i] = (s32) varStash[i]; script->varTable[i] = varStash[i];
} }
heap_free(varStash); heap_free(varStash);

View File

@ -23,11 +23,11 @@ void N(SetPartnerFlags80000)(void);
void N(SetPartnerFlags20000)(void); void N(SetPartnerFlags20000)(void);
s32 N(reflection_unk_resolve_anim)(s32 playerAnim) { s32 N(reflection_unk_resolve_anim)(s32 playerAnim) {
u32 val; AnimID temp;
playerAnim &= ~0x1000000; playerAnim &= ~SPRITE_ID_BACK_FACING;
val = playerAnim + ~0x6000B; temp = playerAnim + ~ANIM_Mario_6000B;
if (val < 0x10 && val & 1) { if (temp < 16 && temp & 1) {
playerAnim--; playerAnim--;
} }
@ -35,32 +35,31 @@ s32 N(reflection_unk_resolve_anim)(s32 playerAnim) {
} }
s32 N(reflection_unk_change_anim_facing)(s32 playerAnim) { s32 N(reflection_unk_change_anim_facing)(s32 playerAnim) {
s32 temp_v1 = playerAnim >> 0x10; s32 sprIndex = (playerAnim >> 0x10) & 0xFF;
u32 temp_v1_2; u32 temp;
switch ((u8)temp_v1) { switch (sprIndex) {
case 1: case SPR_Mario_1:
if (playerAnim > 0x1000C) { if (playerAnim > ANIM_Mario_1000C) {
return playerAnim; return playerAnim;
} }
break; break;
case 6: case SPR_Mario_6:
// above function, inlined temp = playerAnim + ~ANIM_Mario_6000B;
temp_v1_2 = playerAnim + 0xFFF9FFF4; // + ~0x0006000B if (temp < 16) {
if (temp_v1_2 < 16) { if (temp & 1) {
if (temp_v1_2 & 1) {
return playerAnim; return playerAnim;
} else { } else {
return playerAnim + 1; return playerAnim + 1;
} }
} }
break; break;
case 8: case SPR_Mario_8:
case 9: case SPR_Mario_9:
return playerAnim; return playerAnim;
} }
return playerAnim | 0x1000000; return playerAnim | SPRITE_ID_BACK_FACING;
} }
ApiStatus N(ReflectWall)(Evt* script, s32 isInitialCall) { ApiStatus N(ReflectWall)(Evt* script, s32 isInitialCall) {
@ -94,7 +93,7 @@ void N(reflection_setup_wall)(void) {
spr_update_player_sprite(2, anim, 1.0f); spr_update_player_sprite(2, anim, 1.0f);
if (!(playerStatus->flags & 0x20000)) { if (!(playerStatus->flags & PLAYER_STATUS_FLAGS_20000)) {
if (playerStatus->alpha1 != D_802D9D70) { if (playerStatus->alpha1 != D_802D9D70) {
if (playerStatus->alpha1 < 254) { if (playerStatus->alpha1 < 254) {
renderMode = RENDER_MODE_SURFACE_XLU_LAYER1; renderMode = RENDER_MODE_SURFACE_XLU_LAYER1;
@ -132,7 +131,7 @@ void N(reflection_render_wall)(PlayerStatus* playerStatus) {
guMtxCatF(main, rotation, main); guMtxCatF(main, rotation, main);
guRotateF(rotation, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f); guRotateF(rotation, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f);
guMtxCatF(main, rotation, main); guMtxCatF(main, rotation, main);
guScaleF(scale, SPRITE_WORLD_SCALE, SPRITE_WORLD_SCALE, SPRITE_WORLD_SCALE); guScaleF(scale, SPRITE_WORLD_SCALE_F, SPRITE_WORLD_SCALE_F, SPRITE_WORLD_SCALE_F);
guMtxCatF(main, scale, main); guMtxCatF(main, scale, main);
guTranslateF(translation, playerStatus->position.x, playerStatus->position.y, -playerStatus->position.z - 3.0f); guTranslateF(translation, playerStatus->position.x, playerStatus->position.y, -playerStatus->position.z - 3.0f);
guMtxCatF(main, translation, main); guMtxCatF(main, translation, main);
@ -159,9 +158,7 @@ void N(reflection_setup_floor)(void) {
s32 renderMode = playerStatus->renderMode; s32 renderMode = playerStatus->renderMode;
RenderTask renderTask; RenderTask renderTask;
RenderTask* renderTaskPtr = &renderTask; RenderTask* renderTaskPtr = &renderTask;
s32 screenX; s32 screenX, screenY, screenZ;
s32 screenY;
s32 screenZ;
if (playerStatus->flags & 1) { if (playerStatus->flags & 1) {
entityModel = get_entity_model(get_shadow_by_index(playerStatus->shadowID)->entityModelID); entityModel = get_entity_model(get_shadow_by_index(playerStatus->shadowID)->entityModelID);
@ -171,7 +168,7 @@ void N(reflection_setup_floor)(void) {
spr_update_player_sprite(1, playerStatus->trueAnimation, 1.0f); spr_update_player_sprite(1, playerStatus->trueAnimation, 1.0f);
if (!(playerStatus->flags & 0x20000)) { if (!(playerStatus->flags & PLAYER_STATUS_FLAGS_20000)) {
if (playerStatus->alpha1 != D_802D9D71) { if (playerStatus->alpha1 != D_802D9D71) {
if (playerStatus->alpha1 < 254) { if (playerStatus->alpha1 < 254) {
renderMode = RENDER_MODE_SURFACE_XLU_LAYER1; renderMode = RENDER_MODE_SURFACE_XLU_LAYER1;
@ -191,7 +188,7 @@ void N(reflection_setup_floor)(void) {
renderTaskPtr->appendGfxArg = playerStatus; renderTaskPtr->appendGfxArg = playerStatus;
renderTaskPtr->distance = -screenZ; renderTaskPtr->distance = -screenZ;
renderTaskPtr->appendGfx = (void (*)(void*)) ( renderTaskPtr->appendGfx = (void (*)(void*)) (
!(playerStatus->flags & 0x20000) !(playerStatus->flags & PLAYER_STATUS_FLAGS_20000)
? N(reflection_render_floor) ? N(reflection_render_floor)
: N(reflection_render_floor_fancy) : N(reflection_render_floor_fancy)
); );
@ -214,7 +211,7 @@ void N(reflection_render_floor)(PlayerStatus* playerStatus) {
guMtxCatF(main, rotation, main); guMtxCatF(main, rotation, main);
guRotateF(rotation, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f); guRotateF(rotation, playerStatus->spriteFacingAngle, 0.0f, 1.0f, 0.0f);
guMtxCatF(main, rotation, main); guMtxCatF(main, rotation, main);
guScaleF(scale, SPRITE_WORLD_SCALE, -SPRITE_WORLD_SCALE, SPRITE_WORLD_SCALE); guScaleF(scale, SPRITE_WORLD_SCALE_F, -SPRITE_WORLD_SCALE_F, SPRITE_WORLD_SCALE_F);
guMtxCatF(main, scale, main); guMtxCatF(main, scale, main);
guTranslateF(translation, playerStatus->position.x, -playerStatus->position.y, playerStatus->position.z); guTranslateF(translation, playerStatus->position.x, -playerStatus->position.y, playerStatus->position.z);
guMtxCatF(main, translation, main); guMtxCatF(main, translation, main);
@ -303,15 +300,14 @@ void N(reflection_render_floor_fancy)(PlayerStatus* playerStatus) {
guMtxCatF(mtx, rotation, mtx); guMtxCatF(mtx, rotation, mtx);
guTranslateF(translation, 0.0f, playerStatus->colliderHeight * 0.5f, 0.0f); guTranslateF(translation, 0.0f, playerStatus->colliderHeight * 0.5f, 0.0f);
guMtxCatF(mtx, translation, mtx); guMtxCatF(mtx, translation, mtx);
guScaleF(scale, SPRITE_WORLD_SCALE, -SPRITE_WORLD_SCALE, SPRITE_WORLD_SCALE); guScaleF(scale, SPRITE_WORLD_SCALE_F, -SPRITE_WORLD_SCALE_F, SPRITE_WORLD_SCALE_F);
guMtxCatF(mtx, scale, mtx); guMtxCatF(mtx, scale, mtx);
guTranslateF(translation, px, -py, pz); guTranslateF(translation, px, -py, pz);
guMtxCatF(mtx, translation, mtx); guMtxCatF(mtx, translation, mtx);
flags = 1;
if (playerStatus->spriteFacingAngle >= 90.0f && playerStatus->spriteFacingAngle < 270.0f) { if (playerStatus->spriteFacingAngle >= 90.0f && playerStatus->spriteFacingAngle < 270.0f) {
flags = 0x10000001; flags |= 0x10000000;
} else {
flags = 1;
} }
spr_draw_player_sprite(flags, 0, 0, NULL, mtx); spr_draw_player_sprite(flags, 0, 0, NULL, mtx);

View File

@ -88,14 +88,14 @@ ApiStatus N(BulletBillAI_Main)(Evt* script, s32 isInitialCall) {
npc->pos.z = blasterNpc->pos.z + 1.0; npc->pos.z = blasterNpc->pos.z + 1.0;
npc->yaw = blasterNpc->yaw; npc->yaw = blasterNpc->yaw;
npc->moveSpeed = aiSettings->chaseSpeed; npc->moveSpeed = aiSettings->chaseSpeed;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_RUN]; npc->currentAnim = enemy->animList[ENEMY_ANIM_RUN];
add_vec2D_polar(&npc->pos.x, &npc->pos.z, 25.0f, npc->yaw); add_vec2D_polar(&npc->pos.x, &npc->pos.z, 25.0f, npc->yaw);
if (npc->yaw < 180.0f) { if (npc->yaw < 180.0f) {
npc->renderYaw = 180.0f; npc->renderYaw = 180.0f;
} else { } else {
npc->renderYaw = 0.0f; npc->renderYaw = 0.0f;
} }
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_CHASE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_CHASE];
npc->duration = 300; npc->duration = 300;
npc->flags |= (NPC_FLAG_DIRTY_SHADOW | NPC_FLAG_LOCK_ANIMS); npc->flags |= (NPC_FLAG_DIRTY_SHADOW | NPC_FLAG_LOCK_ANIMS);
enable_npc_shadow(npc); enable_npc_shadow(npc);
@ -122,7 +122,7 @@ ApiStatus N(BulletBillAI_Main)(Evt* script, s32 isInitialCall) {
} }
if (hitDetected) { if (hitDetected) {
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_HIT]; npc->currentAnim = enemy->animList[ENEMY_ANIM_HIT];
ai_enemy_play_sound(npc, SOUND_B0000018, 0); ai_enemy_play_sound(npc, SOUND_B0000018, 0);
fx_ring_blast(0, npc->pos.x, npc->pos.y + 5.0f, npc->pos.z + 1.0f, 0.05f, 20); fx_ring_blast(0, npc->pos.x, npc->pos.y + 5.0f, npc->pos.z + 1.0f, 0.05f, 20);
fx_smoke_burst(0, npc->pos.x, npc->pos.y + 5.0f, npc->pos.z + 0.0f, 1.2f, 25); fx_smoke_burst(0, npc->pos.x, npc->pos.y + 5.0f, npc->pos.z + 0.0f, 1.2f, 25);
@ -162,7 +162,7 @@ ApiStatus N(BillBlasterAI_Main)(Evt* script, s32 isInitialCall) {
if (isInitialCall) { if (isInitialCall) {
script->AI_TEMP_STATE = AI_STATE_BLASTER_INIT; script->AI_TEMP_STATE = AI_STATE_BLASTER_INIT;
npc->duration = 30; npc->duration = 30;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
enemy->flags |= ENEMY_FLAGS_200000; enemy->flags |= ENEMY_FLAGS_200000;
disable_npc_shadow(npc); disable_npc_shadow(npc);
} }
@ -173,7 +173,7 @@ ApiStatus N(BillBlasterAI_Main)(Evt* script, s32 isInitialCall) {
} }
if (enemy->aiFlags & ENEMY_AI_FLAGS_4) { if (enemy->aiFlags & ENEMY_AI_FLAGS_4) {
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
if (enemy->aiPaused != 0) { if (enemy->aiPaused != 0) {
return ApiStatus_BLOCK; return ApiStatus_BLOCK;
} }
@ -195,7 +195,7 @@ ApiStatus N(BillBlasterAI_Main)(Evt* script, s32 isInitialCall) {
bulletEnemy->VAR_PROJECTILE_HITBOX_STATE = PROJECTILE_HITBOX_STATE_INIT; bulletEnemy->VAR_PROJECTILE_HITBOX_STATE = PROJECTILE_HITBOX_STATE_INIT;
bulletEnemy->AI_VAR_BULLET_BLASTER = enemy->npcID; bulletEnemy->AI_VAR_BULLET_BLASTER = enemy->npcID;
bulletEnemy->AI_VAR_BULLET_RANGE = enemy->AI_VAR_BLASTER_RANGE; bulletEnemy->AI_VAR_BULLET_RANGE = enemy->AI_VAR_BLASTER_RANGE;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_MELEE_PRE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_MELEE_PRE];
npc->duration = 10; npc->duration = 10;
script->AI_TEMP_STATE = AI_STATE_BLASTER_FIRE; script->AI_TEMP_STATE = AI_STATE_BLASTER_FIRE;
} else { } else {
@ -208,7 +208,7 @@ ApiStatus N(BillBlasterAI_Main)(Evt* script, s32 isInitialCall) {
if (npc->duration > 0) { if (npc->duration > 0) {
break; break;
} }
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
bulletEnemy = get_enemy(enemy->AI_VAR_BLASTER_BULLET); bulletEnemy = get_enemy(enemy->AI_VAR_BLASTER_BULLET);
bulletEnemy->VAR_PROJECTILE_HITBOX_STATE = PROJECTILE_HITBOX_STATE_PRE; bulletEnemy->VAR_PROJECTILE_HITBOX_STATE = PROJECTILE_HITBOX_STATE_PRE;
ai_enemy_play_sound(npc, SOUND_328, 0x200000); ai_enemy_play_sound(npc, SOUND_328, 0x200000);

View File

@ -62,7 +62,7 @@ void N(CleftAI_HidingInit)(Evt* script, MobileAISettings* aiSettings, EnemyDetec
npc->collisionRadius = 24; npc->collisionRadius = 24;
script->functionTemp[1] = 0; script->functionTemp[1] = 0;
npc->duration = 0; npc->duration = 0;
npc->currentAnim.w = enemy->animList[8]; npc->currentAnim = enemy->animList[8];
script->AI_TEMP_STATE = AI_STATE_CLEFT_HIDING; script->AI_TEMP_STATE = AI_STATE_CLEFT_HIDING;
} }
@ -74,7 +74,7 @@ void N(CleftAI_Hiding)(Evt* script, MobileAISettings* aiSettings, EnemyDetectVol
if (script->functionTemp[1] <= 0) { if (script->functionTemp[1] <= 0) {
script->functionTemp[1] = aiSettings->playerSearchInterval; script->functionTemp[1] = aiSettings->playerSearchInterval;
if (basic_ai_check_player_dist(volume, enemy, aiSettings->alertRadius * 0.85, aiSettings->alertOffsetDist, FALSE)) { if (basic_ai_check_player_dist(volume, enemy, aiSettings->alertRadius * 0.85, aiSettings->alertOffsetDist, FALSE)) {
npc->currentAnim.w = enemy->animList[9]; npc->currentAnim = enemy->animList[9];
fx_emote(EMOTE_EXCLAMATION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 15, &emoteTemp); fx_emote(EMOTE_EXCLAMATION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 15, &emoteTemp);
ai_enemy_play_sound(npc, SOUND_2F4, 0x200000); ai_enemy_play_sound(npc, SOUND_2F4, 0x200000);
npc->duration = 12; npc->duration = 12;
@ -93,7 +93,7 @@ void N(CleftAI_PreAmbush)(Evt* script, MobileAISettings* aiSettings, EnemyDetect
if (npc->duration <= 0) { if (npc->duration <= 0) {
npc->yaw = atan2(npc->pos.x, npc->pos.z, gPlayerStatusPtr->position.x, gPlayerStatusPtr->position.z); npc->yaw = atan2(npc->pos.x, npc->pos.z, gPlayerStatusPtr->position.x, gPlayerStatusPtr->position.z);
enable_npc_shadow(npc); enable_npc_shadow(npc);
npc->currentAnim.w = enemy->animList[10]; npc->currentAnim = enemy->animList[10];
npc->duration = 8; npc->duration = 8;
script->AI_TEMP_STATE = AI_STATE_CLEFT_AMBUSH; script->AI_TEMP_STATE = AI_STATE_CLEFT_AMBUSH;
} }
@ -116,7 +116,7 @@ void N(CleftAI_FindPlayerInit)(Evt* script, MobileAISettings* aiSettings, EnemyD
Npc* npc = get_npc_unsafe(enemy->npcID); Npc* npc = get_npc_unsafe(enemy->npcID);
npc->yaw = clamp_angle(npc->yaw + rand_int(180) - 90.0f); npc->yaw = clamp_angle(npc->yaw + rand_int(180) - 90.0f);
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
script->functionTemp[1] = rand_int(1000) % 2 + 2; script->functionTemp[1] = rand_int(1000) % 2 + 2;
script->AI_TEMP_STATE = AI_STATE_CLEFT_FIND_PLAYER; script->AI_TEMP_STATE = AI_STATE_CLEFT_FIND_PLAYER;
} }
@ -150,7 +150,7 @@ void N(CleftAI_RevUpInit)(Evt* script, MobileAISettings* aiSettings, EnemyDetect
Npc* npc = get_npc_unsafe(enemy->npcID); Npc* npc = get_npc_unsafe(enemy->npcID);
npc->duration = enemy->varTable[10]; npc->duration = enemy->varTable[10];
npc->currentAnim.w = enemy->animList[13]; npc->currentAnim = enemy->animList[13];
script->AI_TEMP_STATE = AI_STATE_CLEFT_REV_UP; script->AI_TEMP_STATE = AI_STATE_CLEFT_REV_UP;
} }
@ -220,7 +220,7 @@ void N(CleftAI_LosePlayer)(Evt* script, MobileAISettings* aiSettings, EnemyDetec
npc->duration--; npc->duration--;
if (npc->duration <= 0) { if (npc->duration <= 0) {
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_WALK]; npc->currentAnim = enemy->animList[ENEMY_ANIM_WALK];
if (enemy->territory->wander.moveSpeedOverride < 0) { if (enemy->territory->wander.moveSpeedOverride < 0) {
npc->moveSpeed = aiSettings->moveSpeed; npc->moveSpeed = aiSettings->moveSpeed;
} else { } else {
@ -256,7 +256,7 @@ void N(CleftAI_DisguiseInit)(Evt* script, MobileAISettings* aiSettings, EnemyDet
if (npc->turnAroundYawAdjustment == 0 && npc->duration <= 0) { if (npc->turnAroundYawAdjustment == 0 && npc->duration <= 0) {
npc->duration = 8; npc->duration = 8;
npc->currentAnim.w = enemy->animList[11]; npc->currentAnim = enemy->animList[11];
script->AI_TEMP_STATE = AI_STATE_CLEFT_DISGUISE; script->AI_TEMP_STATE = AI_STATE_CLEFT_DISGUISE;
} }
} }
@ -268,7 +268,7 @@ void N(CleftAI_Disguise)(Evt* script, MobileAISettings* aiSettings, EnemyDetectV
npc->duration--; npc->duration--;
if (npc->duration <= 0) { if (npc->duration <= 0) {
npc->duration = 8; npc->duration = 8;
npc->currentAnim.w = enemy->animList[14]; npc->currentAnim = enemy->animList[14];
script->AI_TEMP_STATE = AI_STATE_CLEFT_POST_DISGUISE; script->AI_TEMP_STATE = AI_STATE_CLEFT_POST_DISGUISE;
} }
} }

View File

@ -22,9 +22,9 @@ void N(ClubbaNappingAI_Init)(Evt* script, MobileAISettings* aiSettings, EnemyDet
} }
if (npc->duration == 1) { if (npc->duration == 1) {
npc->currentAnim.w = enemy->animList[12]; npc->currentAnim = enemy->animList[12];
} else if (npc->duration <= 0) { } else if (npc->duration <= 0) {
npc->currentAnim.w = enemy->animList[10]; npc->currentAnim = enemy->animList[10];
npc->duration = 0; npc->duration = 0;
script->AI_TEMP_STATE = AI_STATE_NAPPING_CLUBBA_SLEEP; script->AI_TEMP_STATE = AI_STATE_NAPPING_CLUBBA_SLEEP;
} }
@ -42,13 +42,13 @@ void N(ClubbaNappingAI_Sleep)(Evt* script, MobileAISettings* aiSettings, EnemyDe
if ( gPlayerStatusPtr->actionState == ACTION_STATE_RUN if ( gPlayerStatusPtr->actionState == ACTION_STATE_RUN
|| gPlayerStatusPtr->actionState == ACTION_STATE_SPIN || gPlayerStatusPtr->actionState == ACTION_STATE_SPIN
|| gPlayerStatusPtr->actionState == ACTION_STATE_JUMP || gPlayerStatusPtr->actionState == ACTION_STATE_JUMP
|| gPlayerStatusPtr->actionState == ACTION_STATE_GROUND_POUND || gPlayerStatusPtr->actionState == ACTION_STATE_SPIN_POUND
|| gPlayerStatusPtr->actionState == ACTION_STATE_ULTRA_POUND || gPlayerStatusPtr->actionState == ACTION_STATE_TORNADO_POUND
|| gPlayerStatusPtr->actionState == ACTION_STATE_STEP_DOWN_LAND || gPlayerStatusPtr->actionState == ACTION_STATE_STEP_DOWN_LAND
|| gPlayerStatusPtr->actionState == ACTION_STATE_LAND || gPlayerStatusPtr->actionState == ACTION_STATE_LAND
|| gPlayerStatusPtr->actionState == ACTION_STATE_HAMMER || gPlayerStatusPtr->actionState == ACTION_STATE_HAMMER
|| gPlayerStatusPtr->actionState == ACTION_STATE_13 || gPlayerStatusPtr->actionState == ACTION_STATE_13
|| gPlayerStatusPtr->actionState == ACTION_STATE_25) { || gPlayerStatusPtr->actionState == ACTION_STATE_INVALID_25) {
shouldWakeUp = TRUE; shouldWakeUp = TRUE;
} }
@ -70,8 +70,8 @@ void N(ClubbaNappingAI_Sleep)(Evt* script, MobileAISettings* aiSettings, EnemyDe
} }
if (shouldWakeUp) { if (shouldWakeUp) {
ai_enemy_play_sound(npc, 0xB000000E, 0); ai_enemy_play_sound(npc, SOUND_B000000E, 0);
npc->currentAnim.w = enemy->animList[11]; npc->currentAnim = enemy->animList[11];
npc->duration = 10; npc->duration = 10;
fx_emote(EMOTE_EXCLAMATION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 15, &emoteTemp); fx_emote(EMOTE_EXCLAMATION, npc, 0.0f, npc->collisionHeight, 1.0f, 2.0f, -20.0f, 15, &emoteTemp);
ai_enemy_play_sound(npc, SOUND_2F4, 0x200000); ai_enemy_play_sound(npc, SOUND_2F4, 0x200000);
@ -80,13 +80,13 @@ void N(ClubbaNappingAI_Sleep)(Evt* script, MobileAISettings* aiSettings, EnemyDe
npc->duration++; npc->duration++;
if (npc->duration == 27) { if (npc->duration == 27) {
ai_enemy_play_sound(npc, 0xB000000C, 0); ai_enemy_play_sound(npc, SOUND_B000000C, 0);
} else if (npc->duration == 57) { } else if (npc->duration == 57) {
ai_enemy_play_sound(npc, 0xB000000D, 0); ai_enemy_play_sound(npc, SOUND_B000000D, 0);
} else if (npc->duration == 59) { } else if (npc->duration == 59) {
npc->currentAnim.w = enemy->animList[12]; npc->currentAnim = enemy->animList[12];
} else if (npc->duration == 60) { } else if (npc->duration == 60) {
npc->currentAnim.w = enemy->animList[10]; npc->currentAnim = enemy->animList[10];
npc->duration = 0; npc->duration = 0;
} }
} }
@ -108,7 +108,7 @@ void N(ClubbaNappingAI_LoiterInit)(Evt* script, MobileAISettings* aiSettings, En
Npc* npc = get_npc_unsafe(enemy->npcID); Npc* npc = get_npc_unsafe(enemy->npcID);
npc->yaw = clamp_angle((npc->yaw + rand_int(180)) - 90.0f); npc->yaw = clamp_angle((npc->yaw + rand_int(180)) - 90.0f);
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
script->functionTemp[1] = (rand_int(1000) % 2) + 2; // chose random number 2-3 script->functionTemp[1] = (rand_int(1000) % 2) + 2; // chose random number 2-3
script->AI_TEMP_STATE = AI_STATE_NAPPING_CLUBBA_LOITER; script->AI_TEMP_STATE = AI_STATE_NAPPING_CLUBBA_LOITER;
} }
@ -153,7 +153,7 @@ void N(ClubbaNappingAI_ReturnHomeInit)(Evt* script, MobileAISettings* aiSettings
npc->duration--; npc->duration--;
if (npc->duration <= 0) { if (npc->duration <= 0) {
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_WALK]; npc->currentAnim = enemy->animList[ENEMY_ANIM_WALK];
if (enemy->territory->wander.moveSpeedOverride < 0) { if (enemy->territory->wander.moveSpeedOverride < 0) {
npc->moveSpeed = aiSettings->moveSpeed; npc->moveSpeed = aiSettings->moveSpeed;
} else { } else {
@ -173,7 +173,7 @@ void N(ClubbaNappingAI_ReturnHome)(Evt* script, MobileAISettings* aiSettings, En
script->AI_TEMP_STATE = AI_STATE_CHASE_INIT; script->AI_TEMP_STATE = AI_STATE_CHASE_INIT;
} else if (dist2D(npc->pos.x, npc->pos.z, enemy->territory->wander.centerPos.x, } else if (dist2D(npc->pos.x, npc->pos.z, enemy->territory->wander.centerPos.x,
enemy->territory->wander.centerPos.z) <= npc->moveSpeed) { enemy->territory->wander.centerPos.z) <= npc->moveSpeed) {
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
npc->duration = 15; npc->duration = 15;
enemy->AI_VAR_NEXT_STATE = AI_STATE_NAPPING_CLUBBA_50; enemy->AI_VAR_NEXT_STATE = AI_STATE_NAPPING_CLUBBA_50;
script->AI_TEMP_STATE = AI_STATE_NAPPING_CLUBBA_LOITER_INIT; script->AI_TEMP_STATE = AI_STATE_NAPPING_CLUBBA_LOITER_INIT;
@ -219,7 +219,7 @@ ApiStatus N(ClubbaNappingAI_Main)(Evt* script, s32 isInitialCall) {
if (isInitialCall || (enemy->aiFlags & ENEMY_AI_FLAGS_4)) { if (isInitialCall || (enemy->aiFlags & ENEMY_AI_FLAGS_4)) {
script->AI_TEMP_STATE = AI_STATE_NAPPING_CLUBBA_INIT; script->AI_TEMP_STATE = AI_STATE_NAPPING_CLUBBA_INIT;
npc->duration = 30; npc->duration = 30;
npc->currentAnim.w = enemy->animList[10]; npc->currentAnim = enemy->animList[10];
npc->flags &= ~NPC_FLAG_JUMPING; npc->flags &= ~NPC_FLAG_JUMPING;
enemy->AI_VAR_ATTACK_STATE = MELEE_HITBOX_STATE_NONE; enemy->AI_VAR_ATTACK_STATE = MELEE_HITBOX_STATE_NONE;
if (!enemy->territory->wander.isFlying) { if (!enemy->territory->wander.isFlying) {
@ -230,7 +230,7 @@ ApiStatus N(ClubbaNappingAI_Main)(Evt* script, s32 isInitialCall) {
if (enemy->aiFlags & ENEMY_AI_FLAGS_4) { if (enemy->aiFlags & ENEMY_AI_FLAGS_4) {
script->AI_TEMP_STATE = AI_STATE_SUSPEND; script->AI_TEMP_STATE = AI_STATE_SUSPEND;
script->AI_TEMP_STATE_AFTER_SUSPEND = AI_RETURN_HOME_INIT; script->AI_TEMP_STATE_AFTER_SUSPEND = AI_RETURN_HOME_INIT;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
} }
enemy->aiFlags &= ~ENEMY_AI_FLAGS_4; enemy->aiFlags &= ~ENEMY_AI_FLAGS_4;
} }

View File

@ -25,7 +25,7 @@ ApiStatus N(ClubbaPatrolAI_Main)(Evt* script, s32 isInitialCall) {
if (isInitialCall || (enemy->aiFlags & ENEMY_AI_FLAGS_4)) { if (isInitialCall || (enemy->aiFlags & ENEMY_AI_FLAGS_4)) {
script->AI_TEMP_STATE = AI_STATE_PATROL_INIT; script->AI_TEMP_STATE = AI_STATE_PATROL_INIT;
npc->duration = 0; npc->duration = 0;
npc->currentAnim.w = enemy->animList[ENEMY_ANIM_IDLE]; npc->currentAnim = enemy->animList[ENEMY_ANIM_IDLE];
npc->flags &= ~0x800; npc->flags &= ~0x800;
if (!enemy->territory->patrol.isFlying) { if (!enemy->territory->patrol.isFlying) {
npc->flags |= 0x200; npc->flags |= 0x200;

Some files were not shown because too many files have changed in this diff Show More