Adoranda/assets-cg/converters.py

106 lines
2.6 KiB
Python
Raw Normal View History

2021-07-29 18:33:22 +02:00
import fxconv
import json
2021-07-29 18:33:22 +02:00
def convert(input, output, params, target):
if params["custom-type"] == "map":
convert_map(input, output, params, target)
return 0
2021-08-06 23:42:49 +02:00
elif params["custom-type"] == "character":
convert_character(input, output, params, target)
return 0
2021-07-29 18:33:22 +02:00
else:
return 1
def convert_map(input, output, params, target):
TILE_AIR = 0
TILE_SOLID = 1
TILE_DOOR = 2
2021-08-06 23:42:49 +02:00
TILE_CHARACTER = 3
2021-07-29 18:33:22 +02:00
TILE_BRIDGE = -1 #only for bridge detection to avoid solid behind
with open(input, "r") as jsonData:
data = json.load(jsonData)
2021-08-15 03:10:05 +02:00
#find the tileset using the location of the input
tileset = open(input.replace(input.split("/")[-1], "tileset.json"), "r")
data_tileset = json.load(tileset)
tileset.close()
tile_value = {}
#create a dictionnary between tile id-type
for i in data_tileset["tiles"]:
try:
id = i["id"]+1
type = i["type"]
if type == "air":
value = TILE_AIR
elif type == "solid":
value = TILE_SOLID
elif type == "door":
value = TILE_DOOR
2021-08-06 23:42:49 +02:00
elif type == "character":
value = TILE_CHARACTER
elif type == "bridge":
value = TILE_BRIDGE
else:
value = TILE_AIR
tile_value[id] = value
except KeyError:
pass
2021-08-15 03:10:05 +02:00
#Extract from the json the width, height and layers of the map
w, h = data["width"], data["height"]
nblayer = len(data["layers"])
o = fxconv.ObjectData()
o += fxconv.u32(w) + fxconv.u32(h) + fxconv.u32(nblayer)
o += fxconv.ref("img_tileset")
#generation of the collision map (take the maximum of the layer except for bridges)
#bridges are always walkable
info_map = bytes()
maxValue = 0
bridge = False
for x in range(w*h):
for i in range(nblayer):
value = tile_value.get(data["layers"][i]["data"][x])
if value == None: value = TILE_AIR
if value > maxValue: maxValue = value
if value == TILE_BRIDGE:
maxValue = TILE_AIR
bridge = True
if bridge:
if value != TILE_AIR:
maxValue = value
info_map += fxconv.u16(maxValue)
maxValue = 0
bridge = False
o += fxconv.ref(info_map)
#generate the array of tiles from the layer
for layer in data["layers"]:
layer_data = bytes()
for tile in layer["data"]:
layer_data += fxconv.u16(tile)
o += fxconv.ref(layer_data)
2021-07-29 18:33:22 +02:00
2021-08-15 03:10:05 +02:00
#generate !
2021-08-06 23:42:49 +02:00
fxconv.elf(o, output, "_" + params["name"], **target)
def convert_character(input, output, params, target):
with open(input,"r") as dialog:
file = dialog.read().splitlines()
o = fxconv.ObjectData()
o += fxconv.u32((int)(file[0])) + fxconv.u32((int)(file[1]))
2021-08-15 03:10:05 +02:00
o += fxconv.ref(bytes(file[2], 'utf-8') + bytes(1)) #bytes(1) is necessary to end a char
2021-08-06 23:42:49 +02:00
o += fxconv.ref(bytes(file[3], 'utf-8') + bytes(1))
2021-07-29 18:33:22 +02:00
fxconv.elf(o, output, "_" + params["name"], **target)