Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Super Mario 64: Rework logic for 100 Coins #4131

Merged
merged 15 commits into from
Dec 12, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
sm64ex: Rework logic for 100 Coins
josephwhite committed Nov 3, 2024
commit 33692bd61cc904c7662ca885c25aed9ff0769699
75 changes: 28 additions & 47 deletions worlds/sm64ex/Regions.py
Original file line number Diff line number Diff line change
@@ -86,41 +86,34 @@ def create_regions(world: MultiWorld, options: SM64Options, player: int):

regBoB = create_region("Bob-omb Battlefield", player, world)
create_locs(regBoB, "BoB: Big Bob-Omb on the Summit", "BoB: Footrace with Koopa The Quick",
"BoB: Mario Wings to the Sky", "BoB: Behind Chain Chomp's Gate", "BoB: Bob-omb Buddy")
"BoB: Mario Wings to the Sky", "BoB: Behind Chain Chomp's Gate", "BoB: 100 Coins",
"BoB: Bob-omb Buddy")
bob_island = create_subregion(regBoB, "BoB: Island", "BoB: Shoot to the Island in the Sky", "BoB: Find the 8 Red Coins")
regBoB.subregions = [bob_island]
if options.enable_coin_stars:
create_locs(regBoB, "BoB: 100 Coins")

regWhomp = create_region("Whomp's Fortress", player, world)
create_locs(regWhomp, "WF: Chip Off Whomp's Block", "WF: Shoot into the Wild Blue", "WF: Red Coins on the Floating Isle",
"WF: Fall onto the Caged Island", "WF: Blast Away the Wall")
"WF: Fall onto the Caged Island", "WF: Blast Away the Wall", "WF: 100 Coins")
wf_tower = create_subregion(regWhomp, "WF: Tower", "WF: To the Top of the Fortress", "WF: Bob-omb Buddy")
regWhomp.subregions = [wf_tower]
if options.enable_coin_stars:
create_locs(regWhomp, "WF: 100 Coins")

regJRB = create_region("Jolly Roger Bay", player, world)
create_locs(regJRB, "JRB: Plunder in the Sunken Ship", "JRB: Can the Eel Come Out to Play?", "JRB: Treasure of the Ocean Cave",
"JRB: Blast to the Stone Pillar", "JRB: Through the Jet Stream", "JRB: Bob-omb Buddy")
jrb_upper = create_subregion(regJRB, 'JRB: Upper', "JRB: Red Coins on the Ship Afloat")
jrb_upper = create_subregion(regJRB, 'JRB: Upper', "JRB: Red Coins on the Ship Afloat", "JRB: 100 Coins")
regJRB.subregions = [jrb_upper]
if options.enable_coin_stars:
create_locs(jrb_upper, "JRB: 100 Coins")

regCCM = create_region("Cool, Cool Mountain", player, world)
create_default_locs(regCCM, locCCM_table)
if options.enable_coin_stars:
create_locs(regCCM, "CCM: 100 Coins")
create_locs(regCCM, "CCM: 100 Coins")

regBBH = create_region("Big Boo's Haunt", player, world)
create_locs(regBBH, "BBH: Go on a Ghost Hunt", "BBH: Ride Big Boo's Merry-Go-Round",
"BBH: Secret of the Haunted Books", "BBH: Seek the 8 Red Coins")
"BBH: Secret of the Haunted Books", "BBH: Seek the 8 Red Coins",
"BBH: 100 Coins")
bbh_third_floor = create_subregion(regBBH, "BBH: Third Floor", "BBH: Eye to Eye in the Secret Room")
bbh_roof = create_subregion(bbh_third_floor, "BBH: Roof", "BBH: Big Boo's Balcony", "BBH: 1Up Block Top of Mansion")
regBBH.subregions = [bbh_third_floor, bbh_roof]
if options.enable_coin_stars:
create_locs(regBBH, "BBH: 100 Coins")

