2021-07-29 18:33:22 +02:00
import fxconv
2021-07-30 02:01:05 +02:00
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
else :
return 1
def convert_map ( input , output , params , target ) :
2021-08-27 02:11:05 +02:00
TILE_BRIDGE = - 1 #only for bridge detection to avoid solid behind
2021-07-31 03:40:14 +02:00
TILE_AIR = 0
TILE_SOLID = 1
2021-08-22 02:39:01 +02:00
TILE_DOOR_IN = 2
TILE_DOOR_OUT = 3
2021-08-26 01:17:48 +02:00
TILE_TALKABLE = 4
2022-01-18 23:43:48 +01:00
TILE_TELEPORTER = 5
2021-07-29 18:33:22 +02:00
2022-01-18 18:59:09 +01:00
DIALOG_LAYOUT = " dialog "
2022-01-18 23:43:48 +01:00
TELEPORTER_LAYOUT = " teleporter "
2022-01-18 18:59:09 +01:00
data = json . load ( open ( input , " r " ) )
2021-07-30 02:01:05 +02:00
2021-08-22 02:39:01 +02:00
#find the tileset in use. it's a relative path (like ../tileset.tsx)
nameTileset = data [ " tilesets " ] [ 0 ] [ " source " ] . replace ( " .tsx " , " " )
#the name of the tileset without the .something
nameTilesetFree = nameTileset . split ( " / " ) [ - 1 ]
#count the number of "back" (cd ..) to locate the tileset on the computer
nbRetour = nameTileset . count ( " .. " ) + 1
#create the tileset absolute path
tilesetPath = " / " . join ( input . split ( " / " ) [ : - nbRetour ] ) + " / " + nameTileset . split ( " / " ) [ - 1 ] + " .json "
tileset = open ( tilesetPath , " r " )
2021-07-31 03:40:14 +02:00
data_tileset = json . load ( tileset )
tileset . close ( )
tile_value = { }
2021-08-27 02:11:05 +02:00
#create a dictionnary {tile id:type}
2021-07-31 03:40:14 +02:00
for i in data_tileset [ " tiles " ] :
2021-08-27 02:11:05 +02:00
id = i [ " id " ] + 1
type = i [ " type " ]
if type == " air " :
value = TILE_AIR
elif type == " solid " :
value = TILE_SOLID
elif type == " door_in " :
value = TILE_DOOR_IN
elif type == " door_out " :
value = TILE_DOOR_OUT
elif type == " talkable " :
value = TILE_TALKABLE
elif type == " bridge " :
value = TILE_BRIDGE
2022-01-18 23:43:48 +01:00
elif type == " teleporter " :
value = TILE_TELEPORTER
2021-08-27 02:11:05 +02:00
else :
value = TILE_AIR
tile_value [ id ] = value
#Extract from the json the width, height
2021-08-17 22:19:19 +02:00
w , h = data [ " width " ] , data [ " height " ]
2021-07-31 03:40:14 +02:00
2021-08-27 02:11:05 +02:00
#nbTileLayer is the number of "true" layers (without ObjectsLayer)
2022-01-18 18:59:09 +01:00
nbTilelayer = [ " data " in i for i in data [ " layers " ] ] . count ( True )
objectLayers = data [ " layers " ] [ nbTilelayer : len ( data [ " layers " ] ) ]
2021-08-26 01:17:48 +02:00
2022-01-18 18:59:09 +01:00
nbDialog = 0
2022-01-18 23:43:48 +01:00
nbTelep = 0
2021-08-26 01:17:48 +02:00
structMap = fxconv . Structure ( )
dialogs = fxconv . Structure ( )
2022-01-18 23:43:48 +01:00
teleporter = fxconv . Structure ( )
2021-08-26 01:17:48 +02:00
2022-01-18 18:59:09 +01:00
for layer in objectLayers :
if layer . get ( " name " ) == DIALOG_LAYOUT :
nbDialog = len ( layer [ " objects " ] )
dialogs = parseDialog ( layer )
2022-01-18 23:43:48 +01:00
elif layer . get ( " name " ) == TELEPORTER_LAYOUT :
nbTelep = len ( layer [ " objects " ] )
teleporter = parseTeleporter ( layer )
2022-01-18 18:59:09 +01:00
else :
print ( " UNKNOWN LAYOUT FOUND : " + layer . get ( " name " ) )
2022-01-18 23:43:48 +01:00
structMap + = fxconv . u32 ( w ) + fxconv . u32 ( h ) + fxconv . u32 ( nbTilelayer ) + fxconv . u32 ( nbDialog ) + fxconv . u32 ( nbTelep )
2022-01-18 18:59:09 +01:00
structMap + = fxconv . ref ( f " img_ { nameTilesetFree } " )
2021-08-26 01:17:48 +02:00
structMap + = fxconv . ptr ( dialogs )
2022-01-18 23:43:48 +01:00
structMap + = fxconv . ptr ( teleporter )
2021-07-31 03:40:14 +02:00
2021-08-18 02:10:31 +02:00
#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 ) :
2021-08-26 01:17:48 +02:00
for i in range ( nbTilelayer ) :
2021-08-18 02:10:31 +02:00
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
2021-08-27 02:11:05 +02:00
structMap + = fxconv . ptr ( info_map )
2021-08-18 02:10:31 +02:00
#generate the array of tiles from the layer
2021-08-26 01:17:48 +02:00
for i in range ( nbTilelayer ) :
2021-08-18 02:10:31 +02:00
layer_data = bytes ( )
2021-08-26 01:17:48 +02:00
layer = data [ " layers " ] [ i ]
2021-08-18 02:10:31 +02:00
for tile in layer [ " data " ] :
layer_data + = fxconv . u16 ( tile )
2021-08-26 01:17:48 +02:00
2021-08-27 02:11:05 +02:00
structMap + = fxconv . ptr ( layer_data )
2021-07-29 18:33:22 +02:00
2021-08-15 03:10:05 +02:00
#generate !
2022-01-18 18:59:09 +01:00
fxconv . elf ( structMap , output , " _ " + params [ " name " ] , * * target )
def parseDialog ( layer ) :
dialogs = fxconv . Structure ( )
for i in layer [ " objects " ] :
dialogs + = fxconv . u32 ( int ( i [ " x " ] / i [ " width " ] ) )
#Tiled seem to start at the bottom y of the object
dialogs + = fxconv . u32 ( int ( i [ " y " ] / i [ " width " ] ) - 1 )
try :
for j in i [ " properties " ] :
if ( j [ " value " ] == " " ) : j [ " value " ] = " "
dialogs + = fxconv . string ( j [ " value " ] )
except KeyError :
dialogs + = fxconv . string ( " default name " )
dialogs + = fxconv . string ( " default text " )
2022-01-18 23:43:48 +01:00
return dialogs
def parseTeleporter ( layer ) :
teleporter = fxconv . Structure ( )
for i in layer [ " objects " ] :
teleporter + = fxconv . u32 ( int ( i [ " x " ] / i [ " width " ] ) )
#Tiled seem to start at the bottom y of the object
teleporter + = fxconv . u32 ( int ( i [ " y " ] / i [ " width " ] ) - 1 )
try :
if len ( i [ " properties " ] ) < 2 :
raise Exception ( " parseTeleporter() : Un téléporteur est mal configuré " )
if len ( i [ " properties " ] ) == 2 :
print ( " parseTeleporter() : passage automatique idMap = -1 sur téléporteur x = " + str ( i [ " properties " ] [ 0 ] [ " value " ] ) + " , y = " + str ( i [ " properties " ] [ 1 ] [ " value " ] ) )
teleporter + = fxconv . u32 ( - 1 ) ;
for j in i [ " properties " ] :
teleporter + = fxconv . u32 ( j [ " value " ] )
except KeyError :
raise Exception ( " parseTeleporter() : Un téléporteur est mal configuré " )
return teleporter