From a556d221178dc27b03ff92307a055af562099632 Mon Sep 17 00:00:00 2001 From: Taka Date: Thu, 21 Jul 2022 13:24:06 +1000 Subject: [PATCH] Got 1/2" counters showing at the smaller size again. --- vasl_templates/tools/get_piece_info.py | 73 ++++++++++++++++++ .../webapp/data/vasl-6.6.0/piece-info.json | 65 ++++++++++++++++ .../webapp/data/vasl-6.6.1/piece-info.json | 65 ++++++++++++++++ .../webapp/data/vasl-6.6.2/piece-info.json | 65 ++++++++++++++++ .../webapp/data/vasl-6.6.3/piece-info.json | 65 ++++++++++++++++ .../webapp/data/vasl-6.6.4/piece-info.json | 65 ++++++++++++++++ .../webapp/static/css/edit-vo-dialog.css | 2 +- vasl_templates/webapp/static/css/tabs-ob.css | 2 +- vasl_templates/webapp/static/vo.js | 2 +- vasl_templates/webapp/vasl_mod.py | 9 ++- vassal-shim/release/vassal-shim.jar | Bin 34563 -> 34965 bytes vassal-shim/src/vassal_shim/Main.java | 6 ++ vassal-shim/src/vassal_shim/VassalShim.java | 30 +++++++ 13 files changed, 443 insertions(+), 6 deletions(-) create mode 100755 vasl_templates/tools/get_piece_info.py create mode 100644 vasl_templates/webapp/data/vasl-6.6.0/piece-info.json create mode 100644 vasl_templates/webapp/data/vasl-6.6.1/piece-info.json create mode 100644 vasl_templates/webapp/data/vasl-6.6.2/piece-info.json create mode 100644 vasl_templates/webapp/data/vasl-6.6.3/piece-info.json create mode 100644 vasl_templates/webapp/data/vasl-6.6.4/piece-info.json diff --git a/vasl_templates/tools/get_piece_info.py b/vasl_templates/tools/get_piece_info.py new file mode 100755 index 0000000..338118f --- /dev/null +++ b/vasl_templates/tools/get_piece_info.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +""" Prepare the piece info for a VASL module. + +The main program used to identify 5/8" counters by reading a module's buildFile and checking the height +attribute of the PieceSlot nodes, but it turns out this is the wrong thing to do (this field actually +controls the size of the piece's entry in the counter palette): + https://github.com/vasl-developers/vasl/issues/1195 + +For each version of VASL supported, run vassal-shim (getPieceInfo command) to analyze the module's +buildFile and get the correct counter sizes. Then pass the output into this script, to generate +the final data file that should be saved in the $/data/vasl-$VERSION/ directory, where it will +be read by the main program. + +NOTE: Introducing this process opens the possibility of also extracting the image file paths +within the .vmod file, instead of the current messy parsing of the PieceSlot CDATA... :-/ +""" + +import sys +import os +import json + +import xml.etree.ElementTree as ET + +# --------------------------------------------------------------------- + +# initialize +report = {} + +# figure out which GPID's we're interested in +gpids = set() +def get_gpids( vo_type ): + """Get the GPID's from our data files.""" + dname = os.path.join( os.path.dirname(__file__), "../webapp/data", vo_type ) + for root,_,fnames in os.walk( dname ): + for fname in fnames: + if os.path.splitext( fname )[1] != ".json": + continue + fname = os.path.join( root, fname ) + with open( fname, "r", encoding="utf-8" ) as fp: + entries = json.load( fp ) + for entry in entries: + entry_gpid = entry.get( "gpid" ) + if not entry_gpid: + continue + if isinstance( entry_gpid, list ): + gpids.update( str(g) for g in entry_gpid ) + else: + gpids.add( str( entry_gpid ) ) +get_gpids( "vehicles" ) +get_gpids( "ordnance" ) + +# parse the piece info generated by vassal-shim +doc = ET.parse( sys.stdin ) +for piece_info in doc.getroot(): + gpid = piece_info.attrib["gpid"] + if gpid not in gpids: + continue + info = {} + # check if the next piece is small + if int( piece_info.attrib["height"] ) <= 48: + info["is_small"] = True + if info: + report[ gpid ] = info + +# output the final report +print( "{" ) +lines = [] +for gpid, piece_info in report.items(): + lines.append( "\"{}\": {}".format( + gpid, json.dumps( piece_info ) + ) ) +print( ",\n".join( lines ) ) +print( "}" ) diff --git a/vasl_templates/webapp/data/vasl-6.6.0/piece-info.json b/vasl_templates/webapp/data/vasl-6.6.0/piece-info.json new file mode 100644 index 0000000..8774684 --- /dev/null +++ b/vasl_templates/webapp/data/vasl-6.6.0/piece-info.json @@ -0,0 +1,65 @@ +{ +"6996": {"is_small": true}, +"485": {"is_small": true}, +"850": {"is_small": true}, +"849": {"is_small": true}, +"12689": {"is_small": true}, +"856": {"is_small": true}, +"857": {"is_small": true}, +"11336": {"is_small": true}, +"858": {"is_small": true}, +"11337": {"is_small": true}, +"1149": {"is_small": true}, +"1153": {"is_small": true}, +"12687": {"is_small": true}, +"3b5:7613": {"is_small": true}, +"11359": {"is_small": true}, +"3b5:11259": {"is_small": true}, +"1632": {"is_small": true}, +"1636": {"is_small": true}, +"1641": {"is_small": true}, +"1648": {"is_small": true}, +"1982": {"is_small": true}, +"1983": {"is_small": true}, +"1984": {"is_small": true}, +"1985": {"is_small": true}, +"1986": {"is_small": true}, +"1987": {"is_small": true}, +"1988": {"is_small": true}, +"2172": {"is_small": true}, +"2173": {"is_small": true}, +"2176": {"is_small": true}, +"2179": {"is_small": true}, +"11391": {"is_small": true}, +"11392": {"is_small": true}, +"11395": {"is_small": true}, +"11396": {"is_small": true}, +"11440": {"is_small": true}, +"3b5:8401": {"is_small": true}, +"3b5:8402": {"is_small": true}, +"2465": {"is_small": true}, +"2474": {"is_small": true}, +"3252": {"is_small": true}, +"3253": {"is_small": true}, +"3263": {"is_small": true}, +"3422": {"is_small": true}, +"3428": {"is_small": true}, +"6730": {"is_small": true}, +"3605": {"is_small": true}, +"3608": {"is_small": true}, +"6763": {"is_small": true}, +"3679": {"is_small": true}, +"3680": {"is_small": true}, +"3681": {"is_small": true}, +"3682": {"is_small": true}, +"3691": {"is_small": true}, +"3692": {"is_small": true}, +"3959": {"is_small": true}, +"11558": {"is_small": true}, +"11559": {"is_small": true}, +"3b5:10150": {"is_small": true}, +"3b5:10151": {"is_small": true}, +"11600": {"is_small": true}, +"11604": {"is_small": true}, +"3b5:7871": {"is_small": true} +} diff --git a/vasl_templates/webapp/data/vasl-6.6.1/piece-info.json b/vasl_templates/webapp/data/vasl-6.6.1/piece-info.json new file mode 100644 index 0000000..8774684 --- /dev/null +++ b/vasl_templates/webapp/data/vasl-6.6.1/piece-info.json @@ -0,0 +1,65 @@ +{ +"6996": {"is_small": true}, +"485": {"is_small": true}, +"850": {"is_small": true}, +"849": {"is_small": true}, +"12689": {"is_small": true}, +"856": {"is_small": true}, +"857": {"is_small": true}, +"11336": {"is_small": true}, +"858": {"is_small": true}, +"11337": {"is_small": true}, +"1149": {"is_small": true}, +"1153": {"is_small": true}, +"12687": {"is_small": true}, +"3b5:7613": {"is_small": true}, +"11359": {"is_small": true}, +"3b5:11259": {"is_small": true}, +"1632": {"is_small": true}, +"1636": {"is_small": true}, +"1641": {"is_small": true}, +"1648": {"is_small": true}, +"1982": {"is_small": true}, +"1983": {"is_small": true}, +"1984": {"is_small": true}, +"1985": {"is_small": true}, +"1986": {"is_small": true}, +"1987": {"is_small": true}, +"1988": {"is_small": true}, +"2172": {"is_small": true}, +"2173": {"is_small": true}, +"2176": {"is_small": true}, +"2179": {"is_small": true}, +"11391": {"is_small": true}, +"11392": {"is_small": true}, +"11395": {"is_small": true}, +"11396": {"is_small": true}, +"11440": {"is_small": true}, +"3b5:8401": {"is_small": true}, +"3b5:8402": {"is_small": true}, +"2465": {"is_small": true}, +"2474": {"is_small": true}, +"3252": {"is_small": true}, +"3253": {"is_small": true}, +"3263": {"is_small": true}, +"3422": {"is_small": true}, +"3428": {"is_small": true}, +"6730": {"is_small": true}, +"3605": {"is_small": true}, +"3608": {"is_small": true}, +"6763": {"is_small": true}, +"3679": {"is_small": true}, +"3680": {"is_small": true}, +"3681": {"is_small": true}, +"3682": {"is_small": true}, +"3691": {"is_small": true}, +"3692": {"is_small": true}, +"3959": {"is_small": true}, +"11558": {"is_small": true}, +"11559": {"is_small": true}, +"3b5:10150": {"is_small": true}, +"3b5:10151": {"is_small": true}, +"11600": {"is_small": true}, +"11604": {"is_small": true}, +"3b5:7871": {"is_small": true} +} diff --git a/vasl_templates/webapp/data/vasl-6.6.2/piece-info.json b/vasl_templates/webapp/data/vasl-6.6.2/piece-info.json new file mode 100644 index 0000000..8774684 --- /dev/null +++ b/vasl_templates/webapp/data/vasl-6.6.2/piece-info.json @@ -0,0 +1,65 @@ +{ +"6996": {"is_small": true}, +"485": {"is_small": true}, +"850": {"is_small": true}, +"849": {"is_small": true}, +"12689": {"is_small": true}, +"856": {"is_small": true}, +"857": {"is_small": true}, +"11336": {"is_small": true}, +"858": {"is_small": true}, +"11337": {"is_small": true}, +"1149": {"is_small": true}, +"1153": {"is_small": true}, +"12687": {"is_small": true}, +"3b5:7613": {"is_small": true}, +"11359": {"is_small": true}, +"3b5:11259": {"is_small": true}, +"1632": {"is_small": true}, +"1636": {"is_small": true}, +"1641": {"is_small": true}, +"1648": {"is_small": true}, +"1982": {"is_small": true}, +"1983": {"is_small": true}, +"1984": {"is_small": true}, +"1985": {"is_small": true}, +"1986": {"is_small": true}, +"1987": {"is_small": true}, +"1988": {"is_small": true}, +"2172": {"is_small": true}, +"2173": {"is_small": true}, +"2176": {"is_small": true}, +"2179": {"is_small": true}, +"11391": {"is_small": true}, +"11392": {"is_small": true}, +"11395": {"is_small": true}, +"11396": {"is_small": true}, +"11440": {"is_small": true}, +"3b5:8401": {"is_small": true}, +"3b5:8402": {"is_small": true}, +"2465": {"is_small": true}, +"2474": {"is_small": true}, +"3252": {"is_small": true}, +"3253": {"is_small": true}, +"3263": {"is_small": true}, +"3422": {"is_small": true}, +"3428": {"is_small": true}, +"6730": {"is_small": true}, +"3605": {"is_small": true}, +"3608": {"is_small": true}, +"6763": {"is_small": true}, +"3679": {"is_small": true}, +"3680": {"is_small": true}, +"3681": {"is_small": true}, +"3682": {"is_small": true}, +"3691": {"is_small": true}, +"3692": {"is_small": true}, +"3959": {"is_small": true}, +"11558": {"is_small": true}, +"11559": {"is_small": true}, +"3b5:10150": {"is_small": true}, +"3b5:10151": {"is_small": true}, +"11600": {"is_small": true}, +"11604": {"is_small": true}, +"3b5:7871": {"is_small": true} +} diff --git a/vasl_templates/webapp/data/vasl-6.6.3/piece-info.json b/vasl_templates/webapp/data/vasl-6.6.3/piece-info.json new file mode 100644 index 0000000..8774684 --- /dev/null +++ b/vasl_templates/webapp/data/vasl-6.6.3/piece-info.json @@ -0,0 +1,65 @@ +{ +"6996": {"is_small": true}, +"485": {"is_small": true}, +"850": {"is_small": true}, +"849": {"is_small": true}, +"12689": {"is_small": true}, +"856": {"is_small": true}, +"857": {"is_small": true}, +"11336": {"is_small": true}, +"858": {"is_small": true}, +"11337": {"is_small": true}, +"1149": {"is_small": true}, +"1153": {"is_small": true}, +"12687": {"is_small": true}, +"3b5:7613": {"is_small": true}, +"11359": {"is_small": true}, +"3b5:11259": {"is_small": true}, +"1632": {"is_small": true}, +"1636": {"is_small": true}, +"1641": {"is_small": true}, +"1648": {"is_small": true}, +"1982": {"is_small": true}, +"1983": {"is_small": true}, +"1984": {"is_small": true}, +"1985": {"is_small": true}, +"1986": {"is_small": true}, +"1987": {"is_small": true}, +"1988": {"is_small": true}, +"2172": {"is_small": true}, +"2173": {"is_small": true}, +"2176": {"is_small": true}, +"2179": {"is_small": true}, +"11391": {"is_small": true}, +"11392": {"is_small": true}, +"11395": {"is_small": true}, +"11396": {"is_small": true}, +"11440": {"is_small": true}, +"3b5:8401": {"is_small": true}, +"3b5:8402": {"is_small": true}, +"2465": {"is_small": true}, +"2474": {"is_small": true}, +"3252": {"is_small": true}, +"3253": {"is_small": true}, +"3263": {"is_small": true}, +"3422": {"is_small": true}, +"3428": {"is_small": true}, +"6730": {"is_small": true}, +"3605": {"is_small": true}, +"3608": {"is_small": true}, +"6763": {"is_small": true}, +"3679": {"is_small": true}, +"3680": {"is_small": true}, +"3681": {"is_small": true}, +"3682": {"is_small": true}, +"3691": {"is_small": true}, +"3692": {"is_small": true}, +"3959": {"is_small": true}, +"11558": {"is_small": true}, +"11559": {"is_small": true}, +"3b5:10150": {"is_small": true}, +"3b5:10151": {"is_small": true}, +"11600": {"is_small": true}, +"11604": {"is_small": true}, +"3b5:7871": {"is_small": true} +} diff --git a/vasl_templates/webapp/data/vasl-6.6.4/piece-info.json b/vasl_templates/webapp/data/vasl-6.6.4/piece-info.json new file mode 100644 index 0000000..8774684 --- /dev/null +++ b/vasl_templates/webapp/data/vasl-6.6.4/piece-info.json @@ -0,0 +1,65 @@ +{ +"6996": {"is_small": true}, +"485": {"is_small": true}, +"850": {"is_small": true}, +"849": {"is_small": true}, +"12689": {"is_small": true}, +"856": {"is_small": true}, +"857": {"is_small": true}, +"11336": {"is_small": true}, +"858": {"is_small": true}, +"11337": {"is_small": true}, +"1149": {"is_small": true}, +"1153": {"is_small": true}, +"12687": {"is_small": true}, +"3b5:7613": {"is_small": true}, +"11359": {"is_small": true}, +"3b5:11259": {"is_small": true}, +"1632": {"is_small": true}, +"1636": {"is_small": true}, +"1641": {"is_small": true}, +"1648": {"is_small": true}, +"1982": {"is_small": true}, +"1983": {"is_small": true}, +"1984": {"is_small": true}, +"1985": {"is_small": true}, +"1986": {"is_small": true}, +"1987": {"is_small": true}, +"1988": {"is_small": true}, +"2172": {"is_small": true}, +"2173": {"is_small": true}, +"2176": {"is_small": true}, +"2179": {"is_small": true}, +"11391": {"is_small": true}, +"11392": {"is_small": true}, +"11395": {"is_small": true}, +"11396": {"is_small": true}, +"11440": {"is_small": true}, +"3b5:8401": {"is_small": true}, +"3b5:8402": {"is_small": true}, +"2465": {"is_small": true}, +"2474": {"is_small": true}, +"3252": {"is_small": true}, +"3253": {"is_small": true}, +"3263": {"is_small": true}, +"3422": {"is_small": true}, +"3428": {"is_small": true}, +"6730": {"is_small": true}, +"3605": {"is_small": true}, +"3608": {"is_small": true}, +"6763": {"is_small": true}, +"3679": {"is_small": true}, +"3680": {"is_small": true}, +"3681": {"is_small": true}, +"3682": {"is_small": true}, +"3691": {"is_small": true}, +"3692": {"is_small": true}, +"3959": {"is_small": true}, +"11558": {"is_small": true}, +"11559": {"is_small": true}, +"3b5:10150": {"is_small": true}, +"3b5:10151": {"is_small": true}, +"11600": {"is_small": true}, +"11604": {"is_small": true}, +"3b5:7871": {"is_small": true} +} diff --git a/vasl_templates/webapp/static/css/edit-vo-dialog.css b/vasl_templates/webapp/static/css/edit-vo-dialog.css index 8e8379b..c253e5d 100644 --- a/vasl_templates/webapp/static/css/edit-vo-dialog.css +++ b/vasl_templates/webapp/static/css/edit-vo-dialog.css @@ -3,7 +3,7 @@ .ui-dialog.edit-vo .header { display: flex ; align-items: center ; margin-bottom: 0.5em ; } .ui-dialog.edit-vo .header img.vasl-image { height: 3.5em ; margin-right: 0.5em ; } -.ui-dialog.edit-vo .header img.vasl-image.small-piece { height: 2.7em ; margin-left: 0.4em ; margin-right: 0.9em ; } +.ui-dialog.edit-vo .header img.vasl-image.small-piece { height: 2.7em ; margin-left: 0.4em ; margin-right: 0.4em ; } .ui-dialog.edit-vo .header .content { display: flex ; flex-direction: column ; justify-content: center ; } .ui-dialog.edit-vo .header .content .vo-name { margin-left: 0.5em ; font-size: 125% ; font-weight: bold ; color: #333 ; } .ui-dialog.edit-vo .header .content input.select-vo-image { width: 15px ; position: relative ; top: 10px ; } diff --git a/vasl_templates/webapp/static/css/tabs-ob.css b/vasl_templates/webapp/static/css/tabs-ob.css index 7660733..b2234c9 100644 --- a/vasl_templates/webapp/static/css/tabs-ob.css +++ b/vasl_templates/webapp/static/css/tabs-ob.css @@ -23,7 +23,7 @@ /* nb: the following CSS is shared by vehicles and ordnance */ .panel-ob_vo .sortable .vo-entry { display: flex ; position: relative ; } .panel-ob_vo .sortable .vo-entry img.vasl-image { display: inline-block ; vertical-align: middle ; height: 3.25em ; margin-right: 0.5em ; } -.panel-ob_vo .sortable .vo-entry.small-piece img.vasl-image { height: 2.25em ; margin-left: 0.5em ; margin-right: 0.75em ; } +.panel-ob_vo .sortable .vo-entry.small-piece img.vasl-image { height: 2.5em ; margin-left: 0.375em ; margin-right: 0.875em ; } .panel-ob_vo .sortable .vo-entry .detail { flex-grow: 1 ; display: flex ; flex-direction: column ; justify-content: center ; } .panel-ob_vo .sortable .vo-entry .detail .vo-type { font-style: italic ; font-size: 80% ; color: #666 ; } .panel-ob_vo .sortable .vo-entry .detail .vo-capabilities { max-height: 2.5em ; overflow: hidden ; font-size: 80% ; font-style: italic ; } diff --git a/vasl_templates/webapp/static/vo.js b/vasl_templates/webapp/static/vo.js index 22e9af6..4ea8c51 100644 --- a/vasl_templates/webapp/static/vo.js +++ b/vasl_templates/webapp/static/vo.js @@ -212,7 +212,7 @@ function do_add_vo( vo_type, player_no, vo_entry, vo_image_id, elite, custom_cap var fixed_height = "3.25em" ; if ( is_small_vasl_piece( vo_entry ) ) { div_tag += " small-piece" ; - fixed_height = "2.25em" ; + fixed_height = "2.5em" ; } div_tag += "'>" ; var data = { diff --git a/vasl_templates/webapp/vasl_mod.py b/vasl_templates/webapp/vasl_mod.py index c1462db..9a0480c 100644 --- a/vasl_templates/webapp/vasl_mod.py +++ b/vasl_templates/webapp/vasl_mod.py @@ -277,9 +277,12 @@ class VaslMod: target_gpids = get_vo_gpids( self ) # parse the VASL module and any extensions + fname = os.path.join( data_dir, "vasl-"+self.vasl_version, "piece-info.json" ) + with open( fname, "r", encoding="utf-8" ) as fp: + piece_info = json.load( fp ) for i,files in enumerate( self._files ): _logger.info( "Loading VASL %s: %s", ("module" if i == 0 else "extension"), files[0].filename ) - self._parse_zip_file( files[0], target_gpids, vasl_overrides, expected_multiple_images ) + self._parse_zip_file( files[0], target_gpids, piece_info, vasl_overrides, expected_multiple_images ) # NOTE: The code below may log warnings if we're using an older version of VASL (because we know # about pieces that were added in a later version, but, of course, aren't in the older version). @@ -299,7 +302,7 @@ class VaslMod: gpids = ", ".join( expected_multiple_images.keys() ) _logger.warning( "Expected multiple images but didn't find them: %s", gpids ) - def _parse_zip_file( self, zip_file, target_gpids, vasl_overrides, expected_multiple_images ): #pylint: disable=too-many-locals + def _parse_zip_file( self, zip_file, target_gpids, piece_info, vasl_overrides, expected_multiple_images ): #pylint: disable=too-many-locals """Parse a VASL module or extension.""" # load the build file @@ -329,7 +332,7 @@ class VaslMod: "name": node.attrib["entryName"].strip(), "front_images": front_images, "back_images": back_images, - "is_small": int(node.attrib["height"]) <= 48, + "is_small": piece_info.get( gpid, {} ).get( "is_small", False ), "zip_file": zip_file, } diff --git a/vassal-shim/release/vassal-shim.jar b/vassal-shim/release/vassal-shim.jar index 1af3fd8860275469a224b48210f0430d65c2da65..31c0d22a0e3abf89b87c5da53e6657253d15a87f 100644 GIT binary patch delta 20616 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 delta 20233 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

