mirror of
https://github.com/SAT-R/sa2.git
synced 2026-10-28 09:43:38 +00:00
more results screen fixes for widescreen, refactor results screens to share struct
This commit is contained in:
1 parent
75bb45bacd
commit
207d4f6978
6 files changed
+295
-294
No files matched your search
Vendored
+4
-1
@@ -342,7 +342,10 @@
|
||||
"boss_8.h": "c",
|
||||
"config.h": "c",
|
||||
"sprite_tables.h": "c",
|
||||
"iron_ball.h": "c"
|
||||
"iron_ball.h": "c",
|
||||
"char_states.h": "c",
|
||||
"course_select.h": "c",
|
||||
"level_endings.h": "c"
|
||||
},
|
||||
"asm-code-lens.donated": true,
|
||||
"editor.formatOnSave": true,
|
||||
|
||||
@@ -2,11 +2,27 @@
|
||||
#define GUARD_STAGE_RESULTS_H
|
||||
|
||||
#include "global.h"
|
||||
#include "sprite.h"
|
||||
#include "screen_fade.h"
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ ScreenFade fade;
|
||||
/* 0x0C */ Sprite title[3];
|
||||
/* 0x9C */ Sprite sprScores[3];
|
||||
/* 0x12C */ Sprite separator;
|
||||
/* 0x15C */ u32 timeBonusScore;
|
||||
/* 0x160 */ u32 ringBonusScore;
|
||||
/* 0x164 */ u32 spRingBonusScore;
|
||||
/* 0x168 */ s32 counter; // frames since task started
|
||||
/* 0x16C */ s32 unk16C;
|
||||
} StageResultsBase; /* size: 0x174 */
|
||||
|
||||
u16 CreateStageResults(u32, u16, u8);
|
||||
void StageResults_AnimateSeparator(void);
|
||||
void StageResults_AnimateTitle(void);
|
||||
|
||||
extern const u16 sAnimsGotThroughZoneAndActNames[11][3];
|
||||
extern const u16 sStageResultsHeadlineTexts[5][3];
|
||||
extern const u16 sAnimsGotThroughCharacterNames[5][3];
|
||||
extern const u16 gAnimsGotThroughZoneAndActNames[][3];
|
||||
extern const u16 gStageResultsHeadlineTexts[][3];
|
||||
extern const u16 gAnimsGotThroughCharacterNames[][3];
|
||||
|
||||
#endif // GUARD_STAGE_RESULTS_H
|
||||
@@ -112,6 +112,8 @@ void sub_8036168(void)
|
||||
|
||||
if (--countdown->unk68 == 0) {
|
||||
gPlayer.moveState &= ~MOVESTATE_IGNORE_INPUT;
|
||||
// Uncomment to skip straight to level ending
|
||||
// gPlayer.moveState |= MOVESTATE_GOAL_REACHED;
|
||||
gStageFlags &= ~STAGE_FLAG__ACT_START;
|
||||
gStageFlags &= ~STAGE_FLAG__100;
|
||||
gPlayer.charState = CHARSTATE_WALK_A;
|
||||
@@ -149,8 +151,8 @@ void sub_8036168(void)
|
||||
s = &countdown->sprCountdownDigits;
|
||||
s->variant = SA2_ANIM_VARIANT_COUNTDOWN_1 - Div(countdown->unk68, GBA_FRAMES_PER_SECOND);
|
||||
s->prevVariant = -1;
|
||||
s->x = (I(gPlayer.x) - gCamera.x) + 0x18;
|
||||
s->y = (I(gPlayer.y) - gCamera.y) - 0x18;
|
||||
s->x = (I(gPlayer.x) - gCamera.x) + 24;
|
||||
s->y = (I(gPlayer.y) - gCamera.y) - 24;
|
||||
UpdateSpriteAnimation(s);
|
||||
DisplaySprite(s);
|
||||
}
|
||||
@@ -175,11 +177,9 @@ void sub_8036398(void)
|
||||
|
||||
s->x = countdown->unk60 - gCamera.x;
|
||||
s->y = countdown->unk64 - gCamera.y;
|
||||
{
|
||||
if (IS_OUT_OF_CAM_RANGE(s->x, s->y)) {
|
||||
TaskDestroy(gCurTask);
|
||||
return;
|
||||
}
|
||||
if (IS_OUT_OF_CAM_RANGE(s->x, s->y)) {
|
||||
TaskDestroy(gCurTask);
|
||||
return;
|
||||
}
|
||||
|
||||
UpdateSpriteAnimation(s);
|
||||
|
||||
+139
-149
@@ -21,15 +21,7 @@
|
||||
#include "constants/zones.h"
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ ScreenFade fade;
|
||||
/* 0x0C */ Sprite s1[3];
|
||||
/* 0x9C */ Sprite sprScores[3];
|
||||
/* 0x12C */ Sprite s7;
|
||||
/* 0x15C */ u32 timeBonusScore;
|
||||
/* 0x160 */ u32 ringBonusScore;
|
||||
/* 0x164 */ u32 spRingBonusScore;
|
||||
/* 0x168 */ s32 counter; // frames since task started
|
||||
/* 0x16C */ s32 unk16C;
|
||||
StageResultsBase base;
|
||||
/* 0x170 */ bool8 isCountingDone;
|
||||
} StageResults; /* size: 0x174 */
|
||||
|
||||
@@ -37,7 +29,12 @@ typedef struct {
|
||||
#define OUTRO_RING_BONUS_Y_POS (DISPLAY_HEIGHT / 2) + 30
|
||||
#define OUTRO_SP_RING_BONUS_Y_POS (DISPLAY_HEIGHT / 2) + 50
|
||||
|
||||
const u16 sAnimsGotThroughCharacterNames[5][3] = {
|
||||
static void Task_UpdateStageResults(void);
|
||||
static void TaskDestructor_StageResults(struct Task *);
|
||||
static void AnimateResults(u16 frame);
|
||||
static void DestroyStageResultsGfx(void);
|
||||
|
||||
const u16 gAnimsGotThroughCharacterNames[][3] = {
|
||||
{ 24, SA2_ANIM_CHAR_GOT_THROUGH, SA2_ANIM_VARIANT_CHAR_GOT_THROUGH_SONIC },
|
||||
{ 27, SA2_ANIM_CHAR_GOT_THROUGH, SA2_ANIM_VARIANT_CHAR_GOT_THROUGH_CREAM },
|
||||
{ 24, SA2_ANIM_CHAR_GOT_THROUGH, SA2_ANIM_VARIANT_CHAR_GOT_THROUGH_TAILS },
|
||||
@@ -45,7 +42,7 @@ const u16 sAnimsGotThroughCharacterNames[5][3] = {
|
||||
{ 18, SA2_ANIM_CHAR_GOT_THROUGH, SA2_ANIM_VARIANT_CHAR_GOT_THROUGH_AMY },
|
||||
};
|
||||
|
||||
const u16 sStageResultsHeadlineTexts[5][3] = {
|
||||
const u16 gStageResultsHeadlineTexts[][3] = {
|
||||
{ 28, SA2_ANIM_RESULTS_HEADLINE, SA2_ANIM_VARIANT_RESULTS_HEADLINE_GOT_THROUGH },
|
||||
{ 36, SA2_ANIM_RESULTS_HEADLINE, SA2_ANIM_VARIANT_RESULTS_HEADLINE_BOSS_DESTROYED },
|
||||
{ 0, 0, 0 },
|
||||
@@ -53,7 +50,7 @@ const u16 sStageResultsHeadlineTexts[5][3] = {
|
||||
{ 0, 0, 0 },
|
||||
};
|
||||
|
||||
const u16 sAnimsGotThroughZoneAndActNames[11][3] = {
|
||||
const u16 gAnimsGotThroughZoneAndActNames[][3] = {
|
||||
{ 14, SA2_ANIM_STAGE, SA2_ANIM_VARIANT_STAGE_ACT_1 }, { 14, SA2_ANIM_STAGE, SA2_ANIM_VARIANT_STAGE_ACT_2 },
|
||||
{ 18, SA2_ANIM_STAGE, SA2_ANIM_VARIANT_STAGE_ZONE(ZONE_1) }, { 18, SA2_ANIM_STAGE, SA2_ANIM_VARIANT_STAGE_ZONE(ZONE_2) },
|
||||
{ 18, SA2_ANIM_STAGE, SA2_ANIM_VARIANT_STAGE_ZONE(ZONE_3) }, { 18, SA2_ANIM_STAGE, SA2_ANIM_VARIANT_STAGE_ZONE(ZONE_4) },
|
||||
@@ -62,20 +59,13 @@ const u16 sAnimsGotThroughZoneAndActNames[11][3] = {
|
||||
{ 16, SA2_ANIM_STAGE, SA2_ANIM_VARIANT_STAGE_EXTRA },
|
||||
};
|
||||
|
||||
static const u16 sStageScoreBonusesTexts[3][3] = {
|
||||
static const u16 sStageScoreBonusesTexts[][3] = {
|
||||
{ 26, SA2_ANIM_SCORE_BONUSES, SA2_ANIM_VARIANT_SCORE_BONUSES_TIME },
|
||||
{ 26, SA2_ANIM_SCORE_BONUSES, SA2_ANIM_VARIANT_SCORE_BONUSES_RING },
|
||||
{ 26, SA2_ANIM_SCORE_BONUSES, SA2_ANIM_VARIANT_SCORE_BONUSES_SP_RING },
|
||||
};
|
||||
|
||||
static const u16 sStageResultsTextOffset[3] = { 0, 69, 173 };
|
||||
|
||||
void Task_UpdateStageResults(void);
|
||||
void TaskDestructor_StageResults(struct Task *);
|
||||
void sub_80310F0(void);
|
||||
static void sub_8031138(u16 p0);
|
||||
void sub_8031314(void);
|
||||
static void DestroyStageResultsGfx(void);
|
||||
static const u16 sStageResultsTextOffset[] = { 0, 69, 173 };
|
||||
|
||||
u16 CreateStageResults(u32 courseTime, u16 ringCount, u8 spRingCount)
|
||||
{
|
||||
@@ -94,70 +84,70 @@ u16 CreateStageResults(u32 courseTime, u16 ringCount, u8 spRingCount)
|
||||
|
||||
t = TaskCreate(Task_UpdateStageResults, sizeof(StageResults), 0xC100, 0, TaskDestructor_StageResults);
|
||||
outro = TASK_DATA(t);
|
||||
outro->counter = zero;
|
||||
outro->base.counter = zero;
|
||||
outro->isCountingDone = zero;
|
||||
|
||||
outro->fade.window = zero;
|
||||
outro->fade.flags = 1;
|
||||
outro->fade.speed = Q(1.0);
|
||||
outro->fade.brightness = zero;
|
||||
outro->fade.bldCnt = 0x3FFF;
|
||||
outro->fade.bldAlpha = zero;
|
||||
outro->base.fade.window = zero;
|
||||
outro->base.fade.flags = 1;
|
||||
outro->base.fade.speed = Q(1.0);
|
||||
outro->base.fade.brightness = zero;
|
||||
outro->base.fade.bldCnt = 0x3FFF;
|
||||
outro->base.fade.bldAlpha = zero;
|
||||
|
||||
if ((gPlayer.moveState & MOVESTATE_GOAL_REACHED) && (gSpecialRingCount >= SPECIAL_STAGE_REQUIRED_SP_RING_COUNT)) {
|
||||
outro->fade.speed = Q(0.25);
|
||||
outro->fade.bldCnt = 0x3FBF;
|
||||
outro->base.fade.speed = Q(0.25);
|
||||
outro->base.fade.bldCnt = 0x3FBF;
|
||||
} else if (IS_FINAL_OR_EXTRA_STAGE(gCurrentLevel)) {
|
||||
outro->fade.bldCnt = 0x3FAF;
|
||||
outro->fade.brightness = 0x2000;
|
||||
UpdateScreenFade(&outro->fade);
|
||||
outro->base.fade.bldCnt = 0x3FAF;
|
||||
outro->base.fade.brightness = 0x2000;
|
||||
UpdateScreenFade(&outro->base.fade);
|
||||
}
|
||||
|
||||
if (courseTime < ZONE_TIME_TO_INT(0, 30)) {
|
||||
outro->timeBonusScore = 80000;
|
||||
outro->base.timeBonusScore = 80000;
|
||||
} else if (courseTime < ZONE_TIME_TO_INT(0, 50)) {
|
||||
outro->timeBonusScore = 50000;
|
||||
outro->base.timeBonusScore = 50000;
|
||||
} else if (courseTime < ZONE_TIME_TO_INT(1, 0)) {
|
||||
outro->timeBonusScore = 10000;
|
||||
outro->base.timeBonusScore = 10000;
|
||||
} else if (courseTime < ZONE_TIME_TO_INT(1, 30)) {
|
||||
outro->timeBonusScore = 5000;
|
||||
outro->base.timeBonusScore = 5000;
|
||||
} else if (courseTime < ZONE_TIME_TO_INT(2, 0)) {
|
||||
outro->timeBonusScore = 4000;
|
||||
outro->base.timeBonusScore = 4000;
|
||||
} else if (courseTime < ZONE_TIME_TO_INT(3, 0)) {
|
||||
outro->timeBonusScore = 3000;
|
||||
outro->base.timeBonusScore = 3000;
|
||||
} else if (courseTime < ZONE_TIME_TO_INT(4, 0)) {
|
||||
outro->timeBonusScore = 2000;
|
||||
outro->base.timeBonusScore = 2000;
|
||||
} else if (courseTime < ZONE_TIME_TO_INT(5, 0)) {
|
||||
outro->timeBonusScore = 1000;
|
||||
outro->base.timeBonusScore = 1000;
|
||||
} else if (courseTime < ZONE_TIME_TO_INT(6, 0)) {
|
||||
outro->timeBonusScore = 500;
|
||||
outro->base.timeBonusScore = 500;
|
||||
} else {
|
||||
outro->timeBonusScore = 0;
|
||||
outro->base.timeBonusScore = 0;
|
||||
}
|
||||
|
||||
outro->ringBonusScore = ringCount * 100;
|
||||
outro->base.ringBonusScore = ringCount * 100;
|
||||
|
||||
if (spRingCount == SPECIAL_STAGE_REQUIRED_SP_RING_COUNT) {
|
||||
outro->spRingBonusScore = 10000;
|
||||
outro->base.spRingBonusScore = 10000;
|
||||
} else {
|
||||
outro->spRingBonusScore = spRingCount * 1000;
|
||||
outro->base.spRingBonusScore = spRingCount * 1000;
|
||||
}
|
||||
|
||||
if (outro->spRingBonusScore > outro->ringBonusScore) {
|
||||
if (outro->spRingBonusScore > outro->timeBonusScore) {
|
||||
outro->unk16C = Div(outro->spRingBonusScore, 100);
|
||||
if (outro->base.spRingBonusScore > outro->base.ringBonusScore) {
|
||||
if (outro->base.spRingBonusScore > outro->base.timeBonusScore) {
|
||||
outro->base.unk16C = Div(outro->base.spRingBonusScore, 100);
|
||||
} else {
|
||||
outro->unk16C = Div(outro->timeBonusScore, 100);
|
||||
outro->base.unk16C = Div(outro->base.timeBonusScore, 100);
|
||||
}
|
||||
} else {
|
||||
if (outro->ringBonusScore > outro->timeBonusScore) {
|
||||
outro->unk16C = Div(outro->ringBonusScore, 100);
|
||||
if (outro->base.ringBonusScore > outro->base.timeBonusScore) {
|
||||
outro->base.unk16C = Div(outro->base.ringBonusScore, 100);
|
||||
} else {
|
||||
outro->unk16C = Div(outro->timeBonusScore, 100);
|
||||
outro->base.unk16C = Div(outro->base.timeBonusScore, 100);
|
||||
}
|
||||
}
|
||||
|
||||
s = &outro->s7;
|
||||
s = &outro->base.separator;
|
||||
s->x = DISPLAY_WIDTH + 16;
|
||||
s->y = (DISPLAY_HEIGHT / 2);
|
||||
s->graphics.dest = VramMalloc(4);
|
||||
@@ -174,12 +164,12 @@ u16 CreateStageResults(u32 courseTime, u16 ringCount, u8 spRingCount)
|
||||
s->frameFlags = SPRITE_FLAG(PRIORITY, 0);
|
||||
UpdateSpriteAnimation(s);
|
||||
|
||||
s = &outro->s1[0];
|
||||
s = &outro->base.title[0];
|
||||
s->x = DISPLAY_WIDTH + 16;
|
||||
s->y = (DISPLAY_HEIGHT / 2) - 39;
|
||||
s->graphics.dest = VramMalloc(sAnimsGotThroughCharacterNames[gSelectedCharacter][0]);
|
||||
s->graphics.anim = sAnimsGotThroughCharacterNames[gSelectedCharacter][1];
|
||||
s->variant = sAnimsGotThroughCharacterNames[gSelectedCharacter][2];
|
||||
s->graphics.dest = VramMalloc(gAnimsGotThroughCharacterNames[gSelectedCharacter][0]);
|
||||
s->graphics.anim = gAnimsGotThroughCharacterNames[gSelectedCharacter][1];
|
||||
s->variant = gAnimsGotThroughCharacterNames[gSelectedCharacter][2];
|
||||
s->oamFlags = SPRITE_OAM_ORDER(4);
|
||||
s->graphics.size = 0;
|
||||
s->animCursor = 0;
|
||||
@@ -196,17 +186,17 @@ u16 CreateStageResults(u32 courseTime, u16 ringCount, u8 spRingCount)
|
||||
u8 level;
|
||||
bool32 isBossAct = ACT_INDEX(gCurrentLevel) >> 1;
|
||||
|
||||
s = &outro->s1[1];
|
||||
s = &outro->base.title[1];
|
||||
s->x = DISPLAY_WIDTH + 16;
|
||||
s->y = (DISPLAY_HEIGHT / 2) - 31;
|
||||
s->graphics.dest = VramMalloc(sStageResultsHeadlineTexts[isBossAct][0]);
|
||||
s->graphics.anim = sStageResultsHeadlineTexts[isBossAct][1];
|
||||
s->variant = sStageResultsHeadlineTexts[isBossAct][2];
|
||||
s->graphics.dest = VramMalloc(gStageResultsHeadlineTexts[isBossAct][0]);
|
||||
s->graphics.anim = gStageResultsHeadlineTexts[isBossAct][1];
|
||||
s->variant = gStageResultsHeadlineTexts[isBossAct][2];
|
||||
|
||||
extraLevel = gCurrentLevel; // needed for matching
|
||||
if (IS_FINAL_STAGE(extraLevel) || IS_EXTRA_STAGE(gCurrentLevel)) {
|
||||
s->graphics.anim = sStageResultsHeadlineTexts[0][1];
|
||||
s->variant = sStageResultsHeadlineTexts[0][2];
|
||||
s->graphics.anim = gStageResultsHeadlineTexts[0][1];
|
||||
s->variant = gStageResultsHeadlineTexts[0][2];
|
||||
}
|
||||
|
||||
s->oamFlags = SPRITE_OAM_ORDER(4);
|
||||
@@ -227,19 +217,19 @@ u16 CreateStageResults(u32 courseTime, u16 ringCount, u8 spRingCount)
|
||||
level = gCurrentLevel & 1;
|
||||
}
|
||||
|
||||
s = &outro->s1[2];
|
||||
s = &outro->base.title[2];
|
||||
s->x = DISPLAY_WIDTH + 16;
|
||||
s->y = (DISPLAY_HEIGHT / 2) - 31;
|
||||
s->graphics.dest = VramMalloc(sAnimsGotThroughZoneAndActNames[level][0]);
|
||||
s->graphics.anim = sAnimsGotThroughZoneAndActNames[level][1];
|
||||
s->variant = sAnimsGotThroughZoneAndActNames[level][2];
|
||||
s->graphics.dest = VramMalloc(gAnimsGotThroughZoneAndActNames[level][0]);
|
||||
s->graphics.anim = gAnimsGotThroughZoneAndActNames[level][1];
|
||||
s->variant = gAnimsGotThroughZoneAndActNames[level][2];
|
||||
|
||||
if (IS_FINAL_STAGE(gCurrentLevel)) {
|
||||
s->graphics.anim = sAnimsGotThroughZoneAndActNames[9][1];
|
||||
s->variant = sAnimsGotThroughZoneAndActNames[9][2];
|
||||
s->graphics.anim = gAnimsGotThroughZoneAndActNames[9][1];
|
||||
s->variant = gAnimsGotThroughZoneAndActNames[9][2];
|
||||
} else if (IS_EXTRA_STAGE(gCurrentLevel)) {
|
||||
s->graphics.anim = sAnimsGotThroughZoneAndActNames[10][1];
|
||||
s->variant = sAnimsGotThroughZoneAndActNames[10][2];
|
||||
s->graphics.anim = gAnimsGotThroughZoneAndActNames[10][1];
|
||||
s->variant = gAnimsGotThroughZoneAndActNames[10][2];
|
||||
}
|
||||
|
||||
s->oamFlags = SPRITE_OAM_ORDER(4);
|
||||
@@ -254,8 +244,8 @@ u16 CreateStageResults(u32 courseTime, u16 ringCount, u8 spRingCount)
|
||||
UpdateSpriteAnimation(s);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(outro->sprScores); i++) {
|
||||
s = &outro->sprScores[i];
|
||||
for (i = 0; i < ARRAY_COUNT(outro->base.sprScores); i++) {
|
||||
s = &outro->base.sprScores[i];
|
||||
s->x = DISPLAY_WIDTH + 16;
|
||||
s->y = ((DISPLAY_HEIGHT / 2) - 6) + i * 20;
|
||||
s->graphics.dest = VramMalloc(sStageScoreBonusesTexts[i][0]);
|
||||
@@ -290,18 +280,18 @@ u16 CreateStageResults(u32 courseTime, u16 ringCount, u8 spRingCount)
|
||||
m4aSongNumStart(MUS_ACT_CLEAR);
|
||||
}
|
||||
|
||||
return (u16)outro->unk16C;
|
||||
return (u16)outro->base.unk16C;
|
||||
}
|
||||
|
||||
void Task_UpdateStageResults(void)
|
||||
static void Task_UpdateStageResults(void)
|
||||
{
|
||||
StageResults *outro = TASK_DATA(gCurTask);
|
||||
u32 counter = outro->counter;
|
||||
u32 counter = outro->base.counter;
|
||||
|
||||
if (++counter > outro->unk16C + 309) {
|
||||
counter = outro->unk16C + 310;
|
||||
if (++counter > outro->base.unk16C + 309) {
|
||||
counter = outro->base.unk16C + 310;
|
||||
}
|
||||
outro->counter = counter;
|
||||
outro->base.counter = counter;
|
||||
|
||||
if (IS_EXTRA_STAGE(gCurrentLevel)) {
|
||||
gBldRegs.bldCnt = (BLDCNT_TGT2_ALL | BLDCNT_EFFECT_LIGHTEN | BLDCNT_TGT1_BD | BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2
|
||||
@@ -309,41 +299,41 @@ void Task_UpdateStageResults(void)
|
||||
}
|
||||
|
||||
if (counter >= 150) {
|
||||
if (outro->ringBonusScore != 0) {
|
||||
outro->ringBonusScore -= 100;
|
||||
if (outro->base.ringBonusScore != 0) {
|
||||
outro->base.ringBonusScore -= 100;
|
||||
INCREMENT_SCORE_A(100);
|
||||
}
|
||||
|
||||
if (outro->spRingBonusScore != 0) {
|
||||
outro->spRingBonusScore -= 100;
|
||||
if (outro->base.spRingBonusScore != 0) {
|
||||
outro->base.spRingBonusScore -= 100;
|
||||
INCREMENT_SCORE_A(100);
|
||||
}
|
||||
|
||||
if (outro->timeBonusScore != 0) {
|
||||
outro->timeBonusScore -= 100;
|
||||
if (outro->base.timeBonusScore != 0) {
|
||||
outro->base.timeBonusScore -= 100;
|
||||
INCREMENT_SCORE_A(100);
|
||||
}
|
||||
|
||||
// If user pressed A, quickly finish score counting
|
||||
if (!IS_FINAL_OR_EXTRA_STAGE(gCurrentLevel)) {
|
||||
if (gPressedKeys & A_BUTTON) {
|
||||
INCREMENT_SCORE_A(outro->ringBonusScore);
|
||||
INCREMENT_SCORE_A(outro->spRingBonusScore);
|
||||
INCREMENT_SCORE_A(outro->timeBonusScore);
|
||||
INCREMENT_SCORE_A(outro->base.ringBonusScore);
|
||||
INCREMENT_SCORE_A(outro->base.spRingBonusScore);
|
||||
INCREMENT_SCORE_A(outro->base.timeBonusScore);
|
||||
|
||||
outro->ringBonusScore = 0;
|
||||
outro->spRingBonusScore = 0;
|
||||
outro->timeBonusScore = 0;
|
||||
outro->base.ringBonusScore = 0;
|
||||
outro->base.spRingBonusScore = 0;
|
||||
outro->base.timeBonusScore = 0;
|
||||
|
||||
if (counter < outro->unk16C + 149) {
|
||||
counter = outro->unk16C + 149;
|
||||
outro->counter = counter;
|
||||
if (counter < outro->base.unk16C + 149) {
|
||||
counter = outro->base.unk16C + 149;
|
||||
outro->base.counter = counter;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((gStageTime % 4u) == 0) {
|
||||
if ((outro->ringBonusScore != 0) || (outro->spRingBonusScore != 0) || (outro->timeBonusScore != 0)) {
|
||||
if ((outro->base.ringBonusScore != 0) || (outro->base.spRingBonusScore != 0) || (outro->base.timeBonusScore != 0)) {
|
||||
m4aSongNumStart(SE_STAGE_RESULT_COUNTER);
|
||||
} else if (!outro->isCountingDone) {
|
||||
outro->isCountingDone = TRUE;
|
||||
@@ -352,7 +342,7 @@ void Task_UpdateStageResults(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (counter > outro->unk16C + 309) {
|
||||
if (counter > outro->base.unk16C + 309) {
|
||||
if (IS_FINAL_STAGE(gCurrentLevel)) {
|
||||
if ((gMPlayInfo_BGM.status & 0xFFFF) == 0) {
|
||||
gLoadedSaveGame->unlockedLevels[gSelectedCharacter] = LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53);
|
||||
@@ -388,7 +378,7 @@ void Task_UpdateStageResults(void)
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (UpdateScreenFade(&outro->fade) == 1) {
|
||||
if (UpdateScreenFade(&outro->base.fade) == 1) {
|
||||
gBldRegs.bldY = 0x10;
|
||||
gPlayer.moveState |= MOVESTATE_100000;
|
||||
|
||||
@@ -488,27 +478,27 @@ void Task_UpdateStageResults(void)
|
||||
}
|
||||
}
|
||||
|
||||
sub_80310F0();
|
||||
sub_8031314();
|
||||
StageResults_AnimateSeparator();
|
||||
StageResults_AnimateTitle();
|
||||
|
||||
if (IS_FINAL_OR_EXTRA_STAGE(gCurrentLevel)) {
|
||||
if (counter > outro->unk16C + 245) {
|
||||
if (counter > outro->base.unk16C + 245) {
|
||||
u32 innerCount = counter;
|
||||
innerCount -= 245;
|
||||
sub_8031138((innerCount - outro->unk16C) * 16);
|
||||
AnimateResults((innerCount - outro->base.unk16C) * 16);
|
||||
} else {
|
||||
sub_8031138(0);
|
||||
AnimateResults(0);
|
||||
}
|
||||
} else {
|
||||
sub_8031138(0);
|
||||
AnimateResults(0);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80310F0(void)
|
||||
void StageResults_AnimateSeparator(void)
|
||||
{
|
||||
StageResults *outro = TASK_DATA(gCurTask);
|
||||
u32 counter = outro->counter;
|
||||
Sprite *s = &outro->s7;
|
||||
u32 counter = outro->base.counter;
|
||||
Sprite *s = &outro->base.separator;
|
||||
|
||||
if (counter <= 15) {
|
||||
s->x = (16 - counter) * 15;
|
||||
@@ -520,17 +510,17 @@ void sub_80310F0(void)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8031138(u16 p0)
|
||||
static void AnimateResults(u16 frame)
|
||||
{
|
||||
StageResults *outro = TASK_DATA(gCurTask);
|
||||
u32 counter = outro->counter;
|
||||
u32 counter = outro->base.counter;
|
||||
u32 i;
|
||||
Sprite *s;
|
||||
s32 r4;
|
||||
|
||||
if (counter < 24) {
|
||||
s32 x;
|
||||
s = &outro->s7;
|
||||
s = &outro->base.separator;
|
||||
x = 0;
|
||||
|
||||
if (counter <= 16) {
|
||||
@@ -538,14 +528,14 @@ void sub_8031138(u16 p0)
|
||||
}
|
||||
|
||||
for (i = 0; i < ((DISPLAY_WIDTH + 32) / 32); i++) {
|
||||
s->x = (x - p0) + i * 32;
|
||||
s->x = (x - frame) + i * 32;
|
||||
DisplaySprite(s);
|
||||
}
|
||||
} else {
|
||||
s = &outro->s7;
|
||||
s = &outro->base.separator;
|
||||
|
||||
for (i = 0; i < ((DISPLAY_WIDTH + 32) / 32); i++) {
|
||||
s->x = -p0 + i * 32;
|
||||
s->x = -frame + i * 32;
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
@@ -554,15 +544,15 @@ void sub_8031138(u16 p0)
|
||||
u32 numDisplayedBonuses = (ACT_INDEX(gCurrentLevel) == ACT_BOSS) ? 2 : 3;
|
||||
|
||||
for (i = 0; i < numDisplayedBonuses; i++) {
|
||||
s = &outro->s1[i];
|
||||
s->x -= p0;
|
||||
s = &outro->base.title[i];
|
||||
s->x -= frame;
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
|
||||
if (counter >= 39) {
|
||||
|
||||
s = &outro->sprScores[0];
|
||||
s = &outro->base.sprScores[0];
|
||||
|
||||
if (counter < 56) {
|
||||
u16 innerX = DISPLAY_WIDTH - ((counter - 39) * 12);
|
||||
@@ -570,18 +560,18 @@ void sub_8031138(u16 p0)
|
||||
} else {
|
||||
r4 = (DISPLAY_WIDTH / 2) - 72;
|
||||
}
|
||||
s->x = r4 - p0;
|
||||
s->x = r4 - frame;
|
||||
DisplaySprite(s);
|
||||
|
||||
{
|
||||
s16 r4_2 = r4;
|
||||
s16 pp = p0;
|
||||
StageUI_PrintIntegerAt(outro->timeBonusScore, r4_2 + 144 - pp, OUTRO_TIME_BONUS_Y_POS, 0);
|
||||
s16 pp = frame;
|
||||
StageUI_PrintIntegerAt(outro->base.timeBonusScore, r4_2 + 144 - pp, OUTRO_TIME_BONUS_Y_POS, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (counter >= 49) {
|
||||
s = &outro->sprScores[1];
|
||||
s = &outro->base.sprScores[1];
|
||||
|
||||
if (counter <= 65) {
|
||||
u16 innerX = DISPLAY_WIDTH - ((counter - 49) * 12);
|
||||
@@ -589,18 +579,18 @@ void sub_8031138(u16 p0)
|
||||
} else {
|
||||
r4 = (DISPLAY_WIDTH / 2) - 72;
|
||||
}
|
||||
s->x = r4 - p0;
|
||||
s->x = r4 - frame;
|
||||
DisplaySprite(s);
|
||||
|
||||
{
|
||||
s16 r4_2 = r4;
|
||||
s16 pp = p0;
|
||||
StageUI_PrintIntegerAt(outro->ringBonusScore, r4_2 + 144 - pp, OUTRO_RING_BONUS_Y_POS, 0);
|
||||
s16 pp = frame;
|
||||
StageUI_PrintIntegerAt(outro->base.ringBonusScore, r4_2 + 144 - pp, OUTRO_RING_BONUS_Y_POS, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if ((ACT_INDEX(gCurrentLevel) != ACT_BOSS) && (gCurrentLevel < LEVEL_INDEX(ZONE_FINAL, ACT_XX_FINAL_ZONE)) && (counter >= 59)) {
|
||||
s = &outro->sprScores[2];
|
||||
s = &outro->base.sprScores[2];
|
||||
|
||||
if (counter <= 75) {
|
||||
u16 innerX = DISPLAY_WIDTH - ((counter - 59) * 12);
|
||||
@@ -609,21 +599,21 @@ void sub_8031138(u16 p0)
|
||||
r4 = (DISPLAY_WIDTH / 2) - 72;
|
||||
}
|
||||
|
||||
s->x = r4 - p0;
|
||||
s->x = r4 - frame;
|
||||
DisplaySprite(s);
|
||||
|
||||
{
|
||||
s16 r4_2 = r4;
|
||||
s16 pp = p0;
|
||||
StageUI_PrintIntegerAt(outro->spRingBonusScore, r4_2 + 144 - pp, OUTRO_SP_RING_BONUS_Y_POS, 0);
|
||||
s16 pp = frame;
|
||||
StageUI_PrintIntegerAt(outro->base.spRingBonusScore, r4_2 + 144 - pp, OUTRO_SP_RING_BONUS_Y_POS, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8031314(void)
|
||||
void StageResults_AnimateTitle(void)
|
||||
{
|
||||
StageResults *outro = TASK_DATA(gCurTask);
|
||||
u32 counter = outro->counter;
|
||||
u32 counter = outro->base.counter;
|
||||
|
||||
if (counter > 28) {
|
||||
u32 x;
|
||||
@@ -638,7 +628,7 @@ void sub_8031314(void)
|
||||
s32 i = 0;
|
||||
s32 x2 = (s16)x;
|
||||
for (; i < ARRAY_COUNT(sStageResultsTextOffset); i++) {
|
||||
Sprite *s = &outro->s1[i];
|
||||
Sprite *s = &outro->base.title[i];
|
||||
s32 offset = sStageResultsTextOffset[i];
|
||||
s->x = x2 + offset;
|
||||
}
|
||||
@@ -646,32 +636,32 @@ void sub_8031314(void)
|
||||
}
|
||||
}
|
||||
|
||||
void TaskDestructor_StageResults(struct Task *t)
|
||||
static void TaskDestructor_StageResults(struct Task *t)
|
||||
{
|
||||
StageResults *outro = TASK_DATA(t);
|
||||
if (outro->s7.graphics.dest != NULL) {
|
||||
VramFree(outro->s7.graphics.dest);
|
||||
VramFree(outro->s1[0].graphics.dest);
|
||||
VramFree(outro->s1[1].graphics.dest);
|
||||
VramFree(outro->s1[2].graphics.dest);
|
||||
VramFree(outro->sprScores[0].graphics.dest);
|
||||
VramFree(outro->sprScores[1].graphics.dest);
|
||||
VramFree(outro->sprScores[2].graphics.dest);
|
||||
if (outro->base.separator.graphics.dest != NULL) {
|
||||
VramFree(outro->base.separator.graphics.dest);
|
||||
VramFree(outro->base.title[0].graphics.dest);
|
||||
VramFree(outro->base.title[1].graphics.dest);
|
||||
VramFree(outro->base.title[2].graphics.dest);
|
||||
VramFree(outro->base.sprScores[0].graphics.dest);
|
||||
VramFree(outro->base.sprScores[1].graphics.dest);
|
||||
VramFree(outro->base.sprScores[2].graphics.dest);
|
||||
}
|
||||
}
|
||||
|
||||
void DestroyStageResultsGfx(void)
|
||||
static void DestroyStageResultsGfx(void)
|
||||
{
|
||||
StageResults *outro = TASK_DATA(gCurTask);
|
||||
if (outro->s7.graphics.dest != NULL) {
|
||||
VramFree(outro->s7.graphics.dest);
|
||||
VramFree(outro->s1[0].graphics.dest);
|
||||
VramFree(outro->s1[1].graphics.dest);
|
||||
VramFree(outro->s1[2].graphics.dest);
|
||||
VramFree(outro->sprScores[0].graphics.dest);
|
||||
VramFree(outro->sprScores[1].graphics.dest);
|
||||
VramFree(outro->sprScores[2].graphics.dest);
|
||||
if (outro->base.separator.graphics.dest != NULL) {
|
||||
VramFree(outro->base.separator.graphics.dest);
|
||||
VramFree(outro->base.title[0].graphics.dest);
|
||||
VramFree(outro->base.title[1].graphics.dest);
|
||||
VramFree(outro->base.title[2].graphics.dest);
|
||||
VramFree(outro->base.sprScores[0].graphics.dest);
|
||||
VramFree(outro->base.sprScores[1].graphics.dest);
|
||||
VramFree(outro->base.sprScores[2].graphics.dest);
|
||||
|
||||
outro->s7.graphics.dest = NULL;
|
||||
outro->base.separator.graphics.dest = NULL;
|
||||
}
|
||||
}
|
||||
+125
-133
@@ -16,51 +16,51 @@
|
||||
#include "constants/char_states.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
struct TimeAttackResultsCutScene {
|
||||
ScreenFade unk0;
|
||||
Sprite unkC[3];
|
||||
Sprite unk9C[3];
|
||||
Sprite unk12C;
|
||||
u32 unk15C;
|
||||
u8 filler160[8];
|
||||
u32 unk168;
|
||||
u8 filler16C[5];
|
||||
typedef struct {
|
||||
StageResultsBase base;
|
||||
u8 unk170;
|
||||
u8 unk171;
|
||||
u8 unk172;
|
||||
u8 unk173;
|
||||
u8 unk174;
|
||||
u8 unk175;
|
||||
u8 filler176[2];
|
||||
Sprite unk178[7];
|
||||
Sprite digits[7];
|
||||
SpriteTransform transform;
|
||||
s16 unk2D4;
|
||||
s16 unk2D6;
|
||||
u8 unk2D8;
|
||||
};
|
||||
s16 medalSpinSpeed;
|
||||
s16 medalSpin;
|
||||
u8 rank;
|
||||
} TimeAttackResultsCutScene;
|
||||
|
||||
void sub_8089AEC(void);
|
||||
void sub_8089BB0(struct Task *);
|
||||
u8 sub_80899B8(u32 finishTime);
|
||||
static void TaskDestructor_TimeAttackResults(struct Task *);
|
||||
static void Task_AnimateResults(void);
|
||||
static void Task_HandleExit(void);
|
||||
static u8 StoreRecord(u32 finishTime);
|
||||
|
||||
static const s8 sTimeResultDigitAnim[] = {
|
||||
3, 2, 1, 0, 0, -1, -2, -3, -4, -4, -3, -2, 1, 2, 3, 0, 0, 0, 0, 0,
|
||||
};
|
||||
static const u8 unused[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
};
|
||||
|
||||
u32 CreateTimeAttackResults(u32 finishTime)
|
||||
{
|
||||
struct Task *t;
|
||||
struct TimeAttackResultsCutScene *resultsCutScene;
|
||||
TimeAttackResultsCutScene *resultsCutScene;
|
||||
ScreenFade *fade;
|
||||
Sprite *s = NULL;
|
||||
s16 millis, minutes, seconds;
|
||||
u8 i;
|
||||
u8 isBossLevel;
|
||||
u8 level;
|
||||
u8 i, level;
|
||||
bool8 isBossLevel;
|
||||
gLoadedSaveGame->score += (s16)gRingCount;
|
||||
|
||||
t = TaskCreate(sub_8089AEC, sizeof(struct TimeAttackResultsCutScene), 0xC100, 0, sub_8089BB0);
|
||||
t = TaskCreate(Task_AnimateResults, sizeof(TimeAttackResultsCutScene), 0xC100, 0, TaskDestructor_TimeAttackResults);
|
||||
resultsCutScene = TASK_DATA(t);
|
||||
fade = &resultsCutScene->unk0;
|
||||
fade = &resultsCutScene->base.fade;
|
||||
|
||||
resultsCutScene->unk168 = 0;
|
||||
resultsCutScene->unk2D4 = 0x800;
|
||||
resultsCutScene->unk2D6 = 0x4000;
|
||||
resultsCutScene->base.counter = 0;
|
||||
resultsCutScene->medalSpinSpeed = Q(8);
|
||||
resultsCutScene->medalSpin = Q(64);
|
||||
|
||||
fade->window = 0;
|
||||
fade->flags = 1;
|
||||
@@ -69,15 +69,14 @@ u32 CreateTimeAttackResults(u32 finishTime)
|
||||
fade->bldCnt = 0x3FFF;
|
||||
fade->bldAlpha = 0;
|
||||
|
||||
resultsCutScene->unk15C = finishTime;
|
||||
resultsCutScene->base.timeBonusScore = finishTime;
|
||||
|
||||
if (finishTime < MAX_COURSE_TIME) {
|
||||
s16 temp = finishTime % 60;
|
||||
u32 temp2 = finishTime - temp;
|
||||
resultsCutScene->unk15C = temp2;
|
||||
millis = gMillisUnpackTable[temp][0] * 10;
|
||||
millis += gMillisUnpackTable[temp][1];
|
||||
seconds = temp2 / 60;
|
||||
s16 millisIndex = finishTime % 60;
|
||||
resultsCutScene->base.timeBonusScore = finishTime - millisIndex;
|
||||
millis = gMillisUnpackTable[millisIndex][0] * 10;
|
||||
millis += gMillisUnpackTable[millisIndex][1];
|
||||
seconds = resultsCutScene->base.timeBonusScore / 60;
|
||||
minutes = seconds / 60;
|
||||
seconds += minutes * -60;
|
||||
} else {
|
||||
@@ -93,7 +92,7 @@ u32 CreateTimeAttackResults(u32 finishTime)
|
||||
resultsCutScene->unk175 = UNITS_DIGIT(millis);
|
||||
|
||||
for (i = 0; i < 7; i++) {
|
||||
s = &resultsCutScene->unk178[i];
|
||||
s = &resultsCutScene->digits[i];
|
||||
s->x = i * 14 + ((DISPLAY_WIDTH / 2) - 48);
|
||||
s->y = (DISPLAY_HEIGHT / 2) + 8;
|
||||
s->graphics.dest = VramMalloc(4);
|
||||
@@ -110,21 +109,21 @@ u32 CreateTimeAttackResults(u32 finishTime)
|
||||
s->frameFlags = 0;
|
||||
}
|
||||
|
||||
resultsCutScene->unk178[0].variant += resultsCutScene->unk171;
|
||||
resultsCutScene->unk178[1].variant = DELIMINATOR_DIGIT;
|
||||
resultsCutScene->unk178[2].variant += resultsCutScene->unk172;
|
||||
resultsCutScene->unk178[3].variant += resultsCutScene->unk173;
|
||||
resultsCutScene->unk178[4].variant = DELIMINATOR_DIGIT;
|
||||
resultsCutScene->unk178[5].variant += resultsCutScene->unk174;
|
||||
resultsCutScene->unk178[6].variant += resultsCutScene->unk175;
|
||||
resultsCutScene->digits[0].variant += resultsCutScene->unk171;
|
||||
resultsCutScene->digits[1].variant = DELIMINATOR_DIGIT;
|
||||
resultsCutScene->digits[2].variant += resultsCutScene->unk172;
|
||||
resultsCutScene->digits[3].variant += resultsCutScene->unk173;
|
||||
resultsCutScene->digits[4].variant = DELIMINATOR_DIGIT;
|
||||
resultsCutScene->digits[5].variant += resultsCutScene->unk174;
|
||||
resultsCutScene->digits[6].variant += resultsCutScene->unk175;
|
||||
|
||||
for (i = 0; i < 7; i++) {
|
||||
UpdateSpriteAnimation(&resultsCutScene->unk178[i]);
|
||||
UpdateSpriteAnimation(&resultsCutScene->digits[i]);
|
||||
}
|
||||
|
||||
resultsCutScene->unk2D8 = sub_80899B8(finishTime);
|
||||
resultsCutScene->rank = StoreRecord(finishTime);
|
||||
|
||||
s = &resultsCutScene->unk12C;
|
||||
s = &resultsCutScene->base.separator;
|
||||
s->x = DISPLAY_WIDTH + 16;
|
||||
s->y = (DISPLAY_HEIGHT / 2);
|
||||
s->graphics.dest = VramMalloc(4);
|
||||
@@ -141,12 +140,12 @@ u32 CreateTimeAttackResults(u32 finishTime)
|
||||
s->frameFlags = 0;
|
||||
UpdateSpriteAnimation(s);
|
||||
|
||||
s = &resultsCutScene->unkC[0];
|
||||
s = &resultsCutScene->base.title[0];
|
||||
s->x = DISPLAY_WIDTH + 16;
|
||||
s->y = (DISPLAY_HEIGHT / 2) - 39;
|
||||
s->graphics.dest = VramMalloc(sAnimsGotThroughCharacterNames[gSelectedCharacter][0]);
|
||||
s->graphics.anim = sAnimsGotThroughCharacterNames[gSelectedCharacter][1];
|
||||
s->variant = sAnimsGotThroughCharacterNames[gSelectedCharacter][2];
|
||||
s->graphics.dest = VramMalloc(gAnimsGotThroughCharacterNames[gSelectedCharacter][0]);
|
||||
s->graphics.anim = gAnimsGotThroughCharacterNames[gSelectedCharacter][1];
|
||||
s->variant = gAnimsGotThroughCharacterNames[gSelectedCharacter][2];
|
||||
s->oamFlags = SPRITE_OAM_ORDER(4);
|
||||
s->graphics.size = 0;
|
||||
s->animCursor = 0;
|
||||
@@ -160,12 +159,12 @@ u32 CreateTimeAttackResults(u32 finishTime)
|
||||
|
||||
isBossLevel = ACT_INDEX(gCurrentLevel) >> 1;
|
||||
|
||||
s = &resultsCutScene->unkC[1];
|
||||
s = &resultsCutScene->base.title[1];
|
||||
s->x = DISPLAY_WIDTH + 16;
|
||||
s->y = (DISPLAY_HEIGHT / 2) - 31;
|
||||
s->graphics.dest = VramMalloc(sStageResultsHeadlineTexts[isBossLevel][0]);
|
||||
s->graphics.anim = sStageResultsHeadlineTexts[isBossLevel][1];
|
||||
s->variant = sStageResultsHeadlineTexts[isBossLevel][2];
|
||||
s->graphics.dest = VramMalloc(gStageResultsHeadlineTexts[isBossLevel][0]);
|
||||
s->graphics.anim = gStageResultsHeadlineTexts[isBossLevel][1];
|
||||
s->variant = gStageResultsHeadlineTexts[isBossLevel][2];
|
||||
s->oamFlags = SPRITE_OAM_ORDER(4);
|
||||
s->graphics.size = 0;
|
||||
s->animCursor = 0;
|
||||
@@ -183,12 +182,12 @@ u32 CreateTimeAttackResults(u32 finishTime)
|
||||
} else {
|
||||
level = gCurrentLevel & 1;
|
||||
}
|
||||
s = &resultsCutScene->unkC[2];
|
||||
s = &resultsCutScene->base.title[2];
|
||||
s->x = DISPLAY_WIDTH + 16;
|
||||
s->y = (DISPLAY_HEIGHT / 2) - 31;
|
||||
s->graphics.dest = VramMalloc(sAnimsGotThroughZoneAndActNames[level][0]);
|
||||
s->graphics.anim = sAnimsGotThroughZoneAndActNames[level][1];
|
||||
s->variant = sAnimsGotThroughZoneAndActNames[level][2];
|
||||
s->graphics.dest = VramMalloc(gAnimsGotThroughZoneAndActNames[level][0]);
|
||||
s->graphics.anim = gAnimsGotThroughZoneAndActNames[level][1];
|
||||
s->variant = gAnimsGotThroughZoneAndActNames[level][2];
|
||||
s->oamFlags = SPRITE_OAM_ORDER(4);
|
||||
s->graphics.size = 0;
|
||||
s->animCursor = 0;
|
||||
@@ -200,7 +199,7 @@ u32 CreateTimeAttackResults(u32 finishTime)
|
||||
s->frameFlags = 0;
|
||||
UpdateSpriteAnimation(s);
|
||||
|
||||
s = &resultsCutScene->unk9C[0];
|
||||
s = &resultsCutScene->base.sprScores[0];
|
||||
s->x = (DISPLAY_WIDTH / 2) - 80;
|
||||
s->y = (DISPLAY_HEIGHT / 2) + 10;
|
||||
s->graphics.dest = VramMalloc(8);
|
||||
@@ -217,13 +216,13 @@ u32 CreateTimeAttackResults(u32 finishTime)
|
||||
s->frameFlags = 0;
|
||||
UpdateSpriteAnimation(s);
|
||||
|
||||
s = &resultsCutScene->unk9C[1];
|
||||
s = &resultsCutScene->base.sprScores[1];
|
||||
s->x = (DISPLAY_WIDTH / 2);
|
||||
s->y = (DISPLAY_HEIGHT / 2) + 40;
|
||||
s->graphics.dest = VramMalloc(16);
|
||||
s->graphics.anim = SA2_ANIM_TIME_ATTACK_DIGITS;
|
||||
if (resultsCutScene->unk2D8 != 0) {
|
||||
s->variant = resultsCutScene->unk2D8 + SA2_ANIM_VARIANT_TA_DIGITS_PLATE_0_BRONZE;
|
||||
if (resultsCutScene->rank != 0) {
|
||||
s->variant = resultsCutScene->rank + SA2_ANIM_VARIANT_TA_DIGITS_PLATE_0_BRONZE;
|
||||
} else {
|
||||
s->variant = SA2_ANIM_VARIANT_TA_DIGITS_PLATE_1_GOLD;
|
||||
}
|
||||
@@ -244,10 +243,10 @@ u32 CreateTimeAttackResults(u32 finishTime)
|
||||
resultsCutScene->transform.y = (DISPLAY_HEIGHT / 2) + 40;
|
||||
resultsCutScene->transform.rotation = 0;
|
||||
|
||||
s = &resultsCutScene->unk9C[2];
|
||||
s = &resultsCutScene->base.sprScores[2];
|
||||
s->x = (DISPLAY_WIDTH / 2);
|
||||
s->y = (DISPLAY_HEIGHT / 2) + 68;
|
||||
s->graphics.dest = VramMalloc(0x16);
|
||||
s->graphics.dest = VramMalloc(22);
|
||||
s->graphics.anim = SA2_ANIM_TA_RECORD;
|
||||
s->variant = 0;
|
||||
s->oamFlags = SPRITE_OAM_ORDER(4);
|
||||
@@ -267,7 +266,7 @@ u32 CreateTimeAttackResults(u32 finishTime)
|
||||
gPlayer.charState = CHARSTATE_ACT_CLEAR_TIME_ATTACK_OR_BOSS;
|
||||
}
|
||||
|
||||
if (resultsCutScene->unk2D8 == 1) {
|
||||
if (resultsCutScene->rank == 1) {
|
||||
m4aSongNumStart(MUS_TIME_ATTACK_3);
|
||||
} else {
|
||||
m4aSongNumStart(MUS_TIME_ATTACK_2);
|
||||
@@ -276,23 +275,19 @@ u32 CreateTimeAttackResults(u32 finishTime)
|
||||
return 600;
|
||||
}
|
||||
|
||||
const s8 gUnknown_080E05C4[] = {
|
||||
3, 2, 1, 0, 0, -1, -2, -3, -4, -4, -3, -2, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
};
|
||||
|
||||
void sub_80897E8(void)
|
||||
static void AnimateResults(void)
|
||||
{
|
||||
struct TimeAttackResultsCutScene *resultsCutScene = TASK_DATA(gCurTask);
|
||||
TimeAttackResultsCutScene *resultsCutScene = TASK_DATA(gCurTask);
|
||||
Sprite *s;
|
||||
u32 unk168 = resultsCutScene->unk168;
|
||||
u32 frame = resultsCutScene->base.counter;
|
||||
u32 i;
|
||||
|
||||
if (unk168 < 24) {
|
||||
if (frame < 24) {
|
||||
s32 temp;
|
||||
s = &resultsCutScene->unk12C;
|
||||
s = &resultsCutScene->base.separator;
|
||||
temp = 0;
|
||||
if (unk168 <= 16) {
|
||||
temp = ((16 - unk168) * 24);
|
||||
if (frame <= 16) {
|
||||
temp = ((16 - frame) * 24);
|
||||
}
|
||||
|
||||
for (i = 0; i < ((DISPLAY_WIDTH + 32) / 32); i++) {
|
||||
@@ -300,69 +295,71 @@ void sub_80897E8(void)
|
||||
DisplaySprite(s);
|
||||
}
|
||||
} else {
|
||||
s = &resultsCutScene->unk12C;
|
||||
s = &resultsCutScene->base.separator;
|
||||
|
||||
for (i = 0; i < ((DISPLAY_WIDTH + 32) / 32); i++) {
|
||||
s->x = (i * 32); // TODO: Does (i * 32) match?
|
||||
s->x = i * 32;
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
|
||||
if (unk168 > 28) {
|
||||
s32 temp = ((gCurrentLevel & ACT_BOSS) && !(gCurrentLevel & ACT_2)) ? 2 : 3;
|
||||
if (frame > 28) {
|
||||
s32 numElements = ((gCurrentLevel & ACT_BOSS) && !(gCurrentLevel & ACT_2)) ? 2 : 3;
|
||||
|
||||
for (i = 0; i < temp; i++) {
|
||||
s = &resultsCutScene->unkC[i];
|
||||
for (i = 0; i < numElements; i++) {
|
||||
s = &resultsCutScene->base.title[i];
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
|
||||
if (unk168 > 89) {
|
||||
s = &resultsCutScene->unk9C[0];
|
||||
if ((unk168 - 90) < 11) {
|
||||
s->x = (((DISPLAY_WIDTH / 2) - 20) - unk168) * 16 + 40;
|
||||
if (frame >= 90) {
|
||||
// TIME text
|
||||
s = &resultsCutScene->base.sprScores[0];
|
||||
if ((frame - 90) <= 10) {
|
||||
s->x = (100 - frame) * 16 + ((DISPLAY_WIDTH / 2) - 80);
|
||||
}
|
||||
DisplaySprite(s);
|
||||
}
|
||||
|
||||
if (unk168 > 119) {
|
||||
s32 temp = (unk168 - 127);
|
||||
if (temp > 16) {
|
||||
if (resultsCutScene->unk2D8) {
|
||||
s = &resultsCutScene->unk9C[1];
|
||||
resultsCutScene->transform.width = gSineTable[(((u16)resultsCutScene->unk2D6 >> 8) * 4) + 0x100] >> 6;
|
||||
resultsCutScene->unk2D6 += resultsCutScene->unk2D4;
|
||||
if (frame >= 120) {
|
||||
s32 dFrames = (frame - 127);
|
||||
if (dFrames > 16) {
|
||||
if (resultsCutScene->rank > 0) {
|
||||
// medal
|
||||
s = &resultsCutScene->base.sprScores[1];
|
||||
resultsCutScene->transform.width = COS_24_8(I((u16)resultsCutScene->medalSpin) * 4);
|
||||
resultsCutScene->medalSpin += resultsCutScene->medalSpinSpeed;
|
||||
|
||||
if (resultsCutScene->unk2D6 == 0) {
|
||||
if (resultsCutScene->unk2D4 == 0x800) {
|
||||
resultsCutScene->unk2D4 = 0x400;
|
||||
if (resultsCutScene->medalSpin == 0) {
|
||||
if (resultsCutScene->medalSpinSpeed == Q(8)) {
|
||||
resultsCutScene->medalSpinSpeed = Q(4);
|
||||
} else {
|
||||
resultsCutScene->unk2D4 = 0;
|
||||
resultsCutScene->medalSpinSpeed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (resultsCutScene->transform.width == 0) {
|
||||
resultsCutScene->transform.width = 0x10;
|
||||
resultsCutScene->transform.width = Q(0.0625);
|
||||
}
|
||||
TransformSprite(s, &resultsCutScene->transform);
|
||||
DisplaySprite(s);
|
||||
}
|
||||
|
||||
if (resultsCutScene->unk2D8 == 1 && (unk168 & 0x20)) {
|
||||
s = &resultsCutScene->unk9C[2];
|
||||
// Flash the new record text
|
||||
if (resultsCutScene->rank == 1 && (frame & 32)) {
|
||||
s = &resultsCutScene->base.sprScores[2];
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 7; i++) {
|
||||
s32 index = (unk168 - 120) - i;
|
||||
s32 index = (frame - 120) - i;
|
||||
if (index < 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
s = &resultsCutScene->unk178[i];
|
||||
if (index < 0x14U) {
|
||||
s->y += gUnknown_080E05C4[index];
|
||||
s = &resultsCutScene->digits[i];
|
||||
if (index < ARRAY_COUNT(sTimeResultDigitAnim)) {
|
||||
s->y += sTimeResultDigitAnim[index];
|
||||
}
|
||||
|
||||
DisplaySprite(s);
|
||||
@@ -370,8 +367,7 @@ void sub_80897E8(void)
|
||||
}
|
||||
}
|
||||
|
||||
// StoreRecord
|
||||
u8 sub_80899B8(u32 finishTime)
|
||||
static u8 StoreRecord(u32 finishTime)
|
||||
{
|
||||
u32 existingRecords[3];
|
||||
u8 i;
|
||||
@@ -379,7 +375,7 @@ u8 sub_80899B8(u32 finishTime)
|
||||
u8 character = gSelectedCharacter;
|
||||
u8 zone = gCurrentLevel >> 2;
|
||||
s32 currentLevel = gCurrentLevel;
|
||||
u8 act = currentLevel - currentLevel / (ACTS_PER_ZONE + 1) * (ACTS_PER_ZONE + 1);
|
||||
u8 act = currentLevel - (currentLevel / (ACTS_PER_ZONE + 1)) * (ACTS_PER_ZONE + 1);
|
||||
u8 rank = 0;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
@@ -401,28 +397,24 @@ u8 sub_80899B8(u32 finishTime)
|
||||
return rank;
|
||||
}
|
||||
|
||||
void sub_80310F0(void);
|
||||
void sub_8031314(void);
|
||||
void sub_8089B40(void);
|
||||
|
||||
void sub_8089AEC(void)
|
||||
static void Task_AnimateResults(void)
|
||||
{
|
||||
struct TimeAttackResultsCutScene *resultsCutScene = TASK_DATA(gCurTask);
|
||||
u32 unk168 = resultsCutScene->unk168;
|
||||
resultsCutScene->unk168 = ++unk168;
|
||||
sub_80310F0();
|
||||
sub_8031314();
|
||||
sub_80897E8();
|
||||
TimeAttackResultsCutScene *resultsCutScene = TASK_DATA(gCurTask);
|
||||
u32 frame = resultsCutScene->base.counter;
|
||||
resultsCutScene->base.counter = ++frame;
|
||||
StageResults_AnimateSeparator();
|
||||
StageResults_AnimateTitle();
|
||||
AnimateResults();
|
||||
|
||||
if (((unk168 > 160) && (gPressedKeys & (A_BUTTON | START_BUTTON))) || (unk168 > 600)) {
|
||||
gCurTask->main = sub_8089B40;
|
||||
if (((frame > 160) && (gPressedKeys & (A_BUTTON | START_BUTTON))) || (frame > 600)) {
|
||||
gCurTask->main = Task_HandleExit;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8089B40(void)
|
||||
static void Task_HandleExit(void)
|
||||
{
|
||||
struct TimeAttackResultsCutScene *resultsCutScene = TASK_DATA(gCurTask);
|
||||
if (UpdateScreenFade(&resultsCutScene->unk0) == SCREEN_FADE_COMPLETE) {
|
||||
TimeAttackResultsCutScene *resultsCutScene = TASK_DATA(gCurTask);
|
||||
if (UpdateScreenFade(&resultsCutScene->base.fade) == SCREEN_FADE_COMPLETE) {
|
||||
WriteSaveGame();
|
||||
TasksDestroyAll();
|
||||
gUnknown_03002AE4 = gUnknown_0300287C;
|
||||
@@ -432,28 +424,28 @@ void sub_8089B40(void)
|
||||
return;
|
||||
}
|
||||
|
||||
sub_80310F0();
|
||||
sub_8031314();
|
||||
sub_80897E8();
|
||||
StageResults_AnimateSeparator();
|
||||
StageResults_AnimateTitle();
|
||||
AnimateResults();
|
||||
}
|
||||
|
||||
void sub_8089BB0(struct Task *t)
|
||||
static void TaskDestructor_TimeAttackResults(struct Task *t)
|
||||
{
|
||||
u32 i;
|
||||
struct TimeAttackResultsCutScene *resultsCutScene = TASK_DATA(t);
|
||||
VramFree(resultsCutScene->unk12C.graphics.dest);
|
||||
TimeAttackResultsCutScene *resultsCutScene = TASK_DATA(t);
|
||||
VramFree(resultsCutScene->base.separator.graphics.dest);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
VramFree(resultsCutScene->unkC[i].graphics.dest);
|
||||
VramFree(resultsCutScene->base.title[i].graphics.dest);
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
VramFree(resultsCutScene->unk9C[i].graphics.dest);
|
||||
VramFree(resultsCutScene->base.sprScores[i].graphics.dest);
|
||||
}
|
||||
|
||||
for (i = 0; i < 7; i++) {
|
||||
VramFree(resultsCutScene->unk178[i].graphics.dest);
|
||||
VramFree(resultsCutScene->digits[i].graphics.dest);
|
||||
}
|
||||
|
||||
gStageFlags &= ~0x200;
|
||||
gStageFlags &= ~STAGE_FLAG__TURN_OFF_TIMER;
|
||||
}
|
||||
@@ -315,7 +315,7 @@ void CreateTitleScreen(void)
|
||||
// Goes from 16384 -> 102 in an log curve \_
|
||||
titleScreen->wavesTranslationX[i] = val;
|
||||
// Goes from 4 -> 642 in steps of 4 but becomes
|
||||
// a slightly more jagged line as i in creases
|
||||
// a slightly more jagged line as i increases
|
||||
titleScreen->wavesTranslationY[i] = Div(65536, val);
|
||||
};
|
||||
|
||||
|
||||
Reference in new issue
Block a user