Skip to content

Commit fcaaa19

Browse files
authored
SMW: Fixes for Bowser being defeatable on Egg Hunt and CI2 DC room access (ArchipelagoMW#2981)
1 parent 8f7b63a commit fcaaa19

File tree

2 files changed

+35
-15
lines changed

2 files changed

+35
-15
lines changed

worlds/smw/Client.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,12 @@
6565

6666
SMW_BLOCKSANITY_BLOCK_COUNT = 582
6767

68-
SMW_GOAL_LEVELS = [0x28, 0x31, 0x32]
69-
SMW_INVALID_MARIO_STATES = [0x05, 0x06, 0x0A, 0x0C, 0x0D]
70-
SMW_BAD_TEXT_BOX_LEVELS = [0x00, 0x26, 0x02, 0x4B]
71-
SMW_BOSS_STATES = [0x80, 0xC0, 0xC1]
72-
SMW_UNCOLLECTABLE_LEVELS = [0x25, 0x07, 0x0B, 0x40, 0x0E, 0x1F, 0x20, 0x1B, 0x1A, 0x35, 0x34, 0x31, 0x32]
68+
SMW_GOAL_LEVELS = [0x28, 0x31, 0x32]
69+
SMW_INVALID_MARIO_STATES = [0x05, 0x06, 0x0A, 0x0C, 0x0D]
70+
SMW_BAD_TEXT_BOX_LEVELS = [0x00, 0x26, 0x02, 0x4B]
71+
SMW_BOSS_STATES = [0x80, 0xC0, 0xC1]
72+
SMW_UNCOLLECTABLE_LEVELS = [0x25, 0x07, 0x0B, 0x40, 0x0E, 0x1F, 0x20, 0x1B, 0x1A, 0x35, 0x34, 0x31, 0x32]
73+
SMW_UNCOLLECTABLE_DRAGON_COINS = [0x24]
7374

7475

7576
class SMWSNIClient(SNIClient):
@@ -604,6 +605,8 @@ async def game_watcher(self, ctx):
604605

605606
if level_data[1] == 2:
606607
# Dragon Coins Check
608+
if level_data[0] in SMW_UNCOLLECTABLE_DRAGON_COINS:
609+
continue
607610

608611
progress_byte = (level_data[0] // 8)
609612
progress_bit = 7 - (level_data[0] % 8)

worlds/smw/Rom.py

+27-10
Original file line numberDiff line numberDiff line change
@@ -587,18 +587,17 @@ def handle_yoshi_box(rom):
587587

588588
def handle_bowser_damage(rom):
589589

590-
rom.write_bytes(0x1A509, bytearray([0x20, 0x50, 0xBC])) # JSR $03BC50
590+
rom.write_bytes(0x1A509, bytearray([0x5C, 0x50, 0xBC, 0x03])) # JML $03BC50
591591

592592
BOWSER_BALLS_SUB_ADDR = 0x01BC50
593-
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
594-
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x01, bytearray([0xAD, 0x48, 0x0F])) # LDA $F48
595-
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x04, bytearray([0xCF, 0xA1, 0xBF, 0x03])) # CMP $03BFA1
596-
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x08, bytearray([0x90, 0x06])) # BCC +0x06
597-
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0A, bytearray([0x28])) # PLP
598-
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0B, bytearray([0xEE, 0xB8, 0x14])) # INC $14B8
599-
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0E, bytearray([0x80, 0x01])) # BRA +0x01
600-
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x10, bytearray([0x28])) # PLP
601-
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x11, bytearray([0x60])) # RTS
593+
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0000, bytearray([0xAF, 0xA0, 0xBF, 0x03])) # bowser_infinite_balls: lda.l goal_setting
594+
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0004, bytearray([0xD0, 0x0C])) # bne .nope
595+
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0006, bytearray([0xAD, 0x48, 0x0F])) # lda $0F48
596+
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0009, bytearray([0xCF, 0xA1, 0xBF, 0x03])) # cmp.l required_bosses_setting
597+
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x000D, bytearray([0x90, 0x03])) # bcc .nope
598+
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x000F, bytearray([0xEE, 0xB8, 0x14])) # inc $14B8
599+
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0012, bytearray([0xAD, 0xB8, 0x14])) # .nope lda $14B8
600+
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0015, bytearray([0x5C, 0x0F, 0xA5, 0x03])) # jml $03A50F
602601

603602
return
604603

@@ -2729,6 +2728,22 @@ def handle_uncompressed_player_gfx(rom):
27292728
])
27302729
rom.write_bytes(0x87F80, vram_targets)
27312730

2731+
2732+
def handle_chocolate_island_2(rom):
2733+
FIX_CHOCOISLAND2_ADDR = 0x87200
2734+
rom.write_bytes(0x2DB3E, bytearray([0x5C, 0x00, 0xF2, 0x10])) # jml fix_choco_island_2
2735+
rom.write_bytes(FIX_CHOCOISLAND2_ADDR + 0x0000, bytearray([0xAD, 0x33, 0x1F])) # fix_choco_island_2 lda $1F2F+$04
2736+
rom.write_bytes(FIX_CHOCOISLAND2_ADDR + 0x0003, bytearray([0x29, 0x08])) # and #$08
2737+
rom.write_bytes(FIX_CHOCOISLAND2_ADDR + 0x0005, bytearray([0xD0, 0x0D])) # bne .dc_room
2738+
rom.write_bytes(FIX_CHOCOISLAND2_ADDR + 0x0007, bytearray([0xAD, 0x22, 0x14])) # lda $1422
2739+
rom.write_bytes(FIX_CHOCOISLAND2_ADDR + 0x000A, bytearray([0xC9, 0x04])) # cmp #$04
2740+
rom.write_bytes(FIX_CHOCOISLAND2_ADDR + 0x000C, bytearray([0xF0, 0x06])) # beq .dc_room
2741+
rom.write_bytes(FIX_CHOCOISLAND2_ADDR + 0x000E, bytearray([0xA2, 0x02])) # .rex_room ldx #$02
2742+
rom.write_bytes(FIX_CHOCOISLAND2_ADDR + 0x0010, bytearray([0x5C, 0x49, 0xDB, 0x05])) # jml $05DB49
2743+
rom.write_bytes(FIX_CHOCOISLAND2_ADDR + 0x0014, bytearray([0xA2, 0x00])) # .dc_room ldx #$00
2744+
rom.write_bytes(FIX_CHOCOISLAND2_ADDR + 0x0016, bytearray([0x5C, 0x49, 0xDB, 0x05])) # jml $05DB49
2745+
2746+
27322747
def decompress_gfx(compressed_graphics):
27332748
# This code decompresses graphics in LC_LZ2 format in order to be able to swap player and yoshi's graphics with ease.
27342749
decompressed_gfx = bytearray([])
@@ -3050,6 +3065,8 @@ def patch_rom(world: World, rom, player, active_level_dict):
30503065
rom.write_bytes(0x09C13, bytearray([0x7E, 0x7E, 0x7F, 0x7F]))
30513066
rom.write_byte(0x3F425, 0x32)
30523067

3068+
handle_chocolate_island_2(rom)
3069+
30533070
handle_ability_code(rom)
30543071

30553072
handle_yoshi_box(rom)

0 commit comments

Comments
 (0)