229 lines
7.0 KiB
Python
229 lines
7.0 KiB
Python
|
from dataclasses import dataclass
|
||
|
|
||
|
from Options import Choice, DeathLink, DefaultOnToggle, PerGameCommonOptions, Range, Toggle
|
||
|
|
||
|
|
||
|
class LandstalkerGoal(Choice):
|
||
|
"""
|
||
|
The goal to accomplish in order to complete the seed.
|
||
|
- Beat Gola: beat the usual final boss (same as vanilla)
|
||
|
- Reach Kazalt: find the jewels and take the teleporter to Kazalt
|
||
|
- Beat Dark Nole: the door to King Nole's fight brings you into a final dungeon with an absurdly hard boss you have
|
||
|
to beat to win the game
|
||
|
"""
|
||
|
display_name = "Goal"
|
||
|
|
||
|
option_beat_gola = 0
|
||
|
option_reach_kazalt = 1
|
||
|
option_beat_dark_nole = 2
|
||
|
|
||
|
default = 0
|
||
|
|
||
|
|
||
|
class JewelCount(Range):
|
||
|
"""
|
||
|
Determines the number of jewels to find to be able to reach Kazalt.
|
||
|
"""
|
||
|
display_name = "Jewel Count"
|
||
|
range_start = 0
|
||
|
range_end = 9
|
||
|
default = 5
|
||
|
|
||
|
|
||
|
class ProgressiveArmors(DefaultOnToggle):
|
||
|
"""
|
||
|
When obtaining an armor, you get the next armor tier instead of getting the specific armor tier that was
|
||
|
placed here by randomization. Enabling this provides a smoother progression.
|
||
|
"""
|
||
|
display_name = "Progressive Armors"
|
||
|
|
||
|
|
||
|
class UseRecordBook(DefaultOnToggle):
|
||
|
"""
|
||
|
Gives a Record Book item in starting inventory, allowing to save the game anywhere.
|
||
|
This makes the game significantly less frustrating and enables interesting save-scumming strategies in some places.
|
||
|
"""
|
||
|
display_name = "Use Record Book"
|
||
|
|
||
|
|
||
|
class UseSpellBook(DefaultOnToggle):
|
||
|
"""
|
||
|
Gives a Spell Book item in starting inventory, allowing to warp back to the starting location at any time.
|
||
|
This prevents any kind of softlock and makes the world easier to explore.
|
||
|
"""
|
||
|
display_name = "Use Spell Book"
|
||
|
|
||
|
|
||
|
class EnsureEkeEkeInShops(DefaultOnToggle):
|
||
|
"""
|
||
|
Ensures an EkeEke will always be for sale in one shop per region in the game.
|
||
|
Disabling this can lead to frustrating situations where you cannot refill your health items and might get locked.
|
||
|
"""
|
||
|
display_name = "Ensure EkeEke in Shops"
|
||
|
|
||
|
|
||
|
class RemoveGumiBoulder(Toggle):
|
||
|
"""
|
||
|
Removes the boulder between Gumi and Ryuma, which is usually a one-way path.
|
||
|
This makes the vanilla early game (Massan, Gumi...) more easily accessible when starting outside it.
|
||
|
"""
|
||
|
display_name = "Remove Boulder After Gumi"
|
||
|
|
||
|
|
||
|
class EnemyJumpingInLogic(Toggle):
|
||
|
"""
|
||
|
Adds jumping on enemies' heads as a logical rule.
|
||
|
This gives access to Mountainous Area from Lake Shrine sector and to the cliff chest behind a magic tree near Mir Tower.
|
||
|
These tricks not being easy, you should leave this disabled until practiced.
|
||
|
"""
|
||
|
display_name = "Enemy Jumping in Logic"
|
||
|
|
||
|
|
||
|
class TreeCuttingGlitchInLogic(Toggle):
|
||
|
"""
|
||
|
Adds tree-cutting glitch as a logical rule, enabling access to both chests behind magic trees in Mir Tower Sector
|
||
|
without having Axe Magic.
|
||
|
"""
|
||
|
display_name = "Tree-cutting Glitch in Logic"
|
||
|
|
||
|
|
||
|
class DamageBoostingInLogic(Toggle):
|
||
|
"""
|
||
|
Adds damage boosting as a logical rule, removing any requirements involving Iron Boots or Fireproof Boots.
|
||
|
Who doesn't like walking on spikes and lava?
|
||
|
"""
|
||
|
display_name = "Damage Boosting in Logic"
|
||
|
|
||
|
|
||
|
class WhistleUsageBehindTrees(DefaultOnToggle):
|
||
|
"""
|
||
|
In Greenmaze, Einstein Whistle can only be used to call Cutter from the intended side by default.
|
||
|
Enabling this allows using Einstein Whistle from both sides of the magic trees.
|
||
|
This is only useful in seeds starting in the "waterfall" spawn region or where teleportation trees are made open from the start.
|
||
|
"""
|
||
|
display_name = "Allow Using Einstein Whistle Behind Trees"
|
||
|
|
||
|
|
||
|
class SpawnRegion(Choice):
|
||
|
"""
|
||
|
List of spawn locations that can be picked by the randomizer.
|
||
|
It is advised to keep Massan as your spawn location for your first few seeds.
|
||
|
Picking a late-game location can make the seed significantly harder, both for logic and combat.
|
||
|
"""
|
||
|
display_name = "Starting Region"
|
||
|
|
||
|
option_massan = 0
|
||
|
option_gumi = 1
|
||
|
option_kado = 2
|
||
|
option_waterfall = 3
|
||
|
option_ryuma = 4
|
||
|
option_mercator = 5
|
||
|
option_verla = 6
|
||
|
option_greenmaze = 7
|
||
|
option_destel = 8
|
||
|
|
||
|
default = 0
|
||
|
|
||
|
|
||
|
class TeleportTreeRequirements(Choice):
|
||
|
"""
|
||
|
Determines the requirements to be able to use a teleport tree pair.
|
||
|
- None: All teleport trees are available right from the start
|
||
|
- Clear Tibor: Tibor needs to be cleared before unlocking any tree
|
||
|
- Visit Trees: Both trees from a tree pair need to be visited to teleport between them
|
||
|
Vanilla behavior is "Clear Tibor And Visit Trees"
|
||
|
"""
|
||
|
display_name = "Teleportation Trees Requirements"
|
||
|
|
||
|
option_none = 0
|
||
|
option_clear_tibor = 1
|
||
|
option_visit_trees = 2
|
||
|
option_clear_tibor_and_visit_trees = 3
|
||
|
|
||
|
default = 3
|
||
|
|
||
|
|
||
|
class ShuffleTrees(Toggle):
|
||
|
"""
|
||
|
If enabled, all teleportation trees will be shuffled into new pairs.
|
||
|
"""
|
||
|
display_name = "Shuffle Teleportation Trees"
|
||
|
|
||
|
|
||
|
class ReviveUsingEkeeke(DefaultOnToggle):
|
||
|
"""
|
||
|
In the vanilla game, when you die, you are automatically revived by Friday using an EkeEke.
|
||
|
This setting allows disabling this feature, making the game extremely harder.
|
||
|
USE WITH CAUTION!
|
||
|
"""
|
||
|
display_name = "Revive Using EkeEke"
|
||
|
|
||
|
|
||
|
class ShopPricesFactor(Range):
|
||
|
"""
|
||
|
Applies a percentage factor on all prices in shops. Having higher prices can lead to a bit of gold farming, which
|
||
|
can make seeds longer but also sometimes more frustrating.
|
||
|
"""
|
||
|
display_name = "Shop Prices Factor (%)"
|
||
|
range_start = 50
|
||
|
range_end = 200
|
||
|
default = 100
|
||
|
|
||
|
|
||
|
class CombatDifficulty(Choice):
|
||
|
"""
|
||
|
Determines the overall combat difficulty in the game by modifying both monsters HP & damage.
|
||
|
- Peaceful: 50% HP & damage
|
||
|
- Easy: 75% HP & damage
|
||
|
- Normal: 100% HP & damage
|
||
|
- Hard: 140% HP & damage
|
||
|
- Insane: 200% HP & damage
|
||
|
"""
|
||
|
display_name = "Combat Difficulty"
|
||
|
|
||
|
option_peaceful = 0
|
||
|
option_easy = 1
|
||
|
option_normal = 2
|
||
|
option_hard = 3
|
||
|
option_insane = 4
|
||
|
|
||
|
default = 2
|
||
|
|
||
|
|
||
|
class HintCount(Range):
|
||
|
"""
|
||
|
Determines the number of Foxy NPCs that will be scattered across the world, giving various types of hints
|
||
|
"""
|
||
|
display_name = "Hint Count"
|
||
|
range_start = 0
|
||
|
range_end = 25
|
||
|
default = 12
|
||
|
|
||
|
|
||
|
@dataclass
|
||
|
class LandstalkerOptions(PerGameCommonOptions):
|
||
|
goal: LandstalkerGoal
|
||
|
spawn_region: SpawnRegion
|
||
|
jewel_count: JewelCount
|
||
|
progressive_armors: ProgressiveArmors
|
||
|
use_record_book: UseRecordBook
|
||
|
use_spell_book: UseSpellBook
|
||
|
|
||
|
shop_prices_factor: ShopPricesFactor
|
||
|
combat_difficulty: CombatDifficulty
|
||
|
|
||
|
teleport_tree_requirements: TeleportTreeRequirements
|
||
|
shuffle_trees: ShuffleTrees
|
||
|
|
||
|
ensure_ekeeke_in_shops: EnsureEkeEkeInShops
|
||
|
remove_gumi_boulder: RemoveGumiBoulder
|
||
|
allow_whistle_usage_behind_trees: WhistleUsageBehindTrees
|
||
|
handle_damage_boosting_in_logic: DamageBoostingInLogic
|
||
|
handle_enemy_jumping_in_logic: EnemyJumpingInLogic
|
||
|
handle_tree_cutting_glitch_in_logic: TreeCuttingGlitchInLogic
|
||
|
|
||
|
hint_count: HintCount
|
||
|
|
||
|
revive_using_ekeeke: ReviveUsingEkeeke
|
||
|
death_link: DeathLink
|