Files
dockipelago/worlds/hades/Options.py
Jonathan Tinney 7971961166
Some checks failed
Analyze modified files / flake8 (push) Failing after 2m28s
Build / build-win (push) Has been cancelled
Build / build-ubuntu2204 (push) Has been cancelled
ctest / Test C++ ubuntu-latest (push) Has been cancelled
ctest / Test C++ windows-latest (push) Has been cancelled
Analyze modified files / mypy (push) Has been cancelled
Build and Publish Docker Images / Push Docker image to Docker Hub (push) Successful in 5m4s
Native Code Static Analysis / scan-build (push) Failing after 5m2s
type check / pyright (push) Successful in 1m7s
unittests / Test Python 3.11.2 ubuntu-latest (push) Failing after 16m23s
unittests / Test Python 3.12 ubuntu-latest (push) Failing after 28m19s
unittests / Test Python 3.13 ubuntu-latest (push) Failing after 14m49s
unittests / Test hosting with 3.13 on ubuntu-latest (push) Successful in 5m0s
unittests / Test Python 3.13 macos-latest (push) Has been cancelled
unittests / Test Python 3.11 windows-latest (push) Has been cancelled
unittests / Test Python 3.13 windows-latest (push) Has been cancelled
add schedule I, sonic 1/frontiers/heroes, spirit island
2026-04-02 23:46:36 -07:00

794 lines
24 KiB
Python

