Files
Grinch-AP/worlds/shapez/options.py
BlastSlimey d5bacaba63 shapez: Implement New Game (#3960)
Adds shapez as a supported game in AP.
2025-05-21 14:30:39 +02:00

311 lines
12 KiB
Python

import pkgutil
from dataclasses import dataclass
import orjson
from Options import Toggle, Choice, PerGameCommonOptions, NamedRange, Range
from .common.options import FloatRangeText
datapackage_options = orjson.loads(pkgutil.get_data(__name__, "data/options.json"))
max_levels_and_upgrades = datapackage_options["max_levels_and_upgrades"]
max_shapesanity = datapackage_options["max_shapesanity"]
del datapackage_options
class Goal(Choice):
"""Sets the goal of your world.
- **Vanilla:** Complete level 26.
- **MAM:** Complete a specified level after level 26. Every level before that will be a location. It's recommended
to build a Make-Anything-Machine (MAM).
- **Even fasterer:** Upgrade everything to a specified tier after tier 8. Every upgrade before that will be a
location.
- **Efficiency III:** Deliver 256 blueprint shapes per second to the hub."""
display_name = "Goal"
rich_text_doc = True
option_vanilla = 0
option_mam = 1
option_even_fasterer = 2
option_efficiency_iii = 3
default = 0
class GoalAmount(NamedRange):
"""Specify, what level or tier (when either MAM or Even Fasterer is chosen as goal) is required to reach the goal.
If MAM is set as the goal, this has to be set to 27 or more. Else it will raise an error."""
display_name = "Goal amount"
rich_text_doc = True
range_start = 9
range_end = max_levels_and_upgrades
default = 27
special_range_names = {
"minimum_mam": 27,
"recommended_mam": 50,
"long_game_mam": 120,
"minimum_even_fasterer": 9,
"recommended_even_fasterer": 16,
"long_play_even_fasterer": 35,
}
class RequiredShapesMultiplier(Range):
"""Multiplies the amount of required shapes for levels and upgrades by value/10.
For level 1, the amount of shapes ranges from 3 to 300.
For level 26, it ranges from 5k to 500k."""
display_name = "Required shapes multiplier"
rich_text_doc = True
range_start = 1
range_end = 100
default = 10
class AllowFloatingLayers(Toggle):
"""Toggle whether shape requirements are allowed to have floating layers (like the logo or the rocket shape).
However, be aware that floating shapes make MAMs much more complex."""
display_name = "Allow floating layers"
rich_text_doc = True
default = False
class RandomizeLevelRequirements(Toggle):
"""Randomize the required shapes to complete levels."""
display_name = "Randomize level requirements"
rich_text_doc = True
default = True
class RandomizeUpgradeRequirements(Toggle):
"""Randomize the required shapes to buy upgrades."""
display_name = "Randomize upgrade requirements"
rich_text_doc = True
default = True
class RandomizeLevelLogic(Choice):
"""If level requirements are randomized, this sets how those random shapes are generated and how logic works for
levels. The shuffled variants shuffle the order of progression buildings obtained in the multiworld. The standard
order is: **cutter -> rotator -> painter -> color mixer -> stacker**
- **Vanilla:** Level 1 requires nothing, 2-4 require the first building, 5-6 require also the second, 7-8 the
third, 9-10 the fourth, and 11 and onwards the fifth and thereby all buildings.
- **Stretched:** After every floor(maxlevel/6) levels, another building is required.
- **Quick:** Every Level, except level 1, requires another building, with level 6 and onwards requiring all
buildings.
- **Random steps:** After a random amount of levels, another building is required, with level 1 always requiring
none. This can potentially generate like any other option.
- **Hardcore:** All levels (except level 1) have completely random shape requirements and thus require all
buildings. Expect early BKs.
- **Dopamine (overflow):** All levels (except level 1 and the goal) require 2 random buildings (or none in case of
overflow)."""
display_name = "Randomize level logic"
rich_text_doc = True
option_vanilla = 0
option_vanilla_shuffled = 1
option_stretched = 2
option_stretched_shuffled = 3
option_quick = 4
option_quick_shuffled = 5
option_random_steps = 6
option_random_steps_shuffled = 7
option_hardcore = 8
option_dopamine = 9
option_dopamine_overflow = 10
default = 2
class RandomizeUpgradeLogic(Choice):
"""If upgrade requirements are randomized, this sets how those random shapes are generated
and how logic works for upgrades.
- **Vanilla-like:** Tier II requires up to two random buildings, III requires up to three random buildings,
and IV and onwards require all processing buildings.
- **Linear:** Tier II requires nothing, III-VI require another random building each,
and VII and onwards require all buildings.
- **Category:** Belt and miner upgrades require no building up to tier V, but onwards all buildings, processors
upgrades require the cutter (all tiers), rotator (tier III and onwards), and stacker (tier V and onwards), and
painting upgrades require the cutter, rotator, stacker, painter (all tiers) and color mixer (tiers V and onwards).
Tier VII and onwards will always require all buildings.
- **Category random:** Each upgrades category (up to tier VI) requires a random amount of buildings (in order),
with one category always requiring no buildings. Tier VII and onwards will always require all buildings.
- **Hardcore:** All tiers (except each tier II) have completely random shape requirements and thus require all
buildings. Expect early BKs."""
display_name = "Randomize upgrade logic"
rich_text_doc = True
option_vanilla_like = 0
option_linear = 1
option_category = 2
option_category_random = 3
option_hardcore = 4
default = 1
class ThroughputLevelsRatio(NamedRange):
"""If level requirements are randomized, this sets the ratio of how many levels (approximately) will require either
a total amount or per second amount (throughput) of shapes delivered.
0 means only total, 100 means only throughput, and vanilla (-1) means only levels 14, 27 and beyond have throughput.
"""
display_name = "Throughput levels ratio"
rich_text_doc = True
range_start = 0
range_end = 100
default = 0
special_range_names = {
"vanilla": -1,
"only_total": 0,
"half_half": 50,
"only_throughput": 100,
}
class ComplexityGrowthGradient(FloatRangeText):
"""If level requirements are randomized, this determines how fast complexity will grow each level. In other words:
The higher you set this value, the more difficult lategame shapes will be.
Allowed values are floating numbers ranging from 0.0 to 10.0."""
display_name = "Complexity growth gradient"
rich_text_doc = True
range_start = 0.0
range_end = 10.0
default = "0.5"
class SameLateUpgradeRequirements(Toggle):
"""If upgrade requirements are randomized, should the last 3 shapes for each category be the same,
as in vanilla?"""
display_name = "Same late upgrade requirements"
rich_text_doc = True
default = True
class EarlyBalancerTunnelAndTrash(Choice):
"""Makes the balancer, tunnel, and trash appear in earlier spheres.
- **None:** Complete randomization.
- **5 buildings:** Should be accessible before getting all 5 main buildings.
- **3 buildings:** Should be accessible before getting the first 3 main buildings for levels and upgrades.
- **Sphere 1:** Always accessible from start. **Beware of generation failures.**"""
display_name = "Early balancer, tunnel, and trash"
rich_text_doc = True
option_none = 0
option_5_buildings = 1
option_3_buildings = 2
option_sphere_1 = 3
default = 2
class LockBeltAndExtractor(Toggle):
"""Locks Belts and Extractors and adds them to the item pool.
**If you set this to true, achievements must also be included.**"""
display_name = "Lock Belt and Extractor"
rich_text_doc = True
default = False
class IncludeAchievements(Toggle):
"""Include up to 45 achievements (depending on other options) as additional locations."""
display_name = "Include Achievements"
rich_text_doc = True
default = True
class ExcludeSoftlockAchievements(Toggle):
"""Exclude 6 achievements, that can become unreachable in a save file, if not achieved until a certain level."""
display_name = "Exclude softlock achievements"
rich_text_doc = True
default = True
class ExcludeLongPlaytimeAchievements(Toggle):
"""Exclude 2 achievements, that require actively playing for a really long time."""
display_name = "Exclude long playtime achievements"
rich_text_doc = True
default = True
class ExcludeProgressionUnreasonable(Toggle):
"""Exclude progression and useful items from being placed into softlock and long playtime achievements."""
display_name = "Exclude progression items in softlock and long playtime achievements"
rich_text_doc = True
default = True
class ShapesanityAmount(Range):
"""Amount of single-layer shapes that will be included as locations."""
display_name = "Shapesanity amount"
rich_text_doc = True
range_start = 4
range_end = max_shapesanity
default = 50
class TrapsProbability(NamedRange):
"""The probability of any filler item (in percent) being replaced by a trap."""
display_name = "Traps Percentage"
rich_text_doc = True
range_start = 0
range_end = 100
default = 0
special_range_names = {
"none": 0,
"rare": 4,
"occasionally": 10,
"maximum_suffering": 100,
}
class IncludeWhackyUpgrades(Toggle):
"""Includes some very unusual upgrade items in generation (and logic), that greatly increase or decrease building
speeds. If the goal is set to Efficiency III or throughput levels ratio is not 0, decreasing upgrades (aka traps)
will always be disabled."""
display_name = "Include Whacky Upgrades"
rich_text_doc = True
default = False
class SplitInventoryDrainingTrap(Toggle):
"""If set to true, the inventory draining trap will be split into level, upgrade, and blueprint draining traps
instead of executing as one of those 3 randomly."""
display_name = "Split Inventory Draining Trap"
rich_text_doc = True
default = False
class ToolbarShuffling(Toggle):
"""If set to true, the toolbars (main and wires layer) will be shuffled (including bottom and top row).
However, keybindings will still select the same building to place."""
display_name = "Toolbar Shuffling"
rich_text_doc = True
default = True
@dataclass
class ShapezOptions(PerGameCommonOptions):
goal: Goal
goal_amount: GoalAmount
required_shapes_multiplier: RequiredShapesMultiplier
allow_floating_layers: AllowFloatingLayers
randomize_level_requirements: RandomizeLevelRequirements
randomize_upgrade_requirements: RandomizeUpgradeRequirements
randomize_level_logic: RandomizeLevelLogic
randomize_upgrade_logic: RandomizeUpgradeLogic
throughput_levels_ratio: ThroughputLevelsRatio
complexity_growth_gradient: ComplexityGrowthGradient
same_late_upgrade_requirements: SameLateUpgradeRequirements
early_balancer_tunnel_and_trash: EarlyBalancerTunnelAndTrash
lock_belt_and_extractor: LockBeltAndExtractor
include_achievements: IncludeAchievements
exclude_softlock_achievements: ExcludeSoftlockAchievements
exclude_long_playtime_achievements: ExcludeLongPlaytimeAchievements
exclude_progression_unreasonable: ExcludeProgressionUnreasonable
shapesanity_amount: ShapesanityAmount
traps_percentage: TrapsProbability
include_whacky_upgrades: IncludeWhackyUpgrades
split_inventory_draining_trap: SplitInventoryDrainingTrap
toolbar_shuffling: ToolbarShuffling