88 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
    
 | 
						|
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
 |