from dataclasses import dataclass
from typing import Dict, Any
from Options import Range, Toggle, DeathLink, Choice, StartInventoryPool, PerGameCommonOptions, OptionGroup, \
DefaultOnToggle
# -----------------------Settings for Gameplay decisions ---------------
class InitialWeapon(Choice):
"""
Chooses your initial weapon. Note you are not be able to equip the sword in the weapon hub in WeaponSanity until
you unlock it.
"""
display_name = "Weapon"
option_Sword = 0
option_Bow = 1
option_Spear = 2
option_Shield = 3
option_Fist = 4
option_Gun = 5
class LocationSystem(Choice):
"""
Chooses how the game gives you items. (1) RoomBased gives items on every new room completed. (2) ScoreBased
gives items according to score obtained by clearing rooms (even repeated ones). For example; each time the player
completes room 4 it will award 4 points. Getting a new high-score gives an item and resets the score.
(3) RoomWeaponBased gives items on every new room completed with a new weapon (so more locations than the
original room based system).
"""
display_name = "Location System"
option_room_based = 1
option_score_based = 2
option_room_weapon_based = 3
default = 1
class ScoreRewardsAmount(Range):
"""
When using score based system, this sets how many checks are available based on the score.
Each room in hades gives "its depth" in score when completed, and each new check needs one more
point to be unlocked (so check 10 needs 10 points, which can be obtained, for example,
by completing rooms 5 and 6)
"""
display_name = "ScoreRewardsAmount"
range_start = 72
range_end = 1000
default = 150
class KeepsakeSanity(DefaultOnToggle):
"""
Shuffles NPCs' keepsakes into the item pool, and makes each keepsake location a check.
For simplicity this does not affects Hades and Persephone.
"""
display_name = "KeepsakeSanity"
class WeaponSanity(DefaultOnToggle):
"""
Shuffles weapons (except your initial weapon) into the item pool, and makes obtaining
each weapon at the House Contractor's shop a check.
Need to be sent the weapon item to gain the skill to equip them.
"""
display_name = "WeaponSanity"
class HiddenAspectSanity(DefaultOnToggle):
"""
Shuffles weapon aspects into the item pool, and makes obtaining each aspect a check
(which needs to be unlocked before being able to be bought).
"""
display_name = "HiddenAspectSanity"
class StoreSanity(DefaultOnToggle):
"""
Shuffles important items from the House Contractor's shop in the item pool.
Need to be sent the items to gain the different perks that make runs easier.
"""
display_name = "StoreSanity"
class FateSanity(DefaultOnToggle):
"""
Shuffles most rewards from the Fated List of Prophecies into the item pool,
and makes the corresponding items from the list a check.
Can make the games significantly longer.
"""
display_name = "FateSanity"
# -------------------- Endgame settings
class HadesDefeatsNeeded(Range):
"""
How many times you need to defeat Hades to win the world. 10 is for credits.
"""
display_name = "HadesDefeatsNeeded"
range_start = 1
range_end = 20
default = 1
class WeaponsClearsNeeded(Range):
"""
How many different weapons clears are needed to win the world.
"""
display_name = "WeaponsClearsNeeded"
range_start = 1
range_end = 6
default = 1
class KeepsakesNeeded(Range):
"""
How many different keepsake unlocks are needed to win the world.
"""
display_name = "KeepsakesNeeded"
range_start = 0
range_end = 23
default = 0
class FatesNeeded(Range):
"""
How many different Fated List completions are needed to win the world.
"""
display_name = "FatesNeeded"
range_start = 0
range_end = 52
default = 0
# -----------------------Settings for Pact levels ---------------
class HeatSystem(Choice):
"""
Choose either ReverseHeat (1), MinimalHeat (2) or VanillaHeat(3) for the game.
In ReverseHeat you start with heat pacts that cannot be disabled until you get the corresponding pact item.
In Minimal the settings for the PactsAmounts below set your minimal heat to be set, and cannot go below that level.
If not wanting to have one of this heat systems on, chose Vanilla heat
(then the following options related to pacts do nothing).
"""
display_name = "Heat System"
option_reverse_heat = 1
option_minimal_heat = 2
option_vanilla_heat = 3
default = 1
class HardLaborPactAmount(Range):
"""
Choose the amount of Hard Labor pacts in the pool.
"""
display_name = "Hard Labor Pact Amount"
range_start = 0
range_end = 5
default = 3
class LastingConsequencesPactAmount(Range):
"""
Choose the amount of Lasting Consequences pacts in the pool.
"""
display_name = "Lasting Consequences Pact Amount"
range_start = 0
range_end = 4
default = 2
class ConvenienceFeePactAmount(Range):
"""
Choose the amount of Convenience Fee pacts in the pool.
"""
display_name = "Convenience Fee Pact Amount"
range_start = 0
range_end = 2
default = 1
class JurySummonsPactAmount(Range):
"""
Choose the amount of Jury Summons pacts in the pool.
"""
display_name = "Jury Summons Pact Amount"
range_start = 0
range_end = 3
default = 2
class ExtremeMeasuresPactAmount(Range):
"""
Choose the amount of Extreme Measures pacts in the pool.
"""
display_name = "Extreme Measures Pact Amount"
range_start = 0
range_end = 4
default = 2
class CalisthenicsProgramPactAmount(Range):
"""
Choose the amount of Calisthenics Program pacts in the pool.
"""
display_name = "Calisthenics Program Pact Amount"
range_start = 0
range_end = 2
default = 1
class BenefitsPackagePactAmount(Range):
"""
Choose the amount of Benefits Package pacts in the pool.
"""
display_name = "Benefits Package Pact Amount"
range_start = 0
range_end = 2
default = 1
class MiddleManagementPactAmount(Range):
"""
Choose the amount of Middle Management pacts in the pool.
"""
display_name = "Middle Management Pact Amount"
range_start = 0
range_end = 1
default = 1
class UnderworldCustomsPactAmount(Range):
"""
Choose the amount of Underworld Customs pacts in the pool.
"""
display_name = "Underworld Customs Pact Amount"
range_start = 0
range_end = 1
default = 1
class ForcedOvertimePactAmount(Range):
"""
Choose the amount of Forced Overtime pacts in the pool.
"""
display_name = "Forced Overtime Pact Amount"
range_start = 0
range_end = 2
default = 1
class HeightenedSecurityPactAmount(Range):
"""
Choose the amount of Heightened Security pacts in the pool.
"""
display_name = "Heightened Security Pact Amount"
range_start = 0
range_end = 1
default = 1
class RoutineInspectionPactAmount(Range):
"""
Choose the amount of Routine Inspection pacts in the pool.
"""
display_name = "Routine Inspection Pact Amount"
range_start = 0
range_end = 4
default = 3
class DamageControlPactAmount(Range):
"""
Choose the amount of Damage Control pacts in the pool.
"""
display_name = "Damage Control Pact Amount"
range_start = 0
range_end = 2
default = 1
class ApprovalProcessPactAmount(Range):
"""
Choose the amount of Approval Process pacts in the pool.
"""
display_name = "Approval Process Pact Amount"
range_start = 0
range_end = 2
default = 1
class TightDeadlinePactAmount(Range):
"""
Choose the amount of Tight Deadline pacts in the pool.
"""
display_name = "Tight Deadline Pact Amount"
range_start = 0
range_end = 3
default = 2
class PersonalLiabilityPactAmount(Range):
"""
Choose the amount of Personal Liability pacts in the pool.
"""
display_name = "Personal Liability Pact Amount"
range_start = 0
range_end = 1
default = 0
# -----------------------Settings for Filler items ---------------
class DarknessPackValue(Range):
"""
Choose the value (amount of darkness) of each darkness pack in the pool.
If set to 0 Darkness will not appear in the pool.
"""
display_name = "Darkness Pack Value"
range_start = 0
range_end = 10000
default = 1000
class DarknessPackPercentage(Range):
"""
Choose the percentage of filler items in the pool that will be darkness packs.
Note if filler porcentage don't sum up to 100 the system will treat them as proportions.
"""
display_name = "Darkness Pack Percentage"
range_start = 0
range_end = 100
default = 10
class KeysPackValue(Range):
"""
Choose the value(amount of Keys) of each Keys pack in the pool.
If set to 0 Keys will not appear in the pool.
"""
display_name = "Keys Pack Value"
range_start = 0
range_end = 500
default = 20
class KeysPackPercentage(Range):
"""
Choose the percentage of filler items in the pool that will be Key packs.
Note if filler porcentage don't sum up to 100 the system will treat them as proportions.
"""
display_name = "Keys Pack Percentage"
range_start = 0
range_end = 100
default = 10
class GemstonesPackValue(Range):
"""
Choose the value(amount of Gemstones) of each Gemstone pack in the pool.
If set to 0 Gems will not appear in the pool.
"""
display_name = "Gemstone Pack Value"
range_start = 0
range_end = 2500
default = 100
class GemstonesPackPercentage(Range):
"""
Choose the percentage of filler items in the pool that will be Gemstones packs.
Note if filler porcentage don't sum up to 100 the system will treat them as proportions.
"""
display_name = "Gemstones Pack Percentage"
range_start = 0
range_end = 1000
default = 10
class DiamondsPackValue(Range):
"""
Choose the value(amount of diamonds) of each diamond pack in the pool.
If set to 0 Diamonds will not appear in the pool.
"""
display_name = "Diamonds Pack Value"
range_start = 0
range_end = 100
default = 15
class DiamondsPackPercentage(Range):
"""
Choose the percentage of filler items in the pool that will be Gemstones packs.
Note if filler porcentage don't sum up to 100 the system will treat them as proportions.
"""
display_name = "Diamonds Pack Percentage"
range_start = 0
range_end = 100
default = 10
class TitanBloodPackValue(Range):
"""
Choose the value(amount of Titan blood) of each Titan blood pack in the pool.
If set to 0 Titan blood will not appear in the pool.
"""
display_name = "Titan Blood Pack Value"
range_start = 0
range_end = 50
default = 3
class TitanBloodPackPercentage(Range):
"""
Choose the percentage of filler items in the pool that will be Titan Blood packs.
Note if filler porcentage don't sum up to 100 the system will treat them as proportions.
"""
display_name = "TitanBlood Pack Percentage"
range_start = 0
range_end = 100
default = 10
class NectarPackValue(Range):
"""
Choose the value(amount of Nectar) of each Nectar pack in the pool.
If set to 0 Nectar will not appear in the pool.
"""
display_name = "Nectar Pack Value"
range_start = 0
range_end = 50
default = 3
class NectarPackPercentage(Range):
"""
Choose the percentage of filler items in the pool that will be Nectar packs.
Note if filler porcentage don't sum up to 100 the system will treat them as proportions.
"""
display_name = "Nectar Pack Percentage"
range_start = 0
range_end = 100
default = 10
class AmbrosiaPackValue(Range):
"""
Choose the value(amount of Ambrosia) of each Ambrosia pack in the pool.
If set to 0 Ambrosia will not appear in the pool.
"""
display_name = "Ambrosia Pack Value"
range_start = 0
range_end = 50
default = 3
class AmbrosiaPackPercentage(Range):
"""
Choose the percentage of filler items in the pool that will be Ambrosia packs.
Note if filler porcentage don't sum up to 100 the system will treat them as proportions.
"""
display_name = "Ambrosia Pack Percentage"
range_start = 0
range_end = 100
default = 10
# -----------------------Settings for Helpers -------------------------
class FillerHelperPercentage(Range):
"""
Choose the percentage of filler items in the pool that will be helpers instead.
Helpers give a boost to your max Health or boost the chance of obtaining rare Boons.
Note if filler porcentage don't sum up to 100 the system will treat them as proportions.
"""
display_name = "Filler Helper Percentage"
range_start = 0
range_end = 100
default = 0
class MaxHealthHelperPercentage(Range):
"""
Choose the percentage of helper items that will boost your max health.
"""
display_name = "Max Health Helper Percentage"
range_start = 0
range_end = 100
default = 35
class InitialMoneyHelperPercentage(Range):
"""
Choose the percentage of helper items that will boost your initial money by 25 each run.
This gets capped by the percentage being left from the MaxHealthHelpers.
What percentage remains from this and the MaxHealthHelpers will give you items that boost the
rarity of the boons obtained in runs.
"""
display_name = "Initial Money Helper Percentage"
range_start = 0
range_end = 100
default = 35
# -----------------------Settings for Trap -------------------------
class FillerTrapPercentage(Range):
"""
Choose the percentage of filler items in the pool that will be traps instead.
Traps diminish your money or health during a run.
Note if filler porcentage don't sum up to 100 the system will treat them as proportions.
"""
display_name = "Filler Trap Percentage"
range_start = 0
range_end = 100
default = 5
# -----------------------Settings for QoL -------------------------
class ReverseOrderExtremeMeasure(DefaultOnToggle):
"""
When true the order in which extreme meassures applied is reverse
so level 1 is applied to Hades, instead to Meg/The Furies).
For a more balanced experience.
"""
display_name = "Reverse Order Extreme Measure"
class IgnoreGreeceDeaths(DefaultOnToggle):
"""
If deaths on Greece are ignored for deathlink. Leave off for the memes.
"""
display_name = "Ignore Greece Deaths"
class StoreGiveHints(DefaultOnToggle):
"""
If seeing an item on the House Contractor's shop/Fated List of Prophecies
should give a hint for it on the multiworld.
"""
display_name = "Store Give Hints"
class DisableLateStyx(Toggle):
"""
If true, rooms past room 55 will not have checks on room based settings.
"""
display_name = "Disable Late Styx"
default = 0
class AutomaticRoomsFinishOnHadesDefeat(Toggle):
"""
If defeating Hades should give all room clears on Room based location mode
or all rooms clears with the equipped weapon on Room weapon based location mode.
"""
display_name = "Automatic Room Finish On Hades Defeat"
default = 0
# ------------------------------ Building dictionary ------------------------
@dataclass
class HadesOptions(PerGameCommonOptions):
start_inventory_from_pool: StartInventoryPool
initial_weapon: InitialWeapon
location_system: LocationSystem
score_rewards_amount: ScoreRewardsAmount
keepsakesanity: KeepsakeSanity
weaponsanity: WeaponSanity
hidden_aspectsanity: HiddenAspectSanity
storesanity: StoreSanity
fatesanity: FateSanity
hades_defeats_needed: HadesDefeatsNeeded
weapons_clears_needed: WeaponsClearsNeeded
keepsakes_needed: KeepsakesNeeded
fates_needed: FatesNeeded
heat_system: HeatSystem
hard_labor_pact_amount: HardLaborPactAmount
lasting_consequences_pact_amount: LastingConsequencesPactAmount
convenience_fee_pact_amount: ConvenienceFeePactAmount
jury_summons_pact_amount: JurySummonsPactAmount
extreme_measures_pact_amount: ExtremeMeasuresPactAmount
calisthenics_program_pact_amount: CalisthenicsProgramPactAmount
benefits_package_pact_amount: BenefitsPackagePactAmount
middle_management_pact_amount: MiddleManagementPactAmount
underworld_customs_pact_amount: UnderworldCustomsPactAmount
forced_overtime_pact_amount: ForcedOvertimePactAmount
heightened_security_pact_amount: HeightenedSecurityPactAmount
routine_inspection_pact_amount: RoutineInspectionPactAmount
damage_control_pact_amount: DamageControlPactAmount
approval_process_pact_amount: ApprovalProcessPactAmount
tight_deadline_pact_amount: TightDeadlinePactAmount
personal_liability_pact_amount: PersonalLiabilityPactAmount
darkness_pack_value: DarknessPackValue
darkness_pack_percentage: DarknessPackPercentage
keys_pack_value: KeysPackValue
keys_pack_percentage: KeysPackPercentage
gemstones_pack_value: GemstonesPackValue
gemstones_pack_percentage: GemstonesPackPercentage
diamonds_pack_value: DiamondsPackValue
diamonds_pack_percentage: DiamondsPackPercentage
titan_blood_pack_value: TitanBloodPackValue
titan_blood_pack_percentage: TitanBloodPackPercentage
nectar_pack_value: NectarPackValue
nectar_pack_percentage: NectarPackPercentage
ambrosia_pack_value: AmbrosiaPackValue
ambrosia_pack_percentage: AmbrosiaPackPercentage
filler_helper_percentage: FillerHelperPercentage
max_health_helper_percentage: MaxHealthHelperPercentage
initial_money_helper_percentage: InitialMoneyHelperPercentage
filler_trap_percentage: FillerTrapPercentage
reverse_order_em: ReverseOrderExtremeMeasure
ignore_greece_deaths: IgnoreGreeceDeaths
store_give_hints: StoreGiveHints
disable_late_styx : DisableLateStyx
automatic_rooms_finish_on_hades_defeat: AutomaticRoomsFinishOnHadesDefeat
death_link: DeathLink
# ------------------------------ Options groups
hades_option_groups = [
OptionGroup("Game Options", [
InitialWeapon,
LocationSystem,
ScoreRewardsAmount,
KeepsakeSanity,
WeaponSanity,
HiddenAspectSanity,
StoreSanity,
FateSanity,
DeathLink,
]),
OptionGroup("Goal Options", [
HadesDefeatsNeeded,
WeaponsClearsNeeded,
KeepsakesNeeded,
FatesNeeded,
]),
OptionGroup("Heat Options", [
HeatSystem,
HardLaborPactAmount,
LastingConsequencesPactAmount,
ConvenienceFeePactAmount,
JurySummonsPactAmount,
ExtremeMeasuresPactAmount,
CalisthenicsProgramPactAmount,
BenefitsPackagePactAmount,
MiddleManagementPactAmount,
UnderworldCustomsPactAmount,
ForcedOvertimePactAmount,
HeightenedSecurityPactAmount,
RoutineInspectionPactAmount,
DamageControlPactAmount,
ApprovalProcessPactAmount,
TightDeadlinePactAmount,
PersonalLiabilityPactAmount,
]),
OptionGroup("Filler Options", [
DarknessPackValue,
DarknessPackPercentage,
KeysPackValue,
KeysPackPercentage,
GemstonesPackValue,
GemstonesPackPercentage,
DiamondsPackValue,
DiamondsPackPercentage,
TitanBloodPackValue,
TitanBloodPackPercentage,
NectarPackValue,
NectarPackPercentage,
AmbrosiaPackValue,
AmbrosiaPackPercentage,
]),
OptionGroup("Helpers and Trap Options", [
FillerHelperPercentage,
MaxHealthHelperPercentage,
InitialMoneyHelperPercentage,
FillerTrapPercentage,
]),
OptionGroup("Quality of Life Options", [
ReverseOrderExtremeMeasure,
IgnoreGreeceDeaths,
StoreGiveHints,
DisableLateStyx,
AutomaticRoomsFinishOnHadesDefeat
]),
]
# ------------------------------ Presets
hades_option_presets: Dict[str, Dict[str, Any]] = {
"Easy": {
"score_rewards_amount": 100,
"hidden_aspectsanity": False,
"fatesanity": False,
"heat_system": "reverse_heat",
"hard_labor_pact_amount": 2,
"lasting_consequences_pact_amount": 1,
"convenience_fee_pact_amount": 1,
"jury_summons_pact_amount": 1,
"extreme_measures_pact_amount": 0,
"calisthenics_program_pact_amount": 1,
"benefits_package_pact_amount": 1,
"middle_management_pact_amount": 1,
"underworld_customs_pact_amount": 1,
"forced_overtime_pact_amount": 1,
"heightened_security_pact_amount": 1,
"routine_inspection_pact_amount": 1,
"damage_control_pact_amount": 1,
"approval_process_pact_amount": 1,
"tight_deadline_pact_amount": 0,
"personal_liability_pact_amount": 0,
"darkness_pack_value": 500,
"keys_pack_value": 10,
"gemstones_pack_value": 50,
"diamonds_pack_value": 3,
"titan_blood_pack_value": 3,
"nectar_pack_value": 3,
"ambrosia_pack_value": 3,
"filler_helper_percentage": 10,
"max_health_helper_percentage": 40,
"initial_money_helper_percentage": 30,
"filler_trap_percentage": 0,
"disable_late_styx" : True,
"automatic_rooms_finish_on_hades_defeat": True,
},
"Normal": {
"score_rewards_amount": 100,
"hidden_aspectsanity": True,
"fatesanity": False,
"heat_system": "reverse_heat",
"hard_labor_pact_amount": 3,
"lasting_consequences_pact_amount": 2,
"convenience_fee_pact_amount": 1,
"jury_summons_pact_amount": 2,
"extreme_measures_pact_amount": 2,
"calisthenics_program_pact_amount": 1,
"benefits_package_pact_amount": 1,
"middle_management_pact_amount": 1,
"underworld_customs_pact_amount": 1,
"forced_overtime_pact_amount": 1,
"heightened_security_pact_amount": 1,
"routine_inspection_pact_amount": 3,
"damage_control_pact_amount": 1,
"approval_process_pact_amount": 1,
"tight_deadline_pact_amount": 2,
"personal_liability_pact_amount": 0,
"darkness_pack_value": 300,
"keys_pack_value": 5,
"gemstones_pack_value": 25,
"diamonds_pack_value": 2,
"titan_blood_pack_value": 2,
"nectar_pack_value": 2,
"ambrosia_pack_value": 2,
"filler_helper_percentage": 0,
"filler_trap_percentage": 5,
"disable_late_styx" : True,
"automatic_rooms_finish_on_hades_defeat": True,
},
"Hard": {
"score_rewards_amount": 100,
"hidden_aspectsanity": True,
"fatesanity": True,
"heat_system": "reverse_heat",
"hard_labor_pact_amount": 5,
"lasting_consequences_pact_amount": 4,
"convenience_fee_pact_amount": 2,
"jury_summons_pact_amount": 3,
"extreme_measures_pact_amount": 4,
"calisthenics_program_pact_amount": 2,
"benefits_package_pact_amount": 2,
"middle_management_pact_amount": 1,
"underworld_customs_pact_amount": 1,
"forced_overtime_pact_amount": 2,
"heightened_security_pact_amount": 1,
"routine_inspection_pact_amount": 4,
"damage_control_pact_amount": 2,
"approval_process_pact_amount": 2,
"tight_deadline_pact_amount": 3,
"personal_liability_pact_amount": 1,
"darkness_pack_value": 200,
"keys_pack_value": 3,
"gemstones_pack_value": 10,
"diamonds_pack_value": 1,
"titan_blood_pack_value": 1,
"nectar_pack_value": 1,
"ambrosia_pack_value": 1,
"filler_helper_percentage": 0,
"filler_trap_percentage": 10,
"disable_late_styx" : False,
"automatic_rooms_finish_on_hades_defeat": False,
},
}