flame-engine/tiled.dart

FormatException when parsing a tmx file

devoncarew opened this issue · 2 comments

This is for version 0.9.0 of package:tiled. I get a FormatException when parsing a specific tmx file. I believe this is due to some empty terrain values in some tile elements; for example, <tile id="4" terrain=",,,0"/>.

The following FormatException was thrown building FutureBuilder<void>(dirty, state:
_FutureBuilderState<void>#f3561):
Invalid number (at character 1)

^

The relevant error-causing widget was:
  FutureBuilder<void>
  FutureBuilder:file:///Users/devoncarew/.pub-cache/hosted/pub.dev/flame-1.4.0/lib/src/game/game_widget/game_widget.dart:358:28

When the exception was thrown, this was the stack:
#0      int._handleFormatError (dart:core-patch/integers_patch.dart:124:7)
#1      int.parse (dart:core-patch/integers_patch.dart:50:14)
#2      MappedListIterable.elementAt (dart:_internal/iterable.dart:414:31)
#3      ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
#4      new _GrowableList._ofEfficientLengthIterable (dart:core-patch/growable_array.dart:189:27)
#5      new _GrowableList.of (dart:core-patch/growable_array.dart:150:28)
#6      new List.of (dart:core-patch/array_patch.dart:52:28)
#7      ListIterable.toList (dart:_internal/iterable.dart:214:7)
#8      new Tile.parse (package:tiled/src/tileset/tile.dart:64:20)
#9      MappedListIterable.elementAt (dart:_internal/iterable.dart:414:31)
#10     ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
#11     new _GrowableList._ofEfficientLengthIterable (dart:core-patch/growable_array.dart:189:27)
#12     new _GrowableList.of (dart:core-patch/growable_array.dart:150:28)
#13     new List.of (dart:core-patch/array_patch.dart:52:28)
#14     ListIterable.toList (dart:_internal/iterable.dart:214:7)
#15     Parser.getChildrenAs (package:tiled/src/parser.dart:88:42)
#16     new Tileset.parse.<anonymous closure> (package:tiled/src/tileset/tileset.dart:127:20)
#17     XmlParser.formatSpecificParsing (package:tiled/src/parser.dart:41:15)
#18     new Tileset.parse (package:tiled/src/tileset/tileset.dart:125:26)
#19     new TiledMap.parse.<anonymous closure> (package:tiled/src/tiled_map.dart:285:26)
#20     MappedListIterable.elementAt (dart:_internal/iterable.dart:414:31)
#21     ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
#22     new _GrowableList._ofEfficientLengthIterable (dart:core-patch/growable_array.dart:189:27)
#23     new _GrowableList.of (dart:core-patch/growable_array.dart:150:28)
#24     new List.of (dart:core-patch/array_patch.dart:52:28)
#25     ListIterable.toList (dart:_internal/iterable.dart:214:7)
#26     Parser.getChildrenAs (package:tiled/src/parser.dart:88:42)
#27     new TiledMap.parse (package:tiled/src/tiled_map.dart:280:29)
#28     TileMapParser.parseTmx (package:tiled/src/tile_map_parser.dart:19:21)
#29     TiledMap.fromString (package:tiled/src/tiled_map.dart:145:26)
<asynchronous suspension>
#30     RenderableTiledMap.fromString (package:flame_tiled/src/renderable_tile_map.dart:209:17)
<asynchronous suspension>
#31     TiledComponent.load (package:flame_tiled/src/tiled_component.dart:93:7)
<asynchronous suspension>
#32     TiledGame.onLoad (file:///Users/devoncarew/projects/devoncarew/mushamils/example/tiled_example.dart:23:9)
<asynchronous suspension>
#33     _GameWidgetState.loaderFuture.<anonymous closure> (package:flame/src/game/game_widget/game_widget.dart:201:11)
<asynchronous suspension>
#34     _FutureBuilderState._subscribe.<anonymous closure> (package:flutter/src/widgets/async.dart:628:33)
<asynchronous suspension>

Thanks for your bug report! I'll post it on Discord to see if anyone can look into it.

I have an attempt at a fix here: #61.

I'm not sure how common use of the terrain fields are (or whether flame_tiled supports them), but the editor I was using generates them. From the spec here: https://doc.mapeditor.org/en/stable/reference/tmx-map-format/#tile, it does seem like empty values are supported (Leaving out a value means that corner has no terrain).