KH2: Version 2 (#2009)
Co-authored-by: Aaron Wagener <mmmcheese158@gmail.com> Co-authored-by: Joe Prochaska <prochaska.joseph@gmail.com>
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
from Options import Choice, Option, Range, Toggle, OptionSet
|
||||
import typing
|
||||
from dataclasses import dataclass
|
||||
|
||||
from worlds.kh2 import SupportAbility_Table, ActionAbility_Table
|
||||
from Options import Choice, Range, Toggle, ItemDict, PerGameCommonOptions, StartInventoryPool
|
||||
|
||||
from worlds.kh2 import default_itempool_option
|
||||
|
||||
|
||||
class SoraEXP(Range):
|
||||
@@ -107,23 +108,61 @@ class Visitlocking(Choice):
|
||||
First and Second Visit Locking: One item for First Visit Two For Second Visit"""
|
||||
display_name = "Visit locking"
|
||||
option_no_visit_locking = 0 # starts with 25 visit locking
|
||||
option_second_visit_locking = 1 # starts with 13 (no icecream/picture)
|
||||
option_second_visit_locking = 1 # starts with 12 visit locking
|
||||
option_first_and_second_visit_locking = 2 # starts with nothing
|
||||
default = 2
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
class RandomVisitLockingItem(Range):
|
||||
"""Start with random amount of visit locking items."""
|
||||
display_name = "Random Visit Locking Item"
|
||||
range_start = 0
|
||||
range_end = 25
|
||||
default = 3
|
||||
default = 0
|
||||
|
||||
|
||||
class SuperBosses(Toggle):
|
||||
"""Terra, Sephiroth and Data Fights Toggle."""
|
||||
"""Terra Sephiroth and Data Fights Toggle."""
|
||||
display_name = "Super Bosses"
|
||||
default = False
|
||||
default = True
|
||||
|
||||
|
||||
class Cups(Choice):
|
||||
@@ -135,7 +174,7 @@ class Cups(Choice):
|
||||
option_no_cups = 0
|
||||
option_cups = 1
|
||||
option_cups_and_hades_paradox = 2
|
||||
default = 1
|
||||
default = 0
|
||||
|
||||
|
||||
class LevelDepth(Choice):
|
||||
@@ -157,67 +196,71 @@ class LevelDepth(Choice):
|
||||
default = 0
|
||||
|
||||
|
||||
class DonaldGoofyStatsanity(Toggle):
|
||||
"""Toggles if on Donald and Goofy's Get Bonus locations can be any item"""
|
||||
display_name = "Donald & Goofy Statsanity"
|
||||
default = True
|
||||
|
||||
|
||||
class AtlanticaToggle(Toggle):
|
||||
"""Atlantica Toggle"""
|
||||
display_name = "Atlantica Toggle"
|
||||
default = False
|
||||
|
||||
|
||||
class PromiseCharm(Toggle):
|
||||
"""Add Promise Charm to the Pool"""
|
||||
"""Add Promise Charm to the pool"""
|
||||
display_name = "Promise Charm"
|
||||
default = False
|
||||
|
||||
|
||||
class KeybladeAbilities(Choice):
|
||||
"""
|
||||
Action: Action Abilities in the Keyblade Slot Pool.
|
||||
|
||||
Support: Support Abilities in the Keyblade Slot Pool.
|
||||
|
||||
Both: Action and Support Abilities in the Keyblade Slot Pool."""
|
||||
display_name = "Keyblade Abilities"
|
||||
option_support = 0
|
||||
option_action = 1
|
||||
option_both = 2
|
||||
default = 0
|
||||
|
||||
|
||||
class BlacklistKeyblade(OptionSet):
|
||||
"""Black List these Abilities on Keyblades"""
|
||||
display_name = "Blacklist Keyblade Abilities"
|
||||
valid_keys = set(SupportAbility_Table.keys()).union(ActionAbility_Table.keys())
|
||||
class AntiForm(Toggle):
|
||||
"""Add Anti Form to the pool"""
|
||||
display_name = "Anti Form"
|
||||
default = False
|
||||
|
||||
|
||||
class Goal(Choice):
|
||||
"""Win Condition
|
||||
Three Proofs: Get a Gold Crown on Sora's Head.
|
||||
Three Proofs: Find the 3 Proofs to unlock the final door.
|
||||
|
||||
Lucky Emblem Hunt: Find Required Amount of Lucky Emblems .
|
||||
Lucky Emblem Hunt: Find required amount of Lucky Emblems.
|
||||
|
||||
Hitlist (Bounty Hunt): Find Required Amount of Bounties"""
|
||||
Hitlist (Bounty Hunt): Find required amount of Bounties.
|
||||
|
||||
Lucky Emblem and Hitlist: Find the required amount of Lucky Emblems and Bounties."""
|
||||
display_name = "Goal"
|
||||
option_three_proofs = 0
|
||||
option_lucky_emblem_hunt = 1
|
||||
option_hitlist = 2
|
||||
default = 0
|
||||
option_hitlist_and_lucky_emblem = 3
|
||||
default = 1
|
||||
|
||||
|
||||
class FinalXemnas(Toggle):
|
||||
"""Kill Final Xemnas to Beat the Game.
|
||||
This is in addition to your Goal. I.E. get three proofs+kill final Xemnas"""
|
||||
|
||||
This is in addition to your Goal.
|
||||
|
||||
I.E. get three proofs+kill final Xemnas"""
|
||||
display_name = "Final Xemnas"
|
||||
default = True
|
||||
|
||||
|
||||
class LuckyEmblemsRequired(Range):
|
||||
"""Number of Lucky Emblems to collect to Win/Unlock Final Xemnas Door.
|
||||
"""Number of Lucky Emblems to collect to Win/Unlock Final Xemnas' Door.
|
||||
|
||||
If Goal is not Lucky Emblem Hunt this does nothing."""
|
||||
If Goal is not Lucky Emblem Hunt or Lucky Emblem and Hitlist this does nothing."""
|
||||
display_name = "Lucky Emblems Required"
|
||||
range_start = 1
|
||||
range_end = 60
|
||||
default = 30
|
||||
default = 35
|
||||
|
||||
|
||||
class LuckyEmblemsAmount(Range):
|
||||
"""Number of Lucky Emblems that are in the pool.
|
||||
|
||||
If Goal is not Lucky Emblem Hunt this does nothing."""
|
||||
If Goal is not Lucky Emblem Hunt or Lucky Emblem and Hitlist this does nothing."""
|
||||
display_name = "Lucky Emblems Available"
|
||||
range_start = 1
|
||||
range_end = 60
|
||||
@@ -227,48 +270,103 @@ class LuckyEmblemsAmount(Range):
|
||||
class BountyRequired(Range):
|
||||
"""Number of Bounties to collect to Win/Unlock Final Xemnas Door.
|
||||
|
||||
If Goal is not Hitlist this does nothing."""
|
||||
If Goal is not Hitlist or Lucky Emblem and Hitlist this does nothing."""
|
||||
display_name = "Bounties Required"
|
||||
range_start = 1
|
||||
range_end = 24
|
||||
range_end = 26
|
||||
default = 7
|
||||
|
||||
|
||||
class BountyAmount(Range):
|
||||
"""Number of Bounties that are in the pool.
|
||||
|
||||
If Goal is not Hitlist this does nothing."""
|
||||
If Goal is not Hitlist or Lucky Emblem and Hitlist this does nothing."""
|
||||
display_name = "Bounties Available"
|
||||
range_start = 1
|
||||
range_end = 24
|
||||
default = 13
|
||||
range_end = 26
|
||||
default = 10
|
||||
|
||||
|
||||
KH2_Options: typing.Dict[str, type(Option)] = {
|
||||
"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,
|
||||
"Promise_Charm": PromiseCharm,
|
||||
"Goal": Goal,
|
||||
"FinalXemnas": FinalXemnas,
|
||||
"LuckyEmblemsAmount": LuckyEmblemsAmount,
|
||||
"LuckyEmblemsRequired": LuckyEmblemsRequired,
|
||||
"BountyAmount": BountyAmount,
|
||||
"BountyRequired": BountyRequired,
|
||||
"Keyblade_Minimum": KeybladeMin,
|
||||
"Keyblade_Maximum": KeybladeMax,
|
||||
"Visitlocking": Visitlocking,
|
||||
"RandomVisitLockingItem": RandomVisitLockingItem,
|
||||
"SuperBosses": SuperBosses,
|
||||
"KeybladeAbilities": KeybladeAbilities,
|
||||
"BlacklistKeyblade": BlacklistKeyblade,
|
||||
"Cups": Cups,
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user