LADX: Text shuffle (#2051)

This commit is contained in:
zig-for 2023-11-22 06:29:33 -08:00 committed by GitHub
parent d1b22935b4
commit 01b566b798
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 63 additions and 32 deletions

View File

@ -3,6 +3,7 @@ import importlib.util
import importlib.machinery
import os
import pkgutil
from collections import defaultdict
from .romTables import ROMWithTables
from . import assembler
@ -322,6 +323,22 @@ def generateRom(args, settings, ap_settings, auth, seed_name, logic, rnd=None, m
if args.doubletrouble:
patches.enemies.doubleTrouble(rom)
if ap_settings["text_shuffle"]:
buckets = defaultdict(list)
# For each ROM bank, shuffle text within the bank
for n, data in enumerate(rom.texts._PointerTable__data):
# Don't muck up which text boxes are questions and which are statements
if type(data) != int and data and data != b'\xFF':
buckets[(rom.texts._PointerTable__banks[n], data[len(data) - 1] == 0xfe)].append((n, data))
for bucket in buckets.values():
# For each bucket, make a copy and shuffle
shuffled = bucket.copy()
rnd.shuffle(shuffled)
# Then put new text in
for bucket_idx, (orig_idx, data) in enumerate(bucket):
rom.texts[shuffled[bucket_idx][0]] = data
if ap_settings["trendy_game"] != TrendyGame.option_normal:
# TODO: if 0 or 4, 5, remove inaccurate conveyor tiles

View File

@ -11,15 +11,17 @@ def removeOwlEvents(rom):
re.removeEntities(0x41)
re.store(rom)
# Clear texts used by the owl. Potentially reused somewhere o else.
rom.texts[0x0D9] = b'\xff' # used by boomerang
# 1 Used by empty chest (master stalfos message)
# 8 unused (0x0C0-0x0C7)
# 1 used by bowwow in chest
# 1 used by item for other player message
# 2 used by arrow chest messages
# 2 used by tunics
for idx in range(0x0BE, 0x0CE):
rom.texts[idx] = b'\xff'
# Undoing this, we use it for text shuffle now
#rom.texts[0x0D9] = b'\xff' # used by boomerang
# for idx in range(0x0BE, 0x0CE):
# rom.texts[idx] = b'\xff'
# Patch the owl entity into a ghost to allow refill of powder/bombs/arrows

View File

@ -2,34 +2,35 @@ from ..assembler import ASM
def patchPhone(rom):
rom.texts[0x141] = b""
rom.texts[0x142] = b""
rom.texts[0x143] = b""
rom.texts[0x144] = b""
rom.texts[0x145] = b""
rom.texts[0x146] = b""
rom.texts[0x147] = b""
rom.texts[0x148] = b""
rom.texts[0x149] = b""
rom.texts[0x14A] = b""
rom.texts[0x14B] = b""
rom.texts[0x14C] = b""
rom.texts[0x14D] = b""
rom.texts[0x14E] = b""
rom.texts[0x14F] = b""
rom.texts[0x16E] = b""
rom.texts[0x1FD] = b""
rom.texts[0x228] = b""
rom.texts[0x229] = b""
rom.texts[0x22A] = b""
rom.texts[0x240] = b""
rom.texts[0x241] = b""
rom.texts[0x242] = b""
rom.texts[0x243] = b""
rom.texts[0x244] = b""
rom.texts[0x245] = b""
rom.texts[0x247] = b""
rom.texts[0x248] = b""
# reenabled for text shuffle
# rom.texts[0x141] = b""
# rom.texts[0x142] = b""
# rom.texts[0x143] = b""
# rom.texts[0x144] = b""
# rom.texts[0x145] = b""
# rom.texts[0x146] = b""
# rom.texts[0x147] = b""
# rom.texts[0x148] = b""
# rom.texts[0x149] = b""
# rom.texts[0x14A] = b""
# rom.texts[0x14B] = b""
# rom.texts[0x14C] = b""
# rom.texts[0x14D] = b""
# rom.texts[0x14E] = b""
# rom.texts[0x14F] = b""
# rom.texts[0x16E] = b""
# rom.texts[0x1FD] = b""
# rom.texts[0x228] = b""
# rom.texts[0x229] = b""
# rom.texts[0x22A] = b""
# rom.texts[0x240] = b""
# rom.texts[0x241] = b""
# rom.texts[0x242] = b""
# rom.texts[0x243] = b""
# rom.texts[0x244] = b""
# rom.texts[0x245] = b""
# rom.texts[0x247] = b""
# rom.texts[0x248] = b""
rom.patch(0x06, 0x2A8F, 0x2BBC, ASM("""
; We use $DB6D to store which tunics we have. This is normally the Dungeon9 instrument, which does not exist.
ld a, [$DC0F]

View File

@ -116,7 +116,10 @@ class PointerTable:
rom.banks[ptr_bank][ptr_addr] = pointer & 0xFF
rom.banks[ptr_bank][ptr_addr + 1] = (pointer >> 8) | 0x40
for n, s in enumerate(self.__data):
data = list(enumerate(self.__data))
data.sort(key=lambda t: type(t[1]) == int or -len(t[1]))
for n, s in data:
if isinstance(s, int):
pointer = s
else:

View File

@ -43,6 +43,12 @@ class TradeQuest(DefaultOffToggle, LADXROption):
display_name = "Trade Quest"
ladxr_name = "tradequest"
class TextShuffle(DefaultOffToggle):
"""
[On] Shuffles all the text in the game
[Off] (default) doesn't shuffle them.
"""
class Rooster(DefaultOnToggle, LADXROption):
"""
[On] Adds the rooster to the item pool.
@ -431,6 +437,7 @@ links_awakening_options: typing.Dict[str, typing.Type[Option]] = {
'trendy_game': TrendyGame,
'gfxmod': GfxMod,
'palette': Palette,
'text_shuffle': TextShuffle,
'shuffle_nightmare_keys': ShuffleNightmareKeys,
'shuffle_small_keys': ShuffleSmallKeys,
'shuffle_maps': ShuffleMaps,
@ -439,4 +446,5 @@ links_awakening_options: typing.Dict[str, typing.Type[Option]] = {
'music_change_condition': MusicChangeCondition,
'nag_messages': NagMessages,
'ap_title_screen': APTitleScreen,
}