dungeoncoder 0.2.0__py3-none-any.whl

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 (77) hide show
  1. dungeoncoder/__init__.py +4 -0
  2. dungeoncoder/__main__.py +254 -0
  3. dungeoncoder/_api_config.py +6 -0
  4. dungeoncoder/_generated/__init__.py +8 -0
  5. dungeoncoder/_generated/api/__init__.py +1 -0
  6. dungeoncoder/_generated/api/game/__init__.py +1 -0
  7. dungeoncoder/_generated/api/game/get_statistics.py +158 -0
  8. dungeoncoder/_generated/api/game/get_version.py +166 -0
  9. dungeoncoder/_generated/api/hero/__init__.py +1 -0
  10. dungeoncoder/_generated/api/hero/ask_oracle.py +192 -0
  11. dungeoncoder/_generated/api/hero/configure.py +207 -0
  12. dungeoncoder/_generated/api/hero/drop.py +207 -0
  13. dungeoncoder/_generated/api/hero/get_inventory.py +188 -0
  14. dungeoncoder/_generated/api/hero/get_items_at_position.py +188 -0
  15. dungeoncoder/_generated/api/hero/interact.py +188 -0
  16. dungeoncoder/_generated/api/hero/is_abyss_in_front.py +188 -0
  17. dungeoncoder/_generated/api/hero/is_at_goal.py +192 -0
  18. dungeoncoder/_generated/api/hero/is_collision_in_front.py +188 -0
  19. dungeoncoder/_generated/api/hero/is_enemy_in_front.py +188 -0
  20. dungeoncoder/_generated/api/hero/is_facing_north.py +188 -0
  21. dungeoncoder/_generated/api/hero/is_switch_in_front.py +188 -0
  22. dungeoncoder/_generated/api/hero/is_torch_in_front.py +188 -0
  23. dungeoncoder/_generated/api/hero/move.py +188 -0
  24. dungeoncoder/_generated/api/hero/peek_item_value.py +211 -0
  25. dungeoncoder/_generated/api/hero/pickup.py +207 -0
  26. dungeoncoder/_generated/api/hero/read_item_value.py +188 -0
  27. dungeoncoder/_generated/api/hero/sense_goal.py +192 -0
  28. dungeoncoder/_generated/api/hero/set_pace.py +207 -0
  29. dungeoncoder/_generated/api/hero/turn_left.py +188 -0
  30. dungeoncoder/_generated/api/level/__init__.py +1 -0
  31. dungeoncoder/_generated/api/level/load_level.py +190 -0
  32. dungeoncoder/_generated/api/level/reset_level.py +158 -0
  33. dungeoncoder/_generated/client.py +271 -0
  34. dungeoncoder/_generated/errors.py +14 -0
  35. dungeoncoder/_generated/models/__init__.py +47 -0
  36. dungeoncoder/_generated/models/api_error_response.py +98 -0
  37. dungeoncoder/_generated/models/api_error_response_status.py +7 -0
  38. dungeoncoder/_generated/models/boolean_result.py +96 -0
  39. dungeoncoder/_generated/models/boolean_result_status.py +7 -0
  40. dungeoncoder/_generated/models/configure_params.py +84 -0
  41. dungeoncoder/_generated/models/distance_param.py +76 -0
  42. dungeoncoder/_generated/models/name_param.py +76 -0
  43. dungeoncoder/_generated/models/nullable_integer_result.py +104 -0
  44. dungeoncoder/_generated/models/nullable_integer_result_status.py +7 -0
  45. dungeoncoder/_generated/models/nullable_string_result.py +104 -0
  46. dungeoncoder/_generated/models/nullable_string_result_status.py +7 -0
  47. dungeoncoder/_generated/models/pace_params.py +76 -0
  48. dungeoncoder/_generated/models/statistics.py +217 -0
  49. dungeoncoder/_generated/models/statistics_result.py +104 -0
  50. dungeoncoder/_generated/models/statistics_result_status.py +7 -0
  51. dungeoncoder/_generated/models/string_array_result.py +100 -0
  52. dungeoncoder/_generated/models/string_array_result_status.py +7 -0
  53. dungeoncoder/_generated/models/tiled_level.py +67 -0
  54. dungeoncoder/_generated/models/version_result.py +104 -0
  55. dungeoncoder/_generated/models/version_result_result.py +84 -0
  56. dungeoncoder/_generated/models/version_result_status.py +7 -0
  57. dungeoncoder/_generated/types.py +53 -0
  58. dungeoncoder/asciimap.py +824 -0
  59. dungeoncoder/dungeoncoder.py +482 -0
  60. dungeoncoder/generator.py +213 -0
  61. dungeoncoder/packs/gelaende.json +1 -0
  62. dungeoncoder/packs/items.json +67 -0
  63. dungeoncoder/packs/station.json +1 -0
  64. dungeoncoder/packs/studio.json +1 -0
  65. dungeoncoder/packs/tilesets.json +1 -0
  66. dungeoncoder/packs/werkstatt.json +1 -0
  67. dungeoncoder/replay.py +80 -0
  68. dungeoncoder/requirements.txt +2 -0
  69. dungeoncoder/sim.py +792 -0
  70. dungeoncoder/testing.py +63 -0
  71. dungeoncoder/trace.py +92 -0
  72. dungeoncoder/variants.py +112 -0
  73. dungeoncoder-0.2.0.dist-info/METADATA +37 -0
  74. dungeoncoder-0.2.0.dist-info/RECORD +77 -0
  75. dungeoncoder-0.2.0.dist-info/WHEEL +5 -0
  76. dungeoncoder-0.2.0.dist-info/licenses/LICENSE.txt +25 -0
  77. dungeoncoder-0.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1 @@
