tilemap-parser 3.1.15__tar.gz → 3.1.16__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.
Files changed (35) hide show
  1. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/PKG-INFO +1 -1
  2. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/pyproject.toml +1 -1
  3. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/runtime/tile_collision.py +45 -19
  4. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser.egg-info/PKG-INFO +1 -1
  5. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/tests/test_tile_collision.py +55 -0
  6. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/LICENSE +0 -0
  7. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/README.md +0 -0
  8. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/setup.cfg +0 -0
  9. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/__init__.py +0 -0
  10. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/parser/__init__.py +0 -0
  11. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/parser/animation.py +0 -0
  12. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/parser/collision.py +0 -0
  13. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/parser/collision_loader.py +0 -0
  14. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/parser/map_parse.py +0 -0
  15. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/parser/node_parse.py +0 -0
  16. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/parser/particle.py +0 -0
  17. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/runtime/__init__.py +0 -0
  18. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/runtime/animation_player.py +0 -0
  19. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/runtime/area_node.py +0 -0
  20. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/runtime/collision_cache.py +0 -0
  21. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/runtime/map_loader.py +0 -0
  22. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/runtime/object_collision.py +0 -0
  23. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/runtime/particles.py +0 -0
  24. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/runtime/renderer.py +0 -0
  25. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/utils/__init__.py +0 -0
  26. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser/utils/geometry.py +0 -0
  27. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser.egg-info/SOURCES.txt +0 -0
  28. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser.egg-info/dependency_links.txt +0 -0
  29. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser.egg-info/requires.txt +0 -0
  30. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/src/tilemap_parser.egg-info/top_level.txt +0 -0
  31. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/tests/test_collision.py +0 -0
  32. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/tests/test_geometry.py +0 -0
  33. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/tests/test_map_loader.py +0 -0
  34. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/tests/test_object_collision.py +0 -0
  35. {tilemap_parser-3.1.15 → tilemap_parser-3.1.16}/tests/test_render_scale.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-parser
3
- Version: 3.1.15
3
+ Version: 3.1.16
4
4
  Summary: Standalone parser/loader for tilemap-editor JSON maps, sprite animations, and collision detection runtime.
5
5
  Author: tilemap parser contributors
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tilemap-parser"
7
- version = "3.1.15"
7
+ version = "3.1.16"
8
8
  description = "Standalone parser/loader for tilemap-editor JSON maps, sprite animations, and collision detection runtime."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -441,6 +441,7 @@ class CollisionRunner:
441
441
  self.gravity = 800.0
442
442
  self.max_fall_speed = 600.0
443
443
  self.jump_strength = -400.0
444
+ self.horizontal_speed = 200.0
444
445
 
445
446
  self.ground_snap_tolerance = 2.0
446
447
  self.step_height = 4.0
@@ -797,6 +798,7 @@ class CollisionRunner:
797
798
  dt: float,
798
799
  input_x: float = 0.0,
799
800
  jump_pressed: bool = False,
801
+ velocity: Optional[Vector2] = None,
800
802
  ) -> CollisionResult:
801
803
  """
802
804
  Move sprite with platformer physics (gravity, jumping).
@@ -808,8 +810,11 @@ class CollisionRunner:
808
810
  tileset_collision: Tileset collision data
809
811
  tile_map: Dictionary mapping (tile_x, tile_y) to tile_id
810
812
  dt: Delta time in seconds
811
- input_x: Horizontal input (-1 to 1)
812
- jump_pressed: Whether jump button is pressed
813
+ input_x: Horizontal input (-1 to 1) for built-in movement
814
+ jump_pressed: Whether jump button is pressed for built-in movement
815
+ velocity: Optional explicit velocity (vx, vy). When provided, the
816
+ runner skips built-in input/gravity/jump velocity calculation
817
+ and only resolves collision for that velocity.
813
818
 
814
819
  Returns:
815
820
  CollisionResult with final position and collision info
@@ -824,15 +829,19 @@ class CollisionRunner:
824
829
  result.final_x = sprite.x
825
830
  result.final_y = sprite.y
826
831
 
827
- if not getattr(sprite, "on_ground", False):
828
- sprite.vy += self.gravity * dt
829
- if sprite.vy > self.max_fall_speed:
830
- sprite.vy = self.max_fall_speed
832
+ if velocity is not None:
833
+ sprite.vx = velocity[0]
834
+ sprite.vy = velocity[1]
835
+ else:
836
+ if not getattr(sprite, "on_ground", False):
837
+ sprite.vy += self.gravity * dt
838
+ if sprite.vy > self.max_fall_speed:
839
+ sprite.vy = self.max_fall_speed
831
840
 
832
- if jump_pressed and getattr(sprite, "on_ground", False):
833
- sprite.vy = self.jump_strength
841
+ if jump_pressed and getattr(sprite, "on_ground", False):
842
+ sprite.vy = self.jump_strength
834
843
 
835
- sprite.vx = input_x * 200.0
844
+ sprite.vx = input_x * self.horizontal_speed
836
845
 
837
846
  delta_x = sprite.vx * dt
838
847
  delta_y = sprite.vy * dt
@@ -1325,6 +1334,7 @@ class CollisionRunner:
1325
1334
  dt: float,
1326
1335
  input_x: float = 0.0,
1327
1336
  jump_pressed: bool = False,
1337
+ velocity: Optional[Vector2] = None,
1328
1338
  ) -> CollisionResult:
1329
1339
  """
1330
1340
  Slope-aware platformer movement.
@@ -1360,6 +1370,13 @@ class CollisionRunner:
1360
1370
  jump_pressed:
1361
1371
  True if jump was pressed during this frame.
1362
1372
 