regPSS = create_region("The Princess's Secret Slide", player, world)
create_default_locs(regPSS, locPSS_table)
@@ -139,35 +132,30 @@ def create_regions(world: MultiWorld, options: SM64Options, player: int):
regHMC = create_region("Hazy Maze Cave", player, world)
create_locs(regHMC, "HMC: Swimming Beast in the Cavern", "HMC: Metal-Head Mario Can Move!",
"HMC: Watch for Rolling Rocks", "HMC: Navigating the Toxic Maze","HMC: 1Up Block Past Rolling Rocks")
hmc_red_coin_area = create_subregion(regHMC, "HMC: Red Coin Area", "HMC: Elevate for 8 Red Coins")
hmc_red_coin_area = create_subregion(regHMC, "HMC: Red Coin Area", "HMC: Elevate for 8 Red Coins", "HMC: 100 Coins")
hmc_pit_islands = create_subregion(regHMC, "HMC: Pit Islands", "HMC: A-Maze-Ing Emergency Exit", "HMC: 1Up Block above Pit")
regHMC.subregions = [hmc_red_coin_area, hmc_pit_islands]
if options.enable_coin_stars:
create_locs(hmc_red_coin_area, "HMC: 100 Coins")

regLLL = create_region("Lethal Lava Land", player, world)
create_locs(regLLL, "LLL: Boil the Big Bully", "LLL: Bully the Bullies",
"LLL: 8-Coin Puzzle with 15 Pieces", "LLL: Red-Hot Log Rolling")
"LLL: 8-Coin Puzzle with 15 Pieces", "LLL: Red-Hot Log Rolling",
"LLL: 100 Coins")
lll_upper_volcano = create_subregion(regLLL, "LLL: Upper Volcano", "LLL: Hot-Foot-It into the Volcano", "LLL: Elevator Tour in the Volcano")
regLLL.subregions = [lll_upper_volcano]
if options.enable_coin_stars:
create_locs(regLLL, "LLL: 100 Coins")

regSSL = create_region("Shifting Sand Land", player, world)
create_locs(regSSL, "SSL: In the Talons of the Big Bird", "SSL: Shining Atop the Pyramid",
"SSL: Free Flying for 8 Red Coins", "SSL: Bob-omb Buddy",
"SSL: Free Flying for 8 Red Coins", "SSL: 100 Coins",
"SSL: Bob-omb Buddy",
"SSL: 1Up Block Outside Pyramid", "SSL: 1Up Block Pyramid Left Path", "SSL: 1Up Block Pyramid Back")
ssl_upper_pyramid = create_subregion(regSSL, "SSL: Upper Pyramid", "SSL: Inside the Ancient Pyramid",
"SSL: Stand Tall on the Four Pillars", "SSL: Pyramid Puzzle")
ssl_upper_pyramid = create_subregion(regSSL, "SSL: Upper Pyramid", "SSL: Inside the Ancient Pyramid", "SSL: Stand Tall on the Four Pillars",
"SSL: Pyramid Puzzle")
regSSL.subregions = [ssl_upper_pyramid]
if options.enable_coin_stars:
create_locs(regSSL, "SSL: 100 Coins")

regDDD = create_region("Dire, Dire Docks", player, world)
create_locs(regDDD, "DDD: Board Bowser's Sub", "DDD: Chests in the Current", "DDD: Through the Jet Stream",
"DDD: The Manta Ray's Reward", "DDD: Collect the Caps...", "DDD: Pole-Jumping for Red Coins")
if options.enable_coin_stars:
create_locs(regDDD, "DDD: 100 Coins")
"DDD: The Manta Ray's Reward", "DDD: Collect the Caps...", "DDD: Pole-Jumping for Red Coins",
"DDD: 100 Coins")

regCotMC = create_region("Cavern of the Metal Cap", player, world)
create_default_locs(regCotMC, locCotMC_table)
@@ -183,26 +171,24 @@ def create_regions(world: MultiWorld, options: SM64Options, player: int):

regSL = create_region("Snowman's Land", player, world)
create_default_locs(regSL, locSL_table)
if options.enable_coin_stars:
create_locs(regSL, "SL: 100 Coins")
create_locs(regSL, "SL: 100 Coins")

regWDW = create_region("Wet-Dry World", player, world)
create_locs(regWDW, "WDW: Express Elevator--Hurry Up!")
wdw_top = create_subregion(regWDW, "WDW: Top", "WDW: Shocking Arrow Lifts!", "WDW: Top o' the Town",
"WDW: Secrets in the Shallows & Sky", "WDW: Bob-omb Buddy")
wdw_downtown = create_subregion(regWDW, "WDW: Downtown", "WDW: Go to Town for Red Coins", "WDW: Quick Race Through Downtown!", "WDW: 1Up Block in Downtown")
"WDW: Secrets in the Shallows & Sky", "WDW: 100 Coins",
"WDW: Bob-omb Buddy")
wdw_downtown = create_subregion(regWDW, "WDW: Downtown", "WDW: Go to Town for Red Coins", "WDW: Quick Race Through Downtown!",
"WDW: 1Up Block in Downtown")
regWDW.subregions = [wdw_top, wdw_downtown]
if options.enable_coin_stars:
create_locs(wdw_top, "WDW: 100 Coins")

