Archipelago/worlds/bomb_rush_cyberfunk/Options.py

201 lines
5.4 KiB
Python

from dataclasses import dataclass
from Options import Choice, Toggle, DefaultOnToggle, Range, DeathLink, PerGameCommonOptions
import typing
if typing.TYPE_CHECKING:
from random import Random
else:
Random = typing.Any
class Logic(Choice):
"""
Choose the logic used by the randomizer.
"""
display_name = "Logic"
option_glitchless = 0
option_glitched = 1
default = 0
class SkipIntro(DefaultOnToggle):
"""
Skips escaping the police station.
Graffiti spots tagged during the intro will not unlock items.
"""
display_name = "Skip Intro"
class SkipDreams(Toggle):
"""
Skips the dream sequences at the end of each chapter.
This can be changed later in the options menu inside the Archipelago phone app.
"""
display_name = "Skip Dreams"
class SkipHands(Toggle):
"""
Skips spraying the lion statue hands after the dream in Chapter 5.
"""
display_name = "Skip Statue Hands"
class TotalRep(Range):
"""
Change the total amount of REP in your world.
At least 960 REP is needed to finish the game.
Will be rounded to the nearest number divisible by 8.
"""
display_name = "Total REP"
range_start = 1000
range_end = 2000
default = 1400
def round_to_nearest_step(self):
rem: int = self.value % 8
if rem >= 5:
self.value = self.value - rem + 8
else:
self.value = self.value - rem
def get_rep_item_counts(self, random_source: Random, location_count: int) -> typing.List[int]:
def increment_item(item: int) -> int:
if item >= 32:
item = 48
else:
item += 8
return item
items = [8]*location_count
while sum(items) < self.value:
index = random_source.randint(0, location_count-1)
while items[index] >= 48:
index = random_source.randint(0, location_count-1)
items[index] = increment_item(items[index])
while sum(items) > self.value:
index = random_source.randint(0, location_count-1)
while not (items[index] == 16 or items[index] == 24 or items[index] == 32):
index = random_source.randint(0, location_count-1)
items[index] -= 8
return [items.count(8), items.count(16), items.count(24), items.count(32), items.count(48)]
class EndingREP(Toggle):
"""
Changes the final boss to require 1000 REP instead of 960 REP to start.
"""
display_name = "Extra REP Required"
class StartStyle(Choice):
"""
Choose which movestyle to start with.
"""
display_name = "Starting Movestyle"
option_skateboard = 2
option_inline_skates = 3
option_bmx = 1
default = 2
class LimitedGraffiti(Toggle):
"""
Each graffiti design can only be used a limited number of times before being removed from your inventory.
In some cases, such as completing a dream, using graffiti to defeat enemies, or spraying over your own graffiti, uses will not be counted.
If enabled, doing graffiti is disabled during crew battles, to prevent softlocking.
"""
display_name = "Limited Graffiti"
class SGraffiti(Choice):
"""
Choose if small graffiti should be separate, meaning that you will need to switch characters every time you run out, or combined, meaning that unlocking new characters will add 5 uses that any character can use.
Has no effect if Limited Graffiti is disabled.
"""
display_name = "Small Graffiti Uses"
option_separate = 0
option_combined = 1
default = 0
class JunkPhotos(Toggle):
"""
Skip taking pictures of Polo for items.
"""
display_name = "Skip Polo Photos"
class DontSavePhotos(Toggle):
"""
Photos taken with the Camera app will not be saved.
This can be changed later in the options menu inside the Archipelago phone app.
"""
display_name = "Don't Save Photos"
class ScoreDifficulty(Choice):
"""
Alters the score required to win score challenges and crew battles.
This can be changed later in the options menu inside the Archipelago phone app.
"""
display_name = "Score Difficulty"
option_normal = 0
option_medium = 1
option_hard = 2
option_very_hard = 3
option_extreme = 4
default = 0
class DamageMultiplier(Range):
"""
Multiplies all damage received.
At 3x, most damage will OHKO the player, including falling into pits.
At 6x, all damage will OHKO the player.
This can be changed later in the options menu inside the Archipelago phone app.
"""
display_name = "Damage Multiplier"
range_start = 1
range_end = 6
default = 1
class BRCDeathLink(DeathLink):
"""
When you die, everyone dies. The reverse is also true.
This can be changed later in the options menu inside the Archipelago phone app.
"""
@dataclass
class BombRushCyberfunkOptions(PerGameCommonOptions):
logic: Logic
skip_intro: SkipIntro
skip_dreams: SkipDreams
skip_statue_hands: SkipHands
total_rep: TotalRep
extra_rep_required: EndingREP
starting_movestyle: StartStyle
limited_graffiti: LimitedGraffiti
small_graffiti_uses: SGraffiti
skip_polo_photos: JunkPhotos
dont_save_photos: DontSavePhotos
score_difficulty: ScoreDifficulty
damage_multiplier: DamageMultiplier
death_link: BRCDeathLink