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:
@@ -2,6 +2,7 @@ import typing
|
||||
import copy
|
||||
|
||||
from BaseClasses import MultiWorld
|
||||
from worlds.AutoWorld import World
|
||||
|
||||
|
||||
mission_orders: typing.List[typing.List[int]] = [
|
||||
@@ -193,10 +194,10 @@ stage_name_prefixes: typing.List[str] = [
|
||||
"Cannon's Core - ",
|
||||
]
|
||||
|
||||
def get_mission_count_table(multiworld: MultiWorld, player: int):
|
||||
def get_mission_count_table(multiworld: MultiWorld, world: World, player: int):
|
||||
mission_count_table: typing.Dict[int, int] = {}
|
||||
|
||||
if multiworld.goal[player] == 3:
|
||||
if world.options.goal == 3:
|
||||
for level in range(31):
|
||||
mission_count_table[level] = 0
|
||||
else:
|
||||
@@ -207,26 +208,26 @@ def get_mission_count_table(multiworld: MultiWorld, player: int):
|
||||
cannons_core_active_missions = 1
|
||||
|
||||
for i in range(2,6):
|
||||
if getattr(multiworld, "speed_mission_" + str(i), None)[player]:
|
||||
if getattr(world.options, "speed_mission_" + str(i), None):
|
||||
speed_active_missions += 1
|
||||
|
||||
if getattr(multiworld, "mech_mission_" + str(i), None)[player]:
|
||||
if getattr(world.options, "mech_mission_" + str(i), None):
|
||||
mech_active_missions += 1
|
||||
|
||||
if getattr(multiworld, "hunt_mission_" + str(i), None)[player]:
|
||||
if getattr(world.options, "hunt_mission_" + str(i), None):
|
||||
hunt_active_missions += 1
|
||||
|
||||
if getattr(multiworld, "kart_mission_" + str(i), None)[player]:
|
||||
if getattr(world.options, "kart_mission_" + str(i), None):
|
||||
kart_active_missions += 1
|
||||
|
||||
if getattr(multiworld, "cannons_core_mission_" + str(i), None)[player]:
|
||||
if getattr(world.options, "cannons_core_mission_" + str(i), None):
|
||||
cannons_core_active_missions += 1
|
||||
|
||||
speed_active_missions = min(speed_active_missions, multiworld.speed_mission_count[player].value)
|
||||
mech_active_missions = min(mech_active_missions, multiworld.mech_mission_count[player].value)
|
||||
hunt_active_missions = min(hunt_active_missions, multiworld.hunt_mission_count[player].value)
|
||||
kart_active_missions = min(kart_active_missions, multiworld.kart_mission_count[player].value)
|
||||
cannons_core_active_missions = min(cannons_core_active_missions, multiworld.cannons_core_mission_count[player].value)
|
||||
speed_active_missions = min(speed_active_missions, world.options.speed_mission_count.value)
|
||||
mech_active_missions = min(mech_active_missions, world.options.mech_mission_count.value)
|
||||
hunt_active_missions = min(hunt_active_missions, world.options.hunt_mission_count.value)
|
||||
kart_active_missions = min(kart_active_missions, world.options.kart_mission_count.value)
|
||||
cannons_core_active_missions = min(cannons_core_active_missions, world.options.cannons_core_mission_count.value)
|
||||
|
||||
active_missions: typing.List[typing.List[int]] = [
|
||||
speed_active_missions,
|
||||
@@ -244,10 +245,10 @@ def get_mission_count_table(multiworld: MultiWorld, player: int):
|
||||
return mission_count_table
|
||||
|
||||
|
||||
def get_mission_table(multiworld: MultiWorld, player: int):
|
||||
def get_mission_table(multiworld: MultiWorld, world: World, player: int):
|
||||
mission_table: typing.Dict[int, int] = {}
|
||||
|
||||
if multiworld.goal[player] == 3:
|
||||
if world.options.goal == 3:
|
||||
for level in range(31):
|
||||
mission_table[level] = 0
|
||||
else:
|
||||
@@ -259,19 +260,19 @@ def get_mission_table(multiworld: MultiWorld, player: int):
|
||||
|
||||
# Add included missions
|
||||
for i in range(2,6):
|
||||
if getattr(multiworld, "speed_mission_" + str(i), None)[player]:
|
||||
if getattr(world.options, "speed_mission_" + str(i), None):
|
||||
speed_active_missions.append(i)
|
||||
|
||||
if getattr(multiworld, "mech_mission_" + str(i), None)[player]:
|
||||
if getattr(world.options, "mech_mission_" + str(i), None):
|
||||
mech_active_missions.append(i)
|
||||
|
||||
if getattr(multiworld, "hunt_mission_" + str(i), None)[player]:
|
||||
if getattr(world.options, "hunt_mission_" + str(i), None):
|
||||
hunt_active_missions.append(i)
|
||||
|
||||
if getattr(multiworld, "kart_mission_" + str(i), None)[player]:
|
||||
if getattr(world.options, "kart_mission_" + str(i), None):
|
||||
kart_active_missions.append(i)
|
||||
|
||||
if getattr(multiworld, "cannons_core_mission_" + str(i), None)[player]:
|
||||
if getattr(world.options, "cannons_core_mission_" + str(i), None):
|
||||
cannons_core_active_missions.append(i)
|
||||
|
||||
active_missions: typing.List[typing.List[int]] = [
|
||||
@@ -292,10 +293,10 @@ def get_mission_table(multiworld: MultiWorld, player: int):
|
||||
first_mission = 1
|
||||
first_mission_options = [1, 2, 3]
|
||||
|
||||
if not multiworld.animalsanity[player]:
|
||||
if not world.options.animalsanity:
|
||||
first_mission_options.append(4)
|
||||
|
||||
if multiworld.mission_shuffle[player]:
|
||||
if world.options.mission_shuffle:
|
||||
first_mission = multiworld.random.choice([mission for mission in level_active_missions if mission in first_mission_options])
|
||||
|
||||
level_active_missions.remove(first_mission)
|
||||
@@ -305,7 +306,7 @@ def get_mission_table(multiworld: MultiWorld, player: int):
|
||||
if mission not in level_chosen_missions:
|
||||
level_chosen_missions.append(mission)
|
||||
|
||||
if multiworld.mission_shuffle[player]:
|
||||
if world.options.mission_shuffle:
|
||||
multiworld.random.shuffle(level_chosen_missions)
|
||||
|
||||
level_chosen_missions.insert(0, first_mission)
|
||||
|
||||
Reference in New Issue
Block a user