Skip to content

Commit 10bd729

Browse files
committed
Add boss shuffle
1 parent 13c74ca commit 10bd729

File tree

3 files changed

+96
-3
lines changed

3 files changed

+96
-3
lines changed

worlds/smw/Levels.py

+32
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,38 @@ def __init__(self, name: str, exitAddress: int, roomID: int):
4343
BowserRoom("Room 8", 0x3AAC7, 0xCC),
4444
]
4545

46+
47+
class BossRoom():
48+
name: str
49+
exitAddress: int
50+
exitAddressAlt: int
51+
roomID: int
52+
53+
def __init__(self, name: str, exitAddress: int, roomID: int, exitAddressAlt=None):
54+
self.name = name
55+
self.exitAddress = exitAddress
56+
self.roomID = roomID
57+
self.exitAddressAlt = exitAddressAlt
58+
59+
60+
submap_boss_rooms = [
61+
BossRoom("#1 Lemmy Koopa", 0x311E3, 0xF6), # Submap 0x1F6
62+
BossRoom("#3 Lemmy Koopa", 0x33749, 0xF2), # Submap 0x1F2
63+
BossRoom("Valley Reznor", 0x3A132, 0xDE), # Submap 0x1DE
64+
BossRoom("#7 Larry Koopa", 0x3A026, 0xEB), # Submap 0x1EB
65+
]
66+
67+
ow_boss_rooms = [
68+
BossRoom("#2 Morton Koopa Jr.", 0x3209B, 0xE5), # OW 0x0E5
69+
BossRoom("Vanilla Reznor", 0x33EAB, 0xDF), # OW 0x0DF
70+
BossRoom("#4 Ludwig von Koopa", 0x346EA, 0xD9), # OW 0x0D9
71+
BossRoom("Forest Reznor", 0x3643E, 0xD5, 0x36442), # OW 0x0D5
72+
BossRoom("#5 Roy Koopa", 0x35ABC, 0xCC), # OW 0x0CC
73+
BossRoom("Chocolate Reznor", 0x3705B, 0xE2), # OW 0x0E2
74+
BossRoom("#6 Wendy O. Koopa", 0x38BB5, 0xD3), # OW 0x0D3
75+
]
76+
77+
4678
class SMWPath():
4779
thisEndDirection: int
4880
otherLevelID: int

worlds/smw/Options.py

+17
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,22 @@ class BowserCastleRooms(Choice):
8686
default = 1
8787

8888

