mirror of
https://github.com/SAT-R/sa2.git
synced 2026-10-28 18:02:16 +00:00
Research & Document various commonly used objects & systems (#194)
* document ItemBox object * research & document Spring object * research & document Platform objects * research & document misc shared objects * research & document a ton of player related vars & funcs * research & document spikes object * research & document Checkpoint * research & document StageGoal & RoomEvent * add RoomEvent type parameters * add comment(s) for future research
This commit is contained in:
1 parent
c4cc962619
commit
c4b50f9bb1
81 files changed
+1665
-1396
No files matched your search
Vendored
+7
-5
@@ -291,20 +291,20 @@
|
||||
"title_screen.h": "c",
|
||||
"game_modes.h": "c",
|
||||
"main.h": "c",
|
||||
"unknown_task.h": "c",
|
||||
"multiplayer_event_mgr.h": "c",
|
||||
"entities_0.h": "c",
|
||||
"dust_cloud.h": "c",
|
||||
"unknown_effect.h": "c",
|
||||
"mp_attack_1_effect.h": "c",
|
||||
"underwater_effects.h": "c",
|
||||
"dust_effect_braking.h": "c",
|
||||
"water_effects.h": "c",
|
||||
"multiplayer/mp_player.h": "c",
|
||||
"player_unk_2.h": "c",
|
||||
"mp_attack_2_effect.h": "c",
|
||||
"dummy_task.h": "c",
|
||||
"player_super_sonic.h": "c",
|
||||
"assert.h": "c",
|
||||
"arenaalloc.h": "c",
|
||||
"player_unk_1.h": "c",
|
||||
"multiplayer_event_mgr.h": "c",
|
||||
"mp_player.h": "c",
|
||||
"*.m": "c",
|
||||
"ranges": "c",
|
||||
@@ -354,7 +354,9 @@
|
||||
"cgb_tables.h": "c",
|
||||
"stdint.h": "c",
|
||||
"boss_5.h": "c",
|
||||
"boss_9.h": "c"
|
||||
"boss_9.h": "c",
|
||||
"xlocale": "c",
|
||||
"xiosbase": "c"
|
||||
},
|
||||
"asm-code-lens.donated": true,
|
||||
"editor.formatOnSave": true,
|
||||
|
||||
@@ -740,7 +740,7 @@ _080167FE:
|
||||
mov r4, sl
|
||||
cmp r4, #0
|
||||
beq _0801680C
|
||||
bl sub_8019224
|
||||
bl CreateRoomEvent
|
||||
movs r1, #7
|
||||
strb r1, [r0]
|
||||
_0801680C:
|
||||
@@ -940,7 +940,7 @@ _08016956:
|
||||
ands r0, r1
|
||||
str r0, [r2, #0x20]
|
||||
_080169AC:
|
||||
bl sub_8019224
|
||||
bl CreateRoomEvent
|
||||
movs r2, #0
|
||||
movs r1, #8
|
||||
strb r1, [r0]
|
||||
@@ -1356,19 +1356,19 @@ _08016CE2:
|
||||
adds r0, r6, #0
|
||||
bl DisplaySprite
|
||||
_08016CE8:
|
||||
ldr r4, _08016D18 @ =gUnknown_03005B7C
|
||||
ldr r4, _08016D18 @ =gShouldSpawnMPAttackEffect
|
||||
ldrb r0, [r4]
|
||||
cmp r0, #0
|
||||
beq _08016CF8
|
||||
bl sub_8087368
|
||||
bl CreateMPAttackEffect
|
||||
movs r0, #0
|
||||
strb r0, [r4]
|
||||
_08016CF8:
|
||||
ldr r4, _08016D1C @ =gUnknown_0300583C
|
||||
ldr r4, _08016D1C @ =gShouldSpawnMPAttack2Effect
|
||||
ldrb r0, [r4]
|
||||
cmp r0, #0
|
||||
beq _08016D08
|
||||
bl sub_801A384
|
||||
bl CreateMPAttack2Effect
|
||||
movs r0, #0
|
||||
strb r0, [r4]
|
||||
_08016D08:
|
||||
@@ -1381,8 +1381,8 @@ _08016D08:
|
||||
pop {r0}
|
||||
bx r0
|
||||
.align 2, 0
|
||||
_08016D18: .4byte gUnknown_03005B7C
|
||||
_08016D1C: .4byte gUnknown_0300583C
|
||||
_08016D18: .4byte gShouldSpawnMPAttackEffect
|
||||
_08016D1C: .4byte gShouldSpawnMPAttack2Effect
|
||||
|
||||
|
||||
.syntax divided
|
||||
@@ -9,10 +9,11 @@
|
||||
#define ITEM__RINGS_RANDOM 5
|
||||
#define ITEM__RINGS_5 6
|
||||
#define ITEM__RINGS_10 7
|
||||
#define ITEM__MP_8 8
|
||||
#define ITEM__MP_9 9
|
||||
#define ITEM__MP_10 10
|
||||
#define ITEM__MP_11 11
|
||||
#define ITEM__MP_12 12
|
||||
#define ITEM__MP_SWAP 8
|
||||
#define ITEM__MP_CONFUSION 9
|
||||
#define ITEM__MP_SLOWDOWN 10
|
||||
#define ITEM__MP_ATTACK 11
|
||||
#define ITEM__MP_ATTACK_2 12
|
||||
#define ITEM__MP_RANDOM 13
|
||||
|
||||
#endif // GUARD_CONSTANTS_ITEMS_H
|
||||
@@ -4,38 +4,38 @@
|
||||
// NOTE(Jace): Movestates are different across games.
|
||||
|
||||
/* Sonic Advance 2 */
|
||||
#define MOVESTATE_FACING_LEFT 0x00000001
|
||||
#define MOVESTATE_IN_AIR 0x00000002
|
||||
#define MOVESTATE_4 0x00000004
|
||||
#define MOVESTATE_JUMPING (MOVESTATE_IN_AIR | MOVESTATE_4)
|
||||
#define MOVESTATE_8 0x00000008 // COLLIDING_ENTITY ?
|
||||
#define MOVESTATE_10 0x00000010
|
||||
#define MOVESTATE_20 0x00000020
|
||||
#define MOVESTATE_40 0x00000040 // Underwater?
|
||||
#define MOVESTATE_DEAD 0x00000080
|
||||
#define MOVESTATE_100 0x00000100
|
||||
#define MOVESTATE_200 0x00000200
|
||||
#define MOVESTATE_400 0x00000400
|
||||
#define MOVESTATE_ICE_SLIDE 0x00000800
|
||||
#define MOVESTATE_1000 0x00001000
|
||||
#define MOVESTATE_2000 0x00002000
|
||||
#define MOVESTATE_4000 0x00004000
|
||||
#define MOVESTATE_8000 0x00008000
|
||||
#define MOVESTATE_10000 0x00010000
|
||||
#define MOVESTATE_20000 0x00020000
|
||||
#define MOVESTATE_40000 0x00040000
|
||||
#define MOVESTATE_80000 0x00080000
|
||||
#define MOVESTATE_100000 0x00100000
|
||||
#define MOVESTATE_IGNORE_INPUT 0x00200000 // does not ignore Start-Button
|
||||
#define MOVESTATE_400000 0x00400000
|
||||
#define MOVESTATE_800000 0x00800000
|
||||
#define MOVESTATE_1000000 0x01000000
|
||||
#define MOVESTATE_BOOST_EFFECT_ON 0x02000000
|
||||
#define MOVESTATE_4000000 0x04000000
|
||||
#define MOVESTATE_GOAL_REACHED 0x08000000
|
||||
#define MOVESTATE_10000000 0x10000000
|
||||
#define MOVESTATE_20000000 0x20000000
|
||||
#define MOVESTATE_IN_SCRIPTED 0x40000000 // Player speed/pos are currently handled by an Interactable
|
||||
#define MOVESTATE_80000000 0x80000000
|
||||
#define MOVESTATE_FACING_LEFT 0x00000001
|
||||
#define MOVESTATE_IN_AIR 0x00000002
|
||||
#define MOVESTATE_4 0x00000004
|
||||
#define MOVESTATE_JUMPING (MOVESTATE_IN_AIR | MOVESTATE_4)
|
||||
#define MOVESTATE_STOOD_ON_OBJ 0x00000008
|
||||
#define MOVESTATE_FLIP_WITH_MOVE_DIR 0x00000010
|
||||
#define MOVESTATE_20 0x00000020
|
||||
#define MOVESTATE_IN_WATER 0x00000040
|
||||
#define MOVESTATE_DEAD 0x00000080
|
||||
#define MOVESTATE_100 0x00000100
|
||||
#define MOVESTATE_200 0x00000200
|
||||
#define MOVESTATE_400 0x00000400
|
||||
#define MOVESTATE_ICE_SLIDE 0x00000800
|
||||
#define MOVESTATE_1000 0x00001000
|
||||
#define MOVESTATE_2000 0x00002000
|
||||
#define MOVESTATE_4000 0x00004000
|
||||
#define MOVESTATE_8000 0x00008000
|
||||
#define MOVESTATE_10000 0x00010000
|
||||
#define MOVESTATE_20000 0x00020000
|
||||
#define MOVESTATE_40000 0x00040000
|
||||
#define MOVESTATE_80000 0x00080000
|
||||
#define MOVESTATE_100000 0x00100000
|
||||
#define MOVESTATE_IGNORE_INPUT 0x00200000 // does not ignore Start-Button
|
||||
#define MOVESTATE_400000 0x00400000
|
||||
#define MOVESTATE_800000 0x00800000
|
||||
#define MOVESTATE_1000000 0x01000000
|
||||
#define MOVESTATE_BOOST_EFFECT_ON 0x02000000
|
||||
#define MOVESTATE_4000000 0x04000000
|
||||
#define MOVESTATE_GOAL_REACHED 0x08000000
|
||||
#define MOVESTATE_10000000 0x10000000
|
||||
#define MOVESTATE_20000000 0x20000000
|
||||
#define MOVESTATE_IN_SCRIPTED 0x40000000 // Player speed/pos are currently handled by an Interactable
|
||||
#define MOVESTATE_80000000 0x80000000
|
||||
|
||||
#endif // GUARD_MOVESTATES_H
|
||||
@@ -14,14 +14,14 @@
|
||||
|
||||
#define PLTRANS_NONE 0
|
||||
#define PLTRANS_TOUCH_GROUND 1
|
||||
#define PLTRANS_PT2 2
|
||||
#define PLTRANS_CORKSCREW_END 2
|
||||
#define PLTRANS_INIT_JUMP 3
|
||||
#define PLTRANS_PT4 4
|
||||
#define PLTRANS_PT5 5
|
||||
#define PLTRANS_UNCURL 5
|
||||
#define PLTRANS_PT6 6
|
||||
#define PLTRANS_PT7 7
|
||||
#define PLTRANS_PT8 8
|
||||
#define PLTRANS_PT9 9
|
||||
#define PLTRANS_HOMING_ATTACK_RECOIL 8
|
||||
#define PLTRANS_HURT 9
|
||||
#define PLTRANS_REACHED_GOAL 10
|
||||
#define PLTRANS_GRINDING 11
|
||||
#define PLTRANS_GRIND_RAIL_END_GROUND 12
|
||||
@@ -37,9 +37,9 @@
|
||||
#define PLTRANS_RAMP_AND_DASHRING 22
|
||||
#define PLTRANS_PT23 23
|
||||
#define PLTRANS_DASHRING 24
|
||||
#define PLTRANS_PIPE_A 25
|
||||
#define PLTRANS_PIPE_ENTRY 25
|
||||
#define PLTRANS_PROPELLER_SPRING 26
|
||||
#define PLTRANS_CORKSCREW 27
|
||||
#define PLTRANS_PIPE_B 28
|
||||
#define PLTRANS_PIPE_EXIT 28
|
||||
|
||||
#endif // GUARD_PLAYER_TRANSITIONS_H
|
||||
@@ -19,6 +19,9 @@ struct MultiSioData_0_0 {
|
||||
u8 unk3;
|
||||
u32 unk4;
|
||||
u16 unk8[3];
|
||||
|
||||
// TODO: all values from unkE onwards appear to be 'RoomEvent' types?
|
||||
// This seems to apply to all 'MultiSioData_X_X' types?
|
||||
u8 unkE;
|
||||
u8 unkF;
|
||||
u32 unk10;
|
||||
@@ -36,6 +39,9 @@ struct MultiSioData_0_1 {
|
||||
u16 unk6;
|
||||
|
||||
u16 unk8[3];
|
||||
|
||||
// TODO: all values from unkE onwards appear to be 'RoomEvent' types?
|
||||
// This seems to apply to all 'MultiSioData_X_X' types?
|
||||
u8 unkE;
|
||||
u8 unkF;
|
||||
u32 unk10;
|
||||
@@ -53,6 +59,9 @@ struct MultiSioData_0_2 {
|
||||
u16 unk6;
|
||||
|
||||
u16 unk8[3];
|
||||
|
||||
// TODO: all values from unkE onwards appear to be 'RoomEvent' types?
|
||||
// This seems to apply to all 'MultiSioData_X_X' types?
|
||||
u8 unkE;
|
||||
u8 unkF;
|
||||
u32 unk10;
|
||||
@@ -71,6 +80,9 @@ struct MultiSioData_0_3 {
|
||||
|
||||
u32 unk8;
|
||||
u16 unkC;
|
||||
|
||||
// TODO: all values from unkE onwards appear to be 'RoomEvent' types?
|
||||
// This seems to apply to all 'MultiSioData_X_X' types?
|
||||
u8 unkE;
|
||||
u8 unkF;
|
||||
u32 unk10;
|
||||
@@ -89,6 +101,8 @@ struct MultiSioData_0_4 {
|
||||
u8 unkC;
|
||||
u8 unkD;
|
||||
|
||||
// TODO: all values from unkE onwards appear to be 'RoomEvent' types?
|
||||
// This seems to apply to all 'MultiSioData_X_X' types?
|
||||
u8 unkE;
|
||||
u8 numRings;
|
||||
u8 unk10;
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
#ifndef GUARD_MULTIPLAYER_ATTACK_1_EFFECT_H
|
||||
#define GUARD_MULTIPLAYER_ATTACK_1_EFFECT_H
|
||||
|
||||
#include "global.h"
|
||||
|
||||
void CreateMPAttackEffect(void);
|
||||
|
||||
extern s32 gUnused_03005B78;
|
||||
extern bool8 gShouldSpawnMPAttackEffect;
|
||||
|
||||
#endif // GUARD_MULTIPLAYER_ATTACK_1_EFFECT_H
|
||||
@@ -0,0 +1,19 @@
|
||||
|
||||
|
||||
#ifndef GUARD_MULTIPLAYER_ATTACK_2_EFFECT_H
|
||||
#define GUARD_MULTIPLAYER_ATTACK_2_EFFECT_H
|
||||
|
||||
#include "global.h"
|
||||
|
||||
// Copies of BG control regs for Multiplayer(?)
|
||||
typedef struct {
|
||||
u16 timer;
|
||||
u16 sizeChangeDelay;
|
||||
u16 sizeChangeTimer;
|
||||
u16 size;
|
||||
} MultiPlayerBgCtrlRegs; /* size: 8 */
|
||||
extern MultiPlayerBgCtrlRegs *gMPAttackEffect2Regs;
|
||||
|
||||
void CreateMPAttack2Effect(void);
|
||||
|
||||
#endif // GUARD_MULTIPLAYER_ATTACK_2_EFFECT_H
|
||||
@@ -33,6 +33,6 @@ void CreateMultiplayerPlayer(u8);
|
||||
|
||||
void sub_8018818(void);
|
||||
|
||||
extern u8 gUnknown_0300583C;
|
||||
extern bool8 gShouldSpawnMPAttack2Effect;
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,88 @@
|
||||
|
||||
|
||||
#ifndef GUARD_MULTIPLAYER_EVENT_MGR_H
|
||||
#define GUARD_MULTIPLAYER_EVENT_MGR_H
|
||||
|
||||
#include "global.h"
|
||||
#include "core.h" // for MultiSioData
|
||||
|
||||
#include "game/sa1_sa2_shared/globals.h"
|
||||
|
||||
// RoomEvent types
|
||||
#define ROOMEVENT_TYPE_NONE 0
|
||||
#define ROOMEVENT_TYPE_PLATFORM_CHANGE 1
|
||||
#define ROOMEVENT_TYPE_ITEMBOX_BREAK 2
|
||||
#define ROOMEVENT_TYPE_ENEMY_DESTROYED 3
|
||||
#define ROOMEVENT_TYPE_PLAYER_RING_LOSS 4
|
||||
#define ROOMEVENT_TYPE_MYSTERY_ITEMBOX_BREAK 5
|
||||
#define ROOMEVENT_TYPE_ITEMEFFECT_APPLIED 6
|
||||
#define ROOMEVENT_TYPE_REACHED_STAGE_GOAL 7
|
||||
#define ROOMEVENT_TYPE_UNKNOWN 8
|
||||
|
||||
// RoomEvent variable structs
|
||||
typedef struct {
|
||||
ROOMEVENT_BASE;
|
||||
|
||||
u8 x;
|
||||
u8 y;
|
||||
u8 id;
|
||||
u8 action;
|
||||
} RoomEvent_PlatformChange;
|
||||
|
||||
typedef struct {
|
||||
ROOMEVENT_BASE;
|
||||
|
||||
u8 x;
|
||||
u8 y;
|
||||
u8 id;
|
||||
} RoomEvent_ItemBoxBreak;
|
||||
|
||||
typedef struct {
|
||||
ROOMEVENT_BASE;
|
||||
|
||||
u8 x;
|
||||
u8 y;
|
||||
u8 id;
|
||||
} RoomEvent_EnemyDestroy;
|
||||
|
||||
typedef struct {
|
||||
ROOMEVENT_BASE;
|
||||
|
||||
u8 ringCount;
|
||||
} RoomEvent_RingLoss;
|
||||
|
||||
typedef struct {
|
||||
ROOMEVENT_BASE;
|
||||
|
||||
u8 x;
|
||||
u8 y;
|
||||
u8 id;
|
||||
u8 unk4;
|
||||
} RoomEvent_MysteryItemBoxBreak;
|
||||
|
||||
typedef struct {
|
||||
ROOMEVENT_BASE;
|
||||
u8 effect;
|
||||
u8 targetPlayer;
|
||||
} RoomEvent_ItemEffect;
|
||||
|
||||
typedef struct {
|
||||
ROOMEVENT_BASE;
|
||||
u8 unk1;
|
||||
u8 unk2;
|
||||
} RoomEvent_Unknown;
|
||||
|
||||
struct Task *CreateMultiplayerRecieveEventMgr(void);
|
||||
struct Task *CreateMultiplayerSendEventMgr(void);
|
||||
|
||||
void RecieveRoomEvent_PlatformChange(union MultiSioData *, u8);
|
||||
void RecieveRoomEvent_ItemBoxBreak(union MultiSioData *, u8);
|
||||
void RecieveRoomEvent_EnemyDestroyed(union MultiSioData *, u8);
|
||||
void RecieveRoomEvent_PlayerRingLoss(union MultiSioData *, u8);
|
||||
void RecieveRoomEvent_MysterItemBoxBreak(union MultiSioData *, u8);
|
||||
void RecieveRoomEvent_Unknown(union MultiSioData *, u8);
|
||||
|
||||
// Creates and sends a room event for multiplayer
|
||||
void *CreateRoomEvent(void);
|
||||
|
||||
#endif // GUARD_MULTIPLAYER_EVENT_MGR_H
|
||||
@@ -1,20 +0,0 @@
|
||||
|
||||
|
||||
#ifndef GUARD_MULTIPLAYER_PLAYER_UNK_1_H
|
||||
#define GUARD_MULTIPLAYER_PLAYER_UNK_1_H
|
||||
|
||||
#include "global.h"
|
||||
#include "core.h" // for MultiSioData
|
||||
|
||||
#include "game/sa1_sa2_shared/globals.h"
|
||||
|
||||
void sub_8019240(union MultiSioData *, u8);
|
||||
void sub_80192A8(union MultiSioData *, u8);
|
||||
void sub_80192FC(union MultiSioData *, u8);
|
||||
void sub_8019350(union MultiSioData *, u8);
|
||||
void sub_8019368(union MultiSioData *, u8);
|
||||
void VoidReturnSIOControl32(union MultiSioData *, u8);
|
||||
|
||||
struct UNK_3005510 *sub_8019224(void);
|
||||
|
||||
#endif // GUARD_MULTIPLAYER_PLAYER_UNK_1_H
|
||||
@@ -1,19 +0,0 @@
|
||||
|
||||
|
||||
#ifndef GUARD_MULTIPLAYER_PLAYER_UNK_2_H
|
||||
#define GUARD_MULTIPLAYER_PLAYER_UNK_2_H
|
||||
|
||||
#include "global.h"
|
||||
|
||||
// Copies of BG control regs for Multiplayer(?)
|
||||
typedef struct {
|
||||
u16 unk0;
|
||||
u16 unk2;
|
||||
u16 unk4;
|
||||
u16 unk6;
|
||||
} MultiPlayerBgCtrlRegs; /* size: 8 */
|
||||
extern MultiPlayerBgCtrlRegs *gUnknown_03005840;
|
||||
|
||||
void sub_801A384(void);
|
||||
|
||||
#endif // GUARD_MULTIPLAYER_PLAYER_UNK_2_H
|
||||
@@ -21,7 +21,7 @@ void Player_Knuckles_InitSpiralAttack(Player *);
|
||||
void Player_Knuckles_InitGlide(Player *);
|
||||
void Player_Knuckles_InitDrillClaw(Player *);
|
||||
void Player_Amy_InitHammerAttack(Player *);
|
||||
void Player_801225C(Player *p);
|
||||
void Player_InitHomingAttackRecoil(Player *p);
|
||||
void Player_UpdateHomingPosition(s32 qX, s32 qY);
|
||||
|
||||
#endif // GUARD_player_callbacks_H
|
||||
@@ -51,17 +51,16 @@ typedef struct {
|
||||
u16 angle;
|
||||
} HomingTarget;
|
||||
|
||||
// Some Multiplayer struct
|
||||
struct UNK_3005510 {
|
||||
u8 unk0;
|
||||
u8 unk1; // regionX (truncated) [and sometimes ring-count(?)]
|
||||
u8 unk2; // regionY (truncated)
|
||||
u8 unk3; // spriteY (truncated) as per sub_800EDF8
|
||||
u8 unk4;
|
||||
u8 unk5;
|
||||
u8 unk6;
|
||||
u8 unk7;
|
||||
}; /* 0x8 */
|
||||
// Common RoomEvent variables
|
||||
#define ROOMEVENT_BASE u8 type
|
||||
|
||||
// RoomEvent opaque struct
|
||||
// See 'multiplayer_event_mgr.h' for more information on this
|
||||
typedef struct {
|
||||
ROOMEVENT_BASE;
|
||||
|
||||
u8 opaque[7];
|
||||
} RoomEvent; /* 0x8 */
|
||||
|
||||
#define CHEESE_DISTANCE_MAX 200
|
||||
typedef struct {
|
||||
@@ -104,7 +103,7 @@ extern struct Task *gEntitiesManagerTask;
|
||||
|
||||
extern u8 gDestroySpotlights;
|
||||
|
||||
extern u8 gUnknown_03005420;
|
||||
extern u8 gRoomEventQueueSendPos;
|
||||
|
||||
// "Extra State" (see above #defines for states)
|
||||
// TODO: Find better name. Put somewhere else?
|
||||
@@ -125,7 +124,7 @@ extern u32 gMPStageStartFrameCount;
|
||||
|
||||
extern u32 gCheckpointTime; // Checkpoint timer?
|
||||
|
||||
extern u8 gUnknown_03005438;
|
||||
extern u8 gRoomEventQueueWritePos;
|
||||
|
||||
extern u8 gBossRingsRespawnCount;
|
||||
extern bool8 gBossRingsShallRespawn;
|
||||
@@ -160,7 +159,7 @@ extern s32 gStageGoalX;
|
||||
extern u8 gUnknown_03005428[4];
|
||||
extern u8 gMultiplayerCharRings[MULTI_SIO_PLAYERS_MAX];
|
||||
|
||||
extern struct UNK_3005510 gUnknown_03005510[16];
|
||||
extern RoomEvent gRoomEventQueue[16];
|
||||
|
||||
extern CheeseTarget gCheeseTarget;
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "global.h"
|
||||
#include "game/entity.h"
|
||||
|
||||
void CreateEntity_Platform_A(MapEntity *, u16, u16, u8);
|
||||
void CreateEntity_Platform_B(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY);
|
||||
void CreateEntity_Platform(MapEntity *, u16, u16, u8);
|
||||
void CreateEntity_FallingPlatform(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY);
|
||||
|
||||
#endif // GUARD_INTERACTABLE_PLATFORM_H
|
||||
@@ -56,7 +56,7 @@ typedef struct {
|
||||
#define PLAYER_ITEM_EFFECT__INVINCIBILITY 0x02
|
||||
#define PLAYER_ITEM_EFFECT__SPEED_UP 0x04
|
||||
#define PLAYER_ITEM_EFFECT__SHIELD_MAGNETIC 0x08
|
||||
#define PLAYER_ITEM_EFFECT__10 0x10
|
||||
#define PLAYER_ITEM_EFFECT__MP_SLOW_DOWN 0x10
|
||||
#define PLAYER_ITEM_EFFECT__20 0x20
|
||||
#define PLAYER_ITEM_EFFECT__CONFUSION 0x40
|
||||
#define PLAYER_ITEM_EFFECT__TELEPORT 0x80
|
||||
@@ -118,28 +118,26 @@ typedef struct Player_ {
|
||||
/* 0x2C */ s16 timerInvulnerability;
|
||||
/* 0x2E */ s16 timerInvincibility;
|
||||
/* 0x30 */ u16 timerSpeedup;
|
||||
/* 0x32 */ u16 unk32;
|
||||
/* 0x34 */ u16 unk34;
|
||||
/* 0x36 */ s8 unk36;
|
||||
/* 0x32 */ u16 confusionTimer;
|
||||
/* 0x34 */ u16 itemEffect20Timer;
|
||||
/* 0x36 */ s8 disableTrickTimer;
|
||||
/* 0x37 */ u8 itemEffect; // bitfield
|
||||
/* 0x38 */ u8 layer; // bitfield(?), 0x1 determines layer
|
||||
/* 0x39 */ u8 unk39;
|
||||
/* 0x3A */ u16 unk3A;
|
||||
/* 0x3C */ void *unk3C; // the object player collides with this frame?
|
||||
/* 0x40 */ s32 unk40;
|
||||
/* 0x44 */ s32 unk44;
|
||||
/* 0x48 */ s32 unk48; // acceleration?
|
||||
/* 0x4C */ s32 unk4C; // deceleration?
|
||||
/* 0x50 */ u16 unk50;
|
||||
/* 0x52 */ u16 unk52;
|
||||
/* 0x54 */ u16 unk54; // some other anim-variant?
|
||||
/* 0x3C */ void *stoodObj; // the object player collides with this frame?
|
||||
/* 0x40 */ s32 maxSpeed; // top speed the player can go period
|
||||
/* 0x44 */ s32 topSpeed; // top speed the player can accelerate to
|
||||
/* 0x48 */ s32 acceleration;
|
||||
/* 0x4C */ s32 deceleration;
|
||||
/* 0x50 */ u16 rollingDeceleration;
|
||||
/* 0x52 */ u16 boostThreshold;
|
||||
/* 0x54 */ u16 walkAnim;
|
||||
/* 0x56 */ u16 unk56;
|
||||
/* 0x58 */ s16 unk58;
|
||||
/* 0x58 */ s16 boostSpeed;
|
||||
/* 0x5A */ bool8 isBoosting;
|
||||
/* 0x5B */ u8 unk5B;
|
||||
/* 0x5B */ u8 trickDir;
|
||||
/* 0x5C */ u16 heldInput;
|
||||
/* 0x5E */ u16 frameInput;
|
||||
/* 0x60 */ s8 unk60;
|
||||
/* 0x60 */ s8 playerID;
|
||||
/* 0x61 */ s8 unk61;
|
||||
/* 0x62 */ u8 unk62;
|
||||
/* 0x63 */ u8 unk63;
|
||||
|
||||
@@ -25,7 +25,7 @@ void sub_8023260(Player *);
|
||||
void sub_80232D0(Player *);
|
||||
void sub_8023610(Player *);
|
||||
void Player_TouchGround(Player *p);
|
||||
void Player_80261D8(Player *p);
|
||||
void Player_Uncurl(Player *p);
|
||||
void Player_HandlePhysicsWithAirInput(Player *p);
|
||||
void sub_8028204(Player *p);
|
||||
void sub_80282EC(Player *p);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "global.h"
|
||||
|
||||
extern const s16 gSpawnPositions[][2];
|
||||
extern const u32 gUnknown_080D63FC[][2];
|
||||
extern const Vec2_32 gCheckpointPositions[];
|
||||
|
||||
extern const Vec2_32 gUnknown_080D650C[];
|
||||
extern const Vec2_32 gUnknown_080D661C[];
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
#ifndef GUARD_UNKNOWN_EFFECT_H
|
||||
#define GUARD_UNKNOWN_EFFECT_H
|
||||
|
||||
#include "global.h"
|
||||
|
||||
void sub_8087368(void);
|
||||
|
||||
extern s32 gUnused_03005B78;
|
||||
extern u8 gUnknown_03005B7C;
|
||||
|
||||
#endif // GUARD_UNKNOWN_EFFECT_H
|
||||
+9
-9
@@ -50,7 +50,7 @@ SECTIONS
|
||||
src/game/cheese.o(.data);
|
||||
src/game/boost_effect.o(.data);
|
||||
src/game/multiplayer/mp_player.o(.data);
|
||||
src/game/multiplayer/player_unk_2.o(.data);
|
||||
src/game/multiplayer/mp_attack_2_effect.o(.data);
|
||||
src/game/dummy_task.o(.data);
|
||||
src/game/stage/stage.o(.data);
|
||||
src/game/stage/camera.o(.data);
|
||||
@@ -68,7 +68,7 @@ SECTIONS
|
||||
src/game/save.o(.data);
|
||||
src/game/multiboot/collect_rings/time_display.o(.data);
|
||||
src/game/math.o(.data);
|
||||
src/game/unknown_effect.o(.data);
|
||||
src/game/multiplayer/mp_attack_1_effect.o(.data);
|
||||
src/game/backgrounds.o(.data);
|
||||
|
||||
/* libs */
|
||||
@@ -110,7 +110,7 @@ SECTIONS
|
||||
src/game/sa1_sa2_shared/enemy_defeat_score.o(.text);
|
||||
src/game/sa1_sa2_shared/demo_manager.o(.text);
|
||||
src/game/sa1_sa2_shared/unused_unknown_task.o(.text);
|
||||
src/game/sa1_sa2_shared/unknown_sprite.o(.text);
|
||||
src/game/sa1_sa2_shared/simple_sprite_particle.o(.text);
|
||||
src/game/sa1_sa2_shared/spot_light.o(.text);
|
||||
src/game/sa1_sa2_shared/pause_menu.o(.text);
|
||||
src/game/sa1_sa2_shared/collect_ring_effect.o(.text);
|
||||
@@ -138,11 +138,11 @@ SECTIONS
|
||||
src/game/amy_attack_heart_effect.o(.text);
|
||||
|
||||
src/game/multiplayer/mp_player.o(.text);
|
||||
src/game/multiplayer/unknown_task.o(.text);
|
||||
src/game/multiplayer/player_unk_1.o(.text);
|
||||
src/game/multiplayer/multiplayer_event_mgr.o(.text);
|
||||
src/game/multiplayer/multiplayer_event_recv_mgr.o(.text);
|
||||
src/game/multiplayer/indicators.o(.text);
|
||||
src/game/multiplayer/finish.o(.text);
|
||||
src/game/multiplayer/player_unk_2.o(.text);
|
||||
src/game/multiplayer/mp_attack_2_effect.o(.text);
|
||||
|
||||
src/game/game.o(.text);
|
||||
src/game/dummy_task.o(.text);
|
||||
@@ -319,7 +319,7 @@ SECTIONS
|
||||
src/game/mystery_item_box.o(.text);
|
||||
src/game/heart_particles_effect.o(.text);
|
||||
src/game/race_progress.o(.text);
|
||||
src/game/unknown_effect.o(.text);
|
||||
src/game/multiplayer/mp_attack_1_effect.o(.text);
|
||||
src/game/multiplayer_lobby.o(.text);
|
||||
|
||||
/* time_attack_screens */
|
||||
@@ -423,7 +423,7 @@ SECTIONS
|
||||
src/game/cheese.o(.rodata);
|
||||
src/game/boost_effect.o(.rodata);
|
||||
src/game/amy_attack_heart_effect.o(.rodata);
|
||||
src/game/multiplayer/unknown_task.o(.rodata);
|
||||
src/game/multiplayer/multiplayer_event_mgr.o(.rodata);
|
||||
src/game/multiplayer/finish.o(.rodata);
|
||||
|
||||
src/game/stage/stage.o(.rodata);
|
||||
@@ -504,7 +504,7 @@ SECTIONS
|
||||
src/game/math.o(.rodata);
|
||||
src/game/mystery_item_box.o(.rodata);
|
||||
src/game/race_progress.o(.rodata);
|
||||
src/game/unknown_effect.o(.rodata);
|
||||
src/game/multiplayer/mp_attack_1_effect.o(.rodata);
|
||||
src/game/multiplayer_lobby.o(.rodata);
|
||||
src/game/time_attack/mode_select.o(.rodata);
|
||||
src/game/time_attack/lobby.o(.rodata);
|
||||
|
||||
@@ -9333,7 +9333,7 @@ sub_02004B0C: @ 0x02004B0C
|
||||
adds r3, r0, #0
|
||||
lsls r1, r1, #0x18
|
||||
lsrs r5, r1, #0x18
|
||||
ldr r1, _02004BA0 @ =gUnknown_03005510
|
||||
ldr r1, _02004BA0 @ =gRoomEventQueue
|
||||
movs r2, #0xc0
|
||||
lsls r2, r2, #0x12
|
||||
ldr r4, _02004BA4 @ =0x04000128
|
||||
@@ -9404,7 +9404,7 @@ _02004B98:
|
||||
pop {r0}
|
||||
bx r0
|
||||
.align 2, 0
|
||||
_02004BA0: .4byte gUnknown_03005510
|
||||
_02004BA0: .4byte gRoomEventQueue
|
||||
_02004BA4: .4byte 0x04000128
|
||||
_02004BA8: .4byte gUnknown_030056C0
|
||||
_02004BAC: .4byte gUnknown_0300542C
|
||||
@@ -14081,7 +14081,7 @@ sub_02006F50: @ 0x02006F50
|
||||
ands r1, r0
|
||||
cmp r1, #0
|
||||
bne _02006FAE
|
||||
ldr r1, _02006FB8 @ =gUnknown_03005510
|
||||
ldr r1, _02006FB8 @ =gRoomEventQueue
|
||||
ldr r0, _02006FBC @ =0x04000128
|
||||
ldr r0, [r0]
|
||||
lsls r0, r0, #0x1a
|
||||
@@ -14104,7 +14104,7 @@ _02006FAE:
|
||||
b _02007248
|
||||
.align 2, 0
|
||||
_02006FB4: .4byte gUnknown_030056C0
|
||||
_02006FB8: .4byte gUnknown_03005510
|
||||
_02006FB8: .4byte gRoomEventQueue
|
||||
_02006FBC: .4byte 0x04000128
|
||||
_02006FC0:
|
||||
ldr r0, [r2, #0x10]
|
||||
@@ -16240,7 +16240,7 @@ _02008054:
|
||||
bne _02008066
|
||||
b _02008270
|
||||
_02008066:
|
||||
ldr r1, _02008124 @ =gUnknown_03005510
|
||||
ldr r1, _02008124 @ =gRoomEventQueue
|
||||
lsls r0, r2, #2
|
||||
adds r0, r0, r1
|
||||
ldr r0, [r0]
|
||||
@@ -16332,7 +16332,7 @@ _02008114: .4byte gUnknown_030053B0
|
||||
_02008118: .4byte gUnknown_03005444
|
||||
_0200811C: .4byte gUnknown_030053FC
|
||||
_02008120: .4byte 0x04000128
|
||||
_02008124: .4byte gUnknown_03005510
|
||||
_02008124: .4byte gRoomEventQueue
|
||||
_02008128: .4byte gUnknown_03000052
|
||||
_0200812C: .4byte gUnknown_0300002F
|
||||
_02008130: .4byte gUnknown_03000050
|
||||
@@ -17588,7 +17588,7 @@ sub_02008B1C: @ 0x02008B1C
|
||||
movs r3, #0xc0
|
||||
lsls r3, r3, #0x12
|
||||
adds r0, r1, r3
|
||||
ldr r2, _02008BB0 @ =gUnknown_03005510
|
||||
ldr r2, _02008BB0 @ =gRoomEventQueue
|
||||
ldrb r0, [r0]
|
||||
lsls r0, r0, #2
|
||||
adds r0, r0, r2
|
||||
@@ -17651,7 +17651,7 @@ _02008B78:
|
||||
b _02008BD2
|
||||
.align 2, 0
|
||||
_02008BAC: .4byte gUnknown_030026D0
|
||||
_02008BB0: .4byte gUnknown_03005510
|
||||
_02008BB0: .4byte gRoomEventQueue
|
||||
_02008BB4: .4byte gUnknown_03000010
|
||||
_02008BB8: .4byte gUnknown_03000004
|
||||
_02008BBC: .4byte gUnknown_03005650
|
||||
@@ -18345,7 +18345,7 @@ _020090E8:
|
||||
_020090EC:
|
||||
adds r0, r4, #0
|
||||
bl sub_020030A0
|
||||
ldr r1, _02009108 @ =gUnknown_03005510
|
||||
ldr r1, _02009108 @ =gRoomEventQueue
|
||||
ldrb r0, [r5]
|
||||
lsls r0, r0, #2
|
||||
adds r0, r0, r1
|
||||
@@ -18356,7 +18356,7 @@ _020090EC:
|
||||
bx r0
|
||||
.align 2, 0
|
||||
_02009104: .4byte 0x06010000
|
||||
_02009108: .4byte gUnknown_03005510
|
||||
_02009108: .4byte gRoomEventQueue
|
||||
|
||||
thumb_func_start sub_0200910C
|
||||
sub_0200910C: @ 0x0200910C
|
||||
@@ -18650,7 +18650,7 @@ _0200933C:
|
||||
lsrs r0, r0, #0x1e
|
||||
cmp r0, r2
|
||||
beq _020093F4
|
||||
ldr r1, _0200943C @ =gUnknown_03005510
|
||||
ldr r1, _0200943C @ =gRoomEventQueue
|
||||
lsls r0, r2, #2
|
||||
adds r0, r0, r1
|
||||
ldr r0, [r0]
|
||||
@@ -18772,7 +18772,7 @@ _0200942E:
|
||||
strb r2, [r3]
|
||||
b _020095E2
|
||||
.align 2, 0
|
||||
_0200943C: .4byte gUnknown_03005510
|
||||
_0200943C: .4byte gRoomEventQueue
|
||||
_02009440: .4byte gUnknown_03000064
|
||||
_02009444: .4byte gUnknown_030056C0
|
||||
_02009448: .4byte 0xFFFFFBFF
|
||||
@@ -19587,7 +19587,7 @@ sub_02009ADC: @ 0x02009ADC
|
||||
lsls r0, r0, #8
|
||||
adds r1, r1, r0
|
||||
str r1, [r3, #0xc]
|
||||
ldr r1, _02009B88 @ =gUnknown_03005510
|
||||
ldr r1, _02009B88 @ =gRoomEventQueue
|
||||
ldr r0, _02009B8C @ =0x04000128
|
||||
ldr r0, [r0]
|
||||
lsls r0, r0, #0x1a
|
||||
@@ -19643,7 +19643,7 @@ _02009B78:
|
||||
.align 2, 0
|
||||
_02009B80: .4byte gUnknown_030026D0
|
||||
_02009B84: .4byte gUnknown_030056C0
|
||||
_02009B88: .4byte gUnknown_03005510
|
||||
_02009B88: .4byte gRoomEventQueue
|
||||
_02009B8C: .4byte 0x04000128
|
||||
_02009B90: .4byte gUnknown_03000054
|
||||
_02009B94: .4byte gUnknown_03000056
|
||||
@@ -20196,7 +20196,7 @@ sub_02009FCC: @ 0x02009FCC
|
||||
ldrb r0, [r0]
|
||||
cmp r0, #2
|
||||
bls _0200A018
|
||||
ldr r1, _0200A024 @ =gUnknown_03005510
|
||||
ldr r1, _0200A024 @ =gRoomEventQueue
|
||||
ldr r0, [r1]
|
||||
ldr r7, _0200A028 @ =gUnknown_030056C0
|
||||
cmp r0, #0
|
||||
@@ -20237,7 +20237,7 @@ _0200A018:
|
||||
bx r0
|
||||
.align 2, 0
|
||||
_0200A020: .4byte gUnknown_03005444
|
||||
_0200A024: .4byte gUnknown_03005510
|
||||
_0200A024: .4byte gRoomEventQueue
|
||||
_0200A028: .4byte gUnknown_030056C0
|
||||
|
||||
thumb_func_start sub_0200A02C
|
||||
@@ -20247,7 +20247,7 @@ sub_0200A02C: @ 0x0200A02C
|
||||
movs r2, #0xc0
|
||||
lsls r2, r2, #0x12
|
||||
adds r2, r0, r2
|
||||
ldr r1, _0200A050 @ =gUnknown_03005510
|
||||
ldr r1, _0200A050 @ =gRoomEventQueue
|
||||
ldr r3, _0200A054 @ =gUnknown_03000056
|
||||
adds r0, r0, r3
|
||||
ldrb r0, [r0]
|
||||
@@ -20260,7 +20260,7 @@ sub_0200A02C: @ 0x0200A02C
|
||||
pop {r0}
|
||||
bx r0
|
||||
.align 2, 0
|
||||
_0200A050: .4byte gUnknown_03005510
|
||||
_0200A050: .4byte gRoomEventQueue
|
||||
_0200A054: .4byte gUnknown_03000056
|
||||
|
||||
thumb_func_start sub_0200A058
|
||||
@@ -30901,7 +30901,7 @@ _0200F076:
|
||||
b _0200F2A4
|
||||
_0200F080:
|
||||
ldr r5, _0200F10C @ =gUnknown_03002840
|
||||
ldr r2, _0200F110 @ =gUnknown_03005510
|
||||
ldr r2, _0200F110 @ =gRoomEventQueue
|
||||
ldr r0, _0200F114 @ =0x04000128
|
||||
ldr r0, [r0]
|
||||
lsls r0, r0, #0x1a
|
||||
@@ -30970,7 +30970,7 @@ _0200F100: .4byte 0xFFFFFBFF
|
||||
_0200F104: .4byte 0xFFFFF7FF
|
||||
_0200F108: .4byte gUnknown_03005444
|
||||
_0200F10C: .4byte gUnknown_03002840
|
||||
_0200F110: .4byte gUnknown_03005510
|
||||
_0200F110: .4byte gRoomEventQueue
|
||||
_0200F114: .4byte 0x04000128
|
||||
_0200F118: .4byte gUnknown_030053B0
|
||||
_0200F11C:
|
||||
@@ -37137,7 +37137,7 @@ _02011F76:
|
||||
lsrs r0, r0, #0x1e
|
||||
cmp ip, r0
|
||||
beq _02012050
|
||||
ldr r1, _02012038 @ =gUnknown_03005510
|
||||
ldr r1, _02012038 @ =gRoomEventQueue
|
||||
mov r3, ip
|
||||
lsls r0, r3, #2
|
||||
adds r0, r0, r1
|
||||
@@ -37231,7 +37231,7 @@ _02012020:
|
||||
b _02012212
|
||||
.align 2, 0
|
||||
_02012034: .4byte 0x04000128
|
||||
_02012038: .4byte gUnknown_03005510
|
||||
_02012038: .4byte gRoomEventQueue
|
||||
_0201203C: .4byte gUnknown_0300006A
|
||||
_02012040: .4byte gUnknown_03000054
|
||||
_02012044: .4byte gUnknown_03000050
|
||||
@@ -38396,7 +38396,7 @@ sub_020129A0: @ 0x020129A0
|
||||
strb r1, [r0]
|
||||
ldr r0, _02012A14 @ =gUnknown_03005454
|
||||
str r1, [r0]
|
||||
ldr r3, _02012A18 @ =gUnknown_03005510
|
||||
ldr r3, _02012A18 @ =gRoomEventQueue
|
||||
movs r2, #0
|
||||
_020129CC:
|
||||
lsls r0, r1, #2
|
||||
@@ -38428,7 +38428,7 @@ _02012A08: .4byte gUnknown_030056C0
|
||||
_02012A0C: .4byte gUnknown_03005650
|
||||
_02012A10: .4byte gUnknown_030053F0
|
||||
_02012A14: .4byte gUnknown_03005454
|
||||
_02012A18: .4byte gUnknown_03005510
|
||||
_02012A18: .4byte gRoomEventQueue
|
||||
_02012A1C: .4byte gUnknown_030057C8
|
||||
|
||||
thumb_func_start sub_02012A20
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
. = 0x00005478; gUnknown_03005478 = .;
|
||||
. = 0x00005480; gUnknown_03005480 = .;
|
||||
. = 0x00005500; gUnknown_03005500 = .;
|
||||
. = 0x00005510; gUnknown_03005510 = .;
|
||||
. = 0x00005510; gRoomEventQueue = .;
|
||||
. = 0x00005520; gUnknown_03005520 = .;
|
||||
. = 0x00005524; gUnknown_03005524 = .;
|
||||
. = 0x00005528; gUnknown_03005528 = .;
|
||||
|
||||
+10
-10
@@ -201,8 +201,8 @@ void CreateEggTotem(void)
|
||||
u8 i;
|
||||
void *tiles;
|
||||
|
||||
gPlayer.unk3C = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.stoodObj = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState |= MOVESTATE_IGNORE_INPUT;
|
||||
|
||||
sub_8039ED4();
|
||||
@@ -461,10 +461,10 @@ void Task_803F3E8(void)
|
||||
if (totem->lives == 0) {
|
||||
Player_DisableInputAndBossTimer();
|
||||
|
||||
if (gPlayer.unk3C != NULL || gPlayer.moveState & MOVESTATE_8) {
|
||||
gPlayer.unk3C = NULL;
|
||||
if (gPlayer.stoodObj != NULL || gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ) {
|
||||
gPlayer.stoodObj = NULL;
|
||||
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
@@ -1260,11 +1260,11 @@ void sub_8040A00(EggTotem *totem)
|
||||
#else
|
||||
Player *p;
|
||||
#endif
|
||||
u32 moveState = (gPlayer.moveState & MOVESTATE_8);
|
||||
u32 moveState = (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ);
|
||||
s32 x, y;
|
||||
r7 = FALSE;
|
||||
|
||||
if (moveState && (gPlayer.unk3C == s)) {
|
||||
if (moveState && (gPlayer.stoodObj == s)) {
|
||||
r7 = TRUE;
|
||||
}
|
||||
|
||||
@@ -1273,7 +1273,7 @@ void sub_8040A00(EggTotem *totem)
|
||||
p = &gPlayer;
|
||||
coll = sub_800CCB8(s, x, y, p);
|
||||
|
||||
if ((p->moveState & MOVESTATE_8) && (coll & COLL_FLAG_10000)) {
|
||||
if ((p->moveState & MOVESTATE_STOOD_ON_OBJ) && (coll & COLL_FLAG_10000)) {
|
||||
p->qWorldX += t3c->qUnk8 + Q(5);
|
||||
p->qWorldY += Q(2) + (s16)Q(coll);
|
||||
|
||||
@@ -1281,8 +1281,8 @@ void sub_8040A00(EggTotem *totem)
|
||||
p->speedAirX -= Q(5);
|
||||
}
|
||||
} else if (r7) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.unk3C = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.stoodObj = NULL;
|
||||
|
||||
if (!(gPlayer.moveState & MOVESTATE_100)) {
|
||||
gPlayer.moveState &= ~MOVESTATE_100;
|
||||
|
||||
@@ -354,8 +354,8 @@ static void sub_8041A08(AeroEgg *boss)
|
||||
if ((!sub_800DF38(s, worldX, worldY, p)) == COLL_NONE) {
|
||||
s16 v = -Q(4.75);
|
||||
p->speedAirY = v;
|
||||
p->moveState &= ~(MOVESTATE_100 | MOVESTATE_8);
|
||||
p->unk3C = NULL;
|
||||
p->moveState &= ~(MOVESTATE_100 | MOVESTATE_STOOD_ON_OBJ);
|
||||
p->stoodObj = NULL;
|
||||
p->charState = CHARSTATE_JUMP_2;
|
||||
p->transition = 5;
|
||||
r7 = TRUE;
|
||||
|
||||
+14
-14
@@ -189,8 +189,8 @@ void CreateEggGoRound(void)
|
||||
gUnknown_03005AA0.s.frameFlags &= ~SPRITE_FLAG_MASK_PRIORITY;
|
||||
gUnknown_03005AA0.s.frameFlags |= SPRITE_FLAG(PRIORITY, 1);
|
||||
|
||||
gPlayer.unk3C = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.stoodObj = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
|
||||
gActiveBossTask = TaskCreate(Task_IntroRollIn, sizeof(EggGoRound), 0x4000, 0, TaskDestructor_EggGoRound);
|
||||
boss = TASK_DATA(gActiveBossTask);
|
||||
@@ -423,8 +423,8 @@ static void Task_Main(void)
|
||||
boss->timer = 128;
|
||||
boss->destructionProps.explosionState = 0;
|
||||
|
||||
gPlayer.unk3C = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.stoodObj = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
|
||||
Player_DisableInputAndBossTimer();
|
||||
@@ -456,8 +456,8 @@ static void Task_DestructionCutScene1(void)
|
||||
SetPalette(boss);
|
||||
sub_8047060(boss);
|
||||
|
||||
gPlayer.unk3C = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.stoodObj = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
|
||||
if (--boss->timer == 0) {
|
||||
boss->linkRotOffset = 0;
|
||||
@@ -812,11 +812,11 @@ static void sub_8046C28(EggGoRound *boss)
|
||||
s32 y = I(boss->y) + ((SIN(idx) * platformPos) >> 14);
|
||||
|
||||
if (boss->unk1E != 0 && boss->unk24 == 0 && (i % 2) && (boss->state == 1 || boss->state == 2)
|
||||
&& ((gPlayer.moveState & MOVESTATE_8) && gPlayer.unk3C == s)) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
&& ((gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ) && gPlayer.stoodObj == s)) {
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState &= ~MOVESTATE_100;
|
||||
gPlayer.moveState |= 2;
|
||||
gPlayer.unk3C = NULL;
|
||||
gPlayer.stoodObj = NULL;
|
||||
gPlayer.speedAirX += BOSS_X_SPEED;
|
||||
gPlayer.speedGroundX += BOSS_X_SPEED;
|
||||
gPlayer.speedAirY = -Q(2);
|
||||
@@ -828,21 +828,21 @@ static void sub_8046C28(EggGoRound *boss)
|
||||
u8 someBool;
|
||||
s32 speedAirY;
|
||||
|
||||
if (gPlayer.unk3C == s) {
|
||||
if (gPlayer.stoodObj == s) {
|
||||
someBool = TRUE;
|
||||
} else {
|
||||
someBool = FALSE;
|
||||
}
|
||||
speedAirY = gPlayer.speedAirY;
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_IN_AIR || (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s)) {
|
||||
if (gPlayer.moveState & MOVESTATE_IN_AIR || (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s)) {
|
||||
val = sub_800CCB8(s, x, y, &gPlayer);
|
||||
} else {
|
||||
val = 0;
|
||||
}
|
||||
|
||||
if (val & 0x10000) {
|
||||
if (!someBool && gPlayer.unk3C == s && speedAirY > 0) {
|
||||
if (!someBool && gPlayer.stoodObj == s && speedAirY > 0) {
|
||||
gPlayer.speedAirX -= BOSS_X_SPEED;
|
||||
gPlayer.speedGroundX -= BOSS_X_SPEED;
|
||||
}
|
||||
@@ -858,8 +858,8 @@ static void sub_8046C28(EggGoRound *boss)
|
||||
gPlayer.qWorldX += Q(x - (boss->prevPlatformXPositions[i]));
|
||||
}
|
||||
} else if (someBool) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.unk3C = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.stoodObj = NULL;
|
||||
if (!(gPlayer.moveState & MOVESTATE_100)) {
|
||||
gPlayer.moveState &= ~MOVESTATE_100;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
|
||||
@@ -452,7 +452,7 @@ static void sub_8049F1C(SuperEggRoboZTowers *towers, u8 towerIndex)
|
||||
}
|
||||
}
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == prop) {
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == prop) {
|
||||
gPlayer.qWorldY += Q(1);
|
||||
gPlayer.qWorldY += preY;
|
||||
if (towers->unk15E == 1) {
|
||||
@@ -567,7 +567,7 @@ static void sub_804A1C0(SuperEggRoboZTowers *towers, u8 towerIndex)
|
||||
}
|
||||
}
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
gPlayer.qWorldY += preY + Q(1);
|
||||
|
||||
if (towers->unk15E == 1) {
|
||||
@@ -617,7 +617,7 @@ static void sub_804A398(SuperEggRoboZTowers *towers, u8 towerIndex)
|
||||
}
|
||||
}
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
gPlayer.qWorldY += preY + Q(1);
|
||||
|
||||
if (towers->unk15E == 1) {
|
||||
@@ -670,7 +670,7 @@ static void sub_804A53C(SuperEggRoboZTowers *towers, u8 towerIndex)
|
||||
}
|
||||
}
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
gPlayer.qWorldY += preY + Q(2);
|
||||
|
||||
if (towers->unk15E == 1) {
|
||||
@@ -986,11 +986,11 @@ void Task_804AB24(void)
|
||||
gPlayer.heldInput = 0;
|
||||
gPlayer.frameInput = 0;
|
||||
|
||||
if (gPlayer.moveState & (MOVESTATE_8 | MOVESTATE_IN_AIR)) {
|
||||
if (gPlayer.moveState & (MOVESTATE_STOOD_ON_OBJ | MOVESTATE_IN_AIR)) {
|
||||
gPlayer.charState = CHARSTATE_CURLED_IN_AIR;
|
||||
gPlayer.speedAirX = -Q(2);
|
||||
gPlayer.speedAirY = -Q(0);
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
} else {
|
||||
// _0804AC68
|
||||
gPlayer.speedGroundX = Q(0);
|
||||
|
||||
@@ -87,7 +87,7 @@ static void Task_Hammerhead(void)
|
||||
s->y = (posY - gCamera.y) + I(prevUnk48);
|
||||
}
|
||||
|
||||
if ((p->moveState & MOVESTATE_8) && (p->unk3C == s)) {
|
||||
if ((p->moveState & MOVESTATE_STOOD_ON_OBJ) && (p->stoodObj == s)) {
|
||||
p->qWorldY += 0x100;
|
||||
p->qWorldY += ip;
|
||||
}
|
||||
@@ -130,8 +130,8 @@ static void TaskDestructor_Hammerhead(struct Task *t)
|
||||
Sprite *s = &hammerhead->s;
|
||||
VramFree(s->graphics.dest);
|
||||
|
||||
if ((gPlayer.moveState & MOVESTATE_8) && (gPlayer.unk3C == s)) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.unk3C = NULL;
|
||||
if ((gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ) && (gPlayer.stoodObj == s)) {
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.stoodObj = NULL;
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "game/cheese.h"
|
||||
#include "game/enemies/projectiles.h"
|
||||
#include "game/stage/trapped_animals.h"
|
||||
#include "game/multiplayer/player_unk_1.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
#include "lib/m4a/m4a.h"
|
||||
|
||||
#include "constants/animations.h"
|
||||
@@ -96,7 +96,7 @@ void Task_YadoMain(void)
|
||||
gPlayer.speedAirY = YADO_PLAYER_ACCEL;
|
||||
gPlayer.charState = CHARSTATE_CURLED_IN_AIR;
|
||||
gPlayer.unk6C = 1;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
|
||||
// TODO: Why is this called twice?
|
||||
m4aSongNumStart(SE_SPRING);
|
||||
@@ -159,11 +159,11 @@ void Task_8055084(void)
|
||||
if (cheese->s.hitboxes[1].index != HITBOX_STATE_INACTIVE) {
|
||||
if (HB_COLLISION(x, y, s->hitboxes[0], I(cheese->posX), I(cheese->posY), cheese->s.hitboxes[1])) {
|
||||
if (IS_MULTI_PLAYER) {
|
||||
struct UNK_3005510 *unk = sub_8019224();
|
||||
unk->unk0 = 3;
|
||||
unk->unk1 = yado2->base.regionX;
|
||||
unk->unk2 = yado2->base.regionY;
|
||||
unk->unk3 = yado2->base.id;
|
||||
RoomEvent_EnemyDestroy *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_ENEMY_DESTROYED;
|
||||
roomEvent->x = yado2->base.regionX;
|
||||
roomEvent->y = yado2->base.regionY;
|
||||
roomEvent->id = yado2->base.id;
|
||||
}
|
||||
|
||||
CreateDustCloud(x, y);
|
||||
@@ -227,7 +227,7 @@ void Task_8055378(void)
|
||||
gPlayer.speedAirY = YADO_PLAYER_ACCEL;
|
||||
gPlayer.charState = CHARSTATE_CURLED_IN_AIR;
|
||||
gPlayer.unk6C = 1;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
|
||||
m4aSongNumStart(SE_SPRING);
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ void Task_BouncyBarIdle(void)
|
||||
if (!(gPlayer.moveState & MOVESTATE_DEAD) && (sub_800C204(s, screenX, screenY, 0, &gPlayer, 0) == 1) && (gPlayer.speedAirY > 0)
|
||||
&& (I(gPlayer.qWorldY) + 4) < screenY) {
|
||||
gPlayer.charState = CHARSTATE_CURLED_IN_AIR;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
|
||||
bar->unk3C = gPlayer.speedAirY >> 0xA;
|
||||
if (bar->unk3C > 2) {
|
||||
|
||||
@@ -34,11 +34,11 @@ typedef struct {
|
||||
} Sprite_Toggle_Checkpoint;
|
||||
|
||||
static void Task_Interactable_Toggle_Checkpoint(void);
|
||||
static void Task_8062FD8(void);
|
||||
static void Task_8063108(void);
|
||||
static void Task_806319C(void);
|
||||
static void TaskDestructor_8063214(struct Task *);
|
||||
static void Task_8063228(struct Task *);
|
||||
static void Task_CheckpointMain_Idle(void);
|
||||
static void Task_StageCheckpointMain_Activated(void);
|
||||
static void Task_CheckpointMain_Used(void);
|
||||
static void TaskDestructor_Checkpoint(struct Task *);
|
||||
static void TaskDestructor_PaletteLoader_Checkpoint(struct Task *);
|
||||
|
||||
extern u32 gCheckpointTime;
|
||||
|
||||
@@ -62,9 +62,9 @@ void CreateEntity_Checkpoint(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY
|
||||
u16 anim;
|
||||
u8 variant;
|
||||
if (gBossIndex == 0) {
|
||||
t = TaskCreate(Task_8062FD8, sizeof(Sprite_Checkpoint), 0x2010, 0, TaskDestructor_8063214);
|
||||
t = TaskCreate(Task_CheckpointMain_Idle, sizeof(Sprite_Checkpoint), 0x2010, 0, TaskDestructor_Checkpoint);
|
||||
} else {
|
||||
t = TaskCreate(Task_806319C, sizeof(Sprite_Checkpoint), 0x2010, 0, TaskDestructor_8063214);
|
||||
t = TaskCreate(Task_CheckpointMain_Used, sizeof(Sprite_Checkpoint), 0x2010, 0, TaskDestructor_Checkpoint);
|
||||
}
|
||||
|
||||
chkPt = TASK_DATA(t);
|
||||
@@ -97,10 +97,10 @@ void CreateEntity_Checkpoint(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY
|
||||
anim = sAnimIdsCheckpoint[zone][0];
|
||||
variant = sAnimIdsCheckpoint[zone][1];
|
||||
|
||||
chkPt->task = CreatePaletteLoaderTask(0x2000, anim, variant, Task_8063228);
|
||||
chkPt->task = CreatePaletteLoaderTask(0x2000, anim, variant, TaskDestructor_PaletteLoader_Checkpoint);
|
||||
}
|
||||
|
||||
void Task_8062FD8(void)
|
||||
void Task_CheckpointMain_Idle(void)
|
||||
{
|
||||
Sprite_Checkpoint *chkPt = TASK_DATA(gCurTask);
|
||||
Sprite *s = &chkPt->s;
|
||||
@@ -118,8 +118,8 @@ void Task_8062FD8(void)
|
||||
TaskDestroy(gCurTask);
|
||||
} else {
|
||||
if (!(gPlayer.moveState & (MOVESTATE_400000 | MOVESTATE_DEAD)) && posX <= I(gPlayer.qWorldX)) {
|
||||
gPlayer.checkPointX = gUnknown_080D63FC[gCurrentLevel][0];
|
||||
gPlayer.checkPointY = gUnknown_080D63FC[gCurrentLevel][1];
|
||||
gPlayer.checkPointX = gCheckpointPositions[gCurrentLevel].x;
|
||||
gPlayer.checkPointY = gCheckpointPositions[gCurrentLevel].y;
|
||||
gPlayer.checkpointTime = gCheckpointTime;
|
||||
|
||||
if (gBossIndex == 0)
|
||||
@@ -129,7 +129,7 @@ void Task_8062FD8(void)
|
||||
s->variant = SA2_ANIM_VARIANT_CHECKPOINT_HIT;
|
||||
s->prevVariant = -1;
|
||||
|
||||
gCurTask->main = Task_8063108;
|
||||
gCurTask->main = Task_StageCheckpointMain_Activated;
|
||||
|
||||
m4aSongNumStart(SE_CHECKPOINT);
|
||||
}
|
||||
@@ -139,7 +139,7 @@ void Task_8062FD8(void)
|
||||
}
|
||||
}
|
||||
|
||||
void Task_8063108(void)
|
||||
void Task_StageCheckpointMain_Activated(void)
|
||||
{
|
||||
Sprite_Checkpoint *chkPt = TASK_DATA(gCurTask);
|
||||
Sprite *s = &chkPt->s;
|
||||
@@ -157,14 +157,14 @@ void Task_8063108(void)
|
||||
TaskDestroy(gCurTask);
|
||||
} else {
|
||||
if (UpdateSpriteAnimation(s) == 0) {
|
||||
gCurTask->main = Task_806319C;
|
||||
gCurTask->main = Task_CheckpointMain_Used;
|
||||
}
|
||||
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
|
||||
void Task_806319C(void)
|
||||
void Task_CheckpointMain_Used(void)
|
||||
{
|
||||
Sprite_Checkpoint *chkPt = TASK_DATA(gCurTask);
|
||||
Sprite *s = &chkPt->s;
|
||||
@@ -184,14 +184,14 @@ void Task_806319C(void)
|
||||
}
|
||||
|
||||
// static
|
||||
void TaskDestructor_8063214(struct Task *t)
|
||||
void TaskDestructor_Checkpoint(struct Task *t)
|
||||
{
|
||||
Sprite_Checkpoint *chkPt = TASK_DATA(t);
|
||||
void *gfx = chkPt->s.graphics.dest;
|
||||
VramFree(gfx);
|
||||
}
|
||||
|
||||
void Task_8063228(struct Task *unused)
|
||||
void TaskDestructor_PaletteLoader_Checkpoint(struct Task *unused)
|
||||
{
|
||||
u8 zone = LEVEL_TO_ZONE(gCurrentLevel);
|
||||
s32 animId = sAnimIdsCheckpoint[zone][0];
|
||||
@@ -230,8 +230,8 @@ static void Task_Interactable_Toggle_Checkpoint(void)
|
||||
me->x = toggle->base.spriteX;
|
||||
TaskDestroy(gCurTask);
|
||||
} else if (!(gPlayer.moveState & (MOVESTATE_400000 | MOVESTATE_DEAD)) && posX <= I(gPlayer.qWorldX)) {
|
||||
gPlayer.checkPointX = gUnknown_080D63FC[gCurrentLevel][0];
|
||||
gPlayer.checkPointY = gUnknown_080D63FC[gCurrentLevel][1];
|
||||
gPlayer.checkPointX = gCheckpointPositions[gCurrentLevel].x;
|
||||
gPlayer.checkPointY = gCheckpointPositions[gCurrentLevel].y;
|
||||
gPlayer.checkpointTime = gCheckpointTime;
|
||||
|
||||
if (gBossIndex == 0)
|
||||
|
||||
@@ -92,7 +92,7 @@ void sub_8060ED0(void)
|
||||
|
||||
if (I(player->qWorldX) - x > 0x230) {
|
||||
if (player->moveState & MOVESTATE_4) {
|
||||
player->transition = PLTRANS_PT2;
|
||||
player->transition = PLTRANS_CORKSCREW_END;
|
||||
} else {
|
||||
player->transition = PLTRANS_TOUCH_GROUND;
|
||||
}
|
||||
@@ -111,13 +111,13 @@ void sub_8060ED0(void)
|
||||
if (player->speedGroundX < corkscrew->unk10) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8060D34;
|
||||
} else if (player->frameInput & gPlayerControls.jump) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->speedAirY = -Q(4.875);
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8060D34;
|
||||
} else if (!(player->moveState & MOVESTATE_4) && player->frameInput & DPAD_DOWN) {
|
||||
player->charState = CHARSTATE_SPIN_ATTACK;
|
||||
@@ -202,7 +202,7 @@ void sub_8061228(void)
|
||||
|
||||
if (I(player->qWorldX) - x < -0x230) {
|
||||
if (player->moveState & MOVESTATE_4) {
|
||||
player->transition = PLTRANS_PT2;
|
||||
player->transition = PLTRANS_CORKSCREW_END;
|
||||
} else {
|
||||
player->transition = PLTRANS_TOUCH_GROUND;
|
||||
}
|
||||
@@ -221,13 +221,13 @@ void sub_8061228(void)
|
||||
if (player->speedGroundX > corkscrew->unk10) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = sub_8061088;
|
||||
} else if (player->frameInput & gPlayerControls.jump) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->speedAirY = -Q(4.875);
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = sub_8061088;
|
||||
} else if (!(player->moveState & MOVESTATE_4) && player->frameInput & DPAD_DOWN) {
|
||||
player->charState = CHARSTATE_SPIN_ATTACK;
|
||||
|
||||
@@ -115,13 +115,13 @@ void sub_8061AB0(void)
|
||||
if (player->speedGroundX < corkscrew->unkC) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061914;
|
||||
} else if (player->frameInput & gPlayerControls.jump) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->speedAirY = -Q(4.875);
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061914;
|
||||
} else if (!(player->moveState & MOVESTATE_4) && player->frameInput & DPAD_DOWN) {
|
||||
player->charState = CHARSTATE_SPIN_ATTACK;
|
||||
@@ -172,13 +172,13 @@ void Task_8061C70(void)
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = 0;
|
||||
player->speedAirY = player->speedGroundX;
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061914;
|
||||
} else if (player->frameInput & gPlayerControls.jump) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = 0;
|
||||
player->speedAirY = -Q(4.875);
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061914;
|
||||
} else if (!(player->moveState & MOVESTATE_4) && player->frameInput & DPAD_DOWN) {
|
||||
player->charState = CHARSTATE_SPIN_ATTACK;
|
||||
@@ -212,7 +212,7 @@ void Task_8061DA4(void)
|
||||
|
||||
if (I(player->qWorldX) - x > 0x1A8) {
|
||||
if (player->moveState & MOVESTATE_4) {
|
||||
player->transition = PLTRANS_PT2;
|
||||
player->transition = PLTRANS_CORKSCREW_END;
|
||||
} else {
|
||||
player->transition = PLTRANS_TOUCH_GROUND;
|
||||
}
|
||||
@@ -233,13 +233,13 @@ void Task_8061DA4(void)
|
||||
if (player->speedGroundX < corkscrew->unkC) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061914;
|
||||
} else if (player->frameInput & gPlayerControls.jump) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->speedAirY = -Q(4.875);
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061914;
|
||||
} else if (!(player->moveState & MOVESTATE_4) && player->frameInput & DPAD_DOWN) {
|
||||
player->charState = CHARSTATE_SPIN_ATTACK;
|
||||
@@ -338,13 +338,13 @@ void Task_8062100(void)
|
||||
} else if (player->speedGroundX > -corkscrew->unkC) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061F60;
|
||||
} else if (player->frameInput & gPlayerControls.jump) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->speedAirY = -Q(4.875);
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061F60;
|
||||
} else if (!(player->moveState & MOVESTATE_4) && player->frameInput & DPAD_DOWN) {
|
||||
player->charState = CHARSTATE_SPIN_ATTACK;
|
||||
@@ -393,13 +393,13 @@ void Task_80622C8(void)
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = 0;
|
||||
player->speedAirY = player->speedGroundX;
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061F60;
|
||||
} else if (player->frameInput & gPlayerControls.jump) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = 0;
|
||||
player->speedAirY = -Q(4.875);
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061F60;
|
||||
} else if (!(player->moveState & MOVESTATE_4) && player->frameInput & DPAD_DOWN) {
|
||||
player->charState = CHARSTATE_SPIN_ATTACK;
|
||||
@@ -433,7 +433,7 @@ void Task_8062414(void)
|
||||
|
||||
if (I(player->qWorldX) - x < -424) {
|
||||
if (player->moveState & MOVESTATE_4) {
|
||||
player->transition = PLTRANS_PT2;
|
||||
player->transition = PLTRANS_CORKSCREW_END;
|
||||
} else {
|
||||
player->transition = PLTRANS_TOUCH_GROUND;
|
||||
}
|
||||
@@ -454,13 +454,13 @@ void Task_8062414(void)
|
||||
if (player->speedGroundX > -corkscrew->unkC) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061F60;
|
||||
} else if (player->frameInput & gPlayerControls.jump) {
|
||||
player->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
player->speedAirX = player->speedGroundX;
|
||||
player->speedAirY = -Q(4.875);
|
||||
player->transition = PLTRANS_PT5;
|
||||
player->transition = PLTRANS_UNCURL;
|
||||
gCurTask->main = Task_8061F60;
|
||||
} else if (!(player->moveState & MOVESTATE_4) && player->frameInput & DPAD_DOWN) {
|
||||
player->charState = CHARSTATE_SPIN_ATTACK;
|
||||
|
||||
@@ -35,7 +35,7 @@ static void Task_InclineRamp(void)
|
||||
// spriteY == me->d.uData[0]; (set in initSprite, below)
|
||||
if (((s8)ramp->base.id) == 0) {
|
||||
if (gPlayer.speedAirX > Q(4)) {
|
||||
moveState &= ~MOVESTATE_8;
|
||||
moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
moveState |= MOVESTATE_IN_AIR;
|
||||
moveState &= ~MOVESTATE_100;
|
||||
moveState &= ~MOVESTATE_4;
|
||||
@@ -61,7 +61,7 @@ static void Task_InclineRamp(void)
|
||||
} else {
|
||||
// _0805DC20
|
||||
if (gPlayer.speedAirX < Q_8_8(-4)) {
|
||||
moveState &= ~MOVESTATE_8;
|
||||
moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
moveState |= MOVESTATE_IN_AIR;
|
||||
moveState &= ~MOVESTATE_100;
|
||||
moveState &= ~MOVESTATE_4;
|
||||
|
||||
@@ -198,8 +198,8 @@ void Task_805E480(void)
|
||||
|
||||
if (value > 0) {
|
||||
if (r6 == 0 && value == 1) {
|
||||
if ((gPlayer.moveState & MOVESTATE_8) && gPlayer.unk3C == s) {
|
||||
gPlayer.moveState = ((gPlayer.moveState & (~MOVESTATE_8)) | MOVESTATE_IN_AIR);
|
||||
if ((gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ) && gPlayer.stoodObj == s) {
|
||||
gPlayer.moveState = ((gPlayer.moveState & (~MOVESTATE_STOOD_ON_OBJ)) | MOVESTATE_IN_AIR);
|
||||
}
|
||||
|
||||
gCurTask->main = Task_805E6A4;
|
||||
|
||||
@@ -186,7 +186,7 @@ NONMATCH("asm/non_matching/game/interactables_1/Task_Rotating.inc", void Task_Ro
|
||||
|
||||
if (gPlayer.frameInput & gPlayerControls.jump) {
|
||||
s16 r4;
|
||||
gPlayer.transition = 5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
me->x = rotatingHandle->base.spriteX;
|
||||
Player_TransitionCancelFlyingAndBoost(&gPlayer);
|
||||
sub_8023B5C(&gPlayer, 9);
|
||||
|
||||
+132
-142
@@ -20,7 +20,7 @@
|
||||
typedef struct {
|
||||
/* 0x00 */ SpriteBase base;
|
||||
/* 0x0C */ Sprite s;
|
||||
/* 0x3C */ u32 unk3C[2];
|
||||
/* 0x3C */ u32 playerMoveState[2];
|
||||
} Sprite_Spikes; /* size: 0x44 */
|
||||
|
||||
const u16 sSpikesOfZone[NUM_COURSE_ZONES + 1] = {
|
||||
@@ -29,26 +29,25 @@ const u16 sSpikesOfZone[NUM_COURSE_ZONES + 1] = {
|
||||
[ZONE_6] = SA2_ANIM_SPIKES_TEC_BAS, [ZONE_7] = SA2_ANIM_SPIKES, [ZONE_FINAL] = 0,
|
||||
};
|
||||
|
||||
static void sub_805F810(void);
|
||||
static void sub_805F928(void);
|
||||
static void sub_805FBA0(void);
|
||||
static void Task_805FF68(void);
|
||||
static void Task_806012C(void);
|
||||
static bool32 sub_80601F8(Sprite *, MapEntity *, Sprite_Spikes *, Player *);
|
||||
static bool32 sub_8060440(Sprite *, MapEntity *, Sprite_Spikes *, Player *);
|
||||
static bool32 sub_8060554(Sprite *, MapEntity *, Sprite_Spikes *, Player *, u32 *);
|
||||
static bool32 sub_80609B4(Sprite *, MapEntity *, Sprite_Spikes *, Player *, u32 *);
|
||||
static void TaskDestructor_8060CF4(struct Task *);
|
||||
static u32 sub_8060D08(Sprite *, s32 x, s32 y, Player *);
|
||||
static void Task_SpikesUpMain(void);
|
||||
static void Task_SpikesDownMain(void);
|
||||
static void Task_SpikesLeftRightMain(void);
|
||||
static void Task_SpikesHidingUpMain(void);
|
||||
static void Task_SpikesHidingDownMain(void);
|
||||
static bool32 HandleSpikeMovementUp(Sprite *, MapEntity *, Sprite_Spikes *, Player *);
|
||||
static bool32 HandleSpikeMovementDown(Sprite *, MapEntity *, Sprite_Spikes *, Player *);
|
||||
static bool32 HandleSpikeMovementHidingUp(Sprite *, MapEntity *, Sprite_Spikes *, Player *, u32 *);
|
||||
static bool32 HandleSpikeMovementHidingDown(Sprite *, MapEntity *, Sprite_Spikes *, Player *, u32 *);
|
||||
static void TaskDestructor_Spikes(struct Task *);
|
||||
static u32 HandleSpikePlayerCollision(Sprite *, s32 x, s32 y, Player *);
|
||||
|
||||
void CreateEntity_Spikes_Up(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
struct Task *t = TaskCreate(sub_805F810, sizeof(Sprite_Spikes), 0x2000, 0, NULL);
|
||||
struct Task *t = TaskCreate(Task_SpikesUpMain, sizeof(Sprite_Spikes), 0x2000, 0, NULL);
|
||||
Sprite_Spikes *spikes = TASK_DATA(t);
|
||||
Sprite *s = &spikes->s;
|
||||
|
||||
spikes->unk3C[1] = 0;
|
||||
spikes->unk3C[0] = 0;
|
||||
spikes->playerMoveState[0] = spikes->playerMoveState[1] = 0x00;
|
||||
spikes->base.regionX = spriteRegionX;
|
||||
spikes->base.regionY = spriteRegionY;
|
||||
spikes->base.me = me;
|
||||
@@ -83,12 +82,11 @@ void CreateEntity_Spikes_Up(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY,
|
||||
|
||||
void CreateEntity_Spikes_Down(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
struct Task *t = TaskCreate(sub_805F928, sizeof(Sprite_Spikes), 0x2000, 0, NULL);
|
||||
struct Task *t = TaskCreate(Task_SpikesDownMain, sizeof(Sprite_Spikes), 0x2000, 0, NULL);
|
||||
Sprite_Spikes *spikes = TASK_DATA(t);
|
||||
Sprite *s = &spikes->s;
|
||||
|
||||
spikes->unk3C[1] = 0;
|
||||
spikes->unk3C[0] = 0;
|
||||
spikes->playerMoveState[0] = spikes->playerMoveState[1] = 0x00;
|
||||
spikes->base.regionX = spriteRegionX;
|
||||
spikes->base.regionY = spriteRegionY;
|
||||
spikes->base.me = me;
|
||||
@@ -116,7 +114,7 @@ void CreateEntity_Spikes_Down(MapEntity *me, u16 spriteRegionX, u16 spriteRegion
|
||||
UpdateSpriteAnimation(s);
|
||||
}
|
||||
|
||||
static void sub_805F810(void)
|
||||
static void Task_SpikesUpMain(void)
|
||||
{
|
||||
Sprite_Spikes *spikes = TASK_DATA(gCurTask);
|
||||
Sprite *s = &spikes->s;
|
||||
@@ -130,18 +128,18 @@ static void sub_805F810(void)
|
||||
s->y = screenY - gCamera.y;
|
||||
|
||||
if (!GRAVITY_IS_INVERTED) {
|
||||
sub_80601F8(s, me, spikes, &gPlayer);
|
||||
HandleSpikeMovementUp(s, me, spikes, &gPlayer);
|
||||
} else {
|
||||
sub_8060440(s, me, spikes, &gPlayer);
|
||||
HandleSpikeMovementDown(s, me, spikes, &gPlayer);
|
||||
}
|
||||
|
||||
if ((gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) && (me->d.sData[0] == 0) && (gUnknown_030053E0 == 0)) {
|
||||
if (spikes->unk3C[0] & 0xC0000) {
|
||||
if (spikes->playerMoveState[0] & (MOVESTATE_40000 | MOVESTATE_80000)) {
|
||||
gPlayer.moveState &= ~MOVESTATE_20;
|
||||
}
|
||||
|
||||
if (spikes->unk3C[0] & 0x10000) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
if (spikes->playerMoveState[0] & MOVESTATE_10000) {
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,7 +154,7 @@ static void sub_805F810(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_805F928(void)
|
||||
static void Task_SpikesDownMain(void)
|
||||
{
|
||||
Sprite_Spikes *spikes = TASK_DATA(gCurTask);
|
||||
Sprite *s = &spikes->s;
|
||||
@@ -171,19 +169,19 @@ static void sub_805F928(void)
|
||||
|
||||
if ((gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) || (me->d.sData[0] != 0) || (gUnknown_030053E0 != 0)) {
|
||||
if (!GRAVITY_IS_INVERTED) {
|
||||
sub_8060440(s, me, spikes, &gPlayer);
|
||||
HandleSpikeMovementDown(s, me, spikes, &gPlayer);
|
||||
} else {
|
||||
sub_80601F8(s, me, spikes, &gPlayer);
|
||||
HandleSpikeMovementUp(s, me, spikes, &gPlayer);
|
||||
}
|
||||
}
|
||||
|
||||
if ((gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) && (me->d.sData[0] == 0) && (gUnknown_030053E0 == 0)) {
|
||||
if (spikes->unk3C[0] & MOVESTATE_20) {
|
||||
if (spikes->playerMoveState[0] & MOVESTATE_20) {
|
||||
gPlayer.moveState &= ~MOVESTATE_20;
|
||||
}
|
||||
|
||||
if (spikes->unk3C[0] & 0x8) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
if (spikes->playerMoveState[0] & MOVESTATE_STOOD_ON_OBJ) {
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,12 +198,11 @@ static void sub_805F928(void)
|
||||
|
||||
void CreateEntity_Spikes_LeftRight(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
struct Task *t = TaskCreate(sub_805FBA0, sizeof(Sprite_Spikes), 0x2000, 0, TaskDestructor_8060CF4);
|
||||
struct Task *t = TaskCreate(Task_SpikesLeftRightMain, sizeof(Sprite_Spikes), 0x2000, 0, TaskDestructor_Spikes);
|
||||
Sprite_Spikes *spikes = TASK_DATA(t);
|
||||
Sprite *s = &spikes->s;
|
||||
|
||||
spikes->unk3C[1] = 0;
|
||||
spikes->unk3C[0] = 0;
|
||||
spikes->playerMoveState[0] = spikes->playerMoveState[1] = 0x00;
|
||||
spikes->base.regionX = spriteRegionX;
|
||||
spikes->base.regionY = spriteRegionY;
|
||||
spikes->base.me = me;
|
||||
@@ -251,7 +248,7 @@ void CreateEntity_Spikes_LeftRight(MapEntity *me, u16 spriteRegionX, u16 spriteR
|
||||
UpdateSpriteAnimation(s);
|
||||
}
|
||||
|
||||
static void sub_805FBA0(void)
|
||||
static void Task_SpikesLeftRightMain(void)
|
||||
{
|
||||
// Decls had to be split to match, for some reason
|
||||
s16 screenX, screenY;
|
||||
@@ -281,25 +278,25 @@ static void sub_805FBA0(void)
|
||||
if (r4 & 0x10000) {
|
||||
gPlayer.qWorldY += (r4 << 24) >> 16;
|
||||
gPlayer.speedAirY = 0;
|
||||
gPlayer.moveState &= (~MOVESTATE_8);
|
||||
gPlayer.moveState &= (~MOVESTATE_STOOD_ON_OBJ);
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
gPlayer.unk3C = 0;
|
||||
gPlayer.stoodObj = 0;
|
||||
}
|
||||
// _0805FC6C
|
||||
|
||||
if (r4 & 0x20000) {
|
||||
if (sub_8060D08(s, screenX, screenY, &gPlayer) & 0x10000) {
|
||||
if (HandleSpikePlayerCollision(s, screenX, screenY, &gPlayer) & 0x10000) {
|
||||
gPlayer.qWorldY += (r4 << 24) >> 16;
|
||||
gPlayer.speedAirY = 0;
|
||||
gPlayer.moveState |= MOVESTATE_8;
|
||||
gPlayer.moveState |= MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState &= ~MOVESTATE_IN_AIR;
|
||||
gPlayer.unk3C = s;
|
||||
gPlayer.stoodObj = s;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// _0805FCC8
|
||||
if (r4 & 0x10000) {
|
||||
if (sub_8060D08(s, screenX, screenY, &gPlayer) & 0x10000) {
|
||||
if (HandleSpikePlayerCollision(s, screenX, screenY, &gPlayer) & 0x10000) {
|
||||
gPlayer.qWorldY += (r4 << 24) >> 16;
|
||||
gPlayer.speedAirY = gravityInverted; // Q_8_8(0.5) instead?
|
||||
}
|
||||
@@ -354,12 +351,12 @@ static void sub_805FBA0(void)
|
||||
// _0805FDA4
|
||||
|
||||
if ((gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) && (me->d.sData[0] == 0) && (gUnknown_030053E0 == 0)) {
|
||||
if (spikes->unk3C[0] & 0x20) {
|
||||
if (spikes->playerMoveState[0] & MOVESTATE_20) {
|
||||
gPlayer.moveState &= ~MOVESTATE_20;
|
||||
}
|
||||
// _0805FDD8
|
||||
if (spikes->unk3C[0] & 0x8) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
if (spikes->playerMoveState[0] & MOVESTATE_STOOD_ON_OBJ) {
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
}
|
||||
}
|
||||
// _0805FDF0
|
||||
@@ -376,12 +373,11 @@ static void sub_805FBA0(void)
|
||||
|
||||
void CreateEntity_Spikes_HidingUp(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
struct Task *t = TaskCreate(Task_805FF68, sizeof(Sprite_Spikes), 0x2000, 0, TaskDestructor_8060CF4);
|
||||
struct Task *t = TaskCreate(Task_SpikesHidingUpMain, sizeof(Sprite_Spikes), 0x2000, 0, TaskDestructor_Spikes);
|
||||
Sprite_Spikes *spikes = TASK_DATA(t);
|
||||
Sprite *s = &spikes->s;
|
||||
|
||||
spikes->unk3C[1] = 0;
|
||||
spikes->unk3C[0] = 0;
|
||||
spikes->playerMoveState[0] = spikes->playerMoveState[1] = 0x00;
|
||||
spikes->base.regionX = spriteRegionX;
|
||||
spikes->base.regionY = spriteRegionY;
|
||||
spikes->base.me = me;
|
||||
@@ -409,7 +405,7 @@ void CreateEntity_Spikes_HidingUp(MapEntity *me, u16 spriteRegionX, u16 spriteRe
|
||||
s->frameFlags = 0x2200;
|
||||
}
|
||||
|
||||
static void Task_805FF68(void)
|
||||
static void Task_SpikesHidingUpMain(void)
|
||||
{
|
||||
s16 screenX, screenY;
|
||||
u32 someParam = 0;
|
||||
@@ -428,9 +424,9 @@ static void Task_805FF68(void)
|
||||
} else {
|
||||
bool32 procResult;
|
||||
if (!GRAVITY_IS_INVERTED) {
|
||||
procResult = sub_8060554(s, me, spikes, &gPlayer, &someParam);
|
||||
procResult = HandleSpikeMovementHidingUp(s, me, spikes, &gPlayer, &someParam);
|
||||
} else {
|
||||
procResult = sub_80609B4(s, me, spikes, &gPlayer, &someParam);
|
||||
procResult = HandleSpikeMovementHidingDown(s, me, spikes, &gPlayer, &someParam);
|
||||
}
|
||||
|
||||
if (procResult) {
|
||||
@@ -442,12 +438,11 @@ static void Task_805FF68(void)
|
||||
|
||||
void CreateEntity_Spikes_HidingDown(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
struct Task *t = TaskCreate(Task_806012C, sizeof(Sprite_Spikes), 0x2000, 0, TaskDestructor_8060CF4);
|
||||
struct Task *t = TaskCreate(Task_SpikesHidingDownMain, sizeof(Sprite_Spikes), 0x2000, 0, TaskDestructor_Spikes);
|
||||
Sprite_Spikes *spikes = TASK_DATA(t);
|
||||
Sprite *s = &spikes->s;
|
||||
|
||||
spikes->unk3C[1] = 0;
|
||||
spikes->unk3C[0] = 0;
|
||||
spikes->playerMoveState[0] = spikes->playerMoveState[1] = 0x00;
|
||||
spikes->base.regionX = spriteRegionX;
|
||||
spikes->base.regionY = spriteRegionY;
|
||||
spikes->base.me = me;
|
||||
@@ -475,7 +470,7 @@ void CreateEntity_Spikes_HidingDown(MapEntity *me, u16 spriteRegionX, u16 sprite
|
||||
s->frameFlags = 0x2A00;
|
||||
}
|
||||
|
||||
static void Task_806012C(void)
|
||||
static void Task_SpikesHidingDownMain(void)
|
||||
{
|
||||
s16 screenX, screenY;
|
||||
u32 someParam = 0;
|
||||
@@ -494,9 +489,9 @@ static void Task_806012C(void)
|
||||
} else {
|
||||
bool32 procResult;
|
||||
if (!GRAVITY_IS_INVERTED) {
|
||||
procResult = sub_80609B4(s, me, spikes, &gPlayer, &someParam);
|
||||
procResult = HandleSpikeMovementHidingDown(s, me, spikes, &gPlayer, &someParam);
|
||||
} else {
|
||||
procResult = sub_8060554(s, me, spikes, &gPlayer, &someParam);
|
||||
procResult = HandleSpikeMovementHidingUp(s, me, spikes, &gPlayer, &someParam);
|
||||
}
|
||||
|
||||
if (procResult) {
|
||||
@@ -506,7 +501,7 @@ static void Task_806012C(void)
|
||||
}
|
||||
}
|
||||
|
||||
bool32 sub_80601F8(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *player)
|
||||
bool32 HandleSpikeMovementUp(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *player)
|
||||
{
|
||||
s16 screenX, screenY;
|
||||
|
||||
@@ -550,9 +545,9 @@ bool32 sub_80601F8(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *play
|
||||
Sprite *sp08;
|
||||
u32 flags;
|
||||
|
||||
r7 = (player->moveState >> 3) & (MOVESTATE_8 >> 3);
|
||||
r7 = (player->moveState >> 3) & (MOVESTATE_STOOD_ON_OBJ >> 3);
|
||||
r8 = (player->moveState >> 1) & (MOVESTATE_IN_AIR >> 1);
|
||||
sp08 = player->unk3C;
|
||||
sp08 = player->stoodObj;
|
||||
|
||||
flags = sub_800CCB8(s, screenX, screenY, player);
|
||||
if (flags) {
|
||||
@@ -573,9 +568,9 @@ bool32 sub_80601F8(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *play
|
||||
if (flags & 0x20000) {
|
||||
player->speedAirY = 0;
|
||||
player->qWorldY = Q(screenY + s->hitboxes[0].bottom + player->spriteOffsetY);
|
||||
player->moveState |= MOVESTATE_8;
|
||||
player->moveState |= MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState &= ~MOVESTATE_IN_AIR;
|
||||
player->unk3C = s;
|
||||
player->stoodObj = s;
|
||||
player->speedGroundX = player->speedAirX;
|
||||
// _080603BC
|
||||
if (sub_800CBA4(player)) {
|
||||
@@ -586,7 +581,7 @@ bool32 sub_80601F8(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *play
|
||||
} else {
|
||||
// _0806038C
|
||||
if (flags & 0x10000) {
|
||||
flags = sub_8060D08(s, screenX, screenY, player);
|
||||
flags = HandleSpikePlayerCollision(s, screenX, screenY, player);
|
||||
|
||||
if (flags & 0x10000) {
|
||||
player->qWorldY += Q_8_8(flags);
|
||||
@@ -600,9 +595,9 @@ bool32 sub_80601F8(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *play
|
||||
} else {
|
||||
// _080603D0
|
||||
if (r7) {
|
||||
player->moveState |= MOVESTATE_8;
|
||||
player->moveState |= MOVESTATE_STOOD_ON_OBJ;
|
||||
} else {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
}
|
||||
|
||||
if (r8) {
|
||||
@@ -611,7 +606,7 @@ bool32 sub_80601F8(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *play
|
||||
player->moveState &= ~MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
player->unk3C = sp08;
|
||||
player->stoodObj = sp08;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -628,7 +623,7 @@ bool32 sub_80601F8(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *play
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool32 sub_8060440(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *player)
|
||||
static bool32 HandleSpikeMovementDown(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *player)
|
||||
{
|
||||
|
||||
s16 screenX, screenY;
|
||||
@@ -673,11 +668,11 @@ static bool32 sub_8060440(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool32 sub_8060554(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *player, u32 *param4) //)
|
||||
static bool32 HandleSpikeMovementHidingUp(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *player, u32 *param4) //)
|
||||
{
|
||||
s16 screenX, screenY;
|
||||
u32 sp0C[1] = { gStageTime & 0x7F };
|
||||
s32 sl = player->unk60;
|
||||
u32 stageTimer[1] = { gStageTime & 0x7F };
|
||||
s32 playerID = player->playerID;
|
||||
|
||||
screenX = TO_WORLD_POS(spikes->base.spriteX, spikes->base.regionX);
|
||||
screenY = TO_WORLD_POS(me->y, spikes->base.regionY);
|
||||
@@ -686,51 +681,50 @@ static bool32 sub_8060554(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
s->y = screenY - gCamera.y;
|
||||
|
||||
// TODO: Replace magic numbers in if statements
|
||||
if (sp0C[0] < 60) {
|
||||
if ((player->moveState & MOVESTATE_8) && (player->unk3C == s)) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
if (stageTimer[0] < 60) {
|
||||
if ((player->moveState & MOVESTATE_STOOD_ON_OBJ) && (player->stoodObj == s)) {
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
// TODO: Replace magic number
|
||||
if (spikes->unk3C[sl] & 0x20) {
|
||||
if (spikes->playerMoveState[playerID] & MOVESTATE_20) {
|
||||
player->moveState &= ~MOVESTATE_20;
|
||||
spikes->unk3C[sl] = 0;
|
||||
spikes->playerMoveState[playerID] = 0x00;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
} else if (sp0C[0] < 62) {
|
||||
if ((player->moveState & MOVESTATE_8) && (player->unk3C == s)) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
} else if (stageTimer[0] < 62) {
|
||||
if ((player->moveState & MOVESTATE_STOOD_ON_OBJ) && (player->stoodObj == s)) {
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
// TODO: Replace magic number
|
||||
if (spikes->unk3C[sl] & 0x20) {
|
||||
if (spikes->playerMoveState[playerID] & MOVESTATE_20) {
|
||||
player->moveState &= ~MOVESTATE_20;
|
||||
spikes->unk3C[sl] = 0;
|
||||
spikes->playerMoveState[playerID] = 0x00;
|
||||
}
|
||||
|
||||
s->graphics.anim = sSpikesOfZone[LEVEL_TO_ZONE(gCurrentLevel)];
|
||||
s->variant = SA2_ANIM_VARIANT_SPIKES_UP_LOW;
|
||||
UpdateSpriteAnimation(s);
|
||||
} else if (sp0C[0] < 64) {
|
||||
if ((player->moveState & MOVESTATE_8) && (player->unk3C == s)) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
} else if (stageTimer[0] < 64) {
|
||||
if ((player->moveState & MOVESTATE_STOOD_ON_OBJ) && (player->stoodObj == s)) {
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
// TODO: Replace magic number
|
||||
if (spikes->unk3C[sl] & 0x20) {
|
||||
if (spikes->playerMoveState[playerID] & MOVESTATE_20) {
|
||||
player->moveState &= ~MOVESTATE_20;
|
||||
spikes->unk3C[sl] = 0;
|
||||
spikes->playerMoveState[playerID] = 0x00;
|
||||
}
|
||||
s->graphics.anim = sSpikesOfZone[LEVEL_TO_ZONE(gCurrentLevel)];
|
||||
s->variant = SA2_ANIM_VARIANT_SPIKES_UP_MID;
|
||||
UpdateSpriteAnimation(s);
|
||||
} else if (sp0C[0] < 124) {
|
||||
if ((s->variant != SA2_ANIM_VARIANT_SPIKES_UP) || ((player->unk60 != 0) && (*param4 != 0))) {
|
||||
if (player->unk60 == 0) {
|
||||
} else if (stageTimer[0] < 124) {
|
||||
if ((s->variant != SA2_ANIM_VARIANT_SPIKES_UP) || ((player->playerID != 0) && (*param4 != 0))) {
|
||||
if (player->playerID == 0) {
|
||||
// TODO: Replace magic number
|
||||
*param4 = 1;
|
||||
}
|
||||
@@ -740,7 +734,7 @@ static bool32 sub_8060554(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
UpdateSpriteAnimation(s);
|
||||
|
||||
if (sub_800DF38(s, screenX, screenY, player) == 0x80000) {
|
||||
if ((sub_8060D08(s, screenX, screenY, player) & 0xD0000) != 0) {
|
||||
if ((HandleSpikePlayerCollision(s, screenX, screenY, player) & 0xD0000) != 0) {
|
||||
u32 v = ((u8)player->spriteOffsetX + 5);
|
||||
s8 sp00[4] = { -v, 1 - player->spriteOffsetY, v, player->spriteOffsetY - 1 };
|
||||
|
||||
@@ -758,7 +752,7 @@ static bool32 sub_8060554(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
u32 flags = sub_800CCB8(s, screenX, screenY, player);
|
||||
if (flags) {
|
||||
if (flags & 0x10000) {
|
||||
flags = sub_8060D08(s, screenX, screenY, player);
|
||||
flags = HandleSpikePlayerCollision(s, screenX, screenY, player);
|
||||
|
||||
if (flags & 0x10000) {
|
||||
if (sub_800CBA4(player)) {
|
||||
@@ -778,7 +772,7 @@ static bool32 sub_8060554(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
u32 flags = sub_800CCB8(s, screenX, screenY, player);
|
||||
if (flags) {
|
||||
if ((flags & 0x10000) && !GRAVITY_IS_INVERTED) {
|
||||
flags = sub_8060D08(s, screenX, screenY, player);
|
||||
flags = HandleSpikePlayerCollision(s, screenX, screenY, player);
|
||||
|
||||
if ((flags & 0x10000) && sub_800CBA4(player)) {
|
||||
m4aSongNumStart(SE_SPIKES);
|
||||
@@ -786,9 +780,9 @@ static bool32 sub_8060554(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
}
|
||||
} else if ((flags & 0x20000) && GRAVITY_IS_INVERTED) {
|
||||
player->qWorldY = Q(screenY + s->hitboxes[0].bottom + player->spriteOffsetY);
|
||||
player->moveState |= MOVESTATE_8;
|
||||
player->moveState |= MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState &= ~MOVESTATE_IN_AIR;
|
||||
player->unk3C = s;
|
||||
player->stoodObj = s;
|
||||
player->speedGroundX = player->speedAirX;
|
||||
|
||||
if (sub_800CBA4(player)) {
|
||||
@@ -804,33 +798,31 @@ static bool32 sub_8060554(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
}
|
||||
|
||||
// TODO: WHY!?
|
||||
spikes->unk3C[sl] = player->moveState;
|
||||
spikes->playerMoveState[playerID] = player->moveState;
|
||||
}
|
||||
} else if (sp0C[0] < 126) {
|
||||
} else if (stageTimer[0] < 126) {
|
||||
|
||||
if ((player->moveState & MOVESTATE_8) && (player->unk3C == s)) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
if ((player->moveState & MOVESTATE_STOOD_ON_OBJ) && (player->stoodObj == s)) {
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
// TODO: Replace magic number
|
||||
if (spikes->unk3C[sl] & 0x20) {
|
||||
if (spikes->playerMoveState[playerID] & MOVESTATE_20) {
|
||||
player->moveState &= ~MOVESTATE_20;
|
||||
spikes->unk3C[sl] = 0;
|
||||
spikes->playerMoveState[playerID] = 0x00;
|
||||
}
|
||||
s->graphics.anim = sSpikesOfZone[LEVEL_TO_ZONE(gCurrentLevel)];
|
||||
s->variant = SA2_ANIM_VARIANT_SPIKES_UP_MID;
|
||||
UpdateSpriteAnimation(s);
|
||||
} else {
|
||||
if ((player->moveState & MOVESTATE_8) && (player->unk3C == s)) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
if ((player->moveState & MOVESTATE_STOOD_ON_OBJ) && (player->stoodObj == s)) {
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
// TODO: Replace magic number
|
||||
if (spikes->unk3C[sl] & 0x20) {
|
||||
if (spikes->playerMoveState[playerID] & MOVESTATE_20) {
|
||||
player->moveState &= ~MOVESTATE_20;
|
||||
spikes->unk3C[sl] = 0;
|
||||
spikes->playerMoveState[playerID] = 0x00;
|
||||
}
|
||||
s->graphics.anim = sSpikesOfZone[LEVEL_TO_ZONE(gCurrentLevel)];
|
||||
s->variant = SA2_ANIM_VARIANT_SPIKES_UP_LOW;
|
||||
@@ -840,11 +832,11 @@ static bool32 sub_8060554(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static bool32 sub_80609B4(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *player, u32 *param4)
|
||||
static bool32 HandleSpikeMovementHidingDown(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Player *player, u32 *param4)
|
||||
{
|
||||
s16 screenX, screenY;
|
||||
u32 sp0C[1] = { gStageTime & 0x7F };
|
||||
s32 sl = player->unk60;
|
||||
u32 stageTimer[1] = { gStageTime & 0x7F };
|
||||
s32 playerID = player->playerID;
|
||||
|
||||
screenX = TO_WORLD_POS(spikes->base.spriteX, spikes->base.regionX);
|
||||
screenY = TO_WORLD_POS(me->y, spikes->base.regionY);
|
||||
@@ -853,51 +845,49 @@ static bool32 sub_80609B4(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
s->y = screenY - gCamera.y;
|
||||
|
||||
// TODO: Replace magic numbers in if statements
|
||||
if (sp0C[0] < 60) {
|
||||
if ((player->moveState & MOVESTATE_8) && (player->unk3C == s)) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
if (stageTimer[0] < 60) {
|
||||
if ((player->moveState & MOVESTATE_STOOD_ON_OBJ) && (player->stoodObj == s)) {
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
// TODO: Replace magic number
|
||||
if (spikes->unk3C[sl] & 0x20) {
|
||||
if (spikes->playerMoveState[playerID] & MOVESTATE_20) {
|
||||
player->moveState &= ~MOVESTATE_20;
|
||||
spikes->unk3C[sl] = 0;
|
||||
spikes->playerMoveState[playerID] = 0x00;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
} else if (sp0C[0] < 62) {
|
||||
if ((player->moveState & MOVESTATE_8) && (player->unk3C == s)) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
} else if (stageTimer[0] < 62) {
|
||||
if ((player->moveState & MOVESTATE_STOOD_ON_OBJ) && (player->stoodObj == s)) {
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
// TODO: Replace magic number
|
||||
if (spikes->unk3C[sl] & 0x20) {
|
||||
if (spikes->playerMoveState[playerID] & MOVESTATE_20) {
|
||||
player->moveState &= ~MOVESTATE_20;
|
||||
spikes->unk3C[sl] = 0;
|
||||
spikes->playerMoveState[playerID] = 0x00;
|
||||
}
|
||||
|
||||
s->graphics.anim = sSpikesOfZone[LEVEL_TO_ZONE(gCurrentLevel)];
|
||||
s->variant = SA2_ANIM_VARIANT_SPIKES_UP_LOW;
|
||||
UpdateSpriteAnimation(s);
|
||||
} else if (sp0C[0] < 64) {
|
||||
if ((player->moveState & MOVESTATE_8) && (player->unk3C == s)) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
} else if (stageTimer[0] < 64) {
|
||||
if ((player->moveState & MOVESTATE_STOOD_ON_OBJ) && (player->stoodObj == s)) {
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
// TODO: Replace magic number
|
||||
if (spikes->unk3C[sl] & 0x20) {
|
||||
if (spikes->playerMoveState[playerID] & MOVESTATE_20) {
|
||||
player->moveState &= ~MOVESTATE_20;
|
||||
spikes->unk3C[sl] = 0;
|
||||
spikes->playerMoveState[playerID] = 0x00;
|
||||
}
|
||||
s->graphics.anim = sSpikesOfZone[LEVEL_TO_ZONE(gCurrentLevel)];
|
||||
s->variant = SA2_ANIM_VARIANT_SPIKES_UP_MID;
|
||||
UpdateSpriteAnimation(s);
|
||||
} else if (sp0C[0] < 124) {
|
||||
if ((s->variant != SA2_ANIM_VARIANT_SPIKES_UP) || ((player->unk60 != 0) && (*param4 != 0))) {
|
||||
if (player->unk60 == 0) {
|
||||
} else if (stageTimer[0] < 124) {
|
||||
if ((s->variant != SA2_ANIM_VARIANT_SPIKES_UP) || ((player->playerID != 0) && (*param4 != 0))) {
|
||||
if (player->playerID == 0) {
|
||||
// TODO: Replace magic number
|
||||
*param4 = 1;
|
||||
}
|
||||
@@ -906,7 +896,8 @@ static bool32 sub_80609B4(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
s->variant = SA2_ANIM_VARIANT_SPIKES_UP;
|
||||
UpdateSpriteAnimation(s);
|
||||
|
||||
if ((sub_800DF38(s, screenX, screenY, player) == 0x80000) && ((sub_8060D08(s, screenX, screenY, player) & 0xD0000) != 0)) {
|
||||
if ((sub_800DF38(s, screenX, screenY, player) == 0x80000)
|
||||
&& ((HandleSpikePlayerCollision(s, screenX, screenY, player) & 0xD0000) != 0)) {
|
||||
|
||||
u32 v = ((u8)player->spriteOffsetX + 5);
|
||||
s8 sp00[4] = { -v, 1 - player->spriteOffsetY, v, player->spriteOffsetY - 1 };
|
||||
@@ -922,38 +913,37 @@ static bool32 sub_80609B4(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
} else
|
||||
return TRUE;
|
||||
} else {
|
||||
spikes->unk3C[sl] = sub_800CCB8(s, screenX, screenY, player);
|
||||
if (!(spikes->unk3C[sl] & 0x20000) || !sub_800CBA4(player)) {
|
||||
spikes->playerMoveState[playerID] = sub_800CCB8(s, screenX, screenY, player);
|
||||
if (!(spikes->playerMoveState[playerID] & MOVESTATE_20000) || !sub_800CBA4(player)) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
m4aSongNumStart(SE_SPIKES);
|
||||
} else if (sp0C[0] < 126) {
|
||||
} else if (stageTimer[0] < 126) {
|
||||
|
||||
if ((player->moveState & MOVESTATE_8) && (player->unk3C == s)) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
if ((player->moveState & MOVESTATE_STOOD_ON_OBJ) && (player->stoodObj == s)) {
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
// TODO: Replace magic number
|
||||
if (spikes->unk3C[sl] & 0x20) {
|
||||
if (spikes->playerMoveState[playerID] & MOVESTATE_20) {
|
||||
player->moveState &= ~MOVESTATE_20;
|
||||
spikes->unk3C[sl] = 0;
|
||||
spikes->playerMoveState[playerID] = 0x00;
|
||||
}
|
||||
s->graphics.anim = sSpikesOfZone[LEVEL_TO_ZONE(gCurrentLevel)];
|
||||
s->variant = SA2_ANIM_VARIANT_SPIKES_UP_MID;
|
||||
UpdateSpriteAnimation(s);
|
||||
} else {
|
||||
if ((player->moveState & MOVESTATE_8) && (player->unk3C == s)) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
if ((player->moveState & MOVESTATE_STOOD_ON_OBJ) && (player->stoodObj == s)) {
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
// TODO: Replace magic number
|
||||
if (spikes->unk3C[sl] & 0x20) {
|
||||
if (spikes->playerMoveState[playerID] & MOVESTATE_20) {
|
||||
player->moveState &= ~MOVESTATE_20;
|
||||
spikes->unk3C[sl] = 0;
|
||||
spikes->playerMoveState[playerID] = 0x00;
|
||||
}
|
||||
s->graphics.anim = sSpikesOfZone[LEVEL_TO_ZONE(gCurrentLevel)];
|
||||
s->variant = SA2_ANIM_VARIANT_SPIKES_UP_LOW;
|
||||
@@ -963,13 +953,13 @@ static bool32 sub_80609B4(Sprite *s, MapEntity *me, Sprite_Spikes *spikes, Playe
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void TaskDestructor_8060CF4(struct Task *t)
|
||||
static void TaskDestructor_Spikes(struct Task *t)
|
||||
{
|
||||
Sprite_Spikes *spikes = TASK_DATA(t);
|
||||
VramFree(spikes->s.graphics.dest);
|
||||
}
|
||||
|
||||
static u32 sub_8060D08(Sprite *s, s32 x, s32 y, Player *player)
|
||||
static u32 HandleSpikePlayerCollision(Sprite *s, s32 x, s32 y, Player *player)
|
||||
{
|
||||
u32 result;
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ static void Task_Interactable_BouncySpring()
|
||||
if (gPlayer.speedAirY < Q_8_8(-12))
|
||||
gPlayer.speedAirY = Q_8_8(-12);
|
||||
|
||||
gPlayer.unk36 = 3;
|
||||
gPlayer.disableTrickTimer = 3;
|
||||
|
||||
Player_TransitionCancelFlyingAndBoost(&gPlayer);
|
||||
sub_8023B5C(&gPlayer, 14);
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "game/interactables_1/stage_goal.h"
|
||||
|
||||
#include "game/multiplayer/mp_player.h"
|
||||
#include "game/multiplayer/player_unk_1.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
#include "game/multiplayer/finish.h"
|
||||
|
||||
#include "sprite.h"
|
||||
@@ -32,16 +32,16 @@ typedef struct {
|
||||
} Sprite_StageGoalToggle;
|
||||
|
||||
static void Task_StageGoalMain(void);
|
||||
static void TaskDestructor_8062E7C(struct Task *);
|
||||
static void TaskDestructor_StageGoal(struct Task *);
|
||||
static void Task_StageGoalAnimate(void);
|
||||
static void sub_8062D44(void);
|
||||
static void StageGoalToggle_PlayerReachedGoal(void);
|
||||
static void StageGoalToggle_HandleMultiplayerFinish(void);
|
||||
|
||||
#define GOAL_LEVER_TILES 4
|
||||
|
||||
void CreateEntity_StageGoal(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
struct Task *t = TaskCreate(Task_StageGoalMain, sizeof(Sprite_StageGoal), 0x2010, 0, TaskDestructor_8062E7C);
|
||||
struct Task *t = TaskCreate(Task_StageGoalMain, sizeof(Sprite_StageGoal), 0x2010, 0, TaskDestructor_StageGoal);
|
||||
Sprite_StageGoal *stageGoal = TASK_DATA(t);
|
||||
Sprite *s = &stageGoal->s;
|
||||
|
||||
@@ -133,7 +133,7 @@ static void Task_StageGoalToggleMain(void)
|
||||
s32 y = TO_WORLD_POS(me->y, regionY);
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
if (x <= I(gPlayer.qWorldX) && !(gPlayer.moveState & (MOVESTATE_GOAL_REACHED | MOVESTATE_8))) {
|
||||
if (x <= I(gPlayer.qWorldX) && !(gPlayer.moveState & (MOVESTATE_GOAL_REACHED | MOVESTATE_STOOD_ON_OBJ))) {
|
||||
gPlayer.transition = PLTRANS_REACHED_GOAL;
|
||||
gStageGoalX = x;
|
||||
StageGoalToggle_HandleMultiplayerFinish();
|
||||
@@ -183,11 +183,11 @@ static void Task_StageGoalToggleMain(void)
|
||||
|
||||
static void StageGoalToggle_HandleMultiplayerFinish(void)
|
||||
{
|
||||
struct UNK_3005510 *unk5510;
|
||||
RoomEvent *roomEvent;
|
||||
u32 count = 0;
|
||||
MultiplayerPlayer *player = TASK_DATA(gMultiplayerPlayerTasks[SIO_MULTI_CNT->id]);
|
||||
gPlayer.itemEffect &= ~PLAYER_ITEM_EFFECT__CONFUSION;
|
||||
gPlayer.unk32 = 0;
|
||||
gPlayer.confusionTimer = 0;
|
||||
|
||||
if (!(player->unk5C & 1)) {
|
||||
u32 j;
|
||||
@@ -206,25 +206,26 @@ static void StageGoalToggle_HandleMultiplayerFinish(void)
|
||||
gCourseTime = 3600;
|
||||
}
|
||||
|
||||
unk5510 = sub_8019224();
|
||||
unk5510->unk0 = 7;
|
||||
gCurTask->main = sub_8062D44;
|
||||
roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_REACHED_STAGE_GOAL;
|
||||
|
||||
gCurTask->main = StageGoalToggle_PlayerReachedGoal;
|
||||
gCamera.unk50 |= CAM_MODE_SPECTATOR;
|
||||
}
|
||||
}
|
||||
|
||||
static UNUSED void sub_8062BD0(void)
|
||||
static UNUSED void StageGoalToggle_ForceMultiplayerFinish(void)
|
||||
{
|
||||
u32 thing = 0;
|
||||
struct Task **mpTasks = gMultiplayerPlayerTasks;
|
||||
struct UNK_3005510 *unk5510;
|
||||
RoomEvent *roomEvent;
|
||||
u32 j;
|
||||
|
||||
// Required for match
|
||||
*SIO_MULTI_CNT;
|
||||
u32 id = SIO_MULTI_CNT->id;
|
||||
|
||||
gPlayer.itemEffect &= ~PLAYER_ITEM_EFFECT__CONFUSION;
|
||||
gPlayer.unk32 = 0;
|
||||
gPlayer.confusionTimer = 0;
|
||||
|
||||
for (j = 0; j < ARRAY_COUNT(gMultiplayerPlayerTasks) && mpTasks[j] != NULL; j++) {
|
||||
// TODO: make this a macro? What does it even mean
|
||||
@@ -249,13 +250,13 @@ static UNUSED void sub_8062BD0(void)
|
||||
|
||||
gStageFlags |= 4;
|
||||
gCourseTime = 3600;
|
||||
unk5510 = sub_8019224();
|
||||
unk5510->unk0 = 7;
|
||||
gCurTask->main = sub_8062D44;
|
||||
roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_REACHED_STAGE_GOAL;
|
||||
gCurTask->main = StageGoalToggle_PlayerReachedGoal;
|
||||
gCamera.unk50 |= CAM_MODE_SPECTATOR;
|
||||
}
|
||||
|
||||
static void sub_8062D44(void)
|
||||
static void StageGoalToggle_PlayerReachedGoal(void)
|
||||
{
|
||||
|
||||
u32 id = SIO_MULTI_CNT->id;
|
||||
@@ -304,7 +305,7 @@ void CreateEntity_Toggle_StageGoal(MapEntity *me, u16 spriteRegionX, u16 spriteR
|
||||
SET_MAP_ENTITY_INITIALIZED(me);
|
||||
}
|
||||
|
||||
static void TaskDestructor_8062E7C(struct Task *t)
|
||||
static void TaskDestructor_StageGoal(struct Task *t)
|
||||
{
|
||||
Sprite_StageGoal *stageGoal = TASK_DATA(t);
|
||||
VramFree(stageGoal->s.graphics.dest);
|
||||
|
||||
@@ -126,7 +126,7 @@ static void sub_807E408(Sprite_Cannon *cannon)
|
||||
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
|
||||
gPlayer.qWorldX += COS_24_8(cannon->unk6A) * 0x20;
|
||||
gPlayer.qWorldY += SIN_24_8(cannon->unk6A) * 0x20;
|
||||
|
||||
@@ -111,7 +111,7 @@ static void Pole_PlayerJumpsOff(Sprite_Pole *pole)
|
||||
gPlayer.moveState &= ~MOVESTATE_FACING_LEFT;
|
||||
}
|
||||
gPlayer.charState = CHARSTATE_SPIN_ATTACK;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
|
||||
if (pole->facingLeft) {
|
||||
gPlayer.speedAirX = -Q(5);
|
||||
@@ -200,7 +200,7 @@ static void sub_807ED00(Sprite_Pole *pole)
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
gPlayer.charState = CHARSTATE_FALLING_VULNERABLE_B;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
gPlayer.speedAirY = Q(1);
|
||||
m4aSongNumStop(SE_POLE_SLIDING);
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ static void sub_807F9F0(void)
|
||||
platform->unk4C = FALSE;
|
||||
gPlayer.transition = PLTRANS_INIT_JUMP;
|
||||
gPlayer.moveState &= ~8;
|
||||
gPlayer.unk3C = 0;
|
||||
gPlayer.stoodObj = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,8 +184,8 @@ static bool32 sub_807FC9C(Sprite_SpeedingPlatform *platform)
|
||||
}
|
||||
|
||||
if (gPlayer.moveState & (MOVESTATE_1000000 | MOVESTATE_400000 | MOVESTATE_IN_AIR | MOVESTATE_DEAD)) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.unk3C = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.stoodObj = NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
@@ -332,7 +332,7 @@ static void sub_80730F0(UNUSED Sprite_HookRail *hookRail)
|
||||
{
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
gPlayer.charState = CHARSTATE_FALLING_VULNERABLE_B;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
if (gPlayer.rotation == 128) {
|
||||
gPlayer.rotation = 109;
|
||||
} else {
|
||||
|
||||
@@ -534,7 +534,7 @@ void sub_8079888(Sprite_IA69 *ia69)
|
||||
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
gPlayer.transition = PLTRANS_PT9;
|
||||
gPlayer.transition = PLTRANS_HURT;
|
||||
}
|
||||
|
||||
gCurTask->main = Task_Interactable069;
|
||||
|
||||
@@ -176,7 +176,7 @@ static void sub_8078254(Sprite_FunnelSphere *funnelSphere)
|
||||
{
|
||||
Player_ClearMovestate_IsInScriptedSequence();
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
|
||||
switch (gPlayer.character) {
|
||||
case CHARACTER_CREAM:
|
||||
|
||||
@@ -255,7 +255,7 @@ static void sub_8076C88(Sprite_GermanFlute UNUSED *flute)
|
||||
{
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
gPlayer.charState = CHARSTATE_FALLING_VULNERABLE_B;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
gPlayer.speedAirX = 0;
|
||||
gPlayer.speedAirY = 0;
|
||||
|
||||
@@ -265,7 +265,7 @@ static void sub_8076C88(Sprite_GermanFlute UNUSED *flute)
|
||||
static void sub_8076CC0(Sprite_GermanFlute UNUSED *flute)
|
||||
{
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
gPlayer.speedAirX = 0;
|
||||
gPlayer.speedAirY = 0;
|
||||
|
||||
|
||||
@@ -278,7 +278,7 @@ void sub_8076258(Sprite_GuitarString UNUSED *gs)
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
Player_ClearMovestate_IsInScriptedSequence();
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
gPlayer.speedAirY = -gPlayer.speedAirY;
|
||||
m4aSongNumStart(SE_MUSIC_PLANT_GUITAR_STRING);
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ static void sub_8076448(Sprite_Keyboard *kb)
|
||||
|
||||
kb->unk1 = 8;
|
||||
gPlayer.charState = CHARSTATE_SPIN_ATTACK;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
|
||||
if (LEVEL_TO_ZONE(gCurrentLevel) == ZONE_6) {
|
||||
m4aSongNumStart(SE_TECHNO_BASE_COMMON);
|
||||
|
||||
@@ -147,7 +147,7 @@ void sub_8075B50(Sprite_NoteBlock *block)
|
||||
block->unk49 = 192;
|
||||
gPlayer.speedAirY = -(gUnknown_080DFC6A[block->unk48]);
|
||||
gPlayer.charState = CHARSTATE_NOTE_BLOCK;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
gPlayer.prevCharState = CHARSTATE_INVALID;
|
||||
|
||||
block->unk4A = 0;
|
||||
|
||||
@@ -173,7 +173,7 @@ static u8 NoteSphere_BouncePlayer(Sprite_NoteSphere *note)
|
||||
gPlayer.speedAirY = I(sNoteSphereVelocities[note->kind] * Q_2_14_TO_Q_24_8(SIN(r4 * 4)));
|
||||
}
|
||||
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
|
||||
return angle;
|
||||
}
|
||||
|
||||
@@ -910,7 +910,7 @@ void sub_80777C8(Sprite_Pipe_Horn *pipe)
|
||||
Player_ClearMovestate_IsInScriptedSequence();
|
||||
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
|
||||
gPlayer.speedAirX = gUnknown_080DFE90[pipe->kind][0];
|
||||
gPlayer.speedAirY = gUnknown_080DFE90[pipe->kind][1];
|
||||
@@ -1080,7 +1080,7 @@ void sub_8077B28(Sprite_Pipe_Horn *horn)
|
||||
gPlayer.moveState &= ~(MOVESTATE_IN_SCRIPTED | MOVESTATE_400000);
|
||||
#endif
|
||||
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
gPlayer.speedAirX = gUnknown_080DFFF4[horn->kind][0];
|
||||
gPlayer.speedAirY = gUnknown_080DFFF4[horn->kind][1];
|
||||
gPlayer.rotation = gUnknown_080E0000[horn->kind];
|
||||
|
||||
@@ -181,7 +181,7 @@ static void sub_807B74C(Sprite_Propeller *propeller)
|
||||
static void sub_807B7BC(Sprite_Propeller *propeller)
|
||||
{
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
|
||||
if (propeller->unk48 <= (PROPELLER_HITBOX_HEIGHT / 2) || propeller->unk48 >= 192) {
|
||||
propeller->unk48 += (PROPELLER_HITBOX_HEIGHT / 2);
|
||||
|
||||
@@ -134,7 +134,7 @@ static void HandleRotationComplete(Sprite_SmallWindmill *windmill)
|
||||
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
|
||||
switch (windmill->initialTouchAngle) {
|
||||
case 2:
|
||||
|
||||
@@ -136,25 +136,25 @@ static bool32 sub_8079AC4(Sprite_TecBaseNoteBlock *noteBlock)
|
||||
gPlayer.qWorldY += Q_8_8(temp);
|
||||
gPlayer.speedAirY = gUnknown_080E001A[noteBlock->unk4C][1];
|
||||
gPlayer.charState = CHARSTATE_SPIN_ATTACK;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
noteBlock->unk4D = 0xC0;
|
||||
} else if (temp & 0x40000) {
|
||||
gPlayer.qWorldX += (s16)(temp & 0xFF00);
|
||||
gPlayer.speedAirX = gUnknown_080E001A[noteBlock->unk4C][0];
|
||||
gPlayer.charState = CHARSTATE_SPIN_ATTACK;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
noteBlock->unk4D = 0x80;
|
||||
} else if (temp & 0x80000) {
|
||||
gPlayer.qWorldX += (s16)(temp & 0xFF00);
|
||||
gPlayer.speedAirX = gUnknown_080E001A[noteBlock->unk4C][2];
|
||||
gPlayer.charState = CHARSTATE_SPIN_ATTACK;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
noteBlock->unk4D = 0;
|
||||
} else {
|
||||
gPlayer.qWorldY += Q_8_8(temp);
|
||||
gPlayer.speedAirY = gUnknown_080E001A[noteBlock->unk4C][3];
|
||||
gPlayer.charState = CHARSTATE_SPIN_ATTACK;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
noteBlock->unk4D = 0x40;
|
||||
}
|
||||
|
||||
@@ -163,12 +163,12 @@ static bool32 sub_8079AC4(Sprite_TecBaseNoteBlock *noteBlock)
|
||||
} else {
|
||||
gPlayer.speedGroundX = speedGround;
|
||||
gPlayer.charState = CHARSTATE_SPIN_ATTACK;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
}
|
||||
|
||||
if (gPlayer.unk3C == ¬eBlock->s) {
|
||||
gPlayer.unk3C = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
if (gPlayer.stoodObj == ¬eBlock->s) {
|
||||
gPlayer.stoodObj = NULL;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
@@ -138,6 +138,7 @@ void TaskDestructor_8019EF4(struct Task *t)
|
||||
|
||||
#include "game/multiboot/collect_rings/results.h"
|
||||
#include "game/multiplayer/results.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
#include "lib/m4a/m4a.h"
|
||||
|
||||
typedef struct {
|
||||
@@ -218,7 +219,7 @@ void Task_801A04C(void)
|
||||
x = DISPLAY_WIDTH;
|
||||
}
|
||||
|
||||
if (gUnknown_03005438 == gUnknown_03005420) {
|
||||
if (gRoomEventQueueWritePos == gRoomEventQueueSendPos) {
|
||||
if (f2->unk0++ > x) {
|
||||
gBldRegs.bldCnt = (BLDCNT_EFFECT_LIGHTEN | BLDCNT_TGT1_ALL);
|
||||
gBldRegs.bldY = 0;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "core.h"
|
||||
#include "game/sa1_sa2_shared/collision.h"
|
||||
#include "game/unknown_effect.h"
|
||||
#include "game/multiplayer/mp_attack_1_effect.h"
|
||||
#include "game/stage/player.h"
|
||||
#include "game/stage/camera.h"
|
||||
#include "game/entity.h"
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
#include "constants/songs.h"
|
||||
|
||||
struct UnknownEffect87028 {
|
||||
struct MPAttack1Effect {
|
||||
/* 0x00 */ u8 unk0;
|
||||
} /* size 0x4 */;
|
||||
|
||||
@@ -18,13 +18,13 @@ void sub_8087088(void);
|
||||
void sub_80870E8(void);
|
||||
|
||||
s32 ALIGNED(8) gUnused_03005B78 = 0;
|
||||
u8 gUnknown_03005B7C = 0;
|
||||
u8 gShouldSpawnMPAttackEffect = FALSE;
|
||||
|
||||
void Task_UnknownEffect(void)
|
||||
void Task_MPAttackEffect(void)
|
||||
{
|
||||
s16 a = I(gPlayer.qWorldX) - gCamera.x;
|
||||
s16 b = I(gPlayer.qWorldY) - gCamera.y;
|
||||
struct UnknownEffect87028 *effect = TASK_DATA(gCurTask);
|
||||
struct MPAttack1Effect *effect = TASK_DATA(gCurTask);
|
||||
|
||||
sub_80871C4(a, b, DISPLAY_HEIGHT - effect->unk0);
|
||||
|
||||
@@ -38,7 +38,7 @@ void sub_8087088(void)
|
||||
{
|
||||
s16 a = I(gPlayer.qWorldX) - gCamera.x;
|
||||
s16 b = I(gPlayer.qWorldY) - gCamera.y;
|
||||
struct UnknownEffect87028 *effect = TASK_DATA(gCurTask);
|
||||
struct MPAttack1Effect *effect = TASK_DATA(gCurTask);
|
||||
|
||||
sub_80871C4(a, b, 0x6E);
|
||||
|
||||
@@ -57,7 +57,7 @@ void sub_80870E8(void)
|
||||
{
|
||||
s16 a = I(gPlayer.qWorldX) - gCamera.x;
|
||||
s16 b = I(gPlayer.qWorldY) - gCamera.y;
|
||||
struct UnknownEffect87028 *effect = TASK_DATA(gCurTask);
|
||||
struct MPAttack1Effect *effect = TASK_DATA(gCurTask);
|
||||
|
||||
sub_80871C4(a + gUnknown_080E02DC[effect->unk0 & 7][0], b + gUnknown_080E02DC[effect->unk0 & 7][1], 160 - effect->unk0);
|
||||
|
||||
@@ -156,19 +156,19 @@ void sub_80871C4(s16 a, s16 b, s16 c)
|
||||
}
|
||||
}
|
||||
|
||||
void TaskDestructor_UnknownEffect(struct Task *);
|
||||
void sub_80873A4(void);
|
||||
void TaskDestructor_MPAttackEffect(struct Task *);
|
||||
void InitGraphicsForMPAttackEffect(void);
|
||||
|
||||
void sub_8087368(void)
|
||||
void CreateMPAttackEffect(void)
|
||||
{
|
||||
struct Task *t = TaskCreate(Task_UnknownEffect, sizeof(struct UnknownEffect87028), 0x8000, 0, TaskDestructor_UnknownEffect);
|
||||
struct UnknownEffect87028 *effect = TASK_DATA(t);
|
||||
struct Task *t = TaskCreate(Task_MPAttackEffect, sizeof(struct MPAttack1Effect), 0x8000, 0, TaskDestructor_MPAttackEffect);
|
||||
struct MPAttack1Effect *effect = TASK_DATA(t);
|
||||
effect->unk0 = 0;
|
||||
sub_80873A4();
|
||||
InitGraphicsForMPAttackEffect();
|
||||
m4aSongNumStart(SE_219);
|
||||
}
|
||||
|
||||
void sub_80873A4(void)
|
||||
void InitGraphicsForMPAttackEffect(void)
|
||||
{
|
||||
gWinRegs[4] = 0x1F;
|
||||
gWinRegs[5] |= 0x3F;
|
||||
@@ -179,4 +179,4 @@ void sub_80873A4(void)
|
||||
gWinRegs[2] = WIN_RANGE(0, DISPLAY_HEIGHT);
|
||||
}
|
||||
|
||||
void TaskDestructor_UnknownEffect(UNUSED struct Task *t) { gFlags &= ~0x4; }
|
||||
void TaskDestructor_MPAttackEffect(UNUSED struct Task *t) { gFlags &= ~0x4; }
|
||||
@@ -3,34 +3,34 @@
|
||||
|
||||
#include "game/sa1_sa2_shared/globals.h"
|
||||
|
||||
#include "game/multiplayer/player_unk_2.h"
|
||||
#include "game/multiplayer/mp_attack_2_effect.h"
|
||||
|
||||
#include "constants/zones.h"
|
||||
|
||||
// Not clear why this is 16 aligned
|
||||
MultiPlayerBgCtrlRegs ALIGNED(16) *gUnknown_03005840 = NULL;
|
||||
MultiPlayerBgCtrlRegs ALIGNED(16) *gMPAttackEffect2Regs = NULL;
|
||||
|
||||
void Task_PlayerMPUnk2(void);
|
||||
void TaskDestructor_PlayerMPUnk2(struct Task *);
|
||||
void Task_MPAttackEffect2(void);
|
||||
void TaskDestructor_MPAttackEffect2(struct Task *);
|
||||
|
||||
void sub_801A384(void)
|
||||
void CreateMPAttack2Effect(void)
|
||||
{
|
||||
if ((IS_MULTI_PLAYER) && (ACT_INDEX(gCurrentLevel) != ACT_BOSS)
|
||||
&& ((gCurrentLevel != LEVEL_INDEX(ZONE_FINAL, ACT_XX_FINAL_ZONE)) || (gUnknown_030054B0 > 0))
|
||||
&& (gCurrentLevel != LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53))) {
|
||||
if (gUnknown_03005840 != NULL) {
|
||||
gUnknown_03005840->unk2 = 600;
|
||||
if (gMPAttackEffect2Regs != NULL) {
|
||||
gMPAttackEffect2Regs->sizeChangeDelay = 600;
|
||||
} else {
|
||||
// _0801A3D0
|
||||
struct Task *t = TaskCreate(Task_PlayerMPUnk2, (sizeof(MultiPlayerBgCtrlRegs)), 0xE000, 0, TaskDestructor_PlayerMPUnk2);
|
||||
struct Task *t = TaskCreate(Task_MPAttackEffect2, (sizeof(MultiPlayerBgCtrlRegs)), 0xE000, 0, TaskDestructor_MPAttackEffect2);
|
||||
MultiPlayerBgCtrlRegs *regs = TASK_DATA(t);
|
||||
|
||||
gUnknown_03005840 = regs;
|
||||
gMPAttackEffect2Regs = regs;
|
||||
|
||||
regs->unk0 = 0;
|
||||
regs->unk2 = 600;
|
||||
regs->unk4 = 0;
|
||||
regs->unk6 = 0;
|
||||
regs->timer = 0;
|
||||
regs->sizeChangeDelay = 600;
|
||||
regs->sizeChangeTimer = 0;
|
||||
regs->size = 0;
|
||||
|
||||
gMosaicReg = 0;
|
||||
|
||||
@@ -42,34 +42,34 @@ void sub_801A384(void)
|
||||
}
|
||||
}
|
||||
|
||||
void Task_PlayerMPUnk2(void)
|
||||
void Task_MPAttackEffect2(void)
|
||||
{
|
||||
MultiPlayerBgCtrlRegs *regs = TASK_DATA(gCurTask);
|
||||
s16 *p;
|
||||
|
||||
regs->unk0++;
|
||||
regs->timer++;
|
||||
|
||||
if (regs->unk2 != 0) {
|
||||
if (regs->unk6 < 15) {
|
||||
if (++regs->unk4 >= 4) {
|
||||
regs->unk6++;
|
||||
regs->unk4 = 0;
|
||||
if (regs->sizeChangeDelay != 0) {
|
||||
if (regs->size < 15) {
|
||||
if (++regs->sizeChangeTimer >= 4) {
|
||||
regs->size++;
|
||||
regs->sizeChangeTimer = 0;
|
||||
}
|
||||
} else {
|
||||
regs->unk2--;
|
||||
regs->sizeChangeDelay--;
|
||||
}
|
||||
} else if (regs->unk6 == 0) {
|
||||
} else if (regs->size == 0) {
|
||||
TaskDestroy(gCurTask);
|
||||
return;
|
||||
} else {
|
||||
if (++regs->unk4 >= 4) {
|
||||
regs->unk6--;
|
||||
regs->unk4 = 0;
|
||||
if (++regs->sizeChangeTimer >= 4) {
|
||||
regs->size--;
|
||||
regs->sizeChangeTimer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
u16 value = regs->unk6 & 0xF;
|
||||
u16 value = regs->size & 0xF;
|
||||
gMosaicReg = (value << 12);
|
||||
gMosaicReg |= (value << 8);
|
||||
gMosaicReg |= (value << 4);
|
||||
@@ -82,9 +82,9 @@ void Task_PlayerMPUnk2(void)
|
||||
gBgCntRegs[3] |= 0x40;
|
||||
}
|
||||
|
||||
void TaskDestructor_PlayerMPUnk2(struct Task *t)
|
||||
void TaskDestructor_MPAttackEffect2(struct Task *t)
|
||||
{
|
||||
gUnknown_03005840 = NULL;
|
||||
gMPAttackEffect2Regs = NULL;
|
||||
|
||||
gBgCntRegs[0] &= ~0x40;
|
||||
gBgCntRegs[1] &= ~0x40;
|
||||
@@ -16,9 +16,9 @@
|
||||
#include "game/multiplayer/mp_player.h"
|
||||
#include "game/stage/item_tasks.h"
|
||||
|
||||
#include "game/multiplayer/player_unk_1.h"
|
||||
#include "game/unknown_effect.h"
|
||||
#include "game/multiplayer/player_unk_2.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
#include "game/multiplayer/mp_attack_1_effect.h"
|
||||
#include "game/multiplayer/mp_attack_2_effect.h"
|
||||
#include "game/multiplayer/multipak_connection.h"
|
||||
|
||||
#include "constants/animations.h"
|
||||
@@ -27,7 +27,7 @@
|
||||
#include "constants/songs.h"
|
||||
|
||||
u32 unused_3005838 = 0;
|
||||
u8 gUnknown_0300583C = 0;
|
||||
bool8 gShouldSpawnMPAttack2Effect = FALSE;
|
||||
|
||||
void Task_CreateMultiplayerPlayer(void);
|
||||
void TaskDestructor_MultiplayerPlayer(struct Task *);
|
||||
@@ -209,10 +209,10 @@ NONMATCH("asm/non_matching/game/multiplayer/mp_player__Task_CreateMultiplayerPla
|
||||
MultiplayerPlayer *mpp2 = TASK_DATA(gMultiplayerPlayerTasks[mpp->unk64]);
|
||||
if (SIO_MULTI_CNT->id == mpp2->unk64) {
|
||||
mpp2->unk64 = SIO_MULTI_CNT->id;
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState &= ~MOVESTATE_20;
|
||||
gPlayer.moveState &= ~MOVESTATE_4;
|
||||
gPlayer.moveState &= ~MOVESTATE_10;
|
||||
gPlayer.moveState &= ~MOVESTATE_FLIP_WITH_MOVE_DIR;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
gPlayer.moveState &= ~MOVESTATE_400;
|
||||
gPlayer.moveState &= ~MOVESTATE_100;
|
||||
@@ -256,8 +256,8 @@ NONMATCH("asm/non_matching/game/multiplayer/mp_player__Task_CreateMultiplayerPla
|
||||
mpp->unk5C &= ~4;
|
||||
}
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
}
|
||||
@@ -340,7 +340,7 @@ NONMATCH("asm/non_matching/game/multiplayer/mp_player__Task_CreateMultiplayerPla
|
||||
}
|
||||
|
||||
if (someBool) {
|
||||
sub_8019224()->unk0 = 7;
|
||||
((RoomEvent *)CreateRoomEvent())->type = 7;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -384,20 +384,20 @@ NONMATCH("asm/non_matching/game/multiplayer/mp_player__Task_CreateMultiplayerPla
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
}
|
||||
{
|
||||
struct UNK_3005510 *thing = sub_8019224();
|
||||
thing->unk0 = 8;
|
||||
thing->unk1 = mpp->unk56;
|
||||
thing->unk2 = 0;
|
||||
RoomEvent_Unknown *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_UNKNOWN;
|
||||
roomEvent->unk1 = mpp->unk56;
|
||||
roomEvent->unk2 = 0;
|
||||
}
|
||||
}
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
gPlayer.moveState &= ~(MOVESTATE_8 | MOVESTATE_FACING_LEFT);
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
gPlayer.moveState &= ~(MOVESTATE_STOOD_ON_OBJ | MOVESTATE_FACING_LEFT);
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
mpp->unk60 = 30;
|
||||
}
|
||||
} else {
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
gPlayer.moveState &= ~(MOVESTATE_10 | MOVESTATE_IN_AIR);
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
gPlayer.moveState &= ~(MOVESTATE_FLIP_WITH_MOVE_DIR | MOVESTATE_IN_AIR);
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
mpp->unk60 = 30;
|
||||
}
|
||||
@@ -478,14 +478,14 @@ NONMATCH("asm/non_matching/game/multiplayer/mp_player__Task_CreateMultiplayerPla
|
||||
}
|
||||
}
|
||||
|
||||
if (gUnknown_03005B7C != 0) {
|
||||
sub_8087368();
|
||||
gUnknown_03005B7C = 0;
|
||||
if (gShouldSpawnMPAttackEffect != FALSE) {
|
||||
CreateMPAttackEffect();
|
||||
gShouldSpawnMPAttackEffect = FALSE;
|
||||
}
|
||||
|
||||
if (gUnknown_0300583C != 0) {
|
||||
sub_801A384();
|
||||
gUnknown_0300583C = 0;
|
||||
if (gShouldSpawnMPAttack2Effect != FALSE) {
|
||||
CreateMPAttack2Effect();
|
||||
gShouldSpawnMPAttack2Effect = FALSE;
|
||||
}
|
||||
}
|
||||
END_NONMATCH
|
||||
@@ -498,7 +498,7 @@ void sub_8016D20(void)
|
||||
SpriteTransform *transform = &mpp->transform;
|
||||
u32 val;
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
sub_8017F34();
|
||||
}
|
||||
|
||||
@@ -534,8 +534,8 @@ void sub_8016D20(void)
|
||||
gPlayer.unk61 = 0;
|
||||
gPlayer.unk62 = 0;
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
@@ -578,7 +578,7 @@ void sub_8016D20(void)
|
||||
mpp->unk60 = 30;
|
||||
}
|
||||
|
||||
if (!(val & (MOVESTATE_10000 | MOVESTATE_20 | MOVESTATE_8))) {
|
||||
if (!(val & (MOVESTATE_10000 | MOVESTATE_20 | MOVESTATE_STOOD_ON_OBJ))) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -590,8 +590,8 @@ void sub_8016D20(void)
|
||||
gPlayer.unk61 = 0;
|
||||
gPlayer.unk62 = 0;
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
@@ -617,11 +617,11 @@ void sub_8016D20(void)
|
||||
} else {
|
||||
mpp->unk60--;
|
||||
|
||||
if (!(gPlayer.moveState & MOVESTATE_8)) {
|
||||
if (!(gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (gPlayer.unk3C != s) {
|
||||
if (gPlayer.stoodObj != s) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -655,7 +655,7 @@ void sub_801707C(void)
|
||||
s = &mpp->s;
|
||||
moveStateVal = (gPlayer.moveState >> 5) & 1;
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
sub_8017F34();
|
||||
someBool = TRUE;
|
||||
}
|
||||
@@ -738,7 +738,7 @@ void sub_801707C(void)
|
||||
|
||||
if (result - gPlayer.spriteOffsetY > 0) {
|
||||
gPlayer.moveState |= MOVESTATE_400000;
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
|
||||
mpp->unk5C |= 4;
|
||||
sub_8023B5C(&gPlayer, 14);
|
||||
@@ -746,10 +746,10 @@ void sub_801707C(void)
|
||||
gPlayer.spriteOffsetY = 14;
|
||||
|
||||
{
|
||||
struct UNK_3005510 *thing = sub_8019224();
|
||||
thing->unk0 = 8;
|
||||
thing->unk1 = mpp->unk56;
|
||||
thing->unk2 = 1;
|
||||
RoomEvent_Unknown *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_UNKNOWN;
|
||||
roomEvent->unk1 = mpp->unk56;
|
||||
roomEvent->unk2 = 1;
|
||||
}
|
||||
|
||||
if (!GRAVITY_IS_INVERTED) {
|
||||
@@ -790,7 +790,7 @@ void sub_801707C(void)
|
||||
gPlayer.timerInvulnerability = 60;
|
||||
}
|
||||
} else {
|
||||
if (gPlayer.moveState & MOVESTATE_8) {
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ) {
|
||||
gPlayer.moveState &= ~MOVESTATE_400000;
|
||||
mpp->unk5C &= ~4;
|
||||
} else {
|
||||
@@ -851,10 +851,10 @@ void sub_801707C(void)
|
||||
}
|
||||
|
||||
if (!(mpp->unk5C & 4)) {
|
||||
struct UNK_3005510 *thing = sub_8019224();
|
||||
thing->unk0 = 8;
|
||||
thing->unk1 = mpp->unk56;
|
||||
thing->unk2 = 0;
|
||||
RoomEvent_Unknown *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_UNKNOWN;
|
||||
roomEvent->unk1 = mpp->unk56;
|
||||
roomEvent->unk2 = 0;
|
||||
}
|
||||
|
||||
if (!GRAVITY_IS_INVERTED) {
|
||||
@@ -865,11 +865,11 @@ void sub_801707C(void)
|
||||
} else {
|
||||
mpp->unk60--;
|
||||
|
||||
if (!(gPlayer.moveState & MOVESTATE_8)) {
|
||||
if (!(gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (gPlayer.unk3C != s) {
|
||||
if (gPlayer.stoodObj != s) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -897,7 +897,7 @@ void sub_8017670(void)
|
||||
s = &mpp->s;
|
||||
moveStateVal = (gPlayer.moveState >> 5) & 1;
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
sub_8017F34();
|
||||
}
|
||||
|
||||
@@ -982,10 +982,10 @@ void sub_8017670(void)
|
||||
}
|
||||
if (!(mpp->unk5C & 4)) {
|
||||
{
|
||||
struct UNK_3005510 *thing = sub_8019224();
|
||||
thing->unk0 = 8;
|
||||
thing->unk1 = mpp->unk56;
|
||||
thing->unk2 = 1;
|
||||
RoomEvent_Unknown *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_UNKNOWN;
|
||||
roomEvent->unk1 = mpp->unk56;
|
||||
roomEvent->unk2 = 1;
|
||||
}
|
||||
if (!GRAVITY_IS_INVERTED) {
|
||||
mpp->unk5C &= ~0x100;
|
||||
@@ -1058,11 +1058,11 @@ void sub_8017670(void)
|
||||
}
|
||||
|
||||
if ((mpp->unk5C & 4)) {
|
||||
gPlayer.moveState |= MOVESTATE_8;
|
||||
gPlayer.moveState |= MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState &= ~MOVESTATE_4;
|
||||
gPlayer.moveState &= ~MOVESTATE_IN_AIR;
|
||||
|
||||
gPlayer.unk3C = s;
|
||||
gPlayer.stoodObj = s;
|
||||
gPlayer.speedAirY = 0;
|
||||
|
||||
if ((s->frameFlags & SPRITE_FLAG_MASK_X_FLIP)) {
|
||||
@@ -1073,10 +1073,10 @@ void sub_8017670(void)
|
||||
}
|
||||
|
||||
if (!(mpp->unk5C & 4)) {
|
||||
struct UNK_3005510 *thing = sub_8019224();
|
||||
thing->unk0 = 8;
|
||||
thing->unk1 = mpp->unk56;
|
||||
thing->unk2 = 0;
|
||||
RoomEvent_Unknown *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_UNKNOWN;
|
||||
roomEvent->unk1 = mpp->unk56;
|
||||
roomEvent->unk2 = 0;
|
||||
}
|
||||
|
||||
if (!GRAVITY_IS_INVERTED) {
|
||||
@@ -1088,11 +1088,11 @@ void sub_8017670(void)
|
||||
} else {
|
||||
mpp->unk60--;
|
||||
|
||||
if (!(gPlayer.moveState & MOVESTATE_8)) {
|
||||
if (!(gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (gPlayer.unk3C != s) {
|
||||
if (gPlayer.stoodObj != s) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1112,7 +1112,7 @@ void sub_8017C28(void)
|
||||
Sprite *s = &mpp->s;
|
||||
u32 val;
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
sub_8017F34();
|
||||
}
|
||||
|
||||
@@ -1208,11 +1208,11 @@ void sub_8017C28(void)
|
||||
} else {
|
||||
mpp->unk60--;
|
||||
|
||||
if (!(gPlayer.moveState & MOVESTATE_8)) {
|
||||
if (!(gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (gPlayer.unk3C != s) {
|
||||
if (gPlayer.stoodObj != s) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1240,8 +1240,8 @@ void sub_8017F34(void)
|
||||
|
||||
otherMpp = TASK_DATA(gMultiplayerPlayerTasks[SIO_MULTI_CNT->id]);
|
||||
if ((otherMpp->unk54 & 0x80) != (mpp->unk54 & 0x80)) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.unk3C = (void *)-1;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.stoodObj = (void *)-1;
|
||||
mpp->unk64 = mpp->unk56;
|
||||
return;
|
||||
}
|
||||
@@ -1257,7 +1257,7 @@ void sub_8017F34(void)
|
||||
result = sub_801F100(I(gPlayer.qWorldY) - gPlayer.spriteOffsetY, I(gPlayer.qWorldX), gPlayer.layer, -8, sub_801EC3C);
|
||||
if (result < 0) {
|
||||
gPlayer.qWorldY -= Q(result);
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
mpp->unk60 = 30;
|
||||
}
|
||||
@@ -1265,7 +1265,7 @@ void sub_8017F34(void)
|
||||
result = sub_801F100(I(gPlayer.qWorldY) + gPlayer.spriteOffsetY, I(gPlayer.qWorldX), gPlayer.layer, 8, sub_801EC3C);
|
||||
if (result < 0) {
|
||||
gPlayer.qWorldY += Q(result);
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
mpp->unk60 = 30;
|
||||
}
|
||||
@@ -1290,7 +1290,7 @@ void sub_8018120(void)
|
||||
{
|
||||
MultiplayerPlayer *mpp = TASK_DATA(gCurTask);
|
||||
Sprite *s = &mpp->s;
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
MultiplayerPlayer *otherMpp;
|
||||
gPlayer.qWorldX += Q(mpp->unk44);
|
||||
gPlayer.qWorldY += Q(mpp->unk48) + Q(1);
|
||||
@@ -1298,8 +1298,8 @@ void sub_8018120(void)
|
||||
otherMpp = TASK_DATA(gMultiplayerPlayerTasks[SIO_MULTI_CNT->id]);
|
||||
|
||||
if ((otherMpp->unk54 & 0x80) != (mpp->unk54 & 0x80)) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.unk3C = (void *)-1;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.stoodObj = (void *)-1;
|
||||
mpp->unk64 = mpp->unk56;
|
||||
}
|
||||
}
|
||||
@@ -1341,8 +1341,8 @@ bool32 sub_80181E0(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
return FALSE;
|
||||
@@ -1413,14 +1413,14 @@ bool32 sub_8018300(void)
|
||||
|
||||
if (!HITBOX_IS_ACTIVE(sprPlayer->hitboxes[1]) && !HITBOX_IS_ACTIVE(s->hitboxes[1])) {
|
||||
u32 existingMoveState = gPlayer.moveState;
|
||||
Sprite *existingS = gPlayer.unk3C;
|
||||
Sprite *existingS = gPlayer.stoodObj;
|
||||
s16 x, y;
|
||||
|
||||
val = sub_800D0A0(s, mpp->pos.x, mpp->pos.y, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1, val2 & 2);
|
||||
|
||||
if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && val == 0) {
|
||||
gPlayer.moveState = existingMoveState;
|
||||
gPlayer.unk3C = existingS;
|
||||
gPlayer.stoodObj = existingS;
|
||||
|
||||
if (mpp->pos.x > 960) {
|
||||
val = sub_800D0A0(s, mpp->pos.x - 1440, mpp->pos.y - 864, mpp->unk66, mpp->unk68, (mpp->unk54 >> 7) & 1, val);
|
||||
@@ -1437,8 +1437,8 @@ bool32 sub_8018300(void)
|
||||
mpp->unk60 = 30;
|
||||
}
|
||||
} else {
|
||||
if (gPlayer.moveState & MOVESTATE_8 && gPlayer.unk3C == s) {
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ && gPlayer.stoodObj == s) {
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
@@ -1451,11 +1451,11 @@ bool32 sub_8018300(void)
|
||||
|
||||
mpp->unk60--;
|
||||
|
||||
if (!(gPlayer.moveState & MOVESTATE_8)) {
|
||||
if (!(gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (gPlayer.unk3C != s) {
|
||||
if (gPlayer.stoodObj != s) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -1490,7 +1490,7 @@ void Task_HandleLaunchPlayer(void)
|
||||
s16 *airSpeed = TASK_DATA(gCurTask);
|
||||
gPlayer.moveState &= ~MOVESTATE_IGNORE_INPUT;
|
||||
gPlayer.moveState &= ~MOVESTATE_800000;
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
gPlayer.moveState &= ~MOVESTATE_100;
|
||||
gPlayer.charState = CHARSTATE_SPRING_B;
|
||||
|
||||
+45
-37
@@ -4,9 +4,9 @@
|
||||
#include "game/stage/camera.h"
|
||||
#include "game/stage/item_tasks.h"
|
||||
|
||||
#include "game/unknown_effect.h"
|
||||
#include "game/multiplayer/mp_attack_1_effect.h"
|
||||
|
||||
#include "game/multiplayer/player_unk_1.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
#include "game/multiplayer/finish.h"
|
||||
#include "game/multiplayer/mp_player.h"
|
||||
|
||||
@@ -15,15 +15,23 @@
|
||||
#include "constants/char_states.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
void sub_8018E00(union MultiSioData *recv, u8 i);
|
||||
void sub_8018AD8(union MultiSioData *recv, u8 i);
|
||||
typedef void (*UnknownFunction)(union MultiSioData *recv, u8 i);
|
||||
void RecieveRoomEvent_ReachedStageGoal(union MultiSioData *recv, u8 i);
|
||||
void RecieveRoomEvent_ItemEffect(union MultiSioData *recv, u8 i);
|
||||
typedef void (*RoomEventHandler)(union MultiSioData *recv, u8 i);
|
||||
|
||||
const UnknownFunction gUnknown_080D5744[] = {
|
||||
sub_8019240, sub_80192A8, sub_80192FC, sub_8019350, sub_8019368, sub_8018AD8, sub_8018E00, VoidReturnSIOControl32, NULL,
|
||||
const RoomEventHandler gRoomEventHandlers[] = {
|
||||
[ROOMEVENT_TYPE_PLATFORM_CHANGE - 1] = RecieveRoomEvent_PlatformChange,
|
||||
[ROOMEVENT_TYPE_ITEMBOX_BREAK - 1] = RecieveRoomEvent_ItemBoxBreak,
|
||||
[ROOMEVENT_TYPE_ENEMY_DESTROYED - 1] = RecieveRoomEvent_EnemyDestroyed,
|
||||
[ROOMEVENT_TYPE_PLAYER_RING_LOSS - 1] = RecieveRoomEvent_PlayerRingLoss,
|
||||
[ROOMEVENT_TYPE_MYSTERY_ITEMBOX_BREAK - 1] = RecieveRoomEvent_MysterItemBoxBreak,
|
||||
[ROOMEVENT_TYPE_ITEMEFFECT_APPLIED - 1] = RecieveRoomEvent_ItemEffect,
|
||||
[ROOMEVENT_TYPE_REACHED_STAGE_GOAL - 1] = RecieveRoomEvent_ReachedStageGoal,
|
||||
[ROOMEVENT_TYPE_UNKNOWN - 1] = RecieveRoomEvent_Unknown,
|
||||
[8] = NULL,
|
||||
};
|
||||
|
||||
void Task_80188FC(void)
|
||||
void Task_MultiplayerEventMgr_Send(void)
|
||||
{
|
||||
u8 id = SIO_MULTI_CNT->id;
|
||||
struct MultiSioData_0_0 *send = &gMultiSioSend.pat0;
|
||||
@@ -43,16 +51,16 @@ void Task_80188FC(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (gUnknown_03005438 == gUnknown_03005420) {
|
||||
DmaFill16(3, 0, &gMultiSioSend.pat0.unk8[3], sizeof(struct UNK_3005510) - 1);
|
||||
if (gRoomEventQueueWritePos == gRoomEventQueueSendPos) {
|
||||
DmaFill16(3, 0, &gMultiSioSend.pat0.unk8[3], sizeof(RoomEvent) - 1);
|
||||
} else {
|
||||
DmaCopy16(3, &gUnknown_03005510[gUnknown_03005420], &gMultiSioSend.pat0.unk8[3], sizeof(struct UNK_3005510) - 1);
|
||||
gUnknown_03005420 = (gUnknown_03005420 + 1) & 0xF;
|
||||
DmaCopy16(3, &gRoomEventQueue[gRoomEventQueueSendPos], &gMultiSioSend.pat0.unk8[3], sizeof(RoomEvent) - 1);
|
||||
gRoomEventQueueSendPos = (gRoomEventQueueSendPos + 1) & 0xF;
|
||||
send->unk8[0] ^= (0x1000 << id);
|
||||
}
|
||||
}
|
||||
|
||||
void Task_8018A28(void)
|
||||
void Task_MultiplayerEventMgr_Recieve(void)
|
||||
{
|
||||
u8 id = SIO_MULTI_CNT->id;
|
||||
struct MultiSioData_0_0 *send = &gMultiSioSend.pat0;
|
||||
@@ -76,14 +84,14 @@ void Task_8018A28(void)
|
||||
if (recv->pat0.unk0 == 0x5000 && (recv->pat0.unk8[0] & (0x1000 << i)) != (send->unk8[0] & (0x1000 << i))) {
|
||||
if ((u8)(recv->pat0.unkE - 1) < 8) {
|
||||
|
||||
gUnknown_080D5744[recv->pat0.unkE - 1](recv, i);
|
||||
gRoomEventHandlers[recv->pat0.unkE - 1](recv, i);
|
||||
}
|
||||
send->unk8[0] ^= (0x1000 << i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8018AD8(union MultiSioData *recv, u8 i)
|
||||
void RecieveRoomEvent_ItemEffect(union MultiSioData *recv, u8 i)
|
||||
{
|
||||
MultiplayerPlayer *mpp = TASK_DATA(gMultiplayerPlayerTasks[i]);
|
||||
MultiplayerPlayer *us = TASK_DATA(gMultiplayerPlayerTasks[SIO_MULTI_CNT->id]);
|
||||
@@ -95,7 +103,7 @@ void sub_8018AD8(union MultiSioData *recv, u8 i)
|
||||
|| ((gMultiplayerConnections & (0x10 << (i))) >> ((i + 4))
|
||||
!= (gMultiplayerConnections & (0x10 << (SIO_MULTI_CNT->id))) >> (SIO_MULTI_CNT->id + 4))) {
|
||||
gPlayer.itemEffect |= PLAYER_ITEM_EFFECT__CONFUSION;
|
||||
gPlayer.unk32 = 600;
|
||||
gPlayer.confusionTimer = ZONE_TIME_TO_INT(0, 10);
|
||||
CreateItemTask_Confusion(gPlayer.character);
|
||||
m4aSongNumStart(SE_ITEM_CONFUSION);
|
||||
}
|
||||
@@ -133,7 +141,7 @@ void sub_8018AD8(union MultiSioData *recv, u8 i)
|
||||
&& (gGameMode != GAME_MODE_TEAM_PLAY
|
||||
|| ((gMultiplayerConnections & (0x10 << (i))) >> ((i + 4))
|
||||
!= (gMultiplayerConnections & (0x10 << (SIO_MULTI_CNT->id))) >> (SIO_MULTI_CNT->id + 4)))) {
|
||||
gPlayer.itemEffect |= PLAYER_ITEM_EFFECT__10;
|
||||
gPlayer.itemEffect |= PLAYER_ITEM_EFFECT__MP_SLOW_DOWN;
|
||||
|
||||
gPlayer.timerSpeedup = ZONE_TIME_TO_INT(0, 10);
|
||||
gPlayer.itemEffect &= ~PLAYER_ITEM_EFFECT__SPEED_UP;
|
||||
@@ -147,7 +155,7 @@ void sub_8018AD8(union MultiSioData *recv, u8 i)
|
||||
if (gGameMode != GAME_MODE_TEAM_PLAY
|
||||
|| ((gMultiplayerConnections & (0x10 << (i))) >> ((i + 4))
|
||||
!= (gMultiplayerConnections & (0x10 << (SIO_MULTI_CNT->id))) >> (SIO_MULTI_CNT->id + 4))) {
|
||||
gUnknown_03005B7C = 1;
|
||||
gShouldSpawnMPAttackEffect = TRUE;
|
||||
m4aSongNumStart(SE_219);
|
||||
}
|
||||
break;
|
||||
@@ -156,7 +164,7 @@ void sub_8018AD8(union MultiSioData *recv, u8 i)
|
||||
if (gGameMode != GAME_MODE_TEAM_PLAY
|
||||
|| ((gMultiplayerConnections & (0x10 << (i))) >> ((i + 4))
|
||||
!= (gMultiplayerConnections & (0x10 << (SIO_MULTI_CNT->id))) >> (SIO_MULTI_CNT->id + 4))) {
|
||||
gUnknown_0300583C = 1;
|
||||
gShouldSpawnMPAttack2Effect = TRUE;
|
||||
m4aSongNumStart(SE_216);
|
||||
}
|
||||
break;
|
||||
@@ -165,7 +173,7 @@ void sub_8018AD8(union MultiSioData *recv, u8 i)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8018E00(union MultiSioData *recv, u8 i)
|
||||
void RecieveRoomEvent_ReachedStageGoal(union MultiSioData *recv, u8 i)
|
||||
{
|
||||
u32 j;
|
||||
MultiplayerPlayer *mpp;
|
||||
@@ -212,10 +220,10 @@ void sub_8018E00(union MultiSioData *recv, u8 i)
|
||||
sub_8019CCC(j, count2);
|
||||
if (j == SIO_MULTI_CNT->id) {
|
||||
Player_TransitionCancelFlyingAndBoost(&gPlayer);
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.moveState &= ~MOVESTATE_20;
|
||||
gPlayer.moveState &= ~MOVESTATE_4;
|
||||
gPlayer.moveState &= ~MOVESTATE_10;
|
||||
gPlayer.moveState &= ~MOVESTATE_FLIP_WITH_MOVE_DIR;
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
gPlayer.moveState &= ~MOVESTATE_400;
|
||||
gPlayer.moveState &= ~MOVESTATE_100;
|
||||
@@ -258,17 +266,17 @@ void sub_8018E00(union MultiSioData *recv, u8 i)
|
||||
sub_8019CCC(j, 1);
|
||||
} else {
|
||||
u32 temp;
|
||||
struct UNK_3005510 *unk10;
|
||||
RoomEvent *roomEvent;
|
||||
sub_8019CCC(j, count - 1);
|
||||
mpp2->unk5C |= 1;
|
||||
gPlayer.moveState |= MOVESTATE_IGNORE_INPUT;
|
||||
gPlayer.heldInput = 0;
|
||||
temp = gUnknown_03005438;
|
||||
unk10 = &gUnknown_03005510[temp];
|
||||
gUnknown_03005438++;
|
||||
gUnknown_03005438 &= 0xF;
|
||||
temp = gRoomEventQueueWritePos;
|
||||
roomEvent = &gRoomEventQueue[temp];
|
||||
gRoomEventQueueWritePos++;
|
||||
gRoomEventQueueWritePos &= 0xF;
|
||||
|
||||
unk10->unk0 = 7;
|
||||
roomEvent->type = ROOMEVENT_TYPE_REACHED_STAGE_GOAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -279,23 +287,23 @@ void sub_8018E00(union MultiSioData *recv, u8 i)
|
||||
}
|
||||
}
|
||||
|
||||
struct Task *sub_8019120(void)
|
||||
struct Task *CreateMultiplayerSendEventMgr(void)
|
||||
{
|
||||
struct Task *t = TaskCreate(Task_80188FC, 0, -2, 0, NULL);
|
||||
struct Task *t = TaskCreate(Task_MultiplayerEventMgr_Send, 0, -2, 0, NULL);
|
||||
DmaFill32(3, 0, &gMultiSioSend, sizeof(gMultiSioSend));
|
||||
DmaFill32(3, 0, &gMultiSioRecv, sizeof(gMultiSioRecv));
|
||||
DmaFill32(3, 0, &gUnknown_03005510, sizeof(gUnknown_03005510));
|
||||
gUnknown_03005438 = gUnknown_03005420 = 0;
|
||||
DmaFill32(3, 0, &gRoomEventQueue, sizeof(gRoomEventQueue));
|
||||
gRoomEventQueueWritePos = gRoomEventQueueSendPos = 0;
|
||||
return t;
|
||||
}
|
||||
|
||||
struct Task *sub_80191A4(void)
|
||||
struct Task *CreateMultiplayerRecieveEventMgr(void)
|
||||
{
|
||||
struct Task *t = TaskCreate(Task_8018A28, 0, 1, 0, NULL);
|
||||
struct Task *t = TaskCreate(Task_MultiplayerEventMgr_Recieve, 0, 1, 0, NULL);
|
||||
DmaFill32(3, 0, &gMultiSioSend, sizeof(gMultiSioSend));
|
||||
DmaFill32(3, 0, &gMultiSioRecv, sizeof(gMultiSioRecv));
|
||||
DmaFill32(3, 0, &gUnknown_03005510, sizeof(gUnknown_03005510));
|
||||
gUnknown_03005420 = 0;
|
||||
gUnknown_03005438 = 0;
|
||||
DmaFill32(3, 0, &gRoomEventQueue, sizeof(gRoomEventQueue));
|
||||
gRoomEventQueueSendPos = 0;
|
||||
gRoomEventQueueWritePos = 0;
|
||||
return t;
|
||||
}
|
||||
+10
-10
@@ -1,20 +1,20 @@
|
||||
#include "global.h"
|
||||
#include "core.h"
|
||||
#include "game/entity.h"
|
||||
#include "game/multiplayer/player_unk_1.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
#include "game/stage/rings_scatter.h"
|
||||
#include "game/sa1_sa2_shared/entities_manager.h"
|
||||
|
||||
struct UNK_3005510 *sub_8019224(void)
|
||||
void *CreateRoomEvent(void)
|
||||
{
|
||||
struct UNK_3005510 *result = &gUnknown_03005510[gUnknown_03005438];
|
||||
RoomEvent *result = &gRoomEventQueue[gRoomEventQueueWritePos];
|
||||
|
||||
gUnknown_03005438 = (gUnknown_03005438 + 1) & 0xF;
|
||||
gRoomEventQueueWritePos = (gRoomEventQueueWritePos + 1) & 0xF;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void sub_8019240(union MultiSioData *msioData, u8 someId)
|
||||
void RecieveRoomEvent_PlatformChange(union MultiSioData *msioData, u8 someId)
|
||||
{
|
||||
if (gEntitiesManagerTask != NULL) {
|
||||
EntitiesManager *em = TASK_DATA(gEntitiesManagerTask);
|
||||
@@ -44,7 +44,7 @@ void sub_8019240(union MultiSioData *msioData, u8 someId)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80192A8(union MultiSioData *msioData, u8 UNUSED someId)
|
||||
void RecieveRoomEvent_ItemBoxBreak(union MultiSioData *msioData, u8 UNUSED someId)
|
||||
{
|
||||
if (gEntitiesManagerTask != NULL) {
|
||||
EntitiesManager *em = TASK_DATA(gEntitiesManagerTask);
|
||||
@@ -79,7 +79,7 @@ void sub_80192A8(union MultiSioData *msioData, u8 UNUSED someId)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80192FC(union MultiSioData *msioData, u8 UNUSED someId)
|
||||
void RecieveRoomEvent_EnemyDestroyed(union MultiSioData *msioData, u8 UNUSED someId)
|
||||
{
|
||||
if (gEntitiesManagerTask != NULL) {
|
||||
EntitiesManager *em = TASK_DATA(gEntitiesManagerTask);
|
||||
@@ -113,12 +113,12 @@ void sub_80192FC(union MultiSioData *msioData, u8 UNUSED someId)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8019350(union MultiSioData *msioData, u8 UNUSED someId)
|
||||
void RecieveRoomEvent_PlayerRingLoss(union MultiSioData *msioData, u8 UNUSED someId)
|
||||
{
|
||||
InitScatteringRings(msioData->pat4.x, msioData->pat4.y, msioData->pat4.numRings);
|
||||
}
|
||||
|
||||
void sub_8019368(union MultiSioData *msioData, u8 UNUSED someId)
|
||||
void RecieveRoomEvent_MysterItemBoxBreak(union MultiSioData *msioData, u8 UNUSED someId)
|
||||
{
|
||||
if (gEntitiesManagerTask != NULL) {
|
||||
EntitiesManager *em = TASK_DATA(gEntitiesManagerTask);
|
||||
@@ -152,4 +152,4 @@ void sub_8019368(union MultiSioData *msioData, u8 UNUSED someId)
|
||||
}
|
||||
|
||||
// Type of this is determined by it being referenced in a C func-array
|
||||
void VoidReturnSIOControl32(union MultiSioData *msioData, u8 UNUSED someId) { REG_SIOCNT_32; }
|
||||
void RecieveRoomEvent_Unknown(union MultiSioData *msioData, u8 UNUSED someId) { REG_SIOCNT_32; }
|
||||
+12
-12
@@ -4,7 +4,7 @@
|
||||
|
||||
#include "game/entity.h"
|
||||
#include "game/mystery_item_box.h"
|
||||
#include "game/multiplayer/player_unk_1.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
#include "game/sa1_sa2_shared/dust_cloud.h"
|
||||
#include "game/stage/player.h"
|
||||
#include "game/stage/camera.h"
|
||||
@@ -257,13 +257,13 @@ static void sub_808636C(void)
|
||||
|
||||
static void sub_8086474(Sprite_MysteryItemBox *itemBox)
|
||||
{
|
||||
struct UNK_3005510 *unk5510;
|
||||
RoomEvent_MysteryItemBoxBreak *roomEvent;
|
||||
MapEntity *me;
|
||||
if (itemBox->unk84 != 1 || gPlayer.moveState & 2) {
|
||||
gPlayer.speedAirY = -Q(3); // default itembox-hit y-accel
|
||||
gPlayer.charState = CHARSTATE_SPRING_B;
|
||||
gPlayer.prevCharState = CHARSTATE_INVALID;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
}
|
||||
|
||||
itemBox->base.me->d.sData[1] += 1;
|
||||
@@ -271,13 +271,13 @@ static void sub_8086474(Sprite_MysteryItemBox *itemBox)
|
||||
m4aSongNumStart(SE_ITEM_BOX_2);
|
||||
CreateDustCloud(itemBox->x, itemBox->y);
|
||||
itemBox->framesSinceOpened = 0;
|
||||
unk5510 = sub_8019224();
|
||||
|
||||
unk5510->unk0 = 5;
|
||||
unk5510->unk1 = itemBox->base.regionX;
|
||||
unk5510->unk2 = itemBox->base.regionY;
|
||||
unk5510->unk3 = itemBox->base.id;
|
||||
unk5510->unk4 = itemBox->base.me->d.sData[1];
|
||||
roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_MYSTERY_ITEMBOX_BREAK;
|
||||
roomEvent->x = itemBox->base.regionX;
|
||||
roomEvent->y = itemBox->base.regionY;
|
||||
roomEvent->id = itemBox->base.id;
|
||||
roomEvent->unk4 = itemBox->base.me->d.sData[1];
|
||||
|
||||
gCurTask->main = sub_808665C;
|
||||
}
|
||||
@@ -305,10 +305,10 @@ static void sub_8086504(Sprite_MysteryItemBox *itemBox)
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
struct UNK_3005510 *unk5510 = sub_8019224();
|
||||
RoomEvent_ItemEffect *roomEvent = CreateRoomEvent();
|
||||
|
||||
unk5510->unk0 = 6;
|
||||
unk5510->unk1 = 4;
|
||||
roomEvent->type = ROOMEVENT_TYPE_ITEMEFFECT_APPLIED;
|
||||
roomEvent->effect = 4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+36
-36
@@ -82,7 +82,7 @@ const ALIGNED(4) u16 gUnknown_080D5518[3][3] = {
|
||||
{ 16, SA2_ANIM_CHAR(SA2_CHAR_ANIM_51, CHARACTER_SONIC), 3 },
|
||||
};
|
||||
|
||||
const ALIGNED(4) s16 gUnknown_080D552C[6] = { Q(2.0), Q(4.0), Q(6.0), Q(8.0), Q(10.0), 0 };
|
||||
const ALIGNED(4) s16 creamBoostMinFlySpeedTable[6] = { Q(2.0), Q(4.0), Q(6.0), Q(8.0), Q(10.0), 0 };
|
||||
|
||||
static const s8 sKnucklesTurnFrameToCharstate[4] = { CHARSTATE_KNUCKLES_GLIDE_TURN_FRAME_A, CHARSTATE_KNUCKLES_GLIDE_TURN_FRAME_B,
|
||||
CHARSTATE_KNUCKLES_GLIDE_TURN_FRAME_C, CHARSTATE_KNUCKLES_GLIDE_TURN_FRAME_D };
|
||||
@@ -104,7 +104,7 @@ struct Task *Player_SonicAmy_InitSkidAttackGfxTask(s32 x, s32 y, u16 p2)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
t = CreateMultiplayerSpriteTask(x, y, 0xE8, gPlayer.unk60, Task_UpdateMpSpriteTaskSprite, TaskDestructor_MultiplayerSpriteTask);
|
||||
t = CreateMultiplayerSpriteTask(x, y, 0xE8, gPlayer.playerID, Task_UpdateMpSpriteTaskSprite, TaskDestructor_MultiplayerSpriteTask);
|
||||
ts = TASK_DATA(t);
|
||||
|
||||
switch (p2) {
|
||||
@@ -214,7 +214,7 @@ void Player_SonicAmy_WindupSkidAttack(Player *p)
|
||||
if (p->spriteInfoBody->s.frameFlags & MOVESTATE_4000) {
|
||||
if (p->moveState & MOVESTATE_IN_AIR) {
|
||||
p->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
p->transition = PLTRANS_PT5;
|
||||
p->transition = PLTRANS_UNCURL;
|
||||
} else {
|
||||
p->variant = 1;
|
||||
p->unk6C = TRUE;
|
||||
@@ -256,7 +256,7 @@ void Player_SonicAmy_SkidAttack(Player *p)
|
||||
if (--p->unk72 == -1) {
|
||||
if (p->moveState & MOVESTATE_IN_AIR) {
|
||||
p->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
p->transition = PLTRANS_PT5;
|
||||
p->transition = PLTRANS_UNCURL;
|
||||
} else {
|
||||
p->variant = 2;
|
||||
p->unk6C = TRUE;
|
||||
@@ -364,7 +364,7 @@ void Task_SonicBoundMotionFrames(void)
|
||||
|
||||
void Player_SonicForwardThrust(Player *p)
|
||||
{
|
||||
if (p->moveState & MOVESTATE_10) {
|
||||
if (p->moveState & MOVESTATE_FLIP_WITH_MOVE_DIR) {
|
||||
if (p->heldInput & DPAD_LEFT)
|
||||
p->moveState |= MOVESTATE_FACING_LEFT;
|
||||
|
||||
@@ -396,7 +396,7 @@ void Player_SonicForwardThrust(Player *p)
|
||||
p->spriteInfoBody->s.frameFlags &= ~SPRITE_FLAG_MASK_ANIM_OVER;
|
||||
p->rotation = 0;
|
||||
|
||||
PLAYERFN_SET_AND_CALL(Player_80261D8, p);
|
||||
PLAYERFN_SET_AND_CALL(Player_Uncurl, p);
|
||||
}
|
||||
|
||||
void Player_Sonic_InitHomingAttack(Player *p)
|
||||
@@ -431,7 +431,7 @@ void Player_Sonic_InitHomingAttack(Player *p)
|
||||
PLAYERFN_SET_AND_CALL(Player_Sonic_HomingAttack, p);
|
||||
}
|
||||
|
||||
void Player_801225C(Player *p)
|
||||
void Player_InitHomingAttackRecoil(Player *p)
|
||||
{
|
||||
Player_TransitionCancelFlyingAndBoost(p);
|
||||
p->moveState |= (MOVESTATE_100 | MOVESTATE_IN_AIR);
|
||||
@@ -451,7 +451,7 @@ void Player_801225C(Player *p)
|
||||
p->spriteInfoBody->s.frameFlags &= ~SPRITE_FLAG_MASK_ANIM_OVER;
|
||||
p->rotation = 0;
|
||||
|
||||
PLAYERFN_SET_AND_CALL(Player_80261D8, p);
|
||||
PLAYERFN_SET_AND_CALL(Player_Uncurl, p);
|
||||
}
|
||||
|
||||
void Player_UpdateHomingPosition(s32 qX, s32 qY)
|
||||
@@ -642,7 +642,7 @@ void Player_Cream_InitFlying(Player *p)
|
||||
p->w.cf.flyingDuration = CREAM_FLYING_DURATION;
|
||||
p->unk61 = 1;
|
||||
p->isBoosting = FALSE;
|
||||
p->unk58 = 0;
|
||||
p->boostSpeed = 0;
|
||||
gPlayer.moveState |= MOVESTATE_10000000;
|
||||
PLAYERFN_SET_AND_CALL(Player_Cream_Flying, p);
|
||||
}
|
||||
@@ -654,7 +654,7 @@ void Player_Cream_Flying(Player *p)
|
||||
|
||||
if (p->heldInput & gPlayerControls.attack) {
|
||||
p->charState = CHARSTATE_CREAM_ANIM_20;
|
||||
p->transition = PLTRANS_PT5;
|
||||
p->transition = PLTRANS_UNCURL;
|
||||
|
||||
m4aSongNumStop(SE_CREAM_FLYING);
|
||||
return;
|
||||
@@ -689,12 +689,12 @@ void Player_Cream_Flying(Player *p)
|
||||
UpdateCreamFlying(p);
|
||||
|
||||
{
|
||||
s16 speed = gUnknown_080D552C[p->unk52];
|
||||
s16 speed = creamBoostMinFlySpeedTable[p->boostThreshold];
|
||||
if (ABS(p->speedAirX) > speed) {
|
||||
if (p->speedAirX > 0)
|
||||
p->speedAirX -= p->unk48 * 2;
|
||||
p->speedAirX -= p->acceleration * 2;
|
||||
else
|
||||
p->speedAirX += p->unk48 * 2;
|
||||
p->speedAirX += p->acceleration * 2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -702,9 +702,9 @@ void Player_Cream_Flying(Player *p)
|
||||
|
||||
if (!(p->moveState & MOVESTATE_IN_AIR)) {
|
||||
p->transition = PLTRANS_TOUCH_GROUND;
|
||||
} else if (p->moveState & MOVESTATE_40) {
|
||||
} else if (p->moveState & MOVESTATE_IN_WATER) {
|
||||
p->charState = CHARSTATE_FALLING_VULNERABLE_B;
|
||||
p->transition = PLTRANS_PT5;
|
||||
p->transition = PLTRANS_UNCURL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -713,7 +713,7 @@ void Player_Cream_ChaoAttack(Player *p)
|
||||
if (p->spriteInfoBody->s.frameFlags & SPRITE_FLAG_MASK_ANIM_OVER) {
|
||||
if (p->moveState & MOVESTATE_IN_AIR) {
|
||||
p->charState = CHARSTATE_WALK_A;
|
||||
p->transition = PLTRANS_PT5;
|
||||
p->transition = PLTRANS_UNCURL;
|
||||
} else {
|
||||
p->transition = PLTRANS_TOUCH_GROUND;
|
||||
}
|
||||
@@ -772,7 +772,7 @@ void Player_Cream_StepAttack(Player *p)
|
||||
if (p->spriteInfoBody->s.frameFlags & SPRITE_FLAG_MASK_ANIM_OVER) {
|
||||
if (p->moveState & MOVESTATE_IN_AIR) {
|
||||
p->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
p->transition = PLTRANS_PT5;
|
||||
p->transition = PLTRANS_UNCURL;
|
||||
} else {
|
||||
p->transition = PLTRANS_TOUCH_GROUND;
|
||||
}
|
||||
@@ -818,7 +818,7 @@ struct Task *sub_80129DC(s32 x, s32 y)
|
||||
struct Task *t;
|
||||
MultiplayerSpriteTask *ts;
|
||||
Sprite *s;
|
||||
t = CreateMultiplayerSpriteTask(x, y, 232, gPlayer.unk60, Task_UpdateMpSpriteTaskSprite, TaskDestructor_MultiplayerSpriteTask);
|
||||
t = CreateMultiplayerSpriteTask(x, y, 232, gPlayer.playerID, Task_UpdateMpSpriteTaskSprite, TaskDestructor_MultiplayerSpriteTask);
|
||||
ts = TASK_DATA(t);
|
||||
ts->playerAnim = gPlayerCharacterIdleAnims[gPlayer.character];
|
||||
|
||||
@@ -861,7 +861,7 @@ void Player_Tails_InitUnusedJump(Player *p)
|
||||
|
||||
p->speedAirY = -Q(4.0);
|
||||
|
||||
if (p->moveState & MOVESTATE_40) {
|
||||
if (p->moveState & MOVESTATE_IN_WATER) {
|
||||
p->speedAirY >>= 1;
|
||||
}
|
||||
|
||||
@@ -903,7 +903,7 @@ void Player_Tails_InitFlying(Player *p)
|
||||
p->w.tf.flyingDuration = TAILS_FLYING_DURATION;
|
||||
p->unk61 = 1;
|
||||
p->isBoosting = FALSE;
|
||||
p->unk58 = 0;
|
||||
p->boostSpeed = 0;
|
||||
|
||||
gPlayer.moveState |= MOVESTATE_10000000;
|
||||
PLAYERFN_SET_AND_CALL(Player_Tails_8012C2C, p);
|
||||
@@ -944,16 +944,16 @@ void Player_Tails_8012C2C(Player *p)
|
||||
|
||||
sub_8012B44(p);
|
||||
|
||||
p->unk40 = Q(6.0);
|
||||
p->unk48 = 0x10;
|
||||
p->maxSpeed = Q(6.0);
|
||||
p->acceleration = 0x10;
|
||||
|
||||
sub_80282EC(p);
|
||||
|
||||
if (!(p->moveState & MOVESTATE_IN_AIR)) {
|
||||
p->transition = PLTRANS_TOUCH_GROUND;
|
||||
} else if (p->moveState & MOVESTATE_40) {
|
||||
} else if (p->moveState & MOVESTATE_IN_WATER) {
|
||||
p->charState = CHARSTATE_FALLING_VULNERABLE_B;
|
||||
p->transition = PLTRANS_PT5;
|
||||
p->transition = PLTRANS_UNCURL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -989,7 +989,7 @@ void Player_Tails_InitTailSwipe(Player *p)
|
||||
// While boosting, it is commonly referred to as "Super Tail Swipe".
|
||||
void Player_Tails_TailSwipe(Player *p)
|
||||
{
|
||||
s32 halfUnk4C = p->unk4C >> 1;
|
||||
s32 halfUnk4C = p->deceleration >> 1;
|
||||
|
||||
s32 speed = p->speedGroundX;
|
||||
if (speed > 0) {
|
||||
@@ -1020,7 +1020,7 @@ struct Task *sub_8012DF8(s32 x, s32 y, u16 p2)
|
||||
MultiplayerSpriteTask *ts;
|
||||
Sprite *s;
|
||||
struct Task *t;
|
||||
t = CreateMultiplayerSpriteTask(x, y, 232, gPlayer.unk60, Task_UpdateMpSpriteTaskSprite, TaskDestructor_MultiplayerSpriteTask);
|
||||
t = CreateMultiplayerSpriteTask(x, y, 232, gPlayer.playerID, Task_UpdateMpSpriteTaskSprite, TaskDestructor_MultiplayerSpriteTask);
|
||||
ts = TASK_DATA(t);
|
||||
|
||||
ts->playerAnim = sCharStateAnimInfo[gPlayer.charState][0];
|
||||
@@ -1086,7 +1086,7 @@ void Player_Knuckles_PunchLeft(Player *p)
|
||||
if (p->spriteInfoBody->s.frameFlags & SPRITE_FLAG_MASK_ANIM_OVER) {
|
||||
if (p->moveState & MOVESTATE_IN_AIR) {
|
||||
p->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
p->transition = PLTRANS_PT5;
|
||||
p->transition = PLTRANS_UNCURL;
|
||||
} else {
|
||||
p->variant++;
|
||||
p->unk6C = TRUE;
|
||||
@@ -1124,7 +1124,7 @@ void Player_Knuckles_PunchRight(Player *p)
|
||||
if (p->spriteInfoBody->s.frameFlags & SPRITE_FLAG_MASK_ANIM_OVER) {
|
||||
if (p->moveState & MOVESTATE_IN_AIR) {
|
||||
p->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
p->transition = PLTRANS_PT5;
|
||||
p->transition = PLTRANS_UNCURL;
|
||||
} else {
|
||||
p->transition = PLTRANS_TOUCH_GROUND;
|
||||
}
|
||||
@@ -1157,7 +1157,7 @@ void Player_Knuckles_InitSpiralAttack(Player *p)
|
||||
void Player_Knuckles_SpiralAttack(Player *p)
|
||||
{
|
||||
s32 speed = p->speedGroundX;
|
||||
s32 addend = p->unk4C >> 1;
|
||||
s32 addend = p->deceleration >> 1;
|
||||
if (speed > 0) {
|
||||
if ((speed -= addend) < 0)
|
||||
speed = 0;
|
||||
@@ -1356,7 +1356,7 @@ void Player_Knuckles_Glide_MainUpdate(Player *p)
|
||||
p->spriteOffsetY = 14;
|
||||
p->w.kf.flags |= MOVESTATE_IN_AIR;
|
||||
} else {
|
||||
if (!(p->heldInput & gPlayerControls.jump) || (p->moveState & MOVESTATE_40)) {
|
||||
if (!(p->heldInput & gPlayerControls.jump) || (p->moveState & MOVESTATE_IN_WATER)) {
|
||||
PLAYERFN_SET(Player_Knuckles_FallAfterGlide);
|
||||
p->charState = CHARSTATE_KNUCKLES_GLIDE_FALL;
|
||||
|
||||
@@ -1430,7 +1430,7 @@ void Player_Knuckles_GlideHardLandingUpdateAnim(Player *p)
|
||||
|
||||
p->qWorldY += Q(res);
|
||||
p->rotation = rot;
|
||||
} else if (!(p->moveState & MOVESTATE_8)) {
|
||||
} else if (!(p->moveState & MOVESTATE_STOOD_ON_OBJ)) {
|
||||
PLAYERFN_SET(Player_Knuckles_FallAfterGlide);
|
||||
|
||||
PLAYERFN_CHANGE_SHIFT_OFFSETS(p, 6, 14);
|
||||
@@ -1528,7 +1528,7 @@ void Player_Knuckles_Climb_80136E8(Player *p)
|
||||
s32 r2;
|
||||
|
||||
if (p->w.tf.unkAE >= 0) {
|
||||
if (p->moveState & MOVESTATE_8) {
|
||||
if (p->moveState & MOVESTATE_STOOD_ON_OBJ) {
|
||||
sub_8013CA0(p);
|
||||
return;
|
||||
}
|
||||
@@ -1639,7 +1639,7 @@ void Player_Knuckles_Climb_80136E8(Player *p)
|
||||
} else {
|
||||
p->charState = CHARSTATE_KNUCKLES_CLIMB_C;
|
||||
speed = Q(0.75);
|
||||
if (p->moveState & MOVESTATE_40) {
|
||||
if (p->moveState & MOVESTATE_IN_WATER) {
|
||||
speed = Q(0.5);
|
||||
}
|
||||
p->speedAirY = speed;
|
||||
@@ -1715,7 +1715,7 @@ NONMATCH("asm/non_matching/game/player__sub_80139B0.inc", void Knuckles_Glide_Up
|
||||
speedGrnd += Q(3.0 / 256.0);
|
||||
}
|
||||
|
||||
if (p->moveState & MOVESTATE_40) {
|
||||
if (p->moveState & MOVESTATE_IN_WATER) {
|
||||
if ((speedGrnd > Q(3.0)) && (speedGrnd -= Q(9.0 / 256.0)) < Q(3.0))
|
||||
speedGrnd = Q(3.0);
|
||||
}
|
||||
@@ -1779,7 +1779,7 @@ void Player_Knuckles_InitGlide(Player *p)
|
||||
|
||||
p->speedGroundX = Q(3.0);
|
||||
|
||||
if (p->moveState & MOVESTATE_40)
|
||||
if (p->moveState & MOVESTATE_IN_WATER)
|
||||
p->speedGroundX /= 2;
|
||||
|
||||
if (p->moveState & MOVESTATE_FACING_LEFT) {
|
||||
@@ -1810,7 +1810,7 @@ void Player_8013B6C(Player *p)
|
||||
if ((p->spriteInfoBody->s.frameFlags) & SPRITE_FLAG_MASK_ANIM_OVER) {
|
||||
if (p->moveState & MOVESTATE_IN_AIR) {
|
||||
p->charState = CHARSTATE_CURLED_IN_AIR;
|
||||
p->transition = PLTRANS_PT5;
|
||||
p->transition = PLTRANS_UNCURL;
|
||||
} else {
|
||||
p->transition = PLTRANS_TOUCH_GROUND;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#include "game/cheese.h"
|
||||
#include "game/entity.h"
|
||||
#include "game/multiplayer/player_unk_1.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
#include "game/stage/rings_scatter.h"
|
||||
#include "game/stage/trapped_animals.h"
|
||||
|
||||
@@ -46,8 +46,8 @@ u32 sub_800C060(Sprite *s, s32 sx, s32 sy, Player *p)
|
||||
return result;
|
||||
}
|
||||
|
||||
if ((p->moveState & MOVESTATE_8) && (p->unk3C == s)) {
|
||||
p->moveState &= ~MOVESTATE_8;
|
||||
if ((p->moveState & MOVESTATE_STOOD_ON_OBJ) && (p->stoodObj == s)) {
|
||||
p->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
ip = TRUE;
|
||||
}
|
||||
|
||||
@@ -61,14 +61,14 @@ u32 sub_800C060(Sprite *s, s32 sx, s32 sy, Player *p)
|
||||
|
||||
rectPlayer[1] = -p->spriteOffsetY;
|
||||
rectPlayer[3] = +p->spriteOffsetY;
|
||||
p->moveState |= MOVESTATE_8;
|
||||
p->moveState |= MOVESTATE_STOOD_ON_OBJ;
|
||||
result |= COLL_FLAG_8;
|
||||
|
||||
if (!ip) {
|
||||
p->rotation = 0;
|
||||
}
|
||||
|
||||
p->unk3C = s;
|
||||
p->stoodObj = s;
|
||||
p->speedAirY = 0;
|
||||
|
||||
if (GRAVITY_IS_INVERTED) {
|
||||
@@ -82,7 +82,7 @@ u32 sub_800C060(Sprite *s, s32 sx, s32 sy, Player *p)
|
||||
}
|
||||
y = Q(y);
|
||||
p->qWorldY = Q_24_8_FRAC(p->qWorldY) + (y);
|
||||
} else if (ip && !(p->moveState & MOVESTATE_8)) {
|
||||
} else if (ip && !(p->moveState & MOVESTATE_STOOD_ON_OBJ)) {
|
||||
p->moveState &= ~MOVESTATE_20;
|
||||
p->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
@@ -192,11 +192,11 @@ bool32 sub_800C4FC(Sprite *s, s32 sx, s32 sy, u8 hbIndex)
|
||||
if (HITBOX_IS_ACTIVE(sprPlayer->hitboxes[1])) {
|
||||
if (HB_COLLISION(sx, sy, s->hitboxes[hbIndex], I(player->qWorldX), I(player->qWorldY), sprPlayer->hitboxes[1])) {
|
||||
if (IS_MULTI_PLAYER) {
|
||||
struct UNK_3005510 *v = sub_8019224();
|
||||
v->unk0 = 3;
|
||||
v->unk1 = eb->base.regionX;
|
||||
v->unk2 = eb->base.regionY;
|
||||
v->unk3 = eb->base.id;
|
||||
RoomEvent_EnemyDestroy *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_ENEMY_DESTROYED;
|
||||
roomEvent->x = eb->base.regionX;
|
||||
roomEvent->y = eb->base.regionY;
|
||||
roomEvent->id = eb->base.id;
|
||||
}
|
||||
|
||||
Collision_AdjustPlayerSpeed(player);
|
||||
@@ -215,11 +215,11 @@ bool32 sub_800C4FC(Sprite *s, s32 sx, s32 sy, u8 hbIndex)
|
||||
sub_800CBA4(player);
|
||||
} else {
|
||||
if (IS_MULTI_PLAYER) {
|
||||
struct UNK_3005510 *v = sub_8019224();
|
||||
v->unk0 = 3;
|
||||
v->unk1 = eb->base.regionX;
|
||||
v->unk2 = eb->base.regionY;
|
||||
v->unk3 = eb->base.id;
|
||||
RoomEvent_EnemyDestroy *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_ENEMY_DESTROYED;
|
||||
roomEvent->x = eb->base.regionX;
|
||||
roomEvent->y = eb->base.regionY;
|
||||
roomEvent->id = eb->base.id;
|
||||
}
|
||||
|
||||
CreateDustCloud(sx, sy);
|
||||
@@ -236,11 +236,11 @@ bool32 sub_800C4FC(Sprite *s, s32 sx, s32 sy, u8 hbIndex)
|
||||
if (cheese->s.hitboxes[1].index != -1
|
||||
&& ((HB_COLLISION(sx, sy, s->hitboxes[hbIndex], I(cheese->posX), I(cheese->posY), cheese->s.hitboxes[1])))) {
|
||||
if (IS_MULTI_PLAYER) {
|
||||
struct UNK_3005510 *v = sub_8019224();
|
||||
v->unk0 = 3;
|
||||
v->unk1 = eb->base.regionX;
|
||||
v->unk2 = eb->base.regionY;
|
||||
v->unk3 = eb->base.id;
|
||||
RoomEvent_EnemyDestroy *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_ENEMY_DESTROYED;
|
||||
roomEvent->x = eb->base.regionX;
|
||||
roomEvent->y = eb->base.regionY;
|
||||
roomEvent->id = eb->base.id;
|
||||
}
|
||||
|
||||
CreateDustCloud(sx, sy);
|
||||
@@ -319,7 +319,7 @@ void Collision_AdjustPlayerSpeed(Player *p)
|
||||
if (p->moveState & MOVESTATE_BOOST_EFFECT_ON) {
|
||||
// Also triggered on homing-attack.
|
||||
// Slight boost upwards for the player.
|
||||
p->transition = PLTRANS_PT8;
|
||||
p->transition = PLTRANS_HOMING_ATTACK_RECOIL;
|
||||
p->speedAirX = 0;
|
||||
p->speedAirY = 0;
|
||||
} else if (IS_BOSS_STAGE(gCurrentLevel)) {
|
||||
@@ -362,7 +362,7 @@ bool32 sub_800CBA4(Player *p)
|
||||
}
|
||||
|
||||
if (!(p->moveState & MOVESTATE_1000000)) {
|
||||
p->transition = PLTRANS_PT9;
|
||||
p->transition = PLTRANS_HURT;
|
||||
}
|
||||
|
||||
p->itemEffect &= ~PLAYER_ITEM_EFFECT__TELEPORT;
|
||||
@@ -386,9 +386,9 @@ bool32 sub_800CBA4(Player *p)
|
||||
InitScatteringRings(I(p->qWorldX), I(p->qWorldY), rings);
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
struct UNK_3005510 *unk = sub_8019224();
|
||||
unk->unk0 = 4;
|
||||
unk->unk1 = rings;
|
||||
RoomEvent_RingLoss *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_PLAYER_RING_LOSS;
|
||||
roomEvent->ringCount = rings;
|
||||
}
|
||||
|
||||
gRingCount -= rings;
|
||||
@@ -422,29 +422,29 @@ u32 sub_800CCB8(Sprite *s, s32 sx, s32 sy, Player *p)
|
||||
return COLL_NONE;
|
||||
}
|
||||
|
||||
if ((p->moveState & MOVESTATE_8) && (p->unk3C == s)) {
|
||||
if ((p->moveState & MOVESTATE_STOOD_ON_OBJ) && (p->stoodObj == s)) {
|
||||
r4 = COLL_FLAG_1;
|
||||
p->moveState &= ~MOVESTATE_8;
|
||||
p->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
p->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
|
||||
mask = sub_800CE94(s, sx, sy, (struct Rect8 *)rectPlayer, p);
|
||||
|
||||
if (mask) {
|
||||
if (mask & 0x10000) {
|
||||
p->moveState |= MOVESTATE_8;
|
||||
if (mask & COLL_FLAG_10000) {
|
||||
p->moveState |= MOVESTATE_STOOD_ON_OBJ;
|
||||
p->moveState &= ~MOVESTATE_IN_AIR;
|
||||
p->unk3C = s;
|
||||
p->stoodObj = s;
|
||||
|
||||
if (r4 == 0 && s == NULL) {
|
||||
p->speedGroundX = p->speedAirX;
|
||||
}
|
||||
}
|
||||
} else if (r4) {
|
||||
if (!(p->moveState & MOVESTATE_8)) {
|
||||
if (!(p->moveState & MOVESTATE_STOOD_ON_OBJ)) {
|
||||
p->moveState &= ~MOVESTATE_20;
|
||||
p->moveState |= MOVESTATE_IN_AIR;
|
||||
p->unk3C = NULL;
|
||||
p->stoodObj = NULL;
|
||||
|
||||
if (IS_BOSS_STAGE(gCurrentLevel)) {
|
||||
p->speedGroundX -= Q(gCamera.dx);
|
||||
@@ -472,18 +472,18 @@ u32 sub_800CDBC(Sprite *s, s32 sx, s32 sy, Player *p)
|
||||
return COLL_NONE;
|
||||
}
|
||||
|
||||
if ((p->moveState & MOVESTATE_8) && (p->unk3C == s)) {
|
||||
if ((p->moveState & MOVESTATE_STOOD_ON_OBJ) && (p->stoodObj == s)) {
|
||||
r4 = COLL_FLAG_1;
|
||||
p->moveState &= ~MOVESTATE_8;
|
||||
p->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
}
|
||||
|
||||
mask = sub_800CE94(s, sx, sy, (struct Rect8 *)rectPlayer, p);
|
||||
|
||||
if (mask & 0x10000) {
|
||||
p->moveState |= MOVESTATE_8;
|
||||
p->unk3C = s;
|
||||
if (mask & COLL_FLAG_10000) {
|
||||
p->moveState |= MOVESTATE_STOOD_ON_OBJ;
|
||||
p->stoodObj = s;
|
||||
} else if (r4) {
|
||||
p->unk3C = NULL;
|
||||
p->stoodObj = NULL;
|
||||
|
||||
if (IS_BOSS_STAGE(gCurrentLevel)) {
|
||||
p->speedGroundX -= Q(gCamera.dx);
|
||||
@@ -657,15 +657,15 @@ bool32 sub_800DD54(Player *p)
|
||||
|
||||
p->speedAirY = -Q(3.0);
|
||||
|
||||
if (p->moveState & MOVESTATE_40) {
|
||||
if (p->moveState & MOVESTATE_IN_WATER) {
|
||||
HALVE(p->speedAirY);
|
||||
HALVE(p->speedAirX);
|
||||
}
|
||||
|
||||
p->moveState &= ~MOVESTATE_8;
|
||||
p->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
p->moveState &= ~MOVESTATE_20;
|
||||
p->moveState &= ~MOVESTATE_4;
|
||||
p->moveState &= ~MOVESTATE_10;
|
||||
p->moveState &= ~MOVESTATE_FLIP_WITH_MOVE_DIR;
|
||||
p->moveState |= MOVESTATE_IN_AIR;
|
||||
p->moveState &= ~MOVESTATE_400;
|
||||
p->moveState &= ~MOVESTATE_100;
|
||||
@@ -679,7 +679,7 @@ bool32 sub_800DD54(Player *p)
|
||||
p->transition = 9;
|
||||
|
||||
if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) {
|
||||
struct UNK_3005510 *unk;
|
||||
RoomEvent_RingLoss *roomEvent;
|
||||
#ifndef NON_MATCHING
|
||||
register u32 rings asm("r4") = gRingCount;
|
||||
#else
|
||||
@@ -693,9 +693,9 @@ bool32 sub_800DD54(Player *p)
|
||||
InitScatteringRings(I(p->qWorldX), I(p->qWorldY), rings);
|
||||
gRingCount -= rings;
|
||||
|
||||
unk = sub_8019224();
|
||||
unk->unk0 = 4;
|
||||
unk->unk1 = rings;
|
||||
roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_PLAYER_RING_LOSS;
|
||||
roomEvent->ringCount = rings;
|
||||
}
|
||||
|
||||
m4aSongNumStart(SE_LIFE_LOST);
|
||||
@@ -719,15 +719,15 @@ bool32 sub_800DE44(Player *p)
|
||||
|
||||
p->speedAirY = -Q(3.0);
|
||||
|
||||
if (p->moveState & MOVESTATE_40) {
|
||||
if (p->moveState & MOVESTATE_IN_WATER) {
|
||||
HALVE(p->speedAirY);
|
||||
HALVE(p->speedAirX);
|
||||
}
|
||||
|
||||
p->moveState &= ~MOVESTATE_8;
|
||||
p->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
p->moveState &= ~MOVESTATE_20;
|
||||
p->moveState &= ~MOVESTATE_4;
|
||||
p->moveState &= ~MOVESTATE_10;
|
||||
p->moveState &= ~MOVESTATE_FLIP_WITH_MOVE_DIR;
|
||||
p->moveState |= MOVESTATE_IN_AIR;
|
||||
p->moveState &= ~MOVESTATE_400;
|
||||
p->moveState &= ~MOVESTATE_100;
|
||||
@@ -741,7 +741,7 @@ bool32 sub_800DE44(Player *p)
|
||||
p->transition = 9;
|
||||
|
||||
if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) {
|
||||
struct UNK_3005510 *unk;
|
||||
RoomEvent_RingLoss *roomEvent;
|
||||
#ifndef NON_MATCHING
|
||||
register u32 rings asm("r4") = gRingCount;
|
||||
#else
|
||||
@@ -755,9 +755,9 @@ bool32 sub_800DE44(Player *p)
|
||||
InitScatteringRings(I(p->qWorldX), I(p->qWorldY), rings);
|
||||
gRingCount -= rings;
|
||||
|
||||
unk = sub_8019224();
|
||||
unk->unk0 = 4;
|
||||
unk->unk1 = rings;
|
||||
roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_PLAYER_RING_LOSS;
|
||||
roomEvent->ringCount = rings;
|
||||
}
|
||||
|
||||
m4aSongNumStart(SE_LIFE_LOST);
|
||||
|
||||
@@ -262,7 +262,7 @@ const RLCompressed *const gSpritePosData_enemies[] = {
|
||||
const MapEntityInit gSpriteInits_Interactables[] = {
|
||||
CreateEntity_Toggle_PlayerLayer,
|
||||
CreateEntity_Toggle_PlayerLayer,
|
||||
CreateEntity_Platform_A,
|
||||
CreateEntity_Platform,
|
||||
CreateEntity_Spring_Normal_Up,
|
||||
CreateEntity_Spring_Normal_Down,
|
||||
CreateEntity_Spring_Normal_Right,
|
||||
@@ -339,7 +339,7 @@ const MapEntityInit gSpriteInits_Interactables[] = {
|
||||
CreateEntity_ArrowPlatform_Right,
|
||||
CreateEntity_ArrowPlatform_Up,
|
||||
CreateEntity_SpikePlatform,
|
||||
CreateEntity_Platform_B,
|
||||
CreateEntity_FallingPlatform,
|
||||
CreateEntity_LightGlobe,
|
||||
CreateEntity_Platform_Square,
|
||||
CreateEntity_Propeller,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "global.h"
|
||||
#include "core.h"
|
||||
#include "game/sa1_sa2_shared/globals.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
|
||||
u8 gUnknown_030053E0 = 0;
|
||||
u32 gCheckpointTime = 0;
|
||||
@@ -16,7 +17,7 @@ u8 ALIGNED(4) unused53F4[24] = {};
|
||||
u8 gActiveCollectRingEffectCount = 0;
|
||||
|
||||
u32 gMultiplayerIds[MULTI_SIO_PLAYERS_MAX] = {};
|
||||
u8 gUnknown_03005420 = 0;
|
||||
u8 gRoomEventQueueSendPos = 0;
|
||||
u16 ALIGNED(4) gStageFlags = 0;
|
||||
u8 ALIGNED(4) gUnknown_03005428[MULTI_SIO_PLAYERS_MAX] = {};
|
||||
|
||||
@@ -24,7 +25,7 @@ u8 gBossRingsRespawnCount = 0;
|
||||
bool8 ALIGNED(4) gBossRingsShallRespawn = FALSE;
|
||||
|
||||
u32 gMultiplayerPseudoRandom = 0;
|
||||
u8 gUnknown_03005438 = 0;
|
||||
u8 gRoomEventQueueWritePos = 0;
|
||||
u8 ALIGNED(4) gUnknown_0300543C = 0;
|
||||
u16 ALIGNED(4) gBossCameraClampYLower = 0;
|
||||
s8 ALIGNED(4) gTrappedAnimalVariant = 0;
|
||||
@@ -66,7 +67,7 @@ u8 ALIGNED(4) gUnknown_030054F8 = 0;
|
||||
s32 gUnknown_030054FC = 0;
|
||||
|
||||
s8 gMultiplayerCharacters[4] = {};
|
||||
struct UNK_3005510 ALIGNED(16) gUnknown_03005510[16] = {};
|
||||
RoomEvent ALIGNED(16) gRoomEventQueue[16] = {};
|
||||
u32 gStageTime = 0;
|
||||
|
||||
u8 ALIGNED(4) gMultiplayerUnlockedCharacters = 0;
|
||||
|
||||
@@ -53,7 +53,7 @@ static void Task_Pipe_Start(void)
|
||||
&& (screenY <= I(gPlayer.qWorldY)) && ((screenY + 24) >= I(gPlayer.qWorldY)) && (!(gPlayer.moveState & MOVESTATE_80000))) {
|
||||
u8 flag;
|
||||
|
||||
gPlayer.transition = PLTRANS_PIPE_A;
|
||||
gPlayer.transition = PLTRANS_PIPE_ENTRY;
|
||||
|
||||
flag = (me->unk3 & 0x03) << 4;
|
||||
flag |= me->unk4 & 0x0F;
|
||||
@@ -64,7 +64,7 @@ static void Task_Pipe_Start(void)
|
||||
|
||||
Player_SetMovestate_IsInScriptedSequence();
|
||||
|
||||
gPlayer.itemEffect &= ~PLAYER_ITEM_EFFECT__10;
|
||||
gPlayer.itemEffect &= ~PLAYER_ITEM_EFFECT__MP_SLOW_DOWN;
|
||||
gPlayer.timerSpeedup = 0;
|
||||
|
||||
m4aMPlayTempoControl(&gMPlayInfo_BGM, 0x100);
|
||||
@@ -105,9 +105,9 @@ static void Task_Pipe_End(void)
|
||||
gPlayer.layer = PLAYER_LAYER__BACK;
|
||||
}
|
||||
|
||||
gPlayer.transition = PLTRANS_PIPE_B;
|
||||
gPlayer.transition = PLTRANS_PIPE_EXIT;
|
||||
if (me->unk4 != 0) {
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
}
|
||||
|
||||
Player_ClearMovestate_IsInScriptedSequence();
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include "game/stage/player.h"
|
||||
#include "game/stage/camera.h"
|
||||
#include "game/entity.h"
|
||||
#include "game/multiplayer/player_unk_1.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
|
||||
#include "constants/animations.h"
|
||||
#include "constants/interactables.h"
|
||||
@@ -19,22 +19,22 @@
|
||||
typedef struct {
|
||||
/* 0x00 */ SpriteBase base;
|
||||
/* 0x0C */ Sprite s;
|
||||
/* 0x3C */ u16 unk3C;
|
||||
/* 0x40 */ s32 unk40;
|
||||
/* 0x44 */ s32 unk44;
|
||||
/* 0x48 */ s16 unk48;
|
||||
/* 0x4A */ s16 unk4A;
|
||||
/* 0x4C */ u16 unk4C;
|
||||
/* 0x50 */ s32 unk50[2];
|
||||
/* 0x3C */ u16 timer;
|
||||
/* 0x40 */ s32 offsetX;
|
||||
/* 0x44 */ s32 offsetY;
|
||||
/* 0x48 */ s16 velocityX;
|
||||
/* 0x4A */ s16 velocityY;
|
||||
/* 0x4C */ u16 stoodOffset;
|
||||
/* 0x50 */ s32 prevOffsetY[2];
|
||||
} Sprite_Platform; /* size: 0x58 */
|
||||
|
||||
static void Task_800E89C(void);
|
||||
static void Task_800EC58(void);
|
||||
static void TaskDestructor_800F19C(struct Task *);
|
||||
static void Task_PlatformMain(void);
|
||||
static void Task_FallingPlatformMain_Idle(void);
|
||||
static void TaskDestructor_Platform(struct Task *);
|
||||
|
||||
void Task_800EDF8(void);
|
||||
void Task_800EFD0(void);
|
||||
void sub_800F1B0(Sprite_Platform *);
|
||||
void Task_FallingPlatformMain_FallDelay(void);
|
||||
void Task_FallingPlatformMain_Falling(void);
|
||||
void HandlePlatformOffsetYStorage(Sprite_Platform *);
|
||||
|
||||
const AnimId sPlatformLevelAnims[38] = {
|
||||
[LEVEL_INDEX(ZONE_1, ACT_1)] = SA2_ANIM_PLATFORM_LEA_FOR,
|
||||
@@ -86,9 +86,9 @@ const AnimId sPlatformLevelAnims[38] = {
|
||||
[LEVEL_INDEX(9, ACT_2)] = SA2_ANIM_PLATFORM_LEA_FOR,
|
||||
};
|
||||
|
||||
void CreateEntity_Platform_A(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
void CreateEntity_Platform(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
struct Task *t = TaskCreate(Task_800E89C, sizeof(Sprite_Platform), 0x2010, 0, TaskDestructor_800F19C);
|
||||
struct Task *t = TaskCreate(Task_PlatformMain, sizeof(Sprite_Platform), 0x2010, 0, TaskDestructor_Platform);
|
||||
Sprite_Platform *platform = TASK_DATA(t);
|
||||
Sprite *s = &platform->s;
|
||||
|
||||
@@ -97,29 +97,29 @@ void CreateEntity_Platform_A(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY
|
||||
platform->base.me = me;
|
||||
platform->base.spriteX = me->x;
|
||||
platform->base.id = spriteY;
|
||||
platform->unk40 = 0;
|
||||
platform->unk44 = 0;
|
||||
platform->unk4C = 0;
|
||||
platform->offsetX = 0;
|
||||
platform->offsetY = 0;
|
||||
platform->stoodOffset = 0;
|
||||
|
||||
if (me->d.uData[2] > me->d.uData[3]) {
|
||||
if (me->d.sData[0] >= 0) {
|
||||
platform->unk48 = 0x4;
|
||||
platform->unk3C = 0;
|
||||
platform->unk4A = 0;
|
||||
platform->velocityX = 0x4;
|
||||
platform->timer = 0;
|
||||
platform->velocityY = 0;
|
||||
} else {
|
||||
platform->unk48 = 0x4;
|
||||
platform->unk3C = 0x80;
|
||||
platform->unk4A = 0;
|
||||
platform->velocityX = 0x4;
|
||||
platform->timer = 0x80;
|
||||
platform->velocityY = 0;
|
||||
}
|
||||
} else {
|
||||
if (me->d.sData[1] >= 0) {
|
||||
platform->unk48 = 0;
|
||||
platform->unk4A = 0x4;
|
||||
platform->unk3C = 0;
|
||||
platform->velocityX = 0;
|
||||
platform->velocityY = 0x4;
|
||||
platform->timer = 0;
|
||||
} else {
|
||||
platform->unk48 = 0;
|
||||
platform->unk4A = 0x4;
|
||||
platform->unk3C = 0x80;
|
||||
platform->velocityX = 0;
|
||||
platform->velocityY = 0x4;
|
||||
platform->timer = 0x80;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ void CreateEntity_Platform_A(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY
|
||||
}
|
||||
}
|
||||
|
||||
void Task_800E89C(void)
|
||||
void Task_PlatformMain(void)
|
||||
{
|
||||
Player *p = &gPlayer;
|
||||
s16 posX;
|
||||
@@ -159,31 +159,31 @@ void Task_800E89C(void)
|
||||
Sprite *s = &platform->s;
|
||||
me = platform->base.me;
|
||||
|
||||
if (platform->unk48 != 0) {
|
||||
if (platform->velocityX != 0) {
|
||||
#ifdef NON_MATCHING
|
||||
s32 r5 = platform->unk40;
|
||||
s32 r5 = platform->offsetX;
|
||||
#else
|
||||
register s32 r5 asm("r5") = platform->unk40;
|
||||
register s32 r5 asm("r5") = platform->offsetX;
|
||||
#endif
|
||||
s32 meUdata2 = (me->d.uData[2] << 11);
|
||||
|
||||
platform->unk40 = (SIN((platform->unk48 * ((gStageTime + platform->unk3C) & 0xFF)) & ONE_CYCLE) * meUdata2) >> 14;
|
||||
r5 = platform->unk40 - r5;
|
||||
platform->offsetX = (SIN((platform->velocityX * ((gStageTime + platform->timer) & 0xFF)) & ONE_CYCLE) * meUdata2) >> 14;
|
||||
r5 = platform->offsetX - r5;
|
||||
#ifndef NON_MATCHING
|
||||
asm("" ::"r"(r5));
|
||||
#endif
|
||||
deltaX = r5;
|
||||
}
|
||||
|
||||
if (platform->unk4A != 0) {
|
||||
if (platform->velocityY != 0) {
|
||||
#ifdef NON_MATCHING
|
||||
s32 r5 = platform->unk44;
|
||||
s32 r5 = platform->offsetY;
|
||||
#else
|
||||
register s32 r5 asm("r5") = platform->unk44;
|
||||
register s32 r5 asm("r5") = platform->offsetY;
|
||||
#endif
|
||||
s32 meUdata3 = (me->d.uData[3] << 11);
|
||||
platform->unk44 = (SIN(((platform->unk4A * ((gStageTime + platform->unk3C) & 0xFF))) & ONE_CYCLE) * meUdata3) >> 14;
|
||||
r5 = platform->unk44 - r5;
|
||||
platform->offsetY = (SIN(((platform->velocityY * ((gStageTime + platform->timer) & 0xFF))) & ONE_CYCLE) * meUdata3) >> 14;
|
||||
r5 = platform->offsetY - r5;
|
||||
#ifndef NON_MATCHING
|
||||
asm("" ::"r"(r5));
|
||||
#endif
|
||||
@@ -193,10 +193,10 @@ void Task_800E89C(void)
|
||||
posX = TO_WORLD_POS(platform->base.spriteX, platform->base.regionX);
|
||||
posY = TO_WORLD_POS(me->y, platform->base.regionY);
|
||||
|
||||
s->x = posX - gCamera.x + I(platform->unk40);
|
||||
s->y = posY - gCamera.y + I(platform->unk44);
|
||||
s->x = posX - gCamera.x + I(platform->offsetX);
|
||||
s->y = posY - gCamera.y + I(platform->offsetY);
|
||||
|
||||
if ((p->moveState & MOVESTATE_8) && (p->unk3C == s)) {
|
||||
if ((p->moveState & MOVESTATE_STOOD_ON_OBJ) && (p->stoodObj == s)) {
|
||||
p->qWorldX += deltaX;
|
||||
|
||||
if (!GRAVITY_IS_INVERTED) {
|
||||
@@ -207,12 +207,12 @@ void Task_800E89C(void)
|
||||
}
|
||||
|
||||
if (!(p->moveState & MOVESTATE_400000)) {
|
||||
s32 x = (posX + I(platform->unk40));
|
||||
s32 y = (posY + I(platform->unk44));
|
||||
s32 x = (posX + I(platform->offsetX));
|
||||
s32 y = (posY + I(platform->offsetY));
|
||||
|
||||
result = sub_800CCB8(s, x, y, p);
|
||||
|
||||
if (result & 0x10000) {
|
||||
if (result & COLL_FLAG_10000) {
|
||||
p->qWorldY += Q_8_8(result);
|
||||
}
|
||||
}
|
||||
@@ -222,20 +222,20 @@ void Task_800E89C(void)
|
||||
TaskDestroy(gCurTask);
|
||||
} else {
|
||||
if (!(gPlayer.moveState & MOVESTATE_400000)) {
|
||||
if ((gPlayer.moveState & MOVESTATE_8) && (gPlayer.unk3C == s)) {
|
||||
if (platform->unk4C != 0x100) {
|
||||
platform->unk4C += 0x10;
|
||||
if ((gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ) && (gPlayer.stoodObj == s)) {
|
||||
if (platform->stoodOffset != 0x100) {
|
||||
platform->stoodOffset += 0x10;
|
||||
}
|
||||
} else {
|
||||
if (platform->unk4C != 0) {
|
||||
platform->unk4C -= 0x10;
|
||||
if (platform->stoodOffset != 0) {
|
||||
platform->stoodOffset -= 0x10;
|
||||
}
|
||||
}
|
||||
|
||||
if (!GRAVITY_IS_INVERTED) {
|
||||
s->y += SIN_24_8(platform->unk4C) >> 6;
|
||||
s->y += SIN_24_8(platform->stoodOffset) >> 6;
|
||||
} else {
|
||||
s->y -= SIN_24_8(platform->unk4C) >> 6;
|
||||
s->y -= SIN_24_8(platform->stoodOffset) >> 6;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -244,9 +244,9 @@ void Task_800E89C(void)
|
||||
}
|
||||
}
|
||||
|
||||
void CreateEntity_Platform_B(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
void CreateEntity_FallingPlatform(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
struct Task *t = TaskCreate(Task_800EC58, sizeof(Sprite_Platform), 0x2010, 0, TaskDestructor_800F19C);
|
||||
struct Task *t = TaskCreate(Task_FallingPlatformMain_Idle, sizeof(Sprite_Platform), 0x2010, 0, TaskDestructor_Platform);
|
||||
Sprite_Platform *platform = TASK_DATA(t);
|
||||
Sprite *s = &platform->s;
|
||||
|
||||
@@ -255,18 +255,18 @@ void CreateEntity_Platform_B(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY
|
||||
platform->base.me = me;
|
||||
platform->base.spriteX = me->x;
|
||||
platform->base.id = spriteY;
|
||||
platform->unk40 = 0;
|
||||
platform->unk44 = 0;
|
||||
platform->unk4C = 0;
|
||||
platform->offsetX = 0;
|
||||
platform->offsetY = 0;
|
||||
platform->stoodOffset = 0;
|
||||
|
||||
platform->unk48 = 0;
|
||||
platform->unk4A = 0;
|
||||
platform->velocityX = 0;
|
||||
platform->velocityY = 0;
|
||||
|
||||
s->x = TO_WORLD_POS(me->x, spriteRegionX);
|
||||
s->y = TO_WORLD_POS(me->y, spriteRegionY);
|
||||
|
||||
platform->unk50[0] = platform->unk44;
|
||||
platform->unk50[1] = platform->unk44;
|
||||
platform->prevOffsetY[0] = platform->offsetY;
|
||||
platform->prevOffsetY[1] = platform->offsetY;
|
||||
|
||||
SET_MAP_ENTITY_INITIALIZED(me);
|
||||
|
||||
@@ -292,7 +292,7 @@ void CreateEntity_Platform_B(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY
|
||||
UpdateSpriteAnimation(s);
|
||||
}
|
||||
|
||||
void Task_800EC58(void)
|
||||
void Task_FallingPlatformMain_Idle(void)
|
||||
{
|
||||
Player *p;
|
||||
s16 posX;
|
||||
@@ -305,7 +305,7 @@ void Task_800EC58(void)
|
||||
me = platform->base.me;
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
sub_800F1B0(platform);
|
||||
HandlePlatformOffsetYStorage(platform);
|
||||
}
|
||||
|
||||
posX = TO_WORLD_POS(platform->base.spriteX, platform->base.regionX);
|
||||
@@ -317,15 +317,15 @@ void Task_800EC58(void)
|
||||
p = &gPlayer;
|
||||
result = sub_800CCB8(s, posX, posY, p);
|
||||
|
||||
if (result & 0x10000) {
|
||||
if (result & COLL_FLAG_10000) {
|
||||
p->qWorldY += Q_8_8(result);
|
||||
gCurTask->main = Task_800EDF8;
|
||||
platform->unk3C = 30;
|
||||
gCurTask->main = Task_FallingPlatformMain_FallDelay;
|
||||
platform->timer = 30;
|
||||
}
|
||||
|
||||
if ((IS_MULTI_PLAYER) && ((s8)me->x == -3)) {
|
||||
platform->unk3C = 0;
|
||||
gCurTask->main = Task_800EFD0;
|
||||
platform->timer = 0;
|
||||
gCurTask->main = Task_FallingPlatformMain_Falling;
|
||||
}
|
||||
|
||||
if (((posX > gCamera.x + (DISPLAY_WIDTH + 128)) || (posX < (gCamera.x - 128)) || (posY > (gCamera.y + (DISPLAY_HEIGHT + 128)))
|
||||
@@ -334,24 +334,24 @@ void Task_800EC58(void)
|
||||
SET_MAP_ENTITY_NOT_INITIALIZED(me, platform->base.spriteX);
|
||||
TaskDestroy(gCurTask);
|
||||
} else {
|
||||
if ((gPlayer.moveState & MOVESTATE_8) && (gPlayer.unk3C == s)) {
|
||||
if (platform->unk4C != 0x100) {
|
||||
platform->unk4C += 0x10;
|
||||
if ((gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ) && (gPlayer.stoodObj == s)) {
|
||||
if (platform->stoodOffset != 0x100) {
|
||||
platform->stoodOffset += 0x10;
|
||||
}
|
||||
} else {
|
||||
if (platform->unk4C != 0) {
|
||||
platform->unk4C -= 0x10;
|
||||
if (platform->stoodOffset != 0) {
|
||||
platform->stoodOffset -= 0x10;
|
||||
}
|
||||
}
|
||||
|
||||
s->y += SIN_24_8(platform->unk4C) >> 6;
|
||||
s->y += SIN_24_8(platform->stoodOffset) >> 6;
|
||||
|
||||
UpdateSpriteAnimation(s);
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
|
||||
void Task_800EDF8(void)
|
||||
void Task_FallingPlatformMain_FallDelay(void)
|
||||
{
|
||||
Player *p;
|
||||
s16 posX;
|
||||
@@ -364,7 +364,7 @@ void Task_800EDF8(void)
|
||||
me = platform->base.me;
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
sub_800F1B0(platform);
|
||||
HandlePlatformOffsetYStorage(platform);
|
||||
}
|
||||
|
||||
posX = TO_WORLD_POS(platform->base.spriteX, platform->base.regionX);
|
||||
@@ -381,22 +381,22 @@ void Task_800EDF8(void)
|
||||
}
|
||||
|
||||
if ((IS_MULTI_PLAYER) && ((s8)me->x == -3)) {
|
||||
platform->unk3C = 0;
|
||||
gCurTask->main = Task_800EFD0;
|
||||
platform->timer = 0;
|
||||
gCurTask->main = Task_FallingPlatformMain_Falling;
|
||||
} else {
|
||||
if (--platform->unk3C == 0) {
|
||||
if (--platform->timer == 0) {
|
||||
// NOTE: This must have been a macro
|
||||
platform->unk3C = 0;
|
||||
platform->timer = 0;
|
||||
|
||||
gCurTask->main = Task_800EFD0;
|
||||
gCurTask->main = Task_FallingPlatformMain_Falling;
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
struct UNK_3005510 *uStrc = sub_8019224();
|
||||
uStrc->unk0 = 1;
|
||||
uStrc->unk1 = platform->base.regionX;
|
||||
uStrc->unk2 = platform->base.regionY;
|
||||
uStrc->unk3 = platform->base.id;
|
||||
uStrc->unk4 = 1;
|
||||
RoomEvent_PlatformChange *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_PLATFORM_CHANGE;
|
||||
roomEvent->x = platform->base.regionX;
|
||||
roomEvent->y = platform->base.regionY;
|
||||
roomEvent->id = platform->base.id;
|
||||
roomEvent->action = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -407,24 +407,24 @@ void Task_800EDF8(void)
|
||||
SET_MAP_ENTITY_NOT_INITIALIZED(me, platform->base.spriteX);
|
||||
TaskDestroy(gCurTask);
|
||||
} else {
|
||||
if ((gPlayer.moveState & MOVESTATE_8) && (gPlayer.unk3C == s)) {
|
||||
if (platform->unk4C != 0x100) {
|
||||
platform->unk4C += 0x10;
|
||||
if ((gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ) && (gPlayer.stoodObj == s)) {
|
||||
if (platform->stoodOffset != 0x100) {
|
||||
platform->stoodOffset += 0x10;
|
||||
}
|
||||
} else {
|
||||
if (platform->unk4C != 0) {
|
||||
platform->unk4C -= 0x10;
|
||||
if (platform->stoodOffset != 0) {
|
||||
platform->stoodOffset -= 0x10;
|
||||
}
|
||||
}
|
||||
|
||||
s->y += SIN_24_8(platform->unk4C) >> 6;
|
||||
s->y += SIN_24_8(platform->stoodOffset) >> 6;
|
||||
|
||||
UpdateSpriteAnimation(s);
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
|
||||
void Task_800EFD0(void)
|
||||
void Task_FallingPlatformMain_Falling(void)
|
||||
{
|
||||
s16 posX;
|
||||
s16 posY;
|
||||
@@ -436,11 +436,11 @@ void Task_800EFD0(void)
|
||||
me = platform->base.me;
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
sub_800F1B0(platform);
|
||||
HandlePlatformOffsetYStorage(platform);
|
||||
}
|
||||
|
||||
platform->unk4A += 0x2A;
|
||||
platform->unk44 += platform->unk4A;
|
||||
platform->velocityY += 0x2A;
|
||||
platform->offsetY += platform->velocityY;
|
||||
|
||||
posX = TO_WORLD_POS(platform->base.spriteX, platform->base.regionX);
|
||||
posY = TO_WORLD_POS(me->y, platform->base.regionY);
|
||||
@@ -448,28 +448,28 @@ void Task_800EFD0(void)
|
||||
s->x = posX - gCamera.x;
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
s->y = (posY - gCamera.y) + I(platform->unk50[1]);
|
||||
s->y = (posY - gCamera.y) + I(platform->prevOffsetY[1]);
|
||||
} else {
|
||||
s->y = (posY - gCamera.y) + I(platform->unk44);
|
||||
s->y = (posY - gCamera.y) + I(platform->offsetY);
|
||||
}
|
||||
|
||||
platform->unk3C++;
|
||||
platform->timer++;
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_8) {
|
||||
if (gPlayer.unk3C == s) {
|
||||
if (platform->unk3C > 32) {
|
||||
if (gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ) {
|
||||
if (gPlayer.stoodObj == s) {
|
||||
if (platform->timer > 32) {
|
||||
gPlayer.moveState |= MOVESTATE_IN_AIR;
|
||||
gPlayer.moveState &= ~MOVESTATE_8;
|
||||
gPlayer.speedAirY = platform->unk4A;
|
||||
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
gPlayer.speedAirY = platform->velocityY;
|
||||
} else {
|
||||
gPlayer.qWorldX += platform->unk48;
|
||||
gPlayer.qWorldY += Q(1.0) + platform->unk4A;
|
||||
gPlayer.qWorldX += platform->velocityX;
|
||||
gPlayer.qWorldY += Q(1.0) + platform->velocityY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (platform->unk3C < 32) {
|
||||
result = sub_800CCB8(s, posX, posY + I(platform->unk44), &gPlayer);
|
||||
if (platform->timer < 32) {
|
||||
result = sub_800CCB8(s, posX, posY + I(platform->offsetY), &gPlayer);
|
||||
if (result & 0x10000) {
|
||||
gPlayer.qWorldY += Q_8_8(result);
|
||||
}
|
||||
@@ -479,32 +479,32 @@ void Task_800EFD0(void)
|
||||
SET_MAP_ENTITY_NOT_INITIALIZED(me, platform->base.spriteX);
|
||||
TaskDestroy(gCurTask);
|
||||
} else {
|
||||
if ((gPlayer.moveState & MOVESTATE_8) && (gPlayer.unk3C == s)) {
|
||||
if (platform->unk4C != 0x100) {
|
||||
platform->unk4C += 0x10;
|
||||
if ((gPlayer.moveState & MOVESTATE_STOOD_ON_OBJ) && (gPlayer.stoodObj == s)) {
|
||||
if (platform->stoodOffset != 0x100) {
|
||||
platform->stoodOffset += 0x10;
|
||||
}
|
||||
} else {
|
||||
if (platform->unk4C != 0) {
|
||||
platform->unk4C -= 0x10;
|
||||
if (platform->stoodOffset != 0) {
|
||||
platform->stoodOffset -= 0x10;
|
||||
}
|
||||
}
|
||||
|
||||
s->y += SIN_24_8(platform->unk4C) >> 6;
|
||||
s->y += SIN_24_8(platform->stoodOffset) >> 6;
|
||||
|
||||
UpdateSpriteAnimation(s);
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
|
||||
void TaskDestructor_800F19C(struct Task *t)
|
||||
void TaskDestructor_Platform(struct Task *t)
|
||||
{
|
||||
Sprite_Platform *platform = TASK_DATA(t);
|
||||
void *vramPtr = platform->s.graphics.dest;
|
||||
VramFree(vramPtr);
|
||||
}
|
||||
|
||||
void sub_800F1B0(Sprite_Platform *platform)
|
||||
void HandlePlatformOffsetYStorage(Sprite_Platform *platform)
|
||||
{
|
||||
platform->unk50[1] = platform->unk50[0];
|
||||
platform->unk50[0] = platform->unk44;
|
||||
platform->prevOffsetY[1] = platform->prevOffsetY[0];
|
||||
platform->prevOffsetY[0] = platform->offsetY;
|
||||
}
|
||||
@@ -20,19 +20,19 @@
|
||||
typedef struct {
|
||||
/* 0x00 */ SpriteBase base;
|
||||
/* 0x0C */ Sprite s;
|
||||
/* 0x3C */ u16 unk3C;
|
||||
/* 0x40 */ s32 unk40;
|
||||
/* 0x44 */ s32 unk44;
|
||||
/* 0x48 */ s16 unk48;
|
||||
/* 0x4A */ s16 unk4A;
|
||||
/* 0x4C */ s16 unk4C;
|
||||
/* 0x50 */ s32 unk50[3][2];
|
||||
/* 0x3C */ u16 timer;
|
||||
/* 0x40 */ s32 offsetX;
|
||||
/* 0x44 */ s32 offsetY;
|
||||
/* 0x48 */ s16 velocityX;
|
||||
/* 0x4A */ s16 velocityY;
|
||||
/* 0x4C */ s16 stoodOffset; // used in "Platform" but unused in this object.
|
||||
/* 0x50 */ s32 prevOffset[3][2];
|
||||
} Sprite_PlatformSquare; /* size: 0x68 */
|
||||
|
||||
static void Task_Platform_Square(void);
|
||||
static void TaskDestructor_Platform_Square(struct Task *);
|
||||
static void Platform_Square_KillPlayer(void);
|
||||
static void sub_800F990(Sprite_PlatformSquare *);
|
||||
static void HandleSquarePlatformOffsetStorage(Sprite_PlatformSquare *);
|
||||
|
||||
static const u16 sAnimsPlatformSquare[9][3] = {
|
||||
{ 36, SA2_ANIM_PLATFORM_SQUARE_COMMON, 0 }, { 36, SA2_ANIM_PLATFORM_SQUARE_COMMON, 0 }, { 36, SA2_ANIM_PLATFORM_SQUARE_MUS_PLA, 1 },
|
||||
@@ -51,29 +51,29 @@ void CreateEntity_Platform_Square(MapEntity *me, u16 spriteRegionX, u16 spriteRe
|
||||
platform->base.me = me;
|
||||
platform->base.spriteX = me->x;
|
||||
platform->base.id = spriteY;
|
||||
platform->unk40 = 0;
|
||||
platform->unk44 = 0;
|
||||
platform->unk4C = 0;
|
||||
platform->offsetX = 0;
|
||||
platform->offsetY = 0;
|
||||
platform->stoodOffset = 0;
|
||||
|
||||
if (me->d.uData[2] > me->d.uData[3]) {
|
||||
if (me->d.sData[0] >= 0) {
|
||||
platform->unk48 = 0x4;
|
||||
platform->unk3C = 0;
|
||||
platform->unk4A = 0;
|
||||
platform->velocityX = 0x4;
|
||||
platform->timer = 0;
|
||||
platform->velocityY = 0;
|
||||
} else {
|
||||
platform->unk48 = 0x4;
|
||||
platform->unk3C = 0x80;
|
||||
platform->unk4A = 0;
|
||||
platform->velocityX = 0x4;
|
||||
platform->timer = 0x80;
|
||||
platform->velocityY = 0;
|
||||
}
|
||||
} else {
|
||||
if (me->d.sData[1] >= 0) {
|
||||
platform->unk48 = 0;
|
||||
platform->unk4A = 0x4;
|
||||
platform->unk3C = 0;
|
||||
platform->velocityX = 0;
|
||||
platform->velocityY = 0x4;
|
||||
platform->timer = 0;
|
||||
} else {
|
||||
platform->unk48 = 0;
|
||||
platform->unk4A = 0x4;
|
||||
platform->unk3C = 0x80;
|
||||
platform->velocityX = 0;
|
||||
platform->velocityY = 0x4;
|
||||
platform->timer = 0x80;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,9 +81,9 @@ void CreateEntity_Platform_Square(MapEntity *me, u16 spriteRegionX, u16 spriteRe
|
||||
s32 i;
|
||||
s32 tileCount, anim, variant;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(platform->unk50); i++) {
|
||||
platform->unk50[i][0] = platform->unk40;
|
||||
platform->unk50[i][1] = platform->unk44;
|
||||
for (i = 0; i < ARRAY_COUNT(platform->prevOffset); i++) {
|
||||
platform->prevOffset[i][0] = platform->offsetX;
|
||||
platform->prevOffset[i][1] = platform->offsetY;
|
||||
}
|
||||
|
||||
s->x = TO_WORLD_POS(me->x, spriteRegionX);
|
||||
@@ -126,26 +126,26 @@ static void Task_Platform_Square(void)
|
||||
me = platform->base.me;
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
sub_800F990(platform);
|
||||
HandleSquarePlatformOffsetStorage(platform);
|
||||
}
|
||||
|
||||
if (platform->unk48 != 0) {
|
||||
s32 oldUnk40 = platform->unk40;
|
||||
if (platform->velocityX != 0) {
|
||||
s32 oldUnk40 = platform->offsetX;
|
||||
s32 meUdata2 = (me->d.uData[2] << 11);
|
||||
|
||||
platform->unk40 = (SIN((platform->unk48 * ((gStageTime + platform->unk3C) & 0xFF)) & ONE_CYCLE) * meUdata2) >> 14;
|
||||
deltaX = platform->unk40 - oldUnk40;
|
||||
platform->offsetX = (SIN((platform->velocityX * ((gStageTime + platform->timer) & 0xFF)) & ONE_CYCLE) * meUdata2) >> 14;
|
||||
deltaX = platform->offsetX - oldUnk40;
|
||||
}
|
||||
|
||||
if (platform->unk4A != 0) {
|
||||
if (platform->velocityY != 0) {
|
||||
#ifdef NON_MATCHING
|
||||
s32 r5 = platform->unk44;
|
||||
s32 r5 = platform->offsetY;
|
||||
#else
|
||||
register s32 r5 asm("r5") = platform->unk44;
|
||||
register s32 r5 asm("r5") = platform->offsetY;
|
||||
#endif
|
||||
s32 meUdata3 = (me->d.uData[3] << 11);
|
||||
platform->unk44 = (SIN(((platform->unk4A * ((gStageTime + platform->unk3C) & 0xFF))) & ONE_CYCLE) * meUdata3) >> 14;
|
||||
r5 = platform->unk44 - r5;
|
||||
platform->offsetY = (SIN(((platform->velocityY * ((gStageTime + platform->timer) & 0xFF))) & ONE_CYCLE) * meUdata3) >> 14;
|
||||
r5 = platform->offsetY - r5;
|
||||
#ifndef NON_MATCHING
|
||||
asm("" ::"r"(r5));
|
||||
#endif
|
||||
@@ -156,14 +156,14 @@ static void Task_Platform_Square(void)
|
||||
posY = TO_WORLD_POS(me->y, platform->base.regionY);
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
s->x = posX - gCamera.x + I(platform->unk50[1][0]);
|
||||
s->y = posY - gCamera.y + I(platform->unk50[1][1]);
|
||||
s->x = posX - gCamera.x + I(platform->prevOffset[1][0]);
|
||||
s->y = posY - gCamera.y + I(platform->prevOffset[1][1]);
|
||||
} else {
|
||||
s->x = posX - gCamera.x + I(platform->unk40);
|
||||
s->y = posY - gCamera.y + I(platform->unk44);
|
||||
s->x = posX - gCamera.x + I(platform->offsetX);
|
||||
s->y = posY - gCamera.y + I(platform->offsetY);
|
||||
}
|
||||
|
||||
if ((p->moveState & MOVESTATE_8) && (p->unk3C == s)) {
|
||||
if ((p->moveState & MOVESTATE_STOOD_ON_OBJ) && (p->stoodObj == s)) {
|
||||
s32 res, temp, temp2;
|
||||
p->qWorldX += deltaX;
|
||||
|
||||
@@ -178,9 +178,9 @@ static void Task_Platform_Square(void)
|
||||
if (res < 0) {
|
||||
gPlayer.qWorldY += Q(res);
|
||||
|
||||
p->moveState &= ~MOVESTATE_8;
|
||||
p->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
p->moveState |= MOVESTATE_IN_AIR;
|
||||
p->unk3C = NULL;
|
||||
p->stoodObj = NULL;
|
||||
}
|
||||
|
||||
temp = I(p->qWorldX) + 2;
|
||||
@@ -202,9 +202,9 @@ static void Task_Platform_Square(void)
|
||||
if (res < 0) {
|
||||
p->qWorldY += Q(res);
|
||||
|
||||
p->moveState &= ~MOVESTATE_8;
|
||||
p->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
p->moveState |= MOVESTATE_IN_AIR;
|
||||
p->unk3C = NULL;
|
||||
p->stoodObj = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,8 +215,8 @@ static void Task_Platform_Square(void)
|
||||
s32 movStateCopy = p->moveState;
|
||||
|
||||
s->hitboxes[0].top -= 3;
|
||||
x = (posX + I(platform->unk40));
|
||||
y = (posY + I(platform->unk44));
|
||||
x = (posX + I(platform->offsetX));
|
||||
y = (posY + I(platform->offsetY));
|
||||
result = sub_800CCB8(s, x, y, p);
|
||||
|
||||
if (result & 0x30000) {
|
||||
@@ -231,9 +231,9 @@ static void Task_Platform_Square(void)
|
||||
p->speedAirY = 0;
|
||||
|
||||
if (GRAVITY_IS_INVERTED) {
|
||||
p->moveState |= MOVESTATE_8;
|
||||
p->moveState |= MOVESTATE_STOOD_ON_OBJ;
|
||||
p->moveState &= ~MOVESTATE_IN_AIR;
|
||||
p->unk3C = s;
|
||||
p->stoodObj = s;
|
||||
p->speedAirY = 0;
|
||||
}
|
||||
|
||||
@@ -250,7 +250,7 @@ static void Task_Platform_Square(void)
|
||||
s->hitboxes[0].left += 16;
|
||||
s->hitboxes[0].right -= 16;
|
||||
|
||||
otherRes = sub_800CCB8(s, posX + I(platform->unk40), posY + I(platform->unk44), p);
|
||||
otherRes = sub_800CCB8(s, posX + I(platform->offsetX), posY + I(platform->offsetY), p);
|
||||
|
||||
s->hitboxes[0].left -= 16;
|
||||
s->hitboxes[0].right += 16;
|
||||
@@ -304,7 +304,7 @@ static void Task_Platform_Square(void)
|
||||
}
|
||||
}
|
||||
|
||||
if ((result & 0xC0000) && !(p->moveState & MOVESTATE_8) && !(p->unk3C == s)) {
|
||||
if ((result & 0xC0000) && !(p->moveState & MOVESTATE_STOOD_ON_OBJ) && !(p->stoodObj == s)) {
|
||||
s32 tempXX = (s16)(result & 0xFF00);
|
||||
s16 tempX = tempXX;
|
||||
p->qWorldX += tempX;
|
||||
@@ -350,17 +350,17 @@ static void Platform_Square_KillPlayer(void)
|
||||
gPlayer.moveState |= MOVESTATE_DEAD;
|
||||
}
|
||||
|
||||
static void sub_800F990(Sprite_PlatformSquare *platform)
|
||||
static void HandleSquarePlatformOffsetStorage(Sprite_PlatformSquare *platform)
|
||||
{
|
||||
platform->unk50[2][0] = platform->unk50[1][0];
|
||||
platform->unk50[2][1] = platform->unk50[1][1];
|
||||
platform->unk50[1][0] = platform->unk50[0][0];
|
||||
platform->unk50[1][1] = platform->unk50[0][1];
|
||||
platform->unk50[0][0] = platform->unk40;
|
||||
platform->unk50[0][1] = platform->unk44;
|
||||
platform->prevOffset[2][0] = platform->prevOffset[1][0];
|
||||
platform->prevOffset[2][1] = platform->prevOffset[1][1];
|
||||
platform->prevOffset[1][0] = platform->prevOffset[0][0];
|
||||
platform->prevOffset[1][1] = platform->prevOffset[0][1];
|
||||
platform->prevOffset[0][0] = platform->offsetX;
|
||||
platform->prevOffset[0][1] = platform->offsetY;
|
||||
}
|
||||
|
||||
static u32 UNUSED sub_800F9AC(Sprite *s, s32 x, s32 y, Player *p)
|
||||
static u32 UNUSED HandleSquarePlatformCollision(Sprite *s, s32 x, s32 y, Player *p)
|
||||
{
|
||||
u32 result;
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#include "game/sa1_sa2_shared/interactables/platform_thin.h"
|
||||
#include "game/entity.h"
|
||||
|
||||
#include "game/multiplayer/player_unk_1.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
#include "game/stage/player.h"
|
||||
#include "game/stage/camera.h"
|
||||
|
||||
@@ -21,13 +21,13 @@
|
||||
typedef struct {
|
||||
/* 0x00 */ SpriteBase base;
|
||||
/* 0x0C */ Sprite s;
|
||||
/* 0x3C */ s32 unk3C;
|
||||
/* 0x40 */ s32 unk40;
|
||||
/* 0x44 */ s32 unk44;
|
||||
/* 0x3C */ s32 timer;
|
||||
/* 0x40 */ s32 offsetX;
|
||||
/* 0x44 */ s32 offsetY;
|
||||
|
||||
// unused
|
||||
/* 0x48 */ s32 unk48;
|
||||
/* 0x4C */ s32 unk4C;
|
||||
/* 0x48 */ s32 velocityX;
|
||||
/* 0x4C */ s32 velocityY;
|
||||
} Sprite_CommonThinPlatform;
|
||||
|
||||
typedef struct {
|
||||
@@ -39,9 +39,9 @@ typedef struct {
|
||||
SpriteTransform unkCC;
|
||||
SpriteTransform unkD8;
|
||||
SpriteTransform unkE4;
|
||||
u16 unkF0;
|
||||
s16 unkF2;
|
||||
} Platform_D1C /* size 0xF4*/;
|
||||
u16 timer;
|
||||
s16 gravityStrength;
|
||||
} PlatformBreakParticles /* size 0xF4*/;
|
||||
|
||||
static void Task_PlatformThinMain(void);
|
||||
static void TaskDestructor_PlatformThin(struct Task *);
|
||||
@@ -50,7 +50,7 @@ static void Task_PlatformBreakParticlesMain(void);
|
||||
static void TaskDestructor_PlatformBreakParticles(struct Task *);
|
||||
|
||||
void CreatePlatformBreakParticles(s16, s16);
|
||||
static u32 sub_80111F0(Sprite *, s32, s32, Player *);
|
||||
static u32 HandleThinPlatformCollision(Sprite *, s32, s32, Player *);
|
||||
|
||||
static const ALIGNED(4) u16 sPlatformThinAnimations[][3] = {
|
||||
{ 24, SA2_ANIM_562, 0 },
|
||||
@@ -89,8 +89,8 @@ void CreateEntity_PlatformThin(MapEntity *me, u16 spriteRegionX, u16 spriteRegio
|
||||
platform->base.spriteX = me->x;
|
||||
platform->base.id = spriteY;
|
||||
|
||||
platform->unk40 = 0;
|
||||
platform->unk44 = 0;
|
||||
platform->offsetX = 0;
|
||||
platform->offsetY = 0;
|
||||
|
||||
s->x = TO_WORLD_POS(me->x, spriteRegionX);
|
||||
s->y = TO_WORLD_POS(me->y, spriteRegionY);
|
||||
@@ -137,8 +137,8 @@ static void Task_PlatformThinMain(void)
|
||||
if (IS_MULTI_PLAYER && (s8)me->x == -3) {
|
||||
CreatePlatformBreakParticles(x, y);
|
||||
|
||||
if (player->moveState & MOVESTATE_8 && player->unk3C == s) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
if (player->moveState & MOVESTATE_STOOD_ON_OBJ && player->stoodObj == s) {
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= 2;
|
||||
}
|
||||
TaskDestroy(gCurTask);
|
||||
@@ -148,7 +148,7 @@ static void Task_PlatformThinMain(void)
|
||||
if (!(player->moveState & (MOVESTATE_400000 | MOVESTATE_DEAD))) {
|
||||
u32 temp2 = sub_800CCB8(s, x, y, player);
|
||||
if (temp2 & 0xC0000) {
|
||||
if (sub_80111F0(s, x, y, player) & 0xC0000) {
|
||||
if (HandleThinPlatformCollision(s, x, y, player) & 0xC0000) {
|
||||
player->qWorldX += (s16)(temp2 & 0xFF00);
|
||||
player->speedAirX = 0;
|
||||
}
|
||||
@@ -161,7 +161,7 @@ static void Task_PlatformThinMain(void)
|
||||
switch (player->character) {
|
||||
case CHARACTER_KNUCKLES:
|
||||
if (charState == CHARSTATE_KNUCKLES_DRILL_CLAW_MAIN) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
player->speedAirY = player->speedAirY >> 1;
|
||||
CreatePlatformBreakParticles(x, y);
|
||||
@@ -175,7 +175,7 @@ static void Task_PlatformThinMain(void)
|
||||
case CHARACTER_AMY: {
|
||||
anim -= gPlayerCharacterIdleAnims[player->character];
|
||||
if (charState == CHARSTATE_TRICK_DOWN && anim == SA2_CHAR_ANIM_51 && variant == 1 && player->speedAirY > 0) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
CreatePlatformBreakParticles(x, y);
|
||||
something = TRUE;
|
||||
}
|
||||
@@ -189,12 +189,12 @@ static void Task_PlatformThinMain(void)
|
||||
}
|
||||
if (something) {
|
||||
if (IS_MULTI_PLAYER) {
|
||||
struct UNK_3005510 *unk5510 = sub_8019224();
|
||||
unk5510->unk0 = 1;
|
||||
unk5510->unk1 = platform->base.regionX;
|
||||
unk5510->unk2 = platform->base.regionY;
|
||||
unk5510->unk3 = platform->base.id;
|
||||
unk5510->unk4 = 0;
|
||||
RoomEvent_PlatformChange *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_PLATFORM_CHANGE;
|
||||
roomEvent->x = platform->base.regionX;
|
||||
roomEvent->y = platform->base.regionY;
|
||||
roomEvent->id = platform->base.id;
|
||||
roomEvent->action = 0;
|
||||
}
|
||||
TaskDestroy(gCurTask);
|
||||
return;
|
||||
@@ -213,8 +213,9 @@ static void Task_PlatformThinMain(void)
|
||||
NONMATCH("asm/non_matching/game/sa1_sa2_shared/interactables/CreatePlatformBreakParticles.inc",
|
||||
void CreatePlatformBreakParticles(s16 x, s16 y))
|
||||
{
|
||||
struct Task *t = TaskCreate(Task_PlatformBreakParticlesMain, sizeof(Platform_D1C), 0x2011, 0, TaskDestructor_PlatformBreakParticles);
|
||||
Platform_D1C *platform = TASK_DATA(t);
|
||||
struct Task *t
|
||||
= TaskCreate(Task_PlatformBreakParticlesMain, sizeof(PlatformBreakParticles), 0x2011, 0, TaskDestructor_PlatformBreakParticles);
|
||||
PlatformBreakParticles *platform = TASK_DATA(t);
|
||||
|
||||
// Hack for better match
|
||||
#ifndef NON_MATCHING
|
||||
@@ -226,8 +227,8 @@ NONMATCH("asm/non_matching/game/sa1_sa2_shared/interactables/CreatePlatformBreak
|
||||
{
|
||||
Sprite *s = &platform->unk0;
|
||||
SpriteTransform *transform = &platform->unkC0;
|
||||
platform->unkF0 = 0;
|
||||
platform->unkF2 = 0xFE00;
|
||||
platform->timer = 0;
|
||||
platform->gravityStrength = -0x200;
|
||||
x -= 128;
|
||||
y -= 50;
|
||||
|
||||
@@ -318,22 +319,22 @@ END_NONMATCH
|
||||
static void Task_PlatformBreakParticlesMain(void)
|
||||
{
|
||||
s16 x, y;
|
||||
Platform_D1C *platform = TASK_DATA(gCurTask);
|
||||
PlatformBreakParticles *platform = TASK_DATA(gCurTask);
|
||||
Sprite *s;
|
||||
s16 width;
|
||||
SpriteTransform *transform;
|
||||
if (platform->unkF0++ >= 0x3D) {
|
||||
if (platform->timer++ >= 0x3D) {
|
||||
TaskDestroy(gCurTask);
|
||||
return;
|
||||
}
|
||||
|
||||
platform->unkF2 += 0x28;
|
||||
platform->gravityStrength += 0x28;
|
||||
|
||||
//
|
||||
s = &platform->unk0;
|
||||
transform = &platform->unkC0;
|
||||
|
||||
transform->y += I(platform->unkF2);
|
||||
transform->y += I(platform->gravityStrength);
|
||||
|
||||
x = transform->x;
|
||||
y = transform->y;
|
||||
@@ -341,7 +342,7 @@ static void Task_PlatformBreakParticlesMain(void)
|
||||
transform->x -= gCamera.x;
|
||||
transform->y -= gCamera.y;
|
||||
|
||||
transform->x -= platform->unkF0 * 2;
|
||||
transform->x -= platform->timer * 2;
|
||||
|
||||
width = transform->qScaleX + 8;
|
||||
if (width > 0x200) {
|
||||
@@ -363,7 +364,7 @@ static void Task_PlatformBreakParticlesMain(void)
|
||||
s = &platform->unk30;
|
||||
transform = &platform->unkCC;
|
||||
|
||||
transform->y += I(platform->unkF2);
|
||||
transform->y += I(platform->gravityStrength);
|
||||
|
||||
x = transform->x;
|
||||
y = transform->y;
|
||||
@@ -371,7 +372,7 @@ static void Task_PlatformBreakParticlesMain(void)
|
||||
transform->x -= gCamera.x;
|
||||
transform->y -= gCamera.y;
|
||||
|
||||
transform->x += platform->unkF0;
|
||||
transform->x += platform->timer;
|
||||
|
||||
transform->qScaleX = width;
|
||||
transform->qScaleY = width;
|
||||
@@ -389,14 +390,14 @@ static void Task_PlatformBreakParticlesMain(void)
|
||||
s = &platform->unk60;
|
||||
transform = &platform->unkD8;
|
||||
|
||||
transform->y += I(platform->unkF2);
|
||||
transform->y += I(platform->gravityStrength);
|
||||
|
||||
x = transform->x;
|
||||
y = transform->y;
|
||||
|
||||
transform->x -= gCamera.x;
|
||||
transform->y -= gCamera.y;
|
||||
transform->x += platform->unkF0 * 2;
|
||||
transform->x += platform->timer * 2;
|
||||
|
||||
transform->qScaleX = width;
|
||||
transform->qScaleY = width;
|
||||
@@ -414,14 +415,14 @@ static void Task_PlatformBreakParticlesMain(void)
|
||||
s = &platform->unk90;
|
||||
transform = &platform->unkE4;
|
||||
|
||||
transform->y += I(platform->unkF2);
|
||||
transform->y += I(platform->gravityStrength);
|
||||
|
||||
x = transform->x;
|
||||
y = transform->y;
|
||||
|
||||
transform->x -= gCamera.x;
|
||||
transform->y -= gCamera.y;
|
||||
transform->x -= platform->unkF0;
|
||||
transform->x -= platform->timer;
|
||||
|
||||
transform->qScaleX = width;
|
||||
transform->qScaleY = width;
|
||||
@@ -445,12 +446,12 @@ static void TaskDestructor_PlatformThin(struct Task *t)
|
||||
|
||||
static void TaskDestructor_PlatformBreakParticles(struct Task *t)
|
||||
{
|
||||
Platform_D1C *platform = TASK_DATA(t);
|
||||
PlatformBreakParticles *platform = TASK_DATA(t);
|
||||
VramFree(platform->unk0.graphics.dest);
|
||||
VramFree(platform->unk60.graphics.dest);
|
||||
}
|
||||
|
||||
static u32 sub_80111F0(Sprite *s, s32 x, s32 y, Player *player)
|
||||
static u32 HandleThinPlatformCollision(Sprite *s, s32 x, s32 y, Player *player)
|
||||
{
|
||||
u32 result;
|
||||
s->hitboxes[0].top += 1;
|
||||
|
||||
@@ -97,7 +97,7 @@ static void Task_Ramp(void)
|
||||
if (!(player->moveState & MOVESTATE_400000)) {
|
||||
u32 r1;
|
||||
u32 var = FALSE;
|
||||
if (player->moveState & MOVESTATE_8 && player->unk3C == s) {
|
||||
if (player->moveState & MOVESTATE_STOOD_ON_OBJ && player->stoodObj == s) {
|
||||
var = TRUE;
|
||||
}
|
||||
|
||||
@@ -121,7 +121,7 @@ static void Task_Ramp(void)
|
||||
player->unk6E = (ramp->unk3C & 1) * 3;
|
||||
}
|
||||
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
} else {
|
||||
s32 playerMiddleY = I(player->qWorldY) + player->spriteOffsetY - screenY;
|
||||
@@ -141,17 +141,17 @@ static void Task_Ramp(void)
|
||||
player->qWorldY += Q(temp6 - playerMiddleY);
|
||||
player->rotation = 0;
|
||||
|
||||
player->moveState |= MOVESTATE_8;
|
||||
player->moveState |= MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState &= ~MOVESTATE_IN_AIR;
|
||||
player->unk3C = s;
|
||||
player->stoodObj = s;
|
||||
}
|
||||
} else {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->moveState |= MOVESTATE_IN_AIR;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -162,8 +162,8 @@ static void Task_Ramp(void)
|
||||
player->unk6E = (ramp->unk3C & 1) * 3;
|
||||
}
|
||||
} else if (((ramp->unk3C & 2) != 0 && I(player->qWorldX) > s->x) || ((ramp->unk3C & 2) == 0 && I(player->qWorldX) < s->x)) {
|
||||
player->moveState &= ~MOVESTATE_8;
|
||||
player->unk3C = NULL;
|
||||
player->moveState &= ~MOVESTATE_STOOD_ON_OBJ;
|
||||
player->stoodObj = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,9 +45,9 @@ typedef struct {
|
||||
#define INITIALIZE_SPRING(springType) CreateEntity_Spring(springType, me, spriteRegionX, spriteRegionY, param3)
|
||||
|
||||
static void CreateEntity_Spring(u8, MapEntity *, u16, u16, u8);
|
||||
static void Task_Spring(void);
|
||||
static void sub_800E3D0(void);
|
||||
static bool32 sub_800E490(Sprite *p0, MapEntity *me, Sprite_Spring *spring, Player *player);
|
||||
static void Task_Spring_Idle(void);
|
||||
static void Task_Spring_Activated(void);
|
||||
static bool32 CheckSpringPlayerCollisions(Sprite *p0, MapEntity *me, Sprite_Spring *spring, Player *player);
|
||||
static void TaskDestructor_Spring(struct Task *t);
|
||||
|
||||
static const u16 sSpringAnimationData[NUM_SPRING_KINDS][SPRINGTYPE_COUNT][4] = {
|
||||
@@ -101,7 +101,7 @@ static const u16 sSpring_MusicPlant_Soundeffects[5]
|
||||
static void CreateEntity_Spring(u8 springType, MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
s16 springKind = SPRING_KIND_NORMAL;
|
||||
struct Task *t = TaskCreate(Task_Spring, sizeof(Sprite_Spring), 0x2010, 0, TaskDestructor_Spring);
|
||||
struct Task *t = TaskCreate(Task_Spring_Idle, sizeof(Sprite_Spring), 0x2010, 0, TaskDestructor_Spring);
|
||||
Sprite_Spring *spring = TASK_DATA(t);
|
||||
Sprite *s = &spring->s;
|
||||
|
||||
@@ -148,14 +148,14 @@ static void CreateEntity_Spring(u8 springType, MapEntity *me, u16 spriteRegionX,
|
||||
UpdateSpriteAnimation(s);
|
||||
}
|
||||
|
||||
static void Task_Spring(void)
|
||||
static void Task_Spring_Idle(void)
|
||||
{
|
||||
Sprite_Spring *spring = TASK_DATA(gCurTask);
|
||||
Sprite *s = &spring->s;
|
||||
MapEntity *me = spring->base.me;
|
||||
|
||||
if (sub_800E490(s, me, spring, &gPlayer) != 0) {
|
||||
gCurTask->main = sub_800E3D0;
|
||||
if (CheckSpringPlayerCollisions(s, me, spring, &gPlayer) != 0) {
|
||||
gCurTask->main = Task_Spring_Activated;
|
||||
s->variant++;
|
||||
|
||||
if ((LEVEL_TO_ZONE(gCurrentLevel) == ZONE_3 && (spring->dir / 2) == 0))
|
||||
@@ -170,13 +170,13 @@ static void Task_Spring(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_800E3D0(void)
|
||||
static void Task_Spring_Activated(void)
|
||||
{
|
||||
Sprite_Spring *spring = TASK_DATA(gCurTask);
|
||||
Sprite *s = &spring->s;
|
||||
MapEntity *me = spring->base.me;
|
||||
|
||||
sub_800E490(s, me, spring, &gPlayer);
|
||||
CheckSpringPlayerCollisions(s, me, spring, &gPlayer);
|
||||
|
||||
if (IS_OUT_OF_CAM_RANGE(s->x, s->y)) {
|
||||
me->x = spring->base.spriteX;
|
||||
@@ -190,14 +190,14 @@ static void sub_800E3D0(void)
|
||||
}
|
||||
|
||||
UpdateSpriteAnimation(s);
|
||||
gCurTask->main = Task_Spring;
|
||||
gCurTask->main = Task_Spring_Idle;
|
||||
}
|
||||
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
|
||||
static bool32 sub_800E490(Sprite *s, MapEntity *me, Sprite_Spring *spring, Player *player)
|
||||
static bool32 CheckSpringPlayerCollisions(Sprite *s, MapEntity *me, Sprite_Spring *spring, Player *player)
|
||||
{
|
||||
s16 xPos = TO_WORLD_POS(spring->base.spriteX, spring->base.regionX);
|
||||
s16 yPos = TO_WORLD_POS(me->y, spring->base.regionY);
|
||||
|
||||
+104
-100
@@ -14,7 +14,7 @@
|
||||
#include "game/stage/player.h"
|
||||
#include "game/stage/camera.h"
|
||||
|
||||
#include "game/multiplayer/player_unk_1.h"
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
#include "game/multiplayer/mp_player.h"
|
||||
|
||||
#include "constants/animations.h"
|
||||
@@ -33,30 +33,33 @@ typedef struct {
|
||||
/* 0x3C */ Sprite item;
|
||||
/* 0x6C */ s32 x;
|
||||
/* 0x70 */ s32 y;
|
||||
/* 0x74 */ s16 unk74;
|
||||
/* 0x74 */ s16 iconOffset;
|
||||
/* 0x76 */ u8 kind;
|
||||
/* 0x77 */ u8 frames;
|
||||
/* 0x78 */ bool8 unk78;
|
||||
/* 0x78 */ bool8 noPlayerBreakRecoil;
|
||||
} Entity_ItemBox; /* size: 0x7C */
|
||||
|
||||
void sub_800B1AC(Entity_ItemBox *);
|
||||
void sub_800B580(Entity_ItemBox *, bool32);
|
||||
void sub_800B860(Entity_ItemBox *, bool32);
|
||||
void BreakItemBox(Entity_ItemBox *);
|
||||
void InitItemBoxGraphics(Entity_ItemBox *, bool32);
|
||||
void DrawItemBox(Entity_ItemBox *, bool32);
|
||||
void Task_ItemBoxMain(void);
|
||||
void Task_800B780(void);
|
||||
void Task_800B7D0(void);
|
||||
void Task_ItemBoxIconMain_Rising(void);
|
||||
void Task_ItemBoxIconMain_Idle(void);
|
||||
void TaskDestructor_ItemBox(struct Task *);
|
||||
void sub_800B828(Entity_ItemBox *);
|
||||
bool32 sub_800B8AC(Entity_ItemBox *);
|
||||
bool32 sub_800B8F4(Entity_ItemBox *);
|
||||
void Task_800B950(void);
|
||||
void sub_800B9A0(Entity_ItemBox *);
|
||||
void MultiplayerItemBoxBreak(Entity_ItemBox *);
|
||||
bool32 CheckItemBoxOutOfBounds(Entity_ItemBox *);
|
||||
bool32 CheckItemBoxPlayerCollision(Entity_ItemBox *);
|
||||
void Task_ItemBoxIconMain_Rise_MP(void);
|
||||
void FinishItemBoxRise_MP(Entity_ItemBox *);
|
||||
|
||||
const u16 ItemBox_MysteryIcons[13][3] = {
|
||||
{ SA2_ANIM_ITEMBOX_TYPE, 0, 4 }, { SA2_ANIM_ITEMBOX_TYPE, 5, 4 }, { SA2_ANIM_ITEMBOX_TYPE, 6, 4 }, { SA2_ANIM_ITEMBOX_TYPE, 7, 4 },
|
||||
{ SA2_ANIM_ITEMBOX_TYPE, 8, 4 }, { SA2_ANIM_ITEMBOX_TYPE, 9, 4 }, { SA2_ANIM_ITEMBOX_TYPE, 10, 4 }, { SA2_ANIM_ITEMBOX_TYPE, 11, 4 },
|
||||
{ SA2_ANIM_ITEMBOX_TYPE, 13, 4 }, { SA2_ANIM_ITEMBOX_TYPE, 14, 4 }, { SA2_ANIM_ITEMBOX_TYPE, 15, 4 }, { SA2_ANIM_ITEMBOX_TYPE, 16, 4 },
|
||||
{ SA2_ANIM_ITEMBOX_TYPE, 12, 4 },
|
||||
[ITEM__ONE_UP] = { SA2_ANIM_ITEMBOX_TYPE, 0, 4 }, [ITEM__SHIELD] = { SA2_ANIM_ITEMBOX_TYPE, 5, 4 },
|
||||
[ITEM__SHIELD_MAGNETIC] = { SA2_ANIM_ITEMBOX_TYPE, 6, 4 }, [ITEM__INVINCIBILITY] = { SA2_ANIM_ITEMBOX_TYPE, 7, 4 },
|
||||
[ITEM__SPEED_UP] = { SA2_ANIM_ITEMBOX_TYPE, 8, 4 }, [ITEM__RINGS_RANDOM] = { SA2_ANIM_ITEMBOX_TYPE, 9, 4 },
|
||||
[ITEM__RINGS_5] = { SA2_ANIM_ITEMBOX_TYPE, 10, 4 }, [ITEM__RINGS_10] = { SA2_ANIM_ITEMBOX_TYPE, 11, 4 },
|
||||
[ITEM__MP_SWAP] = { SA2_ANIM_ITEMBOX_TYPE, 13, 4 }, [ITEM__MP_CONFUSION] = { SA2_ANIM_ITEMBOX_TYPE, 14, 4 },
|
||||
[ITEM__MP_SLOWDOWN] = { SA2_ANIM_ITEMBOX_TYPE, 15, 4 }, [ITEM__MP_ATTACK] = { SA2_ANIM_ITEMBOX_TYPE, 16, 4 },
|
||||
[ITEM__MP_ATTACK_2] = { SA2_ANIM_ITEMBOX_TYPE, 12, 4 },
|
||||
};
|
||||
|
||||
const u16 ItemBox_1UpIcons[5][3] = {
|
||||
@@ -65,10 +68,11 @@ const u16 ItemBox_1UpIcons[5][3] = {
|
||||
{ SA2_ANIM_ITEMBOX_TYPE, CHARACTER_AMY, 4 },
|
||||
};
|
||||
|
||||
const u16 gUnknown_080D51E4[8] = { 5, 13, 4, 13, 3, 13, 6, 13 };
|
||||
const u16 ItemBox_randTypeTable[8] = { ITEM__RINGS_RANDOM, ITEM__MP_RANDOM, ITEM__SPEED_UP, ITEM__MP_RANDOM,
|
||||
ITEM__INVINCIBILITY, ITEM__MP_RANDOM, ITEM__RINGS_5, ITEM__MP_RANDOM };
|
||||
|
||||
const u16 gUnknown_080D51F4[] = { 8, 9, 10, 11 };
|
||||
const u8 gUnknown_080D51FC[] = { 1, 5, 10, 30, 50, 0, 0, 0 };
|
||||
const u16 ItemBox_subRandTypeTable[] = { ITEM__MP_SWAP, ITEM__MP_CONFUSION, ITEM__MP_SLOWDOWN, ITEM__MP_ATTACK };
|
||||
const u8 ItemBox_ringAmountTable[] = { 1, 5, 10, 30, 50, 0, 0, 0 };
|
||||
|
||||
void CreateEntity_ItemBox(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
@@ -76,20 +80,20 @@ void CreateEntity_ItemBox(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u
|
||||
Entity_ItemBox *itembox;
|
||||
Sprite *s;
|
||||
if (gGameMode == GAME_MODE_TIME_ATTACK || gGameMode == GAME_MODE_BOSS_TIME_ATTACK) {
|
||||
if (me->index == 0) {
|
||||
if (me->index == ITEM__ONE_UP) {
|
||||
SET_MAP_ENTITY_INITIALIZED(me);
|
||||
return;
|
||||
}
|
||||
|
||||
if (me->index == 5) {
|
||||
me->index = 7;
|
||||
if (me->index == ITEM__RINGS_RANDOM) {
|
||||
me->index = ITEM__RINGS_10;
|
||||
}
|
||||
}
|
||||
|
||||
t = TaskCreate(Task_ItemBoxMain, sizeof(Entity_ItemBox), 0x2000, 0, TaskDestructor_ItemBox);
|
||||
itembox = TASK_DATA(t);
|
||||
itembox->kind = me->index;
|
||||
itembox->unk74 = 0;
|
||||
itembox->iconOffset = 0;
|
||||
itembox->x = TO_WORLD_POS(me->x, spriteRegionX);
|
||||
itembox->y = TO_WORLD_POS(me->y, spriteRegionY);
|
||||
itembox->base.regionX = spriteRegionX;
|
||||
@@ -124,18 +128,18 @@ void CreateEntity_ItemBox(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u
|
||||
s->hitboxes[0].index = -1;
|
||||
s->frameFlags = (SPRITE_FLAG(PRIORITY, 2) | SPRITE_FLAG_MASK_MOSAIC);
|
||||
s->graphics.dest = VramMalloc(TILE_COUNT__ANIM_ITEMBOX_TYPE);
|
||||
sub_800B580(itembox, TRUE);
|
||||
InitItemBoxGraphics(itembox, TRUE);
|
||||
|
||||
SET_MAP_ENTITY_INITIALIZED(me);
|
||||
}
|
||||
|
||||
void sub_800B1AC(Entity_ItemBox *itembox)
|
||||
void BreakItemBox(Entity_ItemBox *itembox)
|
||||
{
|
||||
if (itembox->unk78 != TRUE || gPlayer.moveState & MOVESTATE_IN_AIR) {
|
||||
if (itembox->noPlayerBreakRecoil != TRUE || gPlayer.moveState & MOVESTATE_IN_AIR) {
|
||||
gPlayer.speedAirY = -Q(3.0);
|
||||
gPlayer.charState = CHARSTATE_SPRING_B;
|
||||
gPlayer.prevCharState = CHARSTATE_INVALID;
|
||||
gPlayer.transition = PLTRANS_PT5;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
}
|
||||
|
||||
m4aSongNumStart(SE_ITEM_BOX_2);
|
||||
@@ -145,14 +149,14 @@ void sub_800B1AC(Entity_ItemBox *itembox)
|
||||
itembox->frames = 0;
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
struct UNK_3005510 *unk = sub_8019224();
|
||||
unk->unk0 = 2;
|
||||
unk->unk1 = itembox->base.regionX;
|
||||
unk->unk2 = itembox->base.regionY;
|
||||
unk->unk3 = itembox->base.id;
|
||||
RoomEvent_ItemBoxBreak *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_ITEMBOX_BREAK;
|
||||
roomEvent->x = itembox->base.regionX;
|
||||
roomEvent->y = itembox->base.regionY;
|
||||
roomEvent->id = itembox->base.id;
|
||||
}
|
||||
|
||||
gCurTask->main = Task_800B780;
|
||||
gCurTask->main = Task_ItemBoxIconMain_Rising;
|
||||
}
|
||||
|
||||
#define ITEMBOX_ADD_NEW_RINGS(oldRingCount, newRingCount) \
|
||||
@@ -204,7 +208,7 @@ void ApplyItemboxEffect(Entity_ItemBox *itembox)
|
||||
gPlayer.itemEffect |= PLAYER_ITEM_EFFECT__SHIELD_NORMAL;
|
||||
|
||||
if (!(gPlayer.itemEffect & PLAYER_ITEM_EFFECT__INVINCIBILITY)) {
|
||||
CreateItemTask_Shield_Normal(gPlayer.unk60);
|
||||
CreateItemTask_Shield_Normal(gPlayer.playerID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,7 +220,7 @@ void ApplyItemboxEffect(Entity_ItemBox *itembox)
|
||||
gPlayer.itemEffect |= PLAYER_ITEM_EFFECT__SHIELD_MAGNETIC;
|
||||
|
||||
if (!(gPlayer.itemEffect & PLAYER_ITEM_EFFECT__INVINCIBILITY)) {
|
||||
CreateItemTask_Shield_Magnetic(gPlayer.unk60);
|
||||
CreateItemTask_Shield_Magnetic(gPlayer.playerID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -227,7 +231,7 @@ void ApplyItemboxEffect(Entity_ItemBox *itembox)
|
||||
|
||||
if (IS_SINGLE_PLAYER || !(gPlayer.itemEffect & PLAYER_ITEM_EFFECT__INVINCIBILITY)) {
|
||||
gPlayer.itemEffect |= PLAYER_ITEM_EFFECT__INVINCIBILITY;
|
||||
CreateItemTask_Invincibility(gPlayer.unk60);
|
||||
CreateItemTask_Invincibility(gPlayer.playerID);
|
||||
gMusicManagerState.unk2 = 16;
|
||||
}
|
||||
} break;
|
||||
@@ -239,12 +243,12 @@ void ApplyItemboxEffect(Entity_ItemBox *itembox)
|
||||
m4aMPlayTempoControl(&gMPlayInfo_BGM, 0x200);
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
gPlayer.itemEffect &= ~PLAYER_ITEM_EFFECT__10;
|
||||
gPlayer.itemEffect &= ~PLAYER_ITEM_EFFECT__MP_SLOW_DOWN;
|
||||
}
|
||||
} break;
|
||||
|
||||
case ITEM__RINGS_RANDOM: {
|
||||
s32 rnd = gUnknown_080D51FC[(u32)PseudoRandom32() % 5];
|
||||
s32 rnd = ItemBox_ringAmountTable[(u32)PseudoRandom32() % 5];
|
||||
#if TAS_TESTING && TAS_TESTING_WIDESCREEN_HACK && DISPLAY_WIDTH > 240
|
||||
// There are points in the game where the TAS depends on the RNG
|
||||
// giving specific values. Because widescreen runs different code
|
||||
@@ -280,7 +284,7 @@ void ApplyItemboxEffect(Entity_ItemBox *itembox)
|
||||
ITEMBOX_ADD_NEW_RINGS(oldRingCount, newRingCount);
|
||||
} break;
|
||||
|
||||
case ITEM__MP_8: {
|
||||
case ITEM__MP_SWAP: {
|
||||
s32 smallestMagnitude = -1;
|
||||
u8 nearestPlayer = 0;
|
||||
u8 playerId;
|
||||
@@ -308,56 +312,56 @@ void ApplyItemboxEffect(Entity_ItemBox *itembox)
|
||||
}
|
||||
|
||||
{
|
||||
struct UNK_3005510 *unkPtr = sub_8019224();
|
||||
unkPtr->unk0 = 6;
|
||||
unkPtr->unk1 = 1;
|
||||
unkPtr->unk2 = nearestPlayer;
|
||||
RoomEvent_ItemEffect *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_ITEMEFFECT_APPLIED;
|
||||
roomEvent->effect = 1;
|
||||
roomEvent->targetPlayer = nearestPlayer;
|
||||
}
|
||||
|
||||
m4aSongNumStart(SE_218);
|
||||
} break;
|
||||
|
||||
case ITEM__MP_9: {
|
||||
struct UNK_3005510 *unkPtr = sub_8019224();
|
||||
unkPtr->unk0 = 6;
|
||||
unkPtr->unk1 = 0;
|
||||
case ITEM__MP_CONFUSION: {
|
||||
RoomEvent_ItemEffect *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_ITEMEFFECT_APPLIED;
|
||||
roomEvent->effect = 0;
|
||||
m4aSongNumStart(SE_ITEM_CONFUSION);
|
||||
} break;
|
||||
|
||||
case ITEM__MP_10: {
|
||||
struct UNK_3005510 *unkPtr = sub_8019224();
|
||||
unkPtr->unk0 = 6;
|
||||
unkPtr->unk1 = 2;
|
||||
case ITEM__MP_SLOWDOWN: {
|
||||
RoomEvent_ItemEffect *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_ITEMEFFECT_APPLIED;
|
||||
roomEvent->effect = 2;
|
||||
m4aSongNumStart(SE_ITEM_CONFUSION);
|
||||
} break;
|
||||
|
||||
case ITEM__MP_11: {
|
||||
struct UNK_3005510 *unkPtr = sub_8019224();
|
||||
unkPtr->unk0 = 6;
|
||||
unkPtr->unk1 = 3;
|
||||
case ITEM__MP_ATTACK: {
|
||||
RoomEvent_ItemEffect *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_ITEMEFFECT_APPLIED;
|
||||
roomEvent->effect = 3;
|
||||
m4aSongNumStart(SE_219);
|
||||
} break;
|
||||
|
||||
case ITEM__MP_12: {
|
||||
struct UNK_3005510 *unkPtr = sub_8019224();
|
||||
unkPtr->unk0 = 6;
|
||||
unkPtr->unk1 = 4;
|
||||
case ITEM__MP_ATTACK_2: {
|
||||
RoomEvent_ItemEffect *roomEvent = CreateRoomEvent();
|
||||
roomEvent->type = ROOMEVENT_TYPE_ITEMEFFECT_APPLIED;
|
||||
roomEvent->effect = 4;
|
||||
m4aSongNumStart(SE_216);
|
||||
} break;
|
||||
}
|
||||
|
||||
itembox->frames = 0;
|
||||
gCurTask->main = Task_800B7D0;
|
||||
gCurTask->main = Task_ItemBoxIconMain_Idle;
|
||||
}
|
||||
|
||||
void sub_800B580(Entity_ItemBox *itembox, bool32 p1)
|
||||
void InitItemBoxGraphics(Entity_ItemBox *itembox, bool32 firstLoad)
|
||||
{
|
||||
switch (gGameMode) {
|
||||
case GAME_MODE_SINGLE_PLAYER:
|
||||
case GAME_MODE_TIME_ATTACK:
|
||||
case GAME_MODE_BOSS_TIME_ATTACK: {
|
||||
if (p1) {
|
||||
if (itembox->kind == 0) {
|
||||
if (firstLoad) {
|
||||
if (itembox->kind == ITEM__ONE_UP) {
|
||||
itembox->item.graphics.anim = ItemBox_1UpIcons[gSelectedCharacter][0];
|
||||
itembox->item.variant = ItemBox_1UpIcons[gSelectedCharacter][1];
|
||||
} else {
|
||||
@@ -371,16 +375,16 @@ void sub_800B580(Entity_ItemBox *itembox, bool32 p1)
|
||||
|
||||
case GAME_MODE_MULTI_PLAYER:
|
||||
case GAME_MODE_TEAM_PLAY: {
|
||||
if (p1 || ((gStageTime & 0x1F) == 0)) {
|
||||
s32 kind = gUnknown_080D51E4[(gStageTime >> 5) & 0x7];
|
||||
if (firstLoad || ((gStageTime & 0x1F) == 0)) {
|
||||
s32 kind = ItemBox_randTypeTable[(gStageTime >> 5) & 0x7];
|
||||
|
||||
if (kind == 13) {
|
||||
kind = gUnknown_080D51F4[gMultiplayerPseudoRandom & 0x3];
|
||||
if (kind == ITEM__MP_RANDOM) {
|
||||
kind = ItemBox_subRandTypeTable[gMultiplayerPseudoRandom & 0x3];
|
||||
|
||||
if (LEVEL_TO_ZONE(gCurrentLevel) == ZONE_7) {
|
||||
if (kind == 8) {
|
||||
if (kind == ITEM__MP_SWAP) {
|
||||
s32 index = ((gMultiplayerPseudoRandom >> 2) % 3) + 1;
|
||||
kind = gUnknown_080D51F4[index];
|
||||
kind = ItemBox_subRandTypeTable[index];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -393,7 +397,7 @@ void sub_800B580(Entity_ItemBox *itembox, bool32 p1)
|
||||
} break;
|
||||
|
||||
case GAME_MODE_MULTI_PLAYER_COLLECT_RINGS: {
|
||||
if (p1) {
|
||||
if (firstLoad) {
|
||||
itembox->item.graphics.anim = ItemBox_MysteryIcons[itembox->kind][0];
|
||||
itembox->item.variant = ItemBox_MysteryIcons[itembox->kind][1];
|
||||
UpdateSpriteAnimation(&itembox->item);
|
||||
@@ -407,24 +411,24 @@ void Task_ItemBoxMain(void)
|
||||
Entity_ItemBox *itembox = TASK_DATA(gCurTask);
|
||||
|
||||
if (IS_MULTI_PLAYER && ((s8)itembox->base.me->x) == MAP_ENTITY_STATE_MINUS_THREE) {
|
||||
sub_800B828(itembox);
|
||||
MultiplayerItemBoxBreak(itembox);
|
||||
} else {
|
||||
if (sub_800B8F4(itembox)) {
|
||||
sub_800B1AC(itembox);
|
||||
if (CheckItemBoxPlayerCollision(itembox)) {
|
||||
BreakItemBox(itembox);
|
||||
} else {
|
||||
sub_800B580(itembox, FALSE);
|
||||
InitItemBoxGraphics(itembox, FALSE);
|
||||
}
|
||||
|
||||
if (sub_800B8AC(itembox)) {
|
||||
if (CheckItemBoxOutOfBounds(itembox)) {
|
||||
SET_MAP_ENTITY_NOT_INITIALIZED(itembox->base.me, itembox->base.spriteX);
|
||||
TaskDestroy(gCurTask);
|
||||
} else {
|
||||
sub_800B860(itembox, FALSE);
|
||||
DrawItemBox(itembox, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Task_800B780(void)
|
||||
void Task_ItemBoxIconMain_Rising(void)
|
||||
{
|
||||
Entity_ItemBox *itembox = TASK_DATA(gCurTask);
|
||||
|
||||
@@ -432,13 +436,13 @@ void Task_800B780(void)
|
||||
if (itembox->frames++ >= 60)
|
||||
ApplyItemboxEffect(itembox);
|
||||
else {
|
||||
itembox->unk74 += -Q(1.0);
|
||||
itembox->iconOffset += -Q(1.0);
|
||||
}
|
||||
|
||||
sub_800B860(itembox, TRUE);
|
||||
DrawItemBox(itembox, TRUE);
|
||||
}
|
||||
|
||||
void Task_800B7D0(void)
|
||||
void Task_ItemBoxIconMain_Idle(void)
|
||||
{
|
||||
Entity_ItemBox *itembox = TASK_DATA(gCurTask);
|
||||
|
||||
@@ -446,7 +450,7 @@ void Task_800B7D0(void)
|
||||
if (itembox->frames++ >= 30)
|
||||
TaskDestroy(gCurTask);
|
||||
else
|
||||
sub_800B860(itembox, TRUE);
|
||||
DrawItemBox(itembox, TRUE);
|
||||
}
|
||||
|
||||
void TaskDestructor_ItemBox(struct Task *t)
|
||||
@@ -456,7 +460,7 @@ void TaskDestructor_ItemBox(struct Task *t)
|
||||
VramFree(itembox->item.graphics.dest);
|
||||
}
|
||||
|
||||
void sub_800B828(Entity_ItemBox *itembox)
|
||||
void MultiplayerItemBoxBreak(Entity_ItemBox *itembox)
|
||||
{
|
||||
m4aSongNumStart(SE_ITEM_BOX_2);
|
||||
|
||||
@@ -464,24 +468,24 @@ void sub_800B828(Entity_ItemBox *itembox)
|
||||
|
||||
itembox->frames = 0;
|
||||
|
||||
gCurTask->main = Task_800B950;
|
||||
gCurTask->main = Task_ItemBoxIconMain_Rise_MP;
|
||||
}
|
||||
|
||||
void sub_800B860(Entity_ItemBox *itembox, bool32 p1)
|
||||
void DrawItemBox(Entity_ItemBox *itembox, bool32 disableBox)
|
||||
{
|
||||
itembox->s.x = itembox->x - gCamera.x;
|
||||
itembox->s.y = itembox->y - gCamera.y;
|
||||
|
||||
itembox->item.x = itembox->x - gCamera.x;
|
||||
itembox->item.y = (I(itembox->unk74) + itembox->s.y);
|
||||
itembox->item.y = (I(itembox->iconOffset) + itembox->s.y);
|
||||
|
||||
if (!p1)
|
||||
if (!disableBox)
|
||||
DisplaySprite(&itembox->s);
|
||||
|
||||
DisplaySprite(&itembox->item);
|
||||
}
|
||||
|
||||
bool32 sub_800B8AC(Entity_ItemBox *itembox)
|
||||
bool32 CheckItemBoxOutOfBounds(Entity_ItemBox *itembox)
|
||||
{
|
||||
s16 x = itembox->x - gCamera.x;
|
||||
s16 y = itembox->y - gCamera.y;
|
||||
@@ -493,47 +497,47 @@ bool32 sub_800B8AC(Entity_ItemBox *itembox)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool32 sub_800B8F4(Entity_ItemBox *itembox)
|
||||
bool32 CheckItemBoxPlayerCollision(Entity_ItemBox *itembox)
|
||||
{
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
Sprite *s = &itembox->s;
|
||||
u32 res = sub_800C944(s, itembox->x, itembox->y);
|
||||
|
||||
if (res != 0) {
|
||||
itembox->unk78 = 1;
|
||||
itembox->noPlayerBreakRecoil = TRUE;
|
||||
|
||||
return itembox->unk78;
|
||||
return itembox->noPlayerBreakRecoil;
|
||||
} else {
|
||||
if (!sub_800C204(s, itembox->x, itembox->y, 0, &gPlayer, 0)) {
|
||||
sub_800B8F4_Ret0:
|
||||
CheckItemBoxPlayerCollision_Ret0:
|
||||
return FALSE;
|
||||
} else {
|
||||
itembox->unk78 = 0;
|
||||
itembox->noPlayerBreakRecoil = FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
goto sub_800B8F4_Ret0;
|
||||
goto CheckItemBoxPlayerCollision_Ret0;
|
||||
}
|
||||
}
|
||||
|
||||
void Task_800B950(void)
|
||||
void Task_ItemBoxIconMain_Rise_MP(void)
|
||||
{
|
||||
Entity_ItemBox *itembox = TASK_DATA(gCurTask);
|
||||
|
||||
// TODO/BUG(?) This should be a pre-increment, not post-increment, right?
|
||||
if (itembox->frames++ >= 60) {
|
||||
sub_800B9A0(itembox);
|
||||
FinishItemBoxRise_MP(itembox);
|
||||
} else {
|
||||
itembox->unk74 += -Q(1.0);
|
||||
itembox->iconOffset += -Q(1.0);
|
||||
}
|
||||
|
||||
sub_800B860(itembox, TRUE);
|
||||
DrawItemBox(itembox, TRUE);
|
||||
}
|
||||
|
||||
void sub_800B9A0(Entity_ItemBox *itembox)
|
||||
void FinishItemBoxRise_MP(Entity_ItemBox *itembox)
|
||||
{
|
||||
itembox->frames = 0;
|
||||
gCurTask->main = Task_800B7D0;
|
||||
gCurTask->main = Task_ItemBoxIconMain_Idle;
|
||||
}
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
typedef struct {
|
||||
Sprite s;
|
||||
s16 unk30;
|
||||
s16 radius;
|
||||
} StageRing;
|
||||
|
||||
void Task_MagneticRing(void);
|
||||
@@ -33,7 +33,7 @@ void CreateMagneticRing(s16 x, s16 y)
|
||||
StageRing *ring = TASK_DATA(t);
|
||||
Sprite *s;
|
||||
|
||||
ring->unk30 = 0;
|
||||
ring->radius = 0;
|
||||
|
||||
s = &ring->s;
|
||||
s->x = x;
|
||||
@@ -62,10 +62,10 @@ void Task_MagneticRing(void)
|
||||
s16 sinVal = sub_8004418(ringToPlayerY, ringToPlayerX);
|
||||
s16 ringX, ringY;
|
||||
|
||||
ring->unk30 += 0x40;
|
||||
ring->radius += 0x40;
|
||||
|
||||
ring->s.x += (ring->unk30 * COS(sinVal)) >> 22;
|
||||
ring->s.y += (ring->unk30 * SIN(sinVal)) >> 22;
|
||||
ring->s.x += (ring->radius * COS(sinVal)) >> 22;
|
||||
ring->s.y += (ring->radius * SIN(sinVal)) >> 22;
|
||||
|
||||
ringY = ring->s.y;
|
||||
ringX = ring->s.x;
|
||||
|
||||
@@ -21,7 +21,7 @@ typedef struct {
|
||||
/* 0x30 */ Sprite s2;
|
||||
/* 0x60 */ u16 unk60;
|
||||
/* 0x62 */ u8 cursor;
|
||||
/* 0x63 */ u8 unk63; // bitarray
|
||||
/* 0x63 */ u8 flags; // bitarray
|
||||
/* 0x64 */ u16 pal64[0x3];
|
||||
/* 0x64 */ u16 pal6A[0x3];
|
||||
} PauseMenu; /* size: 0x70 */
|
||||
@@ -65,9 +65,9 @@ void CreatePauseMenu(void)
|
||||
pm->cursor = PMCURSOR_CONTINUE;
|
||||
|
||||
if (gInput & A_BUTTON) {
|
||||
pm->unk63 = PMFLAG_HOLDING_A_BUTTON_SINCE_CREATION;
|
||||
pm->flags = PMFLAG_HOLDING_A_BUTTON_SINCE_CREATION;
|
||||
} else {
|
||||
pm->unk63 = PMFLAG_A_BUTTON_RELEASED;
|
||||
pm->flags = PMFLAG_A_BUTTON_RELEASED;
|
||||
}
|
||||
|
||||
s->graphics.dest = vramTiles;
|
||||
@@ -96,8 +96,8 @@ void Task_PauseMenuUpdate(void)
|
||||
PauseMenu *pm = TASK_DATA(gCurTask);
|
||||
|
||||
/* Handle A-/B-Button */
|
||||
if ((gReleasedKeys & A_BUTTON) && (pm->unk63 & PMFLAG_HOLDING_A_BUTTON_SINCE_CREATION)) {
|
||||
pm->unk63 = PMFLAG_A_BUTTON_RELEASED;
|
||||
if ((gReleasedKeys & A_BUTTON) && (pm->flags & PMFLAG_HOLDING_A_BUTTON_SINCE_CREATION)) {
|
||||
pm->flags = PMFLAG_A_BUTTON_RELEASED;
|
||||
} else if ((gPressedKeys & START_BUTTON) || ((pm->cursor == PMCURSOR_CONTINUE) && (gReleasedKeys & A_BUTTON))
|
||||
|| ((gGameMode != GAME_MODE_SINGLE_PLAYER) && (gPressedKeys & B_BUTTON))) {
|
||||
// Close the Pause Menu
|
||||
|
||||
@@ -24,7 +24,7 @@ typedef struct {
|
||||
} RingsManager;
|
||||
|
||||
void Task_RingsMgrMain(void);
|
||||
void TaskDestructor_8007F1C(struct Task *);
|
||||
void TaskDestructor_RingsMgr(struct Task *);
|
||||
|
||||
// TODO: combine these macros with `ring.c`
|
||||
|
||||
@@ -90,7 +90,7 @@ void CreateStageRingsManager(void)
|
||||
u32 dataSize;
|
||||
|
||||
if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) {
|
||||
t = TaskCreate(Task_RingsMgrMain, sizeof(RingsManager), 0x2000, 0, TaskDestructor_8007F1C);
|
||||
t = TaskCreate(Task_RingsMgrMain, sizeof(RingsManager), 0x2000, 0, TaskDestructor_RingsMgr);
|
||||
|
||||
compressedRingPosData = gSpritePosData_rings[gCurrentLevel];
|
||||
dataSize = (*(u32 *)compressedRingPosData) >> 8;
|
||||
@@ -436,7 +436,7 @@ NONMATCH("asm/non_matching/game/stage/Task_RingsMgrMain.inc", void Task_RingsMgr
|
||||
}
|
||||
END_NONMATCH
|
||||
|
||||
void TaskDestructor_8007F1C(struct Task *t)
|
||||
void TaskDestructor_RingsMgr(struct Task *t)
|
||||
{
|
||||
void *rings = *(void **)(TASK_DATA(t) + offsetof(RingsManager, rings));
|
||||
EwramFree(rings);
|
||||
|
||||
+9
-9
@@ -13,16 +13,16 @@ typedef struct {
|
||||
/* 0x3A */ s16 speedY;
|
||||
/* 0x3C */ s16 accX;
|
||||
/* 0x3E */ s16 accY;
|
||||
/* 0x40 */ u16 unk40;
|
||||
/* 0x40 */ u16 lifeTime;
|
||||
} Sprite_StageSprUnknown;
|
||||
|
||||
void sub_800A5F8(void);
|
||||
void Task_SimpleSpriteParticleMain(void);
|
||||
|
||||
// Seems to create the given animation on the screen in a fixed position
|
||||
// and despawns once it leaves player range?
|
||||
struct Task *sub_800A544(u16 taskPrio, void *vramTiles, AnimId anim, u8 variant, TaskDestructor dtor)
|
||||
struct Task *CreateSimpleSpriteParticle(u16 taskPrio, void *vramTiles, AnimId anim, u8 variant, TaskDestructor dtor)
|
||||
{
|
||||
struct Task *t = TaskCreate(sub_800A5F8, sizeof(Sprite_StageSprUnknown), taskPrio, 0, dtor);
|
||||
struct Task *t = TaskCreate(Task_SimpleSpriteParticleMain, sizeof(Sprite_StageSprUnknown), taskPrio, 0, dtor);
|
||||
|
||||
Sprite_StageSprUnknown *su = TASK_DATA(t);
|
||||
su->x = 0;
|
||||
@@ -31,7 +31,7 @@ struct Task *sub_800A544(u16 taskPrio, void *vramTiles, AnimId anim, u8 variant,
|
||||
su->speedY = 0;
|
||||
su->accX = 0;
|
||||
su->accY = 0;
|
||||
su->unk40 = 0;
|
||||
su->lifeTime = 0;
|
||||
|
||||
su->s.x = 0;
|
||||
su->s.y = 0;
|
||||
@@ -51,7 +51,7 @@ struct Task *sub_800A544(u16 taskPrio, void *vramTiles, AnimId anim, u8 variant,
|
||||
return t;
|
||||
}
|
||||
|
||||
void sub_800A5F8(void)
|
||||
void Task_SimpleSpriteParticleMain(void)
|
||||
{
|
||||
Sprite_StageSprUnknown *su = TASK_DATA(gCurTask);
|
||||
su->speedX += su->accX;
|
||||
@@ -63,13 +63,13 @@ void sub_800A5F8(void)
|
||||
su->s.x = I(su->x) - gCamera.x;
|
||||
su->s.y = I(su->y) - gCamera.y;
|
||||
|
||||
if (su->unk40 != 0) {
|
||||
su->unk40--;
|
||||
if (su->lifeTime != 0) {
|
||||
su->lifeTime--;
|
||||
}
|
||||
|
||||
if (((u16)(su->s.x + 32) > (DISPLAY_WIDTH + 2 * 32)) || (((su->s.y - 32) > DISPLAY_HEIGHT))) {
|
||||
TaskDestroy(gCurTask);
|
||||
} else if (UpdateSpriteAnimation(&su->s) == 0 && su->unk40 == 0) {
|
||||
} else if (UpdateSpriteAnimation(&su->s) == 0 && su->lifeTime == 0) {
|
||||
TaskDestroy(gCurTask);
|
||||
} else {
|
||||
DisplaySprite(&su->s);
|
||||
+254
-254
File diff suppressed because it is too large.
Load diff
@@ -79,26 +79,26 @@ static void SuperSonicInitPlayer(void)
|
||||
p->timerInvulnerability = 0;
|
||||
p->timerInvincibility = 0;
|
||||
p->timerSpeedup = 0;
|
||||
p->unk32 = 0;
|
||||
p->unk34 = 0;
|
||||
p->unk36 = 0;
|
||||
p->confusionTimer = 0;
|
||||
p->itemEffect20Timer = 0;
|
||||
p->disableTrickTimer = 0;
|
||||
p->itemEffect = 0;
|
||||
p->layer = 0;
|
||||
p->unk3C = NULL;
|
||||
p->unk40 = 0;
|
||||
p->unk44 = 0;
|
||||
p->unk48 = 0;
|
||||
p->unk4C = 0;
|
||||
p->unk50 = 0;
|
||||
p->unk52 = 0;
|
||||
p->unk54 = 0;
|
||||
p->stoodObj = NULL;
|
||||
p->maxSpeed = 0;
|
||||
p->topSpeed = 0;
|
||||
p->acceleration = 0;
|
||||
p->deceleration = 0;
|
||||
p->rollingDeceleration = 0;
|
||||
p->boostThreshold = 0;
|
||||
p->walkAnim = 0;
|
||||
p->unk56 = 0;
|
||||
p->unk58 = 0;
|
||||
p->boostSpeed = 0;
|
||||
p->isBoosting = FALSE;
|
||||
p->unk5B = 0;
|
||||
p->trickDir = 0;
|
||||
p->heldInput = 0;
|
||||
p->frameInput = 0;
|
||||
p->unk60 = 0;
|
||||
p->playerID = 0;
|
||||
p->unk61 = 0;
|
||||
p->unk62 = 0;
|
||||
p->unk63 = 0;
|
||||
|
||||
@@ -1,36 +1,219 @@
|
||||
#include "global.h"
|
||||
#include "constants/zones.h"
|
||||
|
||||
ALIGNED(4)
|
||||
const s16 gSpawnPositions[][2] = {
|
||||
{ 96, 655 }, { 96, 750 }, { 576, 175 }, { 32, 150 }, // Zone 1
|
||||
{ 96, 321 }, { 96, 321 }, { 96, 177 }, { 0, 0 }, // Zone 2
|
||||
{ 96, 465 }, { 96, 369 }, { 356, 177 }, { 0, 0 }, // Zone 3
|
||||
{ 96, 273 }, { 96, 1041 }, { 356, 177 }, { 0, 0 }, // Zone 4
|
||||
{ 96, 3921 }, { 96, 3441 }, { 96, 180 }, { 0, 0 }, // Zone 5
|
||||
{ 96, 1425 }, { 96, 2097 }, { 480, 177 }, { 0, 0 }, // Zone 6
|
||||
{ 96, 561 }, { 96, 273 }, { 96, 177 }, { 0, 0 }, // Zone 7
|
||||
{ 576, 177 }, { 96, 96 }, { 0, 0 }, { 0, 0 }, // Extra Zone
|
||||
{ 0, 0 }, { 0, 0 },
|
||||
// Zone 1
|
||||
[LEVEL_INDEX(ZONE_1, ACT_1)] = { 96, 655 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_2)] = { 96, 750 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_BOSS)] = { 576, 175 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_UNUSED)] = { 32, 150 },
|
||||
|
||||
// Zone 2
|
||||
[LEVEL_INDEX(ZONE_2, ACT_1)] = { 96, 321 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_2)] = { 96, 321 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_BOSS)] = { 96, 177 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 3
|
||||
[LEVEL_INDEX(ZONE_3, ACT_1)] = { 96, 465 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_2)] = { 96, 369 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_BOSS)] = { 356, 177 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 4
|
||||
[LEVEL_INDEX(ZONE_4, ACT_1)] = { 96, 273 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_2)] = { 96, 1041 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_BOSS)] = { 356, 177 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 5
|
||||
[LEVEL_INDEX(ZONE_5, ACT_1)] = { 96, 3921 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_2)] = { 96, 3441 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_BOSS)] = { 96, 180 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 6
|
||||
[LEVEL_INDEX(ZONE_6, ACT_1)] = { 96, 1425 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_2)] = { 96, 2097 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_BOSS)] = { 480, 177 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 7
|
||||
[LEVEL_INDEX(ZONE_7, ACT_1)] = { 96, 561 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_2)] = { 96, 273 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_BOSS)] = { 96, 177 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Extra Zone
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_XX_FINAL_ZONE)] = { 576, 177 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53)] = { 96, 96 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_BOSS)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Unused
|
||||
[LEVEL_INDEX(ZONE_UNUSED, ACT_1)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_UNUSED, ACT_2)] = { 0, 0 },
|
||||
};
|
||||
|
||||
const u32 gUnknown_080D63FC[][2] = {
|
||||
{ 8882, 1809 }, { 8206, 1233 }, { 0, 0 }, { 0, 0 }, { 14618, 2577 }, { 11065, 2769 }, { 0, 0 },
|
||||
{ 0, 0 }, { 13645, 3105 }, { 13450, 1953 }, { 0, 0 }, { 0, 0 }, { 11952, 2289 }, { 10320, 1474 },
|
||||
{ 0, 0 }, { 0, 0 }, { 5784, 2673 }, { 10296, 1713 }, { 0, 0 }, { 0, 0 }, { 14064, 1809 },
|
||||
{ 11280, 1041 }, { 0, 0 }, { 0, 0 }, { 20667, 3489 }, { 18456, 3441 }, { 0, 0 }, { 0, 0 },
|
||||
{ 96, 849 }, { 96, 96 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
|
||||
const Vec2_32 gCheckpointPositions[] = {
|
||||
// Zone 1
|
||||
[LEVEL_INDEX(ZONE_1, ACT_1)] = { 8882, 1809 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_2)] = { 8206, 1233 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_BOSS)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 2
|
||||
[LEVEL_INDEX(ZONE_2, ACT_1)] = { 14618, 2577 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_2)] = { 11065, 2769 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_BOSS)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 3
|
||||
[LEVEL_INDEX(ZONE_3, ACT_1)] = { 13645, 3105 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_2)] = { 13450, 1953 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_BOSS)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 4
|
||||
[LEVEL_INDEX(ZONE_4, ACT_1)] = { 11952, 2289 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_2)] = { 10320, 1474 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_BOSS)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 5
|
||||
[LEVEL_INDEX(ZONE_5, ACT_1)] = { 5784, 2673 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_2)] = { 10296, 1713 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_BOSS)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 6
|
||||
[LEVEL_INDEX(ZONE_6, ACT_1)] = { 14064, 1809 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_2)] = { 11280, 1041 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_BOSS)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 7
|
||||
[LEVEL_INDEX(ZONE_7, ACT_1)] = { 20667, 3489 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_2)] = { 18456, 3441 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_BOSS)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Extra Zone
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_XX_FINAL_ZONE)] = { 96, 849 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53)] = { 96, 96 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_BOSS)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Unused
|
||||
[LEVEL_INDEX(ZONE_UNUSED, ACT_1)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_UNUSED, ACT_2)] = { 0, 0 },
|
||||
};
|
||||
|
||||
const Vec2_32 gUnknown_080D650C[] = {
|
||||
{ 19488, -1 }, { 18816, -1 }, { 5376, -1 }, { -1, -1 }, { 27073, -1 }, { 24193, -1 }, { 6816, -1 }, { -1, -1 }, { 24961, -1 },
|
||||
{ 26401, -1 }, { 3552, -1 }, { -1, -1 }, { 27552, -1 }, { 21312, -1 }, { 4416, -1 }, { -1, -1 }, { 16224, -1 }, { 20064, -1 },
|
||||
{ 5376, -1 }, { -1, -1 }, { 29760, -1 }, { 21120, -1 }, { 8258, -1 }, { -1, -1 }, { 33505, -1 }, { 32449, -1 }, { 4512, -1 },
|
||||
{ -1, -1 }, { -1, -1 }, { 8000, -1 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
|
||||
// Zone 1
|
||||
[LEVEL_INDEX(ZONE_1, ACT_1)] = { 19488, -1 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_2)] = { 18816, -1 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_BOSS)] = { 5376, -1 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_UNUSED)] = { -1, -1 },
|
||||
|
||||
// Zone 2
|
||||
[LEVEL_INDEX(ZONE_2, ACT_1)] = { 27073, -1 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_2)] = { 24193, -1 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_BOSS)] = { 6816, -1 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_UNUSED)] = { -1, -1 },
|
||||
|
||||
// Zone 3
|
||||
[LEVEL_INDEX(ZONE_3, ACT_1)] = { 24961, -1 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_2)] = { 26401, -1 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_BOSS)] = { 3552, -1 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_UNUSED)] = { -1, -1 },
|
||||
|
||||
// Zone 4
|
||||
[LEVEL_INDEX(ZONE_4, ACT_1)] = { 27552, -1 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_2)] = { 21312, -1 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_BOSS)] = { 4416, -1 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_UNUSED)] = { -1, -1 },
|
||||
|
||||
// Zone 5
|
||||
[LEVEL_INDEX(ZONE_5, ACT_1)] = { 16224, -1 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_2)] = { 20064, -1 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_BOSS)] = { 5376, -1 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_UNUSED)] = { -1, -1 },
|
||||
|
||||
// Zone 6
|
||||
[LEVEL_INDEX(ZONE_6, ACT_1)] = { 29760, -1 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_2)] = { 21120, -1 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_BOSS)] = { 8258, -1 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_UNUSED)] = { -1, -1 },
|
||||
|
||||
// Zone 7
|
||||
[LEVEL_INDEX(ZONE_7, ACT_1)] = { 33505, -1 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_2)] = { 32449, -1 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_BOSS)] = { 4512, -1 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_UNUSED)] = { -1, -1 },
|
||||
|
||||
// Extra Zone
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_XX_FINAL_ZONE)] = { -1, -1 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53)] = { 8000, -1 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_BOSS)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Unused
|
||||
[LEVEL_INDEX(ZONE_UNUSED, ACT_2)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_UNUSED, ACT_1)] = { 0, 0 },
|
||||
};
|
||||
|
||||
const Vec2_32 gUnknown_080D661C[] = {
|
||||
{ -960, 0 }, { -960, 0 }, { -4512, 0 }, { 0, 0 }, { -960, 0 }, { -960, 0 }, { -5952, 0 }, { 0, 0 }, { -960, 0 },
|
||||
{ -959, 0 }, { -2688, 0 }, { 0, 0 }, { -960, 0 }, { -960, 0 }, { -3552, 0 }, { 0, 0 }, { -960, 0 }, { -960, 0 },
|
||||
{ -4512, 0 }, { 0, 0 }, { -960, 0 }, { -960, 0 }, { -7394, 0 }, { 0, 0 }, { -960, 0 }, { -960, 0 }, { -3648, 0 },
|
||||
{ 0, 0 }, { 0, 0 }, { -6000, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
|
||||
// Zone 1
|
||||
[LEVEL_INDEX(ZONE_1, ACT_1)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_2)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_BOSS)] = { -4512, 0 },
|
||||
[LEVEL_INDEX(ZONE_1, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 2
|
||||
[LEVEL_INDEX(ZONE_2, ACT_1)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_2)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_BOSS)] = { -5952, 0 },
|
||||
[LEVEL_INDEX(ZONE_2, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 3
|
||||
[LEVEL_INDEX(ZONE_3, ACT_1)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_2)] = { -959, 0 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_BOSS)] = { -2688, 0 },
|
||||
[LEVEL_INDEX(ZONE_3, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 4
|
||||
[LEVEL_INDEX(ZONE_4, ACT_1)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_2)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_BOSS)] = { -3552, 0 },
|
||||
[LEVEL_INDEX(ZONE_4, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 5
|
||||
[LEVEL_INDEX(ZONE_5, ACT_1)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_2)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_BOSS)] = { -4512, 0 },
|
||||
[LEVEL_INDEX(ZONE_5, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 6
|
||||
[LEVEL_INDEX(ZONE_6, ACT_1)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_2)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_BOSS)] = { -7394, 0 },
|
||||
[LEVEL_INDEX(ZONE_6, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Zone 7
|
||||
[LEVEL_INDEX(ZONE_7, ACT_1)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_2)] = { -960, 0 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_BOSS)] = { -3648, 0 },
|
||||
[LEVEL_INDEX(ZONE_7, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Extra Zone
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_XX_FINAL_ZONE)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53)] = { -6000, 0 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_BOSS)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_FINAL, ACT_UNUSED)] = { 0, 0 },
|
||||
|
||||
// Unused
|
||||
[LEVEL_INDEX(ZONE_UNUSED, ACT_1)] = { 0, 0 },
|
||||
[LEVEL_INDEX(ZONE_UNUSED, ACT_2)] = { 0, 0 },
|
||||
};
|
||||
@@ -31,6 +31,8 @@
|
||||
#include "constants/songs.h"
|
||||
#include "constants/zones.h"
|
||||
|
||||
#include "game/multiplayer/multiplayer_event_mgr.h"
|
||||
|
||||
struct Task *gGameStageTask = NULL;
|
||||
|
||||
void Task_GameStage(void);
|
||||
@@ -47,10 +49,6 @@ void SetupStageIntro(void);
|
||||
|
||||
void CreateStageWaterTask(u32, u32, u32);
|
||||
|
||||
void sub_8019120(void);
|
||||
|
||||
void sub_80191A4(void);
|
||||
|
||||
void StageInit_Zone1Act1(void);
|
||||
void StageInit_Zone3Act1(void);
|
||||
void StageInit_Zone3Act2(void);
|
||||
@@ -253,8 +251,8 @@ void CreateGameStage(void)
|
||||
gUnknown_03005398 = 0x80;
|
||||
|
||||
if (IS_MULTI_PLAYER) {
|
||||
sub_80191A4();
|
||||
sub_8019120();
|
||||
CreateMultiplayerRecieveEventMgr();
|
||||
CreateMultiplayerSendEventMgr();
|
||||
|
||||
gRandomItemBox = 0;
|
||||
|
||||
@@ -389,7 +387,7 @@ void Task_GameStage(void)
|
||||
|
||||
gPlayer.itemEffect = 0;
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_40) {
|
||||
if (gPlayer.moveState & MOVESTATE_IN_WATER) {
|
||||
gPlayer.speedAirY = -Q(2.625);
|
||||
} else {
|
||||
gPlayer.speedAirY = -Q(4.875);
|
||||
@@ -419,7 +417,7 @@ void Task_GameStage(void)
|
||||
|
||||
gPlayer.itemEffect = 0;
|
||||
|
||||
if (gPlayer.moveState & MOVESTATE_40) {
|
||||
if (gPlayer.moveState & MOVESTATE_IN_WATER) {
|
||||
gPlayer.speedAirY = -Q(2.625);
|
||||
} else {
|
||||
gPlayer.speedAirY = -Q(4.875);
|
||||
|
||||
@@ -81,7 +81,7 @@ struct Task *SpawnDrowningCountdownNum(Player *p, s32 countdown)
|
||||
ts->unk8 = 0;
|
||||
ts->unkA = 0x120;
|
||||
ts->unk10 = 0;
|
||||
ts->mpPlayerID = p->unk60;
|
||||
ts->mpPlayerID = p->playerID;
|
||||
|
||||
s = &ts->s;
|
||||
s->graphics.dest = VramMalloc(4);
|
||||
|
||||
@@ -187,7 +187,7 @@ static void Task_StageWaterTask(void)
|
||||
}
|
||||
|
||||
if (water->isActive != TRUE) {
|
||||
gFlags &= ~MOVESTATE_40;
|
||||
gFlags &= ~MOVESTATE_IN_WATER;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user