 dad228cd4a
			
		
	
	dad228cd4a
	
	
	
		
			
			* Clean these functions up, get the hell out of here 5 parameter function * Clean up a bunch of rules that no longer need to be multi-lined since the functions are shorter * Clean up some range functions * Update to use world instead of player like Vi recommended * Fix merge conflict * Create new options * Slightly revise ls rule * Update options.py * Update options.py * Add tedious option for ls * Update laurels zips description * Create new options * Slightly revise ls rule * Update options.py * Update options.py * Add tedious option for ls * Update laurels zips description * Creating structures to redo ladder storage rules * Put together overworld ladder groups, remove tedious * Write up the rules for the regular rules * Update slot data and UT stuff * Put new ice grapple stuff in er rules * Ice grapple hard to get to fountain cross room * More ladder data * Wrote majority of overworld ladder rules * Finish the ladder storage rules * Update notes * Add note * Add well rail to the rules * More rules * Comment out logically irrelevant entrances * Update with laurels_zip helper * Add parameter to has_ice_grapple_logic for difficulty * Add new parameter to has_ice_grapple_logic * Move ice grapple chest to lower forest in ER/ladders * Fix rule * Finishing out hooking the new rules into the code * Fix bugs * Add more hard ice grapples * Fix more bugs * Shops my beloved * Change victory condition back * Remove debug stuff * Update plando connections description * Fix extremely rare bug * Add well front -> back hard ladder storages * Note in ls rules about knocking yourself down with bombs being out of logic * Add atoll fuse with wand + hard ls * Add some nonsense that boils down to activating the fuse in overworld * Further update LS description * Fix missing logic on bridge switch chest in upper zig * Revise upper zig rule change to account for ER * Fix merge conflict * Fix formatting, fix rule for heir access after merge * Add the shop sword logic stuff in * Remove todo that was already done * Fill out a to-do with some cursed nonsense * Fix event in wrong region * Fix missing cathedral -> elevator connection * Fix missing cathedral -> elevator connection * Add ER exception to cathedral -> elevator * Fix secret gathering place issue * Fix incorrect ls rule * Move 3 locations to Quarry Back since they're easily accessible from the back * Also update non-er region * Remove redundant parentheses * Add new test for a weird edge case in ER * Slight option description updates * Use has_ladder in spots where it wasn't used for some reason, add a comment * Fix unit test for ER * Update per exempt's suggestion * Add back LogicRules as an invisible option, to not break old yamls * Remove unused elevation from portal class * Update ladder storage without items description * Remove shop_scene stuff since it's no longer relevant in the mod by the time this version comes out * Remove shop scene stuff from game info since it's no longer relevant in the mod by the time this comes out * Update portal list to match main * god I love github merging things * Remove note * Add ice grapple hard path from upper overworld to temple rafters entrance * Actually that should be medium * Remove outdated note * Add ice grapple hard for swamp mid to the ledge * Add missing laurels zip in swamp * Some fixes to the ladder storage data while reviewing it * Add unit test for weird edge case * Backport outlet region system to fix ls bug * Fix incorrect ls, add todo * Add missing swamp ladder storage connections * Add swamp zip to er data * Add swamp zip to er rules * Add hard ice grapple for forest grave path main to upper * Add ice grapple logic for all bomb walls except the east quarry one * Add ice grapple logic for frog stairs eye to mouth without the ladder * Add hard ice grapple for overworld to the stairs to west garden * Add the ice grapple boss quick kills to medium ice grappling * Add the reverse connection for the ice grapple kill on Garden Knight * Add atoll house ice grapple push, and add west garden ice grapple entry to the regular rules
		
			
				
	
	
		
			307 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			307 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from dataclasses import dataclass
 | |
| from typing import Dict, Any
 | |
| from Options import (DefaultOnToggle, Toggle, StartInventoryPool, Choice, Range, TextChoice, PlandoConnections,
 | |
|                      PerGameCommonOptions, OptionGroup, Visibility)
 | |
| from .er_data import portal_mapping
 | |
| 
 | |
| 
 | |
| class SwordProgression(DefaultOnToggle):
 | |
|     """
 | |
|     Adds four sword upgrades to the item pool that will progressively grant stronger melee weapons, including two new swords with increased range and attack power.
 | |
|     """
 | |
|     internal_name = "sword_progression"
 | |
|     display_name = "Sword Progression"
 | |
| 
 | |
| 
 | |
| class StartWithSword(Toggle):
 | |
|     """
 | |
|     Start with a sword in the player's inventory. Does not count towards Sword Progression.
 | |
|     """
 | |