1
+ {"version":1,"neighbour_fit":true,"stacks":{" ":[[0,438]]," #":[[0,1]]," ##":[[0,1]]," ###":[[0,14]]," ## ":[[0,1]]," # ":[[0,1]]," # #":[[0,1]],"# # #.":[[1,1]],"# ###..":[[1,2]],"# ##...":[[1,9]],"# ##..#":[[1,2]],"# ##.#.":[[1,1]],"# # .# ":[[1,1]]," # # ":[[0,1]]," # # #":[[0,5]],"# ## . #.":[[1,1]],".####.#..":[[2,1]],".###.....":[[2,9]],".###.#...":[[2,1]],"####.....":[[1,1]],".####....":[[2,1]],".###.#..#":[[2,1]],"### . .# ":[[1,1]]," # # # ":[[0,5]],"# #. . #.":[[1,1]],".#..#.#..":[[2,2]],".........":[[2,11]],"...#....#":[[2,1]],"..#....#.":[[2,1]],".#....#..":[[2,1]],"...#.#..#":[[2,3]],"#.# . .# ":[[1,3]],"# #. . ##":[[1,1]],".#..#.###":[[2,2]],"......##.":[[2,1]],"......#.#":[[2,1]],".......##":[[2,1]],"......###":[[2,2]],".....####":[[2,1]],"#.....##.":[[1,1]],"....#.#..":[[2,1]],"........~":[[2,1]],".......~~":[[2,1]],"......~~.":[[2,1]],"......~..":[[2,1]],"# #. # #.":[[1,1]],"##..###..":[[1,1]],"#...#....":[[1,1]],"....##...":[[2,1]],"#....#...":[[1,1]],"#...##...":[[1,1]],"#..###..#":[[1,1]],"#.#.#..#.":[[1,1]],".....~..~":[[2,1]],"~....~.~~":[[3,1]],"~...~.~~.":[[3,1]],"....~.~..":[[2,1]],"# ## . ##":[[1,1]],".####.###":[[2,1]],".##...###":[[2,1]],".#.#..###":[[2,1]],"..##..###":[[2,1]],".###..###":[[2,1]],".###.####":[[2,1]],"###...###":[[1,1]],"...~.~###":[[2,1]],"~.~~.~###":[[3,1]],"~~~.~.###":[[3,1]],".~..~.###":[[2,1]],"...#.####":[[2,1]],"#.# . ## ":[[1,1]]," # # ":[[0,1]],"# #. # ":[[1,1]],"##..## ":[[1,2]],"#...## ":[[1,5]],"#..### ":[[1,2]],"#.#.## ":[[1,1]],"#..~## ":[[1,1]],"#.~~## ":[[1,1]],"#~~.## ":[[1,1]],"#~..## ":[[1,1]],"#.# # ":[[1,1]]," # # ":[[0,1]]," # ":[[0,1]]," ## ":[[0,1]]," ### ":[[0,14]]," ## ":[[0,1]]," # ":[[0,1]]},"stack_table":[[],[["wall","../tilesets/welt_werkstatt_tiles.json",2]],[["floor","../tilesets/welt_werkstatt_tiles.json",1]],[["floor","../tilesets/welt_werkstatt_tiles.json",3]]],"hpairs":[[0,0],[0,1],[1,1],[1,0],[1,2],[2,2],[2,1],[2,3],[3,3],[3,2]],"vpairs":[[0,0],[0,1],[1,1],[1,2],[2,2],[2,1],[2,3],[3,3],[3,1],[1,0]],"objects":[["Torch","#",[["../tilesets/welt_werkstatt_tiles.json",4,1],["../tilesets/welt_werkstatt_tiles.json",5,1]]],["Switch",".",[["../tilesets/welt_werkstatt_tiles.json",6,1]]],["Chest",".",[["../tilesets/welt_werkstatt_tiles.json",12,1]]],["VerticalDoor",".",[["../tilesets/welt_werkstatt_tiles.json",10,1]]],["Teil",".",[["../tilesets/welt_werkstatt_tiles.json",15,1]]],["Kiste",".",[["../tilesets/welt_werkstatt_tiles.json",16,1]]],["Marke",".",[["../tilesets/welt_werkstatt_tiles.json",17,1]]],["Door",".",[["../tilesets/welt_werkstatt_tiles.json",8,1]]],["Goal",".",[["../tilesets/welt_werkstatt_tiles.json",14,1]]]],"goal_decor":[],"tilesets":{"../tilesets/welt_werkstatt_figur.json":{"count":128,"tile_w":32,"tile_h":32,"classes":{"0":"Character","2":"Character","4":"Character","6":"Character","8":"Character","10":"Character","12":"Character","14":"Character","16":"Character","18":"Character","20":"Character","22":"Character","24":"Character","26":"Character","28":"Character","30":"Character","32":"Character","34":"Character","36":"Character","38":"Character","40":"Character","42":"Character","44":"Character","46":"Character","48":"Character","50":"Character","52":"Character","54":"Character","56":"Character","58":"Character","60":"Character","62":"Character","64":"Character","66":"Character","68":"Character","70":"Character","72":"Character","74":"Character","76":"Character","78":"Character","80":"Character","82":"Character","84":"Character","86":"Character","88":"Character","90":"Character","92":"Character","94":"Character","96":"Character","98":"Character","100":"Character","102":"Character","104":"Character","106":"Character","108":"Character","110":"Character","112":"Character","114":"Character","116":"Character","118":"Character","120":"Character","122":"Character","124":"Character","126":"Character"}},"../tilesets/welt_werkstatt_tiles.json":{"count":18,"tile_w":32,"tile_h":32,"classes":{"4":"Torch","5":"Torch","6":"Switch","8":"Door","10":"VerticalDoor","12":"Chest","14":"Goal","15":"Teil","16":"Kiste","17":"Marke"}}},"hero":{"north_0":["../tilesets/welt_werkstatt_figur.json",0],"north_1":["../tilesets/welt_werkstatt_figur.json",8],"north_2":["../tilesets/welt_werkstatt_figur.json",16],"north_3":["../tilesets/welt_werkstatt_figur.json",24],"north_4":["../tilesets/welt_werkstatt_figur.json",32],"north_5":["../tilesets/welt_werkstatt_figur.json",40],"north_6":["../tilesets/welt_werkstatt_figur.json",48],"north_7":["../tilesets/welt_werkstatt_figur.json",56],"north_8":["../tilesets/welt_werkstatt_figur.json",64],"north_9":["../tilesets/welt_werkstatt_figur.json",72],"north_10":["../tilesets/welt_werkstatt_figur.json",80],"north_11":["../tilesets/welt_werkstatt_figur.json",88],"north_12":["../tilesets/welt_werkstatt_figur.json",96],"north_13":["../tilesets/welt_werkstatt_figur.json",104],"north_14":["../tilesets/welt_werkstatt_figur.json",112],"north_15":["../tilesets/welt_werkstatt_figur.json",120],"east_0":["../tilesets/welt_werkstatt_figur.json",2],"east_1":["../tilesets/welt_werkstatt_figur.json",10],"east_2":["../tilesets/welt_werkstatt_figur.json",18],"east_3":["../tilesets/welt_werkstatt_figur.json",26],"east_4":["../tilesets/welt_werkstatt_figur.json",34],"east_5":["../tilesets/welt_werkstatt_figur.json",42],"east_6":["../tilesets/welt_werkstatt_figur.json",50],"east_7":["../tilesets/welt_werkstatt_figur.json",58],"east_8":["../tilesets/welt_werkstatt_figur.json",66],"east_9":["../tilesets/welt_werkstatt_figur.json",74],"east_10":["../tilesets/welt_werkstatt_figur.json",82],"east_11":["../tilesets/welt_werkstatt_figur.json",90],"east_12":["../tilesets/welt_werkstatt_figur.json",98],"east_13":["../tilesets/welt_werkstatt_figur.json",106],"east_14":["../tilesets/welt_werkstatt_figur.json",114],"east_15":["../tilesets/welt_werkstatt_figur.json",122],"south_0":["../tilesets/welt_werkstatt_figur.json",4],"south_1":["../tilesets/welt_werkstatt_figur.json",12],"south_2":["../tilesets/welt_werkstatt_figur.json",20],"south_3":["../tilesets/welt_werkstatt_figur.json",28],"south_4":["../tilesets/welt_werkstatt_figur.json",36],"south_5":["../tilesets/welt_werkstatt_figur.json",44],"south_6":["../tilesets/welt_werkstatt_figur.json",52],"south_7":["../tilesets/welt_werkstatt_figur.json",60],"south_8":["../tilesets/welt_werkstatt_figur.json",68],"south_9":["../tilesets/welt_werkstatt_figur.json",76],"south_10":["../tilesets/welt_werkstatt_figur.json",84],"south_11":["../tilesets/welt_werkstatt_figur.json",92],"south_12":["../tilesets/welt_werkstatt_figur.json",100],"south_13":["../tilesets/welt_werkstatt_figur.json",108],"south_14":["../tilesets/welt_werkstatt_figur.json",116],"south_15":["../tilesets/welt_werkstatt_figur.json",124],"west_0":["../tilesets/welt_werkstatt_figur.json",6],"west_1":["../tilesets/welt_werkstatt_figur.json",14],"west_2":["../tilesets/welt_werkstatt_figur.json",22],"west_3":["../tilesets/welt_werkstatt_figur.json",30],"west_4":["../tilesets/welt_werkstatt_figur.json",38],"west_5":["../tilesets/welt_werkstatt_figur.json",46],"west_6":["../tilesets/welt_werkstatt_figur.json",54],"west_7":["../tilesets/welt_werkstatt_figur.json",62],"west_8":["../tilesets/welt_werkstatt_figur.json",70],"west_9":["../tilesets/welt_werkstatt_figur.json",78],"west_10":["../tilesets/welt_werkstatt_figur.json",86],"west_11":["../tilesets/welt_werkstatt_figur.json",94],"west_12":["../tilesets/welt_werkstatt_figur.json",102],"west_13":["../tilesets/welt_werkstatt_figur.json",110],"west_14":["../tilesets/welt_werkstatt_figur.json",118],"west_15":["../tilesets/welt_werkstatt_figur.json",126]},"torch_off":{"../tilesets/welt_werkstatt_tiles.json":[5]},"sweets":null,"abyss_tiles":[["../tilesets/welt_werkstatt_tiles.json",3]],"tile_size":32,"items":{"K":["../tilesets/welt_werkstatt_tiles.json",15,"Teil"],"*":["../tilesets/welt_werkstatt_tiles.json",16,"Kiste"],"o":["../tilesets/welt_werkstatt_tiles.json",17,"Marke"]},"world":"werkstatt","guard_sprite":12}
dungeoncoder/replay.py ADDED
@@ -0,0 +1,80 @@
1
+ """Replaying traces (trace.py): in the game, to watch what a program did, or in the simulator,
2
+ to list where the hero stood after every call.
3
+
4
+ python -m dungeoncoder replay spur.json [--run N] [--pace 4]
5
+ python -m dungeoncoder trace spur.json [--run N]
6
+ """
7
+ import json
8
+ import os
9
+ import tempfile
10
+
11
+ # how a recorded call is made again: the Hero method and its arguments from the params
12
+ ARGUMENTS = {"configure": ("name", "typeNumber"), "set_pace": ("factor",), "pickup": ("name",), "drop": ("name",),
13
+ "peek_item_value": ("distance",)}
14
+ GAME_CALLS = ("get_statistics", "reset_level")
15
+
16
+
17
+ def _level_file(run):
18
+ path = os.path.join(tempfile.mkdtemp(prefix="dungeoncoder-replay-"), "level.json")
19
+ with open(path, "w", encoding="utf-8") as f:
20
+ json.dump(run["level"], f)
21
+ return path
22
+
23
+
24
+ def call(game, method, params):
25
+ """Makes one recorded call again; returns what came back."""
26
+ params = params or {}
27
+ if method == "get_statistics":
28
+ return game.get_statistics()
29
+ if method == "reset_level":
30
+ return game._Game__level.reset()
31
+ heroes = game.get_heroes() if hasattr(game, "get_heroes") else [game.get_hero()]
32
+ hero = heroes[params.get("hero", 0)] if params.get("hero", 0) < len(heroes) else heroes[0]
33
+ args = [params[name] for name in ARGUMENTS.get(method, ()) if name in params]
34
+ return getattr(hero, method)(*args)
35
+
36
+
37
+ def replay(run, pace=None, out=print):
38
+ """Plays a run again on the game (or on the simulator, if it is switched on). Returns the
39
+ number of the first call whose answer differs from the recording (1-based), or None."""
40
+ from .dungeoncoder import Game
41
+ game = Game(_level_file(run))
42
+ if pace is not None:
43
+ game.get_hero().set_pace(pace)
44
+ for n, (method, params, recorded) in enumerate(run["calls"], start=1):
45
+ if method == "set_pace" and pace is not None:
46
+ continue
47
+ now = call(game, method, params)
48
+ if method not in GAME_CALLS and now != recorded:
49
+ out(f"call {n} {method}: recorded {recorded!r}, now {now!r} - the run differs from here on")
50
+ return n
51
+ return None
52
+
53
+
54
+ def positions(run):
55
+ """[(call number, method, params, result, (col, row), direction)] for every call of the run,
56
+ replayed in a fresh simulator: where the hero stood after it."""
57
+ from . import dungeoncoder as core
58
+ from .sim import Simulator
59
+ before = core._simulator
60
+ core._simulator = Simulator(level_override="")
61
+ rows = []
62
+ try:
63
+ from .dungeoncoder import Game
64
+ game = Game(_level_file(run))
65
+ sim = core._simulator
66
+ for n, (method, params, recorded) in enumerate(run["calls"], start=1):
67
+ result = call(game, method, params)
68
+ hero = sim.level.character
69
+ rows.append((n, method, params, result, sim.level.cell_of(hero), sim.direction()))
70
+ rows.append(("end", "get_statistics", None, game.get_statistics(), sim.level.cell_of(sim.level.character),
71
+ sim.direction()))
72
+ finally:
73
+ core._simulator = before
74
+ return rows
75
+
76
+
77
+ def describe(method, params):
78
+ args = ", ".join(repr(v) for k, v in (params or {}).items() if k != "hero")
79
+ who = f"hero {params['hero']}: " if params and params.get("hero") else ""
80
+ return f"{who}{method}({args})"
@@ -0,0 +1,2 @@
1
+ httpx>=0.27
2
+ attrs>=23.1