Skip to content

Commit

Permalink
Match Task_ActRingMain
Browse files Browse the repository at this point in the history
  • Loading branch information
JaceCear committed Jul 16, 2024
1 parent bf065a8 commit 21a855d
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 216 deletions.
214 changes: 1 addition & 213 deletions asm/ia_act_ring.s
Original file line number Diff line number Diff line change
Expand Up @@ -5,219 +5,7 @@
.syntax unified
.arm

.if 01
thumb_func_start Task_ActRingMain
Task_ActRingMain: @ 0x08040984
push {r4, r5, r6, r7, lr}
mov r7, r8
push {r7}
sub sp, #8
ldr r6, _08040A6C @ =gStageData
ldrb r2, [r6, #6]
lsls r0, r2, #2
adds r0, r0, r2
lsls r0, r0, #2
adds r0, r0, r2
lsls r0, r0, #4
ldr r1, _08040A70 @ =gPlayers
mov r8, r1
adds r4, r0, r1
ldr r0, _08040A74 @ =gCurTask
ldr r0, [r0]
ldrh r5, [r0, #6]
movs r0, #0xc0
lsls r0, r0, #0x12
adds r3, r5, r0
ldr r1, [r4]
ldr r0, _08040A78 @ =Player_80052C8
cmp r1, r0
beq _08040A98
ldr r0, _08040A7C @ =Player_800522C
cmp r1, r0
beq _08040A98
ldr r0, [r4, #4]
ldr r1, _08040A80 @ =0x01000300
ands r0, r1
cmp r0, #0
beq _080409C6
b _08040B24
_080409C6:
adds r3, r2, #0
cmp r3, #0
beq _080409CE
b _08040B24
_080409CE:
ldr r2, _08040A84 @ =0x0300000C
adds r0, r5, r2
ldr r7, _08040A88 @ =0x0300005C
adds r1, r5, r7
adds r7, #2
adds r2, r5, r7
movs r7, #0
ldrsh r1, [r1, r7]
movs r7, #0
ldrsh r2, [r2, r7]
str r4, [sp]
str r3, [sp, #4]
movs r3, #0
bl sub_8020700
cmp r0, #0
bne _080409F2
b _08040B24
_080409F2:
adds r0, r4, #0
bl sub_8016F28
adds r0, r4, #0
bl sub_8019A64
ldr r1, _08040A8C @ =0x00000209
adds r0, r4, #0
bl sub_8004E98
ldrb r1, [r6, #9]
lsls r0, r1, #2
adds r0, r0, r1
ldr r2, _08040A90 @ =0x03000061
adds r1, r5, r2
lsls r0, r0, #1
ldrb r1, [r1]
adds r0, r0, r1
adds r0, #3
movs r1, #0
strh r0, [r6, #0x12]
strb r1, [r6, #0xc]
ldr r5, _08040A94 @ =Player_800AD24
adds r0, r4, #0
adds r1, r5, #0
bl SetPlayerCallback
adds r0, r4, #0
adds r0, #0x2b
ldrb r1, [r0]
lsls r1, r1, #0x1e
lsrs r1, r1, #0x1e
lsls r0, r1, #2
adds r0, r0, r1
lsls r0, r0, #2
adds r0, r0, r1
lsls r0, r0, #4
mov r7, r8
adds r2, r0, r7
adds r0, r2, #0
adds r0, #0x2b
ldrb r1, [r0]
movs r0, #0x1c
ands r0, r1
cmp r0, #8
bne _08040A56
adds r0, r2, #0
adds r1, r5, #0
bl SetPlayerCallback
_08040A56:
ldrb r0, [r6, #3]
cmp r0, #4
bls _08040A66
ldrb r0, [r6, #0x12]
ldrb r2, [r6, #0xc]
movs r1, #0
bl sub_80275B8
_08040A66:
movs r0, #8
strb r0, [r6, #4]
b _08040B24
.align 2, 0
_08040A6C: .4byte gStageData
_08040A70: .4byte gPlayers
_08040A74: .4byte gCurTask
_08040A78: .4byte Player_80052C8
_08040A7C: .4byte Player_800522C
_08040A80: .4byte 0x01000300
_08040A84: .4byte 0x0300000C
_08040A88: .4byte 0x0300005C
_08040A8C: .4byte 0x00000209
_08040A90: .4byte 0x03000061
_08040A94: .4byte Player_800AD24
_08040A98:
movs r1, #0
ldr r6, _08040AAC @ =gStageData
ldr r5, _08040AB0 @ =gPlayers
_08040A9E:
lsls r0, r1, #0x10
adds r2, r0, #0
cmp r2, #0
bne _08040AB4
ldrb r1, [r6, #6]
b _08040ABE
.align 2, 0
_08040AAC: .4byte gStageData
_08040AB0: .4byte gPlayers
_08040AB4:
adds r0, r4, #0
adds r0, #0x2b
ldrb r1, [r0]
lsls r1, r1, #0x1e
lsrs r1, r1, #0x1e
_08040ABE:
lsls r0, r1, #2
adds r0, r0, r1
lsls r0, r0, #2
adds r0, r0, r1
lsls r0, r0, #4
adds r4, r0, r5
adds r0, r4, #0
adds r0, #0x2b
ldrb r0, [r0]
movs r1, #0x1c
ands r1, r0
cmp r1, #4
beq _08040AE0
cmp r1, #8
beq _08040AE0
cmp r1, #0x10
bne _08040B16
_08040AE0:
ldrb r1, [r6, #0xb]
adds r0, r3, #0
adds r0, #0x61
ldrb r0, [r0]
adds r0, #1
cmp r1, r0
bne _08040B16
adds r0, r3, #0
adds r0, #0x62
ldrb r0, [r0]
cmp r0, #0
beq _08040B06
movs r0, #0xfc
lsls r0, r0, #8
strh r0, [r4, #0x18]
ldr r0, [r4, #4]
movs r1, #1
orrs r0, r1
b _08040B14
_08040B06:
movs r0, #0x80
lsls r0, r0, #3
strh r0, [r4, #0x18]
ldr r0, [r4, #4]
movs r1, #2
rsbs r1, r1, #0
ands r0, r1
_08040B14:
str r0, [r4, #4]
_08040B16:
movs r1, #0x80
lsls r1, r1, #9
adds r0, r2, r1
lsrs r1, r0, #0x10
asrs r0, r0, #0x10
cmp r0, #1
ble _08040A9E
_08040B24:
bl sub_8040BE4
add sp, #8
pop {r3}
mov r8, r3
pop {r4, r5, r6, r7}
pop {r0}
bx r0
.if 0
.endif

thumb_func_start sub_8040B34
Expand Down
2 changes: 2 additions & 0 deletions include/game/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ extern const AnimId gPlayerCharacterIdleAnims[NUM_CHARACTERS];
((mode == GAME_MODE_SINGLE_PLAYER) || (mode == GAME_MODE_DEMO) || (mode == GAME_MODE_2) || (mode == GAME_MODE_TIME_ATTACK) \
|| (mode == GAME_MODE_BOSS_TIME_ATTACK))

#define GAME_MODE_IS_MULTI_PLAYER(mode) !GAME_MODE_IS_SINGLE_PLAYER(mode)

#define INCREMENT_SCORE_A(incVal) \
{ \
s32 divResA, divResB; \
Expand Down
2 changes: 1 addition & 1 deletion include/global.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ typedef void (*VoidFn)(void);

#define RECT_DISTANCE(aXA, aYA, aXB, aYB) (ABS((aXA) - (aXB)) + ABS((aYA) - (aYB)))

#define GetBit(x, y) ((x) >> (y)&1)
#define GetBit(x, y) (((x) >> (y)) & 1)

// 60 is not exactly true as the GBA's FPS, but it's what they went
// with for the calculation
Expand Down
70 changes: 68 additions & 2 deletions src/game/interactables/act_ring.c
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
#include "global.h"
#include "module_unclear.h"
#include "task.h"
#include "game/game.h"
#include "game/camera.h"
#include "game/entity.h"
#include "game/player.h"
#include "game/player_callbacks.h"
#include "game/save.h"
#include "game/stage.h"

#include "constants/move_states.h"
#include "constants/songs.h"

typedef struct {
/* 0x00 */ SpriteBase base;
/* 0x0C */ Sprite s0;
Expand All @@ -22,6 +27,7 @@ typedef struct {
void Task_ActRingMain(void);
void TaskDestructor_ActRing(struct Task *);
void sub_8040B34(ActRing *);
void sub_8040BE4(void);

void CreateEntity_ActRing(MapEntity *me, u16 regionX, u16 regionY, u8 id)
{
Expand All @@ -36,7 +42,7 @@ void CreateEntity_ActRing(MapEntity *me, u16 regionX, u16 regionY, u8 id)
ring->base.id = id;

for (act = 0; act < 3; act++) {
if ((me->d.uData[4] >> act) & 0x1) {
if (GetBit(me->d.uData[4], act)) {
break;
}
}
Expand All @@ -46,7 +52,7 @@ void CreateEntity_ActRing(MapEntity *me, u16 regionX, u16 regionY, u8 id)
ring->act = act;
ring->unk60 = 0;
ring->unk62 = me->d.uData[4] >> 7;
ring->unk63 = ((gSaveGame.unlockedStages[gStageData.zone] >> act) & 0x1);
ring->unk63 = GetBit(gSaveGame.unlockedStages[gStageData.zone], act);

{
Sprite *s = &ring->s0;
Expand All @@ -58,3 +64,63 @@ void CreateEntity_ActRing(MapEntity *me, u16 regionX, u16 regionY, u8 id)

sub_8040B34(ring);
}

void Task_ActRingMain(void)
{
Player *p = &gPlayers[gStageData.charId];
ActRing *ring = TASK_DATA(gCurTask);
Player *partner;
s16 i;

if ((p->callback != Player_80052C8) && (p->callback != Player_800522C)) {
if (!(p->moveState & (MOVESTATE_1000000 | MOVESTATE_200 | MOVESTATE_100)) && (gStageData.charId == CHARACTER_SONIC)) {
Sprite *s = &ring->s0;
s16 worldX = ring->worldX;
s16 worldY = ring->worldY;
if (sub_8020700(s, worldX, worldY, 0, p, 0)) {
sub_8016F28(p);
sub_8019A64(p);
sub_8004E98(p, SE_BIG_WARP_RING);

gStageData.nextMapIndex = (gStageData.zone * 10) + ring->act + 3;
gStageData.unkC = 0;

SetPlayerCallback(p, (void *)Player_800AD24);

partner = &gPlayers[p->charFlags.partnerIndex];

if (partner->charFlags.someIndex == 2) {
SetPlayerCallback(partner, (void *)Player_800AD24);
}

if (GAME_MODE_IS_MULTI_PLAYER(gStageData.gameMode)) {
sub_80275B8((u8)gStageData.nextMapIndex, 0, gStageData.unkC);
}

gStageData.unk4 = 8;
}
}
} else {
for (i = 0; i < NUM_SINGLE_PLAYER_CHARS; i++) {
if (i == 0) {
p = &gPlayers[gStageData.charId];
} else {
p = &gPlayers[p->charFlags.partnerIndex];
}

if ((p->charFlags.someIndex == 1) || (p->charFlags.someIndex == 2) || (p->charFlags.someIndex == 4)) {
if (gStageData.entryIndex == (ring->act + 1)) {
if (ring->unk62 != 0) {
p->qSpeedAirX = -Q(4);
p->moveState |= MOVESTATE_FACING_LEFT;
} else {
p->qSpeedAirX = +Q(4);
p->moveState &= ~MOVESTATE_FACING_LEFT;
}
}
}
}
}

sub_8040BE4();
}

0 comments on commit 21a855d

Please sign in to comment.