regTTM = create_region("Tall, Tall Mountain", player, world)
ttm_middle = create_subregion(regTTM, "TTM: Middle", "TTM: Scary 'Shrooms, Red Coins", "TTM: Blast to the Lonely Mushroom",
"TTM: Bob-omb Buddy", "TTM: 1Up Block on Red Mushroom")
ttm_top = create_subregion(ttm_middle, "TTM: Top", "TTM: Scale the Mountain", "TTM: Mystery of the Monkey Cage",
"TTM: Mysterious Mountainside", "TTM: Breathtaking View from Bridge")
"TTM: Mysterious Mountainside", "TTM: Breathtaking View from Bridge",
"TTM: 100 Coins")
regTTM.subregions = [ttm_middle, ttm_top]
if options.enable_coin_stars:
create_locs(ttm_top, "TTM: 100 Coins")

create_region("Tiny-Huge Island (Huge)", player, world)
create_region("Tiny-Huge Island (Tiny)", player, world)
@@ -211,31 +197,26 @@ def create_regions(world: MultiWorld, options: SM64Options, player: int):
thi_pipes = create_subregion(regTHI, "THI: Pipes", "THI: The Tip Top of the Huge Island", "THI: Pluck the Piranha Flower", "THI: Rematch with Koopa the Quick",
"THI: Five Itty Bitty Secrets", "THI: Wiggler's Red Coins", "THI: Bob-omb Buddy",
"THI: 1Up Block THI Large near Start", "THI: 1Up Block Windy Area")
thi_large_top = create_subregion(thi_pipes, "THI: Large Top", "THI: Make Wiggler Squirm")
thi_large_top = create_subregion(thi_pipes, "THI: Large Top", "THI: Make Wiggler Squirm", "THI: 100 Coins")
regTHI.subregions = [thi_pipes, thi_large_top]
if options.enable_coin_stars:
create_locs(thi_large_top, "THI: 100 Coins")

regFloor3 = create_region("Third Floor", player, world)

regTTC = create_region("Tick Tock Clock", player, world)
create_locs(regTTC, "TTC: Stop Time for Red Coins")
ttc_lower = create_subregion(regTTC, "TTC: Lower", "TTC: Roll into the Cage", "TTC: Get a Hand")
ttc_upper = create_subregion(ttc_lower, "TTC: Upper", "TTC: Timed Jumps on Moving Bars", "TTC: The Pit and the Pendulums")
ttc_top = create_subregion(ttc_upper, "TTC: Top", "TTC: 1Up Block Midway Up", "TTC: Stomp on the Thwomp", "TTC: 1Up Block at the Top")
ttc_top = create_subregion(ttc_upper, "TTC: Top", "TTC: Stomp on the Thwomp", "TTC: 100 Coins",
"TTC: 1Up Block Midway Up", "TTC: 1Up Block at the Top")
regTTC.subregions = [ttc_lower, ttc_upper, ttc_top]
if options.enable_coin_stars:
create_locs(ttc_top, "TTC: 100 Coins")

regRR = create_region("Rainbow Ride", player, world)
create_locs(regRR, "RR: Swingin' in the Breeze", "RR: Tricky Triangles!",
"RR: 1Up Block Top of Red Coin Maze", "RR: 1Up Block Under Fly Guy", "RR: Bob-omb Buddy")
rr_maze = create_subregion(regRR, "RR: Maze", "RR: Coins Amassed in a Maze")
"RR: Bob-omb Buddy", "RR: 1Up Block Top of Red Coin Maze", "RR: 1Up Block Under Fly Guy")
rr_maze = create_subregion(regRR, "RR: Maze", "RR: Coins Amassed in a Maze", "RR: 100 Coins")
rr_cruiser = create_subregion(regRR, "RR: Cruiser", "RR: Cruiser Crossing the Rainbow", "RR: Somewhere Over the Rainbow")
rr_house = create_subregion(regRR, "RR: House", "RR: The Big House in the Sky", "RR: 1Up Block On House in the Sky")
regRR.subregions = [rr_maze, rr_cruiser, rr_house]
if options.enable_coin_stars:
create_locs(rr_maze, "RR: 100 Coins")

