mirror of https://github.com/snesrev/smw.git
3473 lines
94 KiB
C
3473 lines
94 KiB
C
#include "smb1_consts.h"
|
|
#include "smb1_funcs.h"
|
|
#include "smb1_rtl.h"
|
|
#include "smb1_variables.h"
|
|
|
|
void (*funcs_1948B[13])() = {&CutsceneToad_Func0, &CutsceneToad_Func1, &CutsceneToad_Func2, &CutsceneToad_Func3, &CutsceneToad_Func4,
|
|
&CutsceneToad_Func5, &CutsceneToad_Func6, &CutsceneToad_Func0, &CutsceneToad_Func0, &CutsceneToad_Func4,
|
|
&CutsceneToad_Func5, &CutsceneToad_Func6, &CutsceneToad_Func0}; // weak
|
|
|
|
void Dma_FillWith0x24() {
|
|
R0_ = 36;
|
|
WriteReg(VMAIN, 0);
|
|
WriteRegWord(VMADDL, 0x800u);
|
|
WriteRegWord(DMAP0, 0x1808u);
|
|
WriteRegWord(A1T0L, 0);
|
|
WriteRegWord(A1B0, 0);
|
|
WriteRegWord(DAS0L, 0x400u);
|
|
WriteReg(MDMAEN, 1u);
|
|
WriteRegWord(DAS0L, 0x400u);
|
|
WriteRegWord(VMADDL, 0x800u);
|
|
*(uint16 *)&R0_ = 0;
|
|
WriteReg(VMAIN, 0x80u);
|
|
WriteReg(BBAD0, 0x19u);
|
|
WriteReg(MDMAEN, 1u);
|
|
R0_ = 36;
|
|
WriteRegWord(VMAIN, 0);
|
|
WriteRegWord(VMADDL, 0);
|
|
WriteRegWord(DMAP0, 0x1808u);
|
|
WriteRegWord(A1T0L, 0);
|
|
WriteRegWord(A1B0, 0);
|
|
WriteRegWord(DAS0L, 0x800u);
|
|
WriteReg(MDMAEN, 1u);
|
|
WriteRegWord(DAS0L, 0x800u);
|
|
WriteRegWord(VMADDL, 0);
|
|
*(uint16 *)&R0_ = 0;
|
|
WriteReg(VMAIN, 0x80u);
|
|
WriteReg(BBAD0, 0x19u);
|
|
WriteReg(MDMAEN, 1u);
|
|
R0_ = 40;
|
|
WriteRegWord(VMAIN, 0);
|
|
WriteRegWord(VMADDL, 0x5878u);
|
|
WriteRegWord(DMAP0, 0x1808u);
|
|
WriteRegWord(A1T0L, 0);
|
|
WriteRegWord(A1B0, 0);
|
|
WriteRegWord(DAS0L, 0x788u);
|
|
WriteReg(MDMAEN, 1u);
|
|
WriteRegWord(DAS0L, 0x788u);
|
|
WriteRegWord(VMADDL, 0x5878u);
|
|
*(uint16 *)&R0_ = 0;
|
|
WriteReg(VMAIN, 0x80u);
|
|
WriteReg(BBAD0, 0x19u);
|
|
WriteReg(MDMAEN, 1u);
|
|
}
|
|
|
|
void Dma_FillWith0x28() {
|
|
R0_ = 40;
|
|
WriteReg(VMAIN, 0);
|
|
WriteRegWord(VMADDL, 0x5800u);
|
|
WriteRegWord(DMAP0, 0x1808u);
|
|
WriteRegWord(A1T0L, 0);
|
|
WriteRegWord(A1B0, 0);
|
|
WriteRegWord(DAS0L, 0x200u);
|
|
WriteReg(MDMAEN, 1u);
|
|
WriteRegWord(DAS0L, 0x200u);
|
|
WriteRegWord(VMADDL, 0x5800u);
|
|
R0_ = 0;
|
|
WriteReg(VMAIN, 0x80u);
|
|
WriteReg(BBAD0, 0x19u);
|
|
WriteReg(MDMAEN, 1u);
|
|
}
|
|
|
|
void Dma_CODE_0480EF() {
|
|
R0_ = 39;
|
|
WriteReg(VMAIN, 0);
|
|
WriteRegWord(VMADDL, 0);
|
|
WriteRegWord(DMAP0, 0x1808u);
|
|
WriteRegWord(A1T0L, 0);
|
|
WriteRegWord(A1B0, 0);
|
|
WriteRegWord(DAS0L, 0x400u);
|
|
WriteReg(MDMAEN, 1u);
|
|
WriteRegWord(DAS0L, 0x400u);
|
|
WriteRegWord(VMADDL, 0);
|
|
R0_ = 12;
|
|
WriteReg(VMAIN, 0x80u);
|
|
WriteReg(BBAD0, 0x19u);
|
|
WriteReg(UNUSED0, 1u);
|
|
R0_ = 36;
|
|
WriteRegWord(VMAIN, 0);
|
|
WriteRegWord(VMADDL, 0x800u);
|
|
WriteRegWord(A1T0L, 0);
|
|
WriteRegWord(A1B0, 0);
|
|
WriteRegWord(DAS0L, 0x400u);
|
|
WriteReg(MDMAEN, 1u);
|
|
WriteRegWord(DAS0L, 0x400u);
|
|
WriteRegWord(VMADDL, 0x800u);
|
|
R0_ = 0;
|
|
WriteReg(VMAIN, 0x80u);
|
|
WriteReg(BBAD0, 0x19u);
|
|
WriteReg(MDMAEN, 1u);
|
|
}
|
|
|
|
void HandleSfx() {
|
|
uint8 v0; // al
|
|
uint8 v1; // al
|
|
uint8 v2; // al
|
|
uint8 v3; // al
|
|
|
|
v0 = sound_ch1;
|
|
if (sound_ch1)
|
|
goto LABEL_5;
|
|
if (ReadReg(APUI00) == apui00_last || (++apui00_delay, apui00_delay >= 3u)) {
|
|
v0 = 0;
|
|
LABEL_5:
|
|
WriteReg(APUI00, v0);
|
|
apui00_last = v0;
|
|
apui00_delay = 0;
|
|
}
|
|
v1 = sound_ch2;
|
|
if (sound_ch2) {
|
|
LABEL_10:
|
|
WriteReg(APUI01, v1);
|
|
apui01_last = v1 & 0xF;
|
|
apui01_delay = 0;
|
|
goto LABEL_11;
|
|
}
|
|
if ((ReadReg(APUI01) & 0xF) == apui01_last || (++apui01_delay, apui01_delay >= 3u)) {
|
|
v1 = 0;
|
|
goto LABEL_10;
|
|
}
|
|
LABEL_11:
|
|
v2 = music_ch1;
|
|
if (music_ch1) {
|
|
apui02_var160C = 4;
|
|
WriteReg(APUI02, music_ch1);
|
|
if (v2 < 0xF0u)
|
|
apui02_var1606 = v2;
|
|
} else if (ReadReg(APUI02) == apui02_var1606) {
|
|
v3 = --apui02_var160C;
|
|
if (!apui02_var160C) {
|
|
++apui02_var160C;
|
|
WriteReg(APUI02, v3);
|
|
}
|
|
}
|
|
if (!sound_ch3) {
|
|
if ((ReadReg(APUI03) & 0x7F) == apui03_var1607 || (++apui03_delay, apui03_delay >= 3u)) {
|
|
WriteReg(APUI03, 0);
|
|
apui03_var1607 = 0;
|
|
apui03_delay = 0;
|
|
}
|
|
goto LABEL_23;
|
|
}
|
|
apui03_var1607 = sound_ch3;
|
|
if (sound_ch3 == 1 || sound_ch3 == 5 || sound_ch3 == 6 || sound_ch3 == 74) {
|
|
WriteReg(APUI03, apui03_upper_bit | sound_ch3);
|
|
apui03_upper_bit ^= 0x80u;
|
|
apui03_delay = 0;
|
|
LABEL_23:
|
|
sound_ch1 = 0;
|
|
sound_ch2 = 0;
|
|
music_ch1 = 0;
|
|
sound_ch3 = 0;
|
|
return;
|
|
}
|
|
WriteReg(APUI03, sound_ch3);
|
|
sound_ch1 = 0;
|
|
sound_ch2 = 0;
|
|
music_ch1 = 0;
|
|
sound_ch3 = 0;
|
|
}
|
|
|
|
void InitializeGradientHDMA(uint8 a) {
|
|
uint8 v1; // al
|
|
uint8 v2; // si
|
|
uint8 v3; // di
|
|
uint8 v4; // si
|
|
uint8 v5; // di
|
|
|
|
WriteReg(HDMAEN, 0);
|
|
hdmaenable_mirror = 0;
|
|
tmw_mirror = 0;
|
|
tsw_mirror = 0;
|
|
w12sel_mirror = 0;
|
|
w34sel_mirror = 0;
|
|
wobjsel_mirror = 0;
|
|
cgwsel_mirror = 0;
|
|
cgadsub_mirror = 32;
|
|
if (a != 0xFF) {
|
|
R0_ = a;
|
|
v1 = 2 * a;
|
|
R1_ = kDATA_04824E[v1];
|
|
v2 = kDATA_04823E[v1];
|
|
v3 = 0;
|
|
do {
|
|
hdmagradient_red_channel_scanlines_and_ptrs_table[v3] = kDATA_0483AC[v2];
|
|
hdmagradient_green_channel_scanlines_and_ptrs_table[v3] = kDATA_04840E[v2];
|
|
hdmagradient_blue_channel_scanlines_and_ptrs_table[v3++] = kDATA_048470[v2++];
|
|
} while (v3 != R1_);
|
|
R1_ = kDATA_048256[v1];
|
|
v4 = kDATA_048246[v1];
|
|
v5 = 0;
|
|
do {
|
|
hdmagradient_red_channel_data[v5] = kDATA_0484D2[v4];
|
|
hdmagradient_green_channel_data[v5] = kDATA_048512[v4];
|
|
hdmagradient_blue_channel_data[v5++] = kDATA_048552[v4++];
|
|
} while (v5 != R1_);
|
|
WriteRegWord(DMAP5, 0x3240u);
|
|
WriteRegWord(DMAP6, 0x3240u);
|
|
WriteRegWord(DMAP7, 0x3240u);
|
|
WriteRegWord(A1T5L, 0x1520u);
|
|
WriteRegWord(A1T6L, 0x1560u);
|
|
WriteRegWord(A1T7L, 0x15A0u);
|
|
WriteReg(A1B5, 0);
|
|
WriteReg(A1B6, 0);
|
|
WriteReg(A1B7, 0);
|
|
WriteReg(DAS50, 0);
|
|
WriteReg(DAS60, 0);
|
|
WriteReg(DAS70, 0);
|
|
underwater_hdma_gradient_timer = 1;
|
|
if (R0_ == 2) {
|
|
WriteRegWord(DMAP4, 0x2841u);
|
|
WriteRegWord(A1T4L, 0x83A5u);
|
|
WriteReg(A1B4, 1u);
|
|
WriteReg(DAS40, 1u);
|
|
tmw_mirror = 23;
|
|
tsw_mirror = 0;
|
|
w12sel_mirror = 0;
|
|
w34sel_mirror = 0;
|
|
wobjsel_mirror = 0x80;
|
|
cgwsel_mirror = 16;
|
|
cgadsub_mirror = 51;
|
|
hdmaenable_mirror = -16;
|
|
palette_mirror[0] = 0;
|
|
++update_entire_palette_flag;
|
|
} else {
|
|
hdmaenable_mirror = -32;
|
|
}
|
|
}
|
|
}
|
|
|
|
void AdjustUnderwaterHDMAGradient() {
|
|
uint8 v0; // si
|
|
uint8 v1; // di
|
|
uint8 v2; // al
|
|
|
|
if (!--underwater_hdma_gradient_timer) {
|
|
v0 = underwater_hdma_gradient_index;
|
|
underwater_hdma_gradient_timer = kDATA_048368[underwater_hdma_gradient_index];
|
|
v1 = kDATA_048360[underwater_hdma_gradient_index];
|
|
v2 = kDATA_048370[underwater_hdma_gradient_index] + hdmagradient_red_channel_scanlines_and_ptrs_table[v1];
|
|
hdmagradient_red_channel_scanlines_and_ptrs_table[v1] = v2;
|
|
hdmagradient_green_channel_scanlines_and_ptrs_table[v1] = v2;
|
|
hdmagradient_blue_channel_scanlines_and_ptrs_table[v1] = v2;
|
|
underwater_hdma_gradient_index = (v0 + 1) & 7;
|
|
}
|
|
}
|
|
|
|
void GiveExtraLife() {
|
|
if (++number_of_lives >= 0x80u)
|
|
number_of_lives = 127;
|
|
}
|
|
|
|
void CODE_048600() {
|
|
if ((cutscene_var1680 & 0x80u) == 0) {
|
|
if (!cutscene_var1680) {
|
|
if ((*(&controller_press1p1 + current_player) & 0x10) == 0)
|
|
return;
|
|
++cutscene_var1680;
|
|
sound_ch1 = 67;
|
|
}
|
|
LOBYTE(cutscene_hdma_varB9A) = cutscene_hdma_varB9A - 1;
|
|
LOBYTE(cutscene_hdma_varB9A) = cutscene_hdma_varB9A - 1;
|
|
if ((cutscene_hdma_varB9A & 0x80u) != 0)
|
|
game_mode_task = 13;
|
|
}
|
|
}
|
|
|
|
void CODE_04862A() {
|
|
PauseMenu_Func6();
|
|
CODE_05EBAB();
|
|
w12sel_mirror = 34;
|
|
w34sel_mirror = 2;
|
|
++game_mode_task;
|
|
}
|
|
|
|
void WaitForMusicAndChangeTask() {
|
|
if (!ReadReg(APUI00)) {
|
|
game_mode_task = 15;
|
|
cutscene_var1680 = 0x80;
|
|
}
|
|
}
|
|
|
|
uint8 RunGameOver_Sub() {
|
|
uint8 i; // di
|
|
OamEnt *oam; // rbx
|
|
uint8 result; // si
|
|
uint8 v3; // si
|
|
int8 v4; // di
|
|
|
|
if ((*(&controller_press1p1 + current_player) & 0x2C) != 0) {
|
|
sound_ch3 = 1;
|
|
blinking_cursor_frame_counter = 0;
|
|
game_over_screen_blinking_cursor_pos ^= 0x10u;
|
|
}
|
|
for (i = 3; (i & 0x80u) == 0; --i)
|
|
get_OamEnt(oam_buf, i)->xpos = kGameOver_Xpos[i];
|
|
oam = get_OamEnt(oam_buf, 0);
|
|
oam->ypos += game_over_screen_blinking_cursor_pos;
|
|
oam_tile_size_buffer[0] = ((uint8)(++blinking_cursor_frame_counter & 0x10) >> 4) | 2;
|
|
result = 0;
|
|
if ((*(&controller_press1p1 + current_player) & 0x10) != 0) {
|
|
sound_ch3 = 41;
|
|
halfway_page = 0;
|
|
player_coin_count = 0;
|
|
area_number = 0;
|
|
level_number = 0;
|
|
if (game_over_screen_blinking_cursor_pos)
|
|
world_number = 0;
|
|
v3 = kMult6[current_player];
|
|
v4 = 6;
|
|
do {
|
|
score_and_coin_display[v3] = 0;
|
|
marios_score[v3++] = 0;
|
|
--v4;
|
|
} while (v4);
|
|
result = 2;
|
|
if (!game_over_screen_blinking_cursor_pos) {
|
|
number_of_lives = 4;
|
|
++hidden_1up_flag;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// local variable allocation has failed, the output may be wrong!
|
|
void CODE_0486DF(uint8 jin) {
|
|
uint16 j = jin;
|
|
int16 v1; // di
|
|
uint16 v2; // si
|
|
int16 v3; // ax
|
|
|
|
v1 = j;
|
|
v2 = 0;
|
|
do {
|
|
v3 = *(uint16 *)&kDATA_0486FD[v2];
|
|
*(uint16 *)&vram_buffer1[j + 1] = v3;
|
|
*(uint16 *)&j = j + 2;
|
|
v2 += 2;
|
|
} while (v3 != -1);
|
|
*(uint16 *)&vram_buffer1_offset = j;
|
|
}
|
|
// 15605: variables would overlap: di.1 and di.2
|
|
|
|
void CutsceneHdma() {
|
|
uint16 v0; // si
|
|
uint8 v1; // di
|
|
int8 v2; // di
|
|
int16 v3; // ax
|
|
uint16 v4; // ax
|
|
uint16 v5; // ax
|
|
|
|
if ((uint8)cutscene_hdma_varB9A < 0x30u) {
|
|
cutscene_hdma_varB84 = 0;
|
|
cutscene_hdma_varB8E = 0;
|
|
cutscene_hdma_varB90 = 0;
|
|
cutscene_hdma_varB92 = 0;
|
|
cutscene_hdma_varB94 = kCircleHDMAData_DATA_00973E[(uint16)(2 * (uint8)cutscene_hdma_varB9A) >> 1];
|
|
cutscene_hdma_varB96 = 120;
|
|
cutscene_hdma_varB98 = 176;
|
|
while (1) {
|
|
cutscene_hdma_varB80 = 256;
|
|
cutscene_hdma_varB82 = 256;
|
|
if ((uint16)(cutscene_hdma_varB90 + 1) < cutscene_hdma_varB9A) {
|
|
cutscene_hdma_varB92 += cutscene_hdma_varB94;
|
|
WriteReg(WRMPYA, kCircleHDMAData_DATA_0096BD[cutscene_hdma_varB92 >> 9]);
|
|
WriteReg(WRMPYB, cutscene_hdma_varB9A);
|
|
cutscene_hdma_varB88 = ReadReg(RDMPYH);
|
|
cutscene_hdma_varB82 = cutscene_hdma_varB98 + cutscene_hdma_varB88;
|
|
cutscene_hdma_varB80 = cutscene_hdma_varB98 - cutscene_hdma_varB88;
|
|
}
|
|
cutscene_hdma_varB84 = 2 * (cutscene_hdma_varB96 - cutscene_hdma_varB90 - 1);
|
|
v0 = 2 * (cutscene_hdma_varB96 - cutscene_hdma_varB90 - 1);
|
|
v1 = cutscene_hdma_varB80;
|
|
if ((cutscene_hdma_varB80 & 0x8000u) != 0)
|
|
break;
|
|
if ((cutscene_hdma_varB80 & 0xFF00) != 0) {
|
|
if ((cutscene_hdma_varB80 & 0xFF00) != 256)
|
|
break;
|
|
v1 = -1;
|
|
}
|
|
LABEL_10:
|
|
cutscene_hdma_varB86 = v1;
|
|
v2 = cutscene_hdma_varB82;
|
|
if ((cutscene_hdma_varB82 & 0xFF00) != 0)
|
|
v2 = -1;
|
|
LOBYTE(v3) = 0;
|
|
HIBYTE(v3) = v2;
|
|
v4 = cutscene_hdma_varB86 | v3;
|
|
cutscene_hdma_varB86 = v4;
|
|
if (v0 < 0x1C0u) {
|
|
if (v4 == 0xFFFF)
|
|
v4 = 255;
|
|
hdma_data_array[v0 >> 1] = v4;
|
|
}
|
|
cutscene_hdma_varB8E = 2 * (cutscene_hdma_varB90 + cutscene_hdma_varB96 - 1);
|
|
if ((uint16)(2 * (cutscene_hdma_varB90 + cutscene_hdma_varB96 - 1)) < 0x1C0u) {
|
|
v5 = cutscene_hdma_varB86;
|
|
if (cutscene_hdma_varB86 == 0xFFFF)
|
|
v5 = 255;
|
|
hdma_data_array[(uint16)(2 * (cutscene_hdma_varB90 + cutscene_hdma_varB96 - 1)) >> 1] = v5;
|
|
}
|
|
++cutscene_hdma_varB90;
|
|
if (cutscene_hdma_varB84 >= 0x1C0u && cutscene_hdma_varB8E >= 0x1C0u) {
|
|
LOBYTE(cutscene_hdma_varB9A) = cutscene_hdma_varB9A + 1;
|
|
return;
|
|
}
|
|
}
|
|
v1 = 0;
|
|
goto LABEL_10;
|
|
}
|
|
}
|
|
|
|
void DecodeAreaData_Sub_New() {
|
|
uint8 v0; // si
|
|
|
|
v0 = 0;
|
|
do {
|
|
level_data_map16_hi[v0] = 0;
|
|
level_data_map16_hi[v0 + 16] = 0;
|
|
level_data_map16_hi[v0 + 32] = 0;
|
|
level_data_map16_hi[v0 + 48] = 0;
|
|
level_data_map16_hi[v0 + 64] = 0;
|
|
level_data_map16_hi[v0 + 80] = 0;
|
|
level_data_map16_hi[v0 + 96] = 0;
|
|
level_data_map16_hi[v0 + 112] = 0;
|
|
level_data_map16_hi[v0 + 128] = 0;
|
|
level_data_map16_hi[v0 + 144] = 0;
|
|
level_data_map16_hi[v0 + 160] = 0;
|
|
level_data_map16_hi[v0 + 176] = 0;
|
|
level_data_map16_hi[v0++ + 192] = 0;
|
|
} while ((v0 & 0xF) != 0);
|
|
level_data_map16_hi[112] = 104;
|
|
level_data_map16_hi[113] = 104;
|
|
level_data_map16_hi[114] = 104;
|
|
level_data_map16_hi[163] = 104;
|
|
level_data_map16_hi[164] = 104;
|
|
level_data_map16_hi[165] = 104;
|
|
level_data_map16_hi[166] = 104;
|
|
level_data_map16_hi[121] = 104;
|
|
level_data_map16_hi[122] = 104;
|
|
level_data_map16_hi[123] = 104;
|
|
level_data_map16_hi[124] = 104;
|
|
level_data_map16_hi[125] = 104;
|
|
level_data_map16_hi[126] = 104;
|
|
render_graphics_var0EC9 = 1;
|
|
}
|
|
|
|
uint8 CODE_048895(uint8 j) {
|
|
uint8 v1; // si
|
|
uint8 v2; // al
|
|
uint8 v3; // si
|
|
uint8 v4; // al
|
|
|
|
if (current_player) {
|
|
v3 = 0;
|
|
do {
|
|
v4 = kDATA_048886[v3];
|
|
vram_buffer1[++j] = v4;
|
|
++v3;
|
|
} while (v4 != 0xFF);
|
|
} else {
|
|
v1 = 0;
|
|
do {
|
|
v2 = kDATA_048877[v1];
|
|
vram_buffer1[++j] = v2;
|
|
++v1;
|
|
} while (v2 != 0xFF);
|
|
}
|
|
return j;
|
|
}
|
|
|
|
void HandleLayersScroll() {
|
|
int8 v0; // al
|
|
int8 v1; // cl
|
|
bool v2; // cf
|
|
int8 v3; // al
|
|
uint16 v4; // ax
|
|
uint8 i; // di
|
|
int v6; // rbp
|
|
uint16 v7; // ax
|
|
|
|
tempF6 = 0;
|
|
*(uint16 *)&tempF3 = layers_scroll_0EEC;
|
|
*(uint16 *)&tempF7 = 0;
|
|
do {
|
|
v0 = *((uint8 *)kDATA_048949 + *(uint16 *)&tempF3);
|
|
v1 = 0;
|
|
v2 = __CFSHL__(v0, 1);
|
|
v3 = 2 * v0;
|
|
if (v2)
|
|
v1 = 1;
|
|
tempF5 = (2 * v3 + v1) & 1;
|
|
v4 = (uint8)(tempF5 + 2 * *((uint8 *)kDATA_048949 + *(uint16 *)&tempF3 + 1));
|
|
if (v4 >= 0x80u)
|
|
v4 |= 0xFF00u;
|
|
layer3_tilemap_upload_buf[*(uint16 *)&tempF7 >> 1] = layer2_xpos + v4 + 8;
|
|
*(uint16 *)&tempF3 = (*(uint16 *)&tempF3 + 16) & 0x1FF;
|
|
++*(uint16 *)&tempF7;
|
|
++*(uint16 *)&tempF7;
|
|
} while (*(uint16 *)&tempF7 != 64);
|
|
layers_scroll_0EEC = (layers_scroll_0EEC + 4) & 0x1FF;
|
|
for (i = 62; (i & 0x80u) == 0; i -= 2) {
|
|
v6 = i >> 1;
|
|
v7 = layer3_tilemap_upload_buf[v6];
|
|
layer3_tilemap_upload_buf[v6 + 32] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 64] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 96] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 128] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 160] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 192] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 224] = v7;
|
|
}
|
|
}
|
|
|
|
void CODE_048B49() {
|
|
CODE_048B59();
|
|
}
|
|
|
|
void SMB3_BufferLayer3Tilemap() {
|
|
if (enable_layer3_bgflag) {
|
|
CODE_048C77();
|
|
CODE_048B59();
|
|
}
|
|
}
|
|
|
|
void CODE_048B59() {
|
|
game_loop_toggler &= 0x80u;
|
|
if (area_type) {
|
|
if (area_type != 1)
|
|
return;
|
|
SMB3_BufferLayer3CloudTilemap();
|
|
vblank_flag_0ED4 = 1;
|
|
} else {
|
|
BufferAnimatedWaterSurfaceTiles();
|
|
vram_buffer_addr_ctrl = 6;
|
|
}
|
|
vblank_enable_vtimel_flag = 1;
|
|
}
|
|
|
|
void SMB3_BufferLayer3CloudTilemap() {
|
|
uint16 v0; // si
|
|
uint16 v1; // ax
|
|
int v2; // rbp
|
|
int v3; // rbp
|
|
int v4; // rbx
|
|
|
|
*(uint16 *)&tempF7 = 14;
|
|
*(uint16 *)&R0_ = buffer_layer3_cloud_tilemap_offs;
|
|
v0 = layer3_tilemap_upload_buf[0];
|
|
LOBYTE(v1) = tempF4;
|
|
HIBYTE(v1) = tempF3;
|
|
v2 = layer3_tilemap_upload_buf[0] >> 1;
|
|
layer3_tilemap_upload_buf[v2 + 1] = v1;
|
|
layer3_tilemap_upload_buf[v2 + 30] = v1 + 1;
|
|
do {
|
|
v3 = (uint16)(8 * g_byte_7F3000[*(uint16 *)&R0_]) >> 1;
|
|
v4 = v0 >> 1;
|
|
layer3_tilemap_upload_buf[v4 + 2] = kLayer3CloudBGTilemap[v3];
|
|
layer3_tilemap_upload_buf[v4 + 3] = kLayer3CloudBGTilemap[v3 + 1];
|
|
layer3_tilemap_upload_buf[v4 + 31] = kLayer3CloudBGTilemap[v3 + 2];
|
|
layer3_tilemap_upload_buf[v4 + 32] = kLayer3CloudBGTilemap[v3 + 3];
|
|
v0 += 4;
|
|
*(uint16 *)&R0_ += 16;
|
|
--*(uint16 *)&tempF7;
|
|
} while (*(uint16 *)&tempF7);
|
|
layer3_tilemap_upload_buf[(layer3_tilemap_upload_buf[0] >> 1) + 59] = -1;
|
|
layer3_tilemap_upload_buf[0] += 116;
|
|
if ((((uint8)buffer_layer3_cloud_tilemap_offs + 1) & 0xF) != 0)
|
|
++buffer_layer3_cloud_tilemap_offs;
|
|
else
|
|
buffer_layer3_cloud_tilemap_offs = (buffer_layer3_cloud_tilemap_offs & 0xFFF0) + 224;
|
|
if (buffer_layer3_cloud_tilemap_offs >= 0xA80u)
|
|
buffer_layer3_cloud_tilemap_offs = 0;
|
|
*(uint16 *)&tempF3 += 512;
|
|
}
|
|
|
|
void BufferAnimatedWaterSurfaceTiles() {
|
|
uint16 v0; // ax
|
|
int v1; // rbp
|
|
uint16 v2; // ax
|
|
uint16 v3; // di
|
|
|
|
v0 = *(uint16 *)&tempF3;
|
|
v1 = vram_buffer2_offset >> 1;
|
|
vram_buffer2[v1] = *(uint16 *)&tempF3;
|
|
v0 += 256;
|
|
vram_buffer2[v1 + 3] = v0;
|
|
*(uint16 *)&tempF3 = v0 + 256;
|
|
vram_buffer2[v1 + 1] = 256;
|
|
vram_buffer2[v1 + 4] = 256;
|
|
if ((*(uint16 *)&tempF3 & 0x200) != 0) {
|
|
v2 = 11310;
|
|
v3 = 11311;
|
|
} else {
|
|
v2 = 11308;
|
|
v3 = 11309;
|
|
}
|
|
vram_buffer2[v1 + 2] = v2;
|
|
vram_buffer2[v1 + 5] = v3;
|
|
vram_buffer2[v1 + 6] = -1;
|
|
vram_buffer2_offset += 12;
|
|
}
|
|
|
|
void CODE_048C77() {
|
|
int16 v0; // ax
|
|
|
|
LOBYTE(v0) = (uint16)(layer3_xpos + 288) >> 8;
|
|
HIBYTE(v0) = layer3_xpos + 32;
|
|
*(uint16 *)&tempF3 = v0;
|
|
CODE_048C85();
|
|
}
|
|
|
|
void CODE_048C85() {
|
|
uint8 v0; // al
|
|
|
|
if ((tempF3 & 1) != 0)
|
|
v0 = 92;
|
|
else
|
|
v0 = 88;
|
|
tempF3 = v0;
|
|
tempF4 = (tempF4 >> 3) + 0x80;
|
|
}
|
|
|
|
void SpawnCastleTilesWithPriority() {
|
|
uint16 v0; // si
|
|
uint16 v1; // di
|
|
uint8 *v2; // rdx
|
|
int16 v3; // ax
|
|
uint16 v4; // si
|
|
int16 v5; // ax
|
|
int16 v6; // di
|
|
int16 v7; // ax
|
|
int16 v8; // di
|
|
|
|
tempF5 = 1;
|
|
*(uint16 *)&tempF3 = kDATA_048CEA[(uint8)((2 * (render_graphics_var0EE6 & 1)) & 2) >> 1];
|
|
v0 = *(uint16 *)&vram_buffer1_offset;
|
|
v1 = 0;
|
|
do {
|
|
v2 = IndirPtr(*(LongPtr *)&tempF3, v1);
|
|
v3 = *(uint16 *)v2;
|
|
*(uint16 *)&vram_buffer1[v0 + 1] = *(uint16 *)v2;
|
|
v1 += 2;
|
|
v0 += 2;
|
|
} while (v3 != -1);
|
|
v4 = *(uint16 *)&vram_buffer1_offset;
|
|
if ((render_graphics_var0EF4 & 0x20) != 0)
|
|
*(uint16 *)&render_graphics_var0EF4 = *(uint16 *)&render_graphics_var0EF4 & 0xFDF ^ 0x400;
|
|
LOBYTE(v5) = (uint16)((*(uint16 *)&render_graphics_var0EF4 + 705) & 0xFDF) >> 8;
|
|
HIBYTE(v5) = (render_graphics_var0EF4 - 63) & 0xDF;
|
|
*(uint16 *)&vram_buffer1[*(uint16 *)&vram_buffer1_offset + 1] = v5;
|
|
v6 = __PAIR16__(v5, HIBYTE(v5)) + 1;
|
|
if (((HIBYTE(v5) + 1) & 0x20) != 0)
|
|
v6 = v6 & 0xFDF ^ 0x400;
|
|
LOBYTE(v7) = HIBYTE(v6);
|
|
HIBYTE(v7) = v6;
|
|
*(uint16 *)&vram_buffer1[v4 + 13] = v7;
|
|
v8 = v6 + 1;
|
|
LOBYTE(v7) = HIBYTE(v8);
|
|
HIBYTE(v7) = v8;
|
|
*(uint16 *)&vram_buffer1[v4 + 25] = v7;
|
|
*(uint16 *)&vram_buffer1_offset += 36;
|
|
render_graphics_var0EE6 = 0;
|
|
vram_buffer_addr_ctrl = 6;
|
|
}
|
|
|
|
void CODE_048D71() {
|
|
int16 v0; // ax
|
|
uint8 v1; // si
|
|
int16 v2; // ax
|
|
int v3; // edx
|
|
int16 v4; // ax
|
|
int v5; // edx
|
|
|
|
v0 = *(uint16 *)&vram_buffer1[2 * ((uint8)vram_buffer2_offset >> 1) + 759];
|
|
if (v0 == 36 || v0 == 4260) {
|
|
if ((uint8)render_area_gfx_0ECE)
|
|
return;
|
|
++render_area_gfx_0ECE;
|
|
v1 = vram_buffer1_offset;
|
|
LOBYTE(v2) = (uint16)(((render_graphics_var0ecc - 1) & 0x41F) + 832) >> 8;
|
|
HIBYTE(v2) = ((render_graphics_var0ecc - 1) & 0x1F) + 64;
|
|
v3 = vram_buffer1_offset;
|
|
*(uint16 *)&vram_buffer1[vram_buffer1_offset + 1] = v2;
|
|
*(uint16 *)&vram_buffer1[v3 + 3] = 1920;
|
|
*(uint16 *)&vram_buffer1[v1 + 5] = 2573;
|
|
*(uint16 *)&vram_buffer1[v1 + 7] = 2589;
|
|
*(uint16 *)&vram_buffer1[v1 + 9] = 2575;
|
|
*(uint16 *)&vram_buffer1[v1 + 11] = 2591;
|
|
goto LABEL_10;
|
|
}
|
|
if (v0 == 2568) {
|
|
if (HIBYTE(render_area_gfx_0ECE)) {
|
|
render_area_gfx_0ECE = 0;
|
|
if (*(uint16 *)((int8 *)&screen_left_xpos16 + 1) || render_graphics_var0ecc) {
|
|
v1 = vram_buffer1_offset;
|
|
LOBYTE(v4) = (uint16)(render_graphics_var0ecc + 832) >> 8;
|
|
HIBYTE(v4) = render_graphics_var0ecc + 64;
|
|
v5 = vram_buffer1_offset;
|
|
*(uint16 *)&vram_buffer1[vram_buffer1_offset + 1] = v4;
|
|
*(uint16 *)&vram_buffer1[v5 + 3] = 1920;
|
|
*(uint16 *)&vram_buffer1[v1 + 5] = 2572;
|
|
*(uint16 *)&vram_buffer1[v1 + 7] = 2588;
|
|
*(uint16 *)&vram_buffer1[v1 + 9] = 2574;
|
|
*(uint16 *)&vram_buffer1[v1 + 11] = 2590;
|
|
LABEL_10:
|
|
*(uint16 *)&vram_buffer1[v1 + 13] = -1;
|
|
*(uint16 *)&vram_buffer1_offset = v1 + 12;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void DecodeAreaData_Sub2_New(uint16 j) {
|
|
int16 v1; // ax
|
|
uint8 v2; // si
|
|
uint8 v3; // di
|
|
uint8 v4; // si
|
|
uint8 v5; // di
|
|
uint8 v6; // di
|
|
uint8 v7; // di
|
|
uint8 v8; // si
|
|
uint8 EmptyEnemySlot_Far; // si
|
|
uint8 v10; // di
|
|
uint8 v11; // al
|
|
uint8 v12; // di
|
|
bool v13; // sf
|
|
uint8 v14; // di
|
|
uint8 v15; // di
|
|
uint8 v16; // di
|
|
uint8 v17; // di
|
|
uint8 v18; // di
|
|
uint8 i; // di
|
|
uint8 v20; // di
|
|
uint8 v21; // di
|
|
uint8 v22; // di
|
|
uint8 v23; // di
|
|
uint8 v24; // di
|
|
uint8 v25; // di
|
|
uint8 v26; // di
|
|
uint8 v27; // di
|
|
uint8 v28; // al
|
|
uint8 v29; // di
|
|
uint8 v30; // di
|
|
uint8 v31; // al
|
|
uint8 v32; // di
|
|
uint8 v33; // di
|
|
uint8 v34; // si
|
|
uint8 v35; // di
|
|
uint8 v36; // di
|
|
uint8 v37; // [rsp+46h] [rbp-2h]
|
|
uint8 v38; // [rsp+46h] [rbp-2h]
|
|
uint8 AreaObjXPosition_Far; // [rsp+46h] [rbp-2h]
|
|
uint8 t0;
|
|
|
|
tempF3 = area_data_ptr.addr;
|
|
tempF4 = area_data_ptr.addr >> 8;
|
|
tempF5 = area_data_ptr.bank;
|
|
v1 = *IndirPtr(*(LongPtr *)&tempF3, (j + 2)) & 0x7F;
|
|
R0_ = *((uint8 *)kDATA_048E43 + v1);
|
|
R1_ = *((uint8 *)kDATA_048E43 + v1 + 1);
|
|
v2 = object_index;
|
|
switch ((uint8)v1 >> 1) {
|
|
case 0:
|
|
v4 = 0;
|
|
v5 = 15;
|
|
goto LABEL_5;
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
case 17:
|
|
case 18:
|
|
case 19:
|
|
case 21:
|
|
case 22:
|
|
case 23:
|
|
case 33:
|
|
case 34:
|
|
case 35:
|
|
case 36:
|
|
case 37:
|
|
case 38:
|
|
case 39:
|
|
case 41:
|
|
case 42:
|
|
case 43:
|
|
case 44:
|
|
case 45:
|
|
case 46:
|
|
case 47: return;
|
|
case 8:
|
|
v37 = object_index;
|
|
RenderUnderPart_Far(1u, 0xFu, 0x44u);
|
|
v5 = CODE_0491C0(v37);
|
|
v4 = 1;
|
|
LABEL_5:
|
|
RenderUnderPart_Far(v4, v5, 0x40u);
|
|
return;
|
|
case 9:
|
|
v3 = CODE_0491C0(object_index);
|
|
ChkLrgObjFixedLength_Far(v2, v3);
|
|
metatile_buffer[R7_] = 0;
|
|
return;
|
|
case 16:
|
|
v6 = CODE_0491C0(object_index);
|
|
R7_ = v6;
|
|
render_graphics_var0EE7 = 0;
|
|
if (!v6)
|
|
v6 = 8;
|
|
ChkLrgObjFixedLength_Far(v2, v6 + 1);
|
|
v38 = v2;
|
|
v7 = area_object_length[v2];
|
|
v8 = R7_;
|
|
R6_ = 22;
|
|
do {
|
|
metatile_buffer[v8++] = kDATA_048ED6[v7];
|
|
if (R6_) {
|
|
v7 += 10;
|
|
--R6_;
|
|
}
|
|
} while (v8 != 11);
|
|
if (R7_ && !area_object_length[v38])
|
|
metatile_buffer[10] = 0;
|
|
if (column_pos_hi) {
|
|
if (area_object_length[v38] == 5) {
|
|
AreaObjXPosition_Far = GetAreaObjXPosition_Far();
|
|
EmptyEnemySlot_Far = FindEmptyEnemySlot_Far();
|
|
obj_xpos_lo.enemy[EmptyEnemySlot_Far] = AreaObjXPosition_Far + 8;
|
|
obj_xpos_hi.enemy[EmptyEnemySlot_Far] = __CFADD__(AreaObjXPosition_Far, 8) + column_pos_hi;
|
|
obj_ypos_hi.enemy[EmptyEnemySlot_Far] = 1;
|
|
enemy_flag[EmptyEnemySlot_Far] = 1;
|
|
obj_ypos_lo.enemy[EmptyEnemySlot_Far] = -112;
|
|
enemy_id[EmptyEnemySlot_Far] = 49;
|
|
++render_graphics_var0EE7;
|
|
if (R7_)
|
|
++render_graphics_var0EE7;
|
|
}
|
|
}
|
|
if (column_pos_hi) {
|
|
if (metatile_buffer[11] == 86)
|
|
metatile_buffer[11] = -5;
|
|
}
|
|
return;
|
|
case 20:
|
|
v10 = CODE_0491C0(object_index);
|
|
ChkLrgObjFixedLength_Far(v2, v10);
|
|
tempF3 = metatile_buffer[0];
|
|
if (metatile_buffer[0] == 101)
|
|
v11 = metatile_buffer[0] + 1;
|
|
else
|
|
v11 = metatile_buffer[0] - 1;
|
|
tempF4 = v11;
|
|
v12 = R7_;
|
|
if ((R7_ & 1) != 0)
|
|
goto LABEL_27;
|
|
while (1) {
|
|
metatile_buffer[v12] = tempF3;
|
|
v13 = (--area_object_length[v2] & 0x80u) != 0;
|
|
if (v13)
|
|
break;
|
|
++v12;
|
|
LABEL_27:
|
|
metatile_buffer[v12] = tempF4;
|
|
v13 = (--area_object_length[v2] & 0x80u) != 0;
|
|
if (v13)
|
|
break;
|
|
++v12;
|
|
}
|
|
return;
|
|
case 24:
|
|
v14 = CODE_0491C0(object_index);
|
|
t0 = area_object_length[v2];
|
|
ChkLrgObjFixedLength_Far(v2, v14);
|
|
if (t0 & 0x80)
|
|
decode_area_data_var0734 = 9;
|
|
--decode_area_data_var0734;
|
|
RenderUnderPart_Far(kDATA_049012[decode_area_data_var0734], kDATA_049009[decode_area_data_var0734], 0x64u);
|
|
return;
|
|
case 25:
|
|
v15 = CODE_0491C0(object_index);
|
|
ChkLrgObjFixedLength_Far(v2, v15);
|
|
v16 = R7_;
|
|
if (area_object_length[v2]) {
|
|
if (metatile_buffer[R7_])
|
|
goto LABEL_42;
|
|
metatile_buffer[R7_] = -11;
|
|
} else {
|
|
metatile_buffer[R7_] = -13;
|
|
if (!metatile_buffer[++v16])
|
|
metatile_buffer[v16++] = -12;
|
|
}
|
|
do {
|
|
if (!metatile_buffer[v16])
|
|
metatile_buffer[v16] = -10;
|
|
LABEL_42:
|
|
++v16;
|
|
} while (v16 != 13);
|
|
return;
|
|
case 26:
|
|
v17 = CODE_0491C0(object_index);
|
|
ChkLrgObjFixedLength_Far(v2, v17);
|
|
v18 = R7_;
|
|
metatile_buffer[R7_] = 103;
|
|
for (i = v18 + 2; metatile_buffer[i] == 101 || metatile_buffer[i] == 102; i += 2)
|
|
metatile_buffer[i] = 103;
|
|
return;
|
|
case 27:
|
|
v20 = CODE_0491C0(object_index);
|
|
ChkLrgObjFixedLength_Far(v2, v20);
|
|
v21 = R7_;
|
|
metatile_buffer[R7_] = -9;
|
|
v22 = v21 + 1;
|
|
do {
|
|
if (metatile_buffer[v22] == 0xEB)
|
|
break;
|
|
metatile_buffer[v22++] = -8;
|
|
} while (v22 != 13);
|
|
return;
|
|
case 28:
|
|
v23 = CODE_0491C0(object_index);
|
|
ChkLrgObjFixedLength_Far(v2, v23);
|
|
v24 = R7_;
|
|
if (metatile_buffer[R7_] != 0xFC)
|
|
metatile_buffer[R7_] = -7;
|
|
v25 = v24 + 1;
|
|
do {
|
|
if (metatile_buffer[v25] == 0xF0)
|
|
break;
|
|
metatile_buffer[v25++] = -6;
|
|
} while (v25 != 13);
|
|
return;
|
|
case 29:
|
|
v26 = CODE_0491C0(object_index);
|
|
ChkLrgObjFixedLength_Far(v2, v26);
|
|
v27 = R7_;
|
|
if (area_object_length[v2]) {
|
|
if (metatile_buffer[R7_] == 104)
|
|
v28 = -18;
|
|
else
|
|
v28 = -21;
|
|
metatile_buffer[R7_] = v28;
|
|
metatile_buffer[v27 + 1] = -20;
|
|
metatile_buffer[12] = 105;
|
|
} else {
|
|
metatile_buffer[R7_] = 2;
|
|
metatile_buffer[v27 + 1] = -19;
|
|
}
|
|
return;
|
|
case 30:
|
|
v29 = CODE_0491C0(object_index);
|
|
ChkLrgObjFixedLength_Far(v2, v29);
|
|
v30 = R7_;
|
|
if (area_object_length[v2]) {
|
|
metatile_buffer[R7_] = 3;
|
|
metatile_buffer[v30 + 1] = -17;
|
|
} else {
|
|
if (metatile_buffer[R7_] == 104)
|
|
v31 = -14;
|
|
else
|
|
v31 = -16;
|
|
metatile_buffer[R7_] = v31;
|
|
for (metatile_buffer[v30 + 1] = -15; ++v30 != 12; metatile_buffer[v30 + 1] = 105)
|
|
;
|
|
}
|
|
return;
|
|
case 31:
|
|
v32 = CODE_0491C0(object_index);
|
|
ChkLrgObjFixedLength_Far(v2, v32);
|
|
v33 = R7_;
|
|
do {
|
|
metatile_buffer[v33++] = 113;
|
|
v13 = (--area_object_length[v2] & 0x80u) != 0;
|
|
} while (!v13);
|
|
return;
|
|
case 32:
|
|
ChkLrgObjFixedLength_Far(object_index, 3u);
|
|
R5_ = CODE_0491C0(v2) - 2;
|
|
R6_ = area_object_length[v2];
|
|
v34 = R5_ + 1;
|
|
if (kDATA_049172[R6_]) {
|
|
v34 = RenderUnderPart_Far(0, R5_, kDATA_049172[R6_]);
|
|
}
|
|
v35 = R6_;
|
|
metatile_buffer[v34] = kDATA_049176[R6_];
|
|
metatile_buffer[v34 + 1] = kDATA_04917A[v35];
|
|
return;
|
|
case 40:
|
|
v36 = CODE_0491C0(object_index);
|
|
RenderUnderPart_Far(2u, v36, 0x77u);
|
|
return;
|
|
}
|
|
}
|
|
|
|
uint8 CODE_0491C0(uint8 k) {
|
|
uint16 v1; // di
|
|
|
|
v1 = area_obj_offset_buffer[(uint16)(2 * k) >> 1] + 1;
|
|
R7_ = *IndirPtr(*(LongPtr *)&tempF3, v1) >> 4;
|
|
return *IndirPtr(*(LongPtr *)&tempF3, v1) & 0xF;
|
|
}
|
|
|
|
uint8 CODE_0491DD() {
|
|
uint16 v0; // si
|
|
uint16 v1; // di
|
|
uint16 v2; // ax
|
|
uint16 v3; // ax
|
|
uint16 i; // si
|
|
uint16 v5; // ax
|
|
PairU16 v6; // edx
|
|
PairU16 v7; // edx
|
|
uint8 result; // di
|
|
|
|
v0 = 0;
|
|
v1 = vram_buffer2_offset;
|
|
if (current_player_mirror) {
|
|
while (1) {
|
|
v2 = *(uint16 *)&kGameOverScreenStripeImage_Luigi[v0];
|
|
vram_buffer2[v1 >> 1] = v2;
|
|
if (v2 == 0xFFFF)
|
|
break;
|
|
v0 += 2;
|
|
v1 += 2;
|
|
}
|
|
} else {
|
|
while (1) {
|
|
v3 = *(uint16 *)&kGameOverScreenStripeImage[v0];
|
|
vram_buffer2[v1 >> 1] = v3;
|
|
if (v3 == 0xFFFF)
|
|
break;
|
|
v0 += 2;
|
|
v1 += 2;
|
|
}
|
|
}
|
|
for (i = 0;; i += 2) {
|
|
v5 = *(uint16 *)&kGameOverScreenStripeImage_TitleLogo[i];
|
|
vram_buffer2[v1 >> 1] = v5;
|
|
if (v5 == 0xFFFF)
|
|
break;
|
|
v1 += 2;
|
|
}
|
|
vram_buffer2_offset = v1;
|
|
*(uint16 *)&R2_ = -18909;
|
|
v6 = CODE_049724(0xA0u, 0);
|
|
v7 = CODE_049724(v6.first, v6.second);
|
|
result = CODE_049724(v7.first, v7.second).second;
|
|
layer2_xpos = 0;
|
|
layer3_xpos = 0;
|
|
vram_buffer_addr_ctrl = 6;
|
|
vblank_which_layer2_scroll_flag = 0;
|
|
WriteReg(BG2HOFS, 0);
|
|
WriteReg(BG2HOFS, 0);
|
|
WriteReg(BG3HOFS, 0);
|
|
WriteReg(BG3HOFS, 0);
|
|
tm_mirror = 23;
|
|
tileset_graphics_type = 10;
|
|
palette_anim0E20 = 10;
|
|
update_entire_palette_flag = 1;
|
|
HandleTilesetGraphicsUploads();
|
|
override_player_xpos2_flag = -1;
|
|
layer2_ypos = 0;
|
|
WriteReg(BG2VOFS, 0);
|
|
WriteReg(BG2VOFS, 0);
|
|
return result;
|
|
}
|
|
|
|
void CODE_0492E7() {
|
|
uint8 v0; // di
|
|
uint8 v1; // di
|
|
uint16 v2; // di
|
|
int v3; // rbp
|
|
uint16 v4; // di
|
|
uint16 v5; // si
|
|
uint16 v6; // ax
|
|
uint16 v7; // di
|
|
uint16 v8; // si
|
|
uint16 v9; // ax
|
|
uint16 v10; // si
|
|
uint16 v11; // ax
|
|
uint16 v12; // si
|
|
uint16 v13; // ax
|
|
uint8 v14; // al
|
|
uint8 v15; // [rsp+44h] [rbp-4h]
|
|
|
|
if (unused_byte_7E0E1A)
|
|
unused_byte_7E0E1A = 0;
|
|
music_ch1 = 0x80;
|
|
v15 = kCODE_0492C6[(uint8)(level_level_preview_image_to_use - 1) + 1];
|
|
tileset_graphics_type = v15 & 0x1F;
|
|
unused_byte_7E0E23 = v15 & 0xE0;
|
|
disable_screen_flag = 1;
|
|
game_loop_toggler = 1;
|
|
HandleTilesetGraphicsUploads();
|
|
render_graphics_var0EC9 = 0;
|
|
area_parser_ctr1 = 0;
|
|
tree_ledge_saved_x = 0;
|
|
tree_ledge_arr130F[0] = 0;
|
|
set_level_music_flag = 0;
|
|
LOBYTE(render_area_gfx_0ECE) = render_area_gfx_0ECE + 1;
|
|
render_area_gfx_0ECE = (uint8)render_area_gfx_0ECE;
|
|
vblank_which_layer2_scroll_flag = 0;
|
|
LOBYTE(cutscene_hdma_varB9A) = 0;
|
|
cutscene_var1680 = 0;
|
|
UNUSED_byte_7E1681 = 0;
|
|
enable_layer3_bgflag = 0;
|
|
Dma_CODE_0480EF();
|
|
current_player_mirror = current_player;
|
|
PrintStatusBarNumbers_Far(kStatusBarNybbles[current_player]);
|
|
v0 = vram_buffer1_offset;
|
|
if (!vram_buffer1[vram_buffer1_offset - 11])
|
|
vram_buffer1[vram_buffer1_offset - 11] = 40;
|
|
if (number_of_players) {
|
|
if ((other_player_num_lives & 0x80u) == 0) {
|
|
*(uint16 *)&vram_buffer1[v0 + 1] = 29272;
|
|
*(uint16 *)&vram_buffer1[v0 + 3] = 1792;
|
|
*(uint16 *)&vram_buffer1[v0 + 5] = 8232;
|
|
vram_buffer1[v0 + 7] = world_number + 1;
|
|
vram_buffer1[v0 + 8] = 32;
|
|
vram_buffer1[v0 + 10] = 32;
|
|
vram_buffer1[v0 + 12] = 32;
|
|
vram_buffer1[v0 + 9] = 36;
|
|
vram_buffer1[v0 + 11] = level_number + 1;
|
|
vram_buffer1[v0 + 13] = -1;
|
|
*(uint16 *)&vram_buffer1_offset = v0 + 12;
|
|
v1 = v0 + 12;
|
|
if (player_hard_mode_flag)
|
|
vram_buffer1[v1 + 5 - 12] = 42;
|
|
}
|
|
}
|
|
vram_buffer_addr_ctrl = 6;
|
|
*(uint16 *)&tree_ledge_countdown = 0;
|
|
*(uint16 *)&tree_ledge_arr130F[1] = 0;
|
|
*(uint16 *)&tree_ledge_arr130F[3] = 0;
|
|
v2 = vram_buffer2_offset;
|
|
v3 = vram_buffer2_offset >> 1;
|
|
vram_buffer2[v3] = -14583;
|
|
vram_buffer2[v3 + 1] = 4800;
|
|
vram_buffer2[v3 + 2] = 12450;
|
|
vram_buffer2[v3 + 3] = -10231;
|
|
vram_buffer2[v3 + 4] = 4800;
|
|
vram_buffer2[v3 + 5] = 28834;
|
|
vram_buffer2[v3 + 6] = -22519;
|
|
vram_buffer2[v3 + 7] = 7744;
|
|
vram_buffer2[v3 + 8] = 12408;
|
|
vram_buffer2[v3 + 9] = 2059;
|
|
vram_buffer2[v3 + 10] = 7744;
|
|
vram_buffer2[v3 + 11] = -20360;
|
|
v4 = v2 + 24;
|
|
v5 = 0;
|
|
do {
|
|
v6 = *(uint16 *)&kLevelPreviewStripeImages[v5];
|
|
vram_buffer2[v4 >> 1] = v6;
|
|
v5 += 2;
|
|
v4 += 2;
|
|
} while (v6 != 0xFFFF);
|
|
v7 = v4 - 2;
|
|
v8 = kDATA_04927E[(uint16)(2 * (uint8)(level_level_preview_image_to_use - 1)) >> 1];
|
|
do {
|
|
v9 = *(uint16 *)&kLevelPreviewStripeImages_Main[v8];
|
|
vram_buffer2[v7 >> 1] = v9;
|
|
v8 += 2;
|
|
v7 += 2;
|
|
} while (v9 != 0xFFFF);
|
|
if (background_color_ctrl_0 == 17) {
|
|
v7 -= 2;
|
|
v10 = 0;
|
|
do {
|
|
v11 = *(uint16 *)&kDATA_04AD6F[v10];
|
|
vram_buffer2[v7 >> 1] = v11;
|
|
v10 += 2;
|
|
v7 += 2;
|
|
} while (v11 != 0xFFFF);
|
|
}
|
|
if ((background_color_ctrl_0 & 0xF0) != 0 && background_color_ctrl_0 != 22) {
|
|
v7 -= 2;
|
|
v12 = 0;
|
|
do {
|
|
v13 = *(uint16 *)&kDATA_04AD9B[v12];
|
|
vram_buffer2[v7 >> 1] = v13;
|
|
v12 += 2;
|
|
v7 += 2;
|
|
} while (v13 != 0xFFFF);
|
|
}
|
|
vram_buffer2_offset = v7;
|
|
CODE_0495E2();
|
|
--screen_routine_task;
|
|
update_entire_palette_flag = 1;
|
|
palette_mirror[0] = 0;
|
|
tempEB = player_status;
|
|
player_status = 1;
|
|
v14 = background_color_ctrl_0 & 0xF0;
|
|
if ((background_color_ctrl_0 & 0xF0) != 0)
|
|
v14 = 4;
|
|
background_color_ctrl = v14;
|
|
if (background_color_ctrl_0 == 2)
|
|
background_color_ctrl = 3;
|
|
GetPlayerColors();
|
|
--update_entire_palette_flag;
|
|
player_status = tempEB;
|
|
background_color_ctrl_0 = 0;
|
|
tm_mirror = 23;
|
|
vram_buffer_addr_ctrl = 6;
|
|
palette_anim0E20 = 0;
|
|
vblank_enable_vtimel_flag = 0;
|
|
layer2_ypos = 0;
|
|
WriteReg(BG2VOFS, 0);
|
|
WriteReg(BG2VOFS, 0);
|
|
}
|
|
// 7E16F6: using guessed type uint8 byte_7E16F6[10];
|
|
|
|
void CODE_0494EA() {
|
|
uint16 v0; // kr00_2
|
|
|
|
if (draw_level_preview_sprites_var009B) {
|
|
draw_level_preview_sprites_var009B = 0;
|
|
v0 = screen_left_xpos16_b;
|
|
screen_left_xpos_hi = HIBYTE(v0);
|
|
screen_left_xpos_lo = v0;
|
|
layer1_xpos_lo = screen_left_xpos16_b;
|
|
layer2_xpos = screen_left_xpos16_b >> 1;
|
|
layer3_xpos = screen_left_xpos16_b >> 2;
|
|
UNUSED_word_7E0ED7 = screen_left_xpos16_b >> 2;
|
|
}
|
|
g_byte_7E0EF6 = HIBYTE(layer2_xpos) & 1;
|
|
area_parser_flag0EFC = 0;
|
|
HIBYTE(g_word_7E0EF7) = 0;
|
|
SetupLayer2Bg();
|
|
CODE_049B96();
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
if (obj_yspeed.bubble[0] != 3) {
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
if (vblank_which_layer2_scroll_flag) {
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
CODE_049BBC();
|
|
}
|
|
}
|
|
}
|
|
|
|
void CODE_04956B() {
|
|
uint8 v0; // al
|
|
uint8 v1; // si
|
|
|
|
CODE_0494EA();
|
|
layer2_ypos = 0;
|
|
if (area_type) {
|
|
if (area_type == 1 && area_data_addr_index != 10)
|
|
LOBYTE(layer2_ypos) = -8;
|
|
v0 = 6;
|
|
cgwsel_mirror = 6;
|
|
v1 = 17;
|
|
} else {
|
|
WriteRegWord(DMAP2, 0xF42u);
|
|
WriteRegWord(A1T2L, 0x9564u);
|
|
WriteReg(A1B2, 1u);
|
|
WriteReg(DAS20, 0x7Fu);
|
|
LOBYTE(layers_scroll_0EEC) = 0;
|
|
UNUSED_byte_7E0EF3 = 0;
|
|
hdmaenable_mirror |= 4u;
|
|
v0 = 0;
|
|
v1 = 23;
|
|
}
|
|
tm_mirror = v1;
|
|
ts_mirror = v0;
|
|
LOBYTE(buffer_layer3_cloud_tilemap_offs) = 0;
|
|
vtimel_mirror = 31;
|
|
if (vblank_which_layer2_scroll_flag) {
|
|
vtimel_mirror = -81;
|
|
vblank_enable_vtimel_flag = 2;
|
|
}
|
|
CODE_0495E2();
|
|
}
|
|
|
|
void CODE_0495E2() {
|
|
int16 v0; // ax
|
|
uint16 v1; // di
|
|
uint16 v2; // si
|
|
int v3; // rbp
|
|
int v4; // rbx
|
|
uint16 v5; // di
|
|
uint16 v6; // si
|
|
uint16 v7; // ax
|
|
|
|
if (override_area_data_addr_index) {
|
|
area_data_addr_index = override_area_data_addr_index;
|
|
override_area_data_addr_index = 0;
|
|
} else if (area_data_addr_index == 12) {
|
|
override_area_data_addr_index = area_data_addr_index;
|
|
if (!world_number || world_number == 3)
|
|
area_data_addr_index = 25;
|
|
else
|
|
area_data_addr_index = 1;
|
|
}
|
|
*(uint16 *)&R6_ = 16 * area_data_addr_index;
|
|
*(uint16 *)&R2_ = 0;
|
|
do {
|
|
v0 = kLevelPaletteIndexes[*(uint16 *)&R6_];
|
|
++*(uint16 *)&R6_;
|
|
v1 = kDATA_04AE3F[(uint16)(2 * v0) >> 1];
|
|
v2 = *(uint16 *)&R2_;
|
|
*(uint16 *)&R4_ = 7;
|
|
do {
|
|
v3 = v1 >> 1;
|
|
v4 = v2 >> 1;
|
|
palette_mirror[v4] = kDATA_04AEC3[v3];
|
|
palette_mirror[v4 + 8] = kword_1AED3[v3];
|
|
v2 += 2;
|
|
v1 += 2;
|
|
--*(uint16 *)&R4_;
|
|
} while (*(int16 *)&R4_ >= 0);
|
|
*(uint16 *)&R2_ = v2 + 16;
|
|
} while (v2 != 464);
|
|
if (tileset_graphics_flag_var2f8 && current_player) {
|
|
v5 = 0;
|
|
v6 = 224;
|
|
do {
|
|
palette_mirror[v6 >> 1] = kDATA_049679[v5 >> 1];
|
|
v6 += 2;
|
|
v5 += 2;
|
|
} while (v5 != 32);
|
|
}
|
|
layer3_xpos = screen_left_xpos16 >> 2;
|
|
*(uint16 *)&tempF3 = (uint16)((screen_left_xpos16 >> 2) & 0xFF00) >> 8;
|
|
v7 = 2 * world_number;
|
|
if (v7 >= 0xCu)
|
|
v7 = 0;
|
|
*(uint16 *)&tempF3 += v7;
|
|
buffer_layer3_cloud_tilemap_offs = 0;
|
|
while (*(uint16 *)&tempF3) {
|
|
buffer_layer3_cloud_tilemap_offs += 224;
|
|
--*(uint16 *)&tempF3;
|
|
}
|
|
buffer_layer3_cloud_tilemap_offs += (uint8)(layer3_xpos & 0xF0) >> 4;
|
|
if (buffer_layer3_cloud_tilemap_offs >= 0xA80u)
|
|
buffer_layer3_cloud_tilemap_offs = 0;
|
|
CODE_04973C();
|
|
if (enable_layer3_bgflag) {
|
|
tempF3 = HIBYTE(layer3_xpos);
|
|
tempF4 = layer3_xpos;
|
|
CODE_048C85();
|
|
tempF5 = 19;
|
|
do {
|
|
CODE_048B49();
|
|
if (tempF4 >= 0xA0u) {
|
|
tempF3 ^= 4u;
|
|
tempF4 = 0x80;
|
|
}
|
|
--tempF5;
|
|
} while (tempF5);
|
|
}
|
|
update_entire_palette_flag = 1;
|
|
++screen_routine_task;
|
|
}
|
|
|
|
PairU16 CODE_049724(uint8 k, uint8 j) {
|
|
*(uint16 *)&R4_ = 1;
|
|
*(uint16 *)&R0_ = 16;
|
|
do {
|
|
palette_mirror[k >> 1] = *(uint16 *)IndirPtr(*(LongPtr *)&R2_, j);
|
|
j += 2;
|
|
k += 2;
|
|
--*(uint16 *)&R0_;
|
|
} while (*(uint16 *)&R0_);
|
|
return MakePairU16(k, j);
|
|
}
|
|
|
|
void CODE_04973C() {
|
|
uint8 v0; // si
|
|
uint16 v1; // ax
|
|
uint16 v2; // di
|
|
int16 v3; // cx
|
|
|
|
v0 = 0;
|
|
do {
|
|
g_byte_7F3000[v0] = 0;
|
|
g_byte_7F3000[v0 + 256] = 0;
|
|
g_byte_7F3000[v0 + 512] = 0;
|
|
g_byte_7F3000[v0 + 768] = 0;
|
|
g_byte_7F3000[v0 + 1024] = 0;
|
|
g_byte_7F3000[v0 + 1280] = 0;
|
|
g_byte_7F3000[v0 + 1536] = 0;
|
|
g_byte_7F3000[v0 + 1792] = 0;
|
|
g_byte_7F3000[v0 + 2048] = 0;
|
|
g_byte_7F3000[v0 + 2304] = 0;
|
|
g_byte_7F3000[v0-- + 2560] = 0;
|
|
} while (v0);
|
|
tempF5 = 127;
|
|
tempF6 = 0;
|
|
*(uint16 *)&tempF3 = 12288;
|
|
for (*(uint16 *)&tempF8 = 0;;) {
|
|
v1 = kDATA_04B683[*(uint16 *)&tempF8 >> 1];
|
|
if (v1 == 0xFFFF)
|
|
break;
|
|
if ((int16)v1 < 0)
|
|
*(uint16 *)&tempF3 += 224;
|
|
v2 = (uint8)v1;
|
|
v3 = __CFSHL__uint16(2 * v1);
|
|
HIBYTE(v1) = 0;
|
|
*(uint16 *)&tempF6 = v3;
|
|
tempF7 = *((uint8 *)kDATA_04B683 + (uint16)(*(uint16 *)&tempF8 + 1)) & 0x3F;
|
|
while (1) {
|
|
uint16 t = g_ram[0xf3] | g_ram[0xf4] << 8;
|
|
IndirWriteByte(*(LongPtr *)&tempF3, v2, tempF7);
|
|
if (!tempF6 || (v2 & 0xF0) == 0xD0)
|
|
break;
|
|
LOBYTE(v1) = v2 + 16;
|
|
v2 = v1;
|
|
}
|
|
++*(uint16 *)&tempF8;
|
|
++*(uint16 *)&tempF8;
|
|
}
|
|
}
|
|
|
|
void GetBackgroundColor_0() {
|
|
if (!background_color_ctrl_0) {
|
|
++screen_routine_task;
|
|
GetPlayerColors();
|
|
}
|
|
}
|
|
|
|
void GetPlayerColors() {
|
|
uint8 bubble; // al
|
|
uint16 v1; // ax
|
|
int16 v2; // ax
|
|
int8 v3; // t0
|
|
uint8 v4; // di
|
|
uint8 i; // si
|
|
int v6; // rbp
|
|
int v7; // rbx
|
|
|
|
bubble = background_color_ctrl;
|
|
if (!background_color_ctrl)
|
|
bubble = obj_yspeed.bubble[0];
|
|
if (!cloud_type_override || (background_color_ctrl & 4) != 0 || (number_of_lives & 0x80) != 0)
|
|
v1 = kDATA_0499ED[(uint16)(2 * bubble) >> 1];
|
|
else
|
|
v1 = 21034;
|
|
palette_mirror[0] = v1;
|
|
*(uint16 *)&coldata1_mirror = (v1 & 0x1F) + 32;
|
|
v2 = 8 * (v1 & 0x3E0);
|
|
v3 = v2;
|
|
LOBYTE(v2) = HIBYTE(v2);
|
|
HIBYTE(v2) = v3;
|
|
*(uint16 *)&coldata2_mirror = v2 + 64;
|
|
LOBYTE(v2) = (uint16)((uint16)(palette_mirror[0] & 0x7C00) >> 2) >> 8;
|
|
HIBYTE(v2) = 0;
|
|
*(uint16 *)&coldata3_mirror = v2 + 128;
|
|
palette_mirror[0] = 0;
|
|
if (!player_disable_auto_palette_update) {
|
|
v4 = 0;
|
|
if (current_player)
|
|
v4 = 32;
|
|
if (player_status == 2)
|
|
v4 += 64;
|
|
for (i = 0; i != 16; i += 2) {
|
|
v6 = v4 >> 1;
|
|
v7 = i >> 1;
|
|
palette_mirror[v7 + 240] = kDATA_0499FD[v6];
|
|
palette_mirror[v7 + 248] = kDATA_0499FD[v6 + 8];
|
|
v4 += 2;
|
|
}
|
|
++update_entire_palette_flag;
|
|
}
|
|
}
|
|
// 7E00BA: using guessed type int8;
|
|
|
|
void CODE_049B35() {
|
|
uint8 v0; // al
|
|
int8 v1; // al
|
|
|
|
R0_ = 32;
|
|
if (obj_yspeed.bubble[0] == 3)
|
|
R0_ *= 2;
|
|
LOBYTE(g_word_7E0EF7) = (uint8)((R0_ + layer2_xpos) & 0xF0) >> 2;
|
|
R0_ = (uint8)((R0_ + layer2_xpos) & 0xF0) >> 3;
|
|
if (R0_) {
|
|
if ((layer2_xpos & 0x100) != 0)
|
|
v0 = 16;
|
|
else
|
|
v0 = 20;
|
|
} else if (g_byte_7E0EF6) {
|
|
g_byte_7E0EF6 = 0;
|
|
v0 = 20;
|
|
} else {
|
|
v0 = 16;
|
|
g_byte_7E0EF6 = 16;
|
|
}
|
|
R1_ = v0;
|
|
v1 = HIBYTE(layer2_xpos) & 0xF;
|
|
if (!R0_)
|
|
++v1;
|
|
HIBYTE(g_word_7E0EF7) = 8 * (v1 + 1);
|
|
CODE_049BBC();
|
|
}
|
|
|
|
void CODE_049B96() {
|
|
uint8 v0; // al
|
|
|
|
LOBYTE(g_word_7E0EF7) = (uint8)(layer2_xpos & 0xF0) >> 2;
|
|
R0_ = (uint8)(layer2_xpos & 0xF0) >> 3;
|
|
HIBYTE(g_word_7E0EF7) = 8 * HIBYTE(layer2_xpos);
|
|
if ((layer2_xpos & 0x100) != 0)
|
|
v0 = 20;
|
|
else
|
|
v0 = 16;
|
|
R1_ = v0;
|
|
}
|
|
|
|
void CODE_049BBC() {
|
|
uint16 v0; // di
|
|
uint16 v1; // si
|
|
|
|
g_word_7E0EFA = 4;
|
|
if (obj_yspeed.bubble[0] == 3)
|
|
g_word_7E0EFA *= 2;
|
|
v0 = upload_buffer_3[0];
|
|
do {
|
|
if ((R0_ & 0x20) != 0)
|
|
*(uint16 *)&R0_ = (*(uint16 *)&R0_ + 1024) & 0x1400;
|
|
upload_buffer_3[(v0 >> 1) + 1] = *(uint16 *)&R0_ - 2048;
|
|
*(uint16 *)&R2_ = 32;
|
|
if ((g_word_7E0EF7 & 0x40) != 0)
|
|
g_word_7E0EF7 = (g_word_7E0EF7 + 2048) & 0xFF00;
|
|
v1 = g_word_7E0EF7;
|
|
*(uint16 *)&R4_ = g_word_7E0EF7;
|
|
do {
|
|
upload_buffer_3[(v0 >> 1) + 2] = layer2_map16_table[v1 >> 1];
|
|
v0 += 2;
|
|
*(uint16 *)&R4_ += 64;
|
|
v1 = *(uint16 *)&R4_;
|
|
--*(uint16 *)&R2_;
|
|
} while (*(int16 *)&R2_ >= 0);
|
|
upload_buffer_3[v0 >> 1] = 36;
|
|
++g_word_7E0EF7;
|
|
++g_word_7E0EF7;
|
|
++*(uint16 *)&R0_;
|
|
--g_word_7E0EFA;
|
|
} while (g_word_7E0EFA);
|
|
upload_buffer_3[0] = v0;
|
|
upload_buffer_3[(v0 >> 1) + 1] = -1;
|
|
vblank_upload_from_7f0000_flag = 1;
|
|
}
|
|
|
|
void LoadAreaPointer() {
|
|
int8 v0; // al
|
|
|
|
area_pointer = FindAreaPointer();
|
|
v0 = 4 * (area_pointer & 0x60) + __CFSHL__(area_pointer & 0x60, 1);
|
|
area_type = 2 * (2 * v0 + __CFSHL__(2 * (area_pointer & 0x60), 1)) + __CFSHL__(v0, 1);
|
|
}
|
|
|
|
uint8 FindAreaPointer() {
|
|
uint8 v0; // di
|
|
|
|
v0 = world_number;
|
|
if (world_number >= 8u) {
|
|
area_number = 0;
|
|
level_number = 0;
|
|
v0 = 0;
|
|
world_number = 0;
|
|
}
|
|
return kAreaAddrOffsets[(uint8)(area_number + kWorldAddrOffsets[v0])];
|
|
}
|
|
|
|
void GetAreaDataAddrs() {
|
|
int8 v0; // al
|
|
int v1; // edx
|
|
uint8 v2; // al
|
|
uint8 v3; // al
|
|
uint8 v4; // al
|
|
uint8 v5; // al
|
|
bool v6; // cf
|
|
uint8 v7; // [rsp+46h] [rbp-2h]
|
|
uint8 v8; // [rsp+46h] [rbp-2h]
|
|
|
|
obj_yspeed.bubble[0] = 0;
|
|
v0 = 4 * (area_pointer & 0x60) + __CFSHL__(area_pointer & 0x60, 1);
|
|
area_type = 2 * (2 * v0 + __CFSHL__(2 * (area_pointer & 0x60), 1)) + __CFSHL__(v0, 1);
|
|
area_addrs_l_offset = area_pointer & 0x1F;
|
|
v1 = (uint8)((area_pointer & 0x1F) + kEnemyAddrHOffsets[area_type]);
|
|
LOBYTE(enemy_data_ptr.addr) = kEnemyDataAddrLow[(uint8)((area_pointer & 0x1F) + kEnemyAddrHOffsets[area_type])];
|
|
HIBYTE(enemy_data_ptr.addr) = kEnemyDataAddrHigh[v1];
|
|
enemy_data_ptr.bank = 1;
|
|
v2 = (area_pointer & 0x1F) + kAreaDataHOffsets[area_type];
|
|
area_data_addr_index = v2;
|
|
if (v2 >= 0x1Cu) {
|
|
LABEL_5:
|
|
++obj_yspeed.bubble[0];
|
|
goto LABEL_6;
|
|
}
|
|
if (v2 >= 0x19u) {
|
|
LABEL_6:
|
|
++obj_yspeed.bubble[0];
|
|
goto LABEL_7;
|
|
}
|
|
if (v2 < 3u) {
|
|
if (v2 < 2u)
|
|
goto LABEL_8;
|
|
goto LABEL_5;
|
|
}
|
|
LABEL_7:
|
|
++obj_yspeed.bubble[0];
|
|
LABEL_8:
|
|
LOBYTE(area_data_ptr.addr) = kAreaDataAddrLow[v2];
|
|
HIBYTE(area_data_ptr.addr) = kAreaDataAddrHigh[v2];
|
|
area_data_ptr.bank = 1;
|
|
v7 = *IndirPtr(area_data_ptr, 0);
|
|
v3 = v7 & 7;
|
|
if ((v7 & 7u) >= 4) {
|
|
background_color_ctrl = v7 & 4;
|
|
v3 = 0;
|
|
}
|
|
foreground_scenery = v3;
|
|
player_entrance_ctrl = (uint8)(v7 & 0x38) >> 3;
|
|
game_timer_setting = 2 * (4 * (v7 & 0xC0) + __CFSHL__(v7 & 0xC0, 1)) + __CFSHL__(2 * (v7 & 0xC0), 1);
|
|
v8 = *IndirPtr(area_data_ptr, 1u);
|
|
terrain_control = v8 & 0xF;
|
|
v4 = (uint8)(v8 & 0x30) >> 4;
|
|
if (v4 == 1)
|
|
v4 = 0;
|
|
background_scenery = v4;
|
|
v5 = 2 * (4 * (v8 & 0xC0) + __CFSHL__(v8 & 0xC0, 1)) + __CFSHL__(2 * (v8 & 0xC0), 1);
|
|
if (v5 == 3) {
|
|
cloud_type_override = 3;
|
|
v5 = 0;
|
|
}
|
|
area_style = v5;
|
|
UpdateVineAtEntrance_New();
|
|
v6 = __CFADD__(area_data_ptr.addr, 2);
|
|
LOBYTE(area_data_ptr.addr) += 2;
|
|
HIBYTE(area_data_ptr.addr) += v6;
|
|
area_parser_var3 = 0;
|
|
}
|
|
// 7E00BA: using guessed type int8;
|
|
|
|
void UpdateVineAtEntrance_New() {
|
|
if (cloud_type_override || area_data_addr_index == 18)
|
|
vine_at_entrance_flag = 1;
|
|
}
|
|
|
|
void RenderPlayerSub_New() {
|
|
int16 v0; // ax
|
|
|
|
if (!cutscene_var0BA5) {
|
|
if ((player_gfx_offset == 24 || player_gfx_offset == 120) && (frame_counter & 7) == 0 && !sound_ch2)
|
|
sound_ch2 = 4;
|
|
vram_flag_028e = 1;
|
|
LOBYTE(v0) = 0;
|
|
HIBYTE(v0) = player_gfx_offset >> 3;
|
|
player_graphics_pointer.addr = v0 + 0x8000;
|
|
player_vramaddress = 24576;
|
|
player_graphics_upload_size = 256;
|
|
if (player_luigi_graphics)
|
|
HIBYTE(player_graphics_pointer.addr) |= 0x40u;
|
|
player_graphics_pointer.bank = 7;
|
|
}
|
|
}
|
|
|
|
void CODE_04D85A() {
|
|
level_preview_sprites_ctr = 0;
|
|
}
|
|
|
|
void Ending_SetPaletteWriteText() {
|
|
uint8 i; // si
|
|
uint16 v1; // ax
|
|
|
|
for (i = 30; (i & 0x80u) == 0; i -= 2) {
|
|
if (*(uint16 *)¤t_player)
|
|
v1 = kLuigiPalette[i >> 1];
|
|
else
|
|
v1 = kMarioPalette[i >> 1];
|
|
palette_mirror[(i >> 1) + 176] = v1;
|
|
}
|
|
++update_entire_palette_flag;
|
|
Ending_WriteText();
|
|
}
|
|
|
|
void Ending_WriteText() {
|
|
uint16 v0; // di
|
|
uint16 v1; // di
|
|
uint16 i; // si
|
|
uint8 v3; // al
|
|
uint8 v4; // [rsp+45h] [rbp-3h]
|
|
|
|
layer3_xpos = 255;
|
|
cutscene_toad_var0BA3 = 0;
|
|
tm_mirror = 21;
|
|
ts_mirror = 2;
|
|
v4 = world_number;
|
|
if (!sram_cutscene_heart_eyes_flag && player_hard_mode_flag)
|
|
world_number = 12;
|
|
R0_ = 4 * current_player;
|
|
v0 = (uint8)((4 * current_player) | ((uint8)(world_number & 8) >> 2));
|
|
world_number = v4;
|
|
v1 = kEndingTextOffs[v0 >> 1];
|
|
for (i = *(uint16 *)&vram_buffer1_offset;; ++i) {
|
|
v3 = *((uint8 *)kEndingTextThankYou + v1);
|
|
vram_buffer1[i + 1] = v3;
|
|
if (v3 == 0xFF)
|
|
break;
|
|
++v1;
|
|
}
|
|
*(uint16 *)&vram_buffer1_offset = i;
|
|
}
|
|
|
|
void CODE_04DBDA() {
|
|
uint8 v0; // al
|
|
uint8 v1; // si
|
|
int8 v2; // al
|
|
|
|
if (!(uint8)cutscene_peach_var0F85) {
|
|
v0 = sram_cutscene_heart_eyes_flag;
|
|
if (sram_cutscene_heart_eyes_flag)
|
|
v0 = current_player;
|
|
v1 = cutscene_peach_var0F84++ | (8 * v0);
|
|
if (cutscene_peach_var0F84 == 3) {
|
|
obj_yspeed.enemy[0] = -1;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
}
|
|
v2 = *((uint8 *)kDATA_04DC3F + v1);
|
|
if (!v2) {
|
|
++game_mode_task;
|
|
player_x_move_force = 0;
|
|
obj_xspeed.player = 0;
|
|
}
|
|
LOBYTE(cutscene_peach_var0F85) = v2;
|
|
HIBYTE(cutscene_peach_var0F85) = kDATA_04DC4F[v1];
|
|
}
|
|
LOBYTE(cutscene_peach_var0F85) = cutscene_peach_var0F85 - 1;
|
|
buttons_a_b_previous = 16 * (HIBYTE(cutscene_peach_var0F85) & 8);
|
|
if (scroll_lock) {
|
|
if (obj_xpos_lo.player >= 0xA2u)
|
|
obj_xpos_lo.player = -94;
|
|
}
|
|
}
|
|
|
|
void ProcessPeachMovement() {
|
|
if ((--cutscene_peach_state_timer & 0x80u) != 0) {
|
|
if (++cutscene_peach_current_state == 5)
|
|
obj_xpos_lo.player = -96;
|
|
cutscene_peach_state_timer = kDATA_04DCB4[cutscene_peach_current_state];
|
|
}
|
|
R0_ = *((uint8 *)kDATA_04DC91 + (uint8)(2 * cutscene_peach_current_state));
|
|
R1_ = *((uint8 *)kDATA_04DC91 + (uint8)(2 * cutscene_peach_current_state) + 1);
|
|
switch ((uint8)(2 * cutscene_peach_current_state) >> 1) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
case 5:
|
|
case 6: return;
|
|
case 3: goto LABEL_7;
|
|
case 4:
|
|
R0_ = 32;
|
|
R2_ = 4;
|
|
ImposeGravity_Far(1u, 0);
|
|
LABEL_7:
|
|
--obj_xpos_lo.enemy[0];
|
|
break;
|
|
}
|
|
}
|
|
|
|
void DrawLevelPreviewSprites_Sub7() {
|
|
uint8 v0; // al
|
|
OamEnt *oam; // rbp
|
|
uint8 enemy; // al
|
|
uint8 v3; // al
|
|
OamEnt *v4; // rdx
|
|
|
|
v0 = rel_xpos_lo.enemy + 7;
|
|
oam = get_OamEnt(oam_buf, 0);
|
|
oam[44].xpos = rel_xpos_lo.enemy + 7;
|
|
oam[45].xpos = v0;
|
|
enemy = rel_ypos.enemy;
|
|
oam[44].ypos = rel_ypos.enemy;
|
|
oam[45].ypos = enemy + 16;
|
|
if (cutscene_peach_current_state != 3 || (frame_counter & 4) != 0)
|
|
v3 = kDATA_04DD4E[cutscene_peach_current_state];
|
|
else
|
|
v3 = kDATA_04DD4E[cutscene_peach_current_state] + 2;
|
|
oam[44].charnum = v3;
|
|
oam[45].charnum = v3 + 32;
|
|
oam[44].flags = 37;
|
|
oam[45].flags = 37;
|
|
oam_tile_size_buffer[176] =
|
|
(obj_xpos_hi.enemy[0] - (((uint8)(obj_xpos_lo.enemy[0] + 7) < (uint8)screen_left_xpos16) + HIBYTE(screen_left_xpos16))) | 2;
|
|
oam_tile_size_buffer[180] = oam_tile_size_buffer[176];
|
|
v4 = get_OamEnt(oam_buf, floatey_numbers_oam_id);
|
|
if (v4->charnum == 0xF6) {
|
|
v4->ypos = -16;
|
|
v4[1].ypos = -16;
|
|
}
|
|
if (enemy_id[9]) {
|
|
oam[120].flags = 28;
|
|
oam[121].flags = 28;
|
|
oam[122].flags = 28;
|
|
oam[123].flags = 28;
|
|
oam[120].charnum = 0x80;
|
|
oam[121].charnum = -127;
|
|
oam[122].charnum = -112;
|
|
oam[123].charnum = -111;
|
|
}
|
|
}
|
|
// 7E03B9: using guessed type int8;
|
|
|
|
void Ending_SetGfxPtrToUpload() {
|
|
uint8 v0; // si
|
|
int v1; // rbp
|
|
|
|
if (cutscene_peach_var0F83 < 0xAu) {
|
|
v0 = cutscene_peach_var0F83++;
|
|
graphics_upload_ptr.bank = kDATA_04DD87[v0];
|
|
graphics_upload_size = 2048;
|
|
v1 = (unsigned int)(v0 * 2) >> 1;
|
|
graphics_upload_vramaddress = kDATA_04DDAF[v1];
|
|
graphics_upload_ptr.addr = kDATA_04DD9B[v1];
|
|
++pausemenu_var3;
|
|
}
|
|
}
|
|
|
|
void MaybeUnused_CODE_04DDC3() {
|
|
uint8 v0; // si
|
|
int v1; // rbp
|
|
|
|
v0 = 2 * cutscene_peach_var0F83++;
|
|
graphics_upload_ptr.bank = kDATA_04DDF1[v0];
|
|
graphics_upload_size = 2048;
|
|
v1 = v0 >> 1;
|
|
graphics_upload_vramaddress = kDATA_04DE19[v1];
|
|
graphics_upload_ptr.addr = kDATA_04DE05[v1];
|
|
++pausemenu_var3;
|
|
}
|
|
|
|
void SpawnMushroomDuringPeachCutscene() {
|
|
enemy_id[9] = 46;
|
|
enemy_state[9] = 0x80;
|
|
enemy_flag[9] = 1;
|
|
obj_xpos_hi.enemy[9] = obj_xpos_hi.player;
|
|
obj_xpos_lo.enemy[9] = obj_xpos_lo.player;
|
|
obj_ypos_hi.enemy[9] = 1;
|
|
obj_ypos_lo.enemy[9] = 24;
|
|
obj_xspeed.enemy[9] = 0;
|
|
power_up_type = 0;
|
|
}
|
|
// 7E0067: using guessed type int8;
|
|
// 7E0082: using guessed type int8;
|
|
// 7E00C5: using guessed type int8;
|
|
// 7E0223: using guessed type int8;
|
|
// 7E0241: using guessed type int8;
|
|
|
|
void CODE_04DE54() {
|
|
uint8 v0; // [rsp+46h] [rbp-2h]
|
|
uint8 v1; // [rsp+47h] [rbp-1h]
|
|
|
|
if (!sram_cutscene_heart_eyes_flag) {
|
|
v1 = world_number;
|
|
v0 = original_level;
|
|
if (!player_hard_mode_flag) {
|
|
original_level = 0;
|
|
world_number = 0;
|
|
}
|
|
original_level = v0;
|
|
world_number = v1;
|
|
}
|
|
cutscene_peach_var0F82 = 1;
|
|
cutscene_peach_var0F83 = 0;
|
|
title_screen_menu_var0717 = 0;
|
|
}
|
|
|
|
void PeachCutscene_04DE8B() {
|
|
int v0; // rbp
|
|
uint16 v1; // si
|
|
uint16 v2; // di
|
|
OamEnt *v3; // rbp
|
|
uint16 v4; // si
|
|
uint8 v5; // al
|
|
uint16 v6; // si
|
|
uint16 v7; // si
|
|
OamEnt *v8; // rbp
|
|
uint16 v9; // si
|
|
uint8 v10; // al
|
|
uint16 v11; // si
|
|
OamEnt *v12; // rbp
|
|
uint8 v13; // si
|
|
int v14; // rbp
|
|
uint16 v15; // si
|
|
uint16 v16; // di
|
|
OamEnt *v17; // rbp
|
|
uint16 v18; // si
|
|
uint8 v19; // al
|
|
uint16 v20; // si
|
|
uint16 v21; // si
|
|
OamEnt *v22; // rbp
|
|
uint16 v23; // si
|
|
uint8 v24; // al
|
|
uint16 v25; // si
|
|
OamEnt *v26; // rbp
|
|
uint8 v27; // si
|
|
int v28; // rbp
|
|
uint16 v29; // si
|
|
uint16 v30; // di
|
|
OamEnt *oam; // rbp
|
|
uint16 v32; // si
|
|
uint8 v33; // al
|
|
uint16 v34; // si
|
|
uint16 v35; // si
|
|
OamEnt *v36; // rbp
|
|
uint16 v37; // si
|
|
uint8 v38; // al
|
|
uint16 v39; // si
|
|
OamEnt *v40; // rbp
|
|
uint8 v41; // si
|
|
|
|
if (sram_cutscene_heart_eyes_flag) {
|
|
if (world_number >= 8u) {
|
|
CutsceneHdma();
|
|
if (cutscene_peach_var0F81 >= kDATA_04E276[cutscene_peach_close_up_animation_frame]) {
|
|
cutscene_peach_var0F81 = 0;
|
|
if (++cutscene_peach_close_up_animation_frame >= 9u) {
|
|
if (cutscene_peach_close_up_animation_frame == 9)
|
|
cutscene_peach_var0F89 = 0;
|
|
cutscene_peach_close_up_animation_frame = 9;
|
|
}
|
|
}
|
|
++cutscene_peach_var0F81;
|
|
v28 = (uint8)(2 * cutscene_peach_close_up_animation_frame) >> 1;
|
|
*(uint16 *)&tempED = kDATA_04E2E6[v28];
|
|
v29 = kDATA_04E2A0[v28];
|
|
v30 = 4;
|
|
while (*((uint8 *)kDATA_04E2FA + v29) != 0xFF) {
|
|
oam = get_OamEnt(oam_buf, v30);
|
|
oam->ypos = *((uint8 *)kDATA_04E2FA + v29) + 0x80;
|
|
v32 = v29 + 1;
|
|
oam->xpos = *((uint8 *)kDATA_04E2FA + v32++) - 64;
|
|
v33 = *((uint8 *)kDATA_04E2FA + v32);
|
|
oam->charnum = v33;
|
|
v34 = v32 + 1;
|
|
R0_ = 0;
|
|
if (v33 < 0x80u)
|
|
R0_ = current_player;
|
|
oam->flags = R0_ | *((uint8 *)kDATA_04E2FA + v34) | 0x20;
|
|
v29 = v34 + 1;
|
|
oam_tile_size_buffer[v30] = 2;
|
|
v30 += 4;
|
|
}
|
|
v35 = *(uint16 *)&tempED;
|
|
while (*((uint8 *)kDATA_04E2FA + v35) != 0xFF) {
|
|
v36 = get_OamEnt(oam_buf, v30);
|
|
v36->ypos = *((uint8 *)kDATA_04E2FA + v35) + 0x80;
|
|
v37 = v35 + 1;
|
|
v36->xpos = current_player + current_player + current_player + current_player + *((uint8 *)kDATA_04E2FA + v37++) - 64;
|
|
v38 = *((uint8 *)kDATA_04E2FA + v37);
|
|
v36->charnum = v38;
|
|
v39 = v37 + 1;
|
|
R0_ = 0;
|
|
if (v38 < 0x80u)
|
|
R0_ = current_player;
|
|
v36->flags = R0_ | *((uint8 *)kDATA_04E2FA + v39) | 0x20;
|
|
v35 = v39 + 1;
|
|
oam_tile_size_buffer[v30] = 2;
|
|
v30 += 4;
|
|
}
|
|
if (cutscene_peach_close_up_animation_frame == 9) {
|
|
DrawToadAndRelatedSprites_Func16();
|
|
v40 = get_OamEnt(oam_buf, 0);
|
|
v40->xpos = kDATA_04E259[(cutscene_peach_var0F89 >> 3) & 3] - 80;
|
|
R0_ = cutscene_peach_var0F89 >> 2;
|
|
v40->ypos = 96 - (cutscene_peach_var0F89 >> 2);
|
|
v41 = (cutscene_peach_var0F89 >> 5) & 3;
|
|
v40->charnum = kDATA_04E255[v41];
|
|
v40->flags = 38;
|
|
oam_tile_size_buffer[0] = 0;
|
|
++cutscene_peach_var0F89;
|
|
if (v41 == 3)
|
|
cutscene_peach_var0F89 = 0;
|
|
}
|
|
} else {
|
|
CutsceneHdma();
|
|
if (cutscene_peach_var0F81 >= kDATA_04E266[cutscene_peach_close_up_animation_frame]) {
|
|
cutscene_peach_var0F81 = 0;
|
|
if (++cutscene_peach_close_up_animation_frame == 5)
|
|
cutscene_peach_var0F89 = 0;
|
|
if (cutscene_peach_close_up_animation_frame >= 0xFu)
|
|
cutscene_peach_close_up_animation_frame = 6;
|
|
}
|
|
++cutscene_peach_var0F81;
|
|
v14 = (uint8)(2 * cutscene_peach_close_up_animation_frame) >> 1;
|
|
*(uint16 *)&tempED = kDATA_04E2C6[v14];
|
|
v15 = kDATA_04E280[v14];
|
|
v16 = 4;
|
|
while (*((uint8 *)kDATA_04E2FA + v15) != 0xFF) {
|
|
v17 = get_OamEnt(oam_buf, v16);
|
|
v17->ypos = *((uint8 *)kDATA_04E2FA + v15) + 0x80;
|
|
v18 = v15 + 1;
|
|
v17->xpos = *((uint8 *)kDATA_04E2FA + v18++) - 64;
|
|
v19 = *((uint8 *)kDATA_04E2FA + v18);
|
|
v17->charnum = v19;
|
|
v20 = v18 + 1;
|
|
R0_ = 0;
|
|
if (v19 < 0x80u)
|
|
R0_ = current_player;
|
|
v17->flags = R0_ | *((uint8 *)kDATA_04E2FA + v20) | 0x20;
|
|
v15 = v20 + 1;
|
|
oam_tile_size_buffer[v16] = 2;
|
|
v16 += 4;
|
|
}
|
|
v21 = *(uint16 *)&tempED;
|
|
while (*((uint8 *)kDATA_04E2FA + v21) != 0xFF) {
|
|
v22 = get_OamEnt(oam_buf, v16);
|
|
v22->ypos = *((uint8 *)kDATA_04E2FA + v21) + 0x80;
|
|
v23 = v21 + 1;
|
|
v22->xpos = current_player + current_player + current_player + current_player + *((uint8 *)kDATA_04E2FA + v23++) - 64;
|
|
v24 = *((uint8 *)kDATA_04E2FA + v23);
|
|
v22->charnum = v24;
|
|
v25 = v23 + 1;
|
|
R0_ = 0;
|
|
if (v24 < 0x80u)
|
|
R0_ = current_player;
|
|
v22->flags = R0_ | *((uint8 *)kDATA_04E2FA + v25) | 0x20;
|
|
v21 = v25 + 1;
|
|
oam_tile_size_buffer[v16] = 2;
|
|
v16 += 4;
|
|
}
|
|
if (cutscene_peach_close_up_animation_frame >= 6u) {
|
|
DrawToadAndRelatedSprites_Func16();
|
|
v26 = get_OamEnt(oam_buf, 0);
|
|
v26->xpos = kDATA_04E259[(cutscene_peach_var0F89 >> 3) & 3] - 80;
|
|
R0_ = cutscene_peach_var0F89 >> 2;
|
|
v26->ypos = 96 - (cutscene_peach_var0F89 >> 2);
|
|
v27 = (cutscene_peach_var0F89 >> 5) & 3;
|
|
v26->charnum = kDATA_04E255[v27];
|
|
v26->flags = 38;
|
|
oam_tile_size_buffer[0] = 0;
|
|
++cutscene_peach_var0F89;
|
|
if (v27 == 3)
|
|
cutscene_peach_var0F89 = 0;
|
|
}
|
|
}
|
|
} else {
|
|
CutsceneHdma();
|
|
if (cutscene_peach_var0F81 >= kDATA_04E25D[cutscene_peach_close_up_animation_frame]) {
|
|
cutscene_peach_var0F81 = 0;
|
|
if (++cutscene_peach_close_up_animation_frame >= 8u) {
|
|
if (cutscene_peach_close_up_animation_frame == 8)
|
|
cutscene_peach_var0F89 = 0;
|
|
cutscene_peach_close_up_animation_frame = 8;
|
|
}
|
|
}
|
|
++cutscene_peach_var0F81;
|
|
v0 = (uint8)(2 * cutscene_peach_close_up_animation_frame) >> 1;
|
|
*(uint16 *)&tempED = kDATA_04E2B4[v0];
|
|
v1 = kDATA_04E280[v0];
|
|
v2 = 4;
|
|
while (*((uint8 *)kDATA_04E2FA + v1) != 0xFF) {
|
|
v3 = get_OamEnt(oam_buf, v2);
|
|
v3->ypos = *((uint8 *)kDATA_04E2FA + v1) + 0x80;
|
|
v4 = v1 + 1;
|
|
v3->xpos = *((uint8 *)kDATA_04E2FA + v4++) - 64;
|
|
v5 = *((uint8 *)kDATA_04E2FA + v4);
|
|
v3->charnum = v5;
|
|
v6 = v4 + 1;
|
|
R0_ = 0;
|
|
if (v5 < 0x80u)
|
|
R0_ = current_player;
|
|
v3->flags = R0_ | *((uint8 *)kDATA_04E2FA + v6) | 0x20;
|
|
v1 = v6 + 1;
|
|
oam_tile_size_buffer[v2] = 2;
|
|
v2 += 4;
|
|
}
|
|
v7 = *(uint16 *)&tempED;
|
|
while (*((uint8 *)kDATA_04E2FA + v7) != 0xFF) {
|
|
v8 = get_OamEnt(oam_buf, v2);
|
|
v8->ypos = *((uint8 *)kDATA_04E2FA + v7) + 0x80;
|
|
v9 = v7 + 1;
|
|
v8->xpos = current_player + current_player + current_player + current_player + *((uint8 *)kDATA_04E2FA + v9++) - 64;
|
|
v10 = *((uint8 *)kDATA_04E2FA + v9);
|
|
v8->charnum = v10;
|
|
v11 = v9 + 1;
|
|
R0_ = 0;
|
|
if (v10 < 0x80u)
|
|
R0_ = current_player;
|
|
v8->flags = R0_ | *((uint8 *)kDATA_04E2FA + v11) | 0x20;
|
|
v7 = v11 + 1;
|
|
oam_tile_size_buffer[v2] = 2;
|
|
v2 += 4;
|
|
}
|
|
if (cutscene_peach_close_up_animation_frame == 8) {
|
|
DrawToadAndRelatedSprites_Func16();
|
|
v12 = get_OamEnt(oam_buf, 0);
|
|
v12->xpos = kDATA_04E259[(cutscene_peach_var0F89 >> 3) & 3] - 80;
|
|
R0_ = cutscene_peach_var0F89 >> 2;
|
|
v12->ypos = 96 - (cutscene_peach_var0F89 >> 2);
|
|
v13 = (cutscene_peach_var0F89 >> 5) & 3;
|
|
v12->charnum = kDATA_04E255[v13];
|
|
v12->flags = 38;
|
|
oam_tile_size_buffer[0] = 0;
|
|
++cutscene_peach_var0F89;
|
|
if (v13 == 3)
|
|
cutscene_peach_var0F89 = 0;
|
|
}
|
|
}
|
|
PeachCutscene_04E221();
|
|
}
|
|
|
|
void PeachCutscene_04E221() {
|
|
OamEnt *oam; // rdx
|
|
uint8 v1; // al
|
|
|
|
if (current_player) {
|
|
oam = get_OamEnt(oam_buf, 0);
|
|
if (oam[1].charnum == 0xEE) {
|
|
v1 = oam[1].xpos - 2;
|
|
oam[1].xpos = v1;
|
|
oam[2].xpos = v1;
|
|
oam[1].charnum = -126;
|
|
oam[2].charnum = -125;
|
|
oam[2].xpos = oam[1].xpos + 8;
|
|
oam[3].charnum = -123;
|
|
oam[4].charnum = -119;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CutsceneBowserDefeat_04ECCA() {
|
|
uint16 v0; // ax
|
|
|
|
graphics_upload_ptr.bank = 4;
|
|
graphics_upload_size = 2048;
|
|
graphics_upload_vramaddress = 30720;
|
|
if (world_number == 7)
|
|
v0 = -12288;
|
|
else
|
|
v0 = -16384;
|
|
graphics_upload_ptr.addr = v0;
|
|
cutscene_rustling_bag_animation_frame = 0;
|
|
cutscene_toad_popped_out_of_bag_flag = 0;
|
|
cutscene_wait_before_toad_breaks_out_of_bag = 0;
|
|
cutscene_toad_has_been_initialized_flag = 0;
|
|
pausemenu_var3 = 2;
|
|
}
|
|
|
|
void CutsceneToad_04ED07() {
|
|
graphics_upload_ptr.bank = 4;
|
|
graphics_upload_size = 2048;
|
|
graphics_upload_vramaddress = 31744;
|
|
graphics_upload_ptr.addr = kDATA_04ED5A[(uint8)(2 * world_number) >> 1];
|
|
}
|
|
|
|
void UploadSpriteGFX() {
|
|
WriteReg(VMAIN, 0x80u);
|
|
WriteRegWord(VMADDL, 0x6000u);
|
|
WriteRegWord(DMAP0, 0x1801u);
|
|
WriteRegWord(A1T0L, 0x8000u);
|
|
WriteReg(A1B0, 4u);
|
|
WriteRegWord(DAS0L, 0x4000u);
|
|
WriteReg(MDMAEN, 1u);
|
|
}
|
|
|
|
void DrawToadAndRelatedSprites(uint8 k) {
|
|
uint8 v1; // al
|
|
int8 v2; // al
|
|
OamEnt *v3; // rbp
|
|
uint8 v4; // al
|
|
OamEnt *oam; // rbp
|
|
uint8 v6; // si
|
|
|
|
if (cutscene_toad_popped_out_of_bag_flag) {
|
|
v6 = world_number;
|
|
if (!cutscene_toad_has_been_initialized_flag)
|
|
DrawToadAndRelatedSprites_Func13();
|
|
R0_ = kDATA_04EE45[v6];
|
|
R1_ = HIBYTE(kDATA_04EE45[v6]);
|
|
funcs_1948B[(unsigned int)(v6 * 2) >> 1]();
|
|
} else {
|
|
if ((frame_counter & 7) != 0) {
|
|
v1 = cutscene_rustling_bag_animation_frame;
|
|
} else {
|
|
v1 = ++cutscene_rustling_bag_animation_frame;
|
|
if (cutscene_rustling_bag_animation_frame >= 3u) {
|
|
if (((random_byte4 ^ random_byte3) & 1) != 0) {
|
|
v1 = 0;
|
|
cutscene_rustling_bag_animation_frame = 0;
|
|
} else {
|
|
cutscene_rustling_bag_animation_frame = 3;
|
|
v1 = 1;
|
|
}
|
|
}
|
|
}
|
|
R0_ = v1;
|
|
DrawToadAndRelatedSprites_Func14(0, PAIR16(obj_xpos_hi.enemy[0], obj_xpos_lo.enemy[0]));
|
|
DrawToadAndRelatedSprites_Func14(4, PAIR16(obj_xpos_hi.enemy[0], obj_xpos_lo.enemy[0]) + 8);
|
|
if (R0_ == 2) {
|
|
oam = get_OamEnt(oam_buf, 0);
|
|
oam[64].charnum = -122;
|
|
oam[65].charnum = -121;
|
|
oam[66].charnum = -106;
|
|
oam[67].charnum = -105;
|
|
oam[64].ypos = -72;
|
|
oam[65].ypos = -72;
|
|
oam[66].ypos = -64;
|
|
oam[67].ypos = -64;
|
|
} else {
|
|
if (R0_)
|
|
v2 = 0x80;
|
|
else
|
|
v2 = -125;
|
|
v3 = get_OamEnt(oam_buf, 0);
|
|
v3[64].charnum = v2;
|
|
v4 = v2 + 1;
|
|
v3[65].charnum = v4;
|
|
v4 += 31;
|
|
v3[66].charnum = v4;
|
|
v3[67].charnum = v4 + 1;
|
|
v3[64].ypos = -80;
|
|
v3[65].ypos = -80;
|
|
v3[66].ypos = -64;
|
|
v3[67].ypos = -64;
|
|
}
|
|
}
|
|
}
|
|
// 19498: using guessed type int (*funcs_19490[13])();
|
|
|
|
void CutsceneToad_Func0() {
|
|
uint8 v0; // al
|
|
|
|
DrawToadAndRelatedSprites_Func12();
|
|
if (cutscene_wait_before_toad_breaks_out_of_bag) {
|
|
if (cutscene_wait_before_toad_breaks_out_of_bag == 3 && !cutscene_var0B9F) {
|
|
DrawToadAndRelatedSprites_Func18();
|
|
R0_ = 32;
|
|
R2_ = 4;
|
|
ImposeGravity_Far(1u, 0);
|
|
v0 = obj_ypos_lo.enemy[0];
|
|
if (obj_ypos_lo.enemy[0] < 0xB0u) {
|
|
cutscene_var0B9D_oam_id = 1;
|
|
v0 = obj_ypos_lo.enemy[0];
|
|
}
|
|
if (v0 >= 0xB8u) {
|
|
obj_ypos_lo.enemy[0] = -72;
|
|
obj_yspeed.enemy[0] = -2;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.enemy[0] = 0;
|
|
cutscene_var0B9E = 0;
|
|
cutscene_var0B9F = 24;
|
|
cutscene_var0BA4 = 0;
|
|
DrawToadAndRelatedSprites_Func15();
|
|
}
|
|
}
|
|
if (cutscene_var0B9F)
|
|
--cutscene_var0B9F;
|
|
else
|
|
cutscene_var0B9E = 1;
|
|
R0_ = rel_xpos_lo.enemy;
|
|
R1_ = obj_ypos_lo.enemy[0];
|
|
DrawToadAndRelatedSprites_Func11(kDATA_04EE5F[cutscene_var0B9D_oam_id], cutscene_var0B9E);
|
|
DrawToadAndRelatedSprites_Func10();
|
|
} else {
|
|
DrawToadAndRelatedSprites_Func10();
|
|
}
|
|
}
|
|
|
|
void CutsceneToad_Func1() {
|
|
uint8 v0; // al
|
|
uint8 v1; // di
|
|
uint8 v2; // di
|
|
uint8 v3; // al
|
|
|
|
DrawToadAndRelatedSprites_Func12();
|
|
if (!cutscene_wait_before_toad_breaks_out_of_bag) {
|
|
DrawToadAndRelatedSprites_Func10();
|
|
return;
|
|
}
|
|
if (cutscene_wait_before_toad_breaks_out_of_bag == 3) {
|
|
if (!cutscene_var0B9F) {
|
|
if (cutscene_toad_has_been_initialized_flag == 2) {
|
|
cutscene_var0B9E = cutscene_toad_has_been_initialized_flag;
|
|
goto LABEL_12;
|
|
}
|
|
DrawToadAndRelatedSprites_Func18();
|
|
cutscene_var0B9E = 1;
|
|
R0_ = 32;
|
|
R2_ = 4;
|
|
ImposeGravity_Far(1u, 0);
|
|
v0 = obj_ypos_lo.enemy[0];
|
|
if (obj_ypos_lo.enemy[0] < 0xB0u) {
|
|
cutscene_var0B9D_oam_id = 1;
|
|
v0 = obj_ypos_lo.enemy[0];
|
|
}
|
|
if (v0 < 0xB8u)
|
|
goto LABEL_12;
|
|
obj_ypos_lo.enemy[0] = -72;
|
|
obj_yspeed.enemy[0] = 0;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.enemy[0] = 0;
|
|
cutscene_var0B9F = 40;
|
|
cutscene_toad_has_been_initialized_flag = 2;
|
|
cutscene_var0B9E = 0;
|
|
}
|
|
--cutscene_var0B9F;
|
|
}
|
|
LABEL_12:
|
|
R0_ = rel_xpos_lo.enemy;
|
|
R1_ = obj_ypos_lo.enemy[0];
|
|
v1 = kDATA_04EE5F[cutscene_var0B9D_oam_id];
|
|
DrawToadAndRelatedSprites_Func11(v1, cutscene_var0B9E);
|
|
v2 = v1 + 16;
|
|
R0_ = rel_xpos_lo.enemy + 16;
|
|
v3 = cutscene_var0B9E;
|
|
if (cutscene_var0B9E == 2) {
|
|
DrawToadAndRelatedSprites_Func15();
|
|
v3 = 3;
|
|
}
|
|
DrawToadAndRelatedSprites_Func11(v2, v3);
|
|
DrawToadAndRelatedSprites_Func10();
|
|
}
|
|
|
|
void CutsceneToad_Func2() {
|
|
DrawToadAndRelatedSprites_Func12();
|
|
if (!cutscene_wait_before_toad_breaks_out_of_bag) {
|
|
DrawToadAndRelatedSprites_Func10();
|
|
return;
|
|
}
|
|
if (cutscene_wait_before_toad_breaks_out_of_bag != 3)
|
|
goto LABEL_21;
|
|
if (cutscene_var0BA0 < 0x28u) {
|
|
LABEL_20:
|
|
++cutscene_var0BA0;
|
|
LABEL_21:
|
|
R0_ = rel_xpos_lo.enemy;
|
|
R1_ = obj_ypos_lo.enemy[0];
|
|
DrawToadAndRelatedSprites_Func11(kDATA_04EE5F[cutscene_var0B9D_oam_id], cutscene_var0B9E);
|
|
DrawToadAndRelatedSprites_Func10();
|
|
return;
|
|
}
|
|
if (cutscene_var0BA0 < 0x50u) {
|
|
if (cutscene_var0BA0 < 0x2Cu) {
|
|
CODE_04F124(0xA0u);
|
|
} else if (cutscene_var0BA0 < 0x30u) {
|
|
CODE_04F0ED(0xA0u);
|
|
} else {
|
|
CODE_04F091(0xA0u);
|
|
}
|
|
goto LABEL_20;
|
|
}
|
|
if (cutscene_var0BA0 >= 0x58u) {
|
|
DrawToadAndRelatedSprites_Func18();
|
|
R0_ = 32;
|
|
R2_ = 4;
|
|
ImposeGravity_Far(1u, 0);
|
|
cutscene_var0B9E = 1;
|
|
if (obj_ypos_lo.enemy[0] >= 0xB0u) {
|
|
if (obj_ypos_lo.enemy[0] >= 0xB8u) {
|
|
obj_yspeed.enemy[0] = 0;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.enemy[0] = 0;
|
|
obj_ypos_lo.enemy[0] = -72;
|
|
cutscene_var0B9E = 0;
|
|
cutscene_var0B9F = 1;
|
|
DrawToadAndRelatedSprites_Func15();
|
|
}
|
|
} else {
|
|
cutscene_var0B9D_oam_id = 1;
|
|
}
|
|
if (!cutscene_var0B9F && (frame_counter & 1) == 0)
|
|
++obj_xpos_lo.enemy[3];
|
|
}
|
|
CODE_04F031();
|
|
DrawToadAndRelatedSprites_Func10();
|
|
}
|
|
// 7E021D: using guessed type int8;
|
|
|
|
void CODE_04F031() {
|
|
uint8 v0; // di
|
|
uint8 v1; // di
|
|
uint8 v2; // al
|
|
uint8 v3; // di
|
|
uint8 v4; // al
|
|
|
|
R0_ = rel_xpos_lo.enemy;
|
|
R1_ = obj_ypos_lo.enemy[0];
|
|
v0 = kDATA_04EE5F[cutscene_var0B9D_oam_id];
|
|
DrawToadAndRelatedSprites_Func11(v0, cutscene_var0B9E);
|
|
v1 = v0 + 16;
|
|
R0_ = rel_xpos_lo.enemy - obj_xpos_lo.enemy[3] - 7;
|
|
v2 = cutscene_var0B9F - 1;
|
|
if (cutscene_var0B9F != 1)
|
|
v2 = cutscene_var0B9E + 4;
|
|
DrawToadAndRelatedSprites_Func11(v1, v2);
|
|
v3 = v1 + 16;
|
|
R0_ = obj_xpos_lo.enemy[3] + rel_xpos_lo.enemy + 7;
|
|
v4 = cutscene_var0B9F - 1;
|
|
if (cutscene_var0B9F != 1)
|
|
v4 = cutscene_var0B9E + 6;
|
|
DrawToadAndRelatedSprites_Func11(v3, v4);
|
|
if ((cutscene_var0BA0 & 0x80u) == 0)
|
|
++cutscene_var0BA0;
|
|
}
|
|
|
|
void CODE_04F091(uint8 j) {
|
|
uint8 v1; // al
|
|
OamEnt *oam; // rbp
|
|
int8 v3; // al
|
|
int8 v4; // al
|
|
|
|
v1 = obj_ypos_lo.enemy[0] + 1;
|
|
oam = get_OamEnt(oam_buf, j);
|
|
oam[65].ypos = obj_ypos_lo.enemy[0] + 1;
|
|
oam[67].ypos = v1;
|
|
v1 += 7;
|
|
oam[64].ypos = v1;
|
|
oam[66].ypos = v1;
|
|
v3 = rel_xpos_lo.enemy - 13;
|
|
oam[65].xpos = rel_xpos_lo.enemy - 13;
|
|
oam[64].xpos = v3 - 1;
|
|
v4 = rel_xpos_lo.enemy + 13;
|
|
oam[67].xpos = rel_xpos_lo.enemy + 13;
|
|
oam[66].xpos = v4 + 1;
|
|
oam[65].charnum = -32;
|
|
oam[67].charnum = -32;
|
|
oam[64].charnum = -50;
|
|
oam[66].charnum = -50;
|
|
oam[66].flags = 45;
|
|
oam[67].flags = 45;
|
|
oam[64].flags = 109;
|
|
oam[65].flags = 109;
|
|
oam_tile_size_buffer[j + 256] = 2;
|
|
oam_tile_size_buffer[j + 260] = 2;
|
|
oam_tile_size_buffer[j + 264] = 2;
|
|
oam_tile_size_buffer[j + 268] = 2;
|
|
}
|
|
|
|
void CODE_04F0ED(uint8 j) {
|
|
OamEnt *oam; // rbp
|
|
uint8 v2; // al
|
|
|
|
oam = get_OamEnt(oam_buf, j);
|
|
oam[64].xpos = rel_xpos_lo.enemy - 9;
|
|
oam[65].xpos = rel_xpos_lo.enemy + 9;
|
|
v2 = obj_ypos_lo.enemy[0] + 1;
|
|
oam[64].ypos = obj_ypos_lo.enemy[0] + 1;
|
|
oam[65].ypos = v2;
|
|
oam[64].charnum = -32;
|
|
oam[65].charnum = -32;
|
|
oam[64].flags = 109;
|
|
oam[65].flags = 45;
|
|
oam_tile_size_buffer[j + 256] = 2;
|
|
oam_tile_size_buffer[j + 260] = 2;
|
|
}
|
|
|
|
void CODE_04F124(uint8 j) {
|
|
OamEnt *oam; // rbp
|
|
uint8 v2; // al
|
|
|
|
oam = get_OamEnt(oam_buf, j);
|
|
oam[64].xpos = rel_xpos_lo.enemy - 5;
|
|
oam[65].xpos = rel_xpos_lo.enemy + 5;
|
|
v2 = obj_ypos_lo.enemy[0];
|
|
oam[64].ypos = obj_ypos_lo.enemy[0];
|
|
oam[65].ypos = v2;
|
|
oam[64].charnum = -32;
|
|
oam[65].charnum = -32;
|
|
oam[64].flags = 109;
|
|
oam[65].flags = 45;
|
|
oam_tile_size_buffer[j + 256] = 2;
|
|
oam_tile_size_buffer[j + 260] = 2;
|
|
}
|
|
|
|
void CutsceneToad_Func3() {
|
|
uint8 v0; // al
|
|
int8 v1; // si
|
|
uint8 v2; // di
|
|
|
|
DrawToadAndRelatedSprites_Func12();
|
|
if (cutscene_wait_before_toad_breaks_out_of_bag) {
|
|
if (++cutscene_var0B9F >= 0xC0u) {
|
|
cutscene_var0B9F = -64;
|
|
cutscene_toad_has_been_initialized_flag = 2;
|
|
cutscene_arr0BB8[0] = 1;
|
|
cutscene_arr0BB8[1] = 1;
|
|
cutscene_arr0BB8[2] = 1;
|
|
cutscene_arr0BB8[3] = 1;
|
|
}
|
|
var0E67 = 0;
|
|
if (cutscene_arr0BB4[0]) {
|
|
if (cutscene_var0BA1) {
|
|
--cutscene_var0BA1;
|
|
v0 = 0;
|
|
} else {
|
|
DrawToadAndRelatedSprites_Func15();
|
|
v0 = 2;
|
|
}
|
|
cutscene_var0B9E = v0;
|
|
v1 = 3;
|
|
v2 = 0;
|
|
do {
|
|
R0_ = cutscene_arr0BB0[(uint8)v1];
|
|
R1_ = -72;
|
|
DrawToadAndRelatedSprites_Func11(v2, cutscene_var0B9E);
|
|
v2 += 16;
|
|
var0E67 = v2;
|
|
--v1;
|
|
} while (v1 >= 0);
|
|
} else if (cutscene_toad_has_been_initialized_flag == 2) {
|
|
CODE_04F1D7();
|
|
} else {
|
|
CODE_04F2AB();
|
|
}
|
|
}
|
|
DrawToadAndRelatedSprites_Func10();
|
|
}
|
|
|
|
void CODE_04F1D7() {
|
|
uint8 v0; // di
|
|
uint8 v1; // al
|
|
uint8 v2; // al
|
|
uint8 v3; // di
|
|
uint8 v4; // al
|
|
uint8 v5; // di
|
|
uint8 v6; // al
|
|
|
|
DrawToadAndRelatedSprites_Func18();
|
|
R0_ = 32;
|
|
R2_ = 4;
|
|
ImposeGravity_Far(1u, 0);
|
|
if (obj_ypos_lo.enemy[0] < 0xB0u)
|
|
cutscene_var0B9D_oam_id = 1;
|
|
v0 = kDATA_04EE5F[cutscene_var0B9D_oam_id];
|
|
R0_ = rel_xpos_lo.enemy;
|
|
v1 = obj_ypos_lo.enemy[0];
|
|
if (obj_ypos_lo.enemy[0] >= 0xB8u) {
|
|
v1 = -72;
|
|
cutscene_arr0BB8[0] = 0;
|
|
}
|
|
R1_ = v1;
|
|
DrawToadAndRelatedSprites_Func11(v0, cutscene_arr0BB8[0]);
|
|
R0_ = cutscene_arr0BB0[1];
|
|
if ((uint8)(obj_ypos_lo.enemy[0] - 12) < 0xB8u) {
|
|
if (frame_counter & 1)
|
|
++cutscene_arr0BB0[1];
|
|
v2 = obj_ypos_lo.enemy[0] - 12;
|
|
} else {
|
|
v2 = -72;
|
|
cutscene_arr0BB8[1] = 0;
|
|
}
|
|
R1_ = v2;
|
|
v3 = v0 + 16;
|
|
DrawToadAndRelatedSprites_Func11(v3, cutscene_arr0BB8[1] + 6);
|
|
R0_ = cutscene_arr0BB0[2];
|
|
v4 = obj_ypos_lo.enemy[0] - 24;
|
|
if ((uint8)(obj_ypos_lo.enemy[0] - 24) < 0xB8u) {
|
|
--cutscene_arr0BB0[2];
|
|
} else {
|
|
v4 = -72;
|
|
cutscene_arr0BB8[2] = 0;
|
|
}
|
|
R1_ = v4;
|
|
v5 = v3 + 16;
|
|
DrawToadAndRelatedSprites_Func11(v5, cutscene_arr0BB8[2] + 4);
|
|
R0_ = cutscene_arr0BB0[3];
|
|
v6 = obj_ypos_lo.enemy[0] - 36;
|
|
if ((uint8)(obj_ypos_lo.enemy[0] - 36) < 0xB8u) {
|
|
++cutscene_arr0BB0[3];
|
|
} else {
|
|
cutscene_arr0BB8[3] = 0;
|
|
++cutscene_arr0BB4[0];
|
|
cutscene_var0BA1 = 40;
|
|
v6 = obj_ypos_lo.enemy[0] - 36;
|
|
}
|
|
R1_ = v6;
|
|
DrawToadAndRelatedSprites_Func11(v5 + 16, cutscene_arr0BB8[3] + 6);
|
|
}
|
|
|
|
void CODE_04F2AB() {
|
|
uint8 v0; // di
|
|
uint8 i; // si
|
|
OamEnt *oam; // rbp
|
|
OamEnt *v3; // rbx
|
|
uint8 j; // si
|
|
uint8 v5; // si
|
|
|
|
v0 = -80;
|
|
for (i = 0; i < 9u; ++i) {
|
|
oam = get_OamEnt(oam_buf, v0);
|
|
oam[64].xpos = rel_xpos_lo.enemy;
|
|
oam[64].ypos = kDATA_04F38F[i];
|
|
oam[64].charnum = HIBYTE(kDATA_04F38F[i]);
|
|
oam[64].flags = 45;
|
|
oam_tile_size_buffer[v0 + 256] = 2;
|
|
v0 += 4;
|
|
}
|
|
v3 = get_OamEnt(oam_buf, 0);
|
|
v3[112].flags = 109;
|
|
oam_tile_size_buffer[448] = 0;
|
|
oam_tile_size_buffer[444] = 0;
|
|
v3[112].xpos = v3[111].xpos + 8;
|
|
for (j = 0; j != 6; ++j) {
|
|
if (kDATA_04F388[j] >= cutscene_var0B9F)
|
|
break;
|
|
}
|
|
v5 = j;
|
|
R0_ = kDATA_04F37A[v5];
|
|
R1_ = HIBYTE(kDATA_04F37A[v5]);
|
|
switch ((unsigned int)(v5 * 2) >> 1) {
|
|
case 0u:
|
|
oam_tile_size_buffer[432] = 1;
|
|
oam_tile_size_buffer[436] = 1;
|
|
oam_tile_size_buffer[440] = 1;
|
|
oam_tile_size_buffer[456] = 1;
|
|
oam_tile_size_buffer[460] = 1;
|
|
oam_tile_size_buffer[464] = 1;
|
|
break;
|
|
case 1u:
|
|
oam_tile_size_buffer[432] = 1;
|
|
oam_tile_size_buffer[436] = 1;
|
|
oam_tile_size_buffer[440] = 1;
|
|
oam_tile_size_buffer[460] = 1;
|
|
oam_tile_size_buffer[464] = 1;
|
|
sound_ch1 = 9;
|
|
break;
|
|
case 2u:
|
|
oam_tile_size_buffer[432] = 1;
|
|
oam_tile_size_buffer[436] = 1;
|
|
oam_tile_size_buffer[456] = 1;
|
|
oam_tile_size_buffer[460] = 1;
|
|
oam_tile_size_buffer[464] = 1;
|
|
break;
|
|
case 3u:
|
|
oam_tile_size_buffer[432] = 1;
|
|
oam_tile_size_buffer[436] = 1;
|
|
oam_tile_size_buffer[456] = 1;
|
|
oam_tile_size_buffer[464] = 1;
|
|
sound_ch1 = 9;
|
|
break;
|
|
case 4u:
|
|
oam_tile_size_buffer[432] = 1;
|
|
oam_tile_size_buffer[456] = 1;
|
|
oam_tile_size_buffer[460] = 1;
|
|
oam_tile_size_buffer[464] = 1;
|
|
break;
|
|
case 5u:
|
|
oam_tile_size_buffer[432] = 1;
|
|
oam_tile_size_buffer[456] = 1;
|
|
oam_tile_size_buffer[460] = 1;
|
|
sound_ch1 = 9;
|
|
break;
|
|
case 6u:
|
|
oam_tile_size_buffer[456] = 1;
|
|
oam_tile_size_buffer[460] = 1;
|
|
oam_tile_size_buffer[464] = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CutsceneToad_Func4() {
|
|
uint8 v0; // al
|
|
|
|
DrawToadAndRelatedSprites_Func12();
|
|
if (cutscene_wait_before_toad_breaks_out_of_bag) {
|
|
DrawToadAndRelatedSprites_Func18();
|
|
R0_ = 32;
|
|
R2_ = 4;
|
|
ImposeGravity_Far(1u, 0);
|
|
if (obj_ypos_lo.enemy[0] < 0xA0u)
|
|
cutscene_var0B9D_oam_id = 1;
|
|
if (obj_ypos_lo.enemy[0] >= 0xB0u) {
|
|
obj_ypos_lo.enemy[0] = -80;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.player = 0;
|
|
v0 = ++cutscene_var0B9E;
|
|
if ((cutscene_var0B9E & 0x80u) == 0) {
|
|
v0 = 0;
|
|
cutscene_var0B9E = 0;
|
|
}
|
|
obj_yspeed.enemy[0] = v0;
|
|
}
|
|
if (++cutscene_var0B9F < 0x44u) {
|
|
CODE_04F586();
|
|
DrawToadAndRelatedSprites_Func10();
|
|
} else {
|
|
if (cutscene_var0B9F == 68)
|
|
sound_ch1 = 8;
|
|
cutscene_var0B9F = 69;
|
|
CODE_04F412();
|
|
DrawToadAndRelatedSprites_Func15();
|
|
DrawToadAndRelatedSprites_Func10();
|
|
}
|
|
} else {
|
|
DrawToadAndRelatedSprites_Func10();
|
|
}
|
|
}
|
|
|
|
void CODE_04F412() {
|
|
uint8 v0; // al
|
|
OamEnt *oam; // rdx
|
|
uint8 v2; // al
|
|
uint8 v3; // al
|
|
uint8 v4; // al
|
|
uint8 v5; // al
|
|
uint8 i; // si
|
|
uint8 v7; // al
|
|
uint8 v8; // si
|
|
uint8 v9; // di
|
|
uint8 j; // si
|
|
OamEnt *v11; // rbp
|
|
|
|
R0_ = cutscene_var0B9F + rel_xpos_lo.enemy;
|
|
v0 = cutscene_var0B9F + rel_xpos_lo.enemy + 6;
|
|
oam = get_OamEnt(oam_buf, 0);
|
|
oam[64].xpos = v0;
|
|
oam[65].xpos = v0 + 16;
|
|
v2 = R0_;
|
|
oam[68].xpos = R0_;
|
|
oam[70].xpos = v2;
|
|
oam[69].xpos = v2 + 8;
|
|
v3 = R0_ + 28;
|
|
oam[72].xpos = R0_ + 28;
|
|
oam[74].xpos = v3;
|
|
oam[73].xpos = v3 + 8;
|
|
v4 = R0_ + 6;
|
|
oam[76].xpos = R0_ + 6;
|
|
oam[78].xpos = v4;
|
|
oam[77].xpos = v4 + 8;
|
|
v5 = R0_ + 22;
|
|
oam[80].xpos = R0_ + 22;
|
|
oam[82].xpos = v5;
|
|
oam[81].xpos = v5 + 8;
|
|
oam[68].ypos = -72;
|
|
oam[69].ypos = -72;
|
|
oam[72].ypos = -72;
|
|
oam[73].ypos = -72;
|
|
oam[76].ypos = -72;
|
|
oam[77].ypos = -72;
|
|
oam[80].ypos = -72;
|
|
oam[81].ypos = -72;
|
|
oam[64].ypos = -64;
|
|
oam[65].ypos = -64;
|
|
oam[70].ypos = -64;
|
|
oam[74].ypos = -64;
|
|
oam[78].ypos = -64;
|
|
oam[82].ypos = -64;
|
|
oam[68].charnum = -66;
|
|
oam[73].charnum = -66;
|
|
oam[69].charnum = -65;
|
|
oam[72].charnum = -65;
|
|
oam[70].charnum = -20;
|
|
oam[74].charnum = -20;
|
|
oam[64].charnum = -22;
|
|
oam[65].charnum = -22;
|
|
oam[76].charnum = -74;
|
|
oam[77].charnum = -74;
|
|
oam[80].charnum = -74;
|
|
oam[81].charnum = -74;
|
|
oam[78].charnum = -55;
|
|
oam[82].charnum = -55;
|
|
oam[64].flags = 45;
|
|
oam[68].flags = 45;
|
|
oam[69].flags = 45;
|
|
oam[70].flags = 45;
|
|
oam[76].flags = 45;
|
|
oam[78].flags = 45;
|
|
oam[80].flags = 45;
|
|
oam[82].flags = 45;
|
|
oam[65].flags = 109;
|
|
oam[72].flags = 109;
|
|
oam[73].flags = 109;
|
|
oam[74].flags = 109;
|
|
oam[77].flags = 109;
|
|
oam[81].flags = 109;
|
|
oam_tile_size_buffer[256] = 2;
|
|
oam_tile_size_buffer[260] = 2;
|
|
oam_tile_size_buffer[280] = 2;
|
|
oam_tile_size_buffer[296] = 2;
|
|
oam_tile_size_buffer[312] = 2;
|
|
oam_tile_size_buffer[328] = 2;
|
|
for (i = 3; (i & 0x80u) == 0; --i) {
|
|
v7 = cutscene_arr0BB8[i];
|
|
if (v7) {
|
|
if (v7 < 0x1Eu)
|
|
++cutscene_arr0BB8[i];
|
|
else
|
|
cutscene_arr0BB8[i] = 0;
|
|
}
|
|
}
|
|
if ((frame_counter & 7) == 0) {
|
|
v8 = 3;
|
|
do {
|
|
if (!cutscene_arr0BB8[v8])
|
|
break;
|
|
--v8;
|
|
} while (v8);
|
|
v9 = frame_counter & 3;
|
|
cutscene_arr0BB0[v8] = ((frame_counter ^ *(&random_byte3 + (frame_counter & 3))) & 0x1F) - 52;
|
|
cutscene_arr0BB4[v8] = ((frame_counter ^ *(&random_byte4 + v9)) & 7) - 80;
|
|
++cutscene_arr0BB8[v8];
|
|
}
|
|
for (j = 3; (j & 0x80u) == 0; --j) {
|
|
R0_ = kDATA_04F582[cutscene_arr0BB8[j] >> 3];
|
|
v11 = get_OamEnt(oam_buf, (uint8)(4 * j));
|
|
v11->xpos = cutscene_arr0BB0[j];
|
|
v11->ypos = cutscene_arr0BB4[j];
|
|
v11->charnum = R0_;
|
|
v11->flags = 37;
|
|
}
|
|
}
|
|
|
|
void CODE_04F586() {
|
|
uint8 v0; // di
|
|
uint8 v1; // al
|
|
OamEnt *oam; // rdx
|
|
uint8 v3; // al
|
|
uint8 v4; // si
|
|
OamEnt *v5; // rbp
|
|
|
|
v0 = kDATA_04EE5F[cutscene_var0B9D_oam_id];
|
|
v1 = cutscene_var0B9F + rel_xpos_lo.enemy;
|
|
oam = get_OamEnt(oam_buf, v0);
|
|
oam[64].xpos = cutscene_var0B9F + rel_xpos_lo.enemy;
|
|
oam[66].xpos = v1;
|
|
v1 += 16;
|
|
oam[65].xpos = v1;
|
|
oam[67].xpos = v1;
|
|
v3 = obj_ypos_lo.enemy[0];
|
|
oam[64].ypos = obj_ypos_lo.enemy[0];
|
|
oam[65].ypos = v3;
|
|
v3 += 16;
|
|
oam[66].ypos = v3;
|
|
oam[67].ypos = v3;
|
|
v4 = cutscene_var0B9F & 0xC;
|
|
R0_ = 4;
|
|
do {
|
|
v5 = get_OamEnt(oam_buf, v0);
|
|
v5[64].charnum = kDATA_04F5DA[v4];
|
|
v5[64].flags = kDATA_04F5EA[v4];
|
|
oam_tile_size_buffer[v0 + 256] = 2;
|
|
v0 += 4;
|
|
++v4;
|
|
--R0_;
|
|
} while (R0_);
|
|
}
|
|
|
|
void CutsceneToad_Func5() {
|
|
DrawToadAndRelatedSprites_Func12();
|
|
if (!cutscene_wait_before_toad_breaks_out_of_bag) {
|
|
DrawToadAndRelatedSprites_Func10();
|
|
return;
|
|
}
|
|
DrawToadAndRelatedSprites_Func18();
|
|
R0_ = 32;
|
|
R1_ = 4;
|
|
R2_ = 3;
|
|
ImposeGravity_Far(1u, 0);
|
|
if (obj_ypos_lo.enemy[0] < 0xA0u)
|
|
cutscene_var0B9D_oam_id = 1;
|
|
if (obj_ypos_lo.enemy[0] < 0xB8u) {
|
|
CODE_04F6F9(kDATA_04EE5F[cutscene_var0B9D_oam_id]);
|
|
DrawToadAndRelatedSprites_Func10();
|
|
return;
|
|
}
|
|
obj_ypos_lo.enemy[0] = -72;
|
|
obj_yspeed.enemy[0] = 0;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.enemy[0] = 0;
|
|
if (cutscene_var0BA4 == 1) {
|
|
sound_ch1 = 32;
|
|
cutscene_var0BA4 = 32;
|
|
}
|
|
if (cutscene_toad_has_been_initialized_flag != 2) {
|
|
++cutscene_toad_has_been_initialized_flag;
|
|
rel_xpos_lo.enemy -= 8;
|
|
obj_xpos_lo.enemy[0] -= 8;
|
|
frame_counter = 0;
|
|
}
|
|
if (cutscene_var0BA0)
|
|
goto LABEL_14;
|
|
if (++cutscene_var0B9F >= 0x40u) {
|
|
cutscene_var0B9F = 64;
|
|
LABEL_14:
|
|
if (++cutscene_var0BA0 >= 0x88u)
|
|
cutscene_var0BA0 = -120;
|
|
}
|
|
CODE_04F74C();
|
|
DrawToadAndRelatedSprites_Func15();
|
|
DrawToadAndRelatedSprites_Func10();
|
|
}
|
|
|
|
void CODE_04F6A4(uint8 j) {
|
|
uint8 enemy; // al
|
|
OamEnt *oam; // rbp
|
|
uint8 v3; // al
|
|
|
|
enemy = rel_xpos_lo.enemy;
|
|
oam = get_OamEnt(oam_buf, j);
|
|
oam[64].xpos = rel_xpos_lo.enemy;
|
|
oam[66].xpos = enemy;
|
|
enemy += 16;
|
|
oam[65].xpos = enemy;
|
|
oam[67].xpos = enemy;
|
|
v3 = obj_ypos_lo.enemy[0];
|
|
oam[64].ypos = obj_ypos_lo.enemy[0];
|
|
oam[65].ypos = v3;
|
|
v3 += 16;
|
|
oam[66].ypos = v3;
|
|
oam[67].ypos = v3;
|
|
oam[64].charnum = -50;
|
|
oam[65].charnum = -50;
|
|
oam[66].charnum = -50;
|
|
oam[67].charnum = -50;
|
|
oam[64].flags = 45;
|
|
oam[65].flags = 109;
|
|
oam[66].flags = -83;
|
|
oam[67].flags = -51;
|
|
oam_tile_size_buffer[j + 256] = 2;
|
|
oam_tile_size_buffer[j + 260] = 2;
|
|
oam_tile_size_buffer[j + 264] = 2;
|
|
oam_tile_size_buffer[j + 268] = 2;
|
|
}
|
|
|
|
void CODE_04F6F9(uint8 j) {
|
|
uint8 enemy; // al
|
|
OamEnt *oam; // rbp
|
|
uint8 v3; // al
|
|
|
|
enemy = rel_xpos_lo.enemy;
|
|
oam = get_OamEnt(oam_buf, j);
|
|
oam[64].xpos = rel_xpos_lo.enemy;
|
|
oam[66].xpos = enemy;
|
|
enemy += 16;
|
|
oam[65].xpos = enemy;
|
|
oam[67].xpos = enemy;
|
|
v3 = obj_ypos_lo.enemy[0];
|
|
oam[66].ypos = obj_ypos_lo.enemy[0];
|
|
oam[67].ypos = v3;
|
|
v3 += 8;
|
|
oam[64].ypos = v3;
|
|
oam[65].ypos = v3;
|
|
oam[66].charnum = -50;
|
|
oam[67].charnum = -50;
|
|
oam[64].charnum = -34;
|
|
oam[65].charnum = -34;
|
|
oam[64].flags = 45;
|
|
oam[66].flags = 45;
|
|
oam[65].flags = 109;
|
|
oam[67].flags = 109;
|
|
oam_tile_size_buffer[j + 256] = 2;
|
|
oam_tile_size_buffer[j + 260] = 2;
|
|
oam_tile_size_buffer[j + 264] = 2;
|
|
oam_tile_size_buffer[j + 268] = 2;
|
|
}
|
|
|
|
void CODE_04F74C() {
|
|
uint8 v0; // al
|
|
uint8 v1; // al
|
|
OamEnt *oam; // rdx
|
|
uint8 v3; // al
|
|
uint8 v4; // al
|
|
uint8 v5; // al
|
|
uint8 v6; // al
|
|
uint8 v7; // al
|
|
uint8 v8; // di
|
|
OamEnt *v9; // rdx
|
|
|
|
v0 = cutscene_var0B9F - 40;
|
|
if ((int8)(cutscene_var0B9F - 40) < 0)
|
|
v0 = 0;
|
|
R0_ = v0 >> 2;
|
|
R1_ = (uint8)(cutscene_var0BA0 & 8) >> 3;
|
|
v1 = R1_ + cutscene_var0BA0 + rel_xpos_lo.enemy;
|
|
oam = get_OamEnt(oam_buf, 0);
|
|
oam[64].xpos = v1;
|
|
oam[68].xpos = v1;
|
|
v3 = v1 + 16 - R1_;
|
|
oam[65].xpos = v3;
|
|
oam[69].xpos = v3;
|
|
v4 = v3 + 16 - R1_;
|
|
oam[66].xpos = v4;
|
|
oam[70].xpos = v4;
|
|
v5 = R1_ + obj_ypos_lo.enemy[0] - R0_;
|
|
oam[68].ypos = v5;
|
|
oam[69].ypos = v5;
|
|
oam[70].ypos = v5;
|
|
v5 += 8;
|
|
oam[64].ypos = v5;
|
|
oam[65].ypos = v5;
|
|
oam[66].ypos = v5;
|
|
oam[64].charnum = -34;
|
|
oam[66].charnum = -34;
|
|
oam[65].charnum = -20;
|
|
oam[68].charnum = -50;
|
|
oam[70].charnum = -50;
|
|
oam[69].charnum = -22;
|
|
oam[64].flags = 45;
|
|
oam[65].flags = 45;
|
|
oam[68].flags = 45;
|
|
oam[69].flags = 45;
|
|
oam[66].flags = 109;
|
|
oam[70].flags = 109;
|
|
oam_tile_size_buffer[256] = 2;
|
|
oam_tile_size_buffer[260] = 2;
|
|
oam_tile_size_buffer[264] = 2;
|
|
oam_tile_size_buffer[272] = 2;
|
|
oam_tile_size_buffer[276] = 2;
|
|
oam_tile_size_buffer[280] = 2;
|
|
v6 = cutscene_var0BA0 + rel_xpos_lo.enemy + 2;
|
|
oam[72].xpos = v6;
|
|
v6 += 8;
|
|
oam[73].xpos = v6++;
|
|
oam[74].xpos = v6;
|
|
v6 += 8;
|
|
oam[75].xpos = v6++;
|
|
oam[76].xpos = v6;
|
|
v6 += 8;
|
|
oam[77].xpos = v6++;
|
|
oam[78].xpos = v6;
|
|
oam[79].xpos = v6 + 8;
|
|
oam[72].ypos = -56;
|
|
oam[73].ypos = -56;
|
|
oam[74].ypos = -56;
|
|
oam[75].ypos = -56;
|
|
oam[76].ypos = -56;
|
|
oam[77].ypos = -56;
|
|
oam[78].ypos = -56;
|
|
oam[79].ypos = -56;
|
|
if ((cutscene_var0BA0 & 0xF) == 15)
|
|
sound_ch1 = 14;
|
|
v7 = (2 * (cutscene_var0BA0 & 8)) | 0xCB;
|
|
oam[72].charnum = v7;
|
|
oam[74].charnum = v7;
|
|
oam[76].charnum = v7;
|
|
oam[78].charnum = v7++;
|
|
oam[73].charnum = v7;
|
|
oam[75].charnum = v7;
|
|
oam[77].charnum = v7;
|
|
oam[79].charnum = v7;
|
|
oam[72].flags = 45;
|
|
oam[73].flags = 45;
|
|
oam[74].flags = 45;
|
|
oam[75].flags = 45;
|
|
oam[76].flags = 45;
|
|
oam[77].flags = 45;
|
|
oam[78].flags = 45;
|
|
oam[79].flags = 45;
|
|
v8 = 0;
|
|
do {
|
|
v9 = get_OamEnt(oam_buf, v8);
|
|
if (v9[64].xpos < 0x40u)
|
|
v9[64].ypos = -16;
|
|
v8 += 4;
|
|
} while (v8);
|
|
}
|
|
|
|
void CutsceneToad_Func6() {
|
|
uint8 v0; // al
|
|
uint8 v1; // al
|
|
uint8 v2; // [rsp+47h] [rbp-1h]
|
|
|
|
v0 = ++cutscene_wait_before_toad_breaks_out_of_bag;
|
|
if (cutscene_wait_before_toad_breaks_out_of_bag < 0xD0u) {
|
|
if (cutscene_wait_before_toad_breaks_out_of_bag >= 0x20u) {
|
|
if ((cutscene_wait_before_toad_breaks_out_of_bag & 0xF) == 0)
|
|
sound_ch1 = 14;
|
|
v0 = cutscene_wait_before_toad_breaks_out_of_bag;
|
|
}
|
|
} else {
|
|
DrawToadAndRelatedSprites_Func15();
|
|
v0 = -48;
|
|
cutscene_wait_before_toad_breaks_out_of_bag = -48;
|
|
}
|
|
v1 = v0 >> 3;
|
|
if (v1 >= 3u)
|
|
v1 = 3;
|
|
v2 = v1;
|
|
CODE_04F8DC(v1);
|
|
if (v2 == 2 && !cutscene_var0BA4) {
|
|
sound_ch1 = 43;
|
|
cutscene_var0BA4 = 43;
|
|
}
|
|
DrawToadAndRelatedSprites_Func10();
|
|
}
|
|
|
|
void CODE_04F8DC(uint8 a) {
|
|
uint8 v1; // si
|
|
OamEnt *oam; // rdx
|
|
uint8 i; // di
|
|
uint8 v4; // al
|
|
OamEnt *v5; // rdx
|
|
int8 v6; // al
|
|
uint8 v7; // di
|
|
int8 v8; // si
|
|
uint8 v9; // al
|
|
OamEnt *v10; // rdx
|
|
int8 v11; // al
|
|
|
|
v1 = 8 * a;
|
|
oam = get_OamEnt(oam_buf, 8u);
|
|
oam[64].xpos = -120;
|
|
oam[66].xpos = -120;
|
|
oam[65].xpos = -112;
|
|
oam[64].ypos = -80;
|
|
oam[65].ypos = -80;
|
|
oam[66].ypos = -64;
|
|
oam[64].charnum = 0x80;
|
|
oam[65].charnum = -127;
|
|
oam[66].charnum = -96;
|
|
oam[64].flags = 45;
|
|
oam[65].flags = 45;
|
|
oam[66].flags = 45;
|
|
for (i = 0; i < 8u; ++i)
|
|
get_OamEnt(oam_buf, i)[64].xpos = kDATA_04F9B5[v1++];
|
|
oam_tile_size_buffer[256] = 2;
|
|
oam_tile_size_buffer[260] = 2;
|
|
oam_tile_size_buffer[264] = 2;
|
|
oam_tile_size_buffer[268] = 2;
|
|
oam_tile_size_buffer[272] = 2;
|
|
v4 = cutscene_wait_before_toad_breaks_out_of_bag + 126;
|
|
v5 = get_OamEnt(oam_buf, 0);
|
|
v5[71].xpos = cutscene_wait_before_toad_breaks_out_of_bag + 126;
|
|
if (v4 >= 0x88u)
|
|
v6 = -64;
|
|
else
|
|
v6 = -16;
|
|
v5[71].ypos = v6;
|
|
R1_ = (frame_counter >> 2) & 2;
|
|
v5[71].charnum = R1_ - 26;
|
|
v5[71].flags = 45;
|
|
oam_tile_size_buffer[284] = 2;
|
|
v7 = 32;
|
|
v8 = 6;
|
|
R0_ = cutscene_wait_before_toad_breaks_out_of_bag + 120;
|
|
do {
|
|
v9 = R0_;
|
|
v10 = get_OamEnt(oam_buf, v7);
|
|
v10[64].xpos = R0_;
|
|
v10[65].xpos = v9;
|
|
if (v9 >= 0x91u) {
|
|
v10[64].ypos = -64;
|
|
v10[65].ypos = -56;
|
|
} else {
|
|
v10[64].ypos = -16;
|
|
v10[65].ypos = -16;
|
|
}
|
|
v11 = R1_ - 70;
|
|
v10[64].charnum = R1_ - 70;
|
|
v10[65].charnum = v11 + 1;
|
|
v10[64].flags = 45;
|
|
v10[65].flags = 45;
|
|
v7 += 8;
|
|
R0_ -= 10;
|
|
--v8;
|
|
} while (v8);
|
|
}
|
|
|
|
void DrawToadAndRelatedSprites_Func10() {
|
|
if (cutscene_toad_var0BA6) {
|
|
if ((cutscene_toad_var0BA6 & 0x80u) == 0)
|
|
--cutscene_toad_var0BA6;
|
|
} else if (!cutscene_var0BA7) {
|
|
++cutscene_var0BA7;
|
|
mario_goal_walk_var03ce = -72;
|
|
if (!player_size)
|
|
mario_goal_walk_var03ce = -56;
|
|
}
|
|
}
|
|
|
|
void DrawToadAndRelatedSprites_Func11(uint8 j, uint8 a) {
|
|
uint8 v2; // si
|
|
uint8 v3; // al
|
|
OamEnt *oam; // rbp
|
|
uint8 v5; // al
|
|
|
|
R2_ = a;
|
|
v2 = 3 * a;
|
|
v3 = R0_;
|
|
oam = get_OamEnt(oam_buf, j);
|
|
oam[64].xpos = R0_;
|
|
oam[66].xpos = v3;
|
|
oam[65].xpos = v3 + 8;
|
|
v5 = R1_;
|
|
oam[64].ypos = R1_;
|
|
oam[65].ypos = v5;
|
|
oam[66].ypos = v5 + 8;
|
|
oam[64].charnum = kDATA_04FA4B[v2];
|
|
oam[65].charnum = kDATA_04FA4B[v2 + 1];
|
|
oam[66].charnum = kDATA_04FA4B[v2 + 2];
|
|
oam[64].flags = kDATA_04FA63[v2];
|
|
oam[65].flags = kDATA_04FA63[v2 + 1];
|
|
oam[66].flags = kDATA_04FA63[v2 + 2];
|
|
oam_tile_size_buffer[j + 264] = 2;
|
|
}
|
|
|
|
void DrawToadAndRelatedSprites_Func12() {
|
|
uint8 v0; // al
|
|
OamEnt *oam; // rbp
|
|
OamEnt *v2; // rbp
|
|
OamEnt *v3; // rdx
|
|
OamEnt *v4; // rbp
|
|
|
|
if ((--cutscene_rustling_bag_animation_frame & 0x80u) != 0) {
|
|
++cutscene_wait_before_toad_breaks_out_of_bag;
|
|
cutscene_rustling_bag_animation_frame = 7;
|
|
}
|
|
v0 = cutscene_wait_before_toad_breaks_out_of_bag;
|
|
if (cutscene_wait_before_toad_breaks_out_of_bag >= 3u) {
|
|
v0 = 3;
|
|
cutscene_wait_before_toad_breaks_out_of_bag = 3;
|
|
}
|
|
R0_ = *((uint8 *)kDATA_04FAA7 + (uint8)(2 * v0));
|
|
R1_ = *((uint8 *)kDATA_04FAA7 + (uint8)(2 * v0) + 1);
|
|
switch ((uint8)(2 * v0) >> 1) {
|
|
case 0:
|
|
oam = get_OamEnt(oam_buf, 0);
|
|
oam[86].xpos = -108;
|
|
oam[86].ypos = -69;
|
|
oam[86].charnum = -64;
|
|
oam[86].flags = 45;
|
|
oam_tile_size_buffer[344] = 2;
|
|
oam[88].xpos = -120;
|
|
oam[92].xpos = -120;
|
|
oam[89].xpos = -112;
|
|
oam[93].xpos = -112;
|
|
oam[92].ypos = -64;
|
|
oam[93].ypos = -64;
|
|
oam[92].charnum = -100;
|
|
oam[93].charnum = -99;
|
|
oam[88].ypos = -72;
|
|
oam[89].ypos = -72;
|
|
oam[88].charnum = -116;
|
|
oam[89].charnum = -115;
|
|
oam[92].flags = 45;
|
|
oam[93].flags = 45;
|
|
oam[88].flags = 45;
|
|
oam[89].flags = 45;
|
|
oam_tile_size_buffer[368] = 2;
|
|
oam_tile_size_buffer[372] = 2;
|
|
oam_tile_size_buffer[352] = 2;
|
|
oam_tile_size_buffer[356] = 2;
|
|
break;
|
|
case 1:
|
|
v2 = get_OamEnt(oam_buf, 0);
|
|
v2[86].xpos = -102;
|
|
v2[86].ypos = -66;
|
|
v2[86].charnum = -62;
|
|
v2[86].flags = 45;
|
|
oam_tile_size_buffer[344] = 2;
|
|
v2[92].xpos = -120;
|
|
v2[93].xpos = -112;
|
|
v2[92].ypos = -64;
|
|
v2[93].ypos = -64;
|
|
v2[92].charnum = -103;
|
|
v2[93].charnum = -102;
|
|
v2[92].flags = 45;
|
|
v2[93].flags = 45;
|
|
oam_tile_size_buffer[368] = 2;
|
|
oam_tile_size_buffer[372] = 2;
|
|
break;
|
|
case 2:
|
|
v3 = get_OamEnt(oam_buf, 0);
|
|
v3[86].xpos = -100;
|
|
v3[86].ypos = -63;
|
|
v3[86].charnum = -60;
|
|
v3[86].flags = 45;
|
|
oam_tile_size_buffer[344] = 2;
|
|
goto LABEL_9;
|
|
case 3:
|
|
LABEL_9:
|
|
v4 = get_OamEnt(oam_buf, 0);
|
|
v4[92].xpos = -120;
|
|
v4[93].xpos = -112;
|
|
v4[92].ypos = -64;
|
|
v4[93].ypos = -64;
|
|
v4[92].charnum = -58;
|
|
v4[93].charnum = -57;
|
|
v4[92].flags = 45;
|
|
v4[93].flags = 45;
|
|
oam_tile_size_buffer[368] = 2;
|
|
oam_tile_size_buffer[372] = 2;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void DrawToadAndRelatedSprites_Func13() {
|
|
uint8 v0; // di
|
|
|
|
sound_ch1 = 15;
|
|
mario_goal_walk_var03ce = 16 * (player_size ^ 1) - 32 + 8;
|
|
v0 = -100;
|
|
R1_ = 11;
|
|
R0_ = 0;
|
|
do
|
|
RomPtr_RAM(*(uint16 *)&R0_)[v0++] = 0;
|
|
while (v0 != 0xBF);
|
|
++cutscene_toad_has_been_initialized_flag;
|
|
--cutscene_toad_var0BA6;
|
|
R0_ = *((uint8 *)kDATA_04FBE4 + (uint8)(2 * world_number));
|
|
R1_ = *((uint8 *)kDATA_04FBE4 + (uint8)(2 * world_number) + 1);
|
|
switch ((uint8)(2 * world_number) >> 1) {
|
|
case 0:
|
|
case 7:
|
|
case 8:
|
|
case 12:
|
|
obj_xpos_lo.enemy[0] -= 4;
|
|
rel_xpos_lo.enemy -= 4;
|
|
cutscene_rustling_bag_animation_frame = 8;
|
|
sound_ch2 = 1;
|
|
obj_yspeed.enemy[0] = -2;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.enemy[0] = 0;
|
|
break;
|
|
case 1:
|
|
obj_xpos_lo.enemy[0] -= 12;
|
|
rel_xpos_lo.enemy -= 12;
|
|
cutscene_rustling_bag_animation_frame = 8;
|
|
sound_ch2 = 1;
|
|
obj_yspeed.enemy[0] = -2;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.enemy[0] = 0;
|
|
break;
|
|
case 2:
|
|
obj_xpos_lo.enemy[0] -= 4;
|
|
rel_xpos_lo.enemy -= 4;
|
|
cutscene_rustling_bag_animation_frame = 8;
|
|
obj_xpos_lo.enemy[3] = 0;
|
|
sound_ch2 = 1;
|
|
obj_yspeed.enemy[0] = -2;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.enemy[0] = 0;
|
|
cutscene_var0BA0 = 0;
|
|
break;
|
|
case 3:
|
|
obj_xpos_lo.enemy[0] -= 4;
|
|
rel_xpos_lo.enemy -= 4;
|
|
cutscene_arr0BB0[0] = rel_xpos_lo.enemy;
|
|
cutscene_arr0BB0[1] = rel_xpos_lo.enemy;
|
|
cutscene_arr0BB0[2] = rel_xpos_lo.enemy;
|
|
cutscene_arr0BB0[3] = rel_xpos_lo.enemy;
|
|
sound_ch2 = 1;
|
|
obj_yspeed.enemy[0] = -2;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.enemy[0] = 0;
|
|
var0E67 = 0;
|
|
break;
|
|
case 4:
|
|
case 9:
|
|
obj_xpos_lo.enemy[0] -= 12;
|
|
obj_ypos_lo.enemy[0] -= 12;
|
|
sound_ch2 = 1;
|
|
cutscene_var0B9E = -2;
|
|
obj_yspeed.enemy[0] = -2;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.enemy[0] = 0;
|
|
break;
|
|
case 5:
|
|
case 10:
|
|
obj_xpos_lo.enemy[0] -= 12;
|
|
sound_ch2 = 1;
|
|
obj_yspeed.enemy[0] = -3;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.enemy[0] = 0;
|
|
break;
|
|
case 6:
|
|
case 11:
|
|
sound_ch1 = 0;
|
|
obj_yspeed.enemy[0] = -2;
|
|
obj_sub_yspeed.enemy[0] = 0;
|
|
obj_sub_ypos.enemy[0] = 0;
|
|
break;
|
|
}
|
|
}
|
|
// 7E021D: using guessed type int8;
|
|
|
|
// local variable allocation has failed, the output may be wrong!
|
|
void DrawToadAndRelatedSprites_Func14(uint8 j, uint16 a) {
|
|
int16 v2; // ax
|
|
OamEnt *oam; // rbp
|
|
|
|
v2 = a - 8 - screen_left_xpos16;
|
|
*(uint16 *)&R1_ = v2;
|
|
oam = get_OamEnt(oam_buf, j);
|
|
oam[64].xpos = v2;
|
|
oam[66].xpos = v2;
|
|
oam[64].flags = 45;
|
|
oam[66].flags = 45;
|
|
LOBYTE(v2) = (HIBYTE(v2) != 0) | 2;
|
|
oam_tile_size_buffer[j + 256] = v2;
|
|
oam_tile_size_buffer[j + 264] = v2;
|
|
}
|
|
// 1B549: variables would overlap: al.1 and ax.2
|
|
|
|
void DrawToadAndRelatedSprites_Func15() {
|
|
if (mario_goal_walk_var03ce >= 0xD0u && (mario_goal_walk_var03ce & 8) != 0) {
|
|
mario_goal_walk_var03ce -= 8;
|
|
cutscene_toad_var0BA6 = 48;
|
|
}
|
|
}
|
|
|
|
void DrawToadAndRelatedSprites_Func16() {
|
|
if ((uint8)layer3_xpos) {
|
|
LOBYTE(layer3_xpos) = layer3_xpos - 1;
|
|
} else if (cutscene_toad_var0BA3 >= 0xC0u) {
|
|
CODE_048600();
|
|
} else if (++cutscene_toad_var0BA3 == 0xC0) {
|
|
DrawToadAndRelatedSprites_Func17();
|
|
}
|
|
}
|
|
|
|
void DrawToadAndRelatedSprites_Func18() {
|
|
if (!cutscene_var0BA4) {
|
|
sound_ch2 = 1;
|
|
cutscene_var0BA4 = 1;
|
|
}
|
|
}
|
|
|
|
void DrawToadAndRelatedSprites_Func17() {
|
|
*(uint16 *)&vram_buffer1[1] = -3750;
|
|
*(uint16 *)&vram_buffer1[3] = 4864;
|
|
*(uint16 *)&vram_buffer1[5] = 25;
|
|
*(uint16 *)&vram_buffer1[7] = 30;
|
|
*(uint16 *)&vram_buffer1[9] = 28;
|
|
*(uint16 *)&vram_buffer1[11] = 17;
|
|
*(uint16 *)&vram_buffer1[13] = 40;
|
|
*(uint16 *)&vram_buffer1[15] = 28;
|
|
*(uint16 *)&vram_buffer1[17] = 29;
|
|
*(uint16 *)&vram_buffer1[19] = 10;
|
|
*(uint16 *)&vram_buffer1[21] = 27;
|
|
*(uint16 *)&vram_buffer1[23] = 29;
|
|
vram_buffer1[25] = -1;
|
|
sound_ch3 = 21;
|
|
}
|
|
|
|
void ResetScrollRegs() {
|
|
layer1_xpos_lo = 0;
|
|
layer1_ypos_lo = 0;
|
|
WriteReg(BG1HOFS, 0);
|
|
WriteReg(BG1HOFS, 0);
|
|
WriteReg(BG1VOFS, 0);
|
|
WriteReg(BG1VOFS, 0);
|
|
WriteReg(BG2HOFS, 0);
|
|
WriteReg(BG2HOFS, 0);
|
|
WriteReg(BG2VOFS, 0);
|
|
WriteReg(BG2VOFS, 0);
|
|
WriteReg(BG3HOFS, 0);
|
|
WriteReg(BG3HOFS, 0);
|
|
WriteReg(BG3VOFS, 0);
|
|
WriteReg(BG3VOFS, 0);
|
|
}
|