2022-05-14 05:52:35 -04:00
from typing import Dict , Union
2021-09-24 04:07:32 +02:00
from BaseClasses import MultiWorld
2022-05-14 05:52:35 -04:00
from Options import Toggle , DefaultOnToggle , DeathLink , Choice , Range , Option , OptionDict
2022-05-15 23:39:38 +02:00
from schema import Schema , And , Optional
2021-09-24 04:07:32 +02:00
class StartWithJewelryBox ( Toggle ) :
" Start with Jewelry Box unlocked "
display_name = " Start with Jewelry Box "
#class ProgressiveVerticalMovement(Toggle):
# "Always find vertical movement in the following order Succubus Hairpin -> Light Wall -> Celestial Sash"
# display_name = "Progressive vertical movement"
#class ProgressiveKeycards(Toggle):
# "Always find Security Keycard's in the following order D -> C -> B -> A"
# display_name = "Progressive keycards"
2022-02-04 21:53:47 +01:00
class DownloadableItems ( DefaultOnToggle ) :
2021-09-24 04:07:32 +02:00
" With the tablet you will be able to download items at terminals "
display_name = " Downloadable items "
class FacebookMode ( Toggle ) :
2021-09-30 19:51:07 +02:00
" Requires Oculus Rift(ng) to spot the weakspots in walls and floors "
2021-09-24 04:07:32 +02:00
display_name = " Facebook mode "
class StartWithMeyef ( Toggle ) :
" Start with Meyef, ideal for when you want to play multiplayer. "
display_name = " Start with Meyef "
class QuickSeed ( Toggle ) :
" Start with Talaria Attachment, Nyoom! "
display_name = " Quick seed "
class SpecificKeycards ( Toggle ) :
" Keycards can only open corresponding doors "
display_name = " Specific Keycards "
class Inverted ( Toggle ) :
" Start in the past "
display_name = " Inverted "
#class StinkyMaw(Toggle):
2021-10-15 17:51:18 -05:00
# "Require gasmask for Maw"
2021-09-24 04:07:32 +02:00
# display_name = "Stinky Maw"
2021-11-28 22:59:34 +01:00
class GyreArchives ( Toggle ) :
" Gyre locations are in logic. New warps are gated by Merchant Crow and Kobo "
display_name = " Gyre Archives "
class Cantoran ( Toggle ) :
" Cantoran ' s fight and check are available upon revisiting his room "
display_name = " Cantoran "
2022-01-01 13:44:45 -06:00
class LoreChecks ( Toggle ) :
" Memories and journal entries contain items. "
display_name = " Lore Checks "
2022-05-14 05:52:35 -04:00
class DamageRando ( Choice ) :
" Randomly nerfs and buffs some orbs and their associated spells as well as some associated rings. "
2021-12-20 14:26:16 +01:00
display_name = " Damage Rando "
2022-05-14 05:52:35 -04:00
option_off = 0
option_allnerfs = 1
option_mostlynerfs = 2
option_balanced = 3
option_mostlybuffs = 4
option_allbuffs = 5
option_manual = 6
2022-05-15 23:39:38 +02:00
alias_false = 0
alias_true = 2
2022-05-14 05:52:35 -04:00
class DamageRandoOverrides ( OptionDict ) :
2022-05-15 23:39:38 +02:00
" Manual +/-/normal odds for an orb. Put 0 if you don ' t want a certain nerf or buff to be a possibility. Orbs that you don ' t specify will roll with 1/1/1 as odds "
2022-05-14 05:52:35 -04:00
schema = Schema ( {
2022-05-15 23:39:38 +02:00
Optional ( " Blue " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Blade " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Fire " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Plasma " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Iron " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Ice " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Wind " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Gun " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Umbra " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Empire " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Eye " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Blood " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " ForbiddenTome " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Shattered " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Nether " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
2022-05-15 23:39:38 +02:00
Optional ( " Radiant " ) : {
2022-05-14 05:52:35 -04:00
" MinusOdds " : And ( int , lambda n : n > = 0 ) ,
" NormalOdds " : And ( int , lambda n : n > = 0 ) ,
" PlusOdds " : And ( int , lambda n : n > = 0 )
} ,
} )
display_name = " Damage Rando Overrides "
default = {
" Blue " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Blade " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Fire " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Plasma " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Iron " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Ice " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Wind " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Gun " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Umbra " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Empire " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Eye " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Blood " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" ForbiddenTome " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Shattered " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Nether " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
" Radiant " : { " MinusOdds " : 1 , " NormalOdds " : 1 , " PlusOdds " : 1 } ,
}
2021-12-20 14:26:16 +01:00
2022-02-04 21:53:47 +01:00
class ShopFill ( Choice ) :
""" Sets the items for sale in Merchant Crow ' s shops.
Default : No sunglasses or trendy jacket , but sand vials for sale .
Randomized : Up to 4 random items in each shop .
Vanilla : Keep shops the same as the base game .
Empty : Sell no items at the shop . """
display_name = " Shop Inventory "
option_default = 0
option_randomized = 1
option_vanilla = 2
option_empty = 3
class ShopWarpShards ( DefaultOnToggle ) :
" Shops always sell warp shards (when keys possessed), ignoring inventory setting. "
display_name = " Always Sell Warp Shards "
class ShopMultiplier ( Range ) :
" Multiplier for the cost of items in the shop. Set to 0 for free shops. "
display_name = " Shop Price Multiplier "
range_start = 0
range_end = 10
default = 1
2022-04-23 17:02:53 -07:00
class LootPool ( Choice ) :
""" Sets the items that drop from enemies (does not apply to boss reward checks)
Vanilla : Drops are the same as the base game
Randomized : Each slot of every enemy ' s drop table is given a random use item or piece of equipment.
Empty : Enemies drop nothing . """
2022-04-24 12:37:08 +02:00
display_name = " Loot Pool "
2022-04-23 17:02:53 -07:00
option_vanilla = 0
option_randomized = 1
option_empty = 2
class ShowBestiary ( Toggle ) :
" All entries in the bestiary are visible, without needing to kill one of a given enemy first "
display_name = " Show Bestiary Entries "
2021-09-24 04:07:32 +02:00
# Some options that are available in the timespinner randomizer arent currently implemented
2022-02-04 21:53:47 +01:00
timespinner_options : Dict [ str , Option ] = {
2021-09-24 04:07:32 +02:00
" StartWithJewelryBox " : StartWithJewelryBox ,
#"ProgressiveVerticalMovement": ProgressiveVerticalMovement,
#"ProgressiveKeycards": ProgressiveKeycards,
" DownloadableItems " : DownloadableItems ,
" FacebookMode " : FacebookMode ,
" StartWithMeyef " : StartWithMeyef ,
" QuickSeed " : QuickSeed ,
" SpecificKeycards " : SpecificKeycards ,
" Inverted " : Inverted ,
2021-11-06 01:12:11 +01:00
#"StinkyMaw": StinkyMaw,
2021-11-28 22:59:34 +01:00
" GyreArchives " : GyreArchives ,
" Cantoran " : Cantoran ,
2022-01-01 13:44:45 -06:00
" LoreChecks " : LoreChecks ,
2021-12-20 14:26:16 +01:00
" DamageRando " : DamageRando ,
2022-05-14 05:52:35 -04:00
" DamageRandoOverrides " : DamageRandoOverrides ,
2022-02-04 21:53:47 +01:00
" ShopFill " : ShopFill ,
" ShopWarpShards " : ShopWarpShards ,
" ShopMultiplier " : ShopMultiplier ,
2022-04-23 17:09:11 -07:00
" LootPool " : LootPool ,
" ShowBestiary " : ShowBestiary ,
2021-11-06 01:12:11 +01:00
" DeathLink " : DeathLink ,
2021-09-24 04:07:32 +02:00
}
def is_option_enabled ( world : MultiWorld , player : int , name : str ) - > bool :
2022-02-04 21:53:47 +01:00
return get_option_value ( world , player , name ) > 0
2022-05-14 05:52:35 -04:00
def get_option_value ( world : MultiWorld , player : int , name : str ) - > Union [ int , dict ] :
2021-09-24 04:07:32 +02:00
option = getattr ( world , name , None )
if option == None :
2022-02-04 21:53:47 +01:00
return 0
2021-09-24 04:07:32 +02:00
2022-05-14 05:52:35 -04:00
return option [ player ] . value