r;IZt*MpK?6&qePg?Rk6o^8rpq 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 L6`|@t|MLA0kMVZv diff --git a/vassal-shim/src/vassal_shim/Main.java b/vassal-shim/src/vassal_shim/Main.java index 0186532..daf7814 100644 --- a/vassal-shim/src/vassal_shim/Main.java +++ b/vassal-shim/src/vassal_shim/Main.java @@ -82,6 +82,12 @@ public class Main shim.prepareUpload( args[2], args[3], args[4] ) ; System.exit( 0 ) ; } + else if ( cmd.equals( "getpieceinfo" ) ) { + checkArgs( args, 3, false, "the VASL .vmod file, and output file" ) ; + VassalShim shim = new VassalShim( args[1], null ) ; + shim.getPieceInfo( args[2] ) ; + System.exit( 0 ) ; + } else if ( cmd.equals( "version" ) ) { checkArgs( args, 2, false, "the output file" ) ; System.out.println( Info.getVersion() ) ; diff --git a/vassal-shim/src/vassal_shim/VassalShim.java b/vassal-shim/src/vassal_shim/VassalShim.java index 6208530..da24d3a 100644 --- a/vassal-shim/src/vassal_shim/VassalShim.java +++ b/vassal-shim/src/vassal_shim/VassalShim.java @@ -25,6 +25,7 @@ import java.util.regex.Pattern ; import java.util.regex.Matcher ; import java.awt.Point ; import java.awt.Dimension ; +import java.awt.Rectangle ; import javax.xml.parsers.DocumentBuilderFactory ; import javax.xml.parsers.DocumentBuilder ; @@ -1032,6 +1033,35 @@ public class VassalShim logger.info( "All done." ) ; } + public void getPieceInfo( String reportFilename ) + throws IOException, TransformerException, TransformerConfigurationException, ParserConfigurationException + { + // initialize + Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument() ; + Element rootElem = doc.createElement( "pieceInfos" ) ; + doc.appendChild( rootElem ) ; + + // get the info for each piece + logger.info( "Getting piece info..." ) ; + int nPieces = 0 ; + for ( PieceSlot pieceSlot : GameModule.getGameModule().getAllDescendantComponentsOf( PieceSlot.class ) ) { + GamePiece gamePiece = pieceSlot.getPiece() ; + Rectangle bbox = gamePiece.boundingBox() ; + Element elem = doc.createElement( "pieceInfo" ) ; + elem.setAttribute( "gpid", pieceSlot.getGpId() ) ; + elem.setAttribute( "width", Integer.toString( bbox.width ) ) ; + elem.setAttribute( "height", Integer.toString( bbox.height ) ) ; + rootElem.appendChild( elem ) ; + nPieces += 1 ; + } + logger.info( "- Found " + Integer.toString(nPieces) + " pieces." ) ; + + // save the results + logger.debug( "Saving piece info report: " + reportFilename ) ; + File outputFile = new File( reportFilename ) ; + Utils.saveXml( doc, reportFilename ) ; + } + private VASSAL.build.module.Map selectMap() { // NOTE: VASL 6.5.0 introduced a new map ("Casualties") as part of the new Casualties Bin feature,