pyrogenesis-migration-scripts/utils/PMPMap.py

96 lines
3.9 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# -*- mode: python-mode; python-indent-offset: 4; -*-
# SPDX-License-Identifier: MIT
# SPDX-FileCopyrightText: © 2023 Wildfire Games
# SPDX-FileCopyrightText: © 2023 Stanislas Daniel Claude Dolcini
from io import BufferedReader, BufferedWriter
class PmpHeader():
def __init__(self, stream : BufferedReader):
self.magic = int.from_bytes(stream.read(4), byteorder='little')
self.version = int.from_bytes(stream.read(4), byteorder='little')
self.data_size = int.from_bytes(stream.read(4), byteorder='little')
self.map_size = int.from_bytes(stream.read(4), byteorder='little')
def write_to_stream(self, stream : BufferedWriter):
stream.write(self.magic.to_bytes(4, 'little'))
stream.write(self.version.to_bytes(4, 'little'))
stream.write(self.data_size.to_bytes(4, 'little'))
stream.write(self.map_size.to_bytes(4, 'little'))
class PmpHeightMap(list):
def __init__(self, stream : BufferedReader, width : int, height : int):
self.capacity = (width * 16 + 1) * (height * 16 + 1)
for _ in range (0, self.capacity):
self.append(int.from_bytes(stream.read(2), byteorder='little'))
def write_to_stream(self, stream : BufferedWriter):
for height_data in self:
stream.write(height_data.to_bytes(2, byteorder='little'))
class PmpTextures(list):
def __init__(self, stream : BufferedReader):
self.capacity = int.from_bytes(stream.read(4), byteorder='little')
for _ in range (0, self.capacity):
length = int.from_bytes(stream.read(4), byteorder='little')
self.append(stream.read(length).decode())
def write_to_stream(self, stream : BufferedWriter):
stream.write((len(self)).to_bytes(4, byteorder='little'))
for texture in self:
stream.write(len(texture).to_bytes(4, byteorder='little'))
stream.write(texture.encode())
class PmpTiles(list):
def __init__(self, stream : BufferedReader, capacity : int):
for _ in range(0, capacity):
self.append(PmpTile(stream))
def write_to_stream(self, stream : BufferedWriter):
for tile in self:
tile.write_to_stream(stream)
class PmpTile():
def __init__(self, stream : BufferedReader):
self.texture1 = int.from_bytes(stream.read(2), byteorder='little')
self.texture2 = int.from_bytes(stream.read(2), byteorder='little')
self.priority = int.from_bytes(stream.read(4), byteorder='little')
def write_to_stream(self, stream : BufferedWriter):
stream.write(self.texture1.to_bytes(2, byteorder='little'))
stream.write(self.texture2.to_bytes(2, byteorder='little'))
stream.write(self.priority.to_bytes(4, byteorder='little'))
class PmpPatch():
def __init__(self, stream : BufferedReader):
self.TILE_SIZE = 16 * 16
self.tiles = PmpTiles(stream, self.TILE_SIZE)
def write_to_stream(self, stream : BufferedWriter):
self.tiles.write_to_stream(stream)
class PmpPatches(list):
def __init__(self, stream, width, height):
self.capacity = width * height
for _ in range (0, self.capacity):
self.append(PmpPatch(stream))
def write_to_stream(self, stream : BufferedWriter):
for patch in self:
patch.write_to_stream(stream)
class PmpMap():
def __init__(self, stream : BufferedReader):
self.header = PmpHeader(stream)
self.heightMap = PmpHeightMap(stream, self.header.map_size, self.header.map_size)
self.textures = PmpTextures(stream)
self.patches = PmpPatches(stream, self.header.map_size, self.header.map_size)
def write_to_stream(self, stream : BufferedWriter):
self.header.write_to_stream(stream)
self.heightMap.write_to_stream(stream)
self.textures.write_to_stream(stream)
self.patches.write_to_stream(stream)