more special stage docs and data extract

This commit is contained in:
Oliver Bell committed 2022-11-06 22:10:00 +00:00
1 parent 89a7638cea
commit dcc5e738fe
19 files changed
+455 -209

No files matched your search

+2 -2
View File
@@ -20,6 +20,6 @@ gUnknown_080DF9A0:
gUnknown_080DF9D8:
.incbin "baserom.gba", 0x000DF9D8, 0x2A
.global gUnknown_080DFA02
gUnknown_080DFA02:
.global gSpecialStageLevelTimes
gSpecialStageLevelTimes:
.incbin "baserom.gba", 0x000DFA02, 0xE
-17
View File
@@ -1,17 +0,0 @@
.section .rodata
.global gUnknown_080DF2F8
gUnknown_080DF2F8:
.incbin "baserom.gba", 0x000DF2F8, 0x370
.global gUnknown_080DF668
gUnknown_080DF668:
.incbin "baserom.gba", 0x000DF668, 0x8
.global gUnknown_080DF670
gUnknown_080DF670:
.incbin "baserom.gba", 0x000DF670, 0x14
.global gUnknown_080DF684
gUnknown_080DF684:
.incbin "baserom.gba", 0x000DF684, 0x48
+5 -15
View File
@@ -34,10 +34,10 @@ struct SpecialStage {
u16 unk5A0;
s16 unk5A2;
s16 unk5A4;
s16 elapsedTime;
// time
s16 unk5A6;
s16 levelTime;
s32 unk5A8;
s32 unk5AC;
@@ -45,13 +45,11 @@ struct SpecialStage {
u16 unk5B4;
// character
u8 unk5B6;
u8 character;
u8 unk5B7;
// level
u8 unk5B8;
u8 level;
u8 unk5B9;
u8 unk5BA;
@@ -122,14 +120,6 @@ struct UNK_806CB84 {
s16 unk12;
};
struct UNK_80DF670 {
u16 unk0;
u16 unk2;
u16 unk4;
u8 unk6;
u8 unk7;
} /* size 0x8 */;
void sub_806BA84(s16, s16);
#endif
+9
View File
@@ -20,6 +20,15 @@ struct UNK_8C87904 {
s16 unkA;
} /* size 0xC */;
struct UNK_80DF670 {
u16 unk0;
u16 unk2;
u16 unk4;
u8 unk6;
u8 unk7;
} /* size 0x8 */;
extern const struct UNK_80DF670 gUnknown_080DF2F8[];
/* This is at the end of the rom */
extern const struct UNK_8C878E8** const gUnknown_08C878E8[7];
+3
View File
@@ -5,6 +5,7 @@
#include "global.h"
#include "task.h"
#include "special_stage.h"
#include "special_stage_data.h"
struct SpecialStageGamma {
struct SpecialStage* stage;
@@ -27,4 +28,6 @@ struct SpecialStageGamma {
struct Task* CreateGamma(struct SpecialStage*);
extern const s16 gUnknown_080DF9D8[][3];
#endif
+1
View File
@@ -3,6 +3,7 @@
#include "global.h"
#include "special_stage.h"
#include "special_stage_data.h"
// Player
struct SpecialStagePlayer {
+1 -5
View File
@@ -3,16 +3,12 @@
#include "global.h"
#include "special_stage.h"
#include "special_stage_data.h"
#include "sprite.h"
extern void* gUnknown_03005B58;
extern void* gUnknown_03005B5C;
#define ResetSpecialStageScreenVram() ({ \
gUnknown_03005B5C = (void*)OBJ_VRAM0; \
gUnknown_03005B58 = NULL; \
})
#define ResetSpecialStateScreenSubMenuVram() ({ \
gUnknown_03005B58 = NULL; \
})
+1 -1
View File
@@ -126,7 +126,7 @@ SECTIONS
build/sa2/data/unused_objects_data.o(.rodata);
build/sa2/src/profile.o(.rodata);
build/sa2/src/special_stage_data.o(.rodata);
build/sa2/data/special_stage_player_data.o(.rodata);
build/sa2/src/special_stage_player.o(.rodata);
build/sa2/data/special_stage_unk_806BD94_data.o(.rodata);
build/sa2/data/special_stage_unk_806E6E8_data.o(.rodata);
build/sa2/data/special_stage_unk_806F910_data.o(.rodata);
+33
View File
@@ -0,0 +1,33 @@
from io import BufferedReader
import os
import sys
import struct
start_address = int(sys.argv[1], 16)
length = int(sys.argv[2], 16)
def read_u8(rom: BufferedReader):
return struct.unpack('B', rom.read(1))[0]
def read_s8(rom: BufferedReader):
return struct.unpack('b', rom.read(1))[0]
def read_u16(rom: BufferedReader):
return struct.unpack('H', rom.read(2))[0]
def read_s16(rom: BufferedReader):
return struct.unpack('h', rom.read(2))[0]
def read_u32(rom: BufferedReader):
return struct.unpack('I', rom.read(4))[0]
def format_hex(val):
return f"0x{hex(val)[2:].upper()}"
with open('baserom.gba', 'rb') as rom:
rom.seek(start_address)
new_array = True
for i in range(length // 4):
addr = read_u32(rom)
print(f"sub_{hex(addr - 1).replace('0x', '').upper()},")
@@ -0,0 +1,51 @@
from io import BufferedReader
import os
import sys
import struct
start_address = int(sys.argv[1], 16)
length = int(sys.argv[2], 16)
def read_u8(rom: BufferedReader):
return struct.unpack('B', rom.read(1))[0]
def read_s8(rom: BufferedReader):
return struct.unpack('b', rom.read(1))[0]
def read_u16(rom: BufferedReader):
return struct.unpack('H', rom.read(2))[0]
def read_s16(rom: BufferedReader):
return struct.unpack('h', rom.read(2))[0]
def read_u32(rom: BufferedReader):
return struct.unpack('I', rom.read(4))[0]
def format_hex(val):
return f"0x{hex(val)[2:].upper()}"
data_offset = 0x000DF2F8
with open('baserom.gba', 'rb') as rom:
rom.seek(start_address)
new_array = True
for i in range(length // 8):
if new_array:
print(f"\n/** {i} **/")
new_array = False
print(" { ", end="")
start = read_u16(rom)
print(f"{str(start)}, ", end="")
print(f"{str(read_u16(rom))}, ", end="")
print(f"{str(read_u16(rom))}, ", end="")
print(f"{str(read_u8(rom))}, ", end="")
end = read_u8(rom)
print(f"{str(end)}, ", end="")
print("},")
if start == 0xFFFF:
new_array = True
+21 -21
View File
@@ -18,9 +18,9 @@
void sub_806C970(void);
void sub_806C950(struct Task*);
extern const s16 gUnknown_080DFA02[7];
extern const s16 gSpecialStageLevelTimes[7];
void sub_806BA84(s16 a, s16 b) {
void sub_806BA84(s16 selectedCharacter, s16 selectedLevel) {
struct Task* t;
struct SpecialStage* stage;
@@ -28,22 +28,22 @@ void sub_806BA84(s16 a, s16 b) {
m4aMPlayAllStop();
if (b != -1) {
temp = b >> 2;
if (selectedLevel != -1) {
temp = selectedLevel >> 2;
} else {
temp = gCurrentLevel >> 2;
}
level = temp;
if (a == -1) {
if (selectedCharacter == -1) {
character = gSelectedCharacter;
} else {
character = a;
character = selectedCharacter;
}
sub_806CEA8();
t = TaskCreate(sub_806C970, 0x5D8, 0x2000, 0, sub_806C950);
t = TaskCreate(sub_806C970, sizeof(struct SpecialStage), 0x2000, 0, sub_806C950);
stage = TaskGetStructPtr(t);
stage->unk594 = 0x1000000;
stage->unk598 = 0x1000000;
@@ -51,15 +51,15 @@ void sub_806BA84(s16 a, s16 b) {
stage->unk5A0 = 0x200;
if (character < 5) {
stage->unk5B6 = character;
stage->character = character;
stage->unk5B7 = 0;
} else {
stage->unk5B6 = 2;
stage->character = 2;
stage->unk5B7 = 1;
}
stage->unk5B8 = level;
stage->unk5B9 = b;
stage->level = level;
stage->unk5B9 = selectedLevel;
stage->unk5A2 = 0;
stage->unk5BB = 1;
@@ -67,8 +67,8 @@ void sub_806BA84(s16 a, s16 b) {
stage->unk5BD = 0;
stage->unk5BE = 0;
stage->unk5A4 = 0;
stage->unk5A6 = gUnknown_080DFA02[level];
stage->elapsedTime = 0;
stage->levelTime = gSpecialStageLevelTimes[level];
stage->unk5B4 = 0;
stage->unk5BA = 0;
@@ -77,9 +77,9 @@ void sub_806BA84(s16 a, s16 b) {
stage->unk5C0 = 0;
stage->unk5C1 = 0;
stage->unk5C2 = Div(stage->unk5A6, 100);
stage->unk5C3 = Div(stage->unk5A6, 10) - (stage->unk5C2 * 10);
stage->unk5C4 = Mod(stage->unk5A6, 10);
stage->unk5C2 = Div(stage->levelTime, 100);
stage->unk5C3 = Div(stage->levelTime, 10) - (stage->unk5C2 * 10);
stage->unk5C4 = Mod(stage->levelTime, 10);
stage->unk5C5 = 0;
stage->unk5C5 = 0;
@@ -355,7 +355,7 @@ void sub_806C158(void) {
gBldRegs.bldAlpha = 0;
stage->unk10 = sub_8070BF0(stage);
stage->unk5A8 = stage->unk5A4 * 100;
stage->unk5A8 = stage->elapsedTime * 100;
if (stage->unk5A8 > 0x1863C) {
stage->unk5A8 = 0x1863C;
@@ -529,7 +529,7 @@ void sub_806C638(void);
void sub_806C560(void) {
struct SpecialStage* stage = TaskGetStructPtr(gCurTask);
u8 unk5B6 = stage->unk5B6;
u8 unk5B6 = stage->character;
u8 something = gLoadedSaveGame->unkC[unk5B6];
if (stage->unk5C7 == 1) {
@@ -540,9 +540,9 @@ void sub_806C560(void) {
}
}
if (!GetBit(something, stage->unk5B8)) {
if (!GetBit(something, stage->level)) {
sub_8070C30(stage);
gLoadedSaveGame->unkC[unk5B6] |= 1 << stage->unk5B8;
gLoadedSaveGame->unkC[unk5B6] |= 1 << stage->level;
stage->unk5A2 = 0x78;
} else {
stage->unk5A2 = 0xC;
@@ -612,7 +612,7 @@ void sub_806C6A4(void) {
gUnknown_03005448 = temp5;
}
gLoadedSaveGame->unk374 += stage->unk5A4;
gLoadedSaveGame->unk374 += stage->elapsedTime;
TasksDestroyAll();
gUnknown_03002AE4 = gUnknown_0300287C;
+124
View File
@@ -3472,3 +3472,127 @@ const struct UNK_8C87904 gUnknown_080DF040[] = {
{ 0, 928, 592, 32, 32, 0, },
ARRAY_END,
};
#define SPRITE_ARRAY_END { 65535, 65535, 65535,}
const struct UNK_80DF670 gUnknown_080DF2F8[] = {
/** 0 **/
{ 85, 0, 20, 16, 0, },
{ 85, 1, 20, 16, 0, },
{ 85, 1, 20, 16, 1, },
{ 86, 0, 24, 8, 0, },
{ 86, 1, 20, 8, 0, },
{ 86, 1, 20, 8, 1, },
{ 86, 2, 20, 16, 0, },
{ 86, 3, 20, 16, 0, },
{ 86, 3, 20, 16, 1, },
{ 87, 0, 36, 4, 0, },
{ 87, 2, 30, 4, 0, },
{ 87, 2, 30, 4, 1, },
{ 89, 0, 16, 16, 0, },
{ 89, 0, 16, 16, 0, },
{ 89, 0, 16, 16, 0, },
{ 88, 0, 20, 16, 0, },
{ 88, 1, 30, 16, 0, },
{ 88, 1, 30, 16, 1, },
{ 90, 0, 20, 16, 0, },
{ 29, 0, 25, 16, 0, },
{ 34, 0, 28, 16, 0, },
SPRITE_ARRAY_END,
/** 22 **/
{ 176, 0, 16, 16, 0, },
{ 176, 1, 16, 16, 0, },
{ 176, 1, 16, 16, 1, },
{ 177, 1, 20, 8, 0, },
{ 177, 0, 20, 8, 0, },
{ 177, 0, 20, 8, 1, },
{ 177, 3, 20, 16, 0, },
{ 177, 2, 25, 16, 0, },
{ 177, 2, 25, 16, 1, },
{ 178, 0, 30, 4, 0, },
{ 178, 2, 25, 4, 0, },
{ 178, 2, 25, 4, 1, },
{ 180, 0, 16, 16, 0, },
{ 180, 0, 16, 16, 0, },
{ 180, 0, 16, 16, 0, },
{ 179, 0, 24, 16, 0, },
{ 179, 1, 24, 16, 0, },
{ 179, 1, 24, 16, 1, },
{ 181, 0, 16, 16, 0, },
{ 120, 0, 24, 16, 0, },
{ 125, 0, 25, 16, 0, },
SPRITE_ARRAY_END,
/** 44 **/
{ 267, 0, 16, 16, 0, },
{ 267, 1, 16, 16, 0, },
{ 267, 1, 16, 16, 1, },
{ 268, 0, 20, 8, 0, },
{ 268, 1, 25, 8, 0, },
{ 268, 1, 25, 8, 1, },
{ 268, 2, 16, 16, 0, },
{ 268, 3, 20, 16, 0, },
{ 268, 3, 20, 16, 1, },
{ 269, 0, 36, 4, 0, },
{ 269, 2, 25, 4, 0, },
{ 269, 2, 25, 4, 1, },
{ 271, 0, 16, 16, 0, },
{ 271, 0, 16, 16, 0, },
{ 271, 0, 16, 16, 0, },
{ 270, 0, 20, 16, 0, },
{ 270, 1, 30, 16, 0, },
{ 270, 1, 30, 16, 1, },
{ 272, 0, 20, 16, 0, },
{ 211, 0, 25, 16, 0, },
{ 216, 0, 30, 16, 0, },
SPRITE_ARRAY_END,
/** 66 **/
{ 358, 0, 20, 16, 0, },
{ 358, 1, 20, 16, 0, },
{ 358, 1, 20, 16, 1, },
{ 359, 0, 20, 8, 0, },
{ 359, 1, 20, 8, 0, },
{ 359, 1, 20, 8, 1, },
{ 359, 2, 30, 16, 0, },
{ 359, 3, 25, 16, 0, },
{ 359, 3, 25, 16, 1, },
{ 360, 0, 36, 4, 0, },
{ 360, 2, 30, 4, 0, },
{ 360, 2, 30, 4, 1, },
{ 362, 0, 16, 16, 0, },
{ 362, 0, 16, 16, 0, },
{ 362, 0, 16, 16, 0, },
{ 361, 0, 20, 16, 0, },
{ 361, 1, 30, 16, 0, },
{ 361, 1, 30, 16, 1, },
{ 363, 0, 20, 16, 0, },
{ 302, 0, 36, 16, 0, },
{ 307, 0, 36, 16, 0, },
SPRITE_ARRAY_END,
/** 88 **/
{ 449, 0, 20, 16, 0, },
{ 449, 1, 20, 16, 0, },
{ 449, 1, 20, 16, 1, },
{ 450, 0, 25, 8, 0, },
{ 450, 1, 20, 8, 0, },
{ 450, 1, 20, 8, 1, },
{ 450, 2, 16, 16, 0, },
{ 450, 3, 20, 16, 0, },
{ 450, 3, 20, 16, 1, },
{ 451, 0, 36, 4, 0, },
{ 451, 2, 25, 4, 0, },
{ 451, 2, 25, 4, 1, },
{ 453, 0, 16, 16, 0, },
{ 453, 0, 16, 16, 0, },
{ 453, 0, 16, 16, 0, },
{ 452, 0, 24, 16, 0, },
{ 452, 1, 25, 16, 0, },
{ 452, 1, 25, 16, 1, },
{ 454, 0, 20, 16, 0, },
{ 393, 0, 30, 16, 0, },
{ 398, 0, 20, 16, 0, },
SPRITE_ARRAY_END,
};
+3 -2
View File
@@ -6,6 +6,7 @@
#include "special_stage_gamma.h"
#include "special_stage_unk_806F910.h"
#include "special_stage_unk_806BD94.h"
#include "special_stage_data.h"
#include "trig.h"
#include "m4a.h"
#include "constants/songs.h"
@@ -19,7 +20,7 @@ void sub_8071380(struct UNK_0808B3FC_UNK240* element, void* vram, s16 a1, s16 a,
void sub_8071530(struct UNK_0808B3FC_UNK240* element, s16 a1, s16 a, u8 b, const struct UNK_80DF670* c4);
void sub_8070EFC(struct SpecialStageGamma* gamma) {
u8 level = gamma->stage->unk5B8;
u8 level = gamma->stage->level;
const struct UNK_80DF670* unkF914 = &gUnknown_080DF914[0];
s16 result = sub_806CF44(unkF914);
void* vramOld = gUnknown_03005B5C;
@@ -191,7 +192,7 @@ void sub_807120C(struct SpecialStageGamma* gamma) {
sub_806F944(stage);
player->unkB4 = 10;
m4aSongNumStart(SE_275);
} else if (stage->unk5A4 == 0) {
} else if (stage->elapsedTime == 0) {
if (player->unkB6 == 0) {
player->unkB8 = player->unkFC;
player->unkB4 = 0xE;
+177 -124
View File
@@ -2,17 +2,78 @@
#include "special_stage.h"
#include "special_stage_player.h"
#include "special_stage_utils.h"
#include "special_stage_gamma.h"
#include "special_stage_data.h"
#include "player.h"
void sub_806D788(void);
void sub_806D2C8(void);
void sub_806D548(struct UNK_0808B3FC_UNK240* element, void*, s16, u8, const struct UNK_80DF670*);
void sub_806D7D0(struct UNK_0808B3FC_UNK240* element, s16, s16, const struct UNK_80DF670*);
void sub_806D830(struct UNK_0808B3FC_UNK240* element, s16, s16, const struct UNK_80DF670*);
void sub_806D5CC(void);
void sub_806D388(void);
void sub_806D424(void);
void sub_806D484(void);
void sub_806D4E4(void);
void sub_806D5D0(void);
void sub_806D5D0(void);
void sub_806D634(void);
void sub_806D698(void);
void sub_806D388(void);
void sub_806D5D0(void);
void sub_806D5D0(void);
void sub_806D5D0(void);
void sub_806D4E4(void);
void sub_806D388(void);
void sub_806D6DC(void);
void sub_806D5CC(void);
void sub_806D740(void);
static const struct UNK_80DF670 gUnknown_080DF668 = {
.unk0 = 884,
.unk2 = 0,
.unk4 = 2,
.unk6 = 16,
.unk7 = 0,
};
// character sprites
extern const struct UNK_80DF670* const gUnknown_080DF670[5];
static const struct UNK_80DF670* const gUnknown_080DF670[5] = {
[CHARACTER_SONIC] = &gUnknown_080DF2F8[0],
[CHARACTER_CREAM] = &gUnknown_080DF2F8[22],
[CHARACTER_TAILS] = &gUnknown_080DF2F8[44],
[CHARACTER_KNUCKLES] = &gUnknown_080DF2F8[66],
[CHARACTER_AMY] = &gUnknown_080DF2F8[88],
};
extern const s16 gUnknown_080DF9D8[7][3];
typedef void (*PlayerStateHandler)(void);
extern const struct UNK_80DF670 gUnknown_080DF668;
// state handlers
static PlayerStateHandler const gUnknown_080DF684[] = {
sub_806D5CC,
sub_806D388,
sub_806D424,
sub_806D484,
sub_806D4E4,
sub_806D5D0,
sub_806D5D0,
sub_806D634,
sub_806D698,
sub_806D388,
sub_806D5D0,
sub_806D5D0,
sub_806D5D0,
sub_806D4E4,
sub_806D388,
sub_806D6DC,
sub_806D5CC,
sub_806D740,
};
void sub_806D2C8(void);
void sub_806D548(struct UNK_0808B3FC_UNK240* element, void*, s16, u8, const struct UNK_80DF670*);
struct Task* CreatePlayer(struct SpecialStage* stage) {
const struct UNK_80DF670* unkF670[5];
u8 lang;
@@ -22,46 +83,46 @@ struct Task* CreatePlayer(struct SpecialStage* stage) {
u32 temp;
struct Task* t;
struct SpecialStagePlayer* unkCF78;
struct SpecialStagePlayer* player;
memcpy(&unkF670, &gUnknown_080DF670, 0x14);
lang = stage->unk5B8;
lang = stage->level;
t = TaskCreate(sub_806D2C8, 0x108, 0x9000, 0, NULL);
unkCF78 = TaskGetStructPtr(t);
unkCF78->unk0 = stage;
unkCF78->unk4 = NULL;
unkCF78->x = gUnknown_080DF9D8[lang][0] << 0x10;
unkCF78->y = gUnknown_080DF9D8[lang][1] << 0x10;
player = TaskGetStructPtr(t);
player->unk0 = stage;
player->unk4 = NULL;
player->x = gUnknown_080DF9D8[lang][0] << 0x10;
player->y = gUnknown_080DF9D8[lang][1] << 0x10;
unkCF78->unkB0 = 0;
unkCF78->unkB2 = gUnknown_080DF9D8[lang][2];
unkCF78->unkB4 = 0;
unkCF78->unkB6 = 0x96;
unkCF78->unkBC = 0;
unkCF78->unkBE = 0;
unkCF78->unkC0 = 1;
player->unkB0 = 0;
player->unkB2 = gUnknown_080DF9D8[lang][2];
player->unkB4 = 0;
player->unkB6 = 0x96;
player->unkBC = 0;
player->unkBE = 0;
player->unkC0 = 1;
unkCF78->unkC4 = unkF670[stage->unk5B6];
result = sub_806CF44(unkCF78->unkC4);
unkCF78->unk98 = gUnknown_03005B5C;
player->unkC4 = unkF670[stage->character];
result = sub_806CF44(player->unkC4);
player->unk98 = gUnknown_03005B5C;
gUnknown_03005B5C += (result * TILE_SIZE_4BPP);
unkCF78->unk9C = gUnknown_03005B5C;
unkCF78->unkA0 = gUnknown_03005B5C + 0x40;
player->unk9C = gUnknown_03005B5C;
player->unkA0 = gUnknown_03005B5C + 0x40;
// required for match
temp = 2;
gUnknown_03005B5C += 0xC0;
sub_806D548(&unkCF78->unk8, unkCF78->unk98, stage->unk5CC, 9, unkCF78->unkC4);
sub_806D548(&unkCF78->unk38, unkCF78->unk9C, stage->unk5CC, 10, &gUnknown_080DF668);
sub_806D548(&player->unk8, player->unk98, stage->unk5CC, 9, player->unkC4);
sub_806D548(&player->unk38, player->unk9C, stage->unk5CC, 10, &gUnknown_080DF668);
{
struct UNK_0808B3FC_UNK240* element = &unkCF78->unk68;
struct UNK_0808B3FC_UNK240* element = &player->unk68;
u16* affine = &gOamBuffer[120].all.affineParam;
element->unk4 = unkCF78->unkA0;
element->unk4 = player->unkA0;
element->unk8 = 0;
element->unkA = 0x37A;
element->unk10 = 0x107E;
@@ -91,88 +152,80 @@ struct Task* CreatePlayer(struct SpecialStage* stage) {
}
if (stage->unk5B7 == 0) {
unkCF78->unkC8 = 0;
unkCF78->unkCC = 6;
unkCF78->unkD0 = 0x10000;
unkCF78->unkD4 = 0x10000;
unkCF78->unkD8 = 0x28;
unkCF78->unkDC = -0x2B;
unkCF78->unkE0 = -0x15E;
unkCF78->unkE4 = 0x2C80;
unkCF78->unkE8 = 0x3F80;
unkCF78->unkEC = 0x502;
unkCF78->unkEE = 0x8C0;
unkCF78->unkF0 = 0x14;
unkCF78->unkF2 = -0x28;
unkCF78->unkF4 = -0x36;
unkCF78->unkF6 = -0x48;
unkCF78->unk100 = -0x10;
unkCF78->unk104 = -8;
unkCF78->unkF8 = 0x800;
unkCF78->unkFA = -0x80;
unkCF78->unkFC = 0x600;
unkCF78->unkFE = -0x40;
player->unkC8 = 0;
player->unkCC = 6;
player->unkD0 = 0x10000;
player->unkD4 = 0x10000;
player->unkD8 = 0x28;
player->unkDC = -0x2B;
player->unkE0 = -0x15E;
player->unkE4 = 0x2C80;
player->unkE8 = 0x3F80;
player->unkEC = 0x502;
player->unkEE = 0x8C0;
player->unkF0 = 0x14;
player->unkF2 = -0x28;
player->unkF4 = -0x36;
player->unkF6 = -0x48;
player->unk100 = -0x10;
player->unk104 = -8;
player->unkF8 = 0x800;
player->unkFA = -0x80;
player->unkFC = 0x600;
player->unkFE = -0x40;
} else {
unkCF78->unkC8 = 0;
unkCF78->unkCC = 0;
unkCF78->unkD0 = 0xC00;
unkCF78->unkD4 = 0x7FFF;
unkCF78->unkD8 = 0x100;
unkCF78->unkDC = 0x800;
player->unkC8 = 0;
player->unkCC = 0;
player->unkD0 = 0xC00;
player->unkD4 = 0x7FFF;
player->unkD8 = 0x100;
player->unkDC = 0x800;
}
return t;
}
typedef void (*TaskFunc_80DF684)(void);
extern TaskFunc_80DF684 const gUnknown_080DF684[18];
void sub_806D788(void);
void sub_806D2C8(void) {
TaskFunc_80DF684 funcs[18];
PlayerStateHandler stateHandlers[18];
struct UNK_0808B3FC_UNK240 *unk8, *unk38;
struct SpecialStagePlayer* unkCF78 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkCF78->unk0;
struct SpecialStagePlayer* player = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = player->unk0;
memcpy(funcs, gUnknown_080DF684, sizeof(gUnknown_080DF684));
memcpy(stateHandlers, gUnknown_080DF684, sizeof(gUnknown_080DF684));
if (stage->unk5BA == 0) {
funcs[unkCF78->unkB4 + 1]();
stateHandlers[player->unkB4 + 1]();
sub_806D788();
} else {
funcs[0]();
stateHandlers[0]();
}
unk8 = &unkCF78->unk8;
unk38 = &unkCF78->unk38;
unk8 = &player->unk8;
unk38 = &player->unk38;
if (unkCF78->unkB6 != 0 && stage->unk5BA == 0) {
if ((--unkCF78->unkB6) & 2) {
if (player->unkB6 != 0 && stage->unk5BA == 0) {
if ((--player->unkB6) & 2) {
sub_80051E8(unk8);
if (unkCF78->unkB4 < 0xE) {
if (player->unkB4 < 14) {
sub_80051E8(unk38);
}
}
} else {
sub_80051E8(unk8);
if (unkCF78->unkB4 < 0xE) {
if (player->unkB4 < 14) {
sub_80051E8(unk38);
}
}
}
void sub_806D7D0(struct UNK_0808B3FC_UNK240* element, s16, s16, const struct UNK_80DF670*);
void sub_806D830(struct UNK_0808B3FC_UNK240* element, s16, s16, const struct UNK_80DF670*);
// Animations for different player speeds
// Stopped?
void sub_806D388(void) {
struct SpecialStagePlayer* unkCF78 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkCF78->unk0;
struct SpecialStagePlayer* player = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = player->unk0;
const struct UNK_80DF670* unkC4;
struct UNK_0808B3FC_UNK240* unk8;
u32 index = 0;
@@ -185,8 +238,8 @@ void sub_806D388(void) {
}
}
unkC4 = &unkCF78->unkC4[index];
unk8 = &unkCF78->unk8;
unkC4 = &player->unkC4[index];
unk8 = &player->unk8;
sub_806D7D0(unk8, -1, stage->unk5CC, unkC4);
@@ -198,8 +251,8 @@ void sub_806D388(void) {
// Moving?
void sub_806D424(void) {
struct SpecialStagePlayer* unkCF78 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkCF78->unk0;
struct SpecialStagePlayer* player = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = player->unk0;
const struct UNK_80DF670* unkC4;
struct UNK_0808B3FC_UNK240* unk8;
@@ -211,15 +264,15 @@ void sub_806D424(void) {
index = 5;
}
unkC4 = &unkCF78->unkC4[index];
unk8 = &unkCF78->unk8;
sub_806D7D0(unk8, unkCF78->unkA4, stage->unk5CC, unkC4);
unkC4 = &player->unkC4[index];
unk8 = &player->unk8;
sub_806D7D0(unk8, player->unkA4, stage->unk5CC, unkC4);
}
// Running?
void sub_806D484(void) {
struct SpecialStagePlayer* unkCF78 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkCF78->unk0;
struct SpecialStagePlayer* player = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = player->unk0;
const struct UNK_80DF670* unkC4;
struct UNK_0808B3FC_UNK240* unk8;
@@ -231,15 +284,15 @@ void sub_806D484(void) {
index = 8;
}
unkC4 = &unkCF78->unkC4[index];
unk8 = &unkCF78->unk8;
sub_806D7D0(unk8, unkCF78->unkA4, stage->unk5CC, unkC4);
unkC4 = &player->unkC4[index];
unk8 = &player->unk8;
sub_806D7D0(unk8, player->unkA4, stage->unk5CC, unkC4);
}
// Sprinting?
void sub_806D4E4(void) {
struct SpecialStagePlayer* unkCF78 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkCF78->unk0;
struct SpecialStagePlayer* player = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = player->unk0;
const struct UNK_80DF670* unkC4;
struct UNK_0808B3FC_UNK240* unk8;
@@ -251,9 +304,9 @@ void sub_806D4E4(void) {
index = 11;
}
unkC4 = &unkCF78->unkC4[index];
unk8 = &unkCF78->unk8;
sub_806D7D0(unk8, unkCF78->unkA4 >> 1, stage->unk5CC, unkC4);
unkC4 = &player->unkC4[index];
unk8 = &player->unk8;
sub_806D7D0(unk8, player->unkA4 >> 1, stage->unk5CC, unkC4);
}
void sub_806D548(struct UNK_0808B3FC_UNK240* element, void* vram, s16 a, u8 b, const struct UNK_80DF670* c4) {
@@ -283,65 +336,65 @@ void sub_806D548(struct UNK_0808B3FC_UNK240* element, void* vram, s16 a, u8 b, c
sub_8004558(element);
}
UNUSED static void sub_806D5CC(void) {}
UNUSED void sub_806D5CC(void) {}
#define Macro_806D4E(val, val2) ({\
((val) >> 4) + (val2); \
})\
void sub_806D5D0(void) {
struct SpecialStagePlayer* unkCF78 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkCF78->unk0;
struct SpecialStagePlayer* player = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = player->unk0;
const struct UNK_80DF670* unkC4 = &unkCF78->unkC4[12];
unkCF78->unkB0 += unkCF78->unkB8 >> 4;
const struct UNK_80DF670* unkC4 = &player->unkC4[12];
player->unkB0 += player->unkB8 >> 4;
sub_806D7D0(&unkCF78->unk8, -1, stage->unk5CC - Macro_806D4E(unkCF78->unkB0, 0xF), unkC4);
sub_806D7D0(&player->unk8, -1, stage->unk5CC - Macro_806D4E(player->unkB0, 0xF), unkC4);
}
void sub_806D634(void) {
struct SpecialStagePlayer* unkCF78 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkCF78->unk0;
const struct UNK_80DF670* unkC4 = &unkCF78->unkC4[15];
struct SpecialStagePlayer* player = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = player->unk0;
const struct UNK_80DF670* unkC4 = &player->unkC4[15];
unkCF78->unkB0 += unkCF78->unkB8 >> 4;
player->unkB0 += player->unkB8 >> 4;
sub_806D7D0(&unkCF78->unk8, -1, stage->unk5CC - Macro_806D4E(unkCF78->unkB0, 10), unkC4);
sub_806D7D0(&player->unk8, -1, stage->unk5CC - Macro_806D4E(player->unkB0, 10), unkC4);
}
void sub_806D698(void) {
struct SpecialStagePlayer* unkCF78 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkCF78->unk0;
const struct UNK_80DF670* unkC4 = &unkCF78->unkC4[18];
struct SpecialStagePlayer* player = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = player->unk0;
const struct UNK_80DF670* unkC4 = &player->unkC4[18];
sub_806D7D0(&unkCF78->unk8, -1, stage->unk5CC, unkC4);
sub_806D7D0(&player->unk8, -1, stage->unk5CC, unkC4);
}
void sub_806D6DC(void) {
struct SpecialStagePlayer* unkCF78 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkCF78->unk0;
const struct UNK_80DF670* unkC4 = &unkCF78->unkC4[19];
struct SpecialStagePlayer* player = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = player->unk0;
const struct UNK_80DF670* unkC4 = &player->unkC4[19];
unkCF78->unkB0 += unkCF78->unkB8 >> 4;
player->unkB0 += player->unkB8 >> 4;
sub_806D7D0(&unkCF78->unk8, -1, stage->unk5CC - Macro_806D4E(unkCF78->unkB0, 10), unkC4);
sub_806D7D0(&player->unk8, -1, stage->unk5CC - Macro_806D4E(player->unkB0, 10), unkC4);
}
void sub_806D740(void) {
struct SpecialStagePlayer* unkCF78 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkCF78->unk0;
const struct UNK_80DF670* unkC4 = &unkCF78->unkC4[20];
struct SpecialStagePlayer* player = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = player->unk0;
const struct UNK_80DF670* unkC4 = &player->unkC4[20];
sub_806D7D0(&unkCF78->unk8, -1, stage->unk5CC - 0xC, unkC4);
sub_806D7D0(&player->unk8, -1, stage->unk5CC - 0xC, unkC4);
}
void sub_806D788(void) {
struct SpecialStagePlayer* unkCF78 = TaskGetStructPtr(gCurTask);
if (unkCF78->unkBC != 0) {
s32 temp = --unkCF78->unkBC;
struct SpecialStagePlayer* player = TaskGetStructPtr(gCurTask);
if (player->unkBC != 0) {
s32 temp = --player->unkBC;
if (temp == 0) {
unkCF78->unkBE = temp;
unkCF78->unkC0 = 1;
player->unkBE = temp;
player->unkC0 = 1;
}
}
}
+7 -6
View File
@@ -3,6 +3,7 @@
#include "special_stage_player.h"
#include "special_stage_ui.h"
#include "special_stage_utils.h"
#include "special_stage_data.h"
#include "m4a.h"
#include "save.h"
#include "constants/songs.h"
@@ -226,7 +227,7 @@ void sub_8070078(void) {
sub_8004558(element);
if (stage->unk5C5 == 0) {
if (stage->unk5A4 >= stage->unk5A6) {
if (stage->elapsedTime >= stage->levelTime) {
stage->unk5C5 = 1;
m4aSongNumStart(MUS_ACHIEVEMENT);
stage->unk5C7 = 1;
@@ -240,7 +241,7 @@ void sub_8070078(void) {
return;
}
if (stage->unk5A4 < stage->unk5A6) {
if (stage->elapsedTime < stage->levelTime) {
stage->unk5C5 = 0;
element = &unk0B90->unk154;
@@ -289,8 +290,8 @@ void sub_807028C(struct UNK_8070BF0* unk0BF0) {
s32 temp1;
s16 temp3;
u8 val = gLoadedSaveGame->unkC[stage->unk5B6];
u8 unk5B6 = stage->unk5B6;
u8 val = gLoadedSaveGame->unkC[stage->character];
u8 unk5B6 = stage->character;
gUnknown_03005B5C = stage->unk5D4;
gUnknown_03005B58 = 0;
@@ -479,7 +480,7 @@ void sub_8070EE4(void);
void sub_8070814(void) {
struct UNK_8070BF0* unk0BF0 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unk0BF0->stage;
u8 level = stage->unk5B8;
u8 level = stage->level;
sub_807087C();
unk0BF0->unk514++;
@@ -727,7 +728,7 @@ void sub_8070E68(struct UNK_8070B90* unk0B90) {
void sub_8070E88(void) {
struct UNK_8070BF0* unk0BF0 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unk0BF0->stage;
struct UNK_0808B3FC_UNK240* element = &unk0BF0->unk64[stage->unk5B8];
struct UNK_0808B3FC_UNK240* element = &unk0BF0->unk64[stage->level];
element->unkA = gUnknown_080DF8A8[8].unk0;
element->unk20 = gUnknown_080DF8A8[8].unk2;
+11 -11
View File
@@ -12,10 +12,10 @@
void sub_806D890(struct SpecialStage* stage, s16 num) {
s16 i;
stage->unk5A4 += num;
stage->elapsedTime += num;
if (stage->unk5A4 > 999) {
stage->unk5A4 = 999;
if (stage->elapsedTime > 999) {
stage->elapsedTime = 999;
}
for (i = 0; i < num; i++) {
@@ -48,9 +48,9 @@ void sub_806D924(struct SpecialStage* stage, s16 num) {
s16 i;
sub_806E3B8(stage, -1);
stage->unk5A4 -= num;
if (stage->unk5A4 < 0) {
stage->unk5A4 = 0;
stage->elapsedTime -= num;
if (stage->elapsedTime < 0) {
stage->elapsedTime = 0;
}
for (i = num; i > 0; i--) {
@@ -147,7 +147,7 @@ void sub_806DB48(void) {
void sub_806DC98(void) {
struct UNK_806BD94* unkBD94 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkBD94->stage;
const struct UNK_8C878E8** unk78E8_vals = gUnknown_08C878E8[stage->unk5B8];
const struct UNK_8C878E8** unk78E8_vals = gUnknown_08C878E8[stage->level];
struct SpecialStagePlayer* player = TaskGetStructPtr(stage->playerTask);
s32 val1 = player->x >> 0x10;
@@ -204,7 +204,7 @@ bool16 sub_806DE10(void) {
result = FALSE;
memcpy(unkF6CC, gUnknown_080DF6CC, 0xE);
val = unkF6CC[stage->unk5B8];
val = unkF6CC[stage->level];
for (i = 0; i < val; i++) {
if (unkBD94->unk914[i] > 2) {
unkBD94->unk914[i]++;
@@ -250,7 +250,7 @@ void sub_806DEA4(void) {
struct UNK_806BD94* unkBD94 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkBD94->stage;
struct SpecialStagePlayer* player = TaskGetStructPtr(stage->playerTask);
const struct UNK_8C878E8** unk78E8_vals = gUnknown_08C878E8[stage->unk5B8];
const struct UNK_8C878E8** unk78E8_vals = gUnknown_08C878E8[stage->level];
const struct UNK_8C878E8** unk78E8;
const struct UNK_8C878E8* unk78E8_val = NULL;
@@ -440,7 +440,7 @@ void sub_806E3B8(struct SpecialStage* stage, s16 mode) {
s16 temp;
if (mode == -1) {
temp = stage->unk5A4 > 8 ? 8 : stage->unk5A4;
temp = stage->elapsedTime > 8 ? 8 : stage->elapsedTime;
} else {
temp = mode;
}
@@ -556,7 +556,7 @@ struct Task* sub_806E684(struct SpecialStage* stage) {
t = TaskCreate(sub_806D9B4, 0xA5C, 0xB000, 0, NULL);
unkBD94 = TaskGetStructPtr(t);
unkBD94->stage = stage;
unkBD94->unkA58 = unkF6CC[stage->unk5B8];
unkBD94->unkA58 = unkF6CC[stage->level];
unkBD94->unkA5A = 0;
return t;
+4 -4
View File
@@ -36,8 +36,8 @@ struct Task* sub_806E6E8(struct SpecialStage* stage) {
unkE6E8->unk8 = NULL;
unkE6E8->unkC = NULL;
sub_806CEC4(&unkE6E8->unk10, 1, 0x10, unkF776[stage->unk5B8], 0x80, 0x80, 0, 2, 0, 0);
sub_806CEC4(&unkE6E8->unk50, 0, 7, unkF768[stage->unk5B8], 0x20, 0x20, 0, 1, 0, 0);
sub_806CEC4(&unkE6E8->unk10, 1, 0x10, unkF776[stage->level], 0x80, 0x80, 0, 2, 0, 0);
sub_806CEC4(&unkE6E8->unk50, 0, 7, unkF768[stage->level], 0x20, 0x20, 0, 1, 0, 0);
sub_806E7C0(unkE6E8);
@@ -117,7 +117,7 @@ extern const struct UNK_8C87920* const gUnknown_08C87920[7];
void sub_806E94C(struct UNK_806E6E8* unkE6E8) {
s16 i;
// Maybe some macro? Who knows...
u8* level = &unkE6E8->stage->unk5B8;
u8* level = &unkE6E8->stage->level;
const struct UNK_8C87920* assets = gUnknown_08C87920[*level];
s16 num = gUnknown_080DF6DC[*level];
@@ -197,7 +197,7 @@ void sub_806EB74(void) {
s16 i;
struct UNK_806E6E8* unkE6E8 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkE6E8->stage;
u8* level = &stage->unk5B8;
u8* level = &stage->level;
s16 num = gUnknown_080DF6DC[*level];
// Huh?
u8 *temp = (u8*)&stage->unk5A0;
+1 -1
View File
@@ -387,7 +387,7 @@ void sub_806F468(void) {
struct UNK_806F910* unkF910 = TaskGetStructPtr(gCurTask);
struct SpecialStage* stage = unkF910->stage;
struct SpecialStagePlayer* player = TaskGetStructPtr(stage->playerTask);
const struct UNK_8C87904* unk7904 = gUnknown_08C87904[stage->unk5B8];
const struct UNK_8C87904* unk7904 = gUnknown_08C87904[stage->level];
s16 playerX = player->x >> 0x10;
s16 playerY = player->y >> 0x10;
+1
View File
@@ -2,6 +2,7 @@
#include "special_stage.h"
#include "special_stage_unk_806E6E8.h"
#include "special_stage_utils.h"
#include "special_stage_data.h"
#include "sprite.h"
#include "trig.h"