2023-11-25 14:46:00 +00:00
|
|
|
from dataclasses import dataclass
|
2023-03-20 16:19:55 +00:00
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
from Options import Choice, Range, Toggle, ItemDict, PerGameCommonOptions, StartInventoryPool
|
|
|
|
|
2024-01-10 23:56:43 +00:00
|
|
|
from . import default_itempool_option
|
2023-03-28 16:02:06 +00:00
|
|
|
|
2023-03-20 16:19:55 +00:00
|
|
|
|
|
|
|
class SoraEXP(Range):
|
|
|
|
"""Sora Level Exp Multiplier"""
|
|
|
|
display_name = "Sora Level EXP"
|
|
|
|
range_start = 1
|
|
|
|
range_end = 10
|
|
|
|
default = 5
|
|
|
|
|
|
|
|
|
|
|
|
class FinalEXP(Range):
|
|
|
|
"""Final Form Exp Multiplier"""
|
|
|
|
display_name = "Final Form EXP"
|
|
|
|
range_start = 1
|
|
|
|
range_end = 10
|
|
|
|
default = 3
|
|
|
|
|
|
|
|
|
|
|
|
class MasterEXP(Range):
|
|
|
|
"""Master Form Exp Multiplier"""
|
|
|
|
display_name = "Master Form EXP"
|
|
|
|
range_start = 1
|
|
|
|
range_end = 10
|
|
|
|
default = 3
|
|
|
|
|
|
|
|
|
|
|
|
class LimitEXP(Range):
|
|
|
|
"""Limit Form Exp Multiplier"""
|
|
|
|
display_name = "Limit Form EXP"
|
|
|
|
range_start = 1
|
|
|
|
range_end = 10
|
|
|
|
default = 3
|
|
|
|
|
|
|
|
|
|
|
|
class WisdomEXP(Range):
|
|
|
|
"""Wisdom Form Exp Multiplier"""
|
|
|
|
display_name = "Wisdom Form EXP"
|
|
|
|
range_start = 1
|
|
|
|
range_end = 10
|
|
|
|
default = 3
|
|
|
|
|
|
|
|
|
|
|
|
class ValorEXP(Range):
|
|
|
|
"""Valor Form Exp Multiplier"""
|
|
|
|
display_name = "Valor Form EXP"
|
|
|
|
range_start = 1
|
|
|
|
range_end = 10
|
|
|
|
default = 3
|
|
|
|
|
|
|
|
|
|
|
|
class SummonEXP(Range):
|
|
|
|
"""Summon Exp Multiplier"""
|
|
|
|
display_name = "Summon level EXP"
|
|
|
|
range_start = 1
|
|
|
|
range_end = 10
|
|
|
|
default = 5
|
|
|
|
|
|
|
|
|
|
|
|
class Schmovement(Choice):
|
2023-04-01 17:55:43 +00:00
|
|
|
"""Level of Progressive Movement Abilities You Start With"""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Schmovement"
|
|
|
|
option_level_0 = 0
|
|
|
|
option_level_1 = 1
|
|
|
|
option_level_2 = 2
|
|
|
|
option_level_3 = 3
|
|
|
|
option_level_4 = 4
|
|
|
|
default = 1
|
|
|
|
|
|
|
|
|
|
|
|
class RandomGrowth(Range):
|
2023-04-01 17:55:43 +00:00
|
|
|
"""Amount of Random Progressive Movement Abilities You Start With"""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Random Starting Growth"
|
|
|
|
range_start = 0
|
|
|
|
range_end = 20
|
|
|
|
default = 0
|
|
|
|
|
|
|
|
|
|
|
|
class KeybladeMin(Range):
|
2023-04-01 17:55:43 +00:00
|
|
|
"""Minimum Stats for Keyblades"""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Keyblade Minimum Stats"
|
|
|
|
range_start = 0
|
|
|
|
range_end = 20
|
|
|
|
default = 3
|
|
|
|
|
|
|
|
|
|
|
|
class KeybladeMax(Range):
|
2023-04-01 17:55:43 +00:00
|
|
|
"""Maximum Stats for Keyblades"""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Keyblade Max Stats"
|
|
|
|
range_start = 0
|
|
|
|
range_end = 20
|
|
|
|
default = 7
|
|
|
|
|
|
|
|
|
|
|
|
class Visitlocking(Choice):
|
|
|
|
"""Determines the level of visit locking
|
2023-04-01 17:55:43 +00:00
|
|
|
|
|
|
|
No Visit Locking: Start with all 25 visit locking items.
|
|
|
|
|
|
|
|
|
|
|
|
Second Visit Locking: Start with 13 visit locking items for every first visit.
|
|
|
|
|
|
|
|
|
|
|
|
First and Second Visit Locking: One item for First Visit Two For Second Visit"""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Visit locking"
|
2023-04-01 17:55:43 +00:00
|
|
|
option_no_visit_locking = 0 # starts with 25 visit locking
|
2023-11-25 14:46:00 +00:00
|
|
|
option_second_visit_locking = 1 # starts with 12 visit locking
|
2023-03-20 16:19:55 +00:00
|
|
|
option_first_and_second_visit_locking = 2 # starts with nothing
|
|
|
|
default = 2
|
|
|
|
|
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
class FightLogic(Choice):
|
|
|
|
"""
|
|
|
|
The level of logic to use when determining what fights in each KH2 world are beatable.
|
|
|
|
|
|
|
|
Easy: For Players not very comfortable doing things without a lot of tools.
|
|
|
|
|
|
|
|
Normal: For Players somewhat comfortable doing fights with some of the tools.
|
|
|
|
|
|
|
|
Hard: For Players comfortable doing fights with almost no tools.
|
|
|
|
"""
|
|
|
|
display_name = "Fight Logic"
|
|
|
|
option_easy = 0
|
|
|
|
option_normal = 1
|
|
|
|
option_hard = 2
|
|
|
|
default = 1
|
|
|
|
|
|
|
|
|
|
|
|
class FinalFormLogic(Choice):
|
|
|
|
"""Determines forcing final form logic
|
|
|
|
|
|
|
|
No Light and Darkness: Light and Darkness is not in logic.
|
|
|
|
Light And Darkness: Final Forcing with light and darkness is in logic.
|
|
|
|
Just a Form: All that requires final forcing is another form.
|
|
|
|
"""
|
|
|
|
display_name = "Final Form Logic"
|
|
|
|
option_no_light_and_darkness = 0
|
|
|
|
option_light_and_darkness = 1
|
|
|
|
option_just_a_form = 2
|
|
|
|
default = 1
|
|
|
|
|
|
|
|
|
|
|
|
class AutoFormLogic(Toggle):
|
|
|
|
""" Have Auto Forms levels in logic.
|
|
|
|
"""
|
|
|
|
display_name = "Auto Form Logic"
|
|
|
|
default = False
|
|
|
|
|
|
|
|
|
2023-03-20 16:19:55 +00:00
|
|
|
class RandomVisitLockingItem(Range):
|
2023-03-27 17:17:06 +00:00
|
|
|
"""Start with random amount of visit locking items."""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Random Visit Locking Item"
|
|
|
|
range_start = 0
|
2023-03-27 17:17:06 +00:00
|
|
|
range_end = 25
|
2023-11-25 14:46:00 +00:00
|
|
|
default = 0
|
2023-03-20 16:19:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
class SuperBosses(Toggle):
|
2023-11-25 14:46:00 +00:00
|
|
|
"""Terra Sephiroth and Data Fights Toggle."""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Super Bosses"
|
2023-11-25 14:46:00 +00:00
|
|
|
default = True
|
2023-03-20 16:19:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Cups(Choice):
|
|
|
|
"""Olympus Cups Toggles
|
2023-04-01 17:55:43 +00:00
|
|
|
No Cups: All Cups are placed into Excluded Locations.
|
|
|
|
Cups: Hades Paradox Cup is placed into Excluded Locations
|
2023-03-20 16:19:55 +00:00
|
|
|
Cups and Hades Paradox: Has Every Cup On."""
|
|
|
|
display_name = "Olympus Cups"
|
|
|
|
option_no_cups = 0
|
|
|
|
option_cups = 1
|
|
|
|
option_cups_and_hades_paradox = 2
|
2023-11-25 14:46:00 +00:00
|
|
|
default = 0
|
2023-03-20 16:19:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
class LevelDepth(Choice):
|
|
|
|
"""Determines How many locations you want on levels
|
2023-04-01 17:55:43 +00:00
|
|
|
|
2023-04-10 02:12:23 +00:00
|
|
|
Level 50: 23 checks spread through 50 levels.
|
|
|
|
Level 99: 23 checks spread through 99 levels.
|
2023-04-01 17:55:43 +00:00
|
|
|
|
|
|
|
Level 50 sanity: 49 checks spread through 50 levels.
|
|
|
|
Level 99 sanity: 98 checks spread through 99 levels.
|
|
|
|
|
2023-03-20 16:19:55 +00:00
|
|
|
Level 1: no checks on levels(checks are replaced with stats)"""
|
|
|
|
display_name = "Level Depth"
|
|
|
|
option_level_50 = 0
|
|
|
|
option_level_99 = 1
|
|
|
|
option_level_50_sanity = 2
|
|
|
|
option_level_99_sanity = 3
|
|
|
|
option_level_1 = 4
|
|
|
|
default = 0
|
|
|
|
|
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
class DonaldGoofyStatsanity(Toggle):
|
|
|
|
"""Toggles if on Donald and Goofy's Get Bonus locations can be any item"""
|
|
|
|
display_name = "Donald & Goofy Statsanity"
|
|
|
|
default = True
|
2023-03-20 16:19:55 +00:00
|
|
|
|
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
class AtlanticaToggle(Toggle):
|
|
|
|
"""Atlantica Toggle"""
|
|
|
|
display_name = "Atlantica Toggle"
|
|
|
|
default = False
|
2023-04-01 17:55:43 +00:00
|
|
|
|
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
class PromiseCharm(Toggle):
|
|
|
|
"""Add Promise Charm to the pool"""
|
|
|
|
display_name = "Promise Charm"
|
|
|
|
default = False
|
2023-03-20 16:19:55 +00:00
|
|
|
|
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
class AntiForm(Toggle):
|
|
|
|
"""Add Anti Form to the pool"""
|
|
|
|
display_name = "Anti Form"
|
|
|
|
default = False
|
2023-03-20 16:19:55 +00:00
|
|
|
|
2023-04-01 17:55:43 +00:00
|
|
|
|
2023-03-20 16:19:55 +00:00
|
|
|
class Goal(Choice):
|
|
|
|
"""Win Condition
|
2023-11-25 14:46:00 +00:00
|
|
|
Three Proofs: Find the 3 Proofs to unlock the final door.
|
|
|
|
|
|
|
|
Lucky Emblem Hunt: Find required amount of Lucky Emblems.
|
2023-04-01 17:55:43 +00:00
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
Hitlist (Bounty Hunt): Find required amount of Bounties.
|
2023-04-01 17:55:43 +00:00
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
Lucky Emblem and Hitlist: Find the required amount of Lucky Emblems and Bounties."""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Goal"
|
|
|
|
option_three_proofs = 0
|
|
|
|
option_lucky_emblem_hunt = 1
|
|
|
|
option_hitlist = 2
|
2023-11-25 14:46:00 +00:00
|
|
|
option_hitlist_and_lucky_emblem = 3
|
|
|
|
default = 1
|
2023-03-20 16:19:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
class FinalXemnas(Toggle):
|
|
|
|
"""Kill Final Xemnas to Beat the Game.
|
2023-11-25 14:46:00 +00:00
|
|
|
|
|
|
|
This is in addition to your Goal.
|
|
|
|
|
|
|
|
I.E. get three proofs+kill final Xemnas"""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Final Xemnas"
|
|
|
|
default = True
|
|
|
|
|
|
|
|
|
|
|
|
class LuckyEmblemsRequired(Range):
|
2023-11-25 14:46:00 +00:00
|
|
|
"""Number of Lucky Emblems to collect to Win/Unlock Final Xemnas' Door.
|
2023-04-01 17:55:43 +00:00
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
If Goal is not Lucky Emblem Hunt or Lucky Emblem and Hitlist this does nothing."""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Lucky Emblems Required"
|
2023-03-27 17:17:06 +00:00
|
|
|
range_start = 1
|
2023-03-20 16:19:55 +00:00
|
|
|
range_end = 60
|
2023-11-25 14:46:00 +00:00
|
|
|
default = 35
|
2023-03-20 16:19:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
class LuckyEmblemsAmount(Range):
|
|
|
|
"""Number of Lucky Emblems that are in the pool.
|
2023-04-01 17:55:43 +00:00
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
If Goal is not Lucky Emblem Hunt or Lucky Emblem and Hitlist this does nothing."""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Lucky Emblems Available"
|
2023-03-27 17:17:06 +00:00
|
|
|
range_start = 1
|
2023-03-20 16:19:55 +00:00
|
|
|
range_end = 60
|
|
|
|
default = 40
|
|
|
|
|
|
|
|
|
|
|
|
class BountyRequired(Range):
|
2023-04-01 17:55:43 +00:00
|
|
|
"""Number of Bounties to collect to Win/Unlock Final Xemnas Door.
|
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
If Goal is not Hitlist or Lucky Emblem and Hitlist this does nothing."""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Bounties Required"
|
2023-03-27 17:17:06 +00:00
|
|
|
range_start = 1
|
2023-11-25 14:46:00 +00:00
|
|
|
range_end = 26
|
2023-03-20 16:19:55 +00:00
|
|
|
default = 7
|
|
|
|
|
|
|
|
|
|
|
|
class BountyAmount(Range):
|
|
|
|
"""Number of Bounties that are in the pool.
|
2023-04-01 17:55:43 +00:00
|
|
|
|
2023-11-25 14:46:00 +00:00
|
|
|
If Goal is not Hitlist or Lucky Emblem and Hitlist this does nothing."""
|
2023-03-20 16:19:55 +00:00
|
|
|
display_name = "Bounties Available"
|
2023-03-27 17:17:06 +00:00
|
|
|
range_start = 1
|
2023-11-25 14:46:00 +00:00
|
|
|
range_end = 26
|
|
|
|
default = 10
|
|
|
|
|
|
|
|
|
|
|
|
class BountyStartHint(Toggle):
|
|
|
|
"""Start with Bounties Hinted"""
|
|
|
|
display_name = "Start with Bounties Hinted"
|
|
|
|
default = False
|
|
|
|
|
|
|
|
|
|
|
|
class WeaponSlotStartHint(Toggle):
|
|
|
|
"""Start with Weapon Slots' Hinted"""
|
|
|
|
display_name = "Start with Weapon Slots Hinted"
|
|
|
|
default = False
|
|
|
|
|
|
|
|
|
|
|
|
class CorSkipToggle(Toggle):
|
|
|
|
"""Toggle for Cor skip.
|
|
|
|
|
|
|
|
Tools depend on which difficulty was chosen on Fight Difficulty.
|
|
|
|
|
|
|
|
Toggle does not negate fight logic but is an alternative.
|
|
|
|
|
|
|
|
Final Chest is also can be put into logic with this skip.
|
|
|
|
"""
|
|
|
|
display_name = "CoR Skip Toggle."
|
|
|
|
default = False
|
|
|
|
|
|
|
|
|
|
|
|
class CustomItemPoolQuantity(ItemDict):
|
|
|
|
"""Add more of an item into the itempool. Note: You cannot take out items from the pool."""
|
|
|
|
display_name = "Custom Item Pool"
|
|
|
|
verify_item_name = True
|
|
|
|
default = default_itempool_option
|
|
|
|
|
|
|
|
|
|
|
|
class FillerItemsLocal(Toggle):
|
|
|
|
"""Make all dynamic filler classified items local. Recommended when playing with games with fewer locations than kh2"""
|
|
|
|
display_name = "Local Filler Items"
|
|
|
|
default = True
|
|
|
|
|
|
|
|
|
|
|
|
class SummonLevelLocationToggle(Toggle):
|
|
|
|
"""Toggle Summon levels to have locations."""
|
|
|
|
display_name = "Summon Level Locations"
|
|
|
|
default = False
|
|
|
|
|
|
|
|
|
|
|
|
# shamelessly stolen from the messanger
|
|
|
|
@dataclass
|
|
|
|
class KingdomHearts2Options(PerGameCommonOptions):
|
|
|
|
start_inventory: StartInventoryPool
|
|
|
|
LevelDepth: LevelDepth
|
|
|
|
Sora_Level_EXP: SoraEXP
|
|
|
|
Valor_Form_EXP: ValorEXP
|
|
|
|
Wisdom_Form_EXP: WisdomEXP
|
|
|
|
Limit_Form_EXP: LimitEXP
|
|
|
|
Master_Form_EXP: MasterEXP
|
|
|
|
Final_Form_EXP: FinalEXP
|
|
|
|
Summon_EXP: SummonEXP
|
|
|
|
Schmovement: Schmovement
|
|
|
|
RandomGrowth: RandomGrowth
|
|
|
|
AntiForm: AntiForm
|
|
|
|
Promise_Charm: PromiseCharm
|
|
|
|
Goal: Goal
|
|
|
|
FinalXemnas: FinalXemnas
|
|
|
|
LuckyEmblemsAmount: LuckyEmblemsAmount
|
|
|
|
LuckyEmblemsRequired: LuckyEmblemsRequired
|
|
|
|
BountyAmount: BountyAmount
|
|
|
|
BountyRequired: BountyRequired
|
|
|
|
BountyStartingHintToggle: BountyStartHint
|
|
|
|
Keyblade_Minimum: KeybladeMin
|
|
|
|
Keyblade_Maximum: KeybladeMax
|
|
|
|
WeaponSlotStartHint: WeaponSlotStartHint
|
|
|
|
FightLogic: FightLogic
|
|
|
|
FinalFormLogic: FinalFormLogic
|
|
|
|
AutoFormLogic: AutoFormLogic
|
|
|
|
DonaldGoofyStatsanity: DonaldGoofyStatsanity
|
|
|
|
FillerItemsLocal: FillerItemsLocal
|
|
|
|
Visitlocking: Visitlocking
|
|
|
|
RandomVisitLockingItem: RandomVisitLockingItem
|
|
|
|
SuperBosses: SuperBosses
|
|
|
|
Cups: Cups
|
|
|
|
SummonLevelLocationToggle: SummonLevelLocationToggle
|
|
|
|
AtlanticaToggle: AtlanticaToggle
|
|
|
|
CorSkipToggle: CorSkipToggle
|
|
|
|
CustomItemPoolQuantity: CustomItemPoolQuantity
|