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.
- dungeoncoder/__init__.py +4 -0
- dungeoncoder/__main__.py +254 -0
- dungeoncoder/_api_config.py +6 -0
- dungeoncoder/_generated/__init__.py +8 -0
- dungeoncoder/_generated/api/__init__.py +1 -0
- dungeoncoder/_generated/api/game/__init__.py +1 -0
- dungeoncoder/_generated/api/game/get_statistics.py +158 -0
- dungeoncoder/_generated/api/game/get_version.py +166 -0
- dungeoncoder/_generated/api/hero/__init__.py +1 -0
- dungeoncoder/_generated/api/hero/ask_oracle.py +192 -0
- dungeoncoder/_generated/api/hero/configure.py +207 -0
- dungeoncoder/_generated/api/hero/drop.py +207 -0
- dungeoncoder/_generated/api/hero/get_inventory.py +188 -0
- dungeoncoder/_generated/api/hero/get_items_at_position.py +188 -0
- dungeoncoder/_generated/api/hero/interact.py +188 -0
- dungeoncoder/_generated/api/hero/is_abyss_in_front.py +188 -0
- dungeoncoder/_generated/api/hero/is_at_goal.py +192 -0
- dungeoncoder/_generated/api/hero/is_collision_in_front.py +188 -0
- dungeoncoder/_generated/api/hero/is_enemy_in_front.py +188 -0
- dungeoncoder/_generated/api/hero/is_facing_north.py +188 -0
- dungeoncoder/_generated/api/hero/is_switch_in_front.py +188 -0
- dungeoncoder/_generated/api/hero/is_torch_in_front.py +188 -0
- dungeoncoder/_generated/api/hero/move.py +188 -0
- dungeoncoder/_generated/api/hero/peek_item_value.py +211 -0
- dungeoncoder/_generated/api/hero/pickup.py +207 -0
- dungeoncoder/_generated/api/hero/read_item_value.py +188 -0
- dungeoncoder/_generated/api/hero/sense_goal.py +192 -0
- dungeoncoder/_generated/api/hero/set_pace.py +207 -0
- dungeoncoder/_generated/api/hero/turn_left.py +188 -0
- dungeoncoder/_generated/api/level/__init__.py +1 -0
- dungeoncoder/_generated/api/level/load_level.py +190 -0
- dungeoncoder/_generated/api/level/reset_level.py +158 -0
- dungeoncoder/_generated/client.py +271 -0
- dungeoncoder/_generated/errors.py +14 -0
- dungeoncoder/_generated/models/__init__.py +47 -0
- dungeoncoder/_generated/models/api_error_response.py +98 -0
- dungeoncoder/_generated/models/api_error_response_status.py +7 -0
- dungeoncoder/_generated/models/boolean_result.py +96 -0
- dungeoncoder/_generated/models/boolean_result_status.py +7 -0
- dungeoncoder/_generated/models/configure_params.py +84 -0
- dungeoncoder/_generated/models/distance_param.py +76 -0
- dungeoncoder/_generated/models/name_param.py +76 -0
- dungeoncoder/_generated/models/nullable_integer_result.py +104 -0
- dungeoncoder/_generated/models/nullable_integer_result_status.py +7 -0
- dungeoncoder/_generated/models/nullable_string_result.py +104 -0
- dungeoncoder/_generated/models/nullable_string_result_status.py +7 -0
- dungeoncoder/_generated/models/pace_params.py +76 -0
- dungeoncoder/_generated/models/statistics.py +217 -0
- dungeoncoder/_generated/models/statistics_result.py +104 -0
- dungeoncoder/_generated/models/statistics_result_status.py +7 -0
- dungeoncoder/_generated/models/string_array_result.py +100 -0
- dungeoncoder/_generated/models/string_array_result_status.py +7 -0
- dungeoncoder/_generated/models/tiled_level.py +67 -0
- dungeoncoder/_generated/models/version_result.py +104 -0
- dungeoncoder/_generated/models/version_result_result.py +84 -0
- dungeoncoder/_generated/models/version_result_status.py +7 -0
- dungeoncoder/_generated/types.py +53 -0
- dungeoncoder/asciimap.py +824 -0
- dungeoncoder/dungeoncoder.py +482 -0
- dungeoncoder/generator.py +213 -0
- dungeoncoder/packs/gelaende.json +1 -0
- dungeoncoder/packs/items.json +67 -0
- dungeoncoder/packs/station.json +1 -0
- dungeoncoder/packs/studio.json +1 -0
- dungeoncoder/packs/tilesets.json +1 -0
- dungeoncoder/packs/werkstatt.json +1 -0
- dungeoncoder/replay.py +80 -0
- dungeoncoder/requirements.txt +2 -0
- dungeoncoder/sim.py +792 -0
- dungeoncoder/testing.py +63 -0
- dungeoncoder/trace.py +92 -0
- dungeoncoder/variants.py +112 -0
- dungeoncoder-0.2.0.dist-info/METADATA +37 -0
- dungeoncoder-0.2.0.dist-info/RECORD +77 -0
- dungeoncoder-0.2.0.dist-info/WHEEL +5 -0
- dungeoncoder-0.2.0.dist-info/licenses/LICENSE.txt +25 -0
- 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})"
|