dungeoncoder 0.2.2__tar.gz → 0.2.4__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 (82) hide show
  1. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/PKG-INFO +1 -1
  2. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/__init__.py +1 -1
  3. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/dungeoncoder.py +38 -10
  4. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder.egg-info/PKG-INFO +1 -1
  5. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/LICENSE.txt +0 -0
  6. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/README.md +0 -0
  7. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/__main__.py +0 -0
  8. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_api_config.py +0 -0
  9. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/__init__.py +0 -0
  10. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/__init__.py +0 -0
  11. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/game/__init__.py +0 -0
  12. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/game/get_statistics.py +0 -0
  13. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/game/get_version.py +0 -0
  14. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/__init__.py +0 -0
  15. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/ask_oracle.py +0 -0
  16. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/configure.py +0 -0
  17. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/drop.py +0 -0
  18. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/get_inventory.py +0 -0
  19. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/get_items_at_position.py +0 -0
  20. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/interact.py +0 -0
  21. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_abyss_in_front.py +0 -0
  22. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_at_goal.py +0 -0
  23. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_collision_in_front.py +0 -0
  24. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_enemy_in_front.py +0 -0
  25. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_facing_north.py +0 -0
  26. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_switch_in_front.py +0 -0
  27. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_torch_in_front.py +0 -0
  28. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/move.py +0 -0
  29. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/peek_item_value.py +0 -0
  30. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/pickup.py +0 -0
  31. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/read_item_value.py +0 -0
  32. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/sense_goal.py +0 -0
  33. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/set_pace.py +0 -0
  34. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/turn_left.py +0 -0
  35. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/level/__init__.py +0 -0
  36. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/level/load_level.py +0 -0
  37. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/level/reset_level.py +0 -0
  38. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/client.py +0 -0
  39. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/errors.py +0 -0
  40. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/__init__.py +0 -0
  41. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/api_error_response.py +0 -0
  42. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/api_error_response_status.py +0 -0
  43. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/boolean_result.py +0 -0
  44. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/boolean_result_status.py +0 -0
  45. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/configure_params.py +0 -0
  46. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/distance_param.py +0 -0
  47. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/name_param.py +0 -0
  48. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/nullable_integer_result.py +0 -0
  49. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/nullable_integer_result_status.py +0 -0
  50. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/nullable_string_result.py +0 -0
  51. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/nullable_string_result_status.py +0 -0
  52. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/pace_params.py +0 -0
  53. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/statistics.py +0 -0
  54. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/statistics_result.py +0 -0
  55. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/statistics_result_status.py +0 -0
  56. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/string_array_result.py +0 -0
  57. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/string_array_result_status.py +0 -0
  58. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/tiled_level.py +0 -0
  59. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/version_result.py +0 -0
  60. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/version_result_result.py +0 -0
  61. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/version_result_status.py +0 -0
  62. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/types.py +0 -0
  63. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/asciimap.py +0 -0
  64. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/generator.py +0 -0
  65. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/gelaende.json +0 -0
  66. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/items.json +0 -0
  67. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/station.json +0 -0
  68. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/studio.json +0 -0
  69. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/tilesets.json +0 -0
  70. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/werkstatt.json +0 -0
  71. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/replay.py +0 -0
  72. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/requirements.txt +0 -0
  73. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/sim.py +0 -0
  74. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/testing.py +0 -0
  75. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/trace.py +0 -0
  76. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/variants.py +0 -0
  77. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder.egg-info/SOURCES.txt +0 -0
  78. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder.egg-info/dependency_links.txt +0 -0
  79. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder.egg-info/requires.txt +0 -0
  80. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder.egg-info/top_level.txt +0 -0
  81. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/pyproject.toml +0 -0
  82. {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dungeoncoder
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Python API for Dungeon Coder: steer the hero from a script, in VS Code or in the built-in simulator
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/mhobelsb/vsc_hm-dungeon-coder
@@ -1,4 +1,4 @@
1
1
  from .dungeoncoder import Game, Hero, use_simulator
2
2
 
3
3
  # The same as "version" in the extension's package.json (`npm run check:version`).
4
- __version__ = "0.2.2"
4
+ __version__ = "0.2.4"
@@ -79,6 +79,11 @@ DEFAULT_BASE_URL = _discover_base_url()
79
79
  # after 5 s + step time (src/extension.ts), so the client waits a bit longer.
80
80
  _STEP_SECONDS = 0.5
81
81
  _ACTION_TIMEOUT_SLACK = 6.0
82
+ # Sensors, queries and loading a level: the game answers at once, but a busy machine (or a game tab
83
+ # that is briefly blocked) can delay the answer. With a 1 s limit such a call returned its default
84
+ # (False) and a program's view of the world silently went wrong (B25: a turn too many). Connecting
85
+ # stays quick, so a game that isn't running is reported at once.
86
+ _ANSWER_TIMEOUT = httpx.Timeout(10.0, connect=1.0)
82
87
 
83
88
 
84
89
  def _extract_message(response) -> str:
@@ -125,7 +130,7 @@ def _check_version(base_url):
125
130
  _version_checked = True
126
131
  from . import __version__
127
132
  try:
128
- response = _get_version_api.sync_detailed(client=Client(base_url=base_url, timeout=httpx.Timeout(1)))
133
+ response = _get_version_api.sync_detailed(client=Client(base_url=base_url, timeout=_ANSWER_TIMEOUT))
129
134
  except Exception:
130
135
  return # no game running: loading the level says so
131
136
  if response.status_code == 404:
@@ -202,7 +207,7 @@ class Hero:
202
207
 
203
208
  def __init__(self, base_url: str = BASE_URL, index: int = 0):
204
209
  self._base_url = base_url
205
- self._client = Client(base_url=base_url, timeout=httpx.Timeout(1))
210
+ self._client = Client(base_url=base_url, timeout=_ANSWER_TIMEOUT)
206
211
  self._pace = 1.0
207
212
  self._action_client = self._make_action_client()
208
213
  self._index = index # which hero in a co-op level (0 = MainCharacter)
@@ -339,18 +344,37 @@ class Game:
339
344
  """
340
345
 
341
346
  BASE_URL = DEFAULT_BASE_URL
342
-
343
- def __init__(self, level_file, seed: int | None = None):
347
+ SHOW_CALLS = None
348
+ """True or False: the list of the program's last calls in the game's corner, for every level
349
+ loaded after this (level property show_calls); None: as the level says (off unless it says on)."""
350
+ SHOW_SENSING = None
351
+ """True or False: the frames around the cells a sensor looked at, for every level loaded after
352
+ this (level property show_sensing); None: as the level says (on unless it says off)."""
353
+
354
+ def __init__(self, level_file, seed: int | None = None, show_calls: bool | None = None,
355
+ show_sensing: bool | None = None):
344
356
  """Loads the level. `seed` picks a variant of a level that has some (objects that may
345
- lie anywhere in a region, see variants.py): the same seed, the same variant."""
357
+ lie anywhere in a region, see variants.py): the same seed, the same variant.
358
+ `show_calls` and `show_sensing` (True or False) switch the list of the last calls and the
359
+ sensor frames on or off for this level; without them, Game.SHOW_CALLS and
360
+ Game.SHOW_SENSING decide, and if those are None, the level does."""
346
361
  _check_version(self.BASE_URL)
347
362
  if seed is not None and (type(seed) != int):
348
363
  print("Error: seed must be a whole number.")
349
364
  sys.exit(1)
365
+ display = {}
366
+ for name, value, default in (("show_calls", show_calls, self.SHOW_CALLS),
367
+ ("show_sensing", show_sensing, self.SHOW_SENSING)):
368
+ chosen = value if value is not None else default
369
+ if chosen is not None and type(chosen) != bool:
370
+ print(f"Error: {name} must be True or False (or None: as the level says).")
371
+ sys.exit(1)
372
+ if chosen is not None:
373
+ display[name] = chosen
350
374
  self.__level = self.Level(self.BASE_URL)
351
375
  try:
352
376
  trace.loading(level_file)
353
- loaded = self.__level.load(level_file, seed)
377
+ loaded = self.__level.load(level_file, seed, display)
354
378
  except FileNotFoundError:
355
379
  print(f"Error: Level file '{level_file}' not found. "
356
380
  f"Please check the path and that you opened the right folder in VS Code "
@@ -376,7 +400,8 @@ class Game:
376
400
  """The seed of this level (a generated level or a variant), or None."""
377
401
 
378
402
  @classmethod
379
- def generate(cls, seed: int | None = None, kind: str = "maze", **options) -> "Game":
403
+ def generate(cls, seed: int | None = None, kind: str = "maze", show_calls: bool | None = None,
404
+ show_sensing: bool | None = None, **options) -> "Game":
380
405
  """Loads a generated level; the same seed always gives the same level.
381
406
  Without a seed, a new level each time: its seed is printed and kept in game.seed.
382
407
 
@@ -396,7 +421,7 @@ class Game:
396
421
  path = os.path.join(tempfile.mkdtemp(prefix="dungeoncoder-"), f"{kind}_{seed}.txt")
397
422
  with open(path, "w", encoding="utf-8") as f:
398
423
  f.write(text)
399
- return cls(path)
424
+ return cls(path, show_calls=show_calls, show_sensing=show_sensing)
400
425
 
401
426
  def get_hero(self):
402
427
  return self.__hero
@@ -434,10 +459,10 @@ class Game:
434
459
  A class to manage game levels.
435
460
  """
436
461
  def __init__(self, base_url):
437
- self._client = Client(base_url=base_url, timeout=httpx.Timeout(1))
462
+ self._client = Client(base_url=base_url, timeout=_ANSWER_TIMEOUT)
438
463
  self.seed = None
439
464
 
440
- def load(self, filename, seed=None):
465
+ def load(self, filename, seed=None, display=None):
441
466
  """
442
467
  Loads a level from a Tiled JSON file, or builds it from an ASCII map
443
468
  (a file ending in .txt, see asciimap.py for the format).
@@ -469,6 +494,9 @@ class Game:
469
494
  elif chosen:
470
495
  print(f"Level variant {self.seed} (the same again: Game(\"{filename}\", seed={self.seed}))")
471
496
 
497
+ for name, value in (display or {}).items(): # show_calls, show_sensing from the program
498
+ properties = [p for p in level_data.get("properties", []) or [] if p.get("name") != name]
499
+ level_data["properties"] = properties + [{"name": name, "type": "bool", "value": value}]
472
500
  # a refused level (e.g. a missing asset pack) prints the game's explanation
473
501
  return _call(self._client, _load_level_api.sync_detailed, default=False,
474
502
  explain_refusal=True, body=TiledLevel.from_dict(level_data))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dungeoncoder
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Python API for Dungeon Coder: steer the hero from a script, in VS Code or in the built-in simulator
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/mhobelsb/vsc_hm-dungeon-coder
File without changes
File without changes
File without changes