96 lines
3.9 KiB
Python
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)
|
|
|
|
|