|     internal_name = "start_with_sword"
 | |
|     display_name = "Start With Sword"
 | |
| 
 | |
| 
 | |
| class KeysBehindBosses(Toggle):
 | |
|     """
 | |
|     Places the three hexagon keys behind their respective boss fight in your world.
 | |
|     """
 | |
|     internal_name = "keys_behind_bosses"
 | |
|     display_name = "Keys Behind Bosses"
 | |
| 
 | |
| 
 | |
| class AbilityShuffling(Toggle):
 | |
|     """
 | |
|     Locks the usage of Prayer, Holy Cross*, and the Icebolt combo until the relevant pages of the manual have been found.
 | |
|     If playing Hexagon Quest, abilities are instead randomly unlocked after obtaining 25%, 50%, and 75% of the required Hexagon goal amount.
 | |
|     * Certain Holy Cross usages are still allowed, such as the free bomb codes, the seeking spell, and other player-facing codes.
 | |
|     """
 | |
|     internal_name = "ability_shuffling"
 | |
|     display_name = "Shuffle Abilities"
 | |
| 
 | |
| 
 | |
| class Lanternless(Toggle):
 | |
|     """
 | |
|     Choose whether you require the Lantern for dark areas.
 | |
|     When enabled, the Lantern is marked as Useful instead of Progression.
 | |
|     """
 | |
|     internal_name = "lanternless"
 | |
|     display_name = "Lanternless"
 | |
| 
 | |
| 
 | |
| class Maskless(Toggle):
 | |
|     """
 | |
|     Choose whether you require the Scavenger's Mask for Lower Quarry.
 | |
|     When enabled, the Scavenger's Mask is marked as Useful instead of Progression.
 | |
|     """
 | |
|     internal_name = "maskless"
 | |
|     display_name = "Maskless"
 | |
| 
 | |
| 
 | |
| class FoolTraps(Choice):
 | |
|     """
 | |
|     Replaces low-to-medium value money rewards in the item pool with fool traps, which cause random negative effects to the player.
 | |
|     """
 | |
|     internal_name = "fool_traps"
 | |
|     display_name = "Fool Traps"
 | |
|     option_off = 0
 | |
|     option_normal = 1
 | |
|     option_double = 2
 | |
|     option_onslaught = 3
 | |
|     default = 1
 | |
| 
 | |
| 
 | |
| class HexagonQuest(Toggle):
 | |
|     """
 | |
|     An alternate goal that shuffles Gold "Questagon" items into the item pool and allows the game to be completed after collecting the required number of them.
 | |
|     """
 | |
|     internal_name = "hexagon_quest"
 | |
|     display_name = "Hexagon Quest"
 | |
| 
 | |
| 
 | |
| class HexagonGoal(Range):
 | |
|     """
 | |
|     How many Gold Questagons are required to complete the game on Hexagon Quest.
 | |
|     """
 | |
|     internal_name = "hexagon_goal"
 | |
|     display_name = "Gold Hexagons Required"
 | |
|     range_start = 15
 | |
|     range_end = 50
 | |
|     default = 20
 | |
| 
 | |
| 
 | |
| class ExtraHexagonPercentage(Range):
 | |
|     """
 | |
|     How many extra Gold Questagons are shuffled into the item pool, taken as a percentage of the goal amount.
 | |
|     """
 | |
|     internal_name = "extra_hexagon_percentage"
 | |
|     display_name = "Percentage of Extra Gold Hexagons"
 | |
|     range_start = 0
 | |
|     range_end = 100
 | |
|     default = 50
 | |
| 
 | |
| 
 | |
| class EntranceRando(TextChoice):
 | |
|     """
 | |
|     Randomize the connections between scenes.
 | |
|     A small, very lost fox on a big adventure.
 | |
|     
 | |
|     If you set this option's value to a string, it will be used as a custom seed.
 | |
|     Every player who uses the same custom seed will have the same entrances, choosing the most restrictive settings among these players for the purpose of pairing entrances.
 | |
|     """
 | |
|     internal_name = "entrance_rando"
 | |
|     display_name = "Entrance Rando"
 | |
|     alias_false = 0
 | |
|     alias_off = 0
 | |
|     option_no = 0
 | |
|     alias_true = 1
 | |
|     alias_on = 1
 | |
|     option_yes = 1
 | |
|     default = 0
 | |
| 
 | |
| 
 | |
| class FixedShop(Toggle):
 | |