regWMotR = create_region("Wing Mario over the Rainbow", player, world)
create_default_locs(regWMotR, locWMotR_table)
23 changes: 11 additions & 12 deletions worlds/sm64ex/Rules.py
Original file line number Diff line number Diff line change
@@ -203,18 +203,17 @@ def set_rules(world, options: SM64Options, player: int, area_connections: dict,
# Bowser in the Sky
rf.assign_rule("BitS: Top", "CL+TJ | CL+SF+LG | MOVELESS & TJ+WK+LG")
# 100 Coin Stars
if options.enable_coin_stars:
rf.assign_rule("BoB: 100 Coins", "CANN & WC | CANNLESS & WC & TJ")
rf.assign_rule("WF: 100 Coins", "GP | MOVELESS")
rf.assign_rule("JRB: 100 Coins", "GP & {JRB: Upper}")
rf.assign_rule("HMC: 100 Coins", "GP")
rf.assign_rule("SSL: 100 Coins", "{SSL: Upper Pyramid} | GP")
rf.assign_rule("DDD: 100 Coins", "GP & {{DDD: Pole-Jumping for Red Coins}}")
rf.assign_rule("SL: 100 Coins", "VC | CAPLESS")
rf.assign_rule("WDW: 100 Coins", "GP | {WDW: Downtown}")
rf.assign_rule("TTC: 100 Coins", "GP")
rf.assign_rule("THI: 100 Coins", "GP")
rf.assign_rule("RR: 100 Coins", "GP & WK")
rf.assign_rule("BoB: 100 Coins", "CANN & WC | CANNLESS & WC & TJ")
rf.assign_rule("WF: 100 Coins", "GP | MOVELESS")
rf.assign_rule("JRB: 100 Coins", "GP & {JRB: Upper}")
rf.assign_rule("HMC: 100 Coins", "GP")
rf.assign_rule("SSL: 100 Coins", "{SSL: Upper Pyramid} | GP")
rf.assign_rule("DDD: 100 Coins", "GP & {{DDD: Pole-Jumping for Red Coins}}")
rf.assign_rule("SL: 100 Coins", "VC | CAPLESS")
rf.assign_rule("WDW: 100 Coins", "GP | {WDW: Downtown}")
rf.assign_rule("TTC: 100 Coins", "GP")
rf.assign_rule("THI: 100 Coins", "GP")
rf.assign_rule("RR: 100 Coins", "GP & WK")
# Castle Stars
add_rule(world.get_location("Toad (Basement)", player), lambda state: state.can_reach("Basement", 'Region', player) and state.has("Power Star", player, 12))
add_rule(world.get_location("Toad (Second Floor)", player), lambda state: state.can_reach("Second Floor", 'Region', player) and state.has("Power Star", player, 25))
19 changes: 17 additions & 2 deletions worlds/sm64ex/__init__.py
Original file line number Diff line number Diff line change
@@ -48,8 +48,6 @@ class SM64World(World):

def generate_early(self):
max_stars = 120
if (not self.options.enable_coin_stars):
max_stars -= 15
self.move_rando_bitvec = 0
if self.options.enable_move_rando:
for action in self.options.move_rando_actions.value:
@@ -164,6 +162,23 @@ def generate_basic(self):
self.multiworld.get_location("Wing Mario Over the Rainbow 1Up Block", self.player).place_locked_item(self.create_item("1Up Mushroom"))
self.multiworld.get_location("Bowser in the Sky 1Up Block", self.player).place_locked_item(self.create_item("1Up Mushroom"))

if (not self.options.enable_coin_stars):
self.multiworld.get_location("BoB: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("WF: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("JRB: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("CCM: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("BBH: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("HMC: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("LLL: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("SSL: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("DDD: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("SL: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("WDW: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("TTM: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("THI: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("TTC: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))
self.multiworld.get_location("RR: 100 Coins", self.player).place_locked_item(self.create_item("Power Star"))

def get_filler_item_name(self) -> str:
return "1Up Mushroom"