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 |