246 lines
6.5 KiB
Python
246 lines
6.5 KiB
Python
import typing
|
|
from Options import Option, Range, Choice, Toggle, DefaultOnToggle, AssembleOptions, DeathLink, ProgressionBalancing
|
|
|
|
|
|
class EvermizerFlags:
|
|
flags: typing.List[str]
|
|
|
|
def to_flag(self) -> str:
|
|
return self.flags[self.value]
|
|
|
|
|
|
class EvermizerFlag:
|
|
flag: str
|
|
|
|
def to_flag(self) -> str:
|
|
return self.flag if self.value != self.default else ''
|
|
|
|
|
|
class OffOnFullChoice(Choice):
|
|
option_off = 0
|
|
option_on = 1
|
|
option_full = 2
|
|
alias_chaos = 2
|
|
|
|
|
|
class Difficulty(EvermizerFlags, Choice):
|
|
"""Changes relative spell cost and stuff"""
|
|
display_name = "Difficulty"
|
|
option_easy = 0
|
|
option_normal = 1
|
|
option_hard = 2
|
|
option_mystery = 3 # 'random' is reserved
|
|
alias_chaos = 3
|
|
default = 1
|
|
flags = ['e', 'n', 'h', 'x']
|
|
|
|
|
|
class EnergyCore(EvermizerFlags, Choice):
|
|
"""How to obtain the Energy Core"""
|
|
display_name = "Energy Core"
|
|
option_vanilla = 0
|
|
option_shuffle = 1
|
|
option_fragments = 2
|
|
default = 1
|
|
flags = ['z', '', 'Z']
|
|
|
|
|
|
class RequiredFragments(Range):
|
|
"""Required fragment count for Energy Core = Fragments"""
|
|
display_name = "Required Fragments"
|
|
range_start = 1
|
|
range_end = 99
|
|
default = 10
|
|
|
|
|
|
class AvailableFragments(Range):
|
|
"""Placed fragment count for Energy Core = Fragments"""
|
|
display_name = "Available Fragments"
|
|
range_start = 1
|
|
range_end = 99
|
|
default = 11
|
|
|
|
|
|
class MoneyModifier(Range):
|
|
"""Money multiplier in %"""
|
|
display_name = "Money Modifier"
|
|
range_start = 1
|
|
range_end = 2500
|
|
default = 200
|
|
|
|
|
|
class ExpModifier(Range):
|
|
"""EXP multiplier for Weapons, Characters and Spells in %"""
|
|
display_name = "Exp Modifier"
|
|
range_start = 1
|
|
range_end = 2500
|
|
default = 200
|
|
|
|
|
|
class FixSequence(EvermizerFlag, DefaultOnToggle):
|
|
"""Fix some sequence breaks"""
|
|
display_name = "Fix Sequence"
|
|
flag = '1'
|
|
|
|
|
|
class FixCheats(EvermizerFlag, DefaultOnToggle):
|
|
"""Fix cheats left in by the devs (not desert skip)"""
|
|
display_name = "Fix Cheats"
|
|
flag = '2'
|
|
|
|
|
|
class FixInfiniteAmmo(EvermizerFlag, Toggle):
|
|
"""Fix infinite ammo glitch"""
|
|
display_name = "Fix Infinite Ammo"
|
|
flag = '5'
|
|
|
|
|
|
class FixAtlasGlitch(EvermizerFlag, Toggle):
|
|
"""Fix atlas underflowing stats"""
|
|
display_name = "Fix Atlas Glitch"
|
|
flag = '6'
|
|
|
|
|
|
class FixWingsGlitch(EvermizerFlag, Toggle):
|
|
"""Fix wings making you invincible in some areas"""
|
|
display_name = "Fix Wings Glitch"
|
|
flag = '7'
|
|
|
|
|
|
class ShorterDialogs(EvermizerFlag, DefaultOnToggle):
|
|
"""Cuts some dialogs"""
|
|
display_name = "Shorter Dialogs"
|
|
flag = '9'
|
|
|
|
|
|
class ShortBossRush(EvermizerFlag, DefaultOnToggle):
|
|
"""Start boss rush at Metal Magmar, cut enemy HP in half"""
|
|
display_name = "Short Boss Rush"
|
|
flag = 'f'
|
|
|
|
|
|
class Ingredienizer(EvermizerFlags, OffOnFullChoice):
|
|
"""On Shuffles, Full randomizes spell ingredients"""
|
|
display_name = "Ingredienizer"
|
|
default = 1
|
|
flags = ['i', '', 'I']
|
|
|
|
|
|
class Sniffamizer(EvermizerFlags, OffOnFullChoice):
|
|
"""On Shuffles, Full randomizes drops in sniff locations"""
|
|
display_name = "Sniffamizer"
|
|
default = 1
|
|
flags = ['s', '', 'S']
|
|
|
|
|
|
class Callbeadamizer(EvermizerFlags, OffOnFullChoice):
|
|
"""On Shuffles call bead characters, Full shuffles individual spells"""
|
|
display_name = "Callbeadamizer"
|
|
default = 1
|
|
flags = ['c', '', 'C']
|
|
|
|
|
|
class Musicmizer(EvermizerFlag, Toggle):
|
|
"""Randomize music for some rooms"""
|
|
display_name = "Musicmizer"
|
|
flag = 'm'
|
|
|
|
|
|
class Doggomizer(EvermizerFlags, OffOnFullChoice):
|
|
"""On shuffles dog per act, Full randomizes dog per screen, Pupdunk gives you Everpupper everywhere"""
|
|
display_name = "Doggomizer"
|
|
option_pupdunk = 3
|
|
default = 0
|
|
flags = ['', 'd', 'D', 'p']
|
|
|
|
|
|
class TurdoMode(EvermizerFlag, Toggle):
|
|
"""Replace offensive spells by Turd Balls with varying strength and make weapons weak"""
|
|
display_name = "Turdo Mode"
|
|
flag = 't'
|
|
|
|
|
|
class TrapCount(Range):
|
|
"""Replace some filler items with traps"""
|
|
display_name = "Trap Count"
|
|
range_start = 0
|
|
range_end = 100
|
|
default = 0
|
|
|
|
|
|
class ItemChanceMeta(AssembleOptions):
|
|
def __new__(mcs, name, bases, attrs):
|
|
if 'item_name' in attrs:
|
|
attrs["display_name"] = f"{attrs['item_name']} Chance"
|
|
attrs["range_start"] = 0
|
|
attrs["range_end"] = 100
|
|
|
|
return super(ItemChanceMeta, mcs).__new__(mcs, name, bases, attrs)
|
|
|
|
|
|
class TrapChance(Range, metaclass=ItemChanceMeta):
|
|
item_name: str
|
|
default = 20
|
|
|
|
|
|
class TrapChanceQuake(TrapChance):
|
|
"""Sets the chance/ratio of quake traps"""
|
|
item_name = "Quake Trap"
|
|
|
|
|
|
class TrapChancePoison(TrapChance):
|
|
"""Sets the chance/ratio of poison effect traps"""
|
|
item_name = "Poison Trap"
|
|
|
|
|
|
class TrapChanceConfound(TrapChance):
|
|
"""Sets the chance/ratio of confound effect traps"""
|
|
item_name = "Confound Trap"
|
|
|
|
|
|
class TrapChanceHUD(TrapChance):
|
|
"""Sets the chance/ratio of HUD visibility traps"""
|
|
item_name = "HUD Trap"
|
|
|
|
|
|
class TrapChanceOHKO(TrapChance):
|
|
"""Sets the chance/ratio of OHKO (1HP left) traps"""
|
|
item_name = "OHKO Trap"
|
|
|
|
|
|
class SoEProgressionBalancing(ProgressionBalancing):
|
|
default = 30
|
|
__doc__ = ProgressionBalancing.__doc__.replace(f"default {ProgressionBalancing.default}", f"default {default}")
|
|
special_range_names = {**ProgressionBalancing.special_range_names, "normal": default}
|
|
|
|
|
|
soe_options: typing.Dict[str, type(Option)] = {
|
|
"difficulty": Difficulty,
|
|
"energy_core": EnergyCore,
|
|
"required_fragments": RequiredFragments,
|
|
"available_fragments": AvailableFragments,
|
|
"money_modifier": MoneyModifier,
|
|
"exp_modifier": ExpModifier,
|
|
"fix_sequence": FixSequence,
|
|
"fix_cheats": FixCheats,
|
|
"fix_infinite_ammo": FixInfiniteAmmo,
|
|
"fix_atlas_glitch": FixAtlasGlitch,
|
|
"fix_wings_glitch": FixWingsGlitch,
|
|
"shorter_dialogs": ShorterDialogs,
|
|
"short_boss_rush": ShortBossRush,
|
|
"ingredienizer": Ingredienizer,
|
|
"sniffamizer": Sniffamizer,
|
|
"callbeadamizer": Callbeadamizer,
|
|
"musicmizer": Musicmizer,
|
|
"doggomizer": Doggomizer,
|
|
"turdo_mode": TurdoMode,
|
|
"death_link": DeathLink,
|
|
"trap_count": TrapCount,
|
|
"trap_chance_quake": TrapChanceQuake,
|
|
"trap_chance_poison": TrapChancePoison,
|
|
"trap_chance_confound": TrapChanceConfound,
|
|
"trap_chance_hud": TrapChanceHUD,
|
|
"trap_chance_ohko": TrapChanceOHKO,
|
|
"progression_balancing": SoEProgressionBalancing,
|
|
}
|