SA2B: v2.1 Content Update (#1563)

Changelog:

Features:
- New goal
  - Grand Prix
    - Complete all of the Kart Races to win!
- New optional Location Checks
  - Omosanity (Activating Omochao)
  - Kart Race Mode
- Ring Loss option
  - `Classic` - lose all rings on hit
  - `Modern` - lose 20 rings on hit
  - `OHKO` - instantly die on hit, regardless of ring count (shields still protect you)
- New Trap
  - Pong Trap

Quality of Life:
- SA2B is now distributed as an `.apworld`
- Maximum possible number of Emblems in item pool is increased from 180 to 250
- An indicator now shows on the Stage Select screen when `Cannon's Core` is available
- Certain traps (`Exposition` and `Pong`) are now possible to receive on `Route 101` and `Route 280`
- Certain traps (`Confusion`, `Chaos Control`, `Exposition` and `Pong`) are now possible to receive on `FinalHazard`

Bug Fixes:
- Actually swap Intermediate and Expert Chao Races correctly
- Don't always grant double score for killing Gold Beetles anymore
- Ensure upgrades are applied properly, even when received while dying
- Fix the Message Queue getting disordered when receiving many messages in quick succession
- Fix Logic errors
  - `City Escape - 3` (Hard Logic) now requires no upgrades
  - `Mission Street - Pipe 2` (Hard Logic) now requires no upgrades
  - `Crazy Gadget - Pipe 3` (Hard Logic) now requires no upgrades
  - `Egg Quarters - 3` (Hard Logic) now requires only `Rouge - Mystic Melody`
  - `Mad Space - 5` (Hard Logic) now requires no upgrades

Co-authored-by: RaspberrySpaceJam <tyler.summers@gmail.com>
This commit is contained in:
PoryGone
2023-03-21 16:26:13 -04:00
committed by GitHub
parent 2fb9176511
commit 21a3c74783
11 changed files with 1394 additions and 221 deletions

View File

@@ -9,11 +9,13 @@ class Goal(Choice):
Biolizard: Finish Cannon's Core and defeat the Biolizard and Finalhazard
Chaos Emerald Hunt: Find the Seven Chaos Emeralds and reach Green Hill Zone
Finalhazard Chaos Emerald Hunt: Find the Seven Chaos Emeralds and reach Green Hill Zone, then defeat Finalhazard
Grand Prix: Win every race in Kart Race Mode (all standard levels are disabled)
"""
display_name = "Goal"
option_biolizard = 0
option_chaos_emerald_hunt = 1
option_finalhazard_chaos_emerald_hunt = 2
option_grand_prix = 3
default = 0
@@ -84,6 +86,24 @@ class DarknessTrapWeight(BaseTrapWeight):
display_name = "Darkness Trap Weight"
class PongTrapWeight(BaseTrapWeight):
"""
Likelihood of receiving a trap which forces you to play a Pong minigame
"""
display_name = "Pong Trap Weight"
class MinigameTrapDifficulty(Choice):
"""
How difficult any Minigame-style traps are
"""
display_name = "Minigame Trap Difficulty"
option_easy = 0
option_medium = 1
option_hard = 2
default = 1
class JunkFillPercentage(Range):
"""
Replace a percentage of non-required emblems in the item pool with random junk items
@@ -150,6 +170,27 @@ class Beetlesanity(Toggle):
display_name = "Beetlesanity"
class Omosanity(Toggle):
"""
Determines whether activating Omochao grants checks
"""
display_name = "Omosanity"
class KartRaceChecks(Choice):
"""
Determines whether Kart Race Mode grants checks
None: No Kart Races grant checks
Mini: Each Kart Race difficulty must be beaten only once
Full: Every Character must separately beat each Kart Race difficulty
"""
display_name = "Kart Race Checks"
option_none = 0
option_mini = 1
option_full = 2
default = 0
class EmblemPercentageForCannonsCore(Range):
"""
Allows logic to gate the final mission behind a number of Emblems
@@ -440,6 +481,27 @@ class CannonsCoreMission5(DefaultOnToggle):
display_name = "Cannon's Core Mission 5"
class RingLoss(Choice):
"""
How taking damage is handled
Classic: You lose all of your rings when hit
Modern: You lose 20 rings when hit
OHKO: You die immediately when hit (NOTE: Some Hard Logic tricks require damage boosts!)
"""
display_name = "SADX Music"
option_classic = 0
option_modern = 1
option_ohko = 2
default = 0
@classmethod
def get_option_name(cls, value) -> str:
if cls.auto_display_name and value == 2:
return cls.name_lookup[value].upper()
else:
return cls.name_lookup[value]
class SADXMusic(Choice):
"""
Whether the randomizer will include Sonic Adventure DX Music in the music pool
@@ -515,6 +577,8 @@ sa2b_options: typing.Dict[str, type(Option)] = {
"keysanity": Keysanity,
"whistlesanity": Whistlesanity,
"beetlesanity": Beetlesanity,
"omosanity": Omosanity,
"kart_race_checks": KartRaceChecks,
"required_rank": RequiredRank,
"emblem_percentage_for_cannons_core": EmblemPercentageForCannonsCore,
"required_cannons_core_missions": RequiredCannonsCoreMissions,
@@ -533,6 +597,9 @@ sa2b_options: typing.Dict[str, type(Option)] = {
"gravity_trap_weight": GravityTrapWeight,
"exposition_trap_weight": ExpositionTrapWeight,
#"darkness_trap_weight": DarknessTrapWeight,
"pong_trap_weight": PongTrapWeight,
"minigame_trap_difficulty": MinigameTrapDifficulty,
"ring_loss": RingLoss,
"sadx_music": SADXMusic,
"music_shuffle": MusicShuffle,
"narrator": Narrator,