Add sprite_pool for limiting sprites used in randomonevent.
This commit is contained in:
parent
aae08a807f
commit
9812e2cca5
|
@ -125,6 +125,7 @@ class World(object):
|
||||||
set_player_attr('triforce_pieces_required', 20)
|
set_player_attr('triforce_pieces_required', 20)
|
||||||
set_player_attr('shop_shuffle', 'off')
|
set_player_attr('shop_shuffle', 'off')
|
||||||
set_player_attr('shuffle_prizes', "g")
|
set_player_attr('shuffle_prizes', "g")
|
||||||
|
set_player_attr('sprite_pool', [])
|
||||||
|
|
||||||
def secure(self):
|
def secure(self):
|
||||||
self.random = secrets.SystemRandom()
|
self.random = secrets.SystemRandom()
|
||||||
|
@ -1291,7 +1292,8 @@ class Spoiler(object):
|
||||||
'triforce_pieces_available': self.world.triforce_pieces_available,
|
'triforce_pieces_available': self.world.triforce_pieces_available,
|
||||||
'triforce_pieces_required': self.world.triforce_pieces_required,
|
'triforce_pieces_required': self.world.triforce_pieces_required,
|
||||||
'shop_shuffle': self.world.shop_shuffle,
|
'shop_shuffle': self.world.shop_shuffle,
|
||||||
'shuffle_prizes': self.world.shuffle_prizes
|
'shuffle_prizes': self.world.shuffle_prizes,
|
||||||
|
'sprite_pool': self.world.sprite_pool
|
||||||
}
|
}
|
||||||
|
|
||||||
def to_json(self):
|
def to_json(self):
|
||||||
|
|
|
@ -315,6 +315,8 @@ def parse_arguments(argv, no_defaults=False):
|
||||||
u: shuffle capacity upgrades into the item pool
|
u: shuffle capacity upgrades into the item pool
|
||||||
''')
|
''')
|
||||||
parser.add_argument('--shuffle_prizes', default=defval('g'), choices=['', 'g', 'b', 'gb'])
|
parser.add_argument('--shuffle_prizes', default=defval('g'), choices=['', 'g', 'b', 'gb'])
|
||||||
|
parser.add_argument('--sprite_pool', help='''\
|
||||||
|
Specifies a colon separated list of sprites used for random/randomonevent. If not specified, the full sprite pool is used.''')
|
||||||
parser.add_argument('--remote_items', default=defval(False), action='store_true')
|
parser.add_argument('--remote_items', default=defval(False), action='store_true')
|
||||||
parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255))
|
parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255))
|
||||||
parser.add_argument('--names', default=defval(''))
|
parser.add_argument('--names', default=defval(''))
|
||||||
|
@ -360,7 +362,7 @@ def parse_arguments(argv, no_defaults=False):
|
||||||
'heartbeep', "skip_progression_balancing", "triforce_pieces_available",
|
'heartbeep', "skip_progression_balancing", "triforce_pieces_available",
|
||||||
"triforce_pieces_required", "shop_shuffle",
|
"triforce_pieces_required", "shop_shuffle",
|
||||||
'remote_items', 'progressive', 'dungeon_counters', 'glitch_boots', 'killable_thieves',
|
'remote_items', 'progressive', 'dungeon_counters', 'glitch_boots', 'killable_thieves',
|
||||||
'tile_shuffle', 'bush_shuffle', 'shuffle_prizes']:
|
'tile_shuffle', 'bush_shuffle', 'shuffle_prizes', 'sprite_pool']:
|
||||||
value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name)
|
value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name)
|
||||||
if player == 1:
|
if player == 1:
|
||||||
setattr(ret, name, {1: value})
|
setattr(ret, name, {1: value})
|
||||||
|
|
1
Gui.py
1
Gui.py
|
@ -550,6 +550,7 @@ def guiMain(args=None):
|
||||||
"bonk": "b",
|
"bonk": "b",
|
||||||
"general": "g",
|
"general": "g",
|
||||||
"both": "bg"}[prizeVar.get()]
|
"both": "bg"}[prizeVar.get()]
|
||||||
|
guiargs.sprite_pool = []
|
||||||
guiargs.customitemarray = [int(bowVar.get()), int(silverarrowVar.get()), int(boomerangVar.get()),
|
guiargs.customitemarray = [int(bowVar.get()), int(silverarrowVar.get()), int(boomerangVar.get()),
|
||||||
int(magicboomerangVar.get()), int(hookshotVar.get()), int(mushroomVar.get()),
|
int(magicboomerangVar.get()), int(hookshotVar.get()), int(mushroomVar.get()),
|
||||||
int(magicpowderVar.get()), int(firerodVar.get()),
|
int(magicpowderVar.get()), int(firerodVar.get()),
|
||||||
|
|
1
Main.py
1
Main.py
|
@ -81,6 +81,7 @@ def main(args, seed=None):
|
||||||
world.shop_shuffle = args.shop_shuffle.copy()
|
world.shop_shuffle = args.shop_shuffle.copy()
|
||||||
world.progression_balancing = {player: not balance for player, balance in args.skip_progression_balancing.items()}
|
world.progression_balancing = {player: not balance for player, balance in args.skip_progression_balancing.items()}
|
||||||
world.shuffle_prizes = args.shuffle_prizes.copy()
|
world.shuffle_prizes = args.shuffle_prizes.copy()
|
||||||
|
world.sprite_pool = args.sprite_pool.copy()
|
||||||
|
|
||||||
world.rom_seeds = {player: random.Random(world.random.randint(0, 999999999)) for player in range(1, world.players + 1)}
|
world.rom_seeds = {player: random.Random(world.random.randint(0, 999999999)) for player in range(1, world.players + 1)}
|
||||||
|
|
||||||
|
|
|
@ -468,6 +468,7 @@ def roll_settings(weights):
|
||||||
|
|
||||||
if 'rom' in weights:
|
if 'rom' in weights:
|
||||||
romweights = weights['rom']
|
romweights = weights['rom']
|
||||||
|
ret.sprite_pool = romweights['sprite_pool'] if 'sprite_pool' in romweights else []
|
||||||
ret.sprite = get_choice('sprite', romweights, "Link")
|
ret.sprite = get_choice('sprite', romweights, "Link")
|
||||||
ret.disablemusic = get_choice('disablemusic', romweights, False)
|
ret.disablemusic = get_choice('disablemusic', romweights, False)
|
||||||
ret.quickswap = get_choice('quickswap', romweights, True)
|
ret.quickswap = get_choice('quickswap', romweights, True)
|
||||||
|
|
12
Rom.py
12
Rom.py
|
@ -162,7 +162,7 @@ def check_enemizer(enemizercli):
|
||||||
check_enemizer.done = True
|
check_enemizer.done = True
|
||||||
|
|
||||||
|
|
||||||
def apply_random_sprite_on_event(rom: LocalRom, sprite, local_random, allow_random_on_event):
|
def apply_random_sprite_on_event(rom: LocalRom, sprite, local_random, allow_random_on_event, sprite_pool):
|
||||||
onevent = onhit = 0
|
onevent = onhit = 0
|
||||||
sprites = list()
|
sprites = list()
|
||||||
if not allow_random_on_event:
|
if not allow_random_on_event:
|
||||||
|
@ -192,7 +192,13 @@ def apply_random_sprite_on_event(rom: LocalRom, sprite, local_random, allow_rand
|
||||||
|
|
||||||
_populate_sprite_table()
|
_populate_sprite_table()
|
||||||
if onevent:
|
if onevent:
|
||||||
sprites = list(set(_sprite_table.values())) # convert to list and remove dupes
|
if sprite_pool:
|
||||||
|
if isinstance(sprite_pool, str):
|
||||||
|
sprite_pool = sprite_pool.split(':')
|
||||||
|
for sprite in sprite_pool:
|
||||||
|
sprites.append(Sprite(sprite) if os.path.isfile(sprite) else get_sprite_from_name(sprite, local_random))
|
||||||
|
else:
|
||||||
|
sprites = list(set(_sprite_table.values())) # convert to list and remove dupes
|
||||||
else:
|
else:
|
||||||
sprites.append(sprite)
|
sprites.append(sprite)
|
||||||
if sprites:
|
if sprites:
|
||||||
|
@ -1464,7 +1470,7 @@ def hud_format_text(text):
|
||||||
|
|
||||||
def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite, ow_palettes, uw_palettes, world=None, player=1, allow_random_on_event=False):
|
def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite, ow_palettes, uw_palettes, world=None, player=1, allow_random_on_event=False):
|
||||||
local_random = random if not world else world.rom_seeds[player]
|
local_random = random if not world else world.rom_seeds[player]
|
||||||
apply_random_sprite_on_event(rom, sprite, local_random, allow_random_on_event)
|
apply_random_sprite_on_event(rom, sprite, local_random, allow_random_on_event, world.sprite_pool[player] if world else [])
|
||||||
|
|
||||||
# enable instant item menu
|
# enable instant item menu
|
||||||
if fastmenu == 'instant':
|
if fastmenu == 'instant':
|
||||||
|
|
|
@ -286,6 +286,11 @@ debug: # Only available if the host uses the doors branch, it is ignored otherwi
|
||||||
on: 0 # Enables debugging features. Currently, these are the Item collection counter. (overwrites total triforce pieces) and Castle Gate closed indicator.
|
on: 0 # Enables debugging features. Currently, these are the Item collection counter. (overwrites total triforce pieces) and Castle Gate closed indicator.
|
||||||
off: 50
|
off: 50
|
||||||
rom:
|
rom:
|
||||||
|
#sprite_pool: # When specified, limits the pool of sprites used for randomon-event to the specified pool. Uncomment to use this.
|
||||||
|
# - link
|
||||||
|
# - pride link
|
||||||
|
# - penguin link
|
||||||
|
# - random # You can specify random multiple times for however many potentially unique random sprites you want in your pool.
|
||||||
sprite: # Enter the name of your preferred sprite and weight it appropriately
|
sprite: # Enter the name of your preferred sprite and weight it appropriately
|
||||||
random: 0
|
random: 0
|
||||||
randomonhit: 0 # Random sprite on hit
|
randomonhit: 0 # Random sprite on hit
|
||||||
|
|
Loading…
Reference in New Issue