mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
Add SMZ3 support (#270)
This commit is contained in:
87
worlds/smz3/TotalSMZ3/Text/StringTable.py
Normal file
87
worlds/smz3/TotalSMZ3/Text/StringTable.py
Normal file
@@ -0,0 +1,87 @@
|
||||
|
||||
from typing import Any, List
|
||||
import copy
|
||||
from worlds.smz3.TotalSMZ3.Text.Dialog import Dialog
|
||||
from worlds.smz3.TotalSMZ3.Text.Texts import text_folder
|
||||
from yaml import load, Loader
|
||||
|
||||
class StringTable:
|
||||
|
||||
@staticmethod
|
||||
def ParseEntries(resource: str):
|
||||
with open(resource, 'rb') as f:
|
||||
yaml = str(f.read(), "utf-8")
|
||||
content = load(yaml, Loader)
|
||||
|
||||
result = []
|
||||
for entryValue in content:
|
||||
(key, value) = next(iter(entryValue.items()))
|
||||
if isinstance(value, List):
|
||||
result.append((key, value))
|
||||
elif isinstance(value, str):
|
||||
result.append((key, Dialog.Compiled(value)))
|
||||
elif isinstance(value, dict):
|
||||
result.append((key, Dialog.Compiled(value["NoPause"], False)))
|
||||
else: raise Exception(f"Did not expect an object of type {type(value)}")
|
||||
return result
|
||||
|
||||
template = ParseEntries.__func__(text_folder + "/Scripts/StringTable.yaml")
|
||||
|
||||
def __init__(self):
|
||||
self.entries = copy.deepcopy(StringTable.template)
|
||||
|
||||
def SetSahasrahlaRevealText(self, text: str):
|
||||
self.SetText("sahasrahla_quest_information", text)
|
||||
|
||||
def SetBombShopRevealText(self, text: str):
|
||||
self.SetText("bomb_shop", text)
|
||||
|
||||
def SetBlindText(self, text: str):
|
||||
self.SetText("blind_by_the_light", text)
|
||||
|
||||
def SetTavernManText(self, text: str):
|
||||
self.SetText("kakariko_tavern_fisherman", text)
|
||||
|
||||
def SetGanonFirstPhaseText(self, text: str):
|
||||
self.SetText("ganon_fall_in", text)
|
||||
|
||||
def SetGanonThirdPhaseText(self, text: str):
|
||||
self.SetText("ganon_phase_3", text)
|
||||
|
||||
def SetTriforceRoomText(self, text: str):
|
||||
self.SetText("end_triforce", "{NOBORDER}\n" + text)
|
||||
|
||||
def SetPedestalText(self, text: str):
|
||||
self.SetText("mastersword_pedestal_translated", text)
|
||||
|
||||
def SetEtherText(self, text: str):
|
||||
self.SetText("tablet_ether_book", text)
|
||||
|
||||
def SetBombosText(self, text: str):
|
||||
self.SetText("tablet_bombos_book", text)
|
||||
|
||||
def SetText(self, name: str, text: str):
|
||||
count = 0
|
||||
for key, value in self.entries:
|
||||
if (key == name):
|
||||
index = count
|
||||
break
|
||||
else:
|
||||
count += 1
|
||||
self.entries[index] = (name, Dialog.Compiled(text))
|
||||
|
||||
def GetPaddedBytes(self):
|
||||
return self.GetBytes(True)
|
||||
|
||||
def GetBytes(self, pad = False):
|
||||
maxBytes = 0x7355
|
||||
data = []
|
||||
for entry in self.entries:
|
||||
data += entry[1]
|
||||
|
||||
if (len(data) > maxBytes):
|
||||
raise Exception(f"String Table exceeds 0x{maxBytes:X} bytes")
|
||||
|
||||
if (pad and len(data) < maxBytes):
|
||||
data += [0xFF] * (maxBytes - len(data))
|
||||
return data
|
Reference in New Issue
Block a user