SA2B: v2.3 - The Chao Update (#2277)

Changelog:

Features:
- New goal
  - Chaos Chao
    - Raise a Chaos Chao to win!
- New optional Location Checks
  - Chao Animal Parts
    - Each body part from each type of animal is a location
  - Chao Stats
    - 0-99 levels of each of the 7 Chao stats can be locations
    - The frequency of Chao Stat locations can be set (every level, every 2nd level, etc)
  - Kindergartensanity
    - Classroom lessons are locations
      - Either all lessons or any one of each category can be set as locations
  - Shopsanity
    - A specified number of locations can be placed in the Chao Black Market
    - These locations are unlocked by acquiring `Chao Coin`s
    - Ring costs for these items can be adjusted 
  - Chao Karate can now be set to one location per fight, instead of one per tournament
- Items
  - If any Chao locations are active, the following will be in the item pool:
    - Chao Eggs
    - Garden Seeds
    - Garden Fruit
    - Chao Hats
    - Chaos Drives
- The starting eggs in the garden can be a random color
- Chao World entrances can be shuffled
- Chao are given default names
- New Traps
  - Reverse Trap

Quality of Life:
- Chao Save Data is now separate per-slot in addition to per-seed
  - This allows a single player to have multiple slots in the same seed, each having separate Chao progress
- Chao Race/Karate progress is now displayed on Stage Select (when hovering over Chao World)
- All Chao can now enter the Hero and Dark races
- Chao Karate difficulty can be set separately from Chao Race difficulty
- Chao Aging can be sped up at will, up to 15×
- New mod `config` option to fine-tune Chao Stat multiplication
  - Note: This does not mix well with the Mod Manager "`Chao Stat Multiplier`" code
- Pong Traps can now activate in Chao World
- Maximum range for possible number of Emblems is now 1000
- General APWorld cleanup and optimization
  - Option access has moved to the new options system
  - An item group now exists for trap items

Bug Fixes:
- Dry Lagoon now has all 11 Animals
- Eternal Engine - 2 (Standard and Hard Logic) now requires only `Tails - Booster`
- Lost Colony - 2 (Hard Logic) now requires no upgrades
- Lost Colony - Animal 9 (Hard Logic) now requires either `Eggman - Jet Engine` or `Eggman - Large Cannon`
This commit is contained in:
PoryGone
2023-11-16 02:08:38 -05:00
committed by GitHub
parent 829c664304
commit 85d02b2dc5
12 changed files with 3581 additions and 1326 deletions

View File

@@ -13,6 +13,7 @@ class Goal(Choice):
Boss Rush: Beat all of the bosses in the Boss Rush, ending with Finalhazard
Cannon's Core Boss Rush: Beat Cannon's Core, then beat all of the bosses in the Boss Rush, ending with Finalhazard
Boss Rush Chaos Emerald Hunt: Find the Seven Chaos Emeralds, then beat all of the bosses in the Boss Rush, ending with Finalhazard
Chaos Chao: Raise a Chaos Chao to win
"""
display_name = "Goal"
option_biolizard = 0
@@ -22,6 +23,7 @@ class Goal(Choice):
option_boss_rush = 4
option_cannons_core_boss_rush = 5
option_boss_rush_chaos_emerald_hunt = 6
option_chaos_chao = 7
default = 0
@classmethod
@@ -70,74 +72,81 @@ class BaseTrapWeight(Choice):
class OmochaoTrapWeight(BaseTrapWeight):
"""
Likelihood of a receiving a trap which spawns several Omochao around the player
Likelihood of receiving a trap which spawns several Omochao around the player
"""
display_name = "OmoTrap Weight"
class TimestopTrapWeight(BaseTrapWeight):
"""
Likelihood of a receiving a trap which briefly stops time
Likelihood of receiving a trap which briefly stops time
"""
display_name = "Chaos Control Trap Weight"
class ConfusionTrapWeight(BaseTrapWeight):
"""
Likelihood of a receiving a trap which causes the controls to be skewed for a period of time
Likelihood of receiving a trap which causes the controls to be skewed for a period of time
"""
display_name = "Confusion Trap Weight"
class TinyTrapWeight(BaseTrapWeight):
"""
Likelihood of a receiving a trap which causes the player to become tiny
Likelihood of receiving a trap which causes the player to become tiny
"""
display_name = "Tiny Trap Weight"
class GravityTrapWeight(BaseTrapWeight):
"""
Likelihood of a receiving a trap which increases gravity
Likelihood of receiving a trap which increases gravity
"""
display_name = "Gravity Trap Weight"
class ExpositionTrapWeight(BaseTrapWeight):
"""
Likelihood of a receiving a trap which tells you the story
Likelihood of receiving a trap which tells you the story
"""
display_name = "Exposition Trap Weight"
class DarknessTrapWeight(BaseTrapWeight):
"""
Likelihood of a receiving a trap which makes the world dark
Likelihood of receiving a trap which makes the world dark
"""
display_name = "Darkness Trap Weight"
class IceTrapWeight(BaseTrapWeight):
"""
Likelihood of a receiving a trap which makes the world slippery
Likelihood of receiving a trap which makes the world slippery
"""
display_name = "Ice Trap Weight"
class SlowTrapWeight(BaseTrapWeight):
"""
Likelihood of a receiving a trap which makes you gotta go slow
Likelihood of receiving a trap which makes you gotta go slow
"""
display_name = "Slow Trap Weight"
class CutsceneTrapWeight(BaseTrapWeight):
"""
Likelihood of a receiving a trap which makes you watch an unskippable cutscene
Likelihood of receiving a trap which makes you watch an unskippable cutscene
"""
display_name = "Cutscene Trap Weight"
class ReverseTrapWeight(BaseTrapWeight):
"""
Likelihood of receiving a trap which reverses your controls
"""
display_name = "Reverse Trap Weight"
class PongTrapWeight(BaseTrapWeight):
"""
Likelihood of receiving a trap which forces you to play a Pong minigame
@@ -219,7 +228,7 @@ class Omosanity(Toggle):
class Animalsanity(Toggle):
"""
Determines whether picking up counted small animals grants checks
(420 Locations)
(421 Locations)
"""
display_name = "Animalsanity"
@@ -291,7 +300,7 @@ class MaximumEmblemCap(Range):
"""
display_name = "Max Emblem Cap"
range_start = 50
range_end = 500
range_end = 1000
default = 180
@@ -308,15 +317,15 @@ class RequiredRank(Choice):
default = 0
class ChaoGardenDifficulty(Choice):
class ChaoRaceDifficulty(Choice):
"""
Determines the number of chao garden difficulty levels included. Easier difficulty settings means fewer chao garden checks
None: No Chao Garden Activities have checks
Determines the number of Chao Race difficulty levels included. Easier difficulty settings means fewer Chao Race checks
None: No Chao Races have checks
Beginner: Beginner Races
Intermediate: Beginner, Challenge, Hero, and Dark Races
Expert: Beginner, Challenge, Hero, Dark and Jewel Races
"""
display_name = "Chao Garden Difficulty"
display_name = "Chao Race Difficulty"
option_none = 0
option_beginner = 1
option_intermediate = 2
@@ -324,26 +333,138 @@ class ChaoGardenDifficulty(Choice):
default = 0
class IncludeChaoKarate(Toggle):
class ChaoKarateDifficulty(Choice):
"""
Determines whether the Chao Karate should be included as checks (Note: This setting requires purchase of the "Battle" DLC)
Determines the number of Chao Karate difficulty levels included. (Note: This setting requires purchase of the "Battle" DLC)
"""
display_name = "Include Chao Karate"
display_name = "Chao Karate Difficulty"
option_none = 0
option_beginner = 1
option_standard = 2
option_expert = 3
option_super = 4
default = 0
class ChaoRaceChecks(Choice):
class ChaoStadiumChecks(Choice):
"""
Determines which Chao Races grant checks
All: Each individual race grants a check
Determines which Chao Stadium activities grant checks
All: Each individual race and karate fight grants a check
Prize: Only the races which grant Chao Toys grant checks (final race of each Beginner and Jewel cup, 4th, 8th, and
12th Challenge Races, 2nd and 4th Hero and Dark Races)
12th Challenge Races, 2nd and 4th Hero and Dark Races, final fight of each Karate difficulty)
"""
display_name = "Chao Race Checks"
display_name = "Chao Stadium Checks"
option_all = 0
option_prize = 1
default = 0
class ChaoStats(Range):
"""
Determines the highest level in each Chao Stat that grants checks
(Swim, Fly, Run, Power)
"""
display_name = "Chao Stats"
range_start = 0
range_end = 99
default = 0
class ChaoStatsFrequency(Range):
"""
Determines how many levels in each Chao Stat grant checks (up to the maximum set in the `chao_stats` option)
`1` means every level is included, `2` means every other level is included, `3` means every third, and so on
"""
display_name = "Chao Stats Frequency"
range_start = 1
range_end = 20
default = 5
class ChaoStatsStamina(Toggle):
"""
Determines whether Stamina is included in the `chao_stats` option
"""
display_name = "Chao Stats - Stamina"
class ChaoStatsHidden(Toggle):
"""
Determines whether the hidden stats (Luck and Intelligence) are included in the `chao_stats` option
"""
display_name = "Chao Stats - Luck and Intelligence"
class ChaoAnimalParts(Toggle):
"""
Determines whether giving Chao various animal parts grants checks
(73 Locations)
"""
display_name = "Chao Animal Parts"
class ChaoKindergarten(Choice):
"""
Determines whether learning the lessons from the Kindergarten Classroom grants checks
(WARNING: VERY SLOW)
None: No Kindergarten classes have checks
Basics: One class from each category (Drawing, Dance, Song, and Instrument) is a check (4 Locations)
Full: Every class is a check (23 Locations)
"""
display_name = "Chao Kindergarten Checks"
option_none = 0
option_basics = 1
option_full = 2
default = 0
class BlackMarketSlots(Range):
"""
Determines how many multiworld items are available to purchase from the Black Market
"""
display_name = "Black Market Slots"
range_start = 0
range_end = 64
default = 0
class BlackMarketUnlockCosts(Choice):
"""
Determines how many Chao Coins are required to unlock sets of Black Market items
"""
display_name = "Black Market Unlock Costs"
option_low = 0
option_medium = 1
option_high = 2
default = 1
class BlackMarketPriceMultiplier(Range):
"""
Determines how many rings the Black Market items cost
The base ring costs of items in the Black Market range from 50-100,
and are then multiplied by this value
"""
display_name = "Black Market Price Multiplier"
range_start = 0
range_end = 40
default = 1
class ShuffleStartingChaoEggs(DefaultOnToggle):
"""
Determines whether the starting Chao eggs in the gardens are random
"""
display_name = "Shuffle Starting Chao Eggs"
class ChaoEntranceRandomization(Toggle):
"""
Determines whether entrances in Chao World are randomized
"""
display_name = "Chao Entrance Randomization"
class RequiredCannonsCoreMissions(Choice):
"""
Determines how many Cannon's Core missions must be completed (for Biolizard or Cannon's Core goals)
@@ -657,24 +778,42 @@ class LogicDifficulty(Choice):
sa2b_options: typing.Dict[str, type(Option)] = {
"goal": Goal,
"mission_shuffle": MissionShuffle,
"boss_rush_shuffle": BossRushShuffle,
"keysanity": Keysanity,
"whistlesanity": Whistlesanity,
"beetlesanity": Beetlesanity,
"omosanity": Omosanity,
"animalsanity": Animalsanity,
"kart_race_checks": KartRaceChecks,
"logic_difficulty": LogicDifficulty,
"required_rank": RequiredRank,
"emblem_percentage_for_cannons_core": EmblemPercentageForCannonsCore,
"required_cannons_core_missions": RequiredCannonsCoreMissions,
"emblem_percentage_for_cannons_core": EmblemPercentageForCannonsCore,
"number_of_level_gates": NumberOfLevelGates,
"level_gate_distribution": LevelGateDistribution,
"level_gate_costs": LevelGateCosts,
"max_emblem_cap": MaximumEmblemCap,
"chao_garden_difficulty": ChaoGardenDifficulty,
"include_chao_karate": IncludeChaoKarate,
"chao_race_checks": ChaoRaceChecks,
"chao_race_difficulty": ChaoRaceDifficulty,
"chao_karate_difficulty": ChaoKarateDifficulty,
"chao_stadium_checks": ChaoStadiumChecks,
"chao_stats": ChaoStats,
"chao_stats_frequency": ChaoStatsFrequency,
"chao_stats_stamina": ChaoStatsStamina,
"chao_stats_hidden": ChaoStatsHidden,
"chao_animal_parts": ChaoAnimalParts,
"chao_kindergarten": ChaoKindergarten,
"black_market_slots": BlackMarketSlots,
"black_market_unlock_costs": BlackMarketUnlockCosts,
"black_market_price_multiplier": BlackMarketPriceMultiplier,
"shuffle_starting_chao_eggs": ShuffleStartingChaoEggs,
"chao_entrance_randomization": ChaoEntranceRandomization,
"junk_fill_percentage": JunkFillPercentage,
"trap_fill_percentage": TrapFillPercentage,
"omochao_trap_weight": OmochaoTrapWeight,
@@ -687,39 +826,46 @@ sa2b_options: typing.Dict[str, type(Option)] = {
"ice_trap_weight": IceTrapWeight,
"slow_trap_weight": SlowTrapWeight,
"cutscene_trap_weight": CutsceneTrapWeight,
"reverse_trap_weight": ReverseTrapWeight,
"pong_trap_weight": PongTrapWeight,
"minigame_trap_difficulty": MinigameTrapDifficulty,
"ring_loss": RingLoss,
"ring_link": RingLink,
"sadx_music": SADXMusic,
"music_shuffle": MusicShuffle,
"voice_shuffle": VoiceShuffle,
"narrator": Narrator,
"logic_difficulty": LogicDifficulty,
"ring_loss": RingLoss,
"speed_mission_count": SpeedMissionCount,
"speed_mission_2": SpeedMission2,
"speed_mission_3": SpeedMission3,
"speed_mission_4": SpeedMission4,
"speed_mission_5": SpeedMission5,
"mech_mission_count": MechMissionCount,
"mech_mission_2": MechMission2,
"mech_mission_3": MechMission3,
"mech_mission_4": MechMission4,
"mech_mission_5": MechMission5,
"hunt_mission_count": HuntMissionCount,
"hunt_mission_2": HuntMission2,
"hunt_mission_3": HuntMission3,
"hunt_mission_4": HuntMission4,
"hunt_mission_5": HuntMission5,
"kart_mission_count": KartMissionCount,
"kart_mission_2": KartMission2,
"kart_mission_3": KartMission3,
"kart_mission_4": KartMission4,
"kart_mission_5": KartMission5,
"cannons_core_mission_count": CannonsCoreMissionCount,
"cannons_core_mission_2": CannonsCoreMission2,
"cannons_core_mission_3": CannonsCoreMission3,
"cannons_core_mission_4": CannonsCoreMission4,
"cannons_core_mission_5": CannonsCoreMission5,
"ring_link": RingLink,
"death_link": DeathLink,
}