201 lines
5.4 KiB
Python
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
|