smw/smbll/smbll_01.c

1491 lines
40 KiB
C

#include "smbll_consts.h"
#include "smbll_funcs.h"
#include "smbll_rtl.h"
#include "smbll_variables.h"
void Smbll_InitGfxStuff() {
vram_flag_028c = 1;
var0F0B = 3;
vram_flag_028e = 0;
var0E67 = 0;
WriteReg(OBSEL, 3u);
WriteReg(BG1SC, 1u);
WriteReg(BG2SC, 9u);
WriteReg(BG3SC, 0x59u);
WriteReg(BG4SC, 0);
WriteReg(BG12NBA, 0x11u);
WriteReg(BG34NBA, 5u);
WriteReg(SETINI, 0);
game_mode = 0;
game_mode_task = 0;
g_byte_7FFFFF = 0;
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);
bgmode_mirror = 9;
mosaic_mirror = 0;
tm_mirror = 16;
ts_mirror = 0;
w12sel_mirror = 0;
w34sel_mirror = 0;
wobjsel_mirror = 0;
cgwsel_mirror = 0;
cgadsub_mirror = 32;
coldata1_mirror = 32;
coldata2_mirror = 64;
coldata3_mirror = 0x80;
hdmaenable_mirror = 0;
inidisp_mirror = 0x80;
wait_for_vblank = 0;
global_frame_advance_debug_active_flag = 0;
fade_direction = 0;
display_pause_menu_flag = 0;
sprite0_hit_detect_flag = 0x80;
var0E67 = 0;
obj_yspeed.bubble[0] = 0;
render_graphics_var0EC9 = 0;
game_loop_toggler = 0;
vblank_upload_from_7f0000_flag = 0;
vblank_flag_0ED4 = 0;
update_entire_palette_flag = 0;
vram_buffer_addr_ctrl = 0;
vram_flag_028d = 0;
palette_mirror[0] = 0;
palette_mirror[128] = 0;
*(uint16 *)&vram_buffer1[2] = -1;
upload_buffer_3[1] = -1;
layer3_tilemap_upload_buf[1] = -1;
WriteReg(VMAIN, 0x80u);
WriteRegWord(VMADDL, 0x1000u);
WriteRegWord(DMAP0, 0x1801u);
WriteRegWord(A1T0L, 0x8000u);
WriteReg(A1B0, 3u);
WriteRegWord(DAS0L, 0x4000u);
WriteReg(MDMAEN, 1u);
WriteRegWord(VMADDL, 0x6000u);
WriteRegWord(A1T0L, 0x8000u);
WriteReg(A1B0, 4u);
WriteRegWord(DAS0L, 0x4000u);
WriteReg(MDMAEN, 1u);
WriteRegWord(VMADDL, 0x5000u);
WriteRegWord(A1T0L, 0xB000u);
WriteReg(A1B0, 9u);
WriteRegWord(DAS0L, 0x800u);
WriteReg(MDMAEN, 1u);
}
void Smbll_CODE_048600() {
if ((cutscene_var1680 & 0x80u) == 0) {
if (!cutscene_var1680) {
if ((controller_press1p1 & 0x10) == 0)
return;
++cutscene_var1680;
sound_ch1 = 67;
}
--cutscene_hdma_varB9A;
if ((--cutscene_hdma_varB9A & 0x80u) != 0) {
game_mode_task = 13;
player_hard_mode_flag = 1;
}
}
}
void Smbll_CODE_04862A() {
Smbll_PauseMenu_Func6();
if (world_number < 8u) {
cutscene_var1680 = 16;
area_number = 0;
level_number = 0;
if (smbll_varF2B) {
title_screen_hard_mode_flag = 1;
++world_number;
}
++world_number;
}
w12sel_mirror = 34;
w34sel_mirror = 2;
++game_mode_task;
if (number_of_players) {
tsw_mirror = 2;
display_pause_menu_flag = 0;
cutscene_var1680 = 4;
}
}
void Smbll_WaitForMusicAndChangeTask() {
if (!ReadReg(APUI00)) {
game_mode_task = 10;
cutscene_var1680 |= 0x80u;
}
}
void Smbll_CutsceneHdma() {
uint16 v0; // si
uint8 v1; // di
int8 v2; // di
int16 v3; // ax
uint16 v4; // ax
uint16 v5; // ax
if (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 * 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) < *(uint16 *)&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) {
++cutscene_hdma_varB9A;
return;
}
}
v1 = 0;
goto LABEL_10;
}
}
void Smbll_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] = 102;
level_data_map16_hi[113] = 102;
level_data_map16_hi[114] = 102;
level_data_map16_hi[163] = 102;
level_data_map16_hi[164] = 102;
level_data_map16_hi[165] = 102;
level_data_map16_hi[166] = 102;
level_data_map16_hi[121] = 102;
level_data_map16_hi[122] = 102;
level_data_map16_hi[123] = 102;
level_data_map16_hi[124] = 102;
level_data_map16_hi[125] = 102;
level_data_map16_hi[126] = 102;
render_graphics_var0EC9 = 1;
}
void Smbll_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 Smbll_CODE_048B49() {
Smbll_CODE_048B59();
}
void Smbll_SMB3_BufferLayer3Tilemap() {
if (enable_layer3_bgflag) {
Smbll_CODE_048C77();
Smbll_CODE_048B59();
}
}
void Smbll_CODE_048B59() {
game_loop_toggler &= 0x80u;
if (area_type) {
if (area_type != 1)
return;
Smbll_SMB3_BufferLayer3CloudTilemap();
vblank_flag_0ED4 = 1;
} else {
Smbll_BufferAnimatedWaterSurfaceTiles();
vram_buffer_addr_ctrl = 6;
}
vblank_enable_vtimel_flag = 1;
}
void Smbll_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] = kword_1BB40[v3];
layer3_tilemap_upload_buf[v4 + 3] = kword_1BB40[v3 + 1];
layer3_tilemap_upload_buf[v4 + 31] = kword_1BB40[v3 + 2];
layer3_tilemap_upload_buf[v4 + 32] = kword_1BB40[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 Smbll_BufferAnimatedWaterSurfaceTiles() {
uint16 v0; // ax
int v1; // rbp
uint16 v2; // ax
uint16 v3; // di
v0 = *(uint16 *)&tempF3;
v1 = vram_buffer2[0] >> 1;
vram_buffer2[v1 + 1] = *(uint16 *)&tempF3;
v0 += 256;
vram_buffer2[v1 + 4] = v0;
*(uint16 *)&tempF3 = v0 + 256;
vram_buffer2[v1 + 2] = 256;
vram_buffer2[v1 + 5] = 256;
if ((*(uint16 *)&tempF3 & 0x200) != 0) {
v2 = 11310;
v3 = 11311;
} else {
v2 = 11308;
v3 = 11309;
}
vram_buffer2[v1 + 3] = v2;
vram_buffer2[v1 + 6] = v3;
vram_buffer2[v1 + 7] = -1;
vram_buffer2[0] += 12;
}
void Smbll_CODE_048C77() {
int16 v0; // ax
LOBYTE(v0) = (uint16)(layer3_xpos + 288) >> 8;
HIBYTE(v0) = layer3_xpos + 32;
*(uint16 *)&tempF3 = v0;
Smbll_CODE_048C85();
}
void Smbll_CODE_048C85() {
uint8 v0; // al
if ((tempF3 & 1) != 0)
v0 = 92;
else
v0 = 88;
tempF3 = v0;
tempF4 = (tempF4 >> 3) + 0x80;
}
void Smbll_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 = koff_1874C[(uint8)((2 * (render_graphics_var0EE6 & 1)) & 2) >> 1];
v0 = *(uint16 *)vram_buffer1;
v1 = 0;
do {
v2 = IndirPtr(*(LongPtr *)&tempF3, v1);
v3 = *(uint16 *)v2;
*(uint16 *)&vram_buffer1[v0 + 2] = *(uint16 *)v2;
v1 += 2;
v0 += 2;
} while (v3 != -1);
v4 = *(uint16 *)vram_buffer1;
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 + 2] = 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 + 14] = v7;
v8 = v6 + 1;
LOBYTE(v7) = HIBYTE(v8);
HIBYTE(v7) = v8;
*(uint16 *)&vram_buffer1[v4 + 26] = v7;
*(uint16 *)vram_buffer1 += 36;
render_graphics_var0EE6 = 0;
vram_buffer_addr_ctrl = 6;
}
void Smbll_CODE_048D71() {
int16 v0; // ax
uint8 v1; // si
int16 v2; // ax
int v3; // edx
int16 v4; // ax
int v5; // edx
v0 = *(uint16 *)&vram_buffer1[LOBYTE(vram_buffer2[0]) + 760];
if (v0 == 36 || v0 == 4260) {
if ((uint8)render_area_gfx_0ECE)
return;
++render_area_gfx_0ECE;
v1 = vram_buffer1[0];
LOBYTE(v2) = (uint16)(((render_graphics_var0ecc - 1) & 0x41F) + 832) >> 8;
HIBYTE(v2) = ((render_graphics_var0ecc - 1) & 0x1F) + 64;
v3 = vram_buffer1[0];
*(uint16 *)&vram_buffer1[vram_buffer1[0] + 2] = v2;
*(uint16 *)&vram_buffer1[v3 + 4] = 1920;
*(uint16 *)&vram_buffer1[v1 + 6] = 2573;
*(uint16 *)&vram_buffer1[v1 + 8] = 2589;
*(uint16 *)&vram_buffer1[v1 + 10] = 2575;
*(uint16 *)&vram_buffer1[v1 + 12] = 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[0];
LOBYTE(v4) = (uint16)(render_graphics_var0ecc + 832) >> 8;
HIBYTE(v4) = render_graphics_var0ecc + 64;
v5 = vram_buffer1[0];
*(uint16 *)&vram_buffer1[vram_buffer1[0] + 2] = v4;
*(uint16 *)&vram_buffer1[v5 + 4] = 1920;
*(uint16 *)&vram_buffer1[v1 + 6] = 2572;
*(uint16 *)&vram_buffer1[v1 + 8] = 2588;
*(uint16 *)&vram_buffer1[v1 + 10] = 2574;
*(uint16 *)&vram_buffer1[v1 + 12] = 2590;
LABEL_10:
*(uint16 *)&vram_buffer1[v1 + 14] = -1;
*(uint16 *)vram_buffer1 = v1 + 12;
}
}
}
}
void Smbll_ExtObj09_PulleyRope(uint8 k) {
uint8 v1; // di
uint8 v2 = Smbll_ChkLrgObjLength(k) >> 8;
v1 = 0;
if (!v2) {
v1 = 1;
if (!area_object_length[k])
v1 = 2;
}
metatile_buffer[0] = kPulleyRopeMetatiles[v1];
}
void Smbll_DecodeAreaData_Sub2_New(uint16 j) {
uint16 addr; // kr00_2
uint8 *v3; // rdx
uint16 v4; // si
int v5; // r14
uint8 v6; // si
uint8 v7; // di
uint8 v8; // di
uint8 v9; // di
uint8 v10; // si
uint8 v11; // di
uint8 v12; // di
uint8 v13; // di
uint8 v14; // si
uint8 slot; // si
uint8 v16; // al
int8 v17; // al
uint8 v18; // di
uint8 v19; // di
uint8 v20; // al
uint8 v21; // di
bool v22; // sf
uint8 v23; // di
uint8 v24; // di
uint8 v25; // di
uint8 v26; // di
uint8 v27; // di
uint8 i; // di
uint8 v29; // di
uint8 v30; // di
uint8 v31; // di
uint8 v32; // di
uint8 v33; // di
uint8 v34; // di
uint8 v35; // di
uint8 v36; // di
uint8 v37; // al
uint8 v38; // di
uint8 v39; // di
uint8 v40; // al
uint8 v41; // di
uint8 v42; // di
uint8 v43; // di
uint8 v44; // si
uint8 v45; // di
uint8 v46; // di
uint8 v47; // [rsp+46h] [rbp-2h]
uint8 v48; // [rsp+46h] [rbp-2h]
uint8 xpos; // [rsp+46h] [rbp-2h]
uint8 v50; // [rsp+46h] [rbp-2h]
uint8 t0;
addr = area_data_ptr.addr;
tempF4 = HIBYTE(addr);
tempF3 = addr;
tempF5 = area_data_ptr.bank;
v3 = IndirPtr(*(LongPtr *)&tempF3, j + 2);
v4 = *v3 & 0x7F;
v5 = (int)(uint8)v4 >> 1;
R0_ = *((uint8 *)koff_188C1 + (*v3 & 0x7F));
R1_ = *((uint8 *)koff_188C1 + v4 + 1);
v6 = object_index;
switch ((int8)v5) {
case 0:
v10 = 0;
v11 = 15;
goto LABEL_10;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 10:
case 13:
case 14:
case 15:
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:
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 57:
case 58:
case 59:
case 60:
case 61:
case 62:
case 63: return;
case 8:
v47 = object_index;
Smbll_RenderUnderPart_Far(1u, 0xFu, 0x44u);
v11 = Smbll_CODE_0491C0(v47);
v10 = 1;
LABEL_10:
Smbll_RenderUnderPart_Far(v10, v11, 0x40u);
return;
case 9:
v7 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v7);
metatile_buffer[R7_] = 0;
return;
case 11:
v8 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v8);
metatile_buffer[R7_] = 96;
return;
case 12:
v9 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v9);
metatile_buffer[R7_] = 97;
return;
case 16:
v12 = Smbll_CODE_0491C0(object_index);
R7_ = v12;
render_graphics_var0EE7 = 0;
if (!v12)
v12 = 8;
Smbll_ChkLrgObjFixedLength(v6, v12 + 1);
v48 = v6;
v13 = area_object_length[v6];
v14 = R7_;
R6_ = 22;
do {
metatile_buffer[v14++] = kbyte_189AF[v13];
if (R6_) {
v13 += 10;
--R6_;
}
} while (v14 != 11);
if (R7_ && !area_object_length[v48])
metatile_buffer[10] = 0;
if (column_pos_hi) {
if (area_object_length[v48] == 5) {
xpos = Smbll_GetAreaObjXPosition_Far();
slot = Smbll_FindEmptyEnemySlot_Far();
obj_xpos_lo.enemy[slot] = xpos + 8;
obj_xpos_hi.enemy[slot] = __CFADD__(xpos, 8) + column_pos_hi;
obj_ypos_hi.enemy[slot] = 1;
enemy_flag[slot] = 1;
obj_ypos_lo.enemy[slot] = -112;
enemy_id[slot] = 49;
++render_graphics_var0EE7;
if (R7_)
++render_graphics_var0EE7;
}
}
if (column_pos_hi) {
switch (metatile_buffer[11]) {
case 'N': v16 = -4; break;
case '"': v16 = 36; break;
case 'p':
v16 = 115;
metatile_buffer[12] = 115;
break;
case 'f': v16 = 105; break;
default: v16 = 116; break;
}
metatile_buffer[11] = v16;
}
return;
case 17: v17 = 6; goto LABEL_39;
case 18: v17 = 7; goto LABEL_39;
case 19:
v17 = 9;
LABEL_39:
v50 = v17;
v18 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v18);
metatile_buffer[v50] = 7;
return;
case 20:
v19 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v19);
tempF3 = metatile_buffer[0];
if (metatile_buffer[0] == 99)
v20 = metatile_buffer[0] + 1;
else
v20 = metatile_buffer[0] - 1;
tempF4 = v20;
v21 = R7_;
if ((R7_ & 1) != 0)
goto LABEL_44;
while (1) {
metatile_buffer[v21] = tempF3;
v22 = (--area_object_length[v6] & 0x80u) != 0;
if (v22)
break;
++v21;
LABEL_44:
metatile_buffer[v21] = tempF4;
v22 = (--area_object_length[v6] & 0x80u) != 0;
if (v22)
break;
++v21;
}
return;
case 24:
v23 = Smbll_CODE_0491C0(object_index);
t0 = area_object_length[v6];
Smbll_ChkLrgObjFixedLength(v6, v23);
if (t0 & 0x80)
decode_area_data_var0734 = 9;
--decode_area_data_var0734;
Smbll_RenderUnderPart_Far(kbyte_18B24[decode_area_data_var0734], kbyte_18B1B[decode_area_data_var0734], 0x62u);
return;
case 25:
v24 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v24);
v25 = R7_;
if (area_object_length[v6]) {
if (metatile_buffer[R7_])
goto LABEL_59;
metatile_buffer[R7_] = -10;
} else {
metatile_buffer[R7_] = -12;
if (!metatile_buffer[++v25])
metatile_buffer[v25++] = -11;
}
do {
if (!metatile_buffer[v25])
metatile_buffer[v25] = -9;
LABEL_59:
++v25;
} while (v25 != 13);
return;
case 26:
v26 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v26);
v27 = R7_;
metatile_buffer[R7_] = 101;
for (i = v27 + 2; metatile_buffer[i] == 99 || metatile_buffer[i] == 100; i += 2)
metatile_buffer[i] = 101;
return;
case 27:
v29 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v29);
v30 = R7_;
metatile_buffer[R7_] = -8;
v31 = v30 + 1;
do {
if (metatile_buffer[v31] == 0xEC)
break;
metatile_buffer[v31++] = -7;
} while (v31 != 13);
return;
case 28:
v32 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v32);
v33 = R7_;
if (metatile_buffer[R7_] != 0xFD)
metatile_buffer[R7_] = -6;
v34 = v33 + 1;
do {
if (metatile_buffer[v34] == 0xF1)
break;
metatile_buffer[v34++] = -5;
} while (v34 != 13);
return;
case 29:
v35 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v35);
v36 = R7_;
if (area_object_length[v6]) {
if (metatile_buffer[R7_] == 102)
v37 = -17;
else
v37 = -20;
metatile_buffer[R7_] = v37;
metatile_buffer[v36 + 1] = -19;
metatile_buffer[12] = 103;
} else {
if (metatile_buffer[R7_] != 104)
metatile_buffer[R7_] = 2;
metatile_buffer[v36 + 1] = -18;
}
return;
case 30:
v38 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v38);
v39 = R7_;
if (area_object_length[v6]) {
if (metatile_buffer[R7_] != 104)
metatile_buffer[R7_] = 3;
metatile_buffer[v39 + 1] = -16;
} else {
if (metatile_buffer[R7_] == 102) {
v40 = -13;
} else {
v41 = R7_ + 2;
do
metatile_buffer[v41++] = 103;
while (v41 != 13);
v39 = R7_;
v40 = -15;
}
metatile_buffer[v39] = v40;
metatile_buffer[v39 + 1] = -14;
}
return;
case 31:
v42 = Smbll_CODE_0491C0(object_index);
Smbll_ChkLrgObjFixedLength(v6, v42);
v43 = R7_;
do {
metatile_buffer[v43++] = 112;
v22 = (--area_object_length[v6] & 0x80u) != 0;
} while (!v22);
return;
case 32:
Smbll_ChkLrgObjFixedLength(object_index, 3u);
R5_ = Smbll_CODE_0491C0(v6) - 2;
R6_ = area_object_length[v6];
v44 = R5_ + 1;
if (kbyte_18C96[R6_]) {
v44 = Smbll_RenderUnderPart_Far(0, R5_, kbyte_18C96[R6_]);
}
v45 = R6_;
metatile_buffer[v44] = kbyte_18C9A[R6_];
metatile_buffer[v44 + 1] = kbyte_18C9E[v45];
return;
case 40:
v46 = Smbll_CODE_0491C0(object_index);
Smbll_RenderUnderPart_Far(2u, v46, 0x78u);
return;
case 48: Smbll_sub_AAC0(v6, 1); goto lbl_56;
case 56:
Smbll_sub_AAC0(v6, 4);
lbl_56:
metatile_buffer[v6] = 28;
if (*(&block_buffer_column_pos + v6) == 27)
++metatile_buffer[v6];
return;
}
}
uint8 Smbll_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 Smbll_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[0];
if (current_player) {
while (1) {
v2 = kGameOverScreenStripeImage_Luigi[v0 >> 1];
vram_buffer2[(v1 >> 1) + 1] = v2;
if (v2 == 0xFFFF)
break;
v0 += 2;
v1 += 2;
}
} else {
while (1) {
v3 = kGameOverScreenStripeImage[v0 >> 1];
vram_buffer2[(v1 >> 1) + 1] = v3;
if (v3 == 0xFFFF)
break;
v0 += 2;
v1 += 2;
}
}
for (i = 0;; i += 2) {
v5 = kGameOverScreenStripeImage_TitleLogo[i >> 1];
vram_buffer2[(v1 >> 1) + 1] = v5;
if (v5 == 0xFFFF)
break;
v1 += 2;
}
vram_buffer2[0] = v1;
*(uint16 *)&R2_ = -19366;
v6 = Smbll_CODE_049724(0xA0u, 0);
v7 = Smbll_CODE_049724(v6.first, v6.second);
result = Smbll_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;
update_entire_palette_flag = 1;
Smbll_HandleTilesetGraphicsUploads();
override_player_xpos2_flag = -1;
smbll_varF26 = 0;
layer2_ypos = 0;
WriteReg(BG2VOFS, 0);
WriteReg(BG2VOFS, 0);
return result;
}
void Smbll_sub_18F08() {
smbll_varF26 = kbyte_18E0A[area_data_addr_index];
}
void Smbll_CODE_0492E7() {
uint16 v0; // di
int v1; // rbp
uint16 v2; // di
uint16 v3; // si
uint16 v4; // ax
uint16 v5; // di
uint16 v6; // si
uint16 v7; // ax
uint16 v8; // si
uint16 v9; // ax
uint16 v10; // si
uint16 v11; // ax
uint8 v12; // al
if (unused_byte_7E0E1A)
unused_byte_7E0E1A = 0;
Smbll_sub_18F08();
music_ch1 = 0x80;
tileset_graphics_type = kbyte_18E52[(uint8)(level_level_preview_image_to_use - 1)] & 0x1F;
disable_screen_flag = 1;
game_loop_toggler = 1;
Smbll_HandleTilesetGraphicsUploads();
area_parser_ctr1 = 0;
tree_ledge_saved_x = 0;
tree_ledge_arr130F[0] = 0;
set_level_music_flag = 0;
vblank_which_layer2_scroll_flag = 0;
render_graphics_var0EC9 = 0;
var0EDB = 0;
cutscene_hdma_varB9A = 0;
cutscene_var1680 = 0;
enable_layer3_bgflag = 0;
Smbll_Dma_CODE_0480EF();
*(uint16 *)&tree_ledge_countdown = 0;
*(uint16 *)&tree_ledge_arr130F[1] = 0;
*(uint16 *)&tree_ledge_arr130F[3] = 0;
v0 = vram_buffer2[0];
v1 = vram_buffer2[0] >> 1;
vram_buffer2[v1 + 1] = -14583;
vram_buffer2[v1 + 2] = 4800;
vram_buffer2[v1 + 3] = 12450;
vram_buffer2[v1 + 4] = -10231;
vram_buffer2[v1 + 5] = 4800;
vram_buffer2[v1 + 6] = 28834;
vram_buffer2[v1 + 7] = -22519;
vram_buffer2[v1 + 8] = 7744;
vram_buffer2[v1 + 9] = 12408;
vram_buffer2[v1 + 10] = 2059;
vram_buffer2[v1 + 11] = 7744;
vram_buffer2[v1 + 12] = -20360;
v2 = v0 + 24;
v3 = 0;
do {
v4 = kLevelPreviewStripeImages[v3 >> 1];
vram_buffer2[(v2 >> 1) + 1] = v4;
v3 += 2;
v2 += 2;
} while (v4 != 0xFFFF);
v5 = v2 - 2;
v6 = koff_18DA2[(uint16)(2 * (uint8)(level_level_preview_image_to_use - 1)) >> 1];
do {
v7 = kLevelPreviewStripeImages_Main[v6 >> 1];
vram_buffer2[(v5 >> 1) + 1] = v7;
v6 += 2;
v5 += 2;
} while (v7 != 0xFFFF);
if (background_color_ctrl_0 == 17) {
v5 -= 2;
v8 = 0;
do {
v9 = kword_1ABA6[v8 >> 1];
vram_buffer2[(v5 >> 1) + 1] = v9;
v8 += 2;
v5 += 2;
} while (v9 != 0xFFFF);
}
if ((background_color_ctrl_0 & 0xF0) != 0 && background_color_ctrl_0 != 22) {
v5 -= 2;
v10 = 0;
do {
v11 = kword_1ABD2[v10 >> 1];
vram_buffer2[(v5 >> 1) + 1] = v11;
v10 += 2;
v5 += 2;
} while (v11 != 0xFFFF);
}
vram_buffer2[0] = v5;
Smbll_CODE_0495E2();
--screen_routine_task;
update_entire_palette_flag = 1;
palette_mirror[0] = 0;
tempEB = player_status;
player_status = 1;
v12 = background_color_ctrl_0 & 0xF0;
if ((background_color_ctrl_0 & 0xF0) != 0)
v12 = 4;
background_color_ctrl = v12;
if (background_color_ctrl_0 == 2)
background_color_ctrl = 3;
if (area_data_addr_index == 8)
background_color_ctrl = 1;
Smbll_GetPlayerColors();
--update_entire_palette_flag;
player_status = tempEB;
background_color_ctrl_0 = 0;
tm_mirror = 23;
vram_buffer_addr_ctrl = 6;
vblank_enable_vtimel_flag = 0;
layer2_ypos = 0;
WriteReg(BG2VOFS, 0);
WriteReg(BG2VOFS, 0);
}
void Smbll_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;
Smbll_SetupLayer2Bg();
Smbll_CODE_049B96();
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
if (obj_yspeed.bubble[0] != 3) {
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
if (vblank_which_layer2_scroll_flag) {
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
Smbll_CODE_049BBC();
}
}
}
void Smbll_CODE_04956B() {
uint8 v0; // al
uint8 v1; // si
Smbll_CODE_0494EA();
layer2_ypos = 0;
if (area_type) {
if (area_type == 1)
LOBYTE(layer2_ypos) = -8;
v0 = 6;
cgwsel_mirror = 6;
v1 = 17;
} else {
WriteRegWord(DMAP2, 0xF42u);
WriteRegWord(A1T2L, 0x9113u);
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) {
if (cloud_type_override) {
vblank_which_layer2_scroll_flag = 0;
} else {
vtimel_mirror = -81;
vblank_enable_vtimel_flag = 1;
}
}
Smbll_CODE_0495E2();
}
void Smbll_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 == 23 || area_data_addr_index == 38) {
override_area_data_addr_index = area_data_addr_index;
if (!world_number || world_number == 4 || world_number == 9) {
area_data_addr_index = 55;
smbll_varF26 = 3;
} else {
area_data_addr_index = 62;
}
}
*(uint16 *)&R6_ = 16 * area_data_addr_index;
*(uint16 *)&R2_ = 0;
do {
v0 = kbyte_1938B[*(uint16 *)&R6_];
++*(uint16 *)&R6_;
v1 = kword_1AC76[(uint16)(2 * v0) >> 1];
v2 = *(uint16 *)&R2_;
*(uint16 *)&R4_ = 7;
do {
v3 = v1 >> 1;
v4 = v2 >> 1;
palette_mirror[v4] = kword_1ACFA[v3];
palette_mirror[v4 + 8] = kword_1AD0A[v3];
v2 += 2;
v1 += 2;
--*(uint16 *)&R4_;
} while (*(int16 *)&R4_ >= 0);
*(uint16 *)&R2_ = v2 + 16;
} while (v2 != 464);
if (*(uint16 *)&tileset_graphics_flag_var2f8 && current_player) {
v5 = 0;
v6 = 224;
do {
palette_mirror[v6 >> 1] = kword_19237[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;
Smbll_CODE_04973C();
if (enable_layer3_bgflag) {
tempF3 = HIBYTE(layer3_xpos);
tempF4 = layer3_xpos;
Smbll_CODE_048C85();
tempF5 = 19;
do {
Smbll_CODE_048B49();
if (tempF4 >= 0xA0u) {
tempF3 ^= 4u;
tempF4 = 0x80;
}
--tempF5;
} while (tempF5);
}
update_entire_palette_flag = 1;
++screen_routine_task;
}
PairU16 Smbll_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 Smbll_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 = kword_1B4BA[*(uint16 *)&tempF8 >> 1];
if (v1 == 0xFFFF)
break;
if ((int16)(v1 + 1) < 0)
*(uint16 *)&tempF3 += 224;
v2 = (uint8)v1;
v3 = __CFSHL__uint16(2 * v1);
HIBYTE(v1) = 0;
*(uint16 *)&tempF6 = v3;
tempF7 = *((uint8 *)kword_1B4BA + (uint16)(*(uint16 *)&tempF8 + 1)) & 0x3F;
while (1) {
IndirWriteByte(*(LongPtr *)&tempF3, v2, tempF7);
if (!tempF6 || (v2 & 0xF0) == 0xD0)
break;
LOBYTE(v1) = v2 + 16;
v2 = v1;
}
++*(uint16 *)&tempF8;
++*(uint16 *)&tempF8;
}
}
void Smbll_GetBackgroundColor_0() {
if (!background_color_ctrl_0) {
++screen_routine_task;
Smbll_GetPlayerColors();
}
}
void Smbll_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 = kword_197FB[(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] = kword_1980B[v6];
palette_mirror[v7 + 248] = kword_1981B[v6];
v4 += 2;
}
++update_entire_palette_flag;
}
}
void Smbll_CODE_049B35() {
uint8 v0; // al
uint8 v1; // al
int8 v2; // al
v0 = HIBYTE(layer2_xpos);
if (HIBYTE(layer2_xpos) == 127)
v0 = smbll_varED0;
else
smbll_varED0 = HIBYTE(layer2_xpos);
tempF3 = v0;
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 ((tempF3 & 1) != 0)
v1 = 16;
else
v1 = 20;
} else if (g_byte_7E0EF6) {
g_byte_7E0EF6 = 0;
v1 = 20;
} else {
v1 = 16;
g_byte_7E0EF6 = 16;
}
R1_ = v1;
v2 = tempF3 & 0xF;
if (!R0_)
++v2;
HIBYTE(g_word_7E0EF7) = 8 * (v2 + 1);
Smbll_CODE_049BBC();
}
void Smbll_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 Smbll_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) & 0x16C0;
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 Smbll_LoadAreaPointer() {
int8 v0; // al
area_pointer = Smbll_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);
obj_yspeed.bubble[0] = area_type;
if (world_number == 7 && area_number == 3)
obj_yspeed.bubble[0] = 3;
}
uint8 Smbll_FindAreaPointer() {
uint8 v0; // di
v0 = world_number;
if (world_number >= 0xDu) {
area_number = 0;
level_number = 0;
v0 = 0;
world_number = 0;
}
return kAreaAddrOffsets[(uint8)(area_number + kWorldAddrOffsets[v0])];
}
uint8 Smbll_sub_1C396(uint8 a) {
if (world_number >= 9u && (area_pointer & 0x60) == 32) {
if (a == 31) {
return 9;
} else if (a == 30) {
return 27;
} else {
a += 29;
}
}
return a;
}
void Smbll_GetAreaDataAddrs() {
int8 v0; // al
uint8 v1; // di
int v3; // edx
uint8 v4; // al
uint8 v5; // al
bool v6; // cf
uint8 v7; // [rsp+46h] [rbp-2h]
uint8 v8; // [rsp+46h] [rbp-2h]
v0 = 4 * (area_pointer & 0x60) + __CFSHL__(area_pointer & 0x60, 1);
area_type = 2 * (2 * v0 + __CFSHL__(2 * (area_pointer & 0x60), 1)) + __CFSHL__(v0, 1);
obj_yspeed.bubble[0] = area_type;
v1 = area_type;
if (world_number == 7 && area_number == 3)
obj_yspeed.bubble[0] = 3;
area_addrs_l_offset = Smbll_sub_1C396(area_pointer & 0x1f);
v3 = (uint8)(area_addrs_l_offset + kbyte_1C4EC[v1]);
LOBYTE(enemy_data_ptr.addr) = kbyte_1C4F0[v3];
HIBYTE(enemy_data_ptr.addr) = kbyte_1C537[v3];
enemy_data_ptr.bank = 1;
area_data_addr_index = area_addrs_l_offset + kbyte_1C57E[area_type];
LOBYTE(area_data_ptr.addr) = kbyte_1C582[area_data_addr_index];
HIBYTE(area_data_ptr.addr) = kbyte_1C5C9[area_data_addr_index];
area_data_ptr.bank = 1;
v7 = *IndirPtr(area_data_ptr, 0);
v4 = v7 & 7;
if ((v7 & 7u) >= 4) {
background_color_ctrl = v7 & 7;
v4 = 0;
}
foreground_scenery = v4;
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;
background_scenery = (uint8)(v8 & 0x30) >> 4;
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;
Smbll_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;
}
void Smbll_UpdateVineAtEntrance_New() {
if (cloud_type_override)
goto LABEL_6;
if (area_data_addr_index == 35) {
if ((uint8)screen_left_xpos16)
return;
goto LABEL_6;
}
if (area_data_addr_index == 34)
LABEL_6:
vine_at_entrance_flag = 1;
}