|     """
 | |
|     Forces the Windmill entrance to lead to a shop, and removes the remaining shops from the pool.
 | |
|     Adds another entrance in Rooted Ziggurat Lower to keep an even number of entrances.
 | |
|     Has no effect if Entrance Rando is not enabled.
 | |
|     """
 | |
|     internal_name = "fixed_shop"
 | |
|     display_name = "Fewer Shops in Entrance Rando"
 | |
| 
 | |
| 
 | |
| class LaurelsLocation(Choice):
 | |
|     """
 | |
|     Force the Hero's Laurels to be placed at a location in your world.
 | |
|     For if you want to avoid or specify early or late Laurels.
 | |
|     """
 | |
|     internal_name = "laurels_location"
 | |
|     display_name = "Laurels Location"
 | |
|     option_anywhere = 0
 | |
|     option_6_coins = 1
 | |
|     option_10_coins = 2
 | |
|     option_10_fairies = 3
 | |
|     default = 0
 | |
| 
 | |
| 
 | |
| class ShuffleLadders(Toggle):
 | |
|     """
 | |
|     Turns several ladders in the game into items that must be found before they can be climbed on.
 | |
|     Adds more layers of progression to the game by blocking access to many areas early on.
 | |
|     "Ladders were a mistake."
 | |
|     —Andrew Shouldice
 | |
|     """
 | |
|     internal_name = "shuffle_ladders"
 | |
|     display_name = "Shuffle Ladders"
 | |
| 
 | |
| 
 | |
| class TunicPlandoConnections(PlandoConnections):
 | |
|     """
 | |
|     Generic connection plando. Format is:
 | |
|     - entrance: "Entrance Name"
 | |
|       exit: "Exit Name"
 | |
|       percentage: 100
 | |
|     Percentage is an integer from 0 to 100 which determines whether that connection will be made. Defaults to 100 if omitted.
 | |
|     """
 | |
|     entrances = {*(portal.name for portal in portal_mapping), "Shop", "Shop Portal"}
 | |
|     exits = {*(portal.name for portal in portal_mapping), "Shop", "Shop Portal"}
 | |
| 
 | |
|     duplicate_exits = True
 | |
| 
 | |
| 
 | |
| class LaurelsZips(Toggle):
 | |
|     """
 | |
|     Choose whether to include using the Hero's Laurels to zip through gates, doors, and tricky spots.
 | |
|     Notable inclusions are the Monastery gate, Ruined Passage door, Old House gate, Forest Grave Path gate, and getting from the Back of Swamp to the Middle of Swamp.
 | |
|     """
 | |
|     internal_name = "laurels_zips"
 | |
|     display_name = "Laurels Zips Logic"
 | |
| 
 | |
| 
 | |
| class IceGrappling(Choice):
 | |
|     """
 | |
|     Choose whether grappling frozen enemies is in logic.
 | |
|     Easy includes ice grappling enemies that are in range without luring them. May include clips through terrain.
 | |
|     Medium includes using ice grapples to push enemies through doors or off ledges without luring them. Also includes bringing an enemy over to the Temple Door to grapple through it.
 | |
|     Hard includes luring or grappling enemies to get to where you want to go.
 | |
|     The Medium and Hard options will give the player the Torch to return to the Overworld checkpoint to avoid softlocks. Using the Torch is considered in logic.
 | |
|     Note: You will still be expected to ice grapple to the slime in East Forest from below with this option off.
 | |
|     """
 | |
|     internal_name = "ice_grappling"
 | |
|     display_name = "Ice Grapple Logic"
 | |
|     option_off = 0
 | |
|     option_easy = 1
 | |
|     option_medium = 2
 | |
|     option_hard = 3
 | |
|     default = 0
 | |
| 
 | |
| 
 | |
| class LadderStorage(Choice):
 | |
|     """
 | |
|     Choose whether Ladder Storage is in logic.
 | |
|     Easy includes uses of Ladder Storage to get to open doors over a long distance without too much difficulty. May include convenient elevation changes (going up Mountain stairs, stairs in front of Special Shop, etc.).
 | |
|     Medium includes the above as well as changing your elevation using the environment and getting knocked down by melee enemies mid-LS.
 | |
|     Hard includes the above as well as going behind the map to enter closed doors from behind, shooting a fuse with the magic wand to knock yourself down at close range, and getting into the Cathedral Secret Legend room mid-LS.
 | |
|     Enabling any of these difficulty options will give the player the Torch item to return to the Overworld checkpoint to avoid softlocks. Using the Torch is considered in logic.
 | |
|     Opening individual chests while doing ladder storage is excluded due to tedium.
 | |
|     Knocking yourself out of LS with a bomb is excluded due to the problematic nature of consumables in logic.
 | |
|     """
 | |
