// Rooms definitions #include "ida_types.h" #include "variables.h" #include "sm_rtl.h" #include "funcs.h" static const SpawnHardcodedPlmArgs unk_8F9198 = { 0x3d, 0x0b, 0xbb30 }; static const SpawnHardcodedPlmArgs unk_8F91AD = { 0x10, 0x87, 0xb964 }; static const SpawnHardcodedPlmArgs unk_8F91B6 = { 0x0f, 0x0a, 0xb9ed }; void RoomSetup_AfterSavingAnimals(void) { // 0x8F9194 SpawnHardcodedPlm(&unk_8F9198); earthquake_type = 24; earthquake_timer = -1; } void RoomSetup_AutoDestroyWallAfterEscape(void) { // 0x8F91A9 SpawnHardcodedPlm(&unk_8F91AD); } void RoomSetup_TurnWallIntoShotblocks(void) { // 0x8F91B2 SpawnHardcodedPlm(&unk_8F91B6); } void RoomSetup_ShakeDuringEscape(void) { // 0x8F91BD earthquake_type = 6; earthquake_timer = -1; RoomSetup_ScrollingSkyLand(); } void RoomSetup_ScrollingSkyLand(void) { // 0x8F91C9 FxTypeFunc_20(); } void RoomSetup_ScrollingSkyOcean(void) { // 0x8F91CE RoomSetupAsm_ScrollingSkyOcean(); } void RoomSetup_RunStatueUnlockAnims(void) { // 0x8F91D7 SpawnAnimtiles(addr_kAnimtiles_TourianStatue_Kraid); SpawnAnimtiles(addr_kAnimtiles_TourianStatue_Phantoon); SpawnAnimtiles(addr_kAnimtiles_TourianStatue_Draygon); SpawnAnimtiles(addr_kAnimtiles_TourianStatue_Ridley); } void DoorCode_StartWreckedShipTreadmillWest(void) { // 0x8FB971 SpawnAnimtiles(addr_kAnimtiles_WreckedShipTradmillRight); static const SpawnHardcodedPlmArgs unk_8FB97C = { 0x04, 0x09, 0xb64b }; SpawnHardcodedPlm(&unk_8FB97C); } void DoorCode_Scroll6_Green(void) { // 0x8FB981 scrolls[6] = 2; } void DoorCode_Scroll0_Blue(void) { // 0x8FB98C scrolls[0] = 1; } void DoorCode_Scroll13_Blue(void) { // 0x8FB997 scrolls[19] = 1; } void DoorCode_Scroll_4Blue_8Green(void) { // 0x8FB9A2 scrolls[4] = 0; scrolls[8] = 2; } void DoorCode_Scroll_8toB_Red(void) { // 0x8FB9B3 scrolls[8] = 0; scrolls[9] = 0; scrolls[10] = 0; scrolls[11] = 0; } void DoorCode_Scroll_LotsRed(void) { // 0x8FB9CA scrolls[2] = 0; scrolls[3] = 0; scrolls[4] = 0; scrolls[5] = 0; scrolls[11] = 0; scrolls[12] = 0; scrolls[13] = 0; scrolls[17] = 0; } void DoorCode_Scroll_1_4_Green(void) { // 0x8FB9F1 scrolls[1] = 2; scrolls[4] = 2; } void DoorCode_Scroll_2_Blue(void) { // 0x8FBA00 scrolls[2] = 1; } void DoorCode_Scroll_17_Blue(void) { // 0x8FBA0B scrolls[23] = 1; } void DoorCode_Scroll_4_Blue(void) { // 0x8FBA16 scrolls[4] = 1; } void DoorCode_Scroll_6_Green(void) { // 0x8FBA21 scrolls[6] = 2; } void DoorCode_Scroll_3_Green(void) { // 0x8FBA2C scrolls[3] = 2; } void DoorCode_SetScroll_0(void) { // 0x8FBD07 scrolls[24] = 2; scrolls[28] = 2; } void DoorCode_SetScroll_1(void) { // 0x8FBD16 scrolls[5] = 1; scrolls[6] = 1; } void DoorCode_SetScroll_2(void) { // 0x8FBD25 scrolls[29] = 1; } void DoorCode_SetScroll_3(void) { // 0x8FBD30 scrolls[2] = 2; scrolls[3] = 2; } void DoorCode_SetScroll_4(void) { // 0x8FBD3F scrolls[0] = 0; scrolls[1] = 2; } void DoorCode_SetScroll_5(void) { // 0x8FBD50 scrolls[11] = 2; } void DoorCode_SetScroll_6(void) { // 0x8FBD5B scrolls[28] = 0; scrolls[29] = 1; } void DoorCode_SetScroll_7(void) { // 0x8FBD6C scrolls[4] = 0; } void DoorCode_SetScroll_8(void) { // 0x8FBD77 scrolls[32] = 2; scrolls[36] = 2; scrolls[37] = 2; } void DoorCode_SetScroll_9(void) { // 0x8FBD8A scrolls[2] = 1; } void DoorCode_SetScroll_10(void) { // 0x8FBD95 scrolls[0] = 2; } void DoorCode_SetScroll_11(void) { // 0x8FBDA0 scrolls[6] = 2; scrolls[7] = 2; } void DoorCode_SetScroll_12(void) { // 0x8FBDAF scrolls[1] = 1; scrolls[2] = 0; } void DoorCode_SetScroll_13(void) { // 0x8FBDC0 scrolls[1] = 1; scrolls[3] = 0; } void DoorCode_SetScroll_14(void) { // 0x8FBDD1 scrolls[0] = 0; scrolls[4] = 1; } void DoorCode_SetScroll_15(void) { // 0x8FBDE2 scrolls[2] = 1; scrolls[3] = 1; } void DoorCode_SetScroll_16(void) { // 0x8FBDF1 scrolls[0] = 2; scrolls[1] = 2; } void DoorCode_SetScroll_17(void) { // 0x8FBE00 scrolls[1] = 2; } void DoorCode_SetScroll_18(void) { // 0x8FBE0B scrolls[15] = 2; scrolls[18] = 2; } void DoorCode_SetScroll_19(void) { // 0x8FBE1A scrolls[6] = 2; } void DoorCode_SetScroll_20(void) { // 0x8FBE25 scrolls[0] = 2; scrolls[1] = 1; } void DoorCode_SetScroll_21(void) { // 0x8FBE36 scrolls[2] = 2; } void DoorCode_SetScroll_22(void) { // 0x8FBF9E scrolls[3] = 0; scrolls[4] = 0; scrolls[6] = 1; scrolls[7] = 1; scrolls[8] = 1; } void DoorCode_SetScroll_23(void) { // 0x8FBFBB scrolls[1] = 1; scrolls[2] = 1; scrolls[3] = 1; scrolls[4] = 2; scrolls[6] = 0; } void DoorCode_SetScroll_24(void) { // 0x8FBFDA scrolls[0] = 1; scrolls[1] = 1; } void DoorCode_SetScroll_25(void) { // 0x8FBFE9 scrolls[1] = 0; scrolls[0] = 1; } void DoorCode_SetScroll_26(void) { // 0x8FBFFA scrolls[10] = 2; } void DoorCode_SetScroll_27(void) { // 0x8FC005 scrolls[0] = 1; scrolls[2] = 0; } void DoorCode_SetScroll_28(void) { // 0x8FC016 scrolls[0] = 2; scrolls[2] = 2; } void DoorCode_SetScroll_29(void) { // 0x8FC025 scrolls[6] = 1; scrolls[7] = 1; scrolls[8] = 0; } void DoorCode_SetScroll_30(void) { // 0x8FC03A scrolls[2] = 0; scrolls[3] = 1; } void DoorCode_SetScroll_31(void) { // 0x8FC04B scrolls[7] = 2; } void DoorCode_SetScroll_32(void) { // 0x8FC056 scrolls[1] = 0; scrolls[2] = 1; } void DoorCode_SetScroll_33(void) { // 0x8FC067 scrolls[3] = 0; scrolls[0] = 1; } void DoorCode_SetScroll_34(void) { // 0x8FC078 scrolls[1] = 1; scrolls[4] = 0; } void DoorCode_SetScroll_35(void) { // 0x8FC089 scrolls[0] = 1; scrolls[1] = 0; scrolls[2] = 0; scrolls[3] = 0; } void DoorCode_SetScroll_36(void) { // 0x8FC0A2 scrolls[0] = 2; } void DoorCode_SetScroll_37(void) { // 0x8FC0AD scrolls[0] = 1; scrolls[1] = 1; scrolls[4] = 0; } void DoorCode_SetScroll_38(void) { // 0x8FC0C2 scrolls[0] = 1; scrolls[3] = 0; } void DoorCode_SetScroll_39(void) { // 0x8FC0D3 scrolls[0] = 1; } void DoorCode_SetScroll_40(void) { // 0x8FC0DE scrolls[0] = 1; scrolls[1] = 0; } void DoorCode_SetScroll_41(void) { // 0x8FC0EF scrolls[24] = 1; } void DoorCode_SetScroll_42(void) { // 0x8FC0FA scrolls[3] = 0; scrolls[2] = 1; } void DoorCode_SetScroll_43(void) { // 0x8FC10B scrolls[14] = 0; } void RoomCode_ScrollingSkyLand_(void) { // 0x8FC116 RoomCode_ScrollingSkyLand(); } void RoomCode_ScrollingSkyOcean_(void) { // 0x8FC11B RoomMainAsm_ScrollingSkyOcean(); } void RoomCode_ScrollingSkyLand_Shakes(void) { // 0x8FC120 RoomCode_ScrollingSkyLand(); RoomCode_GenRandomExplodes_Nonblank(); earthquake_timer |= 0x8000u; } void RoomCode_ExplodeShakes(void) { // 0x8FC124 RoomCode_GenRandomExplodes_Nonblank(); earthquake_timer |= 0x8000u; } void RoomCode_GenRandomExplodes_Nonblank(void) { // 0x8FC131 int16 v1; if (!time_is_frozen_flag && (nmi_frame_counter_word & 1) == 0) { uint16 Random = NextRandom(); R18_ = layer1_x_pos + (uint8)Random; R20_ = layer1_y_pos + HIBYTE(Random); uint8 v2 = R20_ >> 4; uint16 prod = Mult8x8(v2, room_width_in_blocks); v1 = R18_ >> 4; if ((level_data[prod + v1] & 0x3FF) != 255) RoomCode_GenRandomExplodes(); } } void RoomCode_GenRandomExplodes_4th(void) { // 0x8FC183 if (!time_is_frozen_flag && (nmi_frame_counter_word & 3) == 0) { uint16 Random = NextRandom(); R18_ = layer1_x_pos + (uint8)Random; R20_ = layer1_y_pos + HIBYTE(Random); RoomCode_GenRandomExplodes(); } } void RoomCode_GenRandomExplodes(void) { // 0x8FC1A9 static const uint8 kRoomCode_GenRandomExplodes_Sprite[8] = { 3, 3, 9, 12, 12, 18, 18, 21 }; static const uint8 kRoomCode_GenRandomExplodes_Sfx[8] = { 0x24, 0, 0, 0x25, 0, 0, 0, 0 }; // Bugfix, X is garbage uint16 v1 = NextRandom() & 0xF; if (v1 < 8u) { uint16 v2 = kRoomCode_GenRandomExplodes_Sfx[v1]; if (v2) QueueSfx2_Max6(v2); } R22_ = kRoomCode_GenRandomExplodes_Sprite[v1 & 7]; R24_ = 0; CreateSpriteAtPos(); } void RoomCode_ScrollRightDachora(void) { // 0x8FC1E6 if (scrolls[11] == 2 && layer1_y_pos < 0x500u && layer1_x_pos < 0x380u) layer1_x_pos += (layer1_x_pos >= 0x380u) + 3; } void RoomCode_8FC8C8(void) { // 0x8FC8C8 SpawnEnemyProjectileWithRoomGfx(addr_kEproj_PrePhantomRoom, 0); } void RoomCode_SetupShaktoolRoomPlm(void) { // 0x8FC8D3 static const SpawnHardcodedPlmArgs unk_8FC8D7 = { 0x00, 0x00, 0xb8eb }; SpawnHardcodedPlm(&unk_8FC8D7); } void RoomCode_SetPauseCodeForDraygon(void) { // 0x8FC8DD mov24(&pause_hook, fnPauseHook_DraygonRoom); mov24(&unpause_hook, fnUnpauseHook_DraygonRoom); } void PauseHook_DraygonRoom(void) { // 0x8FC8F6 irqhandler_next_handler = 4; } void UnpauseHook_DraygonRoom(void) { // 0x8FC8FC if (hdma_object_channels_bitmask[1] == 8) irqhandler_next_handler = 12; } void RoomCode_SetCollectedMap(void) { // 0x8FC90A uint16 v0 = *(uint16 *)&map_station_byte_array[area_index] | 1; *(uint16 *)&map_station_byte_array[area_index] = v0; has_area_map = v0; } void RoomCode_SetZebesTimebombEvent(void) { // 0x8FC91F SetEventHappened(0xEu); earthquake_type = 18; earthquake_timer = -1; } void RoomCode_SetLightHorizRoomShake(void) { // 0x8FC933 earthquake_type = 18; *(uint16 *)&room_main_asm_variables[2] = 18; *(uint16 *)room_main_asm_variables = 0; earthquake_timer = -1; } void RoomCode_SetMediumHorizRoomShake(void) { // 0x8FC946 earthquake_type = 21; earthquake_timer = -1; } void RoomCode_Escape4_SetMediumHorizRoomShake(void) { // 0x8FC953 static const SpawnHardcodedPlmArgs unk_8FC957 = { 0x10, 0x10, 0xb968 }; SpawnHardcodedPlm(&unk_8FC957); earthquake_type = 21; *(uint16 *)&room_main_asm_variables[2] = 21; *(uint16 *)room_main_asm_variables = 0; earthquake_timer = -1; } void RoomCode_SetCeresDoorSolid(void) { // 0x8FC96E static const SpawnHardcodedPlmArgs unk_8FC972 = { 0x0f, 0x26, 0xba48 }; SpawnHardcodedPlm(&unk_8FC972); FxTypeFunc_2C_Haze(); } void RoomCode_CeresColorMathHdma(void) { // 0x8FC976 FxTypeFunc_2C_Haze(); } void RoomCode_CeresColorMathHdma_BgBase(void) { // 0x8FC97B reg_BG12NBA = 102; FxTypeFunc_2C_Haze(); hdma_data_table_in_ceres = 9; } void DoorCode_StartWreckedSkipTreadmill_East(void) { // 0x8FE1D8 SpawnAnimtiles(addr_kAnimtiles_WreckedShipTradmillLeft); static const SpawnHardcodedPlmArgs unk_8FE1E3 = { 0x04, 0x09, 0xb64f }; SpawnHardcodedPlm(&unk_8FE1E3); } void DoorCode_SetScroll_44(void) { // 0x8FE1E8 scrolls[1] = 1; } void DoorCode_SetScroll_45(void) { // 0x8FE1F3 scrolls[0] = 2; } void DoorCode_SetScroll_46(void) { // 0x8FE1FE scrolls[3] = 0; scrolls[4] = 1; } void DoorCode_SetScroll_47(void) { // 0x8FE20F scrolls[41] = 1; } void DoorCode_SetScroll_48(void) { // 0x8FE21A scrolls[40] = 2; scrolls[46] = 2; } void DoorCode_SetScroll_49(void) { // 0x8FE229 scrolls[6] = 0; scrolls[7] = 0; scrolls[8] = 0; scrolls[9] = 0; scrolls[10] = 0; scrolls[11] = 0; } static const SpawnHardcodedPlmArgs unk_8FE28C = { 0x01, 0x00, 0xb8f9 }; static const SpawnHardcodedPlmArgs unk_8FE2B1 = { 0x01, 0x00, 0xb8f9 }; void DoorCode_SetupElevatubeFromSouth(void) { // 0x8FE26C *(uint16 *)&room_main_asm_variables[4] = -256; *(uint16 *)&room_main_asm_variables[2] = 2496; *(uint16 *)&room_main_asm_variables[6] = -32; CallSomeSamusCode(0); SpawnHardcodedPlm(&unk_8FE28C); } void DoorCode_SetupElevatubeFromNorth(void) { // 0x8FE291 *(uint16 *)&room_main_asm_variables[4] = 256; strcpy((char *)&room_main_asm_variables[2], "@"); strcpy((char *)&room_main_asm_variables[6], " "); CallSomeSamusCode(0); SpawnHardcodedPlm(&unk_8FE2B1); } void RoomCode_Elevatube(void) { // 0x8FE2B6 int16 v0; samus_x_pos = 128; samus_x_subpos = 0; R18_ = 0; R20_ = 0; if (*(int16 *)&room_main_asm_variables[4] < 0) --R20_; *(uint16 *)((char *)&R18_ + 1) = *(uint16 *)&room_main_asm_variables[4]; v0 = (__PAIR32__(R20_, R18_) + *(uint32 *)room_main_asm_variables) >> 16; *(uint16 *)room_main_asm_variables += R18_; *(uint16 *)&room_main_asm_variables[2] = v0; uint16 v1 = R18_; R18_ = R20_; R20_ = v1; Samus_MoveDown_NoSolidColl(); if ((uint16)(*(uint16 *)&room_main_asm_variables[6] + *(uint16 *)&room_main_asm_variables[4] + 3616) < 0x1C41u) *(uint16 *)&room_main_asm_variables[4] += *(uint16 *)&room_main_asm_variables[6]; } void DoorCode_ResetElevatubeNorthExit(void) { // 0x8FE301 CallSomeSamusCode(1u); } void DoorCode_ResetElevatubeSouthExit(void) { // 0x8FE309 *(uint16 *)scrolls = 514; CallSomeSamusCode(1u); } void DoorCode_SetScroll_50(void) { // 0x8FE318 scrolls[10] = 0; scrolls[11] = 1; } void UNUSED_DoorCode_SetScroll_51(void) { // 0x8FE329 scrolls[17] = 0; scrolls[16] = 1; } void UNUSED_DoorCode_SetScroll_52(void) { // 0x8FE33A scrolls[4] = 2; } void DoorCode_SetScroll_53(void) { // 0x8FE345 scrolls[0] = 0; scrolls[4] = 1; } void DoorCode_SetScroll_54(void) { // 0x8FE356 scrolls[0] = 0; scrolls[1] = 1; } void DoorCode_SetScroll_55(void) { // 0x8FE367 scrolls[9] = 0; scrolls[10] = 1; } void DoorCode_SetScroll_56(void) { // 0x8FE378 scrolls[0] = 0; scrolls[2] = 0; scrolls[1] = 1; } void DoorCode_SetScroll_57(void) { // 0x8FE38D scrolls[1] = 1; } void DoorCode_SetScroll_58(void) { // 0x8FE398 scrolls[6] = 1; } void DoorCode_SetScroll_59(void) { // 0x8FE3A3 scrolls[4] = 0; } void DoorCode_SetScroll_60(void) { // 0x8FE3AE scrolls[1] = 0; } void DoorCode_SetScroll_61(void) { // 0x8FE3B9 scrolls[4] = 0; scrolls[7] = 0; } void DoorCode_SetScroll_62(void) { // 0x8FE3C8 scrolls[2] = 0; scrolls[1] = 1; } void DoorCode_SetScroll_63(void) { // 0x8FE3D9 scrolls[0] = 2; scrolls[2] = 2; } void DoorCode_SetScroll_64(void) { // 0x8FE4C0 scrolls[0] = 2; scrolls[1] = 2; } void DoorCode_SetScroll_65(void) { // 0x8FE4CF scrolls[24] = 1; scrolls[25] = 0; } void DoorCode_CeresElevatorShaft(void) { // 0x8FE4E0 reg_BGMODE_fake = 7; WriteReg(BGMODE, 7u); reg_M7A = 256; reg_M7D = 256; reg_M7B = 0; reg_M7C = 0; reg_M7X = 128; reg_M7Y = 1008; irq_enable_mode7 = 1; strcpy((char *)room_main_asm_variables, "\""); strcpy((char *)&room_main_asm_variables[2], "<"); } void DoorCode_CeresElevatorShaft_2(void) { // 0x8FE513 reg_BGMODE_fake = 9; irq_enable_mode7 = 0; } void RoomCode_CeresElevatorShaft_(void) { // 0x8FE51F RoomCode_CeresElevatorShaft(); } static const uint16 kRoomCode_SpawnCeresFallingDebris_Tab[16] = { // 0x8FE525 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, 0x110, 0x130, 0x150, 0x170, 0x190, }; void RoomCode_SpawnCeresFallingDebris(void) { if (ceres_status && (-- * (uint16 *)room_main_asm_variables, *(int16 *)room_main_asm_variables < 0)) { strcpy((char *)room_main_asm_variables, "\b"); uint16 v0 = addr_stru_869734; if (random_number & 0x8000) v0 = addr_stru_869742; SpawnEnemyProjectileWithRoomGfx( v0, kRoomCode_SpawnCeresFallingDebris_Tab[random_number & 0xF]); } else { } } void RoomCode_HandleCeresRidleyGetaway(void) { // 0x8FE571 if (ceres_status & 1) HandleCeresRidleyGetawayCutscene(); } void RoomCode_ShakeScreenHorizDiag(void) { // 0x8FE57C uint16 v0; if (*(uint16 *)room_main_asm_variables) { if (!-- * (uint16 *)room_main_asm_variables) { v0 = 18; LABEL_6: earthquake_type = v0; } } else if (NextRandom() < 0x200u) { strcpy((char *)room_main_asm_variables, "*"); v0 = 23; goto LABEL_6; } RoomCode_GenRandomExplodes_4th(); } void RoomCode_ShakeScreenHorizDiagStrong(void) { // 0x8FE5A4 int16 v0; if (*(uint16 *)room_main_asm_variables) { if (!-- * (uint16 *)room_main_asm_variables) { v0 = 21; LABEL_6: *(uint16 *)&room_main_asm_variables[2] = v0; } } else if (NextRandom() < 0x180u) { strcpy((char *)room_main_asm_variables, "*"); v0 = 26; goto LABEL_6; } earthquake_type = *(uint16 *)&room_main_asm_variables[2]; RoomCode_GenRandomExplodes_4th(); } uint16 CallRoomDefStateSelect(uint32 ea, uint16 k) { switch (ea) { case fnRoomDefStateSelect_Finish: return RoomDefStateSelect_Finish(k); case fnRoomDefStateSelect_TourianBoss01: return RoomDefStateSelect_TourianBoss01(k); case fnRoomDefStateSelect_IsEventSet: return RoomDefStateSelect_IsEventSet(k); case fnRoomDefStateSelect_IsBossDead: return RoomDefStateSelect_IsBossDead(k); case fnRoomDefStateSelect_MorphBallMissiles: return RoomDefStateSelect_MorphBallMissiles(k); case fnRoomDefStateSelect_PowerBombs: return RoomDefStateSelect_PowerBombs(k); default: return Unreachable(); } } void HandleRoomDefStateSelect(uint16 k) { // 0x8FE5D2 uint16 v1 = k + 11; do { event_pointer = get_RoomDefStateSelect_E6E5_Finish(v1)->code_ptr; v1 = CallRoomDefStateSelect(event_pointer | 0x8F0000, v1 + 2); } while (v1); } uint16 RoomDefStateSelect_Finish(uint16 k) { // 0x8FE5E6 roomdefroomstate_ptr = k; return 0; } uint16 RoomDefStateSelect_Door(uint16 k) { // 0x8FE5EB uint8 *v1 = RomPtr_8F(k); if (*(uint16 *)v1 == door_def_ptr) return RoomDefStateSelect_Finish(*((uint16 *)v1 + 1)); else return k + 4; } uint16 RoomDefStateSelect_TourianBoss01(uint16 k) { // 0x8FE5FF if (!(CheckBossBitForCurArea(1u) & 1)) return k + 2; uint16 *v1 = (uint16 *)RomPtr_8F(k); return RoomDefStateSelect_Finish(*v1); } uint16 RoomDefStateSelect_IsEventSet(uint16 k) { // 0x8FE612 uint8 *v1 = RomPtr_8F(k); if (CheckEventHappened(*v1)) return RoomDefStateSelect_Finish(*(uint16 *)(v1 + 1)); else return k + 3; } uint16 RoomDefStateSelect_IsBossDead(uint16 k) { // 0x8FE629 uint8 *v1 = RomPtr_8F(k); if (CheckBossBitForCurArea(*v1) & 1) return RoomDefStateSelect_Finish(*(uint16 *)(v1 + 1)); else return k + 3; } uint16 RoomDefStateSelect_MorphBallMissiles(uint16 k) { // 0x8FE652 if ((collected_items & 4) == 0 || !samus_max_missiles) return k + 2; uint16 *v1 = (uint16 *)RomPtr_8F(k); return RoomDefStateSelect_Finish(*v1); } uint16 RoomDefStateSelect_PowerBombs(uint16 k) { // 0x8FE669 if (!samus_max_power_bombs) return k + 2; uint16 *v1 = (uint16 *)RomPtr_8F(k); return RoomDefStateSelect_Finish(*v1); } void CallRoomSetupCode(uint32 ea) { switch (ea) { case fnRoomSetup_AfterSavingAnimals: RoomSetup_AfterSavingAnimals(); return; case fnRoomSetup_AutoDestroyWallAfterEscape: RoomSetup_AutoDestroyWallAfterEscape(); return; case fnRoomSetup_TurnWallIntoShotblocks: RoomSetup_TurnWallIntoShotblocks(); return; case fnRoomSetup_ShakeDuringEscape: RoomSetup_ShakeDuringEscape(); return; case fnRoomSetup_ScrollingSkyLand: RoomSetup_ScrollingSkyLand(); return; case fnRoomSetup_ScrollingSkyOcean: RoomSetup_ScrollingSkyOcean(); return; case fnRoomSetup_RunStatueUnlockAnims: RoomSetup_RunStatueUnlockAnims(); return; case fnRoomCode_8FC8C8: RoomCode_8FC8C8(); return; case fnRoomCode_SetupShaktoolRoomPlm: RoomCode_SetupShaktoolRoomPlm(); return; case fnRoomCode_SetPauseCodeForDraygon: RoomCode_SetPauseCodeForDraygon(); return; case fnRoomCode_SetCollectedMap: RoomCode_SetCollectedMap(); return; case fnnullsub_132: case fnnullsub_133: case fnnullsub_134: case fnnullsub_135: case fnnullsub_136: case fnnullsub_137: case fnnullsub_138: case fnnullsub_139: case fnnullsub_140: case fnnullsub_141: case fnnullsub_142: case fnnullsub_143: case fnnullsub_144: case fnnullsub_145: case fnnullsub_146: case fnnullsub_147: return; case fnRoomCode_SetZebesTimebombEvent: RoomCode_SetZebesTimebombEvent(); return; case fnRoomCode_SetLightHorizRoomShake: RoomCode_SetLightHorizRoomShake(); return; case fnRoomCode_SetMediumHorizRoomShake: RoomCode_SetMediumHorizRoomShake(); return; case fnRoomCode_Escape4_SetMediumHorizRoomShake: RoomCode_Escape4_SetMediumHorizRoomShake(); return; case fnRoomCode_SetCeresDoorSolid: RoomCode_SetCeresDoorSolid(); return; case fnRoomCode_CeresColorMathHdma: RoomCode_CeresColorMathHdma(); return; case fnRoomCode_CeresColorMathHdma_BgBase: RoomCode_CeresColorMathHdma_BgBase(); return; default: Unreachable(); } } void RunRoomSetupCode(void) { // 0x8FE88F RoomDefRoomstate *RoomDefRoomstate; RoomDefRoomstate = get_RoomDefRoomstate(roomdefroomstate_ptr); if (RoomDefRoomstate->room_setup_code) CallRoomSetupCode(RoomDefRoomstate->room_setup_code | 0x8F0000); } void CallDoorDefSetupCode(uint32 ea) { switch (ea) { case fnDoorCode_StartWreckedShipTreadmillWest: DoorCode_StartWreckedShipTreadmillWest(); return; case fnDoorCode_Scroll6_Green: DoorCode_Scroll6_Green(); return; case fnDoorCode_Scroll0_Blue: DoorCode_Scroll0_Blue(); return; case fnDoorCode_Scroll13_Blue: DoorCode_Scroll13_Blue(); return; case fnDoorCode_Scroll_4Blue_8Green: DoorCode_Scroll_4Blue_8Green(); return; case fnDoorCode_Scroll_8toB_Red: DoorCode_Scroll_8toB_Red(); return; case fnDoorCode_Scroll_LotsRed: DoorCode_Scroll_LotsRed(); return; case fnDoorCode_Scroll_1_4_Green: DoorCode_Scroll_1_4_Green(); return; case fnDoorCode_Scroll_2_Blue: DoorCode_Scroll_2_Blue(); return; case fnDoorCode_Scroll_17_Blue: DoorCode_Scroll_17_Blue(); return; case fnDoorCode_Scroll_4_Blue: DoorCode_Scroll_4_Blue(); return; case fnDoorCode_Scroll_6_Green: DoorCode_Scroll_6_Green(); return; case fnDoorCode_Scroll_3_Green: DoorCode_Scroll_3_Green(); return; case fnDoorCode_SetScroll_0: DoorCode_SetScroll_0(); return; case fnDoorCode_SetScroll_1: DoorCode_SetScroll_1(); return; case fnDoorCode_SetScroll_2: DoorCode_SetScroll_2(); return; case fnDoorCode_SetScroll_3: DoorCode_SetScroll_3(); return; case fnDoorCode_SetScroll_4: DoorCode_SetScroll_4(); return; case fnDoorCode_SetScroll_5: DoorCode_SetScroll_5(); return; case fnDoorCode_SetScroll_6: DoorCode_SetScroll_6(); return; case fnDoorCode_SetScroll_7: DoorCode_SetScroll_7(); return; case fnDoorCode_SetScroll_8: DoorCode_SetScroll_8(); return; case fnDoorCode_SetScroll_9: DoorCode_SetScroll_9(); return; case fnDoorCode_SetScroll_10: DoorCode_SetScroll_10(); return; case fnDoorCode_SetScroll_11: DoorCode_SetScroll_11(); return; case fnDoorCode_SetScroll_12: DoorCode_SetScroll_12(); return; case fnDoorCode_SetScroll_13: DoorCode_SetScroll_13(); return; case fnDoorCode_SetScroll_14: DoorCode_SetScroll_14(); return; case fnDoorCode_SetScroll_15: DoorCode_SetScroll_15(); return; case fnDoorCode_SetScroll_16: DoorCode_SetScroll_16(); return; case fnDoorCode_SetScroll_17: DoorCode_SetScroll_17(); return; case fnDoorCode_SetScroll_18: DoorCode_SetScroll_18(); return; case fnDoorCode_SetScroll_19: DoorCode_SetScroll_19(); return; case fnDoorCode_SetScroll_20: DoorCode_SetScroll_20(); return; case fnDoorCode_SetScroll_21: DoorCode_SetScroll_21(); return; case fnDoorCode_SetScroll_22: DoorCode_SetScroll_22(); return; case fnDoorCode_SetScroll_23: DoorCode_SetScroll_23(); return; case fnDoorCode_SetScroll_24: DoorCode_SetScroll_24(); return; case fnDoorCode_SetScroll_25: DoorCode_SetScroll_25(); return; case fnDoorCode_SetScroll_26: DoorCode_SetScroll_26(); return; case fnDoorCode_SetScroll_28: DoorCode_SetScroll_28(); return; case fnDoorCode_SetScroll_29: DoorCode_SetScroll_29(); return; case fnDoorCode_SetScroll_30: DoorCode_SetScroll_30(); return; case fnDoorCode_SetScroll_31: DoorCode_SetScroll_31(); return; case fnDoorCode_SetScroll_32: DoorCode_SetScroll_32(); return; case fnDoorCode_SetScroll_33: DoorCode_SetScroll_33(); return; case fnDoorCode_SetScroll_34: DoorCode_SetScroll_34(); return; case fnDoorCode_SetScroll_35: DoorCode_SetScroll_35(); return; case fnDoorCode_SetScroll_36: DoorCode_SetScroll_36(); return; case fnDoorCode_SetScroll_37: DoorCode_SetScroll_37(); return; case fnDoorCode_SetScroll_38: DoorCode_SetScroll_38(); return; case fnDoorCode_SetScroll_39: DoorCode_SetScroll_39(); return; case fnDoorCode_SetScroll_40: DoorCode_SetScroll_40(); return; case fnDoorCode_SetScroll_41: DoorCode_SetScroll_41(); return; case fnDoorCode_SetScroll_42: DoorCode_SetScroll_42(); return; case fnDoorCode_SetScroll_43: DoorCode_SetScroll_43(); return; case fnDoorCode_StartWreckedSkipTreadmill_East: DoorCode_StartWreckedSkipTreadmill_East(); return; case fnDoorCode_SetScroll_44: DoorCode_SetScroll_44(); return; case fnDoorCode_SetScroll_45: DoorCode_SetScroll_45(); return; case fnDoorCode_SetScroll_46: DoorCode_SetScroll_46(); return; case fnDoorCode_SetScroll_47: DoorCode_SetScroll_47(); return; case fnDoorCode_SetScroll_48: DoorCode_SetScroll_48(); return; case fnDoorCode_SetScroll_49: DoorCode_SetScroll_49(); return; case fnDoorCode_SetupElevatubeFromSouth: DoorCode_SetupElevatubeFromSouth(); return; case fnDoorCode_SetupElevatubeFromNorth: DoorCode_SetupElevatubeFromNorth(); return; case fnDoorCode_ResetElevatubeNorthExit: DoorCode_ResetElevatubeNorthExit(); return; case fnDoorCode_ResetElevatubeSouthExit: DoorCode_ResetElevatubeSouthExit(); return; case fnDoorCode_SetScroll_50: DoorCode_SetScroll_50(); return; case fnDoorCode_SetScroll_53: DoorCode_SetScroll_53(); return; case fnDoorCode_SetScroll_54: DoorCode_SetScroll_54(); return; case fnDoorCode_SetScroll_55: DoorCode_SetScroll_55(); return; case fnDoorCode_SetScroll_56: DoorCode_SetScroll_56(); return; case fnDoorCode_SetScroll_57: DoorCode_SetScroll_57(); return; case fnDoorCode_SetScroll_58: DoorCode_SetScroll_58(); return; case fnDoorCode_SetScroll_59: DoorCode_SetScroll_59(); return; case fnDoorCode_SetScroll_61: DoorCode_SetScroll_61(); return; case fnDoorCode_SetScroll_62: DoorCode_SetScroll_62(); return; case fnDoorCode_SetScroll_63: DoorCode_SetScroll_63(); return; case fnDoorCode_SetScroll_64: DoorCode_SetScroll_64(); return; case fnDoorCode_SetScroll_65: DoorCode_SetScroll_65(); return; case fnDoorCode_CeresElevatorShaft: DoorCode_CeresElevatorShaft(); return; case fnDoorCode_CeresElevatorShaft_2: DoorCode_CeresElevatorShaft_2(); return; default: Unreachable(); } } void RunDoorSetupCode(void) { // 0x8FE8A3 DoorDef *DoorDef; VoidP door_setup_code; DoorDef = get_DoorDef(door_def_ptr); door_setup_code = DoorDef->door_setup_code; if (door_setup_code) { R18_ = DoorDef->door_setup_code; CallDoorDefSetupCode(door_setup_code | 0x8F0000); } } void CallRoomCode(uint32 ea) { switch (ea) { case fnRoomCode_ScrollingSkyLand_: RoomCode_ScrollingSkyLand_(); return; case fnRoomCode_ScrollingSkyOcean_: RoomCode_ScrollingSkyOcean_(); return; case fnRoomCode_ScrollingSkyLand_Shakes: RoomCode_ScrollingSkyLand_Shakes(); return; case fnRoomCode_ExplodeShakes: RoomCode_ExplodeShakes(); return; case fnRoomCode_ScrollRightDachora: RoomCode_ScrollRightDachora(); return; case fnRoomCode_Elevatube: RoomCode_Elevatube(); return; case fnRoomCode_CeresElevatorShaft_: RoomCode_CeresElevatorShaft_(); return; case fnnullsub_148: return; case fnRoomCode_SpawnCeresFallingDebris: RoomCode_SpawnCeresFallingDebris(); return; case fnRoomCode_HandleCeresRidleyGetaway: RoomCode_HandleCeresRidleyGetaway(); return; case fnRoomCode_ShakeScreenHorizDiag: RoomCode_ShakeScreenHorizDiag(); return; case fnRoomCode_GenRandomExplodes_4th_: RoomCode_GenRandomExplodes_4th(); return; case fnRoomCode_ShakeScreenHorizDiagStrong: RoomCode_ShakeScreenHorizDiagStrong(); return; case fnRoomCode_CrocomireShaking: RoomCode_CrocomireShaking(); return; case fnRoomCode_RidleyRoomShaking: RoomCode_RidleyRoomShaking(); return; default: Unreachable(); } } void RunRoomMainCode(void) { // 0x8FE8BD if (room_main_code_ptr) CallRoomCode(room_main_code_ptr | 0x8F0000); } void RoomCode_CrocomireShaking(void) { // 0x8FE8CD uint16 ai_var_D; if ((enemy_data[0].properties & 0x200) == 0) { if (enemy_data[0].ai_var_A == 64) { reg_BG1VOFS = enemy_data[1].ai_var_D + bg1_y_offset + layer1_y_pos; } else if ((enemy_data[0].ai_var_B & 0x400) != 0) { if (sign16(--enemy_data[1].ai_var_D + 7)) { R18_ = 2 * (enemy_data[1].ai_var_D + 7); ai_var_D = enemy_data[1].ai_var_D - R18_; } else { ai_var_D = enemy_data[1].ai_var_D; } R18_ = ai_var_D; reg_BG1VOFS += ai_var_D; reg_BG2VOFS = ai_var_D - 48; } else if (enemy_data[0].ai_var_C == 34 && enemy_data[0].ai_var_D) { --enemy_data[0].ai_var_D; if ((enemy_data[0].ai_var_D & 1) != 0) layer1_x_pos -= 4; else layer1_x_pos += 4; } } } static const int16 kRoomCode_RidleyRoomShaking_X[8] = { 0, 2, 2, 2, 0, -2, -2, -2 }; static const int16 kRoomCode_RidleyRoomShaking_Y[8] = { -2, -2, 0, 2, 2, 2, 0, -2 }; void RoomCode_RidleyRoomShaking(void) { // 0x8FE950 uint16 ai_var_A = enemy_data[4].ai_var_A; if (enemy_data[4].ai_var_A) { --enemy_data[4].ai_var_A; int v1 = ai_var_A - 1; reg_BG1HOFS += kRoomCode_RidleyRoomShaking_X[v1]; reg_BG2HOFS += kRoomCode_RidleyRoomShaking_X[v1]; reg_BG1VOFS += kRoomCode_RidleyRoomShaking_Y[v1]; reg_BG2VOFS += kRoomCode_RidleyRoomShaking_Y[v1]; } }