sm64ex: Add option for Bob-omb Buddy Checks

This commit is contained in:
N00byKing 2022-02-15 19:56:10 +01:00 committed by Fabian Dill
parent 219bd9c10e
commit 311fb04647
5 changed files with 68 additions and 14 deletions

View File

@ -3,7 +3,7 @@ from BaseClasses import Item
class SM64Item(Item): class SM64Item(Item):
game: str = "Super Mario 64" game: str = "Super Mario 64"
item_table = { generic_item_table = {
"Power Star": 3626000, "Power Star": 3626000,
"Basement Key": 3626178, "Basement Key": 3626178,
"Second Floor Key": 3626179, "Second Floor Key": 3626179,
@ -12,4 +12,19 @@ item_table = {
"Metal Cap": 3626182, "Metal Cap": 3626182,
"Vanish Cap": 3626183, "Vanish Cap": 3626183,
"1Up Mushroom": 3626184 "1Up Mushroom": 3626184
} }
cannon_item_table = {
"Cannon Unlock BoB": 3626200,
"Cannon Unlock WF": 3626201,
"Cannon Unlock JRB": 3626202,
"Cannon Unlock CCM": 3626203,
"Cannon Unlock SSL": 3626207,
"Cannon Unlock SL": 3626209,
"Cannon Unlock WDW": 3626210,
"Cannon Unlock TTM": 3626211,
"Cannon Unlock THI": 3626212,
"Cannon Unlock RR": 3626214
}
item_table = {**generic_item_table, **cannon_item_table}

View File

@ -10,7 +10,8 @@ locBoB_table = {
"BoB: Shoot to the Island in the Sky": 3626002, "BoB: Shoot to the Island in the Sky": 3626002,
"BoB: Find the 8 Red Coins": 3626003, "BoB: Find the 8 Red Coins": 3626003,
"BoB: Mario Wings to the Sky": 3626004, "BoB: Mario Wings to the Sky": 3626004,
"BoB: Behind Chain Chomp's Gate": 3626005 "BoB: Behind Chain Chomp's Gate": 3626005,
"BoB: Bob-omb Buddy": 3626200,
} }
#Whomp's Fortress #Whomp's Fortress
@ -20,7 +21,8 @@ locWhomp_table = {
"WF: Shoot into the Wild Blue": 3626009, "WF: Shoot into the Wild Blue": 3626009,
"WF: Red Coins on the Floating Isle": 3626010, "WF: Red Coins on the Floating Isle": 3626010,
"WF: Fall onto the Caged Island": 3626011, "WF: Fall onto the Caged Island": 3626011,
"WF: Blast Away the Wall": 3626012 "WF: Blast Away the Wall": 3626012,
"WF: Bob-omb Buddy": 3626201,
} }
#Jolly Roger Bay #Jolly Roger Bay
@ -30,7 +32,8 @@ locJRB_table = {
"JRB: Treasure of the Ocean Cave": 3626016, "JRB: Treasure of the Ocean Cave": 3626016,
"JRB: Red Coins on the Ship Afloat": 3626017, "JRB: Red Coins on the Ship Afloat": 3626017,
"JRB: Blast to the Stone Pillar": 3626018, "JRB: Blast to the Stone Pillar": 3626018,
"JRB: Through the Jet Stream": 3626019 "JRB: Through the Jet Stream": 3626019,
"JRB: Bob-omb Buddy": 3626202,
} }
@ -41,7 +44,8 @@ locCCM_table = {
"CCM: Big Penguin Race": 3626023, "CCM: Big Penguin Race": 3626023,
"CCM: Frosty Slide for 8 Red Coins": 3626024, "CCM: Frosty Slide for 8 Red Coins": 3626024,
"CCM: Snowman's Lost His Head": 3626025, "CCM: Snowman's Lost His Head": 3626025,
"CCM: Wall Kicks Will Work": 3626026 "CCM: Wall Kicks Will Work": 3626026,
"CCM: Bob-omb Buddy": 3626203,
} }
#Big Boo's Haunt #Big Boo's Haunt
@ -81,7 +85,8 @@ locSSL_table = {
"SSL: Inside the Ancient Pyramid": 3626051, "SSL: Inside the Ancient Pyramid": 3626051,
"SSL: Stand Tall on the Four Pillars": 3626052, "SSL: Stand Tall on the Four Pillars": 3626052,
"SSL: Free Flying for 8 Red Coins": 3626053, "SSL: Free Flying for 8 Red Coins": 3626053,
"SSL: Pyramid Puzzle": 3626054 "SSL: Pyramid Puzzle": 3626054,
"SSL: Bob-omb Buddy": 3626207,
} }
#Dire, Dire Docks #Dire, Dire Docks
@ -101,7 +106,8 @@ locSL_table = {
"SL: In the Deep Freeze": 3626065, "SL: In the Deep Freeze": 3626065,
"SL: Whirl from the Freezing Pond": 3626066, "SL: Whirl from the Freezing Pond": 3626066,
"SL: Shell Shreddin' for Red Coins": 3626067, "SL: Shell Shreddin' for Red Coins": 3626067,
"SL: Into the Igloo": 3626068 "SL: Into the Igloo": 3626068,
"SL: Bob-omb Buddy": 3626209,
} }
#Wet-Dry World #Wet-Dry World
@ -111,7 +117,8 @@ locWDW_table = {
"WDW: Secrets in the Shallows & Sky": 3626072, "WDW: Secrets in the Shallows & Sky": 3626072,
"WDW: Express Elevator--Hurry Up!": 3626073, "WDW: Express Elevator--Hurry Up!": 3626073,
"WDW: Go to Town for Red Coins": 3626074, "WDW: Go to Town for Red Coins": 3626074,
"WDW: Quick Race Through Downtown!": 3626075 "WDW: Quick Race Through Downtown!": 3626075,
"WDW: Bob-omb Buddy": 3626210,
} }
#Tall, Tall Mountain #Tall, Tall Mountain
@ -121,7 +128,8 @@ locTTM_table = {
"TTM: Scary 'Shrooms, Red Coins": 3626079, "TTM: Scary 'Shrooms, Red Coins": 3626079,
"TTM: Mysterious Mountainside": 3626080, "TTM: Mysterious Mountainside": 3626080,
"TTM: Breathtaking View from Bridge": 3626081, "TTM: Breathtaking View from Bridge": 3626081,
"TTM: Blast to the Lonely Mushroom": 3626082 "TTM: Blast to the Lonely Mushroom": 3626082,
"TTM: Bob-omb Buddy": 3626211,
} }
#Tiny-Huge Island #Tiny-Huge Island
@ -131,7 +139,8 @@ locTHI_table = {
"THI: Rematch with Koopa the Quick": 3626086, "THI: Rematch with Koopa the Quick": 3626086,
"THI: Five Itty Bitty Secrets": 3626087, "THI: Five Itty Bitty Secrets": 3626087,
"THI: Wiggler's Red Coins": 3626088, "THI: Wiggler's Red Coins": 3626088,
"THI: Make Wiggler Squirm": 3626089 "THI: Make Wiggler Squirm": 3626089,
"THI: Bob-omb Buddy": 3626212,
} }
#Tick Tock Clock #Tick Tock Clock
@ -151,7 +160,8 @@ locRR_table = {
"RR: Coins Amassed in a Maze": 3626100, "RR: Coins Amassed in a Maze": 3626100,
"RR: Swingin' in the Breeze": 3626101, "RR: Swingin' in the Breeze": 3626101,
"RR: Tricky Triangles!": 3626102, "RR: Tricky Triangles!": 3626102,
"RR: Somewhere Over the Rainbow": 3626103 "RR: Somewhere Over the Rainbow": 3626103,
"RR: Bob-omb Buddy": 3626214,
} }
loc100Coin_table = { loc100Coin_table = {

View File

@ -9,6 +9,10 @@ class StrictCapRequirements(DefaultOnToggle):
"""If disabled, Stars that expect special caps may have to be acquired without the caps""" """If disabled, Stars that expect special caps may have to be acquired without the caps"""
display_name = "Strict Cap Requirements" display_name = "Strict Cap Requirements"
class StrictCannonRequirements(DefaultOnToggle):
"""If disabled, Stars that expect cannons may have to be acquired without them. Only makes a difference if Buddy Checks are enabled"""
display_name = "Strict Cannon Requirements"
class StarsToFinish(Range): class StarsToFinish(Range):
"""How many stars are required at the infinite stairs""" """How many stars are required at the infinite stairs"""
range_start = 50 range_start = 50
@ -25,6 +29,10 @@ class AreaRandomizer(Toggle):
"""Randomize Entrances to Courses""" """Randomize Entrances to Courses"""
display_name = "Course Randomizer" display_name = "Course Randomizer"
class BuddyChecks(Toggle):
"""Bob-omb Buddies are checks, Cannon Unlocks are items"""
display_name = "Bob-omb Buddy Checks"
class ProgressiveKeys(DefaultOnToggle): class ProgressiveKeys(DefaultOnToggle):
"""Keys will first grant you access to the Basement, then to the Secound Floor""" """Keys will first grant you access to the Basement, then to the Secound Floor"""
display_name = "Progressive Keys" display_name = "Progressive Keys"
@ -34,7 +42,9 @@ sm64_options: typing.Dict[str,type(Option)] = {
"ProgressiveKeys": ProgressiveKeys, "ProgressiveKeys": ProgressiveKeys,
"EnableCoinStars": EnableCoinStars, "EnableCoinStars": EnableCoinStars,
"StrictCapRequirements": StrictCapRequirements, "StrictCapRequirements": StrictCapRequirements,
"StrictCannonRequirements": StrictCannonRequirements,
"StarsToFinish": StarsToFinish, "StarsToFinish": StarsToFinish,
"ExtraStars": ExtraStars, "ExtraStars": ExtraStars,
"DeathLink": DeathLink, "DeathLink": DeathLink,
"BuddyChecks": BuddyChecks,
} }

View File

@ -54,6 +54,11 @@ def set_rules(world,player,area_connections):
add_rule(world.get_location("SSL: Free Flying for 8 Red Coins", player), lambda state: state.has("Wing Cap", player)) add_rule(world.get_location("SSL: Free Flying for 8 Red Coins", player), lambda state: state.has("Wing Cap", player))
add_rule(world.get_location("DDD: Through the Jet Stream", player), lambda state: state.has("Metal Cap", player)) add_rule(world.get_location("DDD: Through the Jet Stream", player), lambda state: state.has("Metal Cap", player))
add_rule(world.get_location("Vanish Cap Under the Moat Red Coins", player), lambda state: state.has("Vanish Cap", player)) add_rule(world.get_location("Vanish Cap Under the Moat Red Coins", player), lambda state: state.has("Vanish Cap", player))
if (world.StrictCannonRequirements[player].value):
add_rule(world.get_location("BoB: Mario Wings to the Sky", player), lambda state: state.has("Cannon Unlock BoB", player))
add_rule(world.get_location("WF: Blast Away the Wall", player), lambda state: state.has("Cannon Unlock WF", player))
add_rule(world.get_location("JRB: Blast to the Stone Pillar", player), lambda state: state.has("Cannon Unlock JRB", player))
add_rule(world.get_location("RR: Somewhere Over the Rainbow", player), lambda state: state.has("Cannon Unlock RR", player))
#Rules for Secret Stars #Rules for Secret Stars
add_rule(world.get_location("Bowser in the Sky Red Coins", player), lambda state: state.can_reach("Third Floor",'Region',player) and state.has("Power Star", player, world.StarsToFinish[player].value)) add_rule(world.get_location("Bowser in the Sky Red Coins", player), lambda state: state.can_reach("Third Floor",'Region',player) and state.has("Power Star", player, world.StarsToFinish[player].value))

View File

@ -1,5 +1,5 @@
import typing import typing
from .Items import item_table, SM64Item from .Items import item_table, cannon_item_table, SM64Item
from .Locations import location_table, SM64Location from .Locations import location_table, SM64Location
from .Options import sm64_options from .Options import sm64_options
from .Rules import set_rules from .Rules import set_rules
@ -21,7 +21,7 @@ class SM64World(World):
item_name_to_id = item_table item_name_to_id = item_table
location_name_to_id = location_table location_name_to_id = location_table
data_version = 5 data_version = 6
forced_auto_forfeit = False forced_auto_forfeit = False
area_connections: typing.Dict[int, int] area_connections: typing.Dict[int, int]
@ -65,6 +65,20 @@ class SM64World(World):
vanishcap = self.create_item("Vanish Cap") vanishcap = self.create_item("Vanish Cap")
self.world.itempool += [wingcap,metalcap,vanishcap] self.world.itempool += [wingcap,metalcap,vanishcap]
if (self.world.BuddyChecks[self.player].value):
self.world.itempool += [self.create_item(name) for name, id in cannon_item_table.items()]
else:
self.world.get_location("BoB: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock BoB"))
self.world.get_location("WF: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock WF"))
self.world.get_location("JRB: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock JRB"))
self.world.get_location("CCM: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock CCM"))
self.world.get_location("SSL: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock SSL"))
self.world.get_location("SL: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock SL"))
self.world.get_location("WDW: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock WDW"))
self.world.get_location("TTM: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock TTM"))
self.world.get_location("THI: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock THI"))
self.world.get_location("RR: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock RR"))
def fill_slot_data(self): def fill_slot_data(self):
return { return {
"AreaRando": self.area_connections, "AreaRando": self.area_connections,