1373
+ velocity:
1374
+ Optional explicit velocity (vx, vy). When provided, the runner
1375
+ skips built-in input/gravity/jump velocity calculation and only
1376
+ resolves collision for that velocity. This is the preferred
1377
+ path for dash, knockback, wind, moving-platform carry, or a
1378
+ custom controller.
1379
+
1363
1380
  Returns:
1364
1381
  CollisionResult describing the resolved movement and collision
1365
1382
  state after simulation.
@@ -1381,18 +1398,25 @@ class CollisionRunner:
1381
1398
  was_on_ground = getattr(sprite, "on_ground", False)
1382
1399
  jumped = False
1383
1400
 
1384
- if jump_pressed and was_on_ground:
1385
- sprite.vy = self.jump_strength
1386
- sprite.on_ground = False
1387
- jumped = True
1388
- elif not was_on_ground:
1389
- sprite.vy += self.gravity * dt
1390
- if sprite.vy > self.max_fall_speed:
1391
- sprite.vy = self.max_fall_speed
1401
+ if velocity is not None:
1402
+ sprite.vx = velocity[0]
1403
+ sprite.vy = velocity[1]
1404
+ if sprite.vy < 0.0:
1405
+ sprite.on_ground = False
1406
+ jumped = True
1392
1407
  else:
1393
- sprite.vy = min(sprite.vy, 0.0)
1408
+ if jump_pressed and was_on_ground:
1409
+ sprite.vy = self.jump_strength
1410
+ sprite.on_ground = False
1411
+ jumped = True
1412
+ elif not was_on_ground:
1413
+ sprite.vy += self.gravity * dt
1414
+ if sprite.vy > self.max_fall_speed:
1415
+ sprite.vy = self.max_fall_speed
1416
+ else:
1417
+ sprite.vy = min(sprite.vy, 0.0)
1394
1418
 
1395
- sprite.vx = input_x * 200.0
1419
+ sprite.vx = input_x * self.horizontal_speed
1396
1420
  delta_x = sprite.vx * dt
1397
1421
  delta_y = sprite.vy * dt
1398
1422
  bottom_offset = old_bottom - old_y
@@ -1662,6 +1686,7 @@ class CollisionRunner:
1662
1686
  dt,
1663
1687
  input_x=kwargs.get("input_x", 0.0),
1664
1688
  jump_pressed=kwargs.get("jump_pressed", False),
1689
+ velocity=kwargs.get("velocity"),
1665
1690
  )
1666
1691
  elif self.mode == MovementMode.RPG:
1667
1692
  return self.move_rpg(sprite, tileset_collision, tile_map, delta_x, delta_y)
@@ -1736,6 +1761,7 @@ class CollisionRunner:
1736
1761
  runner.gravity = 800.0
1737
1762
  runner.max_fall_speed = 600.0
1738
1763
  runner.jump_strength = -400.0
1764
+ runner.horizontal_speed = 200.0
1739
1765
  runner.slide_friction = 0.1
1740
1766
  runner._game_type = "platformer"
1741
1767
  runner._strict = strict
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-parser
3
- Version: 3.1.15
3
+ Version: 3.1.16
4
4
  Summary: Standalone parser/loader for tilemap-editor JSON maps, sprite animations, and collision detection runtime.
5
5
  Author: tilemap parser contributors
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -267,6 +267,43 @@ class TestMovePlatformer:
267
267
  assert sprite.x > 137
268
268
  assert result.hit_wall_x is False
269
269
 
270
+ def test_explicit_velocity_controls_horizontal_movement(self):
271
+ tile_map = {}
272
+ sprite = MockSprite(x=100, y=100)
273
+ sprite.vx = 0
274
+ sprite.vy = 0
275
+ sprite.on_ground = True
276
+
277
+ result = self.runner.move_platformer(
278
+ sprite,
279
+ self.tileset,
280
+ tile_map,
281
+ dt=0.016,
282
+ input_x=0,
283
+ velocity=(600.0, 0.0),
284
+ )
285
+
286
+ assert result.final_x == pytest.approx(109.6)
287
+ assert sprite.vx == pytest.approx(600.0)
288
+
289
+ def test_move_convenience_forwards_explicit_velocity(self):
290
+ sprite = MockSprite(x=100, y=100)
291
+ sprite.vx = 0
292
+ sprite.vy = 0
293
+ sprite.on_ground = True
294
+
295
+ result = self.runner.move(
296
+ sprite,
297
+ self.tileset,
298
+ {},
299
+ dt=0.016,
300
+ input_x=0,
301
+ velocity=(600.0, 0.0),
302
+ )
303
+
304
+ assert result.final_x == pytest.approx(109.6)
305
+ assert sprite.vx == pytest.approx(600.0)
306
+
270
307
 
271
308
  class TestMovePlatformerWithSlide:
272
309
  def setup_method(self):
@@ -334,6 +371,24 @@ class TestMovePlatformerWithSlide:
334
371
  assert sprite.x == 103
335
372
  assert result.hit_wall_x is True
336
373
 
374
+ def test_explicit_velocity_controls_dash_without_input_scaling(self):
375
+ sprite = MockSprite(x=100, y=100)
376
+ sprite.vx = 0
377
+ sprite.vy = 0
378
+ sprite.on_ground = True
379
+
380
+ result = self.runner.move_platformer_with_slide(
381
+ sprite,
382
+ self.tileset,
383
+ {},
384
+ dt=0.016,
385
+ input_x=0,
386
+ velocity=(600.0, 0.0),
387
+ )
388
+
389
+ assert result.final_x == pytest.approx(109.6)
390
+ assert sprite.vx == pytest.approx(600.0)
391
+
337
392
 
338
393
  class TestMoveRpg:
339
394
  def setup_method(self):
File without changes