2021-07-29 18:33:22 +02:00
import fxconv
2021-07-30 02:01:05 +02:00
import json
2022-02-17 21:26:33 +01:00
import pathlib
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
2022-01-24 21:27:51 +01:00
elif params [ " custom-type " ] == " capacities " :
2022-01-24 15:15:12 +01:00
convert_capa ( input , output , params , target )
return 0
2022-02-10 15:20:42 +01:00
elif params [ " custom-type " ] == " monster " :
convert_monster ( input , output , params , target )
return 0
2021-07-29 18:33:22 +02:00
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
2022-01-23 00:53:07 +01:00
TILE_GRASS = 6
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-02-17 00:02:00 +01:00
ZONE_LAYOUT = " zone "
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 )
2022-01-22 17:12:24 +01:00
tileset_size = data_tileset . get ( " columns " )
2021-07-31 03:40:14 +02:00
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
2022-01-23 00:53:07 +01:00
elif type == " grass " :
value = TILE_GRASS
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
2022-02-17 00:02:00 +01:00
nbZone = 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 ( )
2022-02-17 00:02:00 +01:00
zone = 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-02-17 00:02:00 +01:00
elif layer . get ( " name " ) == ZONE_LAYOUT :
nbZone = len ( layer [ " objects " ] )
zone = parseZone ( layer )
2022-01-18 18:59:09 +01:00
else :
print ( " UNKNOWN LAYOUT FOUND : " + layer . get ( " name " ) )
2022-02-17 00:02:00 +01:00
structMap + = fxconv . u32 ( w ) + fxconv . u32 ( h ) + fxconv . u32 ( nbTilelayer ) + fxconv . u32 ( nbDialog ) + fxconv . u32 ( nbTelep ) + fxconv . u32 ( nbZone )
2022-01-18 18:59:09 +01:00
structMap + = fxconv . ref ( f " img_ { nameTilesetFree } " )
2022-01-22 17:12:24 +01:00
structMap + = fxconv . u32 ( tileset_size )
2021-08-26 01:17:48 +02:00
structMap + = fxconv . ptr ( dialogs )
2022-01-18 23:43:48 +01:00
structMap + = fxconv . ptr ( teleporter )
2022-02-17 00:02:00 +01:00
structMap + = fxconv . ptr ( zone )
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é " )
2022-01-24 15:15:12 +01:00
return teleporter
2022-02-17 00:02:00 +01:00
def parseZone ( layer ) :
zone = fxconv . Structure ( )
for i in layer [ " objects " ] :
origin = ( int ( i [ ' x ' ] / 16 ) , int ( i [ ' y ' ] / 16 ) )
to = ( int ( origin [ 0 ] + i [ ' width ' ] / 16 ) - 1 , int ( origin [ 1 ] + i [ ' height ' ] / 16 ) - 1 )
zone + = fxconv . u32 ( origin [ 0 ] )
zone + = fxconv . u32 ( origin [ 1 ] )
zone + = fxconv . u32 ( to [ 0 ] )
zone + = fxconv . u32 ( to [ 1 ] )
2022-02-19 01:21:38 +01:00
monsters = bytes ( )
2022-02-17 00:02:00 +01:00
try :
zone + = fxconv . u32 ( i [ " properties " ] [ 0 ] [ " value " ] )
2022-02-19 01:21:38 +01:00
monster_list = i [ " properties " ] [ 1 ] [ " value " ] . split ( " ; " )
zone + = fxconv . u32 ( len ( monster_list ) )
for j in monster_list :
monsters + = fxconv . u16 ( int ( j ) )
except IndexError :
raise Exception ( f " parseZone() : La zone { origin } ; { to } n ' a pas de monstres associés " )
2022-02-17 00:02:00 +01:00
except KeyError :
2022-02-17 01:04:45 +01:00
print ( f " parseZone() : Zone { origin } ; { to } sans niveau de référence, passage automatique à -1 " )
2022-02-17 00:02:00 +01:00
zone + = fxconv . u32 ( - 1 )
2022-02-19 01:21:38 +01:00
zone + = fxconv . ptr ( monsters )
2022-02-17 00:02:00 +01:00
return zone
2022-01-24 15:15:12 +01:00
def convert_capa ( input , output , params , target ) :
2022-02-17 21:26:33 +01:00
liste_file = list ( pathlib . Path ( input ) . parent . glob ( ' *.json ' ) )
capacities = fxconv . Structure ( )
capacities + = fxconv . u32 ( len ( liste_file ) )
for f in liste_file :
file = open ( f , " r " )
data = json . load ( file )
move = fxconv . Structure ( )
try :
move + = fxconv . string ( data [ " name " ] )
move + = fxconv . u32 ( data [ " id " ] )
2022-02-18 15:44:41 +01:00
move + = fxconv . u32 ( 1 if data [ " categorie " ] == " PHYSICAL " else 0 )
2022-02-17 21:26:33 +01:00
move + = fxconv . u32 ( data [ " pp " ] )
move + = fxconv . u32 ( data [ " pp " ] )
2022-02-18 15:44:41 +01:00
categorie = data [ " categorie " ]
if categorie == " PHYSICAL " :
move + = fxconv . u32 ( data [ " atk " ] )
move + = fxconv . u32 ( data [ " precision " ] )
move + = fxconv . u32 ( 0 ) + fxconv . u32 ( 0 ) + fxconv . u32 ( 0 )
elif categorie == " STATUT " :
move + = fxconv . u32 ( 0 ) + fxconv . u32 ( 100 )
move + = fxconv . u32 ( data [ " boost_atk " ] )
move + = fxconv . u32 ( data [ " boost_def " ] )
move + = fxconv . u32 ( data [ " boost_hp " ] )
2022-02-17 21:26:33 +01:00
except KeyError :
raise Exception ( f " convert_capa() : La capacité { data [ ' name ' ] } est mal configurée " )
capacities + = fxconv . ptr ( move )
2022-01-24 15:15:12 +01:00
fxconv . elf ( capacities , output , " _ " + params [ " name " ] , * * target )
2022-02-10 15:20:42 +01:00
def convert_monster ( input , output , params , target ) :
2022-02-19 01:21:38 +01:00
liste_file = list ( pathlib . Path ( input ) . parent . glob ( ' *.json ' ) )
monsters = fxconv . Structure ( )
monsters + = fxconv . u32 ( len ( liste_file ) )
for f in liste_file :
file = open ( f , " r " )
data = json . load ( file )
stats = fxconv . Structure ( )
if len ( data [ " stats " ] ) != 4 : raise Exception ( f " convert_monster : Les statistiques de { data [ ' name ' ] } sont mauvaises " )
stats + = fxconv . u32 ( data [ " stats " ] [ " atk " ] )
stats + = fxconv . u32 ( data [ " stats " ] [ " def " ] )
stats + = fxconv . u32 ( data [ " stats " ] [ " pv " ] )
stats + = fxconv . u32 ( 1 )
stats + = fxconv . u32 ( data [ " stats " ] [ " xp " ] )
stats + = fxconv . u32 ( data [ " stats " ] [ " pv " ] )
moves = bytes ( )
for i in data [ " moves " ] :
moves + = fxconv . u16 ( i )
monster = fxconv . Structure ( )
monster + = fxconv . string ( data [ " name " ] )
monster + = fxconv . ptr ( f " img_ { data [ ' sprite ' ] } " )
monster + = fxconv . u32 ( data [ " id " ] )
monster + = fxconv . u32 ( len ( data [ " moves " ] ) )
monster + = fxconv . ptr ( stats )
monster + = fxconv . ptr ( moves )
monsters + = fxconv . ptr ( monster )
fxconv . elf ( monsters , output , " _ " + params [ " name " ] , * * target )