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:
Fractal authored and GitHub committed 2025-01-21 13:08:31 +00:00
1 parent c4cc962619
commit c4b50f9bb1
81 files changed
+1665 -1396

No files matched your search

+7 -5
View File
@@ -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
+6 -5
View File
@@ -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
+33 -33
View File
@@ -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
+6 -6
View File
@@ -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
+14
View File
@@ -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
+1 -1
View File
@@ -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
-20
View File
@@ -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
-19
View File
@@ -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
+1 -1
View File
@@ -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
+13 -14
View File
@@ -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
+15 -17
View File
@@ -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;
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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[];
-11
View File
@@ -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
View File
@@ -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);
+24 -24
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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;
+2 -2
View File
@@ -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
View File
@@ -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;
+6 -6
View File
@@ -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);
+4 -4
View File
@@ -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;
}
}
+8 -8
View File
@@ -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);
}
+1 -1
View File
@@ -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) {
+19 -19
View File
@@ -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)
+6 -6
View File
@@ -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;
+14 -14
View File
@@ -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;
+2 -2
View File
@@ -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;
+1 -1
View File
@@ -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
View File
@@ -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;
+1 -1
View File
@@ -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);
+20 -19
View File
@@ -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);
+1 -1
View File
@@ -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;
+2 -2
View File
@@ -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 == &noteBlock->s) {
gPlayer.unk3C = NULL;
gPlayer.moveState &= ~MOVESTATE_8;
if (gPlayer.stoodObj == &noteBlock->s) {
gPlayer.stoodObj = NULL;
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
}
return TRUE;
+2 -1
View File
@@ -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;
+76 -76
View File
@@ -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;
@@ -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;
}
@@ -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
View File
@@ -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
View File
@@ -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;
}
+53 -53
View File
@@ -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);
+2 -2
View File
@@ -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,
+4 -3
View File
@@ -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;
+4 -4
View File
@@ -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();
+122 -122
View File
@@ -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;
+8 -8
View File
@@ -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;
}
}
}
+11 -11
View File
@@ -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
View File
@@ -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;
}
+5 -5
View File
@@ -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;
+5 -5
View File
@@ -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
+3 -3
View File
@@ -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);
@@ -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
View File
File diff suppressed because it is too large. Load diff
+14 -14
View File
@@ -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;
+206 -23
View File
@@ -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 },
};
+6 -8
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -187,7 +187,7 @@ static void Task_StageWaterTask(void)
}
if (water->isActive != TRUE) {
gFlags &= ~MOVESTATE_40;
gFlags &= ~MOVESTATE_IN_WATER;
return;
}