def read_var_length_string( data: bytes, start=0, codec=string_codec.PMD2_STR_ENCODER) -> Tuple[int, str]: """Reads a zero terminated string of characters. """ if codec == string_codec.PMD2_STR_ENCODER: string_codec.init() bytes_of_string = bytearray() current_byte = -1 cursor = start while current_byte != 0: current_byte = data[cursor] cursor += 1 if current_byte != 0: bytes_of_string.append(current_byte) return cursor - start, str(bytes_of_string, codec)
def sir0_serialize_parts(self) -> Tuple[bytes, List[int], Optional[int]]: string_codec.init() out_data = bytearray() # 1. Write strings pointer_offsets: List[int] = [] for entry in self.list: pointer_offsets.append(len(out_data)) out_data += bytes(entry.name, string_codec.PMD2_STR_ENCODER) + b'\0' # Padding self._pad(out_data) # Write table sir0_pointer_offsets = [] pointer_data_block = len(out_data) for i, entry in enumerate(self.list): entry_buffer = bytearray(LEN_ACTOR_ENTRY) write_uintle(entry_buffer, entry.type, 0, 2) write_uintle(entry_buffer, entry.entid, 2, 2) sir0_pointer_offsets.append(len(out_data) + 4) write_uintle(entry_buffer, pointer_offsets[i], 4, 4) write_uintle(entry_buffer, entry.unk3, 8, 2) write_uintle(entry_buffer, entry.unk4, 10, 2) out_data += entry_buffer # Padding self._pad(out_data) # 4. Write sub-header data_pointer = len(out_data) sir0_pointer_offsets.append(len(out_data)) out_data += pointer_data_block.to_bytes(4, byteorder='little', signed=False) out_data += len(self.list).to_bytes(4, byteorder='little', signed=False) return out_data, sir0_pointer_offsets, data_pointer
def sir0_serialize_parts(self) -> Tuple[bytes, List[int], Optional[int]]: string_codec.init() out_data = bytearray() # 1. Write strings pointer_offsets = [] for entry in self.list: pointer_offsets.append(u32_checked(len(out_data))) out_data += bytes(entry.name, string_codec.PMD2_STR_ENCODER) + b'\0' # Padding self._pad(out_data) # Write table sir0_pointer_offsets = [] pointer_data_block = len(out_data) for i, entry in enumerate(self.list): entry_buffer = bytearray(LEN_LEVEL_ENTRY) write_u16(entry_buffer, entry.mapty, 0) write_u16(entry_buffer, entry.nameid, 2) write_u16(entry_buffer, entry.mapid, 4) write_i16(entry_buffer, entry.weather, 6) sir0_pointer_offsets.append(len(out_data) + 8) write_u32(entry_buffer, pointer_offsets[i], 8) out_data += entry_buffer out_data += PADDING_END # Padding self._pad(out_data) # 4. Write sub-header # sir0_pointer_offsets.append(len(out_data)) # out_data += pointer_data_block.to_bytes(4, byteorder='little', signed=False) # out_data += len(self.list).to_bytes(4, byteorder='little', signed=False) return out_data, sir0_pointer_offsets, pointer_data_block
def write(self, model: _TstPy) -> bytes: from skytemple_files.common.string_codec import init, PMD2_STR_ENCODER init() return bytes(model.str, PMD2_STR_ENCODER)
def __init__(self, data: bytes): from skytemple_files.common.string_codec import init, PMD2_STR_ENCODER init() self.str: str = str(data, PMD2_STR_ENCODER)
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with SkyTemple. If not, see <https://www.gnu.org/licenses/>. # mypy: ignore-errors from functools import partial from desmume.emulator import DeSmuME, DeSmuME_Memory from skytemple_files.common import string_codec from skytemple_files.common.ppmdu_config.script_data import Pmd2ScriptOpCode from skytemple_files.common.ppmdu_config.xml_reader import Pmd2XmlReader from skytemple_ssb_debugger.model.game_variable import GameVariable string_codec.init() class ScriptStruct: def __init__(self, mem: DeSmuME_Memory, pnt: int): self.mem = mem self.pnt = pnt def __str__(self): # Points to another struct!!! unk0_address = self.mem.unsigned.read_long(self.pnt) script_target_id = script_target_address = self.mem.unsigned.read_long( self.pnt + 4) if script_target_address != 0: script_target_id = self.mem.unsigned.read_short( script_target_address)