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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-parser
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Standalone parser/loader for tilemap-editor JSON maps and sprite animation JSON.
5
5
  Author: tilemap parser contributors
6
6
  Classifier: Programming Language :: Python :: 3
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tilemap-parser"
7
- version = "1.0.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(rf"(-?\d+)[{re.escape(string.punctuation)}](-?\d+)$", text.strip())
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(obj_dict.get("tileset_type", "object"), f"{ctx}.{key}.tileset_type")
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") or {},
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(_require_dict(layer_obj.get("objects", {}), f"{ctx}.objects"), f"{ctx}.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(layer_obj["next_object_id"], f"{ctx}.next_object_id")
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((_coerce_int(pair_list[0], f"{ctx}.neighbors[{idx}][0]"), _coerce_int(pair_list[1], f"{ctx}.neighbors[{idx}][1]")))
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 = [_coerce_int(v, f"{ctx}.variant_ids[{i}]") for i, v in enumerate(variants_raw)]
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 = _coerce_int(tileset_index_raw, f"{ctx}.tileset_index") if tileset_index_raw is not None else None
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 = [_parse_rule(_require_dict(r, f"{ctx}.rules[{i}]"), f"{ctx}.rules[{i}]") for i, r in enumerate(rules_raw)]
288
- return ParsedAutotileGroup(name=_require_str(group_obj.get("name"), f"{ctx}.name"), rules=rules)
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(v, f"{ctx}[{i}].tile_properties[{k!r}]")
307
- out.append(ParsedTileset(path=path, type=ts_type, properties=props, tile_properties=tile_props))
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(meta_obj.get("map_size"), "meta.map_size", default=f"{tile_size[0]};{tile_size[1]}")
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 = map_size if init_raw is None else _parse_point_field(init_raw, "meta.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(_require_dict(layer, f"data.layers[{i}]"), i, f"data.layers[{i}]")
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(_require_dict(rule, f"project_state.rules[{i}]"), f"project_state.rules[{i}]")
372
- for i, rule in enumerate(_require_list(project_obj.get("rules", []), "project_state.rules"))
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(_require_dict(group, f"project_state.groups[{i}]"), f"project_state.groups[{i}]")
376
- for i, group in enumerate(_require_list(project_obj.get("groups", []), "project_state.groups"))
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(rules=rules, groups=groups, automap_rules=project_obj.get("automap_rules"))
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(meta=meta, layers=layers, tilesets=tilesets, project_state=project_state, raw=root)
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__(self, data: TilemapData, *, include_hidden_layers: bool = False) -> None:
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(include_hidden=include_hidden_layers)
22
- self._sorted_layer_ids = sorted(self.tile_layers.keys(), key=lambda lid: (self.tile_layers[lid].z_index, lid))
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(ttype, variant, copy_surface=True)
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(drawn_tiles=drawn, skipped_tiles=skipped, visible_layers=visible_layers)
92
+ return LayerRenderStats(
93
+ drawn_tiles=drawn, skipped_tiles=skipped, visible_layers=visible_layers
94
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-parser
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Standalone parser/loader for tilemap-editor JSON maps and sprite animation JSON.
5
5
  Author: tilemap parser contributors
6
6
  Classifier: Programming Language :: Python :: 3
File without changes
File without changes
File without changes