89+
class BossShuffle(Choice):
90+
"""
91+
How the rooms of Bowser's Castle Front Door behave
92+
None: Bosses are not shuffled
93+
Simple: Four Reznors and the seven Koopalings are shuffled around
94+
Full: Each boss location gets a fully random boss
95+
Singularity: One or two bosses are chosen and placed at every boss location
96+
"""
97+
display_name = "Boss Shuffle"
98+
option_none = 0
99+
option_simple = 1
100+
option_full = 2
101+
option_singularity = 3
102+
default = 0
103+
104+
89105
class LevelShuffle(Toggle):
90106
"""
91107
Whether levels are shuffled
@@ -240,6 +256,7 @@ class StartingLifeCount(Range):
240256
"bowser_castle_doors": BowserCastleDoors,
241257
"bowser_castle_rooms": BowserCastleRooms,
242258
"level_shuffle": LevelShuffle,
259+
"boss_shuffle": BossShuffle,
243260
"swap_donut_gh_exits": SwapDonutGhostHouseExits,
244261
#"display_sent_item_popups": DisplaySentItemPopups,
245262
"display_received_item_popups": DisplayReceivedItemPopups,

worlds/smw/Rom.py

+47-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Utils
22
from worlds.Files import APDeltaPatch
33
from .Aesthetics import generate_shuffled_header_data
4-
from .Levels import level_info_dict, full_bowser_rooms, standard_bowser_rooms
4+
from .Levels import level_info_dict, full_bowser_rooms, standard_bowser_rooms, submap_boss_rooms, ow_boss_rooms
55
from .Names.TextBox import generate_goal_text, title_text_mapping, generate_text_box
66

77
USHASH = 'cdd3c8c37322978ca8669b34bc89c804'
@@ -743,7 +743,7 @@ def handle_bowser_rooms(rom, world, player):
743743
rom.write_byte(chosen_rooms[len(chosen_rooms)-1].exitAddress, 0xBD)
744744

745745
elif world.bowser_castle_rooms[player] == "random_five_room":
746-
chosen_rooms = world.random.sample(standard_bowser_rooms)
746+
chosen_rooms = world.random.sample(standard_bowser_rooms, 5)
747747

748748
rom.write_byte(0x3A680, chosen_rooms[0].roomID)
749749
rom.write_byte(0x3A684, chosen_rooms[0].roomID)
@@ -779,7 +779,50 @@ def handle_bowser_rooms(rom, world, player):
779779
for i in range(0, len(bowser_rooms_copy) - 1):
780780
rom.write_byte(bowser_rooms_copy[i].exitAddress, bowser_rooms_copy[i+1].roomID)
781781

782-
rom.write_byte(chosen_rooms[len(chosen_rooms)-1].exitAddress, 0xBD)
782+
rom.write_byte(bowser_rooms_copy[len(bowser_rooms_copy)-1].exitAddress, 0xBD)
783+
784+
785+
def handle_boss_shuffle(rom, world, player):
786+
if world.boss_shuffle[player] == "simple":
787+
submap_boss_rooms_copy = submap_boss_rooms.copy()
788+
ow_boss_rooms_copy = ow_boss_rooms.copy()
789+
790+
world.random.shuffle(submap_boss_rooms_copy)
791+
world.random.shuffle(ow_boss_rooms_copy)
792+
793+
for i in range(len(submap_boss_rooms_copy)):
794+
rom.write_byte(submap_boss_rooms[i].exitAddress, submap_boss_rooms_copy[i].roomID)
795+
796+
for i in range(len(ow_boss_rooms_copy)):
797+
rom.write_byte(ow_boss_rooms[i].exitAddress, ow_boss_rooms_copy[i].roomID)
798+
799+
if ow_boss_rooms[i].exitAddressAlt is not None:
800+
rom.write_byte(ow_boss_rooms[i].exitAddressAlt, ow_boss_rooms_copy[i].roomID)
801+
802+
elif world.boss_shuffle[player] == "full":
803+
for i in range(len(submap_boss_rooms)):
804+
chosen_boss = world.random.choice(submap_boss_rooms)
805+
rom.write_byte(submap_boss_rooms[i].exitAddress, chosen_boss.roomID)
806+
807+
for i in range(len(ow_boss_rooms)):
808+
chosen_boss = world.random.choice(ow_boss_rooms)
809+
rom.write_byte(ow_boss_rooms[i].exitAddress, chosen_boss.roomID)
810+
811+
if ow_boss_rooms[i].exitAddressAlt is not None:
812+
rom.write_byte(ow_boss_rooms[i].exitAddressAlt, chosen_boss.roomID)
813+
814+
elif world.boss_shuffle[player] == "singularity":
815+
chosen_submap_boss = world.random.choice(submap_boss_rooms)
816+
chosen_ow_boss = world.random.choice(ow_boss_rooms)
817+
818+
for i in range(len(submap_boss_rooms)):
819+
rom.write_byte(submap_boss_rooms[i].exitAddress, chosen_submap_boss.roomID)
820+
821+
for i in range(len(ow_boss_rooms)):
822+
rom.write_byte(ow_boss_rooms[i].exitAddress, chosen_ow_boss.roomID)
823+
824+
if ow_boss_rooms[i].exitAddressAlt is not None:
825+
rom.write_byte(ow_boss_rooms[i].exitAddressAlt, chosen_ow_boss.roomID)
783826

784827

785828
def patch_rom(world, rom, player, active_level_dict):
@@ -794,6 +837,7 @@ def patch_rom(world, rom, player, active_level_dict):
794837
rom.write_bytes(0x2A5D9, intro_text)
795838

796839
handle_bowser_rooms(rom, world, player)
840+
handle_boss_shuffle(rom, world, player)
797841

798842
# Prevent Title Screen Deaths
799843
rom.write_byte(0x1C6A, 0x80)

0 commit comments

Comments
 (0)