Beispiel #1
0
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)
Beispiel #2
0
    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
Beispiel #3
0
    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)