|     internal_name = "ladder_storage"
 | |
|     display_name = "Ladder Storage Logic"
 | |
|     option_off = 0
 | |
|     option_easy = 1
 | |
|     option_medium = 2
 | |
|     option_hard = 3
 | |
|     default = 0
 | |
| 
 | |
| 
 | |
| class LadderStorageWithoutItems(Toggle):
 | |
|     """
 | |
|     If disabled, you logically require Stick, Sword, or Magic Orb to perform Ladder Storage.
 | |
|     If enabled, you will be expected to perform Ladder Storage without progression items.
 | |
|     This can be done with the plushie code, a Golden Coin, Prayer, and many other options.
 | |
| 
 | |
|     This option has no effect if you do not have Ladder Storage Logic enabled.
 | |
|     """
 | |
|     internal_name = "ladder_storage_without_items"
 | |
|     display_name = "Ladder Storage without Items"
 | |
| 
 | |
| 
 | |
| class LogicRules(Choice):
 | |
|     """
 | |
|     This option has been superseded by the individual trick options.
 | |
|     If set to nmg, it will set Ice Grappling to medium and Laurels Zips on.
 | |
|     If set to ur, it will do nmg as well as set Ladder Storage to medium.
 | |
|     It is here to avoid breaking old yamls, and will be removed at a later date.
 | |
|     """
 | |
|     visibility = Visibility.none
 | |
|     internal_name = "logic_rules"
 | |
|     display_name = "Logic Rules"
 | |
|     option_restricted = 0
 | |
|     option_no_major_glitches = 1
 | |
|     alias_nmg = 1
 | |
|     option_unrestricted = 2
 | |
|     alias_ur = 2
 | |
|     default = 0
 | |
| 
 | |
| 
 | |
| @dataclass
 | |
| class TunicOptions(PerGameCommonOptions):
 | |
|     start_inventory_from_pool: StartInventoryPool
 | |
|     sword_progression: SwordProgression
 | |
|     start_with_sword: StartWithSword
 | |
|     keys_behind_bosses: KeysBehindBosses
 | |
|     ability_shuffling: AbilityShuffling
 | |
|     shuffle_ladders: ShuffleLadders
 | |
|     entrance_rando: EntranceRando
 | |
|     fixed_shop: FixedShop
 | |
|     fool_traps: FoolTraps
 | |
|     hexagon_quest: HexagonQuest
 | |
|     hexagon_goal: HexagonGoal
 | |
|     extra_hexagon_percentage: ExtraHexagonPercentage
 | |
|     laurels_location: LaurelsLocation
 | |
|     lanternless: Lanternless
 | |
|     maskless: Maskless
 | |
|     laurels_zips: LaurelsZips
 | |
|     ice_grappling: IceGrappling
 | |
|     ladder_storage: LadderStorage
 | |
|     ladder_storage_without_items: LadderStorageWithoutItems
 | |
|     plando_connections: TunicPlandoConnections
 | |
| 
 | |
|     logic_rules: LogicRules
 | |
|       
 | |
| 
 | |
| tunic_option_groups = [
 | |
|     OptionGroup("Logic Options", [
 | |
|         Lanternless,
 | |
|         Maskless,
 | |
|         LaurelsZips,
 | |
|         IceGrappling,
 | |
|         LadderStorage,
 | |
|         LadderStorageWithoutItems
 | |
|     ])
 | |
| ]
 | |
| 
 | |
| tunic_option_presets: Dict[str, Dict[str, Any]] = {
 | |
|     "Sync": {
 | |
|         "ability_shuffling": True,
 | |
|     },
 | |
|     "Async": {
 | |
|         "progression_balancing": 0,
 | |
|         "ability_shuffling": True,
 | |
|         "shuffle_ladders": True,
 | |
|         "laurels_location": "10_fairies",
 | |
|     },
 | |
|     "Glace Mode": {
 | |
|         "accessibility": "minimal",
 | |
|         "ability_shuffling": True,
 | |
|         "entrance_rando": True,
 | |
|         "fool_traps": "onslaught",
 | |
|         "laurels_zips": True,
 | |
|         "ice_grappling": "hard",
 | |
|         "ladder_storage": "hard",
 | |
|         "ladder_storage_without_items": True,
 | |
|         "maskless": True,
 | |
|         "lanternless": True,
 | |
|     },
 | |
| }
 |