tilemap-parser 1.0.0__tar.gz → 1.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tilemap_parser-1.0.0/src/tilemap_parser.egg-info → tilemap_parser-1.0.1}/PKG-INFO +1 -1
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/pyproject.toml +1 -1
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/src/tilemap_parser/map_parse.py +84 -22
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/src/tilemap_parser/renderer.py +17 -5
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1/src/tilemap_parser.egg-info}/PKG-INFO +1 -1
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/LICENSE +0 -0
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/README.md +0 -0
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/setup.cfg +0 -0
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/src/tilemap_parser/__init__.py +0 -0
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/src/tilemap_parser/animation.py +0 -0
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/src/tilemap_parser/map_loader.py +0 -0
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/src/tilemap_parser.egg-info/SOURCES.txt +0 -0
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/src/tilemap_parser.egg-info/dependency_links.txt +0 -0
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/src/tilemap_parser.egg-info/requires.txt +0 -0
- {tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/src/tilemap_parser.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tilemap-parser"
|
|
7
|
-
version = "1.0.
|
|
7
|
+
version = "1.0.1"
|
|
8
8
|
description = "Standalone parser/loader for tilemap-editor JSON maps and sprite animation JSON."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -81,7 +81,9 @@ def _optional_dict(value: Any, path: str) -> Optional[JsonDict]:
|
|
|
81
81
|
def _parse_point(text: str, path: str) -> Point:
|
|
82
82
|
if not isinstance(text, str):
|
|
83
83
|
raise MapParseError(_ctx(path, "expected point string"))
|
|
84
|
-
matched = re.search(
|
|
84
|
+
matched = re.search(
|
|
85
|
+
rf"(-?\d+)[{re.escape(string.punctuation)}](-?\d+)$", text.strip()
|
|
86
|
+
)
|
|
85
87
|
if matched is None:
|
|
86
88
|
raise MapParseError(_ctx(path, f"invalid point {text!r}"))
|
|
87
89
|
return int(matched.group(1)), int(matched.group(2))
|
|
@@ -224,7 +226,9 @@ def _parse_objects(objs_obj: JsonDict, ctx: str) -> Dict[int, ParsedObject]:
|
|
|
224
226
|
area_dict = _require_dict(obj_dict.get("area"), f"{ctx}.{key}.area")
|
|
225
227
|
area = _parse_object_area(area_dict, f"{ctx}.{key}.area")
|
|
226
228
|
ttype = _coerce_int(obj_dict.get("ttype"), f"{ctx}.{key}.ttype")
|
|
227
|
-
tileset_type = _require_str(
|
|
229
|
+
tileset_type = _require_str(
|
|
230
|
+
obj_dict.get("tileset_type", "object"), f"{ctx}.{key}.tileset_type"
|
|
231
|
+
)
|
|
228
232
|
variant = _coerce_int(obj_dict.get("variant"), f"{ctx}.{key}.variant")
|
|
229
233
|
props = _optional_dict(obj_dict.get("properties"), f"{ctx}.{key}.properties")
|
|
230
234
|
result[oid] = ParsedObject(
|
|
@@ -246,14 +250,22 @@ def _parse_layer(layer_obj: JsonDict, layer_id: int, ctx: str) -> ParsedLayer:
|
|
|
246
250
|
locked=_coerce_bool(layer_obj.get("locked", False), f"{ctx}.locked"),
|
|
247
251
|
opacity=_coerce_float(layer_obj.get("opacity", 1.0), f"{ctx}.opacity"),
|
|
248
252
|
z_index=_coerce_int(layer_obj.get("z_index", layer_id), f"{ctx}.z_index"),
|
|
249
|
-
properties=_optional_dict(layer_obj.get("properties"), f"{ctx}.properties")
|
|
253
|
+
properties=_optional_dict(layer_obj.get("properties"), f"{ctx}.properties")
|
|
254
|
+
or {},
|
|
255
|
+
)
|
|
256
|
+
layer.tiles = _parse_tiles(
|
|
257
|
+
_require_dict(layer_obj.get("tiles", {}), f"{ctx}.tiles"), f"{ctx}.tiles"
|
|
250
258
|
)
|
|
251
|
-
layer.tiles = _parse_tiles(_require_dict(layer_obj.get("tiles", {}), f"{ctx}.tiles"), f"{ctx}.tiles")
|
|
252
259
|
|
|
253
260
|
if layer.layer_type == "object":
|
|
254
|
-
layer.objects = _parse_objects(
|
|
261
|
+
layer.objects = _parse_objects(
|
|
262
|
+
_require_dict(layer_obj.get("objects", {}), f"{ctx}.objects"),
|
|
263
|
+
f"{ctx}.objects",
|
|
264
|
+
)
|
|
255
265
|
if "next_object_id" in layer_obj and layer_obj["next_object_id"] is not None:
|
|
256
|
-
layer.next_object_id = _coerce_int(
|
|
266
|
+
layer.next_object_id = _coerce_int(
|
|
267
|
+
layer_obj["next_object_id"], f"{ctx}.next_object_id"
|
|
268
|
+
)
|
|
257
269
|
return layer
|
|
258
270
|
|
|
259
271
|
|
|
@@ -264,13 +276,24 @@ def _parse_rule(rule_obj: JsonDict, ctx: str) -> ParsedAutotileRule:
|
|
|
264
276
|
pair_list = _require_list(pair, f"{ctx}.neighbors[{idx}]")
|
|
265
277
|
if len(pair_list) != 2:
|
|
266
278
|
raise MapParseError(_ctx(f"{ctx}.neighbors[{idx}]", "expected [x, y]"))
|
|
267
|
-
neighbors.append(
|
|
279
|
+
neighbors.append(
|
|
280
|
+
(
|
|
281
|
+
_coerce_int(pair_list[0], f"{ctx}.neighbors[{idx}][0]"),
|
|
282
|
+
_coerce_int(pair_list[1], f"{ctx}.neighbors[{idx}][1]"),
|
|
283
|
+
)
|
|
284
|
+
)
|
|
268
285
|
|
|
269
286
|
variants_raw = _require_list(rule_obj.get("variant_ids", []), f"{ctx}.variant_ids")
|
|
270
|
-
variant_ids = [
|
|
287
|
+
variant_ids = [
|
|
288
|
+
_coerce_int(v, f"{ctx}.variant_ids[{i}]") for i, v in enumerate(variants_raw)
|
|
289
|
+
]
|
|
271
290
|
tileset_path = _require_str(rule_obj.get("tileset_path", ""), f"{ctx}.tileset_path")
|
|
272
291
|
tileset_index_raw = rule_obj.get("tileset_index")
|
|
273
|
-
tileset_index =
|
|
292
|
+
tileset_index = (
|
|
293
|
+
_coerce_int(tileset_index_raw, f"{ctx}.tileset_index")
|
|
294
|
+
if tileset_index_raw is not None
|
|
295
|
+
else None
|
|
296
|
+
)
|
|
274
297
|
return ParsedAutotileRule(
|
|
275
298
|
name=_require_str(rule_obj.get("name"), f"{ctx}.name"),
|
|
276
299
|
neighbors=neighbors,
|
|
@@ -284,8 +307,13 @@ def _parse_rule(rule_obj: JsonDict, ctx: str) -> ParsedAutotileRule:
|
|
|
284
307
|
|
|
285
308
|
def _parse_group(group_obj: JsonDict, ctx: str) -> ParsedAutotileGroup:
|
|
286
309
|
rules_raw = _require_list(group_obj.get("rules", []), f"{ctx}.rules")
|
|
287
|
-
rules = [
|
|
288
|
-
|
|
310
|
+
rules = [
|
|
311
|
+
_parse_rule(_require_dict(r, f"{ctx}.rules[{i}]"), f"{ctx}.rules[{i}]")
|
|
312
|
+
for i, r in enumerate(rules_raw)
|
|
313
|
+
]
|
|
314
|
+
return ParsedAutotileGroup(
|
|
315
|
+
name=_require_str(group_obj.get("name"), f"{ctx}.name"), rules=rules
|
|
316
|
+
)
|
|
289
317
|
|
|
290
318
|
|
|
291
319
|
def _parse_tilesets_list(tilesets_raw: List[Any], ctx: str) -> List[ParsedTileset]:
|
|
@@ -303,8 +331,14 @@ def _parse_tilesets_list(tilesets_raw: List[Any], ctx: str) -> List[ParsedTilese
|
|
|
303
331
|
if raw_tile_props is not None:
|
|
304
332
|
tp_obj = _require_dict(raw_tile_props, f"{ctx}[{i}].tile_properties")
|
|
305
333
|
for k, v in tp_obj.items():
|
|
306
|
-
tile_props[str(k)] = _require_dict(
|
|
307
|
-
|
|
334
|
+
tile_props[str(k)] = _require_dict(
|
|
335
|
+
v, f"{ctx}[{i}].tile_properties[{k!r}]"
|
|
336
|
+
)
|
|
337
|
+
out.append(
|
|
338
|
+
ParsedTileset(
|
|
339
|
+
path=path, type=ts_type, properties=props, tile_properties=tile_props
|
|
340
|
+
)
|
|
341
|
+
)
|
|
308
342
|
return out
|
|
309
343
|
|
|
310
344
|
|
|
@@ -341,9 +375,17 @@ def parse_map_dict(root: JsonDict) -> ParsedMap:
|
|
|
341
375
|
root = _require_dict(root, "root")
|
|
342
376
|
meta_obj = _require_dict(root.get("meta"), "meta")
|
|
343
377
|
tile_size = _parse_point_field(meta_obj.get("tile_size"), "meta.tile_size")
|
|
344
|
-
map_size = _parse_point_field(
|
|
378
|
+
map_size = _parse_point_field(
|
|
379
|
+
meta_obj.get("map_size"),
|
|
380
|
+
"meta.map_size",
|
|
381
|
+
default=f"{tile_size[0]};{tile_size[1]}",
|
|
382
|
+
)
|
|
345
383
|
init_raw = meta_obj.get("initial_map_size")
|
|
346
|
-
initial_map_size =
|
|
384
|
+
initial_map_size = (
|
|
385
|
+
map_size
|
|
386
|
+
if init_raw is None
|
|
387
|
+
else _parse_point_field(init_raw, "meta.initial_map_size")
|
|
388
|
+
)
|
|
347
389
|
|
|
348
390
|
meta = ParsedMeta(
|
|
349
391
|
tile_size=tile_size,
|
|
@@ -360,7 +402,9 @@ def parse_map_dict(root: JsonDict) -> ParsedMap:
|
|
|
360
402
|
layers: List[ParsedLayer] = []
|
|
361
403
|
else:
|
|
362
404
|
layers = [
|
|
363
|
-
_parse_layer(
|
|
405
|
+
_parse_layer(
|
|
406
|
+
_require_dict(layer, f"data.layers[{i}]"), i, f"data.layers[{i}]"
|
|
407
|
+
)
|
|
364
408
|
for i, layer in enumerate(_require_list(layers_raw, "data.layers"))
|
|
365
409
|
]
|
|
366
410
|
if not layers:
|
|
@@ -368,17 +412,35 @@ def parse_map_dict(root: JsonDict) -> ParsedMap:
|
|
|
368
412
|
|
|
369
413
|
project_obj = _require_dict(root.get("project_state", {}), "project_state")
|
|
370
414
|
rules = [
|
|
371
|
-
_parse_rule(
|
|
372
|
-
|
|
415
|
+
_parse_rule(
|
|
416
|
+
_require_dict(rule, f"project_state.rules[{i}]"),
|
|
417
|
+
f"project_state.rules[{i}]",
|
|
418
|
+
)
|
|
419
|
+
for i, rule in enumerate(
|
|
420
|
+
_require_list(project_obj.get("rules", []), "project_state.rules")
|
|
421
|
+
)
|
|
373
422
|
]
|
|
374
423
|
groups = [
|
|
375
|
-
_parse_group(
|
|
376
|
-
|
|
424
|
+
_parse_group(
|
|
425
|
+
_require_dict(group, f"project_state.groups[{i}]"),
|
|
426
|
+
f"project_state.groups[{i}]",
|
|
427
|
+
)
|
|
428
|
+
for i, group in enumerate(
|
|
429
|
+
_require_list(project_obj.get("groups", []), "project_state.groups")
|
|
430
|
+
)
|
|
377
431
|
]
|
|
378
|
-
project_state = ParsedProjectState(
|
|
432
|
+
project_state = ParsedProjectState(
|
|
433
|
+
rules=rules, groups=groups, automap_rules=project_obj.get("automap_rules")
|
|
434
|
+
)
|
|
379
435
|
|
|
380
436
|
tilesets = _parse_resources(root.get("resources", {}), "resources")
|
|
381
|
-
return ParsedMap(
|
|
437
|
+
return ParsedMap(
|
|
438
|
+
meta=meta,
|
|
439
|
+
layers=layers,
|
|
440
|
+
tilesets=tilesets,
|
|
441
|
+
project_state=project_state,
|
|
442
|
+
raw=root,
|
|
443
|
+
)
|
|
382
444
|
|
|
383
445
|
|
|
384
446
|
def parse_map_json(text: str) -> ParsedMap:
|
|
@@ -16,10 +16,17 @@ class LayerRenderStats:
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class TileLayerRenderer:
|
|
19
|
-
def __init__(
|
|
19
|
+
def __init__(
|
|
20
|
+
self, data: TilemapData, *, include_hidden_layers: bool = False
|
|
21
|
+
) -> None:
|
|
20
22
|
self.data = data
|
|
21
|
-
self.tile_layers = data.get_tile_layers_dict(
|
|
22
|
-
|
|
23
|
+
self.tile_layers = data.get_tile_layers_dict(
|
|
24
|
+
include_hidden=include_hidden_layers
|
|
25
|
+
)
|
|
26
|
+
self._sorted_layer_ids = sorted(
|
|
27
|
+
self.tile_layers.keys(),
|
|
28
|
+
key=lambda lid: (self.tile_layers[lid].z_index, lid),
|
|
29
|
+
)
|
|
23
30
|
self._variant_cache: Dict[Tuple[int, int], Optional[Surface]] = {}
|
|
24
31
|
self._tile_w, self._tile_h = data.tile_size
|
|
25
32
|
|
|
@@ -29,7 +36,9 @@ class TileLayerRenderer:
|
|
|
29
36
|
def _get_cached_variant(self, ttype: int, variant: int) -> Optional[Surface]:
|
|
30
37
|
key = (ttype, variant)
|
|
31
38
|
if key not in self._variant_cache:
|
|
32
|
-
self._variant_cache[key] = self.data.get_tile_surface(
|
|
39
|
+
self._variant_cache[key] = self.data.get_tile_surface(
|
|
40
|
+
ttype, variant, copy_surface=True
|
|
41
|
+
)
|
|
33
42
|
return self._variant_cache[key]
|
|
34
43
|
|
|
35
44
|
def warm_cache(self) -> None:
|
|
@@ -38,6 +47,7 @@ class TileLayerRenderer:
|
|
|
38
47
|
for tile in layer.tiles.values():
|
|
39
48
|
if isinstance(tile.ttype, int):
|
|
40
49
|
self._get_cached_variant(tile.ttype, tile.variant)
|
|
50
|
+
self.data = None
|
|
41
51
|
|
|
42
52
|
def render(
|
|
43
53
|
self,
|
|
@@ -79,4 +89,6 @@ class TileLayerRenderer:
|
|
|
79
89
|
target.blit(cell, (x * self._tile_w - cam_x, y * self._tile_h - cam_y))
|
|
80
90
|
drawn += 1
|
|
81
91
|
|
|
82
|
-
return LayerRenderStats(
|
|
92
|
+
return LayerRenderStats(
|
|
93
|
+
drawn_tiles=drawn, skipped_tiles=skipped, visible_layers=visible_layers
|
|
94
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tilemap_parser-1.0.0 → tilemap_parser-1.0.1}/src/tilemap_parser.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|