Text Plando Support

This commit is contained in:
Fabian Dill 2021-01-02 16:44:58 +01:00
parent 938ccccbd4
commit 07df9b9e80
6 changed files with 23 additions and 2 deletions

View File

@ -136,6 +136,7 @@ class World(object):
set_player_attr('dark_room_logic', "lamp")
set_player_attr('restrict_dungeon_item_on_boss', False)
set_player_attr('plando_items', [])
set_player_attr('plando_texts', {})
def secure(self):
self.random = secrets.SystemRandom()

View File

@ -357,7 +357,8 @@ def parse_arguments(argv, no_defaults=False):
ret = parser.parse_args(argv)
# cannot be set through CLI currently
ret.plando_items = {}
ret.plando_items = []
ret.plando_texts = {}
ret.glitch_boots = not ret.disable_glitch_boots
if ret.timer == "none":
@ -386,7 +387,7 @@ def parse_arguments(argv, no_defaults=False):
'shufflebosses', 'enemy_shuffle', 'enemy_health', 'enemy_damage', 'shufflepots',
'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor',
'heartbeep', "skip_progression_balancing", "triforce_pieces_available",
"triforce_pieces_required", "shop_shuffle", "plando_items",
"triforce_pieces_required", "shop_shuffle", "plando_items", "plando_texts",
'remote_items', 'progressive', 'dungeon_counters', 'glitch_boots', 'killable_thieves',
'tile_shuffle', 'bush_shuffle', 'shuffle_prizes', 'sprite_pool', 'dark_room_logic',
'restrict_dungeon_item_on_boss',

View File

@ -88,6 +88,7 @@ def main(args, seed=None):
world.sprite_pool = args.sprite_pool.copy()
world.dark_room_logic = args.dark_room_logic.copy()
world.plando_items = args.plando_items.copy()
world.plando_texts = args.plando_texts.copy()
world.restrict_dungeon_item_on_boss = args.restrict_dungeon_item_on_boss.copy()
world.rom_seeds = {player: random.Random(world.random.randint(0, 999999999)) for player in range(1, world.players + 1)}

View File

@ -559,6 +559,13 @@ def roll_settings(weights, plando_options: typing.Set[str] = frozenset(("bosses"
location_world = get_choice("world", placement, False)
ret.plando_items.append(PlandoItem(item, location, location_world, from_pool))
ret.plando_texts = {}
if "texts" in plando_options:
options = weights.get("plando_texts", [])
for placement in options:
if roll_percentage(get_choice("percentage", placement, 100)):
ret.plando_texts[str(get_choice("at", placement))] = str(get_choice("text", placement))
if 'rom' in weights:
romweights = weights['rom']

7
Rom.py
View File

@ -2208,6 +2208,13 @@ def write_strings(rom, world, player, team):
tt['menu_start_2'] = "{MENU}\n{SPEED0}\n≥@'s house\n Dark Chapel\n{CHOICE3}"
tt['menu_start_3'] = "{MENU}\n{SPEED0}\n≥@'s house\n Dark Chapel\n Mountain Cave\n{CHOICE2}"
for at, text in world.plando_texts[player].items():
if at not in tt:
raise Exception(f"No text target \"{at}\" found.")
else:
tt[at] = text
rom.write_bytes(0xE0000, tt.getBytes())
credits = Credits()

View File

@ -1286,6 +1286,7 @@ class LargeCreditBottomMapper(CharTextMapper):
class TextTable(object):
SIZE = 0x7355
def __init__(self):
self._text = OrderedDict()
self.setDefaultText()
@ -1293,6 +1294,9 @@ class TextTable(object):
def __getitem__(self, key):
return self._text[key]
def __contains__(self, key):
return key in self._text
def __setitem__(self, key, value):
if not key in self._text:
raise KeyError(key)