From afe63873c5d2320cc9611047850b440f3379caca Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 19 Apr 2021 17:52:08 +0100 Subject: [PATCH 01/29] work on optimizing CAT exploration in rllib --- .../examples/experiments/rts/griddly_rts.yaml | 369 ++++++++++++++++++ .../examples/experiments/rts/rts/__init__.py | 0 .../experiments/rts/rts/models/__init__.py | 1 + .../experiments/rts/rts/models/impala_cnn.py | 53 +++ .../experiments/rts/rts/models/simple_conv.py | 0 .../examples/experiments/rts/rts_self_play.py | 124 ++++++ python/griddly/util/rllib/callbacks.py | 13 +- python/griddly/util/rllib/environment/core.py | 134 ++++--- .../environment/observer_episode_recorder.py | 60 +++ .../conditional_action_exploration.py | 117 ++---- 10 files changed, 737 insertions(+), 134 deletions(-) create mode 100644 python/examples/experiments/rts/griddly_rts.yaml create mode 100644 python/examples/experiments/rts/rts/__init__.py create mode 100644 python/examples/experiments/rts/rts/models/__init__.py create mode 100644 python/examples/experiments/rts/rts/models/impala_cnn.py create mode 100644 python/examples/experiments/rts/rts/models/simple_conv.py create mode 100644 python/examples/experiments/rts/rts_self_play.py create mode 100644 python/griddly/util/rllib/environment/observer_episode_recorder.py diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml new file mode 100644 index 000000000..caa24514d --- /dev/null +++ b/python/examples/experiments/rts/griddly_rts.yaml @@ -0,0 +1,369 @@ +Version: "0.1" +Environment: + Name: GriddlyRTS + Description: An RTS Game. There's aliens and stuff. + Observers: + Sprite2D: + TileSize: 16 + BackgroundTile: oryx/oryx_tiny_galaxy/tg_sliced/tg_world/tg_world_floor_panel_metal_a.png + Isometric: + TileSize: [32, 48] + BackgroundTile: oryx/oryx_iso_dungeon/floor-1.png + IsoTileHeight: 16 + IsoTileDepth: 4 + Vector: + IncludePlayerId: true + IncludeVariables: true + Variables: + - Name: player_resources + InitialValue: 0 + PerPlayer: true + Player: + Count: 2 + Termination: + Lose: + - eq: [base:count, 0] # If the player has no bases +# Win: +# - eq: [_score, 100] # First player to 10 reward points + Levels: + - | + M M . . . . . . . . . . . . . . + M M . . . . . . . . . . . . . . + . . B1 H1 . . . . . . . . . . . . + . . H1 . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . H2 . . + . . . . . . . . . . . . H2 B2 . . + . . . . . . . . . . . . . . M M + . . . . . . . . . . . . . . M M + - | + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W + W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W + W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W + W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . M M M M . . . . . . . . . . W + W . . . . . . . . . . . . . . M M M M M M . . . . . . . . W + W . . . . . . . . . . . . . M . . M . M M . . . . . . . . W + W . . . . . . . . . . . . . M M M M M M M . . . . . . . . W + W . . . . . . . . . . . . . . . M M M M . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W + W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + - | + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W + W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W + W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W + W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W + W W W W W W W W W . . . . . . . . . . . . . . W W W W W w W + W . . . . . . W W . . . w w w w w w . . . . . W W W W W w W + W . . . . . . . . . . . . . w w . . . . . . . W W W W W w W + W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W + W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W + W . . . . . . . . . . . . . . M M M M . . . . W W W W W w W + W . . . . P1 w . . . . . . . . M M M M M M . W W W W W W W W + W . . . . P1 w . . . . . . . M . . M . M M . . . . . . . . W + W . . . . P2 w . . . . . . . M M M M M M M . . . . . . . . W + W . . . . P2 w . . . . . . . . . M M M M . . . . . . . . . W + W . . . . P1 w . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W + W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + - | + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + W . . . . M M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . M M M M W + W . . . . . M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . M M W + W . . . . . . M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . H2 . . M W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . B2 H2 . M W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W W W w w W W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W . . W W W W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W W W W W W W W W W W W W w w w w w w w w w w w w w W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W M . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W M M . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W M M M . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . . . W + W W W W W W W W W W W . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . W W W W W W W W W W W + W . . . . . . . . . . . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . . . . . . . . M M M W + W . . . . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . M M W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . M W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W w w w w w w w w w w w w w W W W W W W W W W W W W W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W W W W . . W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W w w W W W W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W M . H1 B1 . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W M . . H1 . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M . . . . . . W + W M M . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M M . . . . . W + W M M M M . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M M M . . . . W + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + +Actions: + - Name: spawn_harvester + InputMapping: + Internal: true + Behaviours: + - Src: + Object: base + Commands: + - spawn: harvester + Dst: + Object: _empty + + + - Src: + Object: base + Dst: + Object: [base, puncher, harvester, pusher, movable_wall] + Commands: + - exec: + Action: spawn_harvester + Delay: 1 + Randomize: true + + # Harvester costs 5 resources to build + - Name: build_harvester + Behaviours: + - Src: + Preconditions: + - gt: [player_resources, 5] + Object: base + Dst: + Object: base + Commands: + - exec: + Action: spawn_harvester + Delay: 10 + Randomize: true + + + - Name: gather + Behaviours: + - Src: + Preconditions: + - lt: [src.resources, 5] + Object: harvester + Commands: + - incr: resources + - reward: 1 + Dst: + Object: minerals + Commands: + - decr: dst.resources + - eq: + Arguments: [dst.resources, 0] + Commands: + - remove: true + - Src: + Preconditions: + - gt: [src.resources, 0] + Object: harvester + Commands: + - decr: resources + - reward: 1 + Dst: + Object: base + Commands: + - incr: player_resources + + - Name: move + Behaviours: + - Src: + Object: [harvester, puncher, pusher, movable_wall] + Commands: + - mov: _dest # mov will move the object, _dest is the destination location of the action + Dst: + Object: _empty + + - Src: + Object: pusher + Commands: + - mov: _dest # mov will move the object, _dest is the destination location of the action + Dst: + Object: [movable_wall, harvester, puncher] + Commands: + - cascade: _dest # reapply the same action to the dest location of the action + + - Name: punch + Behaviours: + - Src: + Object: puncher + Commands: + - reward: 1 + Dst: + Object: [puncher, harvester, pusher, base] + Commands: + - decr: health + - eq: + Arguments: [0, health] + Commands: + - remove: true + +Objects: + - Name: minerals + MapCharacter: M + Variables: + - Name: resources + InitialValue: 20 + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_items/tg_items_crystal_green.png + Block2D: + - Shape: triangle + Color: [0.0, 1.0, 0.0] + Scale: 1.0 + Isometric: + - Image: oryx/oryx_iso_dungeon/minerals-1.png + + - Name: harvester + MapCharacter: H + Variables: + - Name: resources + InitialValue: 0 + - Name: health + InitialValue: 10 + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_jelly_d1.png + Block2D: + - Shape: square + Color: [0.6, 0.2, 0.2] + Scale: 0.5 + Isometric: + - Image: oryx/oryx_iso_dungeon/jelly-1.png + + - Name: pusher + MapCharacter: P + Variables: + - Name: health + InitialValue: 10 + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_crawler_queen_d1.png + Block2D: + - Shape: square + Color: [0.2, 0.2, 0.6] + Scale: 1.0 + Isometric: + - Image: oryx/oryx_iso_dungeon/queen-1.png + + - Name: puncher + MapCharacter: p + Variables: + - Name: health + InitialValue: 5 + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_beast_d1.png + Block2D: + - Color: [0.2, 0.6, 0.6] + Shape: square + Scale: 0.8 + Isometric: + - Image: oryx/oryx_iso_dungeon/beast-1.png + + - Name: fixed_wall + MapCharacter: W + Observers: + Sprite2D: + - TilingMode: WALL_2 # Will tile walls with two images + Image: + - oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img33.png + - oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img40.png + Block2D: + - Color: [0.5, 0.5, 0.5] + Shape: square + Isometric: + - Image: oryx/oryx_iso_dungeon/wall-grey-1.png + + - Name: movable_wall + MapCharacter: w + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img282.png + Block2D: + - Color: [0.8, 0.8, 0.8] + Shape: square + Isometric: + - Image: oryx/oryx_iso_dungeon/crate-1.png + + - Name: base + MapCharacter: B + Variables: + - Name: health + InitialValue: 10 + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img324.png + Block2D: + - Color: [0.8, 0.8, 0.3] + Shape: triangle + Isometric: + - Image: oryx/oryx_iso_dungeon/base-1.png diff --git a/python/examples/experiments/rts/rts/__init__.py b/python/examples/experiments/rts/rts/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/python/examples/experiments/rts/rts/models/__init__.py b/python/examples/experiments/rts/rts/models/__init__.py new file mode 100644 index 000000000..05ce93df3 --- /dev/null +++ b/python/examples/experiments/rts/rts/models/__init__.py @@ -0,0 +1 @@ +from rts.models.impala_cnn import ImpalaCNNAgent \ No newline at end of file diff --git a/python/examples/experiments/rts/rts/models/impala_cnn.py b/python/examples/experiments/rts/rts/models/impala_cnn.py new file mode 100644 index 000000000..47dd4b6e8 --- /dev/null +++ b/python/examples/experiments/rts/rts/models/impala_cnn.py @@ -0,0 +1,53 @@ +from ray.rllib.models.torch.torch_modelv2 import TorchModelV2 +from torch import nn +import numpy as np + +from griddly.util.rllib.torch.agents.common import layer_init + + +class ImpalaCNNAgent(TorchModelV2, nn.Module): + """ + Simple Convolution agent that calculates the required linear output layer + """ + + def __init__(self, obs_space, action_space, num_outputs, model_config, name): + super().__init__(obs_space, action_space, num_outputs, model_config, name) + nn.Module.__init__(self) + + self._num_objects = obs_space.shape[2] + self._num_actions = num_outputs + + linear_flatten = np.prod(obs_space.shape[:2])*64 + + self.network = nn.Sequential( + layer_init(nn.Conv2d(self._num_objects, 32, 3, padding=1)), + nn.ReLU(), + layer_init(nn.Conv2d(32, 64, 3, padding=1)), + nn.ReLU(), + nn.Flatten(), + layer_init(nn.Linear(linear_flatten, 1024)), + nn.ReLU(), + layer_init(nn.Linear(1024, 512)), + nn.ReLU(), + ) + + self._actor_head = nn.Sequential( + layer_init(nn.Linear(512, 256), std=0.01), + nn.ReLU(), + layer_init(nn.Linear(256, self._num_actions), std=0.01) + ) + + self._critic_head = nn.Sequential( + layer_init(nn.Linear(512, 1), std=0.01) + ) + + def forward(self, input_dict, state, seq_lens): + obs_transformed = input_dict['obs'].permute(0, 3, 1, 2) + network_output = self.network(obs_transformed) + value = self._critic_head(network_output) + self._value = value.reshape(-1) + logits = self._actor_head(network_output) + return logits, state + + def value_function(self): + return self._value \ No newline at end of file diff --git a/python/examples/experiments/rts/rts/models/simple_conv.py b/python/examples/experiments/rts/rts/models/simple_conv.py new file mode 100644 index 000000000..e69de29bb diff --git a/python/examples/experiments/rts/rts_self_play.py b/python/examples/experiments/rts/rts_self_play.py new file mode 100644 index 000000000..801d287bb --- /dev/null +++ b/python/examples/experiments/rts/rts_self_play.py @@ -0,0 +1,124 @@ +import os +import sys + +import ray +from ray import tune +from ray.rllib.models import ModelCatalog +from ray.tune.integration.wandb import WandbLoggerCallback +from ray.tune.registry import register_env + +from rts.models import ImpalaCNNAgent +from griddly import gd +from griddly.util.rllib.callbacks import GriddlyCallbacks +from griddly.util.rllib.environment.core import RLlibMultiAgentWrapper, RLlibEnv +from griddly.util.rllib.torch.conditional_actions.conditional_action_policy_trainer import \ + ConditionalActionImpalaTrainer + +import argparse + +parser = argparse.ArgumentParser(description='Run experiments') + +parser.add_argument('--root-directory', default=os.path.expanduser("~/ray_results"), + help='root directory for all data associated with the run') +parser.add_argument('--num-gpus', default=1, type=int, help='Number of GPUs to make available to ray.') +parser.add_argument('--num-cpus', default=8, type=int, help='Number of CPUs to make available to ray.') + +parser.add_argument('--num-workers', default=7, type=int, help='Number of workers') +parser.add_argument('--num-envs-per-worker', default=5, type=int, help='Number of workers') +parser.add_argument('--num-gpus-per-worker', default=0, type=float, help='Number of gpus per worker') +parser.add_argument('--num-cpus-per-worker', default=1, type=float, help='Number of gpus per worker') +parser.add_argument('--max-training-steps', default=20000000, type=int, help='Number of workers') +parser.add_argument('--train-batch-size', default=500, type=int, help='Training batch size') + +parser.add_argument('--capture-video', action='store_true', help='enable video capture') +parser.add_argument('--video-directory', default='videos', help='directory of video') +parser.add_argument('--video-frequency', type=int, default=1000000, help='Frequency of videos') + +parser.add_argument('--seed', type=int, default=69420, help='seed for experiments') + +parser.add_argument('--lr', type=float, default=0.0005, help='learning rate') + +if __name__ == '__main__': + + args = parser.parse_args() + + sep = os.pathsep + os.environ['PYTHONPATH'] = sep.join(sys.path) + + ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus) + #ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus, local_mode=True) + + env_name = "griddly-rts-env" + + + def _create_env(env_config): + env = RLlibEnv(env_config) + return RLlibMultiAgentWrapper(env, env_config) + + register_env(env_name, _create_env) + ModelCatalog.register_custom_model("ImpalaCNN", ImpalaCNNAgent) + + wandbLoggerCallback = WandbLoggerCallback( + project='rts_experiments', + api_key_file='~/.wandb_rc', + dir=args.root_directory + ) + + max_training_steps = args.max_training_steps + + config = { + 'framework': 'torch', + 'seed': args.seed, + 'num_workers': args.num_workers, + 'num_envs_per_worker': args.num_envs_per_worker, + 'num_gpus_per_worker': float(args.num_gpus_per_worker), + 'num_cpus_per_worker': args.num_cpus_per_worker, + + 'train_batch_size': args.train_batch_size, + + 'callbacks': GriddlyCallbacks, + + 'model': { + 'custom_model': 'ImpalaCNN', + 'custom_model_config': {} + }, + 'env': env_name, + 'env_config': { + 'generate_valid_action_trees': True, + 'yaml_file': '/home/bam4d/qmul/Griddly/python/examples/experiments/rts/griddly_rts.yaml', + 'global_observer_type': gd.ObserverType.ISOMETRIC, + 'level': 0, + 'max_steps': 1000, + }, + # 'entropy_coeff_schedule': [ + # [0, 0.01], + # [max_training_steps, 0.0] + # ], + # 'lr_schedule': [ + # [0, args.lr], + # [max_training_steps, 0.0] + # ], + + } + + if args.capture_video: + real_video_frequency = int(args.video_frequency / (args.num_envs_per_worker * args.num_workers)) + config['env_config']['record_video_config'] = { + 'frequency': real_video_frequency, + 'directory': os.path.join(args.root_directory, args.video_directory) + } + + stop = { + "timesteps_total": max_training_steps, + } + + trial_name_creator = lambda trial: f'RTS-self-play' + + result = tune.run( + ConditionalActionImpalaTrainer, + local_dir=args.root_directory, + config=config, + stop=stop, + callbacks=[wandbLoggerCallback], + trial_name_creator=trial_name_creator + ) diff --git a/python/griddly/util/rllib/callbacks.py b/python/griddly/util/rllib/callbacks.py index c46e85824..4cbb09a64 100644 --- a/python/griddly/util/rllib/callbacks.py +++ b/python/griddly/util/rllib/callbacks.py @@ -11,10 +11,9 @@ class GriddlyCallbacks(DefaultCallbacks): def on_episode_end(self, *, worker: "RolloutWorker", base_env: BaseEnv, policies: Dict[PolicyID, Policy], episode: MultiAgentEpisode, env_index: Optional[int] = None, **kwargs) -> None: - if env_index == 0: - if not worker.multiagent: - info = episode.last_info_for() - if 'video' in info: - level = info['video']['level'] - path = info['video']['path'] - episode.media[f'level_{level}'] = Video(path) + pass + # info = episode.last_info_for() + # if 'videos' in info: + # level = info['video']['level'] + # path = info['video']['path'] + # episode.media[f'level_{level}'] = Video(path) diff --git a/python/griddly/util/rllib/environment/core.py b/python/griddly/util/rllib/environment/core.py index 602fa5f16..ac8510184 100644 --- a/python/griddly/util/rllib/environment/core.py +++ b/python/griddly/util/rllib/environment/core.py @@ -10,13 +10,7 @@ from griddly import GymWrapper from griddly.RenderTools import VideoRecorder - - -class RecordingState(Enum): - NOT_RECORDING = 1 - WAITING_FOR_EPISODE_START = 2 - BEFORE_RECORDING = 3 - RECORDING = 4 +from griddly.util.rllib.environment.observer_episode_recorder import ObserverEpisodeRecorder class RLlibEnv(GymWrapper): @@ -56,19 +50,35 @@ def __init__(self, env_config): super().__init__(**env_config) self.generate_valid_action_trees = env_config.get('generate_valid_action_trees', False) - self._record_video_config = env_config.get('record_video_config', None) + self.record_video_config = env_config.get('record_video_config', None) self._random_level_on_reset = env_config.get('random_level_on_reset', False) - super().reset() + self.env_steps = 0 - self._recording_state = None - self._env_steps = 0 + super().reset() - if self._record_video_config is not None: - self._recording_state = RecordingState.BEFORE_RECORDING - self._video_frequency = self._record_video_config.get('frequency', 1000) - self._video_directory = os.path.realpath(self._record_video_config.get('directory', '.')) - os.makedirs(self._video_directory, exist_ok=True) + if self.record_video_config is not None: + self.video_frequency = self.record_video_config.get('frequency', 1000) + self.video_directory = os.path.realpath(self.record_video_config.get('directory', '.')) + self.include_global_video = self.record_video_config.get('include_global', True) + self.include_agent_videos = self.record_video_config.get('include_agents', False) + os.makedirs(self.video_directory, exist_ok=True) + + if self.player_count == 1: + if self.include_agent_videos: + self._agent_recorder = ObserverEpisodeRecorder( + self, + 1, + self.video_frequency, + self.video_directory + ) + if self.include_global_video: + self._global_recorder = ObserverEpisodeRecorder( + self, + 'global', + self.video_frequency, + self.video_directory + ) self.set_transform() @@ -83,37 +93,21 @@ def _transform(self, observation): def _after_step(self, observation, reward, done, info): extra_info = {} - if self._recording_state is not None: - if self._recording_state is RecordingState.NOT_RECORDING and self._env_steps % self._video_frequency == 0: - self._recording_state = RecordingState.WAITING_FOR_EPISODE_START - - if self._recording_state == RecordingState.BEFORE_RECORDING: - global_obs = self.render(observer='global', mode='rgb_array') - self._global_recorder = VideoRecorder() - video_filename = os.path.join( - self._video_directory, - f'global_video_{uuid1()}_{self.level_id}_{self._env_steps}.mp4' - ) - - self._global_recorder.start(video_filename, global_obs.shape) - self._recording_state = RecordingState.RECORDING - - if self._recording_state == RecordingState.RECORDING: - global_obs = self.render(observer='global', mode='rgb_array') - self._global_recorder.add_frame(global_obs) - if done: - self._recording_state = RecordingState.NOT_RECORDING - self._global_recorder.close() - - extra_info['video'] = { - 'level': self.level_id, - 'path': self._global_recorder.output_file - } - - if self._recording_state == RecordingState.WAITING_FOR_EPISODE_START: - if done: - self._recording_state = RecordingState.BEFORE_RECORDING + # If we are in a multi-agent setting then we handle videos elsewhere + if self.player_count == 1: + if self.record_video_config is not None: + videos_list = [] + if self.include_agent_videos: + video_info = self._agent_recorder.step(self.level_id, self.env_steps, done) + if video_info is not None: + videos_list.append(video_info) + if self.include_global_video: + video_info = self._global_recorder.step(self.level_id, self.env_steps, done) + if video_info is not None: + videos_list.append(video_info) + + extra_info['videos'] = videos_list return extra_info @@ -161,11 +155,11 @@ def step(self, action): if 'video' in extra_info: info['video'] = extra_info['video'] - self._env_steps += 1 - if self.generate_valid_action_trees: self.last_valid_action_trees = self._get_valid_action_trees() - info['valid_action_tree'] = dict(self.last_valid_action_trees) + info['valid_action_tree'] = self.last_valid_action_trees.copy() + + self.env_steps += 1 return self._transform(observation), reward, done, info @@ -185,6 +179,25 @@ def __init__(self, env, env_config): assert self.player_count > 1, 'RLlibMultiAgentWrapper can only be used with environments that have multiple agents' + if self.record_video_config is not None: + if self.include_agent_videos: + self._agent_recorders = {} + for a in range(self.player_count): + agent_id = a+1 + self._agent_recorders[agent_id] = ObserverEpisodeRecorder( + self, + agent_id, + self.video_frequency, + self.video_directory + ) + if self.include_global_video: + self._global_recorder = ObserverEpisodeRecorder( + self, + 'global', + self.video_frequency, + self.video_directory + ) + def _to_multi_agent_map(self, data): return {a: data[a - 1] for a in self._active_agents} @@ -197,6 +210,25 @@ def _resolve_player_done_variable(self): resolved_variables = self.game.get_global_variable([self._player_done_variable]) return resolved_variables[self._player_done_variable] + def _after_step(self, obs_map, reward_map, done_map, info_map): + extra_info = {} + + if self.record_video_config is not None: + videos_list = [] + if self.include_agent_videos: + for a in self._active_agents: + video_info = self._agent_recorders[a].step(self.level_id, self.env_steps, done_map[a-1]) + if video_info is not None: + videos_list.append(video_info) + if self.include_global_video: + video_info = self._global_recorder.step(self.level_id, self.env_steps, done_map['__all__']) + if video_info is not None: + videos_list.append(video_info) + + extra_info['videos'] = videos_list + + return extra_info + def step(self, action_dict: MultiAgentDict): actions_array = np.zeros((self.player_count, *self.action_space.shape)) for agent_id, action in action_dict.items(): @@ -217,7 +249,7 @@ def step(self, action_dict: MultiAgentDict): if self.generate_valid_action_trees: info_map = self._to_multi_agent_map([ - {'valid_action_tree': valid_action_tree} for valid_action_tree in info['valid_action_trees'] + {'valid_action_tree': valid_action_tree} for valid_action_tree in info['valid_action_tree'] ]) else: info_map = self._to_multi_agent_map(defaultdict(dict)) @@ -230,6 +262,8 @@ def step(self, action_dict: MultiAgentDict): if is_done: self._active_agents.discard(agent_id) + extra_info = self._after_step(obs_map, reward_map, done_map, info_map) + assert len(obs_map) == len(reward_map) assert len(obs_map) == len(done_map) - 1 assert len(obs_map) == len(info_map) diff --git a/python/griddly/util/rllib/environment/observer_episode_recorder.py b/python/griddly/util/rllib/environment/observer_episode_recorder.py new file mode 100644 index 000000000..0aa98fbdc --- /dev/null +++ b/python/griddly/util/rllib/environment/observer_episode_recorder.py @@ -0,0 +1,60 @@ +import os +from enum import Enum +from uuid import uuid1 + +from griddly.RenderTools import VideoRecorder + + +class RecordingState(Enum): + NOT_RECORDING = 1 + WAITING_FOR_EPISODE_START = 2 + BEFORE_RECORDING = 3 + RECORDING = 4 + +class ObserverEpisodeRecorder(): + + def __init__(self, env, observer, video_frequency, video_directory="."): + + self._video_frequency = video_frequency + self._video_directory = video_directory + self._observer = observer + self._env = env + + self._recording_state = RecordingState.BEFORE_RECORDING + + def step(self, level_id, step_count, done): + + video_info = None + + if self._recording_state is RecordingState.NOT_RECORDING and step_count % self._video_frequency == 0: + self._recording_state = RecordingState.WAITING_FOR_EPISODE_START + + if self._recording_state == RecordingState.BEFORE_RECORDING: + global_obs = self._env.render(observer=self._observer, mode='rgb_array') + self._global_recorder = VideoRecorder() + + video_filename = os.path.join( + self._video_directory, + f'episode_video_{self._observer}_{uuid1()}_{level_id}_{step_count}.mp4' + ) + + self._global_recorder.start(video_filename, global_obs.shape) + self._recording_state = RecordingState.RECORDING + + if self._recording_state == RecordingState.RECORDING: + global_obs = self._env.render(observer=self._observer, mode='rgb_array') + self._global_recorder.add_frame(global_obs) + if done: + self._recording_state = RecordingState.NOT_RECORDING + self._global_recorder.close() + + video_info = { + 'level': level_id, + 'path': self._global_recorder.output_file + } + + if self._recording_state == RecordingState.WAITING_FOR_EPISODE_START: + if done: + self._recording_state = RecordingState.BEFORE_RECORDING + + return video_info \ No newline at end of file diff --git a/python/griddly/util/rllib/torch/conditional_actions/conditional_action_exploration.py b/python/griddly/util/rllib/torch/conditional_actions/conditional_action_exploration.py index 164442adb..ba4731769 100644 --- a/python/griddly/util/rllib/torch/conditional_actions/conditional_action_exploration.py +++ b/python/griddly/util/rllib/torch/conditional_actions/conditional_action_exploration.py @@ -5,9 +5,11 @@ from torch.distributions import Categorical import numpy as np + class TorchConditionalMaskingExploration(): - def __init__(self, model, dist_inputs, valid_action_trees, explore=False, invalid_action_masking='conditional', allow_nop=False): + def __init__(self, model, dist_inputs, valid_action_trees, explore=False, invalid_action_masking='conditional', + allow_nop=False): self._valid_action_trees = valid_action_trees self._num_inputs = dist_inputs.shape[0] @@ -19,23 +21,22 @@ def __init__(self, model, dist_inputs, valid_action_trees, explore=False, invali self._num_action_logits = np.sum(self._action_space_shape) self._num_action_parts = len(self._action_space_shape) + self.model = model + self._invalid_action_masking = invalid_action_masking self._allow_nop = allow_nop + self.device = dist_inputs.device + self._explore = explore self._inputs_split = dist_inputs.split(tuple(self._action_space_shape), dim=1) - self._full_tree = self._fill_node(self._action_space_shape,0) - - def _mask_and_sample(self, options, logits, is_parameters=False): + def _mask_and_sample(self, subtrees, logits): - mask = torch.zeros([logits.shape[0]]).to(logits.device) - mask[options] = 1 - - if is_parameters: - if not self._allow_nop: - mask[0] = 0 + mask = torch.zeros_like(logits).to(self.device) + for i in range(self._num_inputs): + mask[i][list(subtrees[i].keys())] = 1 masked_logits = logits + torch.log(mask) @@ -44,92 +45,54 @@ def _mask_and_sample(self, options, logits, is_parameters=False): logp = dist.log_prob(sampled) out_logits = masked_logits - # if not self._allow_nop and is_parameters: - # assert sampled != 0 - - - return sampled, out_logits, logp, mask - - def _fill_node(self, keys, pos): - if pos < len(keys): - return {k: self._fill_node(keys, pos + 1) for k in np.arange(keys[pos])} - else: - return {} + next_subtrees = [] + for i in range(self._num_inputs): + next_subtrees.append(subtrees[i][int(sampled[i])]) - def _merge_all_branches(self, tree): - all_nodes = {} - merged_tree = {} - for k, v in tree.items(): - v = self._merge_all_branches(v) - all_nodes.update(v) + return sampled, next_subtrees, out_logits, logp, mask - for k in tree.keys(): - merged_tree[k] = all_nodes - - return merged_tree - - def _process_valid_action_tree(self, valid_action_tree): + def _process_valid_action_tree_batched(self, valid_action_tree): subtree = valid_action_tree - subtree_options = list(subtree.keys()) # In the case there are no available actions for the player - if len(subtree_options) == 0: - subtree = self._full_tree - # build_tree = subtree - # for _ in range(self._num_action_parts): - # build_tree[0] = {} - # build_tree = build_tree[0] - subtree_options = list(subtree.keys()) + if len(subtree.keys()) == 0: + build_tree = subtree + for _ in range(self._num_action_parts): + build_tree[0] = {} + build_tree = build_tree[0] - # If we want very basic action masking where parameterized masks are superimposed we use this - if self._invalid_action_masking == 'collapsed': - subtree = self._merge_all_branches(valid_action_tree) - subtree_options = list(subtree.keys()) - - return subtree, subtree_options + return subtree def get_actions_and_mask(self): - actions = torch.zeros([self._num_inputs, self._num_action_parts]) - masked_logits = torch.zeros([self._num_inputs, self._num_action_logits]) - mask = torch.zeros([self._num_inputs, self._num_action_logits]) - logp_sums = torch.zeros([self._num_inputs]) + actions = torch.zeros([self._num_inputs, self._num_action_parts]).to(self.device) + masked_logits = torch.zeros([self._num_inputs, self._num_action_logits]).to(self.device) + mask = torch.zeros([self._num_inputs, self._num_action_logits]).to(self.device) + logp_sums = torch.zeros([self._num_inputs]).to(self.device) if self._valid_action_trees is not None: - for i in range(self._num_inputs): - if len(self._valid_action_trees) >= 1: - - subtree, subtree_options = self._process_valid_action_tree(self._valid_action_trees[i]) - - logp_parts = torch.zeros([self._num_action_parts]) - mask_offset = 0 - for a in range(self._num_action_parts): - - try: - dist_part = self._inputs_split[a] - is_parameters = a==(self._num_action_parts-1) - sampled, masked_part_logits, logp, mask_part = self._mask_and_sample(subtree_options, dist_part[i], is_parameters) - - # Set the action and the mask for each part of the action - actions[i, a] = sampled - masked_logits[i, mask_offset:mask_offset + self._action_space_shape[a]] = masked_part_logits - mask[i, mask_offset:mask_offset + self._action_space_shape[a]] = mask_part + if len(self._valid_action_trees) >= 1: - logp_parts[a] = logp + subtrees = [self._process_valid_action_tree_batched(tree) for tree in self._valid_action_trees] + mask_offset = 0 + for a in range(self._num_action_parts): + dist_part = self._inputs_split[a] - mask_offset += self._action_space_shape[a] + sampled, subtrees, masked_part_logits, logp, mask_part = self._mask_and_sample(subtrees, + dist_part) - subtree = subtree[int(sampled)] - subtree_options = list(subtree.keys()) - except ValueError as e: - print(e) + # Set the action and the mask for each part of the action + actions[:, a] = sampled + masked_logits[:, mask_offset:mask_offset + self._action_space_shape[a]] = masked_part_logits + mask[:, mask_offset:mask_offset + self._action_space_shape[a]] = mask_part + logp_sums += logp - logp_sums[i] = torch.sum(logp_parts) + mask_offset += self._action_space_shape[a] # if its a discrete then flatten the space if self._num_action_parts == 1: actions = actions.flatten() - return actions, masked_logits, logp_sums, mask \ No newline at end of file + return actions, masked_logits, logp_sums, mask From 80c796f8c5a3469c239ecba4c761f40b372170e6 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 19 Apr 2021 18:15:12 +0100 Subject: [PATCH 02/29] ignore any apocrita dirs --- python/griddly/.gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/griddly/.gitignore b/python/griddly/.gitignore index 92ead127e..8231059d4 100644 --- a/python/griddly/.gitignore +++ b/python/griddly/.gitignore @@ -1,2 +1,4 @@ libs/ -resources/ \ No newline at end of file +resources/ + +.apocrita/ \ No newline at end of file From be20cd9a127e0e71dadd68e03e415b1f12f5a1ec Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 19 Apr 2021 18:17:04 +0100 Subject: [PATCH 03/29] wrong folder --- python/.gitignore | 3 +++ python/griddly/.gitignore | 4 +--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/python/.gitignore b/python/.gitignore index 5391f8bed..acdb5a934 100644 --- a/python/.gitignore +++ b/python/.gitignore @@ -146,3 +146,6 @@ scratchpad/ # Video folders .video/ + +# HPC +.apocrita/ diff --git a/python/griddly/.gitignore b/python/griddly/.gitignore index 8231059d4..92ead127e 100644 --- a/python/griddly/.gitignore +++ b/python/griddly/.gitignore @@ -1,4 +1,2 @@ libs/ -resources/ - -.apocrita/ \ No newline at end of file +resources/ \ No newline at end of file From ac7b3fa61c15cee16b65a859f9963926bdd06533 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 19 Apr 2021 19:53:00 +0100 Subject: [PATCH 04/29] more work on griddlyrts yaml --- python/examples/experiments/rts/griddly_rts.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml index caa24514d..242980297 100644 --- a/python/examples/experiments/rts/griddly_rts.yaml +++ b/python/examples/experiments/rts/griddly_rts.yaml @@ -211,7 +211,7 @@ Actions: - lt: [src.resources, 5] Object: harvester Commands: - - incr: resources + - incr: src.resources - reward: 1 Dst: Object: minerals @@ -224,9 +224,10 @@ Actions: - Src: Preconditions: - gt: [src.resources, 0] + - eq: [src._playerId, dst._playerId] Object: harvester Commands: - - decr: resources + - decr: src.resources - reward: 1 Dst: Object: base From 62e44a01e3cf76720724f090cdae5805bc3eb000 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Tue, 20 Apr 2021 14:08:42 +0100 Subject: [PATCH 05/29] invalidate locations when resources are changed --- .../examples/experiments/rts/griddly_rts.yaml | 84 ++++++++-------- .../experiments/rts/tests/rts_tests.py | 98 +++++++++++++++++++ src/Griddly/Core/GDY/Objects/Object.cpp | 8 +- 3 files changed, 145 insertions(+), 45 deletions(-) create mode 100644 python/examples/experiments/rts/tests/rts_tests.py diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml index 242980297..6542dfbcb 100644 --- a/python/examples/experiments/rts/griddly_rts.yaml +++ b/python/examples/experiments/rts/griddly_rts.yaml @@ -7,7 +7,7 @@ Environment: TileSize: 16 BackgroundTile: oryx/oryx_tiny_galaxy/tg_sliced/tg_world/tg_world_floor_panel_metal_a.png Isometric: - TileSize: [32, 48] + TileSize: [ 32, 48 ] BackgroundTile: oryx/oryx_iso_dungeon/floor-1.png IsoTileHeight: 16 IsoTileDepth: 4 @@ -22,27 +22,27 @@ Environment: Count: 2 Termination: Lose: - - eq: [base:count, 0] # If the player has no bases -# Win: -# - eq: [_score, 100] # First player to 10 reward points + - eq: [ base:count, 0 ] # If the player has no bases + # Win: + # - eq: [_score, 100] # First player to 10 reward points Levels: - | - M M . . . . . . . . . . . . . . - M M . . . . . . . . . . . . . . - . . B1 H1 . . . . . . . . . . . . - . . H1 . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . H2 . . - . . . . . . . . . . . . H2 B2 . . - . . . . . . . . . . . . . . M M - . . . . . . . . . . . . . . M M + M M . . . . . . . . . . . . . . + M M . . . . . . . . . . . . . . + . . B1 H1 . . . . . . . . . . . . + . . H1 . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . H2 . . + . . . . . . . . . . . . H2 B2 . . + . . . . . . . . . . . . . . M M + . . . . . . . . . . . . . . M M - | W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W @@ -181,7 +181,7 @@ Actions: - Src: Object: base Dst: - Object: [base, puncher, harvester, pusher, movable_wall] + Object: [ base, puncher, harvester, pusher, movable_wall ] Commands: - exec: Action: spawn_harvester @@ -192,9 +192,9 @@ Actions: - Name: build_harvester Behaviours: - Src: - Preconditions: - - gt: [player_resources, 5] Object: base + Preconditions: + - gt: [ player_resources, 5 ] Dst: Object: base Commands: @@ -207,25 +207,25 @@ Actions: - Name: gather Behaviours: - Src: - Preconditions: - - lt: [src.resources, 5] Object: harvester + Preconditions: + - lt: [ resources, 5 ] Commands: - - incr: src.resources + - incr: resources - reward: 1 Dst: Object: minerals Commands: - - decr: dst.resources + - decr: resources - eq: - Arguments: [dst.resources, 0] + Arguments: [ resources, 0 ] Commands: - remove: true - Src: - Preconditions: - - gt: [src.resources, 0] - - eq: [src._playerId, dst._playerId] Object: harvester + Preconditions: + - gt: [ resources, 0 ] + - eq: [ src._playerId, dst._playerId ] Commands: - decr: src.resources - reward: 1 @@ -237,7 +237,7 @@ Actions: - Name: move Behaviours: - Src: - Object: [harvester, puncher, pusher, movable_wall] + Object: [ harvester, puncher, pusher, movable_wall ] Commands: - mov: _dest # mov will move the object, _dest is the destination location of the action Dst: @@ -248,7 +248,7 @@ Actions: Commands: - mov: _dest # mov will move the object, _dest is the destination location of the action Dst: - Object: [movable_wall, harvester, puncher] + Object: [ movable_wall, harvester, puncher ] Commands: - cascade: _dest # reapply the same action to the dest location of the action @@ -259,11 +259,11 @@ Actions: Commands: - reward: 1 Dst: - Object: [puncher, harvester, pusher, base] + Object: [ puncher, harvester, pusher, base ] Commands: - decr: health - eq: - Arguments: [0, health] + Arguments: [ 0, health ] Commands: - remove: true @@ -278,7 +278,7 @@ Objects: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_items/tg_items_crystal_green.png Block2D: - Shape: triangle - Color: [0.0, 1.0, 0.0] + Color: [ 0.0, 1.0, 0.0 ] Scale: 1.0 Isometric: - Image: oryx/oryx_iso_dungeon/minerals-1.png @@ -295,7 +295,7 @@ Objects: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_jelly_d1.png Block2D: - Shape: square - Color: [0.6, 0.2, 0.2] + Color: [ 0.6, 0.2, 0.2 ] Scale: 0.5 Isometric: - Image: oryx/oryx_iso_dungeon/jelly-1.png @@ -310,7 +310,7 @@ Objects: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_crawler_queen_d1.png Block2D: - Shape: square - Color: [0.2, 0.2, 0.6] + Color: [ 0.2, 0.2, 0.6 ] Scale: 1.0 Isometric: - Image: oryx/oryx_iso_dungeon/queen-1.png @@ -324,7 +324,7 @@ Objects: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_beast_d1.png Block2D: - - Color: [0.2, 0.6, 0.6] + - Color: [ 0.2, 0.6, 0.6 ] Shape: square Scale: 0.8 Isometric: @@ -339,7 +339,7 @@ Objects: - oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img33.png - oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img40.png Block2D: - - Color: [0.5, 0.5, 0.5] + - Color: [ 0.5, 0.5, 0.5 ] Shape: square Isometric: - Image: oryx/oryx_iso_dungeon/wall-grey-1.png @@ -350,7 +350,7 @@ Objects: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img282.png Block2D: - - Color: [0.8, 0.8, 0.8] + - Color: [ 0.8, 0.8, 0.8 ] Shape: square Isometric: - Image: oryx/oryx_iso_dungeon/crate-1.png @@ -364,7 +364,7 @@ Objects: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img324.png Block2D: - - Color: [0.8, 0.8, 0.3] + - Color: [ 0.8, 0.8, 0.3 ] Shape: triangle Isometric: - Image: oryx/oryx_iso_dungeon/base-1.png diff --git a/python/examples/experiments/rts/tests/rts_tests.py b/python/examples/experiments/rts/tests/rts_tests.py new file mode 100644 index 000000000..4ca406f06 --- /dev/null +++ b/python/examples/experiments/rts/tests/rts_tests.py @@ -0,0 +1,98 @@ +import numpy as np +import gym +import pytest + +from griddly import GymWrapperFactory, gd + + +@pytest.fixture +def test_name(request): + return request.node.name + + +def build_test_env(test_name, level_string): + wrapper_factory = GymWrapperFactory() + + wrapper_factory.build_gym_from_yaml( + test_name, + 'griddly_rts.yaml', + global_observer_type=gd.ObserverType.VECTOR, + player_observer_type=gd.ObserverType.VECTOR, + + ) + + env = gym.make(f'GDY-{test_name}-v0') + env.reset(level_string=level_string) + return env + + +def test_harvester(test_name): + """ + Test the mechanics of harvesters + """ + + level_string = ( + 'w w w w\n' + 'B1 H1 . M\n' + 'B2 H2 . M\n' + 'w w w w\n' + ) + + env = build_test_env(test_name, level_string) + + # Test that the valid action tree con only move right for both + trees = env.game.build_valid_action_trees() + assert len(trees) == 2 + # possible x positions + assert trees[0].keys() == {1} + assert trees[1].keys() == {1} + + # possible y positions + assert trees[0][1].keys() == {1} + assert trees[1][1].keys() == {2} + + # possible action_types (can only move) + # print(env.action_names) + assert trees[0][1][1].keys() == {2} + assert trees[1][1][2].keys() == {2} + + # Both harvesters can only move right (and NOP) + assert trees[0][1][1][2].keys() == {0, 3} + assert trees[1][1][2][2].keys() == {0, 3} + + # Move both harvesters right + observation, reward, done, info = env.step([ + [1, 1, 2, 3], + [1, 2, 2, 3] + ]) + + assert reward == [0, 0] + assert done == False + + # Gather right 5 times and check that the harvesters have 5 resources (and check rewards) + for i in range([1, 2, 3, 4, 5]): + observation, reward, done, info = env.step([ + [2, 1, 1, 3], + [2, 2, 1, 3] + ]) + + assert reward == [1, 1] + + # Check that the resource value increases for harvesters + assert observation[0][11, 2, 1] == i + assert observation[1][11, 2, 2] == i + + # Check that the resource value decreases for minerals + assert observation[0][11, 3, 1] == 20 - i + assert observation[1][11, 3, 2] == 20 - i + + # Check that there are no invalid actions in the tree + + # Check we can no longer harvest + observation, reward, done, info = env.step([ + [2, 1, 1, 3], + [2, 2, 1, 3] + ]) + + assert reward == [0, 0] + assert done == [False, False] diff --git a/src/Griddly/Core/GDY/Objects/Object.cpp b/src/Griddly/Core/GDY/Objects/Object.cpp index a6b417686..da1eeb601 100644 --- a/src/Griddly/Core/GDY/Objects/Object.cpp +++ b/src/Griddly/Core/GDY/Objects/Object.cpp @@ -238,6 +238,7 @@ BehaviourFunction Object::instantiateBehaviour(std::string commandName, Behaviou auto b = variablePointers["1"]; return [this, a, b](std::shared_ptr action) -> BehaviourResult { *a->resolve_ptr(action) += b->resolve(action); + grid_->invalidateLocation(getLocation()); return {}; }; } @@ -248,6 +249,7 @@ BehaviourFunction Object::instantiateBehaviour(std::string commandName, Behaviou auto b = variablePointers["1"]; return [this, a, b](std::shared_ptr action) -> BehaviourResult { *a->resolve_ptr(action) -= b->resolve(action); + grid_->invalidateLocation(getLocation()); return {}; }; } @@ -259,7 +261,7 @@ BehaviourFunction Object::instantiateBehaviour(std::string commandName, Behaviou return [this, a, b](std::shared_ptr action) -> BehaviourResult { spdlog::debug("set"); *a->resolve_ptr(action) = b->resolve(action); - + grid_->invalidateLocation(getLocation()); return {}; }; } @@ -270,7 +272,7 @@ BehaviourFunction Object::instantiateBehaviour(std::string commandName, Behaviou return [this, a](std::shared_ptr action) -> BehaviourResult { spdlog::debug("incr"); (*a->resolve_ptr(action)) += 1; - + grid_->invalidateLocation(getLocation()); return {}; }; } @@ -281,7 +283,7 @@ BehaviourFunction Object::instantiateBehaviour(std::string commandName, Behaviou return [this, a](std::shared_ptr action) -> BehaviourResult { spdlog::debug("decr"); (*a->resolve_ptr(action)) -= 1; - + grid_->invalidateLocation(getLocation()); return {}; }; } From 2210b7c8ad5e69665a10b2d3c4114e8f870c3c1d Mon Sep 17 00:00:00 2001 From: Bam4d Date: Tue, 20 Apr 2021 15:38:56 +0100 Subject: [PATCH 06/29] adding gte and lte commands for nicer looking yaml conditions --- .../examples/experiments/rts/griddly_rts.yaml | 11 ++- .../experiments/rts/tests/rts_tests.py | 56 ++++++++++++- resources/gdy-schema.json | 78 ++++++++++++++++++- src/Griddly/Core/GDY/Objects/Object.cpp | 8 ++ src/Griddly/Core/GDY/TerminationHandler.cpp | 6 ++ 5 files changed, 152 insertions(+), 7 deletions(-) diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml index 6542dfbcb..71b41abfb 100644 --- a/python/examples/experiments/rts/griddly_rts.yaml +++ b/python/examples/experiments/rts/griddly_rts.yaml @@ -183,6 +183,7 @@ Actions: Dst: Object: [ base, puncher, harvester, pusher, movable_wall ] Commands: + # Try to spawn in another location on the next tick - exec: Action: spawn_harvester Delay: 1 @@ -190,14 +191,20 @@ Actions: # Harvester costs 5 resources to build - Name: build_harvester + InputMapping: + Inputs: + 1: + Description: Build + VectorToDest: [ 0, 0 ] Behaviours: - Src: Object: base Preconditions: - - gt: [ player_resources, 5 ] + - gte: [ player_resources, 5 ] Dst: Object: base Commands: + # Queue a build which will take 10 seconds - exec: Action: spawn_harvester Delay: 10 @@ -227,7 +234,7 @@ Actions: - gt: [ resources, 0 ] - eq: [ src._playerId, dst._playerId ] Commands: - - decr: src.resources + - decr: resources - reward: 1 Dst: Object: base diff --git a/python/examples/experiments/rts/tests/rts_tests.py b/python/examples/experiments/rts/tests/rts_tests.py index 4ca406f06..f67ab2ca1 100644 --- a/python/examples/experiments/rts/tests/rts_tests.py +++ b/python/examples/experiments/rts/tests/rts_tests.py @@ -66,11 +66,17 @@ def test_harvester(test_name): [1, 2, 2, 3] ]) + can_gather_tree = env.game.build_valid_action_trees() + + # Can gather and move + assert can_gather_tree[0][2][1].keys() == {1, 2} + assert can_gather_tree[1][2][2].keys() == {1, 2} + assert reward == [0, 0] assert done == False # Gather right 5 times and check that the harvesters have 5 resources (and check rewards) - for i in range([1, 2, 3, 4, 5]): + for i in range(1, 6): observation, reward, done, info = env.step([ [2, 1, 1, 3], [2, 2, 1, 3] @@ -87,12 +93,56 @@ def test_harvester(test_name): assert observation[1][11, 3, 2] == 20 - i # Check that there are no invalid actions in the tree + no_more_gather_tree = env.game.build_valid_action_trees() + + # Can only move + assert no_more_gather_tree[0][2][1].keys() == {2} + assert no_more_gather_tree[1][2][2].keys() == {2} - # Check we can no longer harvest + # Check that gather does nothing observation, reward, done, info = env.step([ [2, 1, 1, 3], [2, 2, 1, 3] ]) + # Check that the resource value increases for harvesters + assert observation[0][11, 2, 1] == 5 + assert observation[1][11, 2, 2] == 5 + + # Check that the resource value decreases for minerals + assert observation[0][11, 3, 1] == 15 + assert observation[1][11, 3, 2] == 15 + assert reward == [0, 0] - assert done == [False, False] + assert done == False + + # Move back next to the base + observation, reward, done, info = env.step([ + [2, 1, 2, 1], + [2, 2, 2, 1] + ]) + + # Pass all the resources to the base + for i in [4, 3, 2, 1, 0]: + observation, reward, done, info = env.step([ + [1, 1, 1, 1], + [1, 2, 1, 1] + ]) + + assert reward == [1, 1] + + # Check that the resource value increases for harvesters + assert observation[0][11, 1, 1] == i + assert observation[1][11, 1, 2] == i + + # cannot give more resources to the base + observation, reward, done, info = env.step([ + [1, 1, 1, 1], + [1, 2, 1, 1] + ]) + + assert observation[0][11, 1, 1] == 0 + assert observation[1][11, 1, 2] == 0 + + # Now the players have 5 resources each, we should be able to build a new harvester + can_build_harvester = env.game.build_valid_action_trees() diff --git a/resources/gdy-schema.json b/resources/gdy-schema.json index f7fd9b96d..632c15347 100644 --- a/resources/gdy-schema.json +++ b/resources/gdy-schema.json @@ -375,6 +375,17 @@ "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition/definitions/terminationArgument" } }, + "gte": { + "$id": "#/properties/Environment/properties/Termination/definitions/terminationCondition/properties/gte", + "type": "array", + "title": "Greater Than Or Equal", + "description": "Check if the first argument is greater than or equal to the second", + "minItems": 2, + "maxItems": 2, + "items": { + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition/definitions/terminationArgument" + } + }, "lt": { "$id": "#/properties/Environment/properties/Termination/definitions/terminationCondition/properties/lt", "type": "array", @@ -385,6 +396,17 @@ "items": { "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition/definitions/terminationArgument" } + }, + "lte": { + "$id": "#/properties/Environment/properties/Termination/definitions/terminationCondition/properties/lte", + "type": "array", + "title": "Less Than Or Equal", + "description": "Check if the first argument is less than or equal to the second", + "minItems": 2, + "maxItems": 2, + "items": { + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition/definitions/terminationArgument" + } } }, "definitions": { @@ -672,6 +694,17 @@ "$ref": "#/properties/Actions/items/properties/Behaviours/definitions/commandArgument" } }, + "gte": { + "$id": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionPreconditionCommand/properties/gte", + "type": "array", + "title": "Greater Than Or Equal", + "description": "Check if the first argument is greater than or equal to the second", + "minItems": 2, + "maxItems": 2, + "items": { + "$ref": "#/properties/Actions/items/properties/Behaviours/definitions/commandArgument" + } + }, "lt": { "$id": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionPreconditionCommand/properties/lt", "type": "array", @@ -682,6 +715,17 @@ "items": { "$ref": "#/properties/Actions/items/properties/Behaviours/definitions/commandArgument" } + }, + "lte": { + "$id": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionPreconditionCommand/properties/lte", + "type": "array", + "title": "Less Than Or Equal", + "description": "Check if the first argument is less than or equal to the second", + "minItems": 2, + "maxItems": 2, + "items": { + "$ref": "#/properties/Actions/items/properties/Behaviours/definitions/commandArgument" + } } } }, @@ -709,7 +753,7 @@ } }, "lt": { - "$id": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gt", + "$id": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lt", "type": "object", "title": "Less Than", "description": "The specified commands will only be run if the value of the first argument is less than the second.", @@ -724,8 +768,24 @@ } } }, + "lte": { + "$id": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lte", + "type": "object", + "title": "Less Than Or Equal", + "description": "The specified commands will only be run if the value of the first argument is less than or equal to the second.", + "minItems": 2, + "maxItems": 2, + "properties": { + "Arguments": { + "$ref": "#/properties/Actions/items/properties/Behaviours/definitions/commandArgumentList" + }, + "Commands": { + "$ref": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommandList" + } + } + }, "gt": { - "$id": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lt", + "$id": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gt", "type": "object", "title": "Greater Than", "description": "The specified commands will only be run if the value of the first argument is greater than the second.", @@ -737,6 +797,20 @@ "$ref": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommandList" } } + }, + "gte": { + "$id": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gte", + "type": "object", + "title": "Greater Than Or Equal", + "description": "The specified commands will only be run if the value of the first argument is greater than or equal to the second.", + "properties": { + "Arguments": { + "$ref": "#/properties/Actions/items/properties/Behaviours/definitions/commandArgument" + }, + "Commands": { + "$ref": "#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommandList" + } + } } } }, diff --git a/src/Griddly/Core/GDY/Objects/Object.cpp b/src/Griddly/Core/GDY/Objects/Object.cpp index da1eeb601..e45f82f2b 100644 --- a/src/Griddly/Core/GDY/Objects/Object.cpp +++ b/src/Griddly/Core/GDY/Objects/Object.cpp @@ -124,8 +124,12 @@ PreconditionFunction Object::instantiatePrecondition(std::string commandName, Be condition = [](int32_t a, int32_t b) { return a == b; }; } else if (commandName == "gt") { condition = [](int32_t a, int32_t b) { return a > b; }; + } else if (commandName == "gte") { + condition = [](int32_t a, int32_t b) { return a >= b; }; } else if (commandName == "lt") { condition = [](int32_t a, int32_t b) { return a < b; }; + } else if (commandName == "lte") { + condition = [](int32_t a, int32_t b) { return a <= b; }; } else if (commandName == "neq") { condition = [](int32_t a, int32_t b) { return a != b; }; } else { @@ -152,8 +156,12 @@ BehaviourFunction Object::instantiateConditionalBehaviour(std::string commandNam condition = [](int32_t a, int32_t b) { return a == b; }; } else if (commandName == "gt") { condition = [](int32_t a, int32_t b) { return a > b; }; + } else if (commandName == "gte") { + condition = [](int32_t a, int32_t b) { return a >= b; }; } else if (commandName == "lt") { condition = [](int32_t a, int32_t b) { return a < b; }; + } else if (commandName == "lte") { + condition = [](int32_t a, int32_t b) { return a <= b; }; } else if (commandName == "neq") { condition = [](int32_t a, int32_t b) { return a != b; }; } else { diff --git a/src/Griddly/Core/GDY/TerminationHandler.cpp b/src/Griddly/Core/GDY/TerminationHandler.cpp index 0eb152808..88a6e7691 100644 --- a/src/Griddly/Core/GDY/TerminationHandler.cpp +++ b/src/Griddly/Core/GDY/TerminationHandler.cpp @@ -35,8 +35,14 @@ TerminationFunction TerminationHandler::instantiateTerminationCondition(Terminat condition = [](int32_t a, int32_t b) { return a == b; }; } else if (commandName == "gt") { condition = [](int32_t a, int32_t b) { return a > b; }; + } else if (commandName == "gte") { + condition = [](int32_t a, int32_t b) { return a >= b; }; } else if (commandName == "lt") { condition = [](int32_t a, int32_t b) { return a < b; }; + } else if (commandName == "lte") { + condition = [](int32_t a, int32_t b) { return a <= b; }; + } else if (commandName == "neq") { + condition = [](int32_t a, int32_t b) { return a != b; }; } else { throw std::invalid_argument(fmt::format("Unknown or badly defined condition command {0}.", commandName)); } From a996ce0782e95447d4a7eba03d6e594f93e04ed4 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Wed, 21 Apr 2021 09:57:46 +0100 Subject: [PATCH 07/29] more tests --- .../examples/experiments/rts/griddly_rts.yaml | 305 ++++++++++-------- .../experiments/rts/tests/rts_tests.py | 63 ++-- 2 files changed, 209 insertions(+), 159 deletions(-) diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml index 71b41abfb..a83e3e87c 100644 --- a/python/examples/experiments/rts/griddly_rts.yaml +++ b/python/examples/experiments/rts/griddly_rts.yaml @@ -44,126 +44,126 @@ Environment: . . . . . . . . . . . . . . M M . . . . . . . . . . . . . . M M - | - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W - W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W - W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W - W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . M M M M . . . . . . . . . . W - W . . . . . . . . . . . . . . M M M M M M . . . . . . . . W - W . . . . . . . . . . . . . M . . M . M M . . . . . . . . W - W . . . . . . . . . . . . . M M M M M M M . . . . . . . . W - W . . . . . . . . . . . . . . . M M M M . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W - W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - - | - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W - W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W - W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W - W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W - W W W W W W W W W . . . . . . . . . . . . . . W W W W W w W - W . . . . . . W W . . . w w w w w w . . . . . W W W W W w W - W . . . . . . . . . . . . . w w . . . . . . . W W W W W w W - W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W - W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W - W . . . . . . . . . . . . . . M M M M . . . . W W W W W w W - W . . . . P1 w . . . . . . . . M M M M M M . W W W W W W W W - W . . . . P1 w . . . . . . . M . . M . M M . . . . . . . . W - W . . . . P2 w . . . . . . . M M M M M M M . . . . . . . . W - W . . . . P2 w . . . . . . . . . M M M M . . . . . . . . . W - W . . . . P1 w . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W - W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - - | - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - W . . . . M M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . M M M M W - W . . . . . M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . M M W - W . . . . . . M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . H2 . . M W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . B2 H2 . M W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W W W w w W W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W . . W W W W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W W W W W W W W W W W W W w w w w w w w w w w w w w W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W M . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W M M . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W M M M . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . . . W - W W W W W W W W W W W . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . W W W W W W W W W W W - W . . . . . . . . . . . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . . . . . . . . M M M W - W . . . . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . M M W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . M W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W w w w w w w w w w w w w w W W W W W W W W W W W W W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W W W W . . W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W w w W W W W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W M . H1 B1 . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W M . . H1 . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M . . . . . . W - W M M . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M M . . . . . W - W M M M M . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M M M . . . . W - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W +# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W +# W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W +# W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W +# W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W +# W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W +# W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . M M M M . . . . . . . . . . W +# W . . . . . . . . . . . . . . M M M M M M . . . . . . . . W +# W . . . . . . . . . . . . . M . . M . M M . . . . . . . . W +# W . . . . . . . . . . . . . M M M M M M M . . . . . . . . W +# W . . . . . . . . . . . . . . . M M M M . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W +# W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W +# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W +# - | +# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W +# W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W +# W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W +# W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W +# W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W +# W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W +# W W W W W W W W W . . . . . . . . . . . . . . W W W W W w W +# W . . . . . . W W . . . w w w w w w . . . . . W W W W W w W +# W . . . . . . . . . . . . . w w . . . . . . . W W W W W w W +# W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W +# W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W +# W . . . . . . . . . . . . . . M M M M . . . . W W W W W w W +# W . . . . P1 w . . . . . . . . M M M M M M . W W W W W W W W +# W . . . . P1 w . . . . . . . M . . M . M M . . . . . . . . W +# W . . . . P2 w . . . . . . . M M M M M M M . . . . . . . . W +# W . . . . P2 w . . . . . . . . . M M M M . . . . . . . . . W +# W . . . . P1 w . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W +# W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W +# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W +# - | +# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W +# W . . . . M M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . M M M M W +# W . . . . . M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . M M W +# W . . . . . . M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . H2 . . M W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . B2 H2 . M W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W W W w w W W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W . . W W W W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W W W W W W W W W W W W W w w w w w w w w w w w w w W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W M . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W M M . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W M M M . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W W W W W W W W W W W . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . W W W W W W W W W W W +# W . . . . . . . . . . . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . . . . . . . . M M M W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . M M W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . M W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . W w w w w w w w w w w w w w W W W W W W W W W W W W W . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W +# W W W W . . W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W w w W W W W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W M . H1 B1 . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W +# W M . . H1 . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M . . . . . . W +# W M M . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M M . . . . . W +# W M M M M . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M M M . . . . W +# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W Actions: - Name: spawn_harvester @@ -177,11 +177,10 @@ Actions: Dst: Object: _empty - - Src: Object: base Dst: - Object: [ base, puncher, harvester, pusher, movable_wall ] + Object: [ base, combat, harvester, ranged, movable_wall ] Commands: # Try to spawn in another location on the next tick - exec: @@ -189,7 +188,7 @@ Actions: Delay: 1 Randomize: true - # Harvester costs 5 resources to build + # Harvester costs 5 resources to build, get a reward when a harvester is built - Name: build_harvester InputMapping: Inputs: @@ -201,6 +200,9 @@ Actions: Object: base Preconditions: - gte: [ player_resources, 5 ] + Commands: + - sub: [ player_resources, 5 ] + - reward: 1 Dst: Object: base Commands: @@ -244,35 +246,52 @@ Actions: - Name: move Behaviours: - Src: - Object: [ harvester, puncher, pusher, movable_wall ] + Object: [ harvester, combat, ranged, movable_wall ] Commands: - mov: _dest # mov will move the object, _dest is the destination location of the action Dst: Object: _empty - Src: - Object: pusher + Object: ranged Commands: - mov: _dest # mov will move the object, _dest is the destination location of the action Dst: - Object: [ movable_wall, harvester, puncher ] + Object: [ movable_wall, harvester, combat ] Commands: - cascade: _dest # reapply the same action to the dest location of the action - - Name: punch +#- Name: ranged_attack + - Name: attack Behaviours: - Src: - Object: puncher + Object: harvester + Preconditions: + - neq: [src._playerId, dst._playerId] Commands: - reward: 1 Dst: - Object: [ puncher, harvester, pusher, base ] + Object: [ combat, harvester, ranged, base ] Commands: - - decr: health + - sub: [ health, 1 ] - eq: - Arguments: [ 0, health ] + Arguments: [ health, 0 ] Commands: - remove: true + - Src: + Object: combat + Precondtions: + - neq: [src._playerId, dst._playerId] + Commands: + - reward: 1 + Dst: + Object: [ combat, harvester, ranged, base, barracks ] + Commands: + - sub: [ health, 5 ] + - eq: + Arguments: [ 0, health ] + Commands: + - remove: true Objects: - Name: minerals @@ -307,8 +326,8 @@ Objects: Isometric: - Image: oryx/oryx_iso_dungeon/jelly-1.png - - Name: pusher - MapCharacter: P + - Name: ranged + MapCharacter: r Variables: - Name: health InitialValue: 10 @@ -322,8 +341,8 @@ Objects: Isometric: - Image: oryx/oryx_iso_dungeon/queen-1.png - - Name: puncher - MapCharacter: p + - Name: combat + MapCharacter: c Variables: - Name: health InitialValue: 5 @@ -366,7 +385,21 @@ Objects: MapCharacter: B Variables: - Name: health - InitialValue: 10 + InitialValue: 50 + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img324.png + Block2D: + - Color: [ 0.8, 0.8, 0.3 ] + Shape: triangle + Isometric: + - Image: oryx/oryx_iso_dungeon/base-1.png + + - Name: barracks + MapCharacter: b + Variables: + - Name: health + InitialValue: 40 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img324.png diff --git a/python/examples/experiments/rts/tests/rts_tests.py b/python/examples/experiments/rts/tests/rts_tests.py index f67ab2ca1..d6e6bddb5 100644 --- a/python/examples/experiments/rts/tests/rts_tests.py +++ b/python/examples/experiments/rts/tests/rts_tests.py @@ -51,10 +51,10 @@ def test_harvester(test_name): assert trees[0][1].keys() == {1} assert trees[1][1].keys() == {2} - # possible action_types (can only move) + # possible action_types (can move and attack) # print(env.action_names) - assert trees[0][1][1].keys() == {2} - assert trees[1][1][2].keys() == {2} + assert trees[0][1][1].keys() == {2, 3} + assert trees[1][1][2].keys() == {2, 3} # Both harvesters can only move right (and NOP) assert trees[0][1][1][2].keys() == {0, 3} @@ -68,9 +68,9 @@ def test_harvester(test_name): can_gather_tree = env.game.build_valid_action_trees() - # Can gather and move - assert can_gather_tree[0][2][1].keys() == {1, 2} - assert can_gather_tree[1][2][2].keys() == {1, 2} + # Can gather, move and attack + assert can_gather_tree[0][2][1].keys() == {1, 2, 3} + assert can_gather_tree[1][2][2].keys() == {1, 2, 3} assert reward == [0, 0] assert done == False @@ -85,19 +85,19 @@ def test_harvester(test_name): assert reward == [1, 1] # Check that the resource value increases for harvesters - assert observation[0][11, 2, 1] == i - assert observation[1][11, 2, 2] == i + assert observation[0][12, 2, 1] == i + assert observation[1][12, 2, 2] == i # Check that the resource value decreases for minerals - assert observation[0][11, 3, 1] == 20 - i - assert observation[1][11, 3, 2] == 20 - i + assert observation[0][12, 3, 1] == 20 - i + assert observation[1][12, 3, 2] == 20 - i # Check that there are no invalid actions in the tree no_more_gather_tree = env.game.build_valid_action_trees() - # Can only move - assert no_more_gather_tree[0][2][1].keys() == {2} - assert no_more_gather_tree[1][2][2].keys() == {2} + # Can move and attack + assert no_more_gather_tree[0][2][1].keys() == {2, 3} + assert no_more_gather_tree[1][2][2].keys() == {2, 3} # Check that gather does nothing observation, reward, done, info = env.step([ @@ -105,13 +105,13 @@ def test_harvester(test_name): [2, 2, 1, 3] ]) - # Check that the resource value increases for harvesters - assert observation[0][11, 2, 1] == 5 - assert observation[1][11, 2, 2] == 5 + # Check that the resource is not increased + assert observation[0][12, 2, 1] == 5 + assert observation[1][12, 2, 2] == 5 - # Check that the resource value decreases for minerals - assert observation[0][11, 3, 1] == 15 - assert observation[1][11, 3, 2] == 15 + # Check that the resource value is not decreased + assert observation[0][12, 3, 1] == 15 + assert observation[1][12, 3, 2] == 15 assert reward == [0, 0] assert done == False @@ -132,8 +132,8 @@ def test_harvester(test_name): assert reward == [1, 1] # Check that the resource value increases for harvesters - assert observation[0][11, 1, 1] == i - assert observation[1][11, 1, 2] == i + assert observation[0][12, 1, 1] == i + assert observation[1][12, 1, 2] == i # cannot give more resources to the base observation, reward, done, info = env.step([ @@ -141,8 +141,25 @@ def test_harvester(test_name): [1, 2, 1, 1] ]) - assert observation[0][11, 1, 1] == 0 - assert observation[1][11, 1, 2] == 0 + assert observation[0][12, 1, 1] == 0 + assert observation[1][12, 1, 2] == 0 # Now the players have 5 resources each, we should be able to build a new harvester can_build_harvester = env.game.build_valid_action_trees() + assert can_build_harvester[0][0][1][0].keys() == {0, 1} + assert can_build_harvester[1][0][2][0].keys() == {0, 1} + + assert env.get_state()['GlobalVariables']['player_resources'][1] == 5 + assert env.get_state()['GlobalVariables']['player_resources'][2] == 5 + + # Build both harvesters + observation, reward, done, info = env.step([ + [0, 1, 0, 1], + [0, 2, 0, 1] + ]) + + assert env.get_state()['GlobalVariables']['player_resources'][1] == 0 + assert env.get_state()['GlobalVariables']['player_resources'][2] == 0 + + assert reward == [1, 1] + From 9717d1a81316917ba98a641d66ed79ab62b4ca6c Mon Sep 17 00:00:00 2001 From: Bam4d Date: Wed, 21 Apr 2021 20:28:39 +0100 Subject: [PATCH 08/29] vague attempt at video recording --- .../examples/experiments/rts/griddly_rts.yaml | 26 +++++++++---------- python/griddly/util/rllib/callbacks.py | 12 ++++----- python/griddly/util/rllib/environment/core.py | 7 +++-- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml index a83e3e87c..819706e4d 100644 --- a/python/examples/experiments/rts/griddly_rts.yaml +++ b/python/examples/experiments/rts/griddly_rts.yaml @@ -280,18 +280,18 @@ Actions: - remove: true - Src: Object: combat - Precondtions: + Preconditions: - neq: [src._playerId, dst._playerId] Commands: - reward: 1 - Dst: - Object: [ combat, harvester, ranged, base, barracks ] - Commands: - - sub: [ health, 5 ] - - eq: - Arguments: [ 0, health ] - Commands: - - remove: true + Dst: + Object: [ combat, harvester, ranged, base, barracks ] + Commands: + - sub: [ health, 5 ] + - eq: + Arguments: [ 0, health ] + Commands: + - remove: true Objects: - Name: minerals @@ -330,7 +330,7 @@ Objects: MapCharacter: r Variables: - Name: health - InitialValue: 10 + InitialValue: 50 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_crawler_queen_d1.png @@ -345,7 +345,7 @@ Objects: MapCharacter: c Variables: - Name: health - InitialValue: 5 + InitialValue: 100 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_beast_d1.png @@ -385,7 +385,7 @@ Objects: MapCharacter: B Variables: - Name: health - InitialValue: 50 + InitialValue: 500 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img324.png @@ -399,7 +399,7 @@ Objects: MapCharacter: b Variables: - Name: health - InitialValue: 40 + InitialValue: 400 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img324.png diff --git a/python/griddly/util/rllib/callbacks.py b/python/griddly/util/rllib/callbacks.py index 4cbb09a64..aa80be0c5 100644 --- a/python/griddly/util/rllib/callbacks.py +++ b/python/griddly/util/rllib/callbacks.py @@ -11,9 +11,9 @@ class GriddlyCallbacks(DefaultCallbacks): def on_episode_end(self, *, worker: "RolloutWorker", base_env: BaseEnv, policies: Dict[PolicyID, Policy], episode: MultiAgentEpisode, env_index: Optional[int] = None, **kwargs) -> None: - pass - # info = episode.last_info_for() - # if 'videos' in info: - # level = info['video']['level'] - # path = info['video']['path'] - # episode.media[f'level_{level}'] = Video(path) + info = episode.last_info_for(1) + if 'videos' in info: + for video in info['videos']: + level = video['level'] + path = video['path'] + episode.media[f'level_{level}_1'] = Video(path) diff --git a/python/griddly/util/rllib/environment/core.py b/python/griddly/util/rllib/environment/core.py index ac8510184..6b3252993 100644 --- a/python/griddly/util/rllib/environment/core.py +++ b/python/griddly/util/rllib/environment/core.py @@ -152,8 +152,8 @@ def step(self, action): extra_info = self._after_step(observation, reward, done, info) - if 'video' in extra_info: - info['video'] = extra_info['video'] + if 'videos' in extra_info: + info['videos'] = extra_info['videos'] if self.generate_valid_action_trees: self.last_valid_action_trees = self._get_valid_action_trees() @@ -264,6 +264,9 @@ def step(self, action_dict: MultiAgentDict): extra_info = self._after_step(obs_map, reward_map, done_map, info_map) + if 'videos' in extra_info: + info_map[1]['videos'] = extra_info['videos'] + assert len(obs_map) == len(reward_map) assert len(obs_map) == len(done_map) - 1 assert len(obs_map) == len(info_map) From 1d811011475702dcbad639d1d155529f5c7eb060 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 26 Apr 2021 10:27:47 +0100 Subject: [PATCH 09/29] lazy initialization of Vulkan renderers in global observers, so many more envs can be created without creating vulkan devices (which is limited by driver) --- bindings/python.cpp | 4 + bindings/wrapper/GameWrapper.cpp | 76 ++++++++++--------- bindings/wrapper/StepPlayerWrapper.cpp | 8 +- .../examples/experiments/rts/rts_self_play.py | 2 +- .../griddlyrts/play_griddlyrts_gym.py | 2 +- python/examples/gym/gym_human_player.py | 12 +-- python/griddly/GymWrapper.py | 18 +++-- src/Griddly/Core/GameProcess.cpp | 15 ++-- src/Griddly/Core/GameProcess.hpp | 4 +- src/Griddly/Core/Observers/BlockObserver.cpp | 6 +- src/Griddly/Core/Observers/BlockObserver.hpp | 5 +- .../Observers/IsometricSpriteObserver.cpp | 1 - .../Observers/IsometricSpriteObserver.hpp | 1 + src/Griddly/Core/Observers/Observer.cpp | 19 +++++ src/Griddly/Core/Observers/Observer.hpp | 10 ++- src/Griddly/Core/Observers/SpriteObserver.cpp | 5 +- src/Griddly/Core/Observers/SpriteObserver.hpp | 4 +- src/Griddly/Core/Observers/VectorObserver.cpp | 20 +++-- src/Griddly/Core/Observers/VectorObserver.hpp | 4 +- .../Core/Observers/Vulkan/VulkanDevice.cpp | 7 ++ .../Core/Observers/Vulkan/VulkanDevice.hpp | 4 + .../Core/Observers/Vulkan/VulkanObserver.cpp | 56 +++++++++----- .../Core/Observers/Vulkan/VulkanObserver.hpp | 10 ++- .../Core/Observers/VulkanGridObserver.cpp | 3 + .../Griddly/Core/GDY/Objects/ObjectTest.cpp | 58 ++++++++------ tests/src/Griddly/Core/GameProcessTest.cpp | 15 +--- .../Core/Observers/BlockObserverTest.cpp | 21 ++--- .../Observers/IsometricSpriteObserverTest.cpp | 25 +++--- .../Core/Observers/SpriteObserverTest.cpp | 19 ++--- .../Core/Observers/VectorObserverTest.cpp | 16 ++-- .../Griddly/Core/Observers/MockObserver.hpp | 4 +- 31 files changed, 257 insertions(+), 197 deletions(-) diff --git a/bindings/python.cpp b/bindings/python.cpp index d2b1d1c22..096ab806a 100644 --- a/bindings/python.cpp +++ b/bindings/python.cpp @@ -62,6 +62,10 @@ PYBIND11_MODULE(python_griddly, m) { game_process.def("get_width", &Py_GameWrapper::getWidth); game_process.def("get_height", &Py_GameWrapper::getHeight); + // Observation shapes + game_process.def("get_global_observation_shape", &Py_GameWrapper::getGlobalObservationShape); + game_process.def("get_player_observation_shape", &Py_GameWrapper::getPlayerObservationShape); + // Tile size of the global observer game_process.def("get_tile_size", &Py_GameWrapper::getTileSize); game_process.def("observe", &Py_GameWrapper::observe); diff --git a/bindings/wrapper/GameWrapper.cpp b/bindings/wrapper/GameWrapper.cpp index 65d0b43a0..8e1a1f626 100644 --- a/bindings/wrapper/GameWrapper.cpp +++ b/bindings/wrapper/GameWrapper.cpp @@ -9,27 +9,26 @@ namespace griddly { class ValidActionNode { - public: - std::unordered_map> children; - - bool contains(uint32_t value) { - return children.find(value) != children.end(); - } + public: + std::unordered_map> children; - void add(uint32_t value) { - children[value] = std::shared_ptr(new ValidActionNode()); - } + bool contains(uint32_t value) { + return children.find(value) != children.end(); + } - static py::dict toPyDict(std::shared_ptr node) { - py::dict py_dict; - for(auto child: node->children) { - py_dict[py::cast(child.first)] = toPyDict(child.second); - } + void add(uint32_t value) { + children[value] = std::shared_ptr(new ValidActionNode()); + } - return py_dict; + static py::dict toPyDict(std::shared_ptr node) { + py::dict py_dict; + for (auto child : node->children) { + py_dict[py::cast(child.first)] = toPyDict(child.second); } -}; + return py_dict; + } +}; class Py_GameWrapper { public: @@ -65,8 +64,8 @@ class Py_GameWrapper { const uint32_t getActionTypeId(std::string actionName) const { auto actionNames = gdyFactory_->getExternalActionNames(); - for(int i = 0; i buildValidActionTrees() const { - - std::vector valid_action_trees; + std::vector valid_action_trees; auto externalActionNames = gdyFactory_->getExternalActionNames(); spdlog::debug("Building tree, {0} actions", externalActionNames.size()); for (int playerId = 1; playerId <= playerCount_; playerId++) { @@ -84,10 +82,7 @@ class Py_GameWrapper { auto location = actionNamesAtLocation.first; auto actionNames = actionNamesAtLocation.second; - - for (auto actionName : actionNames) { - spdlog::debug("[{0}] available at location [{1}, {2}]", actionName, location.x, location.y); std::shared_ptr treePtr = node; @@ -102,14 +97,14 @@ class Py_GameWrapper { if (gdyFactory_->getAvatarObject().length() == 0) { auto py_x = locationVec[0]; auto py_y = locationVec[1]; - if(!treePtr->contains(py_x)) { - treePtr->add(py_x); + if (!treePtr->contains(py_x)) { + treePtr->add(py_x); } treePtr = treePtr->children[py_x]; - if(!treePtr->contains(py_y)) { - treePtr->add(py_y); + if (!treePtr->contains(py_y)) { + treePtr->add(py_y); } treePtr = treePtr->children[py_y]; @@ -117,14 +112,14 @@ class Py_GameWrapper { if (externalActionNames.size() > 1) { auto actionTypeId = getActionTypeId(actionName); - if(!treePtr->contains(actionTypeId)) { + if (!treePtr->contains(actionTypeId)) { treePtr->add(actionTypeId); } treePtr = treePtr->children[actionTypeId]; } - for(auto id : actionIdsForName) { + for (auto id : actionIdsForName) { treePtr->add(id); } treePtr->add(0); @@ -180,14 +175,21 @@ class Py_GameWrapper { gameProcess_->setLevel(levelString); } - std::shared_ptr> reset() { - auto observation = gameProcess_->reset(); - if (observation != nullptr) { - auto observer = gameProcess_->getObserver(); - return std::shared_ptr>(new NumpyWrapper(observer->getShape(), observer->getStrides(), std::move(observation))); + void reset() { + gameProcess_->reset(); + } + + std::vector getGlobalObservationShape() const { + auto observer = gameProcess_->getObserver(); + if (observer == nullptr) { + return {}; + } else { + return observer->getShape(); } + } - return nullptr; + std::vector getPlayerObservationShape() const { + return players_[0]->getObservationShape(); } std::shared_ptr> observe() { @@ -197,7 +199,9 @@ class Py_GameWrapper { throw std::invalid_argument("No global observer configured"); } - return std::shared_ptr>(new NumpyWrapper(observer->getShape(), observer->getStrides(), gameProcess_->observe())); + auto observationData = observer->update(); + + return std::shared_ptr>(new NumpyWrapper(observer->getShape(), observer->getStrides(), observationData)); } py::tuple stepParallel(py::buffer stepArray) { diff --git a/bindings/wrapper/StepPlayerWrapper.cpp b/bindings/wrapper/StepPlayerWrapper.cpp index 65a191b43..89675d56a 100644 --- a/bindings/wrapper/StepPlayerWrapper.cpp +++ b/bindings/wrapper/StepPlayerWrapper.cpp @@ -25,13 +25,19 @@ class Py_StepPlayerWrapper { return {(uint32_t)tileSize[0], (uint32_t)tileSize[1]}; } + std::vector getObservationShape() const { + return player_->getObserver()->getShape(); + } + std::shared_ptr> observe() { auto observer = player_->getObserver(); if (observer == nullptr) { throw std::invalid_argument("No player observer configured"); } - return std::shared_ptr>(new NumpyWrapper(observer->getShape(), observer->getStrides(), player_->observe())); + auto observationData = observer->update(); + + return std::shared_ptr>(new NumpyWrapper(observer->getShape(), observer->getStrides(), observationData)); } py::tuple stepMulti(py::buffer stepArray, bool updateTicks) { diff --git a/python/examples/experiments/rts/rts_self_play.py b/python/examples/experiments/rts/rts_self_play.py index 801d287bb..2515acce2 100644 --- a/python/examples/experiments/rts/rts_self_play.py +++ b/python/examples/experiments/rts/rts_self_play.py @@ -86,7 +86,7 @@ def _create_env(env_config): 'env_config': { 'generate_valid_action_trees': True, 'yaml_file': '/home/bam4d/qmul/Griddly/python/examples/experiments/rts/griddly_rts.yaml', - 'global_observer_type': gd.ObserverType.ISOMETRIC, + 'global_observer_type': gd.ObserverType.SPRITE_2D, 'level': 0, 'max_steps': 1000, }, diff --git a/python/examples/griddlyrts/play_griddlyrts_gym.py b/python/examples/griddlyrts/play_griddlyrts_gym.py index 8159740f2..aada45c00 100644 --- a/python/examples/griddlyrts/play_griddlyrts_gym.py +++ b/python/examples/griddlyrts/play_griddlyrts_gym.py @@ -10,7 +10,7 @@ wrapper = GymWrapperFactory() wrapper.build_gym_from_yaml("GriddlyRTS-Adv", - 'predator_prey.yaml', + 'RTS/GriddlyRTS.yaml', global_observer_type=gd.ObserverType.SPRITE_2D, player_observer_type=gd.ObserverType.VECTOR, level=0) diff --git a/python/examples/gym/gym_human_player.py b/python/examples/gym/gym_human_player.py index 2e4171754..b10ca6e9f 100644 --- a/python/examples/gym/gym_human_player.py +++ b/python/examples/gym/gym_human_player.py @@ -7,7 +7,7 @@ def callback(env): - initial_global_obs = env.render(observer='global', mode="rgb_array") + initial_global_obs = env.render(observer=0, mode="rgb_array") observation_shape = initial_global_obs.shape recorder = VideoRecorder() @@ -15,7 +15,7 @@ def callback(env): def _callback(prev_obs, obs, action, rew, env_done, info): - global_obs = env.render(observer='global', mode="rgb_array") + global_obs = env.render(observer=0, mode="rgb_array") recorder.add_frame(global_obs) if rew != 0: print(f'\nReward: {rew}') @@ -39,7 +39,7 @@ def _callback(prev_obs, obs, action, rew, env_done, info): # yaml_path = 'Single-Player/GVGAI/bait_keys.yaml' # yaml_path = 'Single-Player/Mini-Grid/minigrid-drunkdwarf.yaml' # yaml_path = 'Single-Player/Mini-Grid/minigrid-spiders.yaml' - # yaml_path = 'Single-Player/GVGAI/spider-nest.yaml' + yaml_path = 'Single-Player/GVGAI/spider-nest.yaml' # yaml_path = 'Single-Player/GVGAI/cookmepasta.yaml' # yaml_path = 'Single-Player/GVGAI/clusters.yaml' # yaml_path = 'Single-Player/GVGAI/zenpuzzle.yaml' @@ -55,11 +55,11 @@ def _callback(prev_obs, obs, action, rew, env_done, info): # yaml_path = '../resources/rataban.yaml' - level = 1 + level = 0 wrapper.build_gym_from_yaml(environment_name, yaml_path, - player_observer_type=gd.ObserverType.SPRITE_2D, - global_observer_type=gd.ObserverType.SPRITE_2D, level=level) + player_observer_type=gd.ObserverType.BLOCK_2D, + global_observer_type=gd.ObserverType.BLOCK_2D, level=level) env = gym.make(f'GDY-{environment_name}-v0') # env.enable_history(True) env.reset() diff --git a/python/griddly/GymWrapper.py b/python/griddly/GymWrapper.py index 913661d5a..72fd76f0e 100644 --- a/python/griddly/GymWrapper.py +++ b/python/griddly/GymWrapper.py @@ -12,7 +12,8 @@ class GymWrapper(gym.Env): metadata = {'render.modes': ['human', 'rgb_array']} def __init__(self, yaml_file=None, level=0, global_observer_type=gd.ObserverType.VECTOR, - player_observer_type=gd.ObserverType.VECTOR, max_steps=None, gdy_path=None, image_path=None, shader_path=None, + player_observer_type=gd.ObserverType.VECTOR, max_steps=None, gdy_path=None, image_path=None, + shader_path=None, gdy=None, game=None, **kwargs): """ Currently only supporting a single player (player 1 as defined in the environment yaml @@ -160,7 +161,12 @@ def reset(self, level_id=None, level_string=None, global_observations=False): self.initialize_spaces() + for p in range(self.player_count): + self._player_last_observation.append(np.array(self._players[p].observe(), copy=False)) + if global_observations: + self._global_last_observation = np.array(self.game.observe(), copy=False) + return { 'global': self._global_last_observation, 'player': self._player_last_observation[0] if self.player_count == 1 else self._player_last_observation @@ -170,18 +176,14 @@ def reset(self, level_id=None, level_string=None, global_observations=False): def initialize_spaces(self): self._player_last_observation = [] - for p in range(self.player_count): - self._player_last_observation.append(np.array(self._players[p].observe(), copy=False)) - - self._global_last_observation = np.array(self.game.observe(), copy=False) - self.player_observation_shape = self._player_last_observation[0].shape - self.global_observation_shape = self._global_last_observation.shape + self.player_observation_shape = self.game.get_player_observation_shape() + self.global_observation_shape = self.game.get_global_observation_shape() self.global_observation_space = gym.spaces.Box(low=0, high=255, shape=self.global_observation_shape, dtype=np.uint8) - self._observation_shape = self._player_last_observation[0].shape + self._observation_shape = self.player_observation_shape observation_space = gym.spaces.Box(low=0, high=255, shape=self._observation_shape, dtype=np.uint8) if self.player_count > 1: diff --git a/src/Griddly/Core/GameProcess.cpp b/src/Griddly/Core/GameProcess.cpp index 4c4ec8e23..c30e4bb80 100644 --- a/src/Griddly/Core/GameProcess.cpp +++ b/src/Griddly/Core/GameProcess.cpp @@ -124,7 +124,7 @@ void GameProcess::init(bool isCloned) { isInitialized_ = true; } -uint8_t* GameProcess::resetObservers() { +void GameProcess::resetObservers() { auto playerAvatarObjects = grid_->getPlayerAvatarObjects(); for (auto& p : players_) { @@ -135,19 +135,16 @@ uint8_t* GameProcess::resetObservers() { } } - if (observer_ == nullptr) { - return nullptr; + if(observer_ != nullptr) { + observer_->reset(); } - - return observer_->reset(); } -uint8_t* GameProcess::reset() { +void GameProcess::reset() { if (!isInitialized_) { throw std::runtime_error("Cannot reset game process before initialization."); } - spdlog::debug("Resetting player count."); grid_->setPlayerCount(gdyFactory_->getPlayerCount()); @@ -158,14 +155,12 @@ uint8_t* GameProcess::reset() { levelGenerator_->reset(grid_); spdlog::debug("Resetting Observers."); - auto observation = resetObservers(); + resetObservers(); spdlog::debug("Resetting Termination Handler."); terminationHandler_ = std::shared_ptr(gdyFactory_->createTerminationHandler(grid_, players_)); requiresReset_ = false; - - return observation; } ObserverConfig GameProcess::getObserverConfig(ObserverType observerType) const { diff --git a/src/Griddly/Core/GameProcess.hpp b/src/Griddly/Core/GameProcess.hpp index 0c68ecc11..b9eeaf0e9 100644 --- a/src/Griddly/Core/GameProcess.hpp +++ b/src/Griddly/Core/GameProcess.hpp @@ -50,7 +50,7 @@ class GameProcess : public std::enable_shared_from_this { virtual void init(bool isCloned=false); - virtual uint8_t* reset(); + virtual void reset(); bool isInitialized(); @@ -98,7 +98,7 @@ class GameProcess : public std::enable_shared_from_this { bool requiresReset_ = true; private: - uint8_t* resetObservers(); + void resetObservers(); ObserverConfig getObserverConfig(ObserverType observerType) const; diff --git a/src/Griddly/Core/Observers/BlockObserver.cpp b/src/Griddly/Core/Observers/BlockObserver.cpp index eb1704857..fb96b91e3 100644 --- a/src/Griddly/Core/Observers/BlockObserver.cpp +++ b/src/Griddly/Core/Observers/BlockObserver.cpp @@ -16,9 +16,9 @@ ObserverType BlockObserver::getObserverType() const { return ObserverType::BLOCK_2D; } -void BlockObserver::init(ObserverConfig observerConfig) { - VulkanGridObserver::init(observerConfig); - +void BlockObserver::lazyInit() { + VulkanObserver::lazyInit(); + device_->initRenderMode(vk::RenderMode::SHAPES); for (auto blockDef : blockDefinitions_) { diff --git a/src/Griddly/Core/Observers/BlockObserver.hpp b/src/Griddly/Core/Observers/BlockObserver.hpp index 6ab884683..f57204934 100644 --- a/src/Griddly/Core/Observers/BlockObserver.hpp +++ b/src/Griddly/Core/Observers/BlockObserver.hpp @@ -28,13 +28,12 @@ class BlockObserver : public VulkanGridObserver { virtual ObserverType getObserverType() const override; - void init(ObserverConfig observerConfig) override; - - private: void renderLocation(vk::VulkanRenderContext& ctx, glm::ivec2 objectLocation, glm::ivec2 outputLocation, glm::ivec2 tileOffset, DiscreteOrientation renderOrientation) const override; std::unordered_map blockConfigs_; const std::unordered_map blockDefinitions_; + + void lazyInit() override; }; } // namespace griddly \ No newline at end of file diff --git a/src/Griddly/Core/Observers/IsometricSpriteObserver.cpp b/src/Griddly/Core/Observers/IsometricSpriteObserver.cpp index c0b3b7303..fba649ad9 100644 --- a/src/Griddly/Core/Observers/IsometricSpriteObserver.cpp +++ b/src/Griddly/Core/Observers/IsometricSpriteObserver.cpp @@ -33,7 +33,6 @@ void IsometricSpriteObserver::resetShape() { isoOriginOffset_ = {gridHeight_ * tileSize.x / 2, tileSize.y / 2}; observationShape_ = {3, pixelWidth_, pixelHeight_}; - observationStrides_ = {1, 4, 4 * pixelWidth_}; } std::vector IsometricSpriteObserver::calculateDirtyRectangles(std::unordered_set updatedLocations) const { diff --git a/src/Griddly/Core/Observers/IsometricSpriteObserver.hpp b/src/Griddly/Core/Observers/IsometricSpriteObserver.hpp index ed722f0c2..ce9fef069 100644 --- a/src/Griddly/Core/Observers/IsometricSpriteObserver.hpp +++ b/src/Griddly/Core/Observers/IsometricSpriteObserver.hpp @@ -24,6 +24,7 @@ class IsometricSpriteObserver : public SpriteObserver { private: glm::vec2 isoOriginOffset_; + }; } // namespace griddly \ No newline at end of file diff --git a/src/Griddly/Core/Observers/Observer.cpp b/src/Griddly/Core/Observers/Observer.cpp index 2ec6498de..e6f4ddf05 100644 --- a/src/Griddly/Core/Observers/Observer.cpp +++ b/src/Griddly/Core/Observers/Observer.cpp @@ -8,8 +8,27 @@ Observer::Observer(std::shared_ptr grid) : grid_(grid) { } void Observer::init(ObserverConfig observerConfig) { + + spdlog::debug("Initializing observer."); + + if (observerState_ != ObserverState::NONE) { + throw std::runtime_error("Cannot initialize an already initialized Observer"); + } + observerConfig_ = observerConfig; + observerState_ = ObserverState::INITIALISED; +} + +void Observer::reset() { + spdlog::debug("Resetting observer."); + if (observerState_ == ObserverState::NONE) { + throw std::runtime_error("Observer not initialized"); + } resetShape(); + + spdlog::debug("Observation Shape ({0}, {1}, {2})", observationShape_[0], observationShape_[1], observationShape_[2]); + + observerState_ = ObserverState::RESET; } void Observer::setAvatar(std::shared_ptr avatarObject) { diff --git a/src/Griddly/Core/Observers/Observer.hpp b/src/Griddly/Core/Observers/Observer.hpp index 6ee334d4a..5a6899cdc 100644 --- a/src/Griddly/Core/Observers/Observer.hpp +++ b/src/Griddly/Core/Observers/Observer.hpp @@ -38,6 +38,10 @@ enum class ObserverType { NONE, ISOMETRIC, VECTOR }; +enum class ObserverState { + NONE, INITIALISED, RESET, READY +}; + class Observer { public: Observer(std::shared_ptr grid); @@ -46,8 +50,8 @@ class Observer { * The data is returned as a byte array for consistency across observers and * interfaces */ - virtual uint8_t* update() const = 0; - virtual uint8_t* reset() = 0; + virtual uint8_t* update() = 0; + virtual void reset(); virtual std::vector getShape() const; virtual std::vector getStrides() const; @@ -81,5 +85,7 @@ class Observer { ObserverConfig observerConfig_; std::vector observationShape_; std::vector observationStrides_; + + ObserverState observerState_ = ObserverState::NONE; }; } // namespace griddly \ No newline at end of file diff --git a/src/Griddly/Core/Observers/SpriteObserver.cpp b/src/Griddly/Core/Observers/SpriteObserver.cpp index 12c684192..9acbe05b5 100644 --- a/src/Griddly/Core/Observers/SpriteObserver.cpp +++ b/src/Griddly/Core/Observers/SpriteObserver.cpp @@ -66,9 +66,8 @@ vk::SpriteData SpriteObserver::loadImage(std::string imageFilename) { return {std::move(spriteData), (uint32_t)outputWidth, (uint32_t)outputHeight, (uint32_t)4}; } -/** loads the sprites needed for rendering **/ -void SpriteObserver::init(ObserverConfig observerConfig) { - VulkanGridObserver::init(observerConfig); +void SpriteObserver::lazyInit() { + VulkanObserver::lazyInit(); device_->initRenderMode(vk::RenderMode::SPRITES); diff --git a/src/Griddly/Core/Observers/SpriteObserver.hpp b/src/Griddly/Core/Observers/SpriteObserver.hpp index 4dd6cee86..a6ca8aa3d 100644 --- a/src/Griddly/Core/Observers/SpriteObserver.hpp +++ b/src/Griddly/Core/Observers/SpriteObserver.hpp @@ -30,8 +30,6 @@ class SpriteObserver : public VulkanGridObserver { virtual ObserverType getObserverType() const override; - void init(ObserverConfig observerConfig) override; - protected: void renderLocation(vk::VulkanRenderContext& ctx, glm::ivec2 objectLocation, glm::ivec2 outputLocation, glm::ivec2 tileOffset, DiscreteOrientation orientation) const override; void render(vk::VulkanRenderContext& ctx) const override; @@ -40,6 +38,8 @@ class SpriteObserver : public VulkanGridObserver { private: vk::SpriteData loadImage(std::string imageFilename); + + void lazyInit() override; }; } // namespace griddly \ No newline at end of file diff --git a/src/Griddly/Core/Observers/VectorObserver.cpp b/src/Griddly/Core/Observers/VectorObserver.cpp index 16f417391..83adfb91d 100644 --- a/src/Griddly/Core/Observers/VectorObserver.cpp +++ b/src/Griddly/Core/Observers/VectorObserver.cpp @@ -14,6 +14,13 @@ void VectorObserver::init(ObserverConfig observerConfig) { Observer::init(observerConfig); } +void VectorObserver::reset() { + Observer::reset(); + + // there are no additional steps until this observer can be used. + observerState_ = ObserverState::READY; +} + ObserverType VectorObserver::getObserverType() const { return ObserverType::VECTOR; } @@ -32,7 +39,6 @@ void VectorObserver::resetShape() { observationChannels_ = grid_->getObjectIds().size(); // Always in order objects, player, orientation, variables. - if (observerConfig_.includePlayerId) { channelsBeforePlayerCount_ = observationChannels_; observationChannels_ += observerConfig_.playerCount + 1; // additional one-hot for "no-player" @@ -60,11 +66,6 @@ void VectorObserver::resetShape() { trackAvatar_ = avatarObject_ != nullptr; } -uint8_t* VectorObserver::reset() { - resetShape(); - return update(); -}; - void VectorObserver::renderLocation(glm::ivec2 objectLocation, glm::ivec2 outputLocation, bool resetLocation) const { auto memPtr = observation_.get() + observationChannels_ * (gridWidth_ * outputLocation.y + outputLocation.x); @@ -143,7 +144,12 @@ void VectorObserver::renderLocation(glm::ivec2 objectLocation, glm::ivec2 output } } -uint8_t* VectorObserver::update() const { +uint8_t* VectorObserver::update() { + + if (observerState_ != ObserverState::READY) { + throw std::runtime_error("Observer not ready, must be initialized and reset before update() can be called."); + } + if (trackAvatar_) { auto avatarLocation = avatarObject_->getLocation(); auto avatarOrientation = avatarObject_->getObjectOrientation(); diff --git a/src/Griddly/Core/Observers/VectorObserver.hpp b/src/Griddly/Core/Observers/VectorObserver.hpp index 4d21dcd0c..9378e47ee 100644 --- a/src/Griddly/Core/Observers/VectorObserver.hpp +++ b/src/Griddly/Core/Observers/VectorObserver.hpp @@ -10,8 +10,8 @@ class VectorObserver : public Observer { void init(ObserverConfig observerConfig) override; - uint8_t* update() const override; - uint8_t* reset() override; + uint8_t* update() override; + void reset() override; void resetShape() override; ObserverType getObserverType() const override; diff --git a/src/Griddly/Core/Observers/Vulkan/VulkanDevice.cpp b/src/Griddly/Core/Observers/Vulkan/VulkanDevice.cpp index a5cda36ac..8356c10cf 100644 --- a/src/Griddly/Core/Observers/Vulkan/VulkanDevice.cpp +++ b/src/Griddly/Core/Observers/Vulkan/VulkanDevice.cpp @@ -143,6 +143,12 @@ void VulkanDevice::initDevice(bool useGPU) { } else { spdlog::error("No devices supporting vulkan present for rendering."); } + + isInitialized_ = true; +} + +bool VulkanDevice::isInitialized() const { + return isInitialized_; } void VulkanDevice::initRenderMode(RenderMode mode) { @@ -188,6 +194,7 @@ std::vector VulkanDevice::resetRenderSurface(uint32_t pixelWidth, uint break; } + spdlog::debug("Render Surface Strides ({0}, {1}, {2}).", imageStrides[0],imageStrides[1],imageStrides[2]); return imageStrides; } diff --git a/src/Griddly/Core/Observers/Vulkan/VulkanDevice.hpp b/src/Griddly/Core/Observers/Vulkan/VulkanDevice.hpp index e0382ab2f..cfe9d5575 100644 --- a/src/Griddly/Core/Observers/Vulkan/VulkanDevice.hpp +++ b/src/Griddly/Core/Observers/Vulkan/VulkanDevice.hpp @@ -111,6 +111,8 @@ class VulkanDevice { uint8_t* endRender(VulkanRenderContext& renderContext, std::vector dirtyRectangles); + bool isInitialized() const; + private: std::vector getAvailablePhysicalDevices(); VulkanPhysicalDeviceInfo getPhysicalDeviceInfo(VkPhysicalDevice& device); @@ -206,5 +208,7 @@ class VulkanDevice { const glm::ivec2 tileSize_; const std::string shaderPath_; + + bool isInitialized_ = false; }; } // namespace vk \ No newline at end of file diff --git a/src/Griddly/Core/Observers/Vulkan/VulkanObserver.cpp b/src/Griddly/Core/Observers/Vulkan/VulkanObserver.cpp index daadf8be7..d52ff6801 100644 --- a/src/Griddly/Core/Observers/Vulkan/VulkanObserver.cpp +++ b/src/Griddly/Core/Observers/Vulkan/VulkanObserver.cpp @@ -18,9 +18,22 @@ VulkanObserver::VulkanObserver(std::shared_ptr grid, ResourceConfig resour VulkanObserver::~VulkanObserver() { } -void VulkanObserver::init(ObserverConfig observerConfig) { +/** + * Only load vulkan if update() called, allows many environments with vulkan-based global observers to be used. + * But only loads them if global observations are requested, for example for creating videos + * + * This a) allows significantly more enviroments to be loaded (if only one of them is being used to create videos) and b) + */ +void VulkanObserver::lazyInit() { + + if (observerState_ != ObserverState::RESET) { + throw std::runtime_error("Cannot initialize Vulkan Observer when it is not in RESET state."); + } + + spdlog::debug("Vulkan lazy initialization...."); + gridBoundary_ = glm::ivec2(grid_->getWidth(), grid_->getHeight()); - observerConfig_ = observerConfig; + auto imagePath = resourceConfig_.imagePath; auto shaderPath = resourceConfig_.shaderPath; @@ -29,31 +42,21 @@ void VulkanObserver::init(ObserverConfig observerConfig) { instance_ = std::shared_ptr(new vk::VulkanInstance(configuration)); } - std::unique_ptr vulkanDevice(new vk::VulkanDevice(instance_, observerConfig.tileSize, shaderPath)); + std::unique_ptr vulkanDevice(new vk::VulkanDevice(instance_, observerConfig_.tileSize, shaderPath)); device_ = std::move(vulkanDevice); - device_->initDevice(false); - resetShape(); } -uint8_t* VulkanObserver::reset() { - resetShape(); - resetRenderSurface(); - - auto ctx = device_->beginRender(); - - render(ctx); - - // Only update the rectangles that have changed to save bandwidth/processing speed - std::vector dirtyRectangles = { - {{0, 0}, - {pixelWidth_, pixelHeight_}}}; - - return device_->endRender(ctx, dirtyRectangles); -} +uint8_t* VulkanObserver::update() { + if (observerState_ == ObserverState::RESET) { + lazyInit(); + observerState_ = ObserverState::READY; + } else if(observerState_ != ObserverState::READY) { + throw std::runtime_error("Observer is not in READY state, cannot render"); + } + -uint8_t* VulkanObserver::update() const { auto ctx = device_->beginRender(); render(ctx); @@ -79,6 +82,17 @@ uint8_t* VulkanObserver::update() const { void VulkanObserver::resetRenderSurface() { spdlog::debug("Initializing Render Surface. Grid width={0}, height={1}. Pixel width={2}. height={3}", gridWidth_, gridHeight_, pixelWidth_, pixelHeight_); observationStrides_ = device_->resetRenderSurface(pixelWidth_, pixelHeight_); + + // On surface reset, render entire image contents. + // Subsequent calls to update, do fast diff updates. + auto ctx = device_->beginRender(); + render(ctx); + + std::vector dirtyRectangles = { + {{0, 0}, + {pixelWidth_, pixelHeight_}}}; + + device_->endRender(ctx, dirtyRectangles); } void VulkanObserver::release() { diff --git a/src/Griddly/Core/Observers/Vulkan/VulkanObserver.hpp b/src/Griddly/Core/Observers/Vulkan/VulkanObserver.hpp index ee62763e2..dde339d10 100644 --- a/src/Griddly/Core/Observers/Vulkan/VulkanObserver.hpp +++ b/src/Griddly/Core/Observers/Vulkan/VulkanObserver.hpp @@ -26,11 +26,8 @@ class VulkanObserver : public Observer { ~VulkanObserver(); void print(std::shared_ptr observation) override; - void init(ObserverConfig observerConfig) override; - - virtual uint8_t* update() const override; - virtual uint8_t* reset() override; + virtual uint8_t* update() override; void release() override; protected: @@ -45,6 +42,11 @@ class VulkanObserver : public Observer { uint32_t pixelWidth_; uint32_t pixelHeight_; + /** + * We dont actually want to initialize vulkan on the device unless observations are specifically requested for this environment + */ + virtual void lazyInit() = 0; + private: static std::shared_ptr instance_; }; diff --git a/src/Griddly/Core/Observers/VulkanGridObserver.cpp b/src/Griddly/Core/Observers/VulkanGridObserver.cpp index 4b126daa1..aaf20a366 100644 --- a/src/Griddly/Core/Observers/VulkanGridObserver.cpp +++ b/src/Griddly/Core/Observers/VulkanGridObserver.cpp @@ -16,6 +16,9 @@ VulkanGridObserver::~VulkanGridObserver() { } void VulkanGridObserver::resetShape() { + + spdlog::debug("Resetting grid observer shape."); + gridWidth_ = observerConfig_.overrideGridWidth > 0 ? observerConfig_.overrideGridWidth : grid_->getWidth(); gridHeight_ = observerConfig_.overrideGridHeight > 0 ? observerConfig_.overrideGridHeight : grid_->getHeight(); diff --git a/tests/src/Griddly/Core/GDY/Objects/ObjectTest.cpp b/tests/src/Griddly/Core/GDY/Objects/ObjectTest.cpp index 317f342a7..7559757db 100644 --- a/tests/src/Griddly/Core/GDY/Objects/ObjectTest.cpp +++ b/tests/src/Griddly/Core/GDY/Objects/ObjectTest.cpp @@ -335,6 +335,10 @@ std::shared_ptr setupObject(std::string objectname, std::unordered_map setupObject(std::string objectname, std::unordered_map> initialVariables, std::shared_ptr mockGridPtr) { + return setupObject(1, objectname, {0, 0}, initialVariables, mockGridPtr); +} + BehaviourResult addCommandsAndExecute(ActionBehaviourType type, std::shared_ptr action, std::string commandName, BehaviourCommandArguments commandArgumentMap, CommandList conditionalCommands, std::shared_ptr srcObjectPtr, std::shared_ptr dstObjectPtr) { switch (type) { case ActionBehaviourType::DESTINATION: { @@ -440,8 +444,9 @@ TEST(ObjectTest, command_reward_default_to_action_player_id) { } TEST(ObjectTest, command_set) { - auto srcObjectPtr = setupObject("srcObject", {{"test_param", _V(20)}}); - auto dstObjectPtr = setupObject("dstObject", {{"test_param", _V(20)}}); + auto mockGridPtr = mockGrid(); + auto srcObjectPtr = setupObject("srcObject", {{"test_param", _V(20)}}, mockGridPtr); + auto dstObjectPtr = setupObject("dstObject", {{"test_param", _V(20)}}, mockGridPtr); auto mockActionPtr = setupAction("action", srcObjectPtr, dstObjectPtr); auto srcResult = addCommandsAndExecute(ActionBehaviourType::SOURCE, mockActionPtr, "set", {{"0", _Y("test_param")}, {"1", _Y("5")}}, srcObjectPtr, dstObjectPtr); @@ -457,8 +462,9 @@ TEST(ObjectTest, command_set) { } TEST(ObjectTest, command_add) { - auto srcObjectPtr = setupObject("srcObject", {{"test_param", _V(20)}}); - auto dstObjectPtr = setupObject("dstObject", {{"test_param", _V(20)}}); + auto mockGridPtr = mockGrid(); + auto srcObjectPtr = setupObject("srcObject", {{"test_param", _V(20)}}, mockGridPtr); + auto dstObjectPtr = setupObject("dstObject", {{"test_param", _V(20)}}, mockGridPtr); auto mockActionPtr = setupAction("action", srcObjectPtr, dstObjectPtr); auto srcResult = addCommandsAndExecute(ActionBehaviourType::SOURCE, mockActionPtr, "add", {{"0", _Y("test_param")}, {"1", _Y("5")}}, srcObjectPtr, dstObjectPtr); @@ -474,8 +480,9 @@ TEST(ObjectTest, command_add) { } TEST(ObjectTest, command_sub) { - auto srcObjectPtr = setupObject("srcObject", {{"test_param", _V(20)}}); - auto dstObjectPtr = setupObject("dstObject", {{"test_param", _V(20)}}); + auto mockGridPtr = mockGrid(); + auto srcObjectPtr = setupObject("srcObject", {{"test_param", _V(20)}}, mockGridPtr); + auto dstObjectPtr = setupObject("dstObject", {{"test_param", _V(20)}}, mockGridPtr); auto mockActionPtr = setupAction("action", srcObjectPtr, dstObjectPtr); auto srcResult = addCommandsAndExecute(ActionBehaviourType::SOURCE, mockActionPtr, "sub", {{"0", _Y("test_param")}, {"1", _Y("5")}}, srcObjectPtr, dstObjectPtr); @@ -491,8 +498,9 @@ TEST(ObjectTest, command_sub) { } TEST(ObjectTest, command_incr) { - auto srcObjectPtr = setupObject("srcObject", {{"test_param", _V(20)}}); - auto dstObjectPtr = setupObject("dstObject", {{"test_param", _V(20)}}); + auto mockGridPtr = mockGrid(); + auto srcObjectPtr = setupObject("srcObject", {{"test_param", _V(20)}}, mockGridPtr); + auto dstObjectPtr = setupObject("dstObject", {{"test_param", _V(20)}}, mockGridPtr); auto mockActionPtr = setupAction("action", srcObjectPtr, dstObjectPtr); auto srcResult = addCommandsAndExecute(ActionBehaviourType::SOURCE, mockActionPtr, "incr", {{"0", _Y("test_param")}}, srcObjectPtr, dstObjectPtr); @@ -508,8 +516,9 @@ TEST(ObjectTest, command_incr) { } TEST(ObjectTest, command_decr) { - auto srcObjectPtr = setupObject("srcObject", {{"test_param", _V(20)}}); - auto dstObjectPtr = setupObject("dstObject", {{"test_param", _V(20)}}); + auto mockGridPtr = mockGrid(); + auto srcObjectPtr = setupObject("srcObject", {{"test_param", _V(20)}}, mockGridPtr); + auto dstObjectPtr = setupObject("dstObject", {{"test_param", _V(20)}}, mockGridPtr); auto mockActionPtr = setupAction("action", srcObjectPtr, dstObjectPtr); auto srcResult = addCommandsAndExecute(ActionBehaviourType::SOURCE, mockActionPtr, "decr", {{"0", _Y("test_param")}}, srcObjectPtr, dstObjectPtr); @@ -1151,9 +1160,10 @@ TEST(ObjectTest, command_eq) { //* Arguments: [resource, 1] //* Commands: //* - decr: resource - - auto srcObjectPtr = setupObject("srcObject", {{"resource", _V(0)}}); - auto dstObjectPtr = setupObject("dstObject", {{"resource", _V(1)}}); + + auto mockGridPtr = mockGrid(); + auto srcObjectPtr = setupObject("srcObject", {{"resource", _V(0)}}, mockGridPtr); + auto dstObjectPtr = setupObject("dstObject", {{"resource", _V(1)}}, mockGridPtr); auto mockActionPtr = setupAction("action", srcObjectPtr, dstObjectPtr); @@ -1184,9 +1194,10 @@ TEST(ObjectTest, command_eq_qualifiers) { //* Arguments: [src.resource, 1] //* Commands: //* - decr: resource - - auto srcObjectPtr = setupObject("srcObject", {{"resource", _V(0)}}); - auto dstObjectPtr = setupObject("dstObject", {{"resource", _V(1)}}); + + auto mockGridPtr = mockGrid(); + auto srcObjectPtr = setupObject("srcObject", {{"resource", _V(0)}}, mockGridPtr); + auto dstObjectPtr = setupObject("dstObject", {{"resource", _V(1)}}, mockGridPtr); auto mockActionPtr = setupAction("action", srcObjectPtr, dstObjectPtr); @@ -1218,8 +1229,9 @@ TEST(ObjectTest, command_lt) { //* Commands: //* - decr: resource - auto srcObjectPtr = setupObject("srcObject", {{"resource", _V(0)}}); - auto dstObjectPtr = setupObject("dstObject", {{"resource", _V(1)}}); + auto mockGridPtr = mockGrid(); + auto srcObjectPtr = setupObject("srcObject", {{"resource", _V(0)}}, mockGridPtr); + auto dstObjectPtr = setupObject("dstObject", {{"resource", _V(1)}}, mockGridPtr); auto mockActionPtr = setupAction("action", srcObjectPtr, dstObjectPtr); @@ -1249,8 +1261,9 @@ TEST(ObjectTest, command_gt) { //* Commands: //* - decr: resource - auto srcObjectPtr = setupObject("srcObject", {{"resource", _V(1)}}); - auto dstObjectPtr = setupObject("dstObject", {{"resource", _V(2)}}); + auto mockGridPtr = mockGrid(); + auto srcObjectPtr = setupObject("srcObject", {{"resource", _V(1)}}, mockGridPtr); + auto dstObjectPtr = setupObject("dstObject", {{"resource", _V(2)}}, mockGridPtr); auto mockActionPtr = setupAction("action", srcObjectPtr, dstObjectPtr); @@ -1282,8 +1295,9 @@ TEST(ObjectTest, command_neq) { //* Commands: //* - decr: resource - auto srcObjectPtr = setupObject("srcObject", {{"resource", _V(1)}}); - auto dstObjectPtr = setupObject("dstObject", {{"resource", _V(2)}}); + auto mockGridPtr = mockGrid(); + auto srcObjectPtr = setupObject("srcObject", {{"resource", _V(1)}}, mockGridPtr); + auto dstObjectPtr = setupObject("dstObject", {{"resource", _V(2)}}, mockGridPtr); auto mockActionPtr = setupAction("action", srcObjectPtr, dstObjectPtr); diff --git a/tests/src/Griddly/Core/GameProcessTest.cpp b/tests/src/Griddly/Core/GameProcessTest.cpp index 1e90105b9..169143ada 100644 --- a/tests/src/Griddly/Core/GameProcessTest.cpp +++ b/tests/src/Griddly/Core/GameProcessTest.cpp @@ -389,9 +389,6 @@ TEST(GameProcessTest, reset) { auto mockObservationPtr = new uint8_t[3]{0, 1, 2}; - EXPECT_CALL(*mockObserverPtr, reset()) - .WillOnce(Return(mockObservationPtr)); - EXPECT_CALL(*mockGDYFactoryPtr, getPlayerObserverDefinition()) .WillOnce(Return(PlayerObserverDefinition{4, 8, 0, 0, false, false})); @@ -408,12 +405,7 @@ TEST(GameProcessTest, reset) { gameProcessPtr->addPlayer(mockPlayerPtr); gameProcessPtr->init(); - - auto observation = gameProcessPtr->reset(); - - auto resetObservationPointer = std::vector(observation, observation + 3); - - ASSERT_THAT(resetObservationPointer, ElementsAreArray(mockObservationPtr, 3)); + gameProcessPtr->reset(); ASSERT_EQ(gameProcessPtr->getNumPlayers(), 1); ASSERT_TRUE(gameProcessPtr->isInitialized()); @@ -479,10 +471,7 @@ TEST(GameProcessTest, resetNoGlobalObserver) { gameProcessPtr->addPlayer(mockPlayerPtr); gameProcessPtr->init(); - - auto observation = gameProcessPtr->reset(); - - ASSERT_EQ(observation, nullptr); + gameProcessPtr->reset(); ASSERT_EQ(gameProcessPtr->getNumPlayers(), 1); ASSERT_TRUE(gameProcessPtr->isInitialized()); diff --git a/tests/src/Griddly/Core/Observers/BlockObserverTest.cpp b/tests/src/Griddly/Core/Observers/BlockObserverTest.cpp index 504a23abf..31799c921 100644 --- a/tests/src/Griddly/Core/Observers/BlockObserverTest.cpp +++ b/tests/src/Griddly/Core/Observers/BlockObserverTest.cpp @@ -1,8 +1,8 @@ #include "Griddly/Core/Observers/BlockObserver.hpp" #include "Mocks/Griddly/Core/MockGrid.hpp" -#include "ObserverTestData.hpp" #include "ObserverRTSTestData.hpp" +#include "ObserverTestData.hpp" #include "VulkanObserverTest.hpp" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -11,11 +11,11 @@ using ::testing::AnyNumber; using ::testing::ElementsAre; using ::testing::ElementsAreArray; using ::testing::Eq; +using ::testing::Invoke; using ::testing::Mock; using ::testing::Pair; using ::testing::Return; using ::testing::ReturnRef; -using ::testing::Invoke; namespace griddly { @@ -128,7 +128,6 @@ void runBlockObserverTest(ObserverConfig observerConfig, std::string expectedOutputFilename, bool trackAvatar, bool writeOutputFile = false) { - ResourceConfig resourceConfig = {"resources/images", "resources/shaders"}; observerConfig.tileSize = glm::ivec2(20, 20); ObserverTestData testEnvironment = ObserverTestData(observerConfig, DiscreteOrientation(avatarDirection), trackAvatar); @@ -136,30 +135,28 @@ void runBlockObserverTest(ObserverConfig observerConfig, std::shared_ptr blockObserver = std::shared_ptr(new BlockObserver(testEnvironment.mockGridPtr, resourceConfig, getMockBlockDefinitions())); blockObserver->init(observerConfig); + blockObserver->reset(); if (trackAvatar) { blockObserver->setAvatar(testEnvironment.mockAvatarObjectPtr); } - auto resetObservation = blockObserver->reset(); + auto updateObservation = blockObserver->update(); ASSERT_EQ(blockObserver->getTileSize(), glm::ivec2(20, 20)); ASSERT_EQ(blockObserver->getShape(), expectedObservationShape); ASSERT_EQ(blockObserver->getStrides()[0], expectedObservationStride[0]); ASSERT_EQ(blockObserver->getStrides()[1], expectedObservationStride[1]); - auto updateObservation = blockObserver->update(); - if (writeOutputFile) { std::string testName(::testing::UnitTest::GetInstance()->current_test_info()->name()); - write_image(testName + ".png", resetObservation, blockObserver->getStrides()[2], blockObserver->getShape()[1], blockObserver->getShape()[2]); + write_image(testName + ".png", updateObservation, blockObserver->getStrides()[2], blockObserver->getShape()[1], blockObserver->getShape()[2]); } size_t dataLength = 4 * blockObserver->getShape()[1] * blockObserver->getShape()[2]; auto expectedImageData = loadExpectedImage(expectedOutputFilename); - ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(blockObserver->getShape(), blockObserver->getStrides(), resetObservation)); ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(blockObserver->getShape(), blockObserver->getStrides(), updateObservation)); testEnvironment.verifyAndClearExpectations(); @@ -180,25 +177,23 @@ void runBlockObserverRTSTest(ObserverConfig observerConfig, std::shared_ptr blockObserver = std::shared_ptr(new BlockObserver(testEnvironment.mockGridPtr, resourceConfig, getMockRTSBlockDefinitions())); blockObserver->init(observerConfig); + blockObserver->reset(); - auto resetObservation = blockObserver->reset(); + auto updateObservation = blockObserver->update(); ASSERT_EQ(blockObserver->getShape(), expectedObservationShape); ASSERT_EQ(blockObserver->getStrides()[0], expectedObservationStride[0]); ASSERT_EQ(blockObserver->getStrides()[1], expectedObservationStride[1]); - auto updateObservation = blockObserver->update(); - if (writeOutputFile) { std::string testName(::testing::UnitTest::GetInstance()->current_test_info()->name()); - write_image(testName + ".png", resetObservation, blockObserver->getStrides()[2], blockObserver->getShape()[1], blockObserver->getShape()[2]); + write_image(testName + ".png", updateObservation, blockObserver->getStrides()[2], blockObserver->getShape()[1], blockObserver->getShape()[2]); } size_t dataLength = 4 * blockObserver->getShape()[1] * blockObserver->getShape()[2]; auto expectedImageData = loadExpectedImage(expectedOutputFilename); - ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(blockObserver->getShape(), blockObserver->getStrides(), resetObservation)); ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(blockObserver->getShape(), blockObserver->getStrides(), updateObservation)); testEnvironment.verifyAndClearExpectations(); diff --git a/tests/src/Griddly/Core/Observers/IsometricSpriteObserverTest.cpp b/tests/src/Griddly/Core/Observers/IsometricSpriteObserverTest.cpp index 63c7e57b2..512a06b78 100644 --- a/tests/src/Griddly/Core/Observers/IsometricSpriteObserverTest.cpp +++ b/tests/src/Griddly/Core/Observers/IsometricSpriteObserverTest.cpp @@ -82,26 +82,24 @@ void runIsometricSpriteObserverRTSTest(ObserverConfig observerConfig, std::shared_ptr isometricObserver = std::shared_ptr(new IsometricSpriteObserver(testEnvironment.mockGridPtr, resourceConfig, getMockRTSIsometricSpriteDefinitions())); isometricObserver->init(observerConfig); - - auto resetObservation = isometricObserver->reset(); + isometricObserver->reset(); + + auto updateObservation = isometricObserver->update(); ASSERT_EQ(isometricObserver->getTileSize(), glm::ivec2(32, 48)); ASSERT_EQ(isometricObserver->getShape(), expectedObservationShape); ASSERT_EQ(isometricObserver->getStrides()[0], expectedObservationStride[0]); ASSERT_EQ(isometricObserver->getStrides()[1], expectedObservationStride[1]); - auto updateObservation = isometricObserver->update(); - if (writeOutputFile) { std::string testName(::testing::UnitTest::GetInstance()->current_test_info()->name()); - write_image(testName + ".png", resetObservation, isometricObserver->getStrides()[2], isometricObserver->getShape()[1], isometricObserver->getShape()[2]); + write_image(testName + ".png", updateObservation, isometricObserver->getStrides()[2], isometricObserver->getShape()[1], isometricObserver->getShape()[2]); } size_t dataLength = 4 * isometricObserver->getShape()[1] * isometricObserver->getShape()[2]; auto expectedImageData = loadExpectedImage(expectedOutputFilename); - ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(isometricObserver->getShape(), isometricObserver->getStrides(), resetObservation)); ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(isometricObserver->getShape(), isometricObserver->getStrides(), updateObservation)); testEnvironment.verifyAndClearExpectations(); @@ -171,28 +169,27 @@ void runIsometricSpriteObserverTest(ObserverConfig observerConfig, std::shared_ptr isometricObserver = std::shared_ptr(new IsometricSpriteObserver(testEnvironment.mockGridPtr, resourceConfig, getMockIsometricSpriteDefinitions())); isometricObserver->init(observerConfig); + isometricObserver->reset(); if (trackAvatar) { isometricObserver->setAvatar(testEnvironment.mockAvatarObjectPtr); } - auto resetObservation = isometricObserver->reset(); + auto updateObservation = isometricObserver->update(); + ASSERT_EQ(isometricObserver->getShape(), expectedObservationShape); ASSERT_EQ(isometricObserver->getStrides()[0], expectedObservationStride[0]); ASSERT_EQ(isometricObserver->getStrides()[1], expectedObservationStride[1]); - auto updateObservation = isometricObserver->update(); - if (writeOutputFile) { std::string testName(::testing::UnitTest::GetInstance()->current_test_info()->name()); - write_image(testName + ".png", resetObservation, isometricObserver->getStrides()[2], isometricObserver->getShape()[1], isometricObserver->getShape()[2]); + write_image(testName + ".png", updateObservation, isometricObserver->getStrides()[2], isometricObserver->getShape()[1], isometricObserver->getShape()[2]); } size_t dataLength = 4 * isometricObserver->getShape()[1] * isometricObserver->getShape()[2]; auto expectedImageData = loadExpectedImage(expectedOutputFilename); - ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(isometricObserver->getShape(), isometricObserver->getStrides(), resetObservation)); ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(isometricObserver->getShape(), isometricObserver->getStrides(), updateObservation)); testEnvironment.verifyAndClearExpectations(); @@ -283,7 +280,7 @@ TEST(IsometricSpriteObserverTest, partialObserver) { 0, false}; - runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver.png", false); + runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver.png", false, true); } TEST(IsometricSpriteObserverTest, partialObserver_withOffset) { @@ -294,7 +291,7 @@ TEST(IsometricSpriteObserverTest, partialObserver_withOffset) { 1, false}; - runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver_withOffset.png", false); + runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver_withOffset.png", false, true); } TEST(IsometricSpriteObserverTest, partialObserver_trackAvatar_NONE) { @@ -305,7 +302,7 @@ TEST(IsometricSpriteObserverTest, partialObserver_trackAvatar_NONE) { 0, false}; - runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver_trackAvatar_NONE.png", true); + runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver_trackAvatar_NONE.png", true, true); } TEST(IsometricSpriteObserverTest, partialObserver_trackAvatar_UP) { diff --git a/tests/src/Griddly/Core/Observers/SpriteObserverTest.cpp b/tests/src/Griddly/Core/Observers/SpriteObserverTest.cpp index 5d64d2a32..f448eb364 100644 --- a/tests/src/Griddly/Core/Observers/SpriteObserverTest.cpp +++ b/tests/src/Griddly/Core/Observers/SpriteObserverTest.cpp @@ -93,26 +93,24 @@ void runSpriteObserverRTSTest(ObserverConfig observerConfig, std::shared_ptr spriteObserver = std::shared_ptr(new SpriteObserver(testEnvironment.mockGridPtr, resourceConfig, getMockRTSSpriteDefinitions())); spriteObserver->init(observerConfig); + spriteObserver->reset(); - auto resetObservation = spriteObserver->reset(); - + auto updateObservation = spriteObserver->update(); + ASSERT_EQ(spriteObserver->getTileSize(), glm::ivec2(50, 50)); ASSERT_EQ(spriteObserver->getShape(), expectedObservationShape); ASSERT_EQ(spriteObserver->getStrides()[0], expectedObservationStride[0]); ASSERT_EQ(spriteObserver->getStrides()[1], expectedObservationStride[1]); - auto updateObservation = spriteObserver->update(); - if (writeOutputFile) { std::string testName(::testing::UnitTest::GetInstance()->current_test_info()->name()); - write_image(testName + ".png", resetObservation, spriteObserver->getStrides()[2], spriteObserver->getShape()[1], spriteObserver->getShape()[2]); + write_image(testName + ".png", updateObservation, spriteObserver->getStrides()[2], spriteObserver->getShape()[1], spriteObserver->getShape()[2]); } size_t dataLength = 4 * spriteObserver->getShape()[1] * spriteObserver->getShape()[2]; auto expectedImageData = loadExpectedImage(expectedOutputFilename); - ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(spriteObserver->getShape(), spriteObserver->getStrides(), resetObservation)); ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(spriteObserver->getShape(), spriteObserver->getStrides(), updateObservation)); testEnvironment.verifyAndClearExpectations(); @@ -193,28 +191,27 @@ void runSpriteObserverTest(ObserverConfig observerConfig, std::shared_ptr spriteObserver = std::shared_ptr(new SpriteObserver(testEnvironment.mockGridPtr, resourceConfig, getMockSpriteDefinitions())); spriteObserver->init(observerConfig); + spriteObserver->reset(); if (trackAvatar) { spriteObserver->setAvatar(testEnvironment.mockAvatarObjectPtr); } - auto resetObservation = spriteObserver->reset(); + auto updateObservation = spriteObserver->update(); + ASSERT_EQ(spriteObserver->getShape(), expectedObservationShape); ASSERT_EQ(spriteObserver->getStrides()[0], expectedObservationStride[0]); ASSERT_EQ(spriteObserver->getStrides()[1], expectedObservationStride[1]); - auto updateObservation = spriteObserver->update(); - if (writeOutputFile) { std::string testName(::testing::UnitTest::GetInstance()->current_test_info()->name()); - write_image(testName + ".png", resetObservation, spriteObserver->getStrides()[2], spriteObserver->getShape()[1], spriteObserver->getShape()[2]); + write_image(testName + ".png", updateObservation, spriteObserver->getStrides()[2], spriteObserver->getShape()[1], spriteObserver->getShape()[2]); } size_t dataLength = 4 * spriteObserver->getShape()[1] * spriteObserver->getShape()[2]; auto expectedImageData = loadExpectedImage(expectedOutputFilename); - ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(spriteObserver->getShape(), spriteObserver->getStrides(), resetObservation)); ASSERT_THAT(expectedImageData.get(), ObservationResultMatcher(spriteObserver->getShape(), spriteObserver->getStrides(), updateObservation)); testEnvironment.verifyAndClearExpectations(); diff --git a/tests/src/Griddly/Core/Observers/VectorObserverTest.cpp b/tests/src/Griddly/Core/Observers/VectorObserverTest.cpp index 181ffe814..78fa01481 100644 --- a/tests/src/Griddly/Core/Observers/VectorObserverTest.cpp +++ b/tests/src/Griddly/Core/Observers/VectorObserverTest.cpp @@ -34,20 +34,19 @@ void runVectorObserverTest(ObserverConfig observerConfig, if (trackAvatar) { vectorObserver->setAvatar(testEnvironment.mockAvatarObjectPtr); } - auto resetObservation = vectorObserver->reset(); + + vectorObserver->reset(); + + auto updateObservation = vectorObserver->update(); ASSERT_EQ(vectorObserver->getTileSize(), glm::ivec2(1, 1)); ASSERT_EQ(vectorObserver->getShape(), expectedObservationShape); ASSERT_EQ(vectorObserver->getStrides(), expectedObservationStride); - auto updateObservation = vectorObserver->update(); - size_t dataLength = vectorObserver->getShape()[0] * vectorObserver->getShape()[1] * vectorObserver->getShape()[2]; - auto resetObservationPointer = std::vector(resetObservation, resetObservation + dataLength); auto updateObservationPointer = std::vector(updateObservation, updateObservation + dataLength); - ASSERT_THAT(resetObservationPointer, ElementsAreArray(expectedData, dataLength)); ASSERT_THAT(updateObservationPointer, ElementsAreArray(expectedData, dataLength)); testEnvironment.verifyAndClearExpectations(); @@ -65,21 +64,20 @@ void runVectorObserverRTSTest(ObserverConfig observerConfig, vectorObserver->init(observerConfig); - auto resetObservation = vectorObserver->reset(); + vectorObserver->reset(); + + auto updateObservation = vectorObserver->update(); ASSERT_EQ(vectorObserver->getTileSize(), glm::ivec2(1, 1)); ASSERT_EQ(vectorObserver->getShape(), expectedObservationShape); ASSERT_EQ(vectorObserver->getStrides()[0], expectedObservationStride[0]); ASSERT_EQ(vectorObserver->getStrides()[1], expectedObservationStride[1]); - auto updateObservation = vectorObserver->update(); size_t dataLength = vectorObserver->getShape()[0] * vectorObserver->getShape()[1] * vectorObserver->getShape()[2]; - auto resetObservationPointer = std::vector(resetObservation, resetObservation + dataLength); auto updateObservationPointer = std::vector(updateObservation, updateObservation + dataLength); - ASSERT_THAT(resetObservationPointer, ElementsAreArray(expectedData, dataLength)); ASSERT_THAT(updateObservationPointer, ElementsAreArray(expectedData, dataLength)); testEnvironment.verifyAndClearExpectations(); diff --git a/tests/src/Mocks/Griddly/Core/Observers/MockObserver.hpp b/tests/src/Mocks/Griddly/Core/Observers/MockObserver.hpp index df1dd1a88..71f29b54e 100644 --- a/tests/src/Mocks/Griddly/Core/Observers/MockObserver.hpp +++ b/tests/src/Mocks/Griddly/Core/Observers/MockObserver.hpp @@ -10,8 +10,8 @@ class MockObserver : public Observer { ~MockObserver() {} MOCK_METHOD(void, init, (ObserverConfig observerConfig), ()); - MOCK_METHOD(uint8_t*, update, (), (const)); - MOCK_METHOD(uint8_t*, reset, (), ()); + MOCK_METHOD(uint8_t*, update, (), ()); + MOCK_METHOD(void, reset, (), ()); MOCK_METHOD(void, resetShape, (), ()); MOCK_METHOD(std::vector, getShape, (), (const)); From 4ef44089272f687b915c827ab1f31dd7afe82168 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 26 Apr 2021 15:05:23 +0100 Subject: [PATCH 10/29] video should only be recoreded once per worker --- python/griddly/util/rllib/callbacks.py | 15 ++- python/griddly/util/rllib/environment/core.py | 124 +++++++++++------- .../environment/observer_episode_recorder.py | 2 +- .../Observers/IsometricSpriteObserverTest.cpp | 6 +- 4 files changed, 95 insertions(+), 52 deletions(-) diff --git a/python/griddly/util/rllib/callbacks.py b/python/griddly/util/rllib/callbacks.py index aa80be0c5..f79a64216 100644 --- a/python/griddly/util/rllib/callbacks.py +++ b/python/griddly/util/rllib/callbacks.py @@ -1,14 +1,24 @@ from typing import Optional, Dict -from ray.rllib import Policy, BaseEnv +from ray.rllib import Policy, BaseEnv, SampleBatch from ray.rllib.agents.callbacks import DefaultCallbacks from ray.rllib.evaluation import MultiAgentEpisode -from ray.rllib.utils.typing import PolicyID +from ray.rllib.utils.typing import PolicyID, AgentID from wandb import Video class GriddlyCallbacks(DefaultCallbacks): + def on_episode_start(self, + *, + worker: "RolloutWorker", + base_env: BaseEnv, + policies: Dict[PolicyID, Policy], + episode: MultiAgentEpisode, + env_index: Optional[int] = None, + **kwargs) -> None: + base_env.envs[env_index].on_episode_start(worker.worker_index, env_index) + def on_episode_end(self, *, worker: "RolloutWorker", base_env: BaseEnv, policies: Dict[PolicyID, Policy], episode: MultiAgentEpisode, env_index: Optional[int] = None, **kwargs) -> None: info = episode.last_info_for(1) @@ -17,3 +27,4 @@ def on_episode_end(self, *, worker: "RolloutWorker", base_env: BaseEnv, policies level = video['level'] path = video['path'] episode.media[f'level_{level}_1'] = Video(path) + diff --git a/python/griddly/util/rllib/environment/core.py b/python/griddly/util/rllib/environment/core.py index 6b3252993..3df3a5a7c 100644 --- a/python/griddly/util/rllib/environment/core.py +++ b/python/griddly/util/rllib/environment/core.py @@ -1,7 +1,5 @@ import os from collections import defaultdict -from enum import Enum -from uuid import uuid1 import gym import numpy as np @@ -9,7 +7,6 @@ from ray.rllib.utils.typing import MultiAgentDict from griddly import GymWrapper -from griddly.RenderTools import VideoRecorder from griddly.util.rllib.environment.observer_episode_recorder import ObserverEpisodeRecorder @@ -49,13 +46,13 @@ class RLlibEnv(GymWrapper): def __init__(self, env_config): super().__init__(**env_config) - self.generate_valid_action_trees = env_config.get('generate_valid_action_trees', False) - self.record_video_config = env_config.get('record_video_config', None) - self._random_level_on_reset = env_config.get('random_level_on_reset', False) - self.env_steps = 0 + self._env_idx = None + self._worker_idx = None - super().reset() + self.video_initialized = False + + self.record_video_config = env_config.get('record_video_config', None) if self.record_video_config is not None: self.video_frequency = self.record_video_config.get('frequency', 1000) @@ -64,21 +61,10 @@ def __init__(self, env_config): self.include_agent_videos = self.record_video_config.get('include_agents', False) os.makedirs(self.video_directory, exist_ok=True) - if self.player_count == 1: - if self.include_agent_videos: - self._agent_recorder = ObserverEpisodeRecorder( - self, - 1, - self.video_frequency, - self.video_directory - ) - if self.include_global_video: - self._global_recorder = ObserverEpisodeRecorder( - self, - 'global', - self.video_frequency, - self.video_directory - ) + self.generate_valid_action_trees = env_config.get('generate_valid_action_trees', False) + self._random_level_on_reset = env_config.get('random_level_on_reset', False) + + super().reset() self.set_transform() @@ -95,8 +81,8 @@ def _after_step(self, observation, reward, done, info): extra_info = {} # If we are in a multi-agent setting then we handle videos elsewhere - if self.player_count == 1: - if self.record_video_config is not None: + if self.is_video_enabled(): + if self.player_count == 1: videos_list = [] if self.include_agent_videos: video_info = self._agent_recorder.step(self.level_id, self.env_steps, done) @@ -166,6 +152,34 @@ def step(self, action): def render(self, mode='human', observer=0): return super().render(mode, observer='global') + def is_video_enabled(self): + return self.record_video_config is not None and self._env_idx is not None and self._env_idx == 0 + + def on_episode_start(self, worker_idx, env_idx): + self._env_idx = env_idx + self._worker_idx = worker_idx + + if self.is_video_enabled() and not self.video_initialized: + self.init_video_recording() + self.video_initialized = True + + def init_video_recording(self): + if self.player_count == 1: + if self.include_agent_videos: + self._agent_recorder = ObserverEpisodeRecorder( + self, + 1, + self.video_frequency, + self.video_directory + ) + if self.include_global_video: + self._global_recorder = ObserverEpisodeRecorder( + self, + 'global', + self.video_frequency, + self.video_directory + ) + class RLlibMultiAgentWrapper(gym.Wrapper, MultiAgentEnv): @@ -177,26 +191,13 @@ def __init__(self, env, env_config): # Used to keep track of agents that are active in the environment self._active_agents = set() - assert self.player_count > 1, 'RLlibMultiAgentWrapper can only be used with environments that have multiple agents' + self._agent_recorders = None + self._global_recorder = None - if self.record_video_config is not None: - if self.include_agent_videos: - self._agent_recorders = {} - for a in range(self.player_count): - agent_id = a+1 - self._agent_recorders[agent_id] = ObserverEpisodeRecorder( - self, - agent_id, - self.video_frequency, - self.video_directory - ) - if self.include_global_video: - self._global_recorder = ObserverEpisodeRecorder( - self, - 'global', - self.video_frequency, - self.video_directory - ) + self._worker_idx = None + self._env_idx = None + + assert self.player_count > 1, 'RLlibMultiAgentWrapper can only be used with environments that have multiple agents' def _to_multi_agent_map(self, data): return {a: data[a - 1] for a in self._active_agents} @@ -213,11 +214,12 @@ def _resolve_player_done_variable(self): def _after_step(self, obs_map, reward_map, done_map, info_map): extra_info = {} - if self.record_video_config is not None: + + if self.is_video_enabled(): videos_list = [] if self.include_agent_videos: for a in self._active_agents: - video_info = self._agent_recorders[a].step(self.level_id, self.env_steps, done_map[a-1]) + video_info = self._agent_recorders[a].step(self.level_id, self.env_steps, done_map[a - 1]) if video_info is not None: videos_list.append(video_info) if self.include_global_video: @@ -272,3 +274,33 @@ def step(self, action_dict: MultiAgentDict): assert len(obs_map) == len(info_map) return obs_map, reward_map, done_map, info_map + + def is_video_enabled(self): + return self.record_video_config is not None and self._env_idx is not None and self._env_idx == 0 + + def on_episode_start(self, worker_idx, env_idx): + self._env_idx = env_idx + self._worker_idx = worker_idx + + if self.is_video_enabled() and not self.video_initialized: + self.init_video_recording() + self.video_initialized = True + + def init_video_recording(self): + if self.include_agent_videos: + self._agent_recorders = {} + for a in range(self.player_count): + agent_id = a + 1 + self._agent_recorders[agent_id] = ObserverEpisodeRecorder( + self, + agent_id, + self.video_frequency, + self.video_directory + ) + if self.include_global_video: + self._global_recorder = ObserverEpisodeRecorder( + self, + 'global', + self.video_frequency, + self.video_directory + ) diff --git a/python/griddly/util/rllib/environment/observer_episode_recorder.py b/python/griddly/util/rllib/environment/observer_episode_recorder.py index 0aa98fbdc..2f9d804ec 100644 --- a/python/griddly/util/rllib/environment/observer_episode_recorder.py +++ b/python/griddly/util/rllib/environment/observer_episode_recorder.py @@ -1,5 +1,5 @@ -import os from enum import Enum +import os from uuid import uuid1 from griddly.RenderTools import VideoRecorder diff --git a/tests/src/Griddly/Core/Observers/IsometricSpriteObserverTest.cpp b/tests/src/Griddly/Core/Observers/IsometricSpriteObserverTest.cpp index 512a06b78..4611df387 100644 --- a/tests/src/Griddly/Core/Observers/IsometricSpriteObserverTest.cpp +++ b/tests/src/Griddly/Core/Observers/IsometricSpriteObserverTest.cpp @@ -280,7 +280,7 @@ TEST(IsometricSpriteObserverTest, partialObserver) { 0, false}; - runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver.png", false, true); + runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver.png", false); } TEST(IsometricSpriteObserverTest, partialObserver_withOffset) { @@ -291,7 +291,7 @@ TEST(IsometricSpriteObserverTest, partialObserver_withOffset) { 1, false}; - runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver_withOffset.png", false, true); + runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver_withOffset.png", false); } TEST(IsometricSpriteObserverTest, partialObserver_trackAvatar_NONE) { @@ -302,7 +302,7 @@ TEST(IsometricSpriteObserverTest, partialObserver_trackAvatar_NONE) { 0, false}; - runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver_trackAvatar_NONE.png", true, true); + runIsometricSpriteObserverTest(config, Direction::NONE, {3, 128, 116}, {1, 4, 4 * 128}, "tests/resources/observer/isometric/partialObserver_trackAvatar_NONE.png", true); } TEST(IsometricSpriteObserverTest, partialObserver_trackAvatar_UP) { From 3346ca0b27d23e26e7d2f38e47d4ee2a24822fa3 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 26 Apr 2021 16:54:48 +0100 Subject: [PATCH 11/29] more testing for getting harvesters building --- .../examples/experiments/rts/griddly_rts.yaml | 9 +-- .../rts/rts_random_valid_actions.py | 64 +++++++++++++++++++ .../experiments/rts/tests/rts_tests.py | 3 +- python/griddly/util/rllib/callbacks.py | 4 +- 4 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 python/examples/experiments/rts/rts_random_valid_actions.py diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml index 819706e4d..013a2a7ee 100644 --- a/python/examples/experiments/rts/griddly_rts.yaml +++ b/python/examples/experiments/rts/griddly_rts.yaml @@ -203,14 +203,15 @@ Actions: Commands: - sub: [ player_resources, 5 ] - reward: 1 - Dst: - Object: base - Commands: - # Queue a build which will take 10 seconds + # Queue a build which will take 10 seconds - exec: Action: spawn_harvester Delay: 10 Randomize: true + Executor: action + Dst: + Object: base + - Name: gather diff --git a/python/examples/experiments/rts/rts_random_valid_actions.py b/python/examples/experiments/rts/rts_random_valid_actions.py new file mode 100644 index 000000000..fa3c22d1d --- /dev/null +++ b/python/examples/experiments/rts/rts_random_valid_actions.py @@ -0,0 +1,64 @@ +import gym +from collections import Counter +from griddly import GymWrapperFactory, gd +from griddly.util.wrappers import ValidActionSpaceWrapper + +class EventFrequencyTracker(): + + def __init__(self, window_size): + self._steps = 0 + + self._window_size = window_size + + self._frequency_trackers = [Counter() for _ in range(window_size)] + + def process(self, events): + for e in events: + action_name = e['ActionName'] + self._frequency_trackers[-1][action_name] += 1 + + self._frequency_trackers.pop(0) + self._frequency_trackers.append(Counter()) + + def get_frequencies(self): + event_totals = Counter() + for tracker in self._frequency_trackers: + for key, value in tracker.items(): + event_totals[key] += value + + event_averages = {} + for k,v in event_totals.items(): + event_averages[k] = v/self._window_size + + return event_totals + + +if __name__ == '__main__': + wrapper = GymWrapperFactory() + + wrapper.build_gym_from_yaml("GriddlyRTS-Adv", + 'griddly_rts.yaml', + global_observer_type=gd.ObserverType.VECTOR, + player_observer_type=gd.ObserverType.ISOMETRIC, + level=0) + + env_original = gym.make(f'GDY-GriddlyRTS-Adv-v0') + # env_original = gym.make(f'GDY-GriddlyRTS-Adv-v0') + + env_original.reset() + env_original.enable_history() + + env = ValidActionSpaceWrapper(env_original) + + event_tracker = EventFrequencyTracker(10) + + for i in range(10000): + action = env.action_space.sample() + + obs, reward, done, info = env.step(action) + + event_tracker.process(info['History']) + + env.render() + + print(event_tracker.get_frequencies()) \ No newline at end of file diff --git a/python/examples/experiments/rts/tests/rts_tests.py b/python/examples/experiments/rts/tests/rts_tests.py index d6e6bddb5..3ff229b7e 100644 --- a/python/examples/experiments/rts/tests/rts_tests.py +++ b/python/examples/experiments/rts/tests/rts_tests.py @@ -161,5 +161,4 @@ def test_harvester(test_name): assert env.get_state()['GlobalVariables']['player_resources'][1] == 0 assert env.get_state()['GlobalVariables']['player_resources'][2] == 0 - assert reward == [1, 1] - + assert reward == [1, 1] \ No newline at end of file diff --git a/python/griddly/util/rllib/callbacks.py b/python/griddly/util/rllib/callbacks.py index f79a64216..5020262dd 100644 --- a/python/griddly/util/rllib/callbacks.py +++ b/python/griddly/util/rllib/callbacks.py @@ -1,9 +1,9 @@ from typing import Optional, Dict -from ray.rllib import Policy, BaseEnv, SampleBatch +from ray.rllib import Policy, BaseEnv from ray.rllib.agents.callbacks import DefaultCallbacks from ray.rllib.evaluation import MultiAgentEpisode -from ray.rllib.utils.typing import PolicyID, AgentID +from ray.rllib.utils.typing import PolicyID from wandb import Video From 30bc283db17afa3dfdb67616cbe12a8798685481 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Tue, 27 Apr 2021 16:36:20 +0100 Subject: [PATCH 12/29] adding more complexity to game and playing with some assets --- .../examples/experiments/rts/griddly_rts.yaml | 226 +++++++++++++++--- .../experiments/rts/rts/models/impala_cnn.py | 81 ++++--- .../experiments/rts/rts/models/simple_conv.py | 51 ++++ .../rts/rts_random_valid_actions.py | 18 +- .../examples/experiments/rts/rts_self_play.py | 5 +- .../oryx/oryx_iso_dungeon/barracks-1.png | Bin 0 -> 737 bytes .../oryx_iso_dungeon/barracks-disabled-1.png | Bin 0 -> 721 bytes .../images/oryx/oryx_iso_dungeon/base-1.png | Bin 1295 -> 760 bytes .../oryx/oryx_iso_dungeon/base-disabled-1.png | Bin 0 -> 747 bytes .../oryx/oryx_iso_dungeon/minerals-1-0.png | Bin 0 -> 945 bytes .../oryx/oryx_iso_dungeon/minerals-1-1.png | Bin 0 -> 891 bytes .../oryx/oryx_iso_dungeon/minerals-1-2.png | Bin 0 -> 752 bytes .../oryx/oryx_iso_dungeon/minerals-1.png | Bin 1568 -> 0 bytes 13 files changed, 313 insertions(+), 68 deletions(-) create mode 100644 resources/images/oryx/oryx_iso_dungeon/barracks-1.png create mode 100644 resources/images/oryx/oryx_iso_dungeon/barracks-disabled-1.png create mode 100644 resources/images/oryx/oryx_iso_dungeon/base-disabled-1.png create mode 100644 resources/images/oryx/oryx_iso_dungeon/minerals-1-0.png create mode 100644 resources/images/oryx/oryx_iso_dungeon/minerals-1-1.png create mode 100644 resources/images/oryx/oryx_iso_dungeon/minerals-1-2.png delete mode 100644 resources/images/oryx/oryx_iso_dungeon/minerals-1.png diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml index 013a2a7ee..9c470b9dd 100644 --- a/python/examples/experiments/rts/griddly_rts.yaml +++ b/python/examples/experiments/rts/griddly_rts.yaml @@ -8,9 +8,12 @@ Environment: BackgroundTile: oryx/oryx_tiny_galaxy/tg_sliced/tg_world/tg_world_floor_panel_metal_a.png Isometric: TileSize: [ 32, 48 ] + #TileSize: [ 64, 96 ] BackgroundTile: oryx/oryx_iso_dungeon/floor-1.png IsoTileHeight: 16 + #IsoTileHeight: 32 IsoTileDepth: 4 + #IsoTileDepth: 8 Vector: IncludePlayerId: true IncludeVariables: true @@ -29,7 +32,7 @@ Environment: - | M M . . . . . . . . . . . . . . M M . . . . . . . . . . . . . . - . . B1 H1 . . . . . . . . . . . . + . . A1 H1 . . . . . . . . . . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @@ -40,10 +43,10 @@ Environment: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . H2 . . - . . . . . . . . . . . . H2 B2 . . + . . . . . . . . . . . . H2 A2 . . . . . . . . . . . . . . . . M M . . . . . . . . . . . . . . M M - - | +# - | # W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W # W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W # W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W @@ -166,30 +169,69 @@ Environment: # W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W Actions: - - Name: spawn_harvester + - Name: spawn_worker InputMapping: Internal: true Behaviours: - Src: Object: base Commands: - - spawn: harvester + - spawn: worker + - set: [ is_busy, 0 ] Dst: Object: _empty - Src: Object: base Dst: - Object: [ base, combat, harvester, ranged, movable_wall ] + Object: [ base, barracks, combat, worker, ranged, movable_wall ] + Commands: + # Try to spawn in another location on the next tick + - exec: + Action: spawn_worker + Delay: 1 + Randomize: true + - Name: spawn_combat + InputMapping: + Internal: true + Behaviours: + - Src: + Object: barracks + Commands: + - spawn: combat + - set: [ is_busy, 0 ] + Dst: + Object: _empty + + - Src: + Object: barracks + Dst: + Object: [ base, barracks, combat, worker, ranged, movable_wall ] Commands: # Try to spawn in another location on the next tick - exec: - Action: spawn_harvester + Action: spawn_combat Delay: 1 Randomize: true - # Harvester costs 5 resources to build, get a reward when a harvester is built - - Name: build_harvester + - Name: construct_barracks + InputMapping: + Inputs: + 1: + Description: Completes construction of a barracks + VectorToDest: [ 0, 0 ] + Internal: true + Behaviours: + - Src: + Object: barracks_disabled + Commands: + - set: [ is_busy, 0 ] + - change_to: barracks + Dst: + Object: barracks_disabled + + # worker costs 5 resources to build, get a reward when a worker is built + - Name: build_worker InputMapping: Inputs: 1: @@ -200,26 +242,67 @@ Actions: Object: base Preconditions: - gte: [ player_resources, 5 ] + - eq: [ is_busy, 0 ] Commands: + - set: [ is_busy, 1 ] - sub: [ player_resources, 5 ] - reward: 1 # Queue a build which will take 10 seconds - exec: - Action: spawn_harvester + Action: spawn_worker Delay: 10 Randomize: true Executor: action Dst: Object: base + - Name: build_combat + InputMapping: + Inputs: + 1: + Description: Build + VectorToDest: [ 0, 0 ] + Behaviours: + - Src: + Object: barracks + Preconditions: + - gte: [ player_resources, 5 ] + - eq: [ is_busy, 0 ] + Commands: + - set: [ is_busy, 1 ] + - sub: [ player_resources, 5 ] + - reward: 1 + - exec: + Action: spawn_combat + Delay: 10 + Randomize: true + Executor: action + Dst: + Object: barracks + - Name: build_barracks + Behaviours: + - Src: + Object: worker + Preconditions: + - gte: [ player_resources, 20 ] + - eq: [ is_busy, 0 ] + Commands: + - sub: [ player_resources, 20 ] + - reward: 1 + + Dst: + Object: _empty + Commands: + - spawn: barracks_disabled - Name: gather Behaviours: - Src: - Object: harvester + Object: worker Preconditions: - lt: [ resources, 5 ] + - eq: [ is_busy, 0 ] Commands: - incr: resources - reward: 1 @@ -227,13 +310,22 @@ Actions: Object: minerals Commands: - decr: resources + - lt: + Arguments: [resources, 10] + Commands: + - set_tile: 1 + - lt: + Arguments: [ resources, 5 ] + Commands: + - set_tile: 2 - eq: Arguments: [ resources, 0 ] Commands: - remove: true - Src: - Object: harvester + Object: worker Preconditions: + - eq: [ is_busy, 0 ] - gt: [ resources, 0 ] - eq: [ src._playerId, dst._playerId ] Commands: @@ -247,7 +339,9 @@ Actions: - Name: move Behaviours: - Src: - Object: [ harvester, combat, ranged, movable_wall ] + Preconditions: + - eq: [ is_busy, 0 ] + Object: [ worker, combat, ranged ] Commands: - mov: _dest # mov will move the object, _dest is the destination location of the action Dst: @@ -258,41 +352,79 @@ Actions: Commands: - mov: _dest # mov will move the object, _dest is the destination location of the action Dst: - Object: [ movable_wall, harvester, combat ] + Object: [ movable_wall, worker, combat ] Commands: - cascade: _dest # reapply the same action to the dest location of the action -#- Name: ranged_attack + # Name: ranged_attack - Name: attack Behaviours: + - Src: - Object: harvester + Object: worker Preconditions: - - neq: [src._playerId, dst._playerId] + - neq: [ src._playerId, dst._playerId ] + - eq: [ is_busy, 0 ] Commands: - reward: 1 Dst: - Object: [ combat, harvester, ranged, base ] + Object: [ combat, worker, ranged ] Commands: - sub: [ health, 1 ] - eq: Arguments: [ health, 0 ] Commands: - remove: true + - Src: Object: combat Preconditions: - - neq: [src._playerId, dst._playerId] + - neq: [ src._playerId, dst._playerId ] + - eq: [ is_busy, 0 ] Commands: - reward: 1 Dst: - Object: [ combat, harvester, ranged, base, barracks ] + Object: [ combat, worker, ranged, barracks ] Commands: - sub: [ health, 5 ] - eq: Arguments: [ 0, health ] Commands: - remove: true + - Src: + Object: combat + Preconditions: + - neq: [ src._playerId, dst._playerId ] + - eq: [ is_busy, 0 ] + Commands: + - reward: 1 + Dst: + Object: base + Commands: + - sub: [ health, 5 ] + - eq: + Arguments: [ health, 0 ] + Commands: + - reward: -10 + - remove: true + + - Src: + Object: worker + Preconditions: + - neq: [ src._playerId, dst._playerId ] + - eq: [ is_busy, 0 ] + Commands: + - reward: 1 + Dst: + Object: base + Commands: + - sub: [ health, 1 ] + - eq: + Arguments: [ health, 0 ] + Commands: + - reward: -10 + - remove: true + Objects: - Name: minerals @@ -308,15 +440,19 @@ Objects: Color: [ 0.0, 1.0, 0.0 ] Scale: 1.0 Isometric: - - Image: oryx/oryx_iso_dungeon/minerals-1.png + - Image: oryx/oryx_iso_dungeon/minerals-1-0.png + - Image: oryx/oryx_iso_dungeon/minerals-1-1.png + - Image: oryx/oryx_iso_dungeon/minerals-1-2.png - - Name: harvester + - Name: worker MapCharacter: H Variables: - Name: resources InitialValue: 0 - Name: health InitialValue: 10 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_jelly_d1.png @@ -331,7 +467,9 @@ Objects: MapCharacter: r Variables: - Name: health - InitialValue: 50 + InitialValue: 20 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_crawler_queen_d1.png @@ -346,7 +484,9 @@ Objects: MapCharacter: c Variables: - Name: health - InitialValue: 100 + InitialValue: 30 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_beast_d1.png @@ -383,10 +523,12 @@ Objects: - Image: oryx/oryx_iso_dungeon/crate-1.png - Name: base - MapCharacter: B + MapCharacter: A Variables: - Name: health - InitialValue: 500 + InitialValue: 50 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img324.png @@ -396,16 +538,38 @@ Objects: Isometric: - Image: oryx/oryx_iso_dungeon/base-1.png - - Name: barracks + - Name: barracks_disabled MapCharacter: b + InitialActions: + - Action: construct_barracks + Delay: 20 Variables: - Name: health - InitialValue: 400 + InitialValue: 20 + - Name: is_busy + InitialValue: 1 Observers: Sprite2D: - - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img324.png + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img280.png Block2D: - - Color: [ 0.8, 0.8, 0.3 ] + - Color: [ 0.3, 0.3, 0.3 ] Shape: triangle + Size: 0.5 Isometric: - - Image: oryx/oryx_iso_dungeon/base-1.png + - Image: oryx/oryx_iso_dungeon/barracks-disabled-1.png + + - Name: barracks + MapCharacter: B + Variables: + - Name: health + InitialValue: 40 + - Name: is_busy + InitialValue: 0 + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img320.png + Block2D: + - Color: [ 0.8, 0.3, 0.8 ] + Shape: triangle + Isometric: + - Image: oryx/oryx_iso_dungeon/barracks-1.png diff --git a/python/examples/experiments/rts/rts/models/impala_cnn.py b/python/examples/experiments/rts/rts/models/impala_cnn.py index 47dd4b6e8..b3182e156 100644 --- a/python/examples/experiments/rts/rts/models/impala_cnn.py +++ b/python/examples/experiments/rts/rts/models/impala_cnn.py @@ -1,45 +1,68 @@ from ray.rllib.models.torch.torch_modelv2 import TorchModelV2 from torch import nn -import numpy as np - +import torch from griddly.util.rllib.torch.agents.common import layer_init +class ResidualBlock(nn.Module): + def __init__(self, channels): + super().__init__() + self.conv0 = nn.Conv2d(in_channels=channels, out_channels=channels, kernel_size=3, padding=1) + self.conv1 = nn.Conv2d(in_channels=channels, out_channels=channels, kernel_size=3, padding=1) + + def forward(self, x): + inputs = x + x = torch.relu(x) + x = self.conv0(x) + x = torch.relu(x) + x = self.conv1(x) + return x + inputs + + +class ConvSequence(nn.Module): + def __init__(self, input_shape, out_channels): + super().__init__() + self._input_shape = input_shape + self._out_channels = out_channels + self.conv = nn.Conv2d(in_channels=self._input_shape[0], out_channels=self._out_channels, kernel_size=3, + padding=1) + self.res_block0 = ResidualBlock(self._out_channels) + self.res_block1 = ResidualBlock(self._out_channels) + + def forward(self, x): + x = self.conv(x) + x = torch.max_pool2d(x, kernel_size=3, stride=2, padding=1) + x = self.res_block0(x) + x = self.res_block1(x) + assert x.shape[1:] == self.get_output_shape() + return x + + def get_output_shape(self): + _c, h, w = self._input_shape + return (self._out_channels, (h + 1) // 2, (w + 1) // 2) + + class ImpalaCNNAgent(TorchModelV2, nn.Module): """ Simple Convolution agent that calculates the required linear output layer """ def __init__(self, obs_space, action_space, num_outputs, model_config, name): - super().__init__(obs_space, action_space, num_outputs, model_config, name) - nn.Module.__init__(self) - - self._num_objects = obs_space.shape[2] - self._num_actions = num_outputs - - linear_flatten = np.prod(obs_space.shape[:2])*64 - - self.network = nn.Sequential( - layer_init(nn.Conv2d(self._num_objects, 32, 3, padding=1)), - nn.ReLU(), - layer_init(nn.Conv2d(32, 64, 3, padding=1)), - nn.ReLU(), + conv_seqs = [] + shape = obs_space.shape + for out_channels in [16, 32, 32]: + conv_seq = ConvSequence(shape, out_channels) + shape = conv_seq.get_output_shape() + conv_seqs.append(conv_seq) + conv_seqs += [ nn.Flatten(), - layer_init(nn.Linear(linear_flatten, 1024)), - nn.ReLU(), - layer_init(nn.Linear(1024, 512)), nn.ReLU(), - ) - - self._actor_head = nn.Sequential( - layer_init(nn.Linear(512, 256), std=0.01), + nn.Linear(in_features=shape[0] * shape[1] * shape[2], out_features=256), nn.ReLU(), - layer_init(nn.Linear(256, self._num_actions), std=0.01) - ) - - self._critic_head = nn.Sequential( - layer_init(nn.Linear(512, 1), std=0.01) - ) + ] + self.network = nn.Sequential(*conv_seqs) + self._actor_head = layer_init(nn.Linear(256, num_outputs), std=0.01) + self._critic_head = layer_init(nn.Linear(256, 1), std=1) def forward(self, input_dict, state, seq_lens): obs_transformed = input_dict['obs'].permute(0, 3, 1, 2) @@ -50,4 +73,4 @@ def forward(self, input_dict, state, seq_lens): return logits, state def value_function(self): - return self._value \ No newline at end of file + return self._value diff --git a/python/examples/experiments/rts/rts/models/simple_conv.py b/python/examples/experiments/rts/rts/models/simple_conv.py index e69de29bb..e93b1465c 100644 --- a/python/examples/experiments/rts/rts/models/simple_conv.py +++ b/python/examples/experiments/rts/rts/models/simple_conv.py @@ -0,0 +1,51 @@ +from ray.rllib.models.torch.torch_modelv2 import TorchModelV2 +from torch import nn +import numpy as np + +from griddly.util.rllib.torch.agents.common import layer_init + +class SimpleConv(TorchModelV2, nn.Module): + def __init__(self, obs_space, action_space, num_outputs, model_config, name): + + super().__init__(obs_space, action_space, num_outputs, model_config, name) + nn.Module.__init__(self) + + self._num_objects = obs_space.shape[2] + self._num_actions = num_outputs + + linear_flatten = np.prod(obs_space.shape[:2]) * 64 + + self.network = nn.Sequential( + layer_init(nn.Conv2d(self._num_objects, 32, 3, padding=1)), + nn.ReLU(), + layer_init(nn.Conv2d(32, 64, 3, padding=1)), + nn.ReLU(), + nn.Flatten(), + layer_init(nn.Linear(linear_flatten, 1024)), + nn.ReLU(), + layer_init(nn.Linear(1024, 512)), + nn.ReLU(), + ) + + self._actor_head = nn.Sequential( + layer_init(nn.Linear(512, 256), std=0.01), + nn.ReLU(), + layer_init(nn.Linear(256, self._num_actions), std=0.01) + ) + + self._critic_head = nn.Sequential( + layer_init(nn.Linear(512, 1), std=0.01) + ) + + + def forward(self, input_dict, state, seq_lens): + obs_transformed = input_dict['obs'].permute(0, 3, 1, 2) + network_output = self.network(obs_transformed) + value = self._critic_head(network_output) + self._value = value.reshape(-1) + logits = self._actor_head(network_output) + return logits, state + + + def value_function(self): + return self._value diff --git a/python/examples/experiments/rts/rts_random_valid_actions.py b/python/examples/experiments/rts/rts_random_valid_actions.py index fa3c22d1d..42d93531a 100644 --- a/python/examples/experiments/rts/rts_random_valid_actions.py +++ b/python/examples/experiments/rts/rts_random_valid_actions.py @@ -3,6 +3,7 @@ from griddly import GymWrapperFactory, gd from griddly.util.wrappers import ValidActionSpaceWrapper + class EventFrequencyTracker(): def __init__(self, window_size): @@ -27,8 +28,8 @@ def get_frequencies(self): event_totals[key] += value event_averages = {} - for k,v in event_totals.items(): - event_averages[k] = v/self._window_size + for k, v in event_totals.items(): + event_averages[k] = v / self._window_size return event_totals @@ -38,8 +39,8 @@ def get_frequencies(self): wrapper.build_gym_from_yaml("GriddlyRTS-Adv", 'griddly_rts.yaml', - global_observer_type=gd.ObserverType.VECTOR, - player_observer_type=gd.ObserverType.ISOMETRIC, + global_observer_type=gd.ObserverType.ISOMETRIC, + player_observer_type=gd.ObserverType.VECTOR, level=0) env_original = gym.make(f'GDY-GriddlyRTS-Adv-v0') @@ -59,6 +60,11 @@ def get_frequencies(self): event_tracker.process(info['History']) - env.render() + env.render(observer='global') + + print(event_tracker.get_frequencies()) + + if done: + env.reset() - print(event_tracker.get_frequencies()) \ No newline at end of file + # env.reset() diff --git a/python/examples/experiments/rts/rts_self_play.py b/python/examples/experiments/rts/rts_self_play.py index 2515acce2..c0ba1bf92 100644 --- a/python/examples/experiments/rts/rts_self_play.py +++ b/python/examples/experiments/rts/rts_self_play.py @@ -18,6 +18,7 @@ parser = argparse.ArgumentParser(description='Run experiments') +parser.add_argument('--yaml-file', help='YAML file containing GDY for the game') parser.add_argument('--root-directory', default=os.path.expanduser("~/ray_results"), help='root directory for all data associated with the run') parser.add_argument('--num-gpus', default=1, type=int, help='Number of GPUs to make available to ray.') @@ -85,8 +86,8 @@ def _create_env(env_config): 'env': env_name, 'env_config': { 'generate_valid_action_trees': True, - 'yaml_file': '/home/bam4d/qmul/Griddly/python/examples/experiments/rts/griddly_rts.yaml', - 'global_observer_type': gd.ObserverType.SPRITE_2D, + 'yaml_file': args.yaml_file, + 'global_observer_type': gd.ObserverType.ISOMETRIC, 'level': 0, 'max_steps': 1000, }, diff --git a/resources/images/oryx/oryx_iso_dungeon/barracks-1.png b/resources/images/oryx/oryx_iso_dungeon/barracks-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4f259da210a77ea4b650b67d2900a0a4e99de5 GIT binary patch literal 737 zcmV<70v`Q|P)EX>4Tx04R}tkv&MmKp2MK{zyey9PCikAwzYtAS&XhRVYG*P%E_RU~=gnG-*gu zTpR`0f`dPcRRjWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#_&yDJC*>p7ih!I)0H{GPx>X zmKj!?e5#ZHSPZW03ghAhF~(FZvX%Q24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jv7C4K*kCCbB^Q000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0002ENklR9;3>eV`Dl41* z)6&BB_Bs?hnFcxpSg;Asnm3E;7NsSn5$^yFelfa*z~GDm7~t7(4u$_Ez=)uMFg;%a zj8NEQIe-`o@#!H(|KN^-4LAS6*#YWI^mhQQEFC&gaQN>>oN~6z{6t$47aTyI14yxi zREr016eudHFw~cn3|w_At!6~i>iFrcbA!A({_*h@T^%ssAu#HIQ7{Td!6*O#C*&qJ T%w45F00000NkvXXu0mjfKYKG* literal 0 HcmV?d00001 diff --git a/resources/images/oryx/oryx_iso_dungeon/barracks-disabled-1.png b/resources/images/oryx/oryx_iso_dungeon/barracks-disabled-1.png new file mode 100644 index 0000000000000000000000000000000000000000..37de3a3c5e8ea86d276dc4816992ba59bb3aa8ea GIT binary patch literal 721 zcmV;?0xtcDP)EX>4Tx04R}tkv&MmKp2MK{zyey9PCikAwzYtAS&XhRVYG*P%E_RU~=gnG-*gu zTpR`0f`dPcRRjWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#_&yDJC*>p7ih!I)0H{GPx>X zmKj!?e5#ZHSPZW03ghAhF~(FZvX%Q24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jv7C4LJ#iMeu?E000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001}NklR9;3>eV`Dl41* z)6&BB_Bs?hnFcxpSg;Asnm3E;7NsSn5$^yFelfa*z~GDm7iFrcbA!A({_*h@T^%ssAu#HIQ7{Td!6*O#*6broFx~8|00000NkvXXu0mjf Dv2ZMo literal 0 HcmV?d00001 diff --git a/resources/images/oryx/oryx_iso_dungeon/base-1.png b/resources/images/oryx/oryx_iso_dungeon/base-1.png index e266316d1adbe69ac2bb810c5ffcae6fd96d1194..6c56c8bc2bd59f60f59d3d6fae113fe872fd6666 100644 GIT binary patch delta 712 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 TQ(8!~00000NkvXXu0mjfsq~_8 literal 0 HcmV?d00001 diff --git a/resources/images/oryx/oryx_iso_dungeon/minerals-1-1.png b/resources/images/oryx/oryx_iso_dungeon/minerals-1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e6bd686acde29f06d4764b4101ae082e0cc30df8 GIT binary patch literal 891 zcmV->1BCpEP)EX>4Tx04R}tkv&MmKp2MK{zyey9PCikAwzYtAS&XhRVYG*P%E_RU~=gnG-*gu zTpR`0f`dPcRRjWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#_&yDJC*>p7ih!I)0H{GPx>X zmKj!?e5#ZHSPZW03ghAhF~(FZvX%Q24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jv7C4gd-gj*{B|000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0003}NklJx;_h5Jta56fPr?nrbx-6`EoTZombo z)2{Y7E84vW{T39tfVD@Uu;eD4DIk%P*vTvitw8g-_-DRn$5sL;ilQirqWoouC|ot% zdmmB~zb-~Z;qLV*c<*NtOJXU?OShVcLU-531c`;lfaU%_%7Gq}Mw1vrxYt75N z?Q>qR))q;DweXaLYpPlQJwKys-$!kRYnc5RaX0`JqpNn>idQqpBqR*iBY|A_NT8QU zt!P>>F6x>J)zOV4;_*x2vqNaDEvlnieFc5d?y!O38UT=*w-%nf1#1$0(c$?kU^-6{ zp1p=SiMXh>wwMOQ^CaQ3GmyHHuBnD?mKG(VAQ^Yjm+$J|e*OJY6h%?~Eg#4g_bH3H Rq`LqB002ovPDHLkV1l&EhUfqQ literal 0 HcmV?d00001 diff --git a/resources/images/oryx/oryx_iso_dungeon/minerals-1-2.png b/resources/images/oryx/oryx_iso_dungeon/minerals-1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..0b121e8fbd474f73c3714f89496cc57725ee3d73 GIT binary patch literal 752 zcmVEX>4Tx04R}tkv&MmKp2MK{zyey9PCikAwzYtAS&XhRVYG*P%E_RU~=gnG-*gu zTpR`0f`dPcRRjWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#_&yDJC*>p7ih!I)0H{GPx>X zmKj!?e5#ZHSPZW03ghAhF~(FZvX%Q24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jv7C4gex2J31i%000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0002TNklF%H5Y6o!F`u|sDk!vz?;gST)s9>=(P z4|hi{@Zu31n!JS#2ct_R1zr;2r zW)?@77I{2xzt=t1eIdGQtykshwo;&Zj~sv%s8XpvVR!(2qGym$t3GhzMs4rr9G@;dJR iLBc-)00000q`Uynscx{@xW_2~00007e03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00o3eL_t(o!|j(%Y+Pp* zhM)7zonMcCYR8#7Ho->FhNPrX10+Ep7KopM9VA2+U9mvwq7q2ZREl6R#Dj!E0@|tw zDJ-gr4J=xTsE$feiYf(x62(fKG)Y^N#!l;u|6-5r8Q-~c@BI#o*os4<#1qp6lHc8o zbk6sl_dD-7--S(VViTL##3ue

sc$_561~$c9Mhv828J_lIkNhn@SwX!9QYMst`( z1D<%kdkyKyoK+nVkpYwH&D|oV@=@P_@NM$1zV)@I=ih&-TAz5fstd0^9jWGj(BR?b zK`QS)LhkW>O#>&dT`Nph<}>kBE<{w0+Mo09Ig0;u{?m`zNQ zZ+LZW3Veh5DF|a=ERhBTkw;I*KEAs1Fzqc}P<<2X;~)+YThkUXur)$|su~1KZx}-% zwe9G|b-6%QKtY@cC$)r#ViiO~h&(jANSOtwSY|#v&GOPk#3T^oU<6c^&?=ck61TaH zY$A>0nEN;3?tJ{;p6a2$oLW9{buuV~5w0`XX*F8$LqQ^%(>J*;E`zEen{srvY~}2gI#csuDO6h+ zpDQ1qej%7#v1mhsNH6|+y5#vfq{>j-p@gV5#U0s|>)`YGE_yO~dNO(Tc6GDc?W8%L z5Mx9Wj+6v56b7-O=@)_$ptrB`#vUZ{*`MazEnB3|iD_}?){gx59^1*z&JLaTd;xeU zozzP+H{_4!FL7!5Mk$P>FgvTqhkr43*UDEByWh!A{&uf<`;7@Lovc=_^j5}*#BGZ= z<$7D%)2&X%*^+D_ZBooG)#bg}CI4Sz(-R}t=Z>BJaPIe|=c_Yob3D*C>9b6Bq{uffm57`dScV#YlpzHM^`hY;h&_!7(^ExZ#hC|3!{XY+@518U6z+(5Y@B SL>Y4c0000yg From 81b9596c94a796ea732f8fd907f2798ac44f517e Mon Sep 17 00:00:00 2001 From: Bam4d Date: Tue, 27 Apr 2021 16:50:18 +0100 Subject: [PATCH 13/29] fixing impalaCNN --- python/examples/experiments/rts/rts/models/impala_cnn.py | 6 +++++- python/examples/experiments/rts/rts_self_play.py | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/python/examples/experiments/rts/rts/models/impala_cnn.py b/python/examples/experiments/rts/rts/models/impala_cnn.py index b3182e156..70291c7fa 100644 --- a/python/examples/experiments/rts/rts/models/impala_cnn.py +++ b/python/examples/experiments/rts/rts/models/impala_cnn.py @@ -48,8 +48,12 @@ class ImpalaCNNAgent(TorchModelV2, nn.Module): """ def __init__(self, obs_space, action_space, num_outputs, model_config, name): + super().__init__(obs_space, action_space, num_outputs, model_config, name) + nn.Module.__init__(self) + conv_seqs = [] - shape = obs_space.shape + h, w, c = obs_space.shape + shape = (c, h, w) for out_channels in [16, 32, 32]: conv_seq = ConvSequence(shape, out_channels) shape = conv_seq.get_output_shape() diff --git a/python/examples/experiments/rts/rts_self_play.py b/python/examples/experiments/rts/rts_self_play.py index c0ba1bf92..12ae90d1c 100644 --- a/python/examples/experiments/rts/rts_self_play.py +++ b/python/examples/experiments/rts/rts_self_play.py @@ -46,8 +46,8 @@ sep = os.pathsep os.environ['PYTHONPATH'] = sep.join(sys.path) - ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus) - #ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus, local_mode=True) + #ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus) + ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus, local_mode=True) env_name = "griddly-rts-env" From 012f6902309736e6f9b41550a137f5fbc0833c0e Mon Sep 17 00:00:00 2001 From: Bam4d Date: Tue, 27 Apr 2021 17:07:48 +0100 Subject: [PATCH 14/29] remove the debug idiot --- python/examples/experiments/rts/rts_self_play.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/examples/experiments/rts/rts_self_play.py b/python/examples/experiments/rts/rts_self_play.py index 12ae90d1c..c0ba1bf92 100644 --- a/python/examples/experiments/rts/rts_self_play.py +++ b/python/examples/experiments/rts/rts_self_play.py @@ -46,8 +46,8 @@ sep = os.pathsep os.environ['PYTHONPATH'] = sep.join(sys.path) - #ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus) - ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus, local_mode=True) + ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus) + #ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus, local_mode=True) env_name = "griddly-rts-env" From aabb66d7efe6b424235b124e00ba81c88b1a7325 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Wed, 28 Apr 2021 13:44:21 +0100 Subject: [PATCH 15/29] recording stats about actions taken during episodes --- .../examples/experiments/rts/rts_self_play.py | 11 ++++++-- python/griddly/util/rllib/callbacks.py | 25 ++++++++++++++++++- python/griddly/util/rllib/environment/core.py | 11 ++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/python/examples/experiments/rts/rts_self_play.py b/python/examples/experiments/rts/rts_self_play.py index c0ba1bf92..7028ade69 100644 --- a/python/examples/experiments/rts/rts_self_play.py +++ b/python/examples/experiments/rts/rts_self_play.py @@ -18,6 +18,7 @@ parser = argparse.ArgumentParser(description='Run experiments') +parser.add_argument('--debug', action='store_true', help='Debug mode') parser.add_argument('--yaml-file', help='YAML file containing GDY for the game') parser.add_argument('--root-directory', default=os.path.expanduser("~/ray_results"), help='root directory for all data associated with the run') @@ -46,8 +47,11 @@ sep = os.pathsep os.environ['PYTHONPATH'] = sep.join(sys.path) - ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus) - #ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus, local_mode=True) + if args.debug: + ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus, local_mode=True) + else: + ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus) + env_name = "griddly-rts-env" @@ -89,8 +93,11 @@ def _create_env(env_config): 'yaml_file': args.yaml_file, 'global_observer_type': gd.ObserverType.ISOMETRIC, 'level': 0, + 'record_actions': True, 'max_steps': 1000, }, + 'lr': tune.grid_search([0.0005, 0.0001, 0.001]), + 'entropy_coeff': tune.grid_search([0.01, 0.001, 0.005]) # 'entropy_coeff_schedule': [ # [0, 0.01], # [max_training_steps, 0.0] diff --git a/python/griddly/util/rllib/callbacks.py b/python/griddly/util/rllib/callbacks.py index 5020262dd..0de8ae5d5 100644 --- a/python/griddly/util/rllib/callbacks.py +++ b/python/griddly/util/rllib/callbacks.py @@ -1,5 +1,5 @@ from typing import Optional, Dict - +from collections import Counter from ray.rllib import Policy, BaseEnv from ray.rllib.agents.callbacks import DefaultCallbacks from ray.rllib.evaluation import MultiAgentEpisode @@ -19,6 +19,26 @@ def on_episode_start(self, **kwargs) -> None: base_env.envs[env_index].on_episode_start(worker.worker_index, env_index) + self._action_frequency_trackers = [] + for p in range(1, 3): + self._action_frequency_trackers.append(Counter()) + + def on_episode_step(self, + *, + worker: "RolloutWorker", + base_env: BaseEnv, + episode: MultiAgentEpisode, + env_index: Optional[int] = None, + **kwargs) -> None: + + for p in range(1, 3): + info = episode.last_info_for(p) + if 'History' in info: + history = info['History'] + for event in history: + action_name = event['ActionName'] + self._action_frequency_trackers[p-1][action_name] += 1 + def on_episode_end(self, *, worker: "RolloutWorker", base_env: BaseEnv, policies: Dict[PolicyID, Policy], episode: MultiAgentEpisode, env_index: Optional[int] = None, **kwargs) -> None: info = episode.last_info_for(1) @@ -28,3 +48,6 @@ def on_episode_end(self, *, worker: "RolloutWorker", base_env: BaseEnv, policies path = video['path'] episode.media[f'level_{level}_1'] = Video(path) + for p in range(1, 3): + for action_name, frequency in self._action_frequency_trackers[p-1].items(): + episode.custom_metrics[f'agent_info/{p}/{action_name}'] = frequency diff --git a/python/griddly/util/rllib/environment/core.py b/python/griddly/util/rllib/environment/core.py index 3df3a5a7c..b625f758e 100644 --- a/python/griddly/util/rllib/environment/core.py +++ b/python/griddly/util/rllib/environment/core.py @@ -61,6 +61,8 @@ def __init__(self, env_config): self.include_agent_videos = self.record_video_config.get('include_agents', False) os.makedirs(self.video_directory, exist_ok=True) + self._enable_history = env_config.get('record_actions', False) + self.generate_valid_action_trees = env_config.get('generate_valid_action_trees', False) self._random_level_on_reset = env_config.get('random_level_on_reset', False) @@ -68,6 +70,8 @@ def __init__(self, env_config): self.set_transform() + self.enable_history(self._enable_history) + def _transform(self, observation): if self.player_count > 1: @@ -256,6 +260,13 @@ def step(self, action_dict: MultiAgentDict): else: info_map = self._to_multi_agent_map(defaultdict(dict)) + for event in info['History']: + event_player_id = event['PlayerId'] + if event_player_id != 0: + if 'History' not in info_map[event_player_id]: + info_map[event_player_id]['History'] = [] + info_map[event_player_id]['History'].append(event) + obs_map = self._to_multi_agent_map(obs) reward_map = self._to_multi_agent_map(reward) From e3a60a874fecdfbdec3d5a4c3720a5f587892bf6 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Fri, 30 Apr 2021 16:56:02 +0100 Subject: [PATCH 16/29] termination allowing reward allocations, fixing various bugs around rewards on termination, lots of testing --- bindings/wrapper/GameWrapper.cpp | 10 +- bindings/wrapper/StepPlayerWrapper.cpp | 2 +- .../examples/experiments/rts/griddly_rts.yaml | 12 +- .../rts/rts_random_valid_actions.py | 12 +- .../examples/experiments/rts/rts_self_play.py | 20 ++- resources/gdy-schema.json | 121 +++++++++++++----- src/Griddly/Core/GDY/GDYFactory.cpp | 63 ++++++--- src/Griddly/Core/GDY/GDYFactory.hpp | 3 + src/Griddly/Core/GDY/TerminationGenerator.cpp | 4 +- src/Griddly/Core/GDY/TerminationGenerator.hpp | 2 +- src/Griddly/Core/GDY/TerminationHandler.cpp | 17 ++- src/Griddly/Core/GDY/TerminationHandler.hpp | 7 +- src/Griddly/Core/GameProcess.hpp | 1 - src/Griddly/Core/Players/Player.cpp | 9 +- src/Griddly/Core/TurnBasedGameProcess.cpp | 33 +++-- src/Griddly/Core/TurnBasedGameProcess.hpp | 2 + tests/resources/loadEnvironment.yaml | 7 - tests/src/Griddly/Core/GDY/GDYFactoryTest.cpp | 111 +++++++++++++--- .../Core/GDY/TerminationHandlerTest.cpp | 28 +++- tests/src/Griddly/Core/GameProcessTest.cpp | 12 +- tests/src/Griddly/Core/Players/PlayerTest.cpp | 10 +- .../Core/GDY/MockTerminationGenerator.hpp | 2 +- 22 files changed, 347 insertions(+), 141 deletions(-) diff --git a/bindings/wrapper/GameWrapper.cpp b/bindings/wrapper/GameWrapper.cpp index 8e1a1f626..d0607839f 100644 --- a/bindings/wrapper/GameWrapper.cpp +++ b/bindings/wrapper/GameWrapper.cpp @@ -269,13 +269,17 @@ class Py_GameWrapper { auto playerStepResult = players_[p]->stepSingle(actionName, actionArray, lastPlayer); - playerRewards.push_back(playerStepResult[0].cast()); + //playerRewards.push_back(playerStepResult[0].cast()); if (lastPlayer) { - terminated = playerStepResult[1].cast(); - info = playerStepResult[2]; + terminated = playerStepResult[0].cast(); + info = playerStepResult[1]; } } + for(int p = 0; p < playerSize; p++) { + playerRewards.push_back(gameProcess_->getAccumulatedRewards(p+1)); + } + return py::make_tuple(playerRewards, terminated, info); } diff --git a/bindings/wrapper/StepPlayerWrapper.cpp b/bindings/wrapper/StepPlayerWrapper.cpp index 89675d56a..abd98bd9e 100644 --- a/bindings/wrapper/StepPlayerWrapper.cpp +++ b/bindings/wrapper/StepPlayerWrapper.cpp @@ -133,7 +133,7 @@ class Py_StepPlayerWrapper { py::tuple performActions(std::vector> actions, bool updateTicks) { auto actionResult = player_->performActions(actions, updateTicks); auto info = buildInfo(actionResult); - return py::make_tuple(actionResult.reward, actionResult.terminated, info); + return py::make_tuple(actionResult.terminated, info); } py::dict buildInfo(ActionResult actionResult) { diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml index 9c470b9dd..8e5c7f3fb 100644 --- a/python/examples/experiments/rts/griddly_rts.yaml +++ b/python/examples/experiments/rts/griddly_rts.yaml @@ -25,7 +25,10 @@ Environment: Count: 2 Termination: Lose: - - eq: [ base:count, 0 ] # If the player has no bases + - Conditions: + - eq: [ base:count, 0 ] # If the player has no bases + Reward: -10 # -10 for a loss + OpposingReward: 10 # as the agent didnt lose # Win: # - eq: [_score, 100] # First player to 10 reward points Levels: @@ -290,11 +293,10 @@ Actions: Commands: - sub: [ player_resources, 20 ] - reward: 1 + - spawn: barracks_disabled Dst: Object: _empty - Commands: - - spawn: barracks_disabled - Name: gather Behaviours: @@ -405,7 +407,6 @@ Actions: - eq: Arguments: [ health, 0 ] Commands: - - reward: -10 - remove: true - Src: @@ -422,7 +423,6 @@ Actions: - eq: Arguments: [ health, 0 ] Commands: - - reward: -10 - remove: true @@ -526,7 +526,7 @@ Objects: MapCharacter: A Variables: - Name: health - InitialValue: 50 + InitialValue: 1 - Name: is_busy InitialValue: 0 Observers: diff --git a/python/examples/experiments/rts/rts_random_valid_actions.py b/python/examples/experiments/rts/rts_random_valid_actions.py index 42d93531a..9a0c3cd3a 100644 --- a/python/examples/experiments/rts/rts_random_valid_actions.py +++ b/python/examples/experiments/rts/rts_random_valid_actions.py @@ -18,6 +18,12 @@ def process(self, events): action_name = e['ActionName'] self._frequency_trackers[-1][action_name] += 1 + if action_name == 'build_barracks': + print('barracks placed') + + if action_name == 'build_combat': + print('combat build') + self._frequency_trackers.pop(0) self._frequency_trackers.append(Counter()) @@ -53,16 +59,16 @@ def get_frequencies(self): event_tracker = EventFrequencyTracker(10) - for i in range(10000): + for i in range(100000): action = env.action_space.sample() obs, reward, done, info = env.step(action) event_tracker.process(info['History']) - env.render(observer='global') + #env.render(observer='global') - print(event_tracker.get_frequencies()) + #print(event_tracker.get_frequencies()) if done: env.reset() diff --git a/python/examples/experiments/rts/rts_self_play.py b/python/examples/experiments/rts/rts_self_play.py index 7028ade69..b817826c4 100644 --- a/python/examples/experiments/rts/rts_self_play.py +++ b/python/examples/experiments/rts/rts_self_play.py @@ -36,7 +36,7 @@ parser.add_argument('--video-directory', default='videos', help='directory of video') parser.add_argument('--video-frequency', type=int, default=1000000, help='Frequency of videos') -parser.add_argument('--seed', type=int, default=69420, help='seed for experiments') +parser.add_argument('--seed', type=int, default=1, help='seed for experiments') parser.add_argument('--lr', type=float, default=0.0005, help='learning rate') @@ -96,16 +96,14 @@ def _create_env(env_config): 'record_actions': True, 'max_steps': 1000, }, - 'lr': tune.grid_search([0.0005, 0.0001, 0.001]), - 'entropy_coeff': tune.grid_search([0.01, 0.001, 0.005]) - # 'entropy_coeff_schedule': [ - # [0, 0.01], - # [max_training_steps, 0.0] - # ], - # 'lr_schedule': [ - # [0, args.lr], - # [max_training_steps, 0.0] - # ], + 'entropy_coeff_schedule': [ + [0, 0.001], + [max_training_steps, 0.0] + ], + 'lr_schedule': [ + [0, args.lr], + [max_training_steps, 0.0] + ], } diff --git a/resources/gdy-schema.json b/resources/gdy-schema.json index 632c15347..a9198b1c4 100644 --- a/resources/gdy-schema.json +++ b/resources/gdy-schema.json @@ -304,114 +304,177 @@ "properties": { "Lose": { "$id": "#/properties/Environment/properties/Termination/properties/Lose", - "type": "array", "title": "Lose Conditions", "description": "If any of these conditions are met, the player associated with this condition will lose the game.", - "additionalItems": false, - "items": { - "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition" - } + "oneOf": [ + { + "type": "array", + "description": "V1 termination Conditions", + "additionalItems": false, + "items": { + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1" + } + }, + { + "type": "array", + "description": "V2 termination Conditions", + "additionalItems": false, + "items": { + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV2" + } + } + ] }, "Win": { "$id": "#/properties/Environment/properties/Termination/properties/Win", - "type": "array", "title": "Win Conditions", "description": "If any of these conditions are met, the player associated with this condition will win the game.", "additionalItems": false, - "items": { - "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition" - } + "oneOf": [ + { + "type": "array", + "description": "V1 termination Conditions", + "additionalItems": false, + "items": { + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1" + } + }, + { + "type": "array", + "description": "V2 termination Conditions", + "additionalItems": false, + "items": { + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV2" + } + } + ] }, "End": { "$id": "#/properties/Environment/properties/Termination/properties/End", - "type": "array", "title": "End Conditions", "description": "If any of these conditions are met, the game will end.", "additionalItems": false, - "items": { - "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition" - } + "oneOf": [ + { + "type": "array", + "description": "V1 termination Conditions", + "additionalItems": false, + "items": { + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1" + } + }, + { + "type": "array", + "description": "V2 termination Conditions", + "additionalItems": false, + "items": { + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV2" + } + } + ] } }, "definitions": { - "terminationCondition": { - "$id": "#/properties/Environment/properties/Termination/definitions/terminationCondition", + "terminationConditionV2": { + "Conditions": { + "$id": "#/properties/Environment/properties/Termination/properties/Conditions", + "type": "array", + "title": "Conditions", + "description": "If any of these conditions are met, the game will end and distribute rewards to the associated players.", + "additionalItems": false, + "items": { + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1" + } + }, + "Reward": { + "type": "integer", + "title": "Reward", + "description": "The reward given to the agent if this conditions is met." + }, + "OpposingReward": { + "type": "integer", + "title": "Opposing Reward", + "description": "The reward given to other agents if this condition is met." + } + }, + "terminationConditionV1": { + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1", "type": "object", - "title": "Termination Conditions", + "title": "Termination Conditions V1", "description": "When a termination condition is met, the game will reset itself. If there are multiple players, the termination arguments are expanded internally \"per player\". This can be used to find the first player to a certain number of objects, or the first player to reach a certain score", "maxProperties": 1, "additionalProperties": false, "properties": { "eq": { - "$id": "#/properties/Environment/properties/Termination/definitions/terminationCondition/properties/eq", + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/eq", "type": "array", "title": "Equals", "description": "Check if the arguments are equal", "minItems": 2, "maxItems": 2, "items": { - "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition/definitions/terminationArgument" + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument" } }, "neq": { - "$id": "#/properties/Environment/properties/Termination/definitions/terminationCondition/properties/neq", + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/neq", "type": "array", "title": "Not Equals", "description": "Check if the arguments are not equal", "minItems": 2, "maxItems": 2, "items": { - "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition/definitions/terminationArgument" + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument" } }, "gt": { - "$id": "#/properties/Environment/properties/Termination/definitions/terminationCondition/properties/gt", + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/gt", "type": "array", "title": "Greater Than", "description": "Check if the first argument is greater than the second", "minItems": 2, "maxItems": 2, "items": { - "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition/definitions/terminationArgument" + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument" } }, "gte": { - "$id": "#/properties/Environment/properties/Termination/definitions/terminationCondition/properties/gte", + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/gte", "type": "array", "title": "Greater Than Or Equal", "description": "Check if the first argument is greater than or equal to the second", "minItems": 2, "maxItems": 2, "items": { - "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition/definitions/terminationArgument" + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument" } }, "lt": { - "$id": "#/properties/Environment/properties/Termination/definitions/terminationCondition/properties/lt", + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/lt", "type": "array", "title": "Less Than", "description": "Check if the first argument is less than the second", "minItems": 2, "maxItems": 2, "items": { - "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition/definitions/terminationArgument" + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument" } }, "lte": { - "$id": "#/properties/Environment/properties/Termination/definitions/terminationCondition/properties/lte", + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/lte", "type": "array", "title": "Less Than Or Equal", "description": "Check if the first argument is less than or equal to the second", "minItems": 2, "maxItems": 2, "items": { - "$ref": "#/properties/Environment/properties/Termination/definitions/terminationCondition/definitions/terminationArgument" + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument" } } }, "definitions": { "terminationArgument": { - "$id": "#/properties/Environment/properties/Termination/definitions/terminationCondition/definitions/terminationArgument", + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument", "description": "An argument to the termination condition. If there are multiple players, then these arguments expand internally as \"per player\"", "title": "Termination Arguments", "oneOf": [ diff --git a/src/Griddly/Core/GDY/GDYFactory.cpp b/src/Griddly/Core/GDY/GDYFactory.cpp index f343b3ab5..7eecf7b7d 100644 --- a/src/Griddly/Core/GDY/GDYFactory.cpp +++ b/src/Griddly/Core/GDY/GDYFactory.cpp @@ -236,6 +236,41 @@ YAML::iterator GDYFactory::validateCommandPairNode(YAML::Node commandPairNodeLis return commandPairNodeList.begin(); } +void GDYFactory::parseTerminationConditionV1(TerminationState state, YAML::Node conditionNode) { + for (std::size_t c = 0; c < conditionNode.size(); c++) { + auto commandIt = validateCommandPairNode(conditionNode[c]); + auto commandName = commandIt->first.as(); + auto commandArguments = singleOrListNodeToList(commandIt->second); + + terminationGenerator_->defineTerminationCondition(state, commandName, 0, 0, commandArguments); + } +} + +bool GDYFactory::parseTerminationConditionV2(TerminationState state, YAML::Node conditionListNode) { + for (std::size_t c = 0; c < conditionListNode.size(); c++) { + auto conditionNode = conditionListNode[c]["Conditions"]; + if (!conditionNode.IsDefined()) { + return false; + } + + auto rewardNode = conditionListNode[c]["Reward"]; + auto opposingRewardNode = conditionListNode[c]["OpposingReward"]; + + auto reward = rewardNode.as(0); + auto opposingReward = opposingRewardNode.as(0); + + for (std::size_t c = 0; c < conditionNode.size(); c++) { + auto commandIt = validateCommandPairNode(conditionNode[c]); + auto commandName = commandIt->first.as(); + auto commandArguments = singleOrListNodeToList(commandIt->second); + + terminationGenerator_->defineTerminationCondition(state, commandName, reward, opposingReward, commandArguments); + } + } + + return true; +} + void GDYFactory::parseTerminationConditions(YAML::Node terminationNode) { if (!terminationNode.IsDefined()) { return; @@ -243,43 +278,31 @@ void GDYFactory::parseTerminationConditions(YAML::Node terminationNode) { auto winNode = terminationNode["Win"]; if (winNode.IsDefined()) { - spdlog::debug("Parsing win conditions."); - for (std::size_t c = 0; c < winNode.size(); c++) { - auto commandIt = validateCommandPairNode(winNode[c]); - auto commandName = commandIt->first.as(); - auto commandArguments = singleOrListNodeToList(commandIt->second); - - terminationGenerator_->defineTerminationCondition(TerminationState::WIN, commandName, commandArguments); + spdlog::debug("Parsing win conditions"); + if (!parseTerminationConditionV2(TerminationState::WIN, winNode)) { + parseTerminationConditionV1(TerminationState::WIN, winNode); } } auto loseNode = terminationNode["Lose"]; if (loseNode.IsDefined()) { spdlog::debug("Parsing lose conditions."); - for (std::size_t c = 0; c < loseNode.size(); c++) { - auto commandIt = validateCommandPairNode(loseNode[c]); - auto commandName = commandIt->first.as(); - auto commandArguments = singleOrListNodeToList(commandIt->second); - - terminationGenerator_->defineTerminationCondition(TerminationState::LOSE, commandName, commandArguments); + if (!parseTerminationConditionV2(TerminationState::LOSE, loseNode)) { + parseTerminationConditionV1(TerminationState::LOSE, loseNode); } } auto endNode = terminationNode["End"]; if (endNode.IsDefined()) { spdlog::debug("Parsing end conditions."); - for (std::size_t c = 0; c < endNode.size(); c++) { - auto commandIt = validateCommandPairNode(endNode[c]); - auto commandName = commandIt->first.as(); - auto commandArguments = singleOrListNodeToList(commandIt->second); - - terminationGenerator_->defineTerminationCondition(TerminationState::NONE, commandName, commandArguments); + if (!parseTerminationConditionV2(TerminationState::NONE, endNode)) { + parseTerminationConditionV1(TerminationState::NONE, endNode); } } } void GDYFactory::setMaxSteps(uint32_t maxSteps) { - terminationGenerator_->defineTerminationCondition(TerminationState::LOSE, "gt", {"_steps", std::to_string(maxSteps)}); + terminationGenerator_->defineTerminationCondition(TerminationState::LOSE, "gt", 0, 0, {"_steps", std::to_string(maxSteps)}); } void GDYFactory::parseGlobalVariables(YAML::Node variablesNode) { diff --git a/src/Griddly/Core/GDY/GDYFactory.hpp b/src/Griddly/Core/GDY/GDYFactory.hpp index 7ce748447..b7b936995 100644 --- a/src/Griddly/Core/GDY/GDYFactory.hpp +++ b/src/Griddly/Core/GDY/GDYFactory.hpp @@ -85,6 +85,9 @@ class GDYFactory { void parseGlobalVariables(YAML::Node variablesNode); + bool parseTerminationConditionV2(TerminationState state, YAML::Node conditionNode); + void parseTerminationConditionV1(TerminationState state, YAML::Node conditionNode); + void parseTerminationConditions(YAML::Node terminationNode); void parseIsometricSpriteObserverConfig(YAML::Node observerConfigNode); diff --git a/src/Griddly/Core/GDY/TerminationGenerator.cpp b/src/Griddly/Core/GDY/TerminationGenerator.cpp index 7ab390b47..4f197e4ba 100644 --- a/src/Griddly/Core/GDY/TerminationGenerator.cpp +++ b/src/Griddly/Core/GDY/TerminationGenerator.cpp @@ -6,13 +6,15 @@ namespace griddly { -void TerminationGenerator::defineTerminationCondition(TerminationState state, std::string commandName, std::vector commandArguments) { +void TerminationGenerator::defineTerminationCondition(TerminationState state, std::string commandName, int32_t reward, int32_t opposingReward, std::vector commandArguments) { spdlog::debug("Adding termination condition definition {0} [{1}, {2}]", commandName, commandArguments[0], commandArguments[1]); TerminationConditionDefinition tcd; tcd.commandName = commandName; tcd.commandArguments = commandArguments; tcd.state = state; + tcd.reward = reward; + tcd.opposingReward = opposingReward; terminationConditionDefinitions_.push_back(tcd); } diff --git a/src/Griddly/Core/GDY/TerminationGenerator.hpp b/src/Griddly/Core/GDY/TerminationGenerator.hpp index 518c22032..9bd0c2744 100644 --- a/src/Griddly/Core/GDY/TerminationGenerator.hpp +++ b/src/Griddly/Core/GDY/TerminationGenerator.hpp @@ -13,7 +13,7 @@ class Player; class TerminationGenerator { public: - virtual void defineTerminationCondition(TerminationState state, std::string commandName, std::vector commandArguments); + virtual void defineTerminationCondition(TerminationState state, std::string commandName, int32_t reward, int32_t opposingReward, std::vector commandArguments); virtual std::shared_ptr newInstance(std::shared_ptr grid, std::vector> players); private: diff --git a/src/Griddly/Core/GDY/TerminationHandler.cpp b/src/Griddly/Core/GDY/TerminationHandler.cpp index 88a6e7691..463fec8cb 100644 --- a/src/Griddly/Core/GDY/TerminationHandler.cpp +++ b/src/Griddly/Core/GDY/TerminationHandler.cpp @@ -27,7 +27,7 @@ TerminationHandler::TerminationHandler(std::shared_ptr grid, std::vector> variablePointers) { +TerminationFunction TerminationHandler::instantiateTerminationCondition(TerminationState state, std::string commandName, uint32_t playerId, int32_t reward, int32_t opposingReward, std::vector> variablePointers) { spdlog::debug("Adding termination condition={0} for player {1}", commandName, playerId); std::function condition; @@ -47,7 +47,7 @@ TerminationFunction TerminationHandler::instantiateTerminationCondition(Terminat throw std::invalid_argument(fmt::format("Unknown or badly defined condition command {0}.", commandName)); } - return [this, variablePointers, condition, playerId, state, commandName]() { + return [this, variablePointers, condition, playerId, state, reward, opposingReward, commandName]() { auto a = *(variablePointers[0]); auto b = *(variablePointers[1]); @@ -62,24 +62,27 @@ TerminationFunction TerminationHandler::instantiateTerminationCondition(Terminat } std::unordered_map playerTerminationStates; + std::unordered_map playerTerminationRewards; for (auto p : players_) { auto pid = p->getId(); if (pid == playerId || state == TerminationState::NONE) { playerTerminationStates[pid] = state; + playerTerminationRewards[pid] = state == TerminationState::NONE ? 0 : reward; } else { playerTerminationStates[pid] = oppositeState; + playerTerminationRewards[pid] = oppositeState == TerminationState::NONE ? 0 :opposingReward; } } return TerminationResult{ - true, playerTerminationStates}; + true, playerTerminationRewards, playerTerminationStates}; } return TerminationResult(); }; } -void TerminationHandler::resolveTerminationConditions(TerminationState state, std::string commandName, std::vector terminationVariables) { +void TerminationHandler::resolveTerminationConditions(TerminationState state, std::string commandName, int32_t reward, int32_t opposingReward, std::vector terminationVariables) { // Termination variables grows with the number of players in the game auto resolvedVariableSets = findVariables(terminationVariables); @@ -105,7 +108,7 @@ void TerminationHandler::resolveTerminationConditions(TerminationState state, st if(conditionArguments.size() > 1 && playerId == 0) { continue; } - terminationFunctions_.push_back(instantiateTerminationCondition(state, commandName, playerId, resolvedVariables)); + terminationFunctions_.push_back(instantiateTerminationCondition(state, commandName, playerId, reward, opposingReward, resolvedVariables)); } } @@ -113,8 +116,10 @@ void TerminationHandler::addTerminationCondition(TerminationConditionDefinition auto terminationState = terminationConditionDefinition.state; auto commandName = terminationConditionDefinition.commandName; auto commandArguments = terminationConditionDefinition.commandArguments; + auto reward = terminationConditionDefinition.reward; + auto opposingReward = terminationConditionDefinition.opposingReward; - resolveTerminationConditions(terminationState, commandName, commandArguments); + resolveTerminationConditions(terminationState, commandName, reward, opposingReward, commandArguments); } std::vector>> TerminationHandler::findVariables(std::vector variableArgs) { diff --git a/src/Griddly/Core/GDY/TerminationHandler.hpp b/src/Griddly/Core/GDY/TerminationHandler.hpp index 139326f30..b5a135aff 100644 --- a/src/Griddly/Core/GDY/TerminationHandler.hpp +++ b/src/Griddly/Core/GDY/TerminationHandler.hpp @@ -20,12 +20,15 @@ enum class TerminationState { struct TerminationResult { bool terminated = false; + std::unordered_map rewards; std::unordered_map playerStates; }; struct TerminationConditionDefinition { TerminationState state = TerminationState::NONE; std::string commandName; + int32_t reward; + int32_t opposingReward; std::vector commandArguments; }; @@ -38,8 +41,8 @@ class TerminationHandler { virtual void addTerminationCondition(TerminationConditionDefinition terminationConditionDefinition); private: - TerminationFunction instantiateTerminationCondition(TerminationState state, std::string commandName, uint32_t playerId, std::vector> variablePointers); - void resolveTerminationConditions(TerminationState state, std::string commandName, std::vector terminationVariables); + TerminationFunction instantiateTerminationCondition(TerminationState state, std::string commandName, uint32_t playerId, int32_t reward, int32_t opposingReward, std::vector> variablePointers); + void resolveTerminationConditions(TerminationState state, std::string commandName, int32_t reward, int32_t opposingReward, std::vector terminationVariables); std::vector>> findVariables(std::vector variables); std::vector terminationFunctions_; diff --git a/src/Griddly/Core/GameProcess.hpp b/src/Griddly/Core/GameProcess.hpp index b9eeaf0e9..12b82709b 100644 --- a/src/Griddly/Core/GameProcess.hpp +++ b/src/Griddly/Core/GameProcess.hpp @@ -15,7 +15,6 @@ class Player; struct ActionResult { std::unordered_map playerStates; bool terminated; - int32_t reward; }; struct ObjectInfo { diff --git a/src/Griddly/Core/Players/Player.cpp b/src/Griddly/Core/Players/Player.cpp index ead9e22cc..e6d51af77 100644 --- a/src/Griddly/Core/Players/Player.cpp +++ b/src/Griddly/Core/Players/Player.cpp @@ -47,7 +47,7 @@ void Player::reset() { void Player::setAvatar(std::shared_ptr avatarObject) { avatarObject_ = avatarObject; - if(observerTracksAvatar_) { + if (observerTracksAvatar_) { observer_->setAvatar(avatarObject); } } @@ -65,12 +65,7 @@ std::shared_ptr Player::getObserver() const { } ActionResult Player::performActions(std::vector> actions, bool updateTicks) { - auto actionResult = gameProcess_->performActions(id_, actions, updateTicks); - - // Update the player's score - *score_ += actionResult.reward; - - return actionResult; + return gameProcess_->performActions(id_, actions, updateTicks); } uint8_t* Player::observe() { diff --git a/src/Griddly/Core/TurnBasedGameProcess.cpp b/src/Griddly/Core/TurnBasedGameProcess.cpp index 0f8e039e4..621a001dc 100644 --- a/src/Griddly/Core/TurnBasedGameProcess.cpp +++ b/src/Griddly/Core/TurnBasedGameProcess.cpp @@ -22,16 +22,17 @@ TurnBasedGameProcess::~TurnBasedGameProcess() { ActionResult TurnBasedGameProcess::performActions(uint32_t playerId, std::vector> actions, bool updateTicks) { spdlog::debug("Performing turn based actions for player {0}", playerId); - if(requiresReset_) { + if (requiresReset_) { throw std::runtime_error("Environment is in a terminated state and requires resetting."); } std::unordered_map terminationState; - int32_t reward = 0; - auto stepRewards = grid_->performActions(playerId, actions); // rewards resulting from player actions + for (auto valueIt : stepRewards) { + spdlog::debug("Accumulating step reward for player {0}. {1} += {2}", valueIt.first, accumulatedRewards_[valueIt.first], valueIt.second); + } accumulateRewards(accumulatedRewards_, stepRewards); if (updateTicks) { @@ -39,6 +40,9 @@ ActionResult TurnBasedGameProcess::performActions(uint32_t playerId, std::vector auto delayedRewards = grid_->update(); // rewards could come from delayed actions that are run at a particular time step + for (auto valueIt : delayedRewards) { + spdlog::debug("Accumulating reward for player {0}. {1} += {2}", valueIt.first, accumulatedRewards_[valueIt.first], valueIt.second); + } accumulateRewards(accumulatedRewards_, delayedRewards); auto terminationResult = terminationHandler_->isTerminated(); @@ -46,18 +50,29 @@ ActionResult TurnBasedGameProcess::performActions(uint32_t playerId, std::vector terminationState = terminationResult.playerStates; requiresReset_ = terminationResult.terminated; + for (auto valueIt : terminationResult.rewards) { + spdlog::debug("Accumulating reward for player {0}. {1} += {2}", valueIt.first, accumulatedRewards_[valueIt.first], valueIt.second); + } + accumulateRewards(accumulatedRewards_, terminationResult.rewards); + if (requiresReset_ && autoReset_) { reset(); } } - if (accumulatedRewards_[playerId] != 0) { - reward = accumulatedRewards_[playerId]; - // reset reward for this player as they are being returned here - accumulatedRewards_[playerId] = 0; - } + // if (accumulatedRewards_[playerId] != 0) { + // reward = accumulatedRewards_[playerId]; + // // reset reward for this player as they are being returned here + // accumulatedRewards_[playerId] = 0; + // } + + return {terminationState, requiresReset_}; +} - return {terminationState, requiresReset_, reward}; +int32_t TurnBasedGameProcess::getAccumulatedRewards(uint32_t playerId) { + int32_t reward = accumulatedRewards_[playerId]; + accumulatedRewards_[playerId] = 0; + return reward; } // This is only used in tests diff --git a/src/Griddly/Core/TurnBasedGameProcess.hpp b/src/Griddly/Core/TurnBasedGameProcess.hpp index 1ee6fd0e5..1a9e676ee 100644 --- a/src/Griddly/Core/TurnBasedGameProcess.hpp +++ b/src/Griddly/Core/TurnBasedGameProcess.hpp @@ -20,6 +20,8 @@ class TurnBasedGameProcess : public GameProcess { void setTerminationHandler(std::shared_ptr terminationHandler); + int32_t getAccumulatedRewards(uint32_t playerId); + // Clone the Game Process std::shared_ptr clone(); diff --git a/tests/resources/loadEnvironment.yaml b/tests/resources/loadEnvironment.yaml index b0a15dd63..8e093a2c0 100644 --- a/tests/resources/loadEnvironment.yaml +++ b/tests/resources/loadEnvironment.yaml @@ -7,13 +7,6 @@ Environment: - Name: global_variable2 InitialValue: 0 PerPlayer: true - Termination: - Lose: - - eq: [base:count, 0] # If the player has no bases - Win: - - eq: [_score, 10] # Player wins if score get to this value - End: - - eq: [_steps, 100] # Max steps of 100 in this environment Player: Mode: SINGLE # MULTI, RTS Levels: diff --git a/tests/src/Griddly/Core/GDY/GDYFactoryTest.cpp b/tests/src/Griddly/Core/GDY/GDYFactoryTest.cpp index b90aa6134..4d324e727 100644 --- a/tests/src/Griddly/Core/GDY/GDYFactoryTest.cpp +++ b/tests/src/Griddly/Core/GDY/GDYFactoryTest.cpp @@ -46,18 +46,9 @@ TEST(GDYFactoryTest, loadEnvironment) { std::string objectName = "object"; - EXPECT_CALL(*mockObjectGeneratorPtr, getObjectNameFromMapChar) + EXPECT_CALL(*mockObjectGeneratorPtr, getObjectNameFromMapChar(Eq('W'))) .WillRepeatedly(ReturnRef(objectName)); - EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::LOSE), Eq("eq"), Eq(std::vector{"base:count", "0"}))) - .Times(1); - - EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::WIN), Eq("eq"), Eq(std::vector{"_score", "10"}))) - .Times(1); - - EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::NONE), Eq("eq"), Eq(std::vector{"_steps", "100"}))) - .Times(1); - gdyFactory->loadEnvironment(environmentNode); ASSERT_EQ(gdyFactory->getName(), "Test Environment"); @@ -73,7 +64,6 @@ TEST(GDYFactoryTest, loadEnvironment) { EXPECT_TRUE(Mock::VerifyAndClearExpectations(mockObjectGeneratorPtr.get())); } - TEST(GDYFactoryTest, loadEnvironment_VectorObserverConfig_playerId) { auto mockObjectGeneratorPtr = std::shared_ptr(new MockObjectGenerator()); auto mockTerminationGeneratorPtr = std::shared_ptr(new MockTerminationGenerator()); @@ -186,7 +176,7 @@ TEST(GDYFactoryTest, loadEnvironment_VectorObserverConfig_playerId_rotation_vari ASSERT_EQ(gdyFactory->getName(), "Test"); ASSERT_EQ(gdyFactory->getLevelCount(), 0); -auto config = gdyFactory->getVectorObserverConfig(); + auto config = gdyFactory->getVectorObserverConfig(); ASSERT_EQ(config.includePlayerId, true); ASSERT_EQ(config.includeRotation, true); @@ -354,6 +344,94 @@ TEST(GDYFactoryTest, loadEnvironment_ObserverNoAvatar) { EXPECT_TRUE(Mock::VerifyAndClearExpectations(mockObjectGeneratorPtr.get())); } +TEST(GDYFactoryTest, loadEnvironment_termination_v1) { + //auto mockObjectGeneratorPtr = std::shared_ptr(new MockObjectGenerator()); + auto mockTerminationGeneratorPtr = std::shared_ptr(new MockTerminationGenerator()); + auto gdyFactory = std::shared_ptr(new GDYFactory(nullptr, mockTerminationGeneratorPtr, {})); + auto yamlString = R"( + Environment: + Name: Test + Termination: + Lose: + - eq: [var1, -10] + - eq: [var2, -10] + Win: + - gt: [var2, 10] + End: + - lt: [var3, -1] +)"; + + auto environmentNode = loadFromStringAndGetNode(std::string(yamlString), "Environment"); + + EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::LOSE), Eq("eq"), Eq(0), Eq(0), Eq(std::vector{"var1", "-10"}))) + .Times(1); + EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::LOSE), Eq("eq"), Eq(0), Eq(0), Eq(std::vector{"var2", "-10"}))) + .Times(1); + EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::WIN), Eq("gt"), Eq(0), Eq(0), Eq(std::vector{"var2", "10"}))) + .Times(1); + EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::NONE), Eq("lt"), Eq(0), Eq(0), Eq(std::vector{"var3", "-1"}))) + .Times(1); + + gdyFactory->loadEnvironment(environmentNode); + + EXPECT_TRUE(Mock::VerifyAndClearExpectations(mockTerminationGeneratorPtr.get())); +} + +TEST(GDYFactoryTest, loadEnvironment_termination_v2) { + //auto mockObjectGeneratorPtr = std::shared_ptr(new MockObjectGenerator()); + auto mockTerminationGeneratorPtr = std::shared_ptr(new MockTerminationGenerator()); + auto gdyFactory = std::shared_ptr(new GDYFactory(nullptr, mockTerminationGeneratorPtr, {})); + auto yamlString = R"( + Environment: + Name: Test + Termination: + Lose: + - Conditions: + - eq: [var1, -10] + Reward: -5 + OpposingReward: 5 + - Conditions: + - eq: [var2, -10] + Reward: -15 + OpposingReward: 15 + Win: + - Conditions: + - gte: [var2, -10] + Reward: 15 + OpposingReward: -15 + - Conditions: + - gt: [var2, 10] + End: + - Conditions: + - eq: [var1, -10] + Reward: -5 + OpposingReward: 5 + - Conditions: + - lt: [var3, -1] +)"; + + auto environmentNode = loadFromStringAndGetNode(std::string(yamlString), "Environment"); + + EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::LOSE), Eq("eq"), Eq(-5), Eq(5), Eq(std::vector{"var1", "-10"}))) + .Times(1); + EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::LOSE), Eq("eq"), Eq(-15), Eq(15), Eq(std::vector{"var2", "-10"}))) + .Times(1); + + EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::WIN), Eq("gte"), Eq(15), Eq(-15), Eq(std::vector{"var2", "-10"}))) + .Times(1); + EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::WIN), Eq("gt"), Eq(0), Eq(0), Eq(std::vector{"var2", "10"}))) + .Times(1); + + EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::NONE), Eq("eq"), Eq(-5), Eq(5), Eq(std::vector{"var1", "-10"}))) + .Times(1); + EXPECT_CALL(*mockTerminationGeneratorPtr, defineTerminationCondition(Eq(TerminationState::NONE), Eq("lt"), Eq(0), Eq(0), Eq(std::vector{"var3", "-1"}))) + .Times(1); + + gdyFactory->loadEnvironment(environmentNode); + + EXPECT_TRUE(Mock::VerifyAndClearExpectations(mockTerminationGeneratorPtr.get())); +} + TEST(GDYFactoryTest, loadObjects) { auto mockObjectGeneratorPtr = std::shared_ptr(new MockObjectGenerator()); auto mockTerminationGeneratorPtr = std::shared_ptr(new MockTerminationGenerator()); @@ -793,8 +871,6 @@ MATCHER_P(InputMappingMatcherEq, expectedActionInputsDefinitions, "") { if (expectedInputMapping.description != actualInputMapping.description) { return false; } - - } } @@ -897,10 +973,7 @@ TEST(GDYFactoryTest, action_input_map_to_grid) { gdyFactory->loadActions(actionsNode); std::unordered_map expectedInputMappings{ - {"spawn", {{}, - false, - false, - true}}}; + {"spawn", {{}, false, false, true}}}; ASSERT_THAT(gdyFactory->getActionInputsDefinitions(), InputMappingMatcherEq(expectedInputMappings)); } @@ -980,6 +1053,6 @@ TEST(GDYFactoryTest, action_input_internal_mapping) { true}}}; ASSERT_THAT(gdyFactory->getActionInputsDefinitions(), InputMappingMatcherEq(expectedInputMappings)); -} // namespace griddly +} } // namespace griddly \ No newline at end of file diff --git a/tests/src/Griddly/Core/GDY/TerminationHandlerTest.cpp b/tests/src/Griddly/Core/GDY/TerminationHandlerTest.cpp index 9a732e373..e11a1cf49 100644 --- a/tests/src/Griddly/Core/GDY/TerminationHandlerTest.cpp +++ b/tests/src/Griddly/Core/GDY/TerminationHandlerTest.cpp @@ -48,6 +48,8 @@ TEST(TerminationHandlerTest, terminateOnPlayerScore) { TerminationConditionDefinition tcd; tcd.commandName = "eq"; + tcd.reward = 1; + tcd.opposingReward = -1; tcd.commandArguments = {"_score", "10"}; tcd.state = TerminationState::WIN; terminationHandlerPtr->addTerminationCondition(tcd); @@ -56,6 +58,7 @@ TEST(TerminationHandlerTest, terminateOnPlayerScore) { ASSERT_TRUE(terminationResult.terminated); ASSERT_THAT(terminationResult.playerStates, UnorderedElementsAre(Pair(1, TerminationState::WIN), Pair(2, TerminationState::LOSE))); + ASSERT_THAT(terminationResult.rewards, UnorderedElementsAre(Pair(1, 1), Pair(2, -1))); } TEST(TerminationHandlerTest, terminateOnPlayerObjects0) { @@ -95,6 +98,8 @@ TEST(TerminationHandlerTest, terminateOnPlayerObjects0) { // Player with 0 bases will end the game and "lose" TerminationConditionDefinition tcd; tcd.commandName = "eq"; + tcd.reward = 1; + tcd.opposingReward = -1; tcd.commandArguments = {"base:count", "0"}; tcd.state = TerminationState::LOSE; terminationHandlerPtr->addTerminationCondition(tcd); @@ -103,6 +108,7 @@ TEST(TerminationHandlerTest, terminateOnPlayerObjects0) { ASSERT_TRUE(terminationResult.terminated); ASSERT_THAT(terminationResult.playerStates, UnorderedElementsAre(Pair(1, TerminationState::WIN), Pair(2, TerminationState::LOSE))); + ASSERT_THAT(terminationResult.rewards, UnorderedElementsAre(Pair(1, -1), Pair(2, 1))); } TEST(TerminationHandlerTest, terminateOnGlobalVariable) { @@ -138,9 +144,10 @@ TEST(TerminationHandlerTest, terminateOnGlobalVariable) { auto terminationHandlerPtr = std::shared_ptr(new TerminationHandler(mockGridPtr, players)); - // Player with 0 bases will end the game and "lose" TerminationConditionDefinition tcd; tcd.commandName = "eq"; + tcd.reward = 1; + tcd.opposingReward = -1; tcd.commandArguments = {"variable_name", "20"}; terminationHandlerPtr->addTerminationCondition(tcd); @@ -148,6 +155,7 @@ TEST(TerminationHandlerTest, terminateOnGlobalVariable) { ASSERT_TRUE(terminationResult.terminated); ASSERT_THAT(terminationResult.playerStates, UnorderedElementsAre(Pair(1, TerminationState::NONE), Pair(2, TerminationState::NONE))); + ASSERT_THAT(terminationResult.rewards, UnorderedElementsAre(Pair(1, 0), Pair(2, 0))); } TEST(TerminationHandlerTest, terminateOnPlayerGlobalVariable) { @@ -190,6 +198,8 @@ TEST(TerminationHandlerTest, terminateOnPlayerGlobalVariable) { // Player with variable_name == 20 will win and the other player will lose TerminationConditionDefinition tcd; tcd.commandName = "eq"; + tcd.reward = 1; + tcd.opposingReward = -1; tcd.state = TerminationState::WIN; tcd.commandArguments = {"variable_name", "0"}; terminationHandlerPtr->addTerminationCondition(tcd); @@ -198,6 +208,7 @@ TEST(TerminationHandlerTest, terminateOnPlayerGlobalVariable) { ASSERT_TRUE(terminationResult.terminated); ASSERT_THAT(terminationResult.playerStates, UnorderedElementsAre(Pair(1, TerminationState::WIN), Pair(2, TerminationState::LOSE))); + ASSERT_THAT(terminationResult.rewards, UnorderedElementsAre(Pair(1, 1), Pair(2, -1))); } TEST(TerminationHandlerTest, terminateOnMaxTicks) { @@ -237,6 +248,8 @@ TEST(TerminationHandlerTest, terminateOnMaxTicks) { TerminationConditionDefinition tcd; tcd.commandName = "eq"; + tcd.reward = 1; + tcd.opposingReward = -1; tcd.commandArguments = {"_steps", "100"}; tcd.state = TerminationState::NONE; terminationHandlerPtr->addTerminationCondition(tcd); @@ -245,6 +258,7 @@ TEST(TerminationHandlerTest, terminateOnMaxTicks) { ASSERT_TRUE(terminationResult.terminated); ASSERT_THAT(terminationResult.playerStates, UnorderedElementsAre(Pair(1, TerminationState::NONE), Pair(2, TerminationState::NONE))); + ASSERT_THAT(terminationResult.rewards, UnorderedElementsAre(Pair(1, 0), Pair(2, 0))); } TEST(TerminationHandlerTest, singlePlayer_differentId_win) { @@ -270,6 +284,8 @@ TEST(TerminationHandlerTest, singlePlayer_differentId_win) { TerminationConditionDefinition tcd; tcd.commandName = "eq"; + tcd.reward = 1; + tcd.opposingReward = -1; tcd.commandArguments = {"environment_objects:count", "0"}; tcd.state = TerminationState::WIN; terminationHandlerPtr->addTerminationCondition(tcd); @@ -278,6 +294,7 @@ TEST(TerminationHandlerTest, singlePlayer_differentId_win) { ASSERT_TRUE(terminationResult.terminated); ASSERT_THAT(terminationResult.playerStates, UnorderedElementsAre(Pair(1, TerminationState::WIN))); + ASSERT_THAT(terminationResult.rewards, UnorderedElementsAre(Pair(1, -1))); } TEST(TerminationHandlerTest, singlePlayer_differentId_lose) { @@ -303,6 +320,8 @@ TEST(TerminationHandlerTest, singlePlayer_differentId_lose) { TerminationConditionDefinition tcd; tcd.commandName = "eq"; + tcd.reward = -1; + tcd.opposingReward = 1; tcd.commandArguments = {"environment_objects:count", "0"}; tcd.state = TerminationState::LOSE; terminationHandlerPtr->addTerminationCondition(tcd); @@ -311,6 +330,7 @@ TEST(TerminationHandlerTest, singlePlayer_differentId_lose) { ASSERT_TRUE(terminationResult.terminated); ASSERT_THAT(terminationResult.playerStates, UnorderedElementsAre(Pair(1, TerminationState::LOSE))); + ASSERT_THAT(terminationResult.rewards, UnorderedElementsAre(Pair(1, 1))); } TEST(TerminationHandlerTest, singlePlayer_sameId_lose) { @@ -336,6 +356,8 @@ TEST(TerminationHandlerTest, singlePlayer_sameId_lose) { TerminationConditionDefinition tcd; tcd.commandName = "eq"; + tcd.reward = -1; + tcd.opposingReward = 1; tcd.commandArguments = {"player_objects:count", "0"}; tcd.state = TerminationState::LOSE; terminationHandlerPtr->addTerminationCondition(tcd); @@ -344,6 +366,7 @@ TEST(TerminationHandlerTest, singlePlayer_sameId_lose) { ASSERT_TRUE(terminationResult.terminated); ASSERT_THAT(terminationResult.playerStates, UnorderedElementsAre(Pair(1, TerminationState::LOSE))); + ASSERT_THAT(terminationResult.rewards, UnorderedElementsAre(Pair(1, -1))); } TEST(TerminationHandlerTest, singlePlayer_sameId_win) { @@ -369,6 +392,8 @@ TEST(TerminationHandlerTest, singlePlayer_sameId_win) { TerminationConditionDefinition tcd; tcd.commandName = "eq"; + tcd.reward = 1; + tcd.opposingReward = -1; tcd.commandArguments = {"player_objects:count", "0"}; tcd.state = TerminationState::WIN; terminationHandlerPtr->addTerminationCondition(tcd); @@ -377,6 +402,7 @@ TEST(TerminationHandlerTest, singlePlayer_sameId_win) { ASSERT_TRUE(terminationResult.terminated); ASSERT_THAT(terminationResult.playerStates, UnorderedElementsAre(Pair(1, TerminationState::WIN))); + ASSERT_THAT(terminationResult.rewards, UnorderedElementsAre(Pair(1, 1))); } } // namespace griddly \ No newline at end of file diff --git a/tests/src/Griddly/Core/GameProcessTest.cpp b/tests/src/Griddly/Core/GameProcessTest.cpp index 169143ada..ddb77b651 100644 --- a/tests/src/Griddly/Core/GameProcessTest.cpp +++ b/tests/src/Griddly/Core/GameProcessTest.cpp @@ -601,7 +601,7 @@ TEST(GameProcessTest, performActions) { ASSERT_FALSE(result.terminated); - ASSERT_EQ(result.reward, 14); + ASSERT_EQ(gameProcessPtr->getAccumulatedRewards(1), 14); EXPECT_TRUE(Mock::VerifyAndClearExpectations(mockGridPtr.get())); EXPECT_TRUE(Mock::VerifyAndClearExpectations(mockObserverPtr.get())); @@ -696,9 +696,9 @@ TEST(GameProcessTest, performActionsMultiAgentRewards) { ASSERT_FALSE(result2.terminated); ASSERT_FALSE(result3.terminated); - ASSERT_EQ(result1.reward, 10); - ASSERT_EQ(result2.reward, -5); - ASSERT_EQ(result3.reward, 15); + ASSERT_EQ(gameProcessPtr->getAccumulatedRewards(player1Id), 10); + ASSERT_EQ(gameProcessPtr->getAccumulatedRewards(player2Id), -5); + ASSERT_EQ(gameProcessPtr->getAccumulatedRewards(player3Id), 15); EXPECT_TRUE(Mock::VerifyAndClearExpectations(mockGridPtr.get())); EXPECT_TRUE(Mock::VerifyAndClearExpectations(mockObserverPtr.get())); @@ -769,7 +769,9 @@ TEST(GameProcessTest, performActionsDelayedReward) { ASSERT_FALSE(result.terminated); - ASSERT_EQ(result.reward, 19); + ASSERT_EQ(gameProcessPtr->getAccumulatedRewards(1), 19); + ASSERT_EQ(gameProcessPtr->getAccumulatedRewards(2), 3); + ASSERT_EQ(gameProcessPtr->getAccumulatedRewards(5), 3); EXPECT_TRUE(Mock::VerifyAndClearExpectations(mockGridPtr.get())); EXPECT_TRUE(Mock::VerifyAndClearExpectations(mockPlayerPtr.get())); diff --git a/tests/src/Griddly/Core/Players/PlayerTest.cpp b/tests/src/Griddly/Core/Players/PlayerTest.cpp index d060c221a..90cf965ae 100644 --- a/tests/src/Griddly/Core/Players/PlayerTest.cpp +++ b/tests/src/Griddly/Core/Players/PlayerTest.cpp @@ -44,14 +44,11 @@ TEST(PlayerTest, performActions) { EXPECT_CALL(*mockGameProcessPtr, performActions(Eq(playerId), Eq(actionsList), Eq(true))) .Times(1) - .WillOnce(Return(ActionResult{{}, false, 10})); + .WillOnce(Return(ActionResult{{}, false})); auto actionResult = player->performActions(actionsList); - auto reward = actionResult.reward; auto terminated = actionResult.terminated; - ASSERT_THAT(reward, 10); - EXPECT_EQ(*player->getScore(), 10); EXPECT_FALSE(terminated); EXPECT_TRUE(Mock::VerifyAndClearExpectations(mockGameProcessPtr.get())); @@ -74,15 +71,12 @@ TEST(PlayerTest, performActions_terminated) { EXPECT_CALL(*mockGameProcessPtr, performActions(Eq(playerId), Eq(actionsList), Eq(true))) .Times(1) - .WillOnce(Return(ActionResult{{{1, TerminationState::WIN}}, true, 10})); + .WillOnce(Return(ActionResult{{{1, TerminationState::WIN}}, true})); auto actionResult = player->performActions(actionsList); - auto reward = actionResult.reward; auto terminated = actionResult.terminated; auto states = actionResult.playerStates; - ASSERT_THAT(reward, 10); - EXPECT_EQ(*player->getScore(), 10); EXPECT_EQ(states, (std::unordered_map{{1, TerminationState::WIN}})); EXPECT_TRUE(terminated); diff --git a/tests/src/Mocks/Griddly/Core/GDY/MockTerminationGenerator.hpp b/tests/src/Mocks/Griddly/Core/GDY/MockTerminationGenerator.hpp index a2fe76ba9..3058b7b39 100644 --- a/tests/src/Mocks/Griddly/Core/GDY/MockTerminationGenerator.hpp +++ b/tests/src/Mocks/Griddly/Core/GDY/MockTerminationGenerator.hpp @@ -10,7 +10,7 @@ class MockTerminationGenerator : public TerminationGenerator { public: MockTerminationGenerator() : TerminationGenerator(){}; - MOCK_METHOD(void, defineTerminationCondition, (TerminationState state, std::string commandName, std::vector commandParameters), ()); + MOCK_METHOD(void, defineTerminationCondition, (TerminationState state, std::string commandName, int32_t reward, int32_t opposingReward, std::vector commandParameters), ()); MOCK_METHOD(std::shared_ptr, newInstance, (std::shared_ptr grid, std::vector> players), ()); }; } // namespace griddly \ No newline at end of file From 401a0a5fa4cdb491bd673c58a6b6410817ebffd1 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 3 May 2021 21:08:28 +0100 Subject: [PATCH 17/29] do not allow actions beyond boundaries of the grid --- .../examples/experiments/rts/griddly_rts.yaml | 3 +-- .../conditional_action_exploration.py | 8 ++++++- src/Griddly/Core/GDY/Objects/Object.cpp | 22 +++++++++++++++---- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml index 8e5c7f3fb..2860eeb52 100644 --- a/python/examples/experiments/rts/griddly_rts.yaml +++ b/python/examples/experiments/rts/griddly_rts.yaml @@ -294,7 +294,6 @@ Actions: - sub: [ player_resources, 20 ] - reward: 1 - spawn: barracks_disabled - Dst: Object: _empty @@ -526,7 +525,7 @@ Objects: MapCharacter: A Variables: - Name: health - InitialValue: 1 + InitialValue: 50 - Name: is_busy InitialValue: 0 Observers: diff --git a/python/griddly/util/rllib/torch/conditional_actions/conditional_action_exploration.py b/python/griddly/util/rllib/torch/conditional_actions/conditional_action_exploration.py index ba4731769..4e6842d3b 100644 --- a/python/griddly/util/rllib/torch/conditional_actions/conditional_action_exploration.py +++ b/python/griddly/util/rllib/torch/conditional_actions/conditional_action_exploration.py @@ -36,7 +36,13 @@ def _mask_and_sample(self, subtrees, logits): mask = torch.zeros_like(logits).to(self.device) for i in range(self._num_inputs): - mask[i][list(subtrees[i].keys())] = 1 + try: + mask[i][list(subtrees[i].keys())] = 1 + except IndexError as e: + print(e) + print(list(subtrees[i].keys())) + print(subtrees) + raise e masked_logits = logits + torch.log(mask) diff --git a/src/Griddly/Core/GDY/Objects/Object.cpp b/src/Griddly/Core/GDY/Objects/Object.cpp index e45f82f2b..69b994610 100644 --- a/src/Griddly/Core/GDY/Objects/Object.cpp +++ b/src/Griddly/Core/GDY/Objects/Object.cpp @@ -212,8 +212,7 @@ BehaviourFunction Object::instantiateBehaviour(std::string commandName, Behaviou if (commandName == "reward") { auto value = commandArguments["0"].as(0); return [this, value](std::shared_ptr action) -> BehaviourResult { - - // if the object has a player Id, the reward will be given to that object's player, + // if the object has a player Id, the reward will be given to that object's player, // otherwise the reward will be given to the player which has performed the action auto rewardPlayer = getPlayerId() == 0 ? action->getOriginatingPlayerId() : getPlayerId(); @@ -377,7 +376,6 @@ BehaviourFunction Object::instantiateBehaviour(std::string commandName, Behaviou // Resolve source object return [this, actionName, delay, randomize, actionId, actionExecutor](std::shared_ptr action) -> BehaviourResult { - InputMapping fallbackInputMapping; fallbackInputMapping.vectorToDest = action->getVectorToDest(); fallbackInputMapping.orientationVector = action->getOrientationVector(); @@ -478,7 +476,23 @@ void Object::addActionDstBehaviour( bool Object::isValidAction(std::shared_ptr action) const { auto actionName = action->getActionName(); auto destinationObject = action->getDestinationObject(); - auto destinationObjectName = destinationObject == nullptr ? "_empty" : destinationObject->getObjectName(); + + std::string destinationObjectName; + if (destinationObject == nullptr) { + auto width = grid_->getWidth(); + auto height = grid_->getHeight(); + + // Check that the destination of the action is not outside the grid + auto destinationLocation = action->getDestinationLocation(); + if (destinationLocation.x >= width || destinationLocation.x < 0 || + destinationLocation.y >= height || destinationLocation.y < 0) { + return false; + } + + destinationObjectName = "_empty"; + } else { + destinationObjectName = destinationObject->getObjectName(); + } spdlog::debug("Checking preconditions for action [{0}] -> {1} -> {2}", getObjectName(), actionName, destinationObjectName); From 951ea7393d69b1aa21c49687ff52e0741df4afd4 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Tue, 4 May 2021 20:32:07 +0100 Subject: [PATCH 18/29] fixing tests and splitting callbacks into modules --- bindings/wrapper/StepPlayerWrapper.cpp | 25 ++-- .../examples/experiments/rts/griddly_rts.yaml | 36 +----- .../examples/experiments/rts/rts_self_play.py | 7 +- python/griddly/util/rllib/callbacks.py | 120 +++++++++++++++--- src/Griddly/Core/GameProcess.cpp | 6 + src/Griddly/Core/GameProcess.hpp | 5 + src/Griddly/Core/TurnBasedGameProcess.cpp | 12 -- src/Griddly/Core/TurnBasedGameProcess.hpp | 3 - 8 files changed, 133 insertions(+), 81 deletions(-) diff --git a/bindings/wrapper/StepPlayerWrapper.cpp b/bindings/wrapper/StepPlayerWrapper.cpp index abd98bd9e..06bfd90bb 100644 --- a/bindings/wrapper/StepPlayerWrapper.cpp +++ b/bindings/wrapper/StepPlayerWrapper.cpp @@ -106,23 +106,30 @@ class Py_StepPlayerWrapper { } } - return performActions(actions, updateTicks); + auto actionResult = player_->performActions(actions, updateTicks); + auto info = buildInfo(actionResult); + auto rewards = gameProcess_->getAccumulatedRewards(player_->getId()); + return py::make_tuple(rewards, actionResult.terminated, info); + } py::tuple stepSingle(std::string actionName, std::vector actionArray, bool updateTicks) { - auto gameProcess = player_->getGameProcess(); - - if (gameProcess != nullptr && !gameProcess->isInitialized()) { + if (gameProcess_ != nullptr && !gameProcess_->isInitialized()) { throw std::invalid_argument("Cannot send player commands when game has not been initialized."); } auto action = buildAction(actionName, actionArray); + ActionResult actionResult; if (action != nullptr) { - return performActions({action}, updateTicks); + actionResult = player_->performActions({action}, updateTicks); } else { - return performActions({}, updateTicks); + actionResult = player_->performActions({}, updateTicks); } + + auto info = buildInfo(actionResult); + + return py::make_tuple(actionResult.terminated, info); } private: @@ -130,12 +137,6 @@ class Py_StepPlayerWrapper { const std::shared_ptr gdyFactory_; const std::shared_ptr gameProcess_; - py::tuple performActions(std::vector> actions, bool updateTicks) { - auto actionResult = player_->performActions(actions, updateTicks); - auto info = buildInfo(actionResult); - return py::make_tuple(actionResult.terminated, info); - } - py::dict buildInfo(ActionResult actionResult) { py::dict py_info; diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml index 2860eeb52..b54518097 100644 --- a/python/examples/experiments/rts/griddly_rts.yaml +++ b/python/examples/experiments/rts/griddly_rts.yaml @@ -369,7 +369,7 @@ Actions: Commands: - reward: 1 Dst: - Object: [ combat, worker, ranged ] + Object: [ base, combat, worker, ranged ] Commands: - sub: [ health, 1 ] - eq: @@ -385,45 +385,13 @@ Actions: Commands: - reward: 1 Dst: - Object: [ combat, worker, ranged, barracks ] + Object: [ base, combat, worker, ranged, barracks ] Commands: - sub: [ health, 5 ] - eq: Arguments: [ 0, health ] Commands: - remove: true - - Src: - Object: combat - Preconditions: - - neq: [ src._playerId, dst._playerId ] - - eq: [ is_busy, 0 ] - Commands: - - reward: 1 - Dst: - Object: base - Commands: - - sub: [ health, 5 ] - - eq: - Arguments: [ health, 0 ] - Commands: - - remove: true - - - Src: - Object: worker - Preconditions: - - neq: [ src._playerId, dst._playerId ] - - eq: [ is_busy, 0 ] - Commands: - - reward: 1 - Dst: - Object: base - Commands: - - sub: [ health, 1 ] - - eq: - Arguments: [ health, 0 ] - Commands: - - remove: true - Objects: - Name: minerals diff --git a/python/examples/experiments/rts/rts_self_play.py b/python/examples/experiments/rts/rts_self_play.py index b817826c4..df8c34de4 100644 --- a/python/examples/experiments/rts/rts_self_play.py +++ b/python/examples/experiments/rts/rts_self_play.py @@ -9,7 +9,7 @@ from rts.models import ImpalaCNNAgent from griddly import gd -from griddly.util.rllib.callbacks import GriddlyCallbacks +from griddly.util.rllib.callbacks import MultiCallback, VideoCallback, ActionTrackerCallback from griddly.util.rllib.environment.core import RLlibMultiAgentWrapper, RLlibEnv from griddly.util.rllib.torch.conditional_actions.conditional_action_policy_trainer import \ ConditionalActionImpalaTrainer @@ -81,7 +81,10 @@ def _create_env(env_config): 'train_batch_size': args.train_batch_size, - 'callbacks': GriddlyCallbacks, + 'callbacks': MultiCallback([ + VideoCallback, + ActionTrackerCallback + ]), 'model': { 'custom_model': 'ImpalaCNN', diff --git a/python/griddly/util/rllib/callbacks.py b/python/griddly/util/rllib/callbacks.py index 0de8ae5d5..9a784126a 100644 --- a/python/griddly/util/rllib/callbacks.py +++ b/python/griddly/util/rllib/callbacks.py @@ -1,13 +1,65 @@ from typing import Optional, Dict from collections import Counter -from ray.rllib import Policy, BaseEnv +from ray.rllib import Policy, BaseEnv, SampleBatch from ray.rllib.agents.callbacks import DefaultCallbacks from ray.rllib.evaluation import MultiAgentEpisode -from ray.rllib.utils.typing import PolicyID +from ray.rllib.utils.typing import PolicyID, AgentID from wandb import Video -class GriddlyCallbacks(DefaultCallbacks): +class MultiCallback(DefaultCallbacks): + + def __init__(self, callback_class_list): + super().__init__() + self._callback_class_list = callback_class_list + + self._callback_list = [] + + def __call__(self, *args, **kwargs): + self._callback_list = [callback_class() for callback_class in self._callback_class_list] + + return self + + def on_episode_start(self, *, worker: "RolloutWorker", base_env: BaseEnv, policies: Dict[PolicyID, Policy], + episode: MultiAgentEpisode, env_index: Optional[int] = None, **kwargs) -> None: + for callback in self._callback_list: + callback.on_episode_start(worker=worker, base_env=base_env, policies=policies, episode=episode, + env_index=env_index, **kwargs) + + def on_episode_step(self, *, worker: "RolloutWorker", base_env: BaseEnv, episode: MultiAgentEpisode, + env_index: Optional[int] = None, **kwargs) -> None: + for callback in self._callback_list: + callback.on_episode_step(worker=worker, base_env=base_env, episode=episode, env_index=env_index, **kwargs) + + def on_episode_end(self, *, worker: "RolloutWorker", base_env: BaseEnv, policies: Dict[PolicyID, Policy], + episode: MultiAgentEpisode, env_index: Optional[int] = None, **kwargs) -> None: + for callback in self._callback_list: + callback.on_episode_end(worker=worker, base_env=base_env, policies=policies, episode=episode, + env_index=env_index, **kwargs) + + def on_postprocess_trajectory(self, *, worker: "RolloutWorker", episode: MultiAgentEpisode, agent_id: AgentID, + policy_id: PolicyID, policies: Dict[PolicyID, Policy], + postprocessed_batch: SampleBatch, original_batches: Dict[AgentID, SampleBatch], + **kwargs) -> None: + for callback in self._callback_list: + callback.on_postprocess_trajectory(worker=worker, episode=episode, agent_id=agent_id, policy_id=policy_id, + policies=policies, postprocessed_batch=postprocessed_batch, + original_batches=original_batches, **kwargs) + + def on_sample_end(self, *, worker: "RolloutWorker", samples: SampleBatch, **kwargs) -> None: + for callback in self._callback_list: + callback.on_sample_end(worker=worker, samples=samples, **kwargs) + + def on_learn_on_batch(self, *, policy: Policy, train_batch: SampleBatch, result: dict, **kwargs) -> None: + for callback in self._callback_list: + callback.on_learn_on_batch(policy=policy, train_batch=train_batch, result=result, **kwargs) + + def on_train_result(self, *, trainer, result: dict, **kwargs) -> None: + for callback in self._callback_list: + callback.on_train_result(trainer=trainer, result=result, **kwargs) + + +class VideoCallback(DefaultCallbacks): def on_episode_start(self, *, @@ -19,9 +71,41 @@ def on_episode_start(self, **kwargs) -> None: base_env.envs[env_index].on_episode_start(worker.worker_index, env_index) - self._action_frequency_trackers = [] - for p in range(1, 3): - self._action_frequency_trackers.append(Counter()) + def on_episode_end(self, + *, + worker: "RolloutWorker", + base_env: BaseEnv, + policies: Dict[PolicyID, Policy], + episode: MultiAgentEpisode, + env_index: Optional[int] = None, + **kwargs) -> None: + info = episode.last_info_for(1) + if 'videos' in info: + for video in info['videos']: + level = video['level'] + path = video['path'] + episode.media[f'level_{level}_1'] = Video(path) + + +class ActionTrackerCallback(DefaultCallbacks): + + def __init__(self): + super().__init__() + + self._action_frequency_trackers = {} + + def on_episode_start(self, + *, + worker: "RolloutWorker", + base_env: BaseEnv, + policies: Dict[PolicyID, Policy], + episode: MultiAgentEpisode, + env_index: Optional[int] = None, + **kwargs) -> None: + num_players = base_env.envs[env_index].player_count + self._action_frequency_trackers[episode.episode_id] = [] + for p in range(0, num_players): + self._action_frequency_trackers[episode.episode_id].append(Counter()) def on_episode_step(self, *, @@ -31,23 +115,23 @@ def on_episode_step(self, env_index: Optional[int] = None, **kwargs) -> None: - for p in range(1, 3): - info = episode.last_info_for(p) + num_players = base_env.envs[env_index].player_count + + for p in range(0, num_players): + info = episode.last_info_for(p+1) if 'History' in info: history = info['History'] for event in history: action_name = event['ActionName'] - self._action_frequency_trackers[p-1][action_name] += 1 + self._action_frequency_trackers[episode.episode_id][p][action_name] += 1 def on_episode_end(self, *, worker: "RolloutWorker", base_env: BaseEnv, policies: Dict[PolicyID, Policy], episode: MultiAgentEpisode, env_index: Optional[int] = None, **kwargs) -> None: - info = episode.last_info_for(1) - if 'videos' in info: - for video in info['videos']: - level = video['level'] - path = video['path'] - episode.media[f'level_{level}_1'] = Video(path) - for p in range(1, 3): - for action_name, frequency in self._action_frequency_trackers[p-1].items(): - episode.custom_metrics[f'agent_info/{p}/{action_name}'] = frequency + num_players = base_env.envs[env_index].player_count + + for p in range(0, num_players): + for action_name, frequency in self._action_frequency_trackers[episode.episode_id][p].items(): + episode.custom_metrics[f'agent_info/{p+1}/{action_name}'] = frequency + + del self._action_frequency_trackers[episode.episode_id] diff --git a/src/Griddly/Core/GameProcess.cpp b/src/Griddly/Core/GameProcess.cpp index c30e4bb80..17b4e202c 100644 --- a/src/Griddly/Core/GameProcess.cpp +++ b/src/Griddly/Core/GameProcess.cpp @@ -214,6 +214,12 @@ std::shared_ptr GameProcess::getObserver() { return observer_; } +int32_t GameProcess::getAccumulatedRewards(uint32_t playerId) { + int32_t reward = accumulatedRewards_[playerId]; + accumulatedRewards_[playerId] = 0; + return reward; +} + std::unordered_map> GameProcess::getAvailableActionNames(uint32_t playerId) const { std::unordered_map> availableActionNames; diff --git a/src/Griddly/Core/GameProcess.hpp b/src/Griddly/Core/GameProcess.hpp index 12b82709b..9fda11877 100644 --- a/src/Griddly/Core/GameProcess.hpp +++ b/src/Griddly/Core/GameProcess.hpp @@ -53,6 +53,8 @@ class GameProcess : public std::enable_shared_from_this { bool isInitialized(); + virtual int32_t getAccumulatedRewards(uint32_t playerId); + virtual std::string getProcessName() const; std::shared_ptr getGrid(); @@ -96,6 +98,9 @@ class GameProcess : public std::enable_shared_from_this { // track whether this environment has finished or not, if it requires a reset, we can reset it bool requiresReset_ = true; + // Tracks the rewards currently accumulated per player + std::unordered_map accumulatedRewards_; + private: void resetObservers(); ObserverConfig getObserverConfig(ObserverType observerType) const; diff --git a/src/Griddly/Core/TurnBasedGameProcess.cpp b/src/Griddly/Core/TurnBasedGameProcess.cpp index 621a001dc..eca4e6635 100644 --- a/src/Griddly/Core/TurnBasedGameProcess.cpp +++ b/src/Griddly/Core/TurnBasedGameProcess.cpp @@ -60,21 +60,9 @@ ActionResult TurnBasedGameProcess::performActions(uint32_t playerId, std::vector } } - // if (accumulatedRewards_[playerId] != 0) { - // reward = accumulatedRewards_[playerId]; - // // reset reward for this player as they are being returned here - // accumulatedRewards_[playerId] = 0; - // } - return {terminationState, requiresReset_}; } -int32_t TurnBasedGameProcess::getAccumulatedRewards(uint32_t playerId) { - int32_t reward = accumulatedRewards_[playerId]; - accumulatedRewards_[playerId] = 0; - return reward; -} - // This is only used in tests void TurnBasedGameProcess::setTerminationHandler(std::shared_ptr terminationHandler) { terminationHandler_ = terminationHandler; diff --git a/src/Griddly/Core/TurnBasedGameProcess.hpp b/src/Griddly/Core/TurnBasedGameProcess.hpp index 1a9e676ee..376f75916 100644 --- a/src/Griddly/Core/TurnBasedGameProcess.hpp +++ b/src/Griddly/Core/TurnBasedGameProcess.hpp @@ -20,13 +20,10 @@ class TurnBasedGameProcess : public GameProcess { void setTerminationHandler(std::shared_ptr terminationHandler); - int32_t getAccumulatedRewards(uint32_t playerId); - // Clone the Game Process std::shared_ptr clone(); private: static const std::string name_; - std::unordered_map accumulatedRewards_; }; } // namespace griddly \ No newline at end of file From 03d2e76b6d879638db7a52ff54563a3a8109f907 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Wed, 5 May 2021 14:49:35 +0100 Subject: [PATCH 19/29] cleaning up some bits, adding rts example, adding docs for rts --- .gitmodules | 5 +- docs/_static/custom.css | 4 + .../observation spaces/index.rst | 1 + docs/rllib/intro/img/agent_info_example.png | Bin 0 -> 260824 bytes docs/rllib/intro/index.rst | 70 ++- docs/rllib/rts/index.rst | 113 +++- .../examples/experiments/rts/griddly_rts.yaml | 542 ------------------ .../examples/experiments/rts/rts/__init__.py | 0 .../experiments/rts/rts/models/__init__.py | 1 - .../experiments/rts/rts/models/simple_conv.py | 51 -- .../rts/rts_random_valid_actions.py | 76 --- .../examples/experiments/rts/rts_self_play.py | 133 ----- .../experiments/rts/tests/rts_tests.py | 164 ------ python/examples/rllib/rllib_rts.py | 76 +++ python/griddly/util/rllib/environment/core.py | 17 +- .../util/rllib/torch/agents}/impala_cnn.py | 0 resources/games/RTS/GriddlyRTS.yaml | 453 ++++++++++----- 17 files changed, 594 insertions(+), 1112 deletions(-) create mode 100644 docs/rllib/intro/img/agent_info_example.png delete mode 100644 python/examples/experiments/rts/griddly_rts.yaml delete mode 100644 python/examples/experiments/rts/rts/__init__.py delete mode 100644 python/examples/experiments/rts/rts/models/__init__.py delete mode 100644 python/examples/experiments/rts/rts/models/simple_conv.py delete mode 100644 python/examples/experiments/rts/rts_random_valid_actions.py delete mode 100644 python/examples/experiments/rts/rts_self_play.py delete mode 100644 python/examples/experiments/rts/tests/rts_tests.py create mode 100644 python/examples/rllib/rllib_rts.py rename python/{examples/experiments/rts/rts/models => griddly/util/rllib/torch/agents}/impala_cnn.py (100%) diff --git a/.gitmodules b/.gitmodules index c7835f09c..db530b4e9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,4 +14,7 @@ path=python/examples/experiments/conditional-action-trees url=https://github.com/Bam4d/conditional-action-trees ignore = dirty - +[submodule "python/examples/experiments/rts-self-play"] + path = python/examples/experiments/rts-self-play + url = https://github.com/Bam4d/rts-self-play + ignore = dirty diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 35d16c7e1..aae786a78 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -16,4 +16,8 @@ .game-gallery p { margin: 10px !important; white-space: normal !important; +} + +.embedded-video { + text-align: center; } \ No newline at end of file diff --git a/docs/getting-started/observation spaces/index.rst b/docs/getting-started/observation spaces/index.rst index c2f3802f6..03c0acd50 100644 --- a/docs/getting-started/observation spaces/index.rst +++ b/docs/getting-started/observation spaces/index.rst @@ -226,6 +226,7 @@ A breakdown of the entire environment including internal variable values that th ] } +.. _event_history: ************* Event History diff --git a/docs/rllib/intro/img/agent_info_example.png b/docs/rllib/intro/img/agent_info_example.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6133047262f9984d0bb54430eb716a39eb63d9 GIT binary patch literal 260824 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≷N|D?rL{yo;abhrAds`b1M)^V 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 literal 0 HcmV?d00001 diff --git a/docs/rllib/intro/index.rst b/docs/rllib/intro/index.rst index b5cae6d73..a381959ec 100644 --- a/docs/rllib/intro/index.rst +++ b/docs/rllib/intro/index.rst @@ -248,6 +248,11 @@ GAPAgent .. seealso:: You can read more about agents that use Global Average Pooling here: https://arxiv.org/abs/2005.11247 +************************** +Weights and Biases (WandB) +************************** + + **************** Recording Videos @@ -260,16 +265,75 @@ Griddly can automatically record videos during training by placing the ``record_ 'env_config': 'record_video_config': { 'frequency': 20000 + 'directory': '/home/griddlyuser/my_experiment_videos' + 'include_global': True, + 'include_agents': False, }, ... } -Videos are recorded using the global observer. This allows multi agent environments to be viewed from the perspective of the whole game rather than the individual observations of the agents. +.. warning:: the ``directory`` value must be an absolute path, as the working directory of workers is controlled by Ray. + +Videos can be recorded from the perspective of the agent and the perspective of the global observer. ``include_global`` and ``include_agents`` will set which videos are recorded. + +.. seealso:: For more information on how to configure observers see :ref:`Observation Spaces ` The triggering of videos is configured using the ``frequency`` variable. The ``frequency`` variable refers to the number of steps in each environment that pass before the recording is triggered. -Once triggered, the next episode is recorded in full. Videos of episodes are recorded on every ray environment. +Once triggered, the next episode is recorded in full. Videos of episodes are recorded on the first environment in every worker in RLLib. + +Uploading Videos to WandB +========================= + +To automatically upload videos to WandB, the ``VideoCallback`` can be set in the RLLib config: + +.. code-block:: python + + 'config': { + ..., + + 'callbacks': VideoCallback, + + ... + } + + +***************************** +Recording Environment Actions +***************************** + +.. figure:: img/agent_info_example.png + :align: center + + An example of logged events for each agent in an environment during training. Can help to diagnose problems with reward shaping and track exploration. -.. seealso:: For more information on how to configure observers see :ref:`Observation Spaces ` \ No newline at end of file +Griddly's RLLib integration hooks into the :ref:`Event History ` and records all the frequency of the actions that are being taken by agents during training. +This event history can then be picked up in the agent's ``info`` in RLLib's callback methods, e,g ``on_episode_step`` + +.. code-block:: python + + 'env_config': + 'record_actions': True, + + ... + } + + + +Uploading Environment Events to WandB +===================================== + + +To automatically upload action events to WandB, the ``ActionTrackerCallback`` can be set in the RLLib config: + +.. code-block:: python + + 'config': { + ..., + + 'callbacks': ActionTrackerCallback, + + ... + } diff --git a/docs/rllib/rts/index.rst b/docs/rllib/rts/index.rst index 620783ab5..9abd34afb 100644 --- a/docs/rllib/rts/index.rst +++ b/docs/rllib/rts/index.rst @@ -4,4 +4,115 @@ Real Time Strategy ################## -Coming Soon! \ No newline at end of file +Griddly also supports Strategy games! Strategy games in the context of Griddly are games where the player can control multiple "units" at at a single time. + +RTS environments similar to multi-agent environments, but the units are controlled by individually selecting them and then performing actions. In this example, only a single action can be send to a particular unit on each turn. + + +************************ +Conditional Action Trees +************************ + +This example uses Conditional Action Trees in order to handle multiple units and invalid action masking. Conditional Action Trees are implemented in RLLib in the ``ConditionalActionImpalaTrainer``. + +.. seealso:: For more information on Conditional Action Trees, see the github repository: https://github.com/Bam4d/conditional-action-trees and the paper: https://arxiv.org/abs/2104.07294. + +************ +Full Example +************ + +.. raw:: html + + + +In this example, self-play is used to train the agent controlling both armies. We are using a single IMPALA-CNN policy to teach both agents. This means the policy must learn to play from both perspectives (starting from the bottom of the map or the top). + +.. code-block:: python + + import os + import sys + + import ray + from ray import tune + from ray.rllib.models import ModelCatalog + from ray.tune.registry import register_env + from rts.models import ImpalaCNNAgent + + from griddly import gd + from griddly.util.rllib.callbacks import MultiCallback, ActionTrackerCallback + from griddly.util.rllib.environment.core import RLlibMultiAgentWrapper, RLlibEnv + from griddly.util.rllib.torch.conditional_actions.conditional_action_policy_trainer import \ + ConditionalActionImpalaTrainer + + if __name__ == '__main__': + sep = os.pathsep + os.environ['PYTHONPATH'] = sep.join(sys.path) + + ray.init(num_gpus=1) + + env_name = "griddly-rts-env" + + + def _create_env(env_config): + env = RLlibEnv(env_config) + return RLlibMultiAgentWrapper(env, env_config) + + + register_env(env_name, _create_env) + ModelCatalog.register_custom_model("ImpalaCNN", ImpalaCNNAgent) + + max_training_steps = 100000000 + + config = { + 'framework': 'torch', + ' + 'num_workers': 8, + 'num_envs_per_worker': 5, + + 'callbacks': ActionTrackerCallback, + + 'model': { + 'custom_model': 'ImpalaCNN', + 'custom_model_config': {} + }, + 'env': env_name, + 'env_config': { + 'generate_valid_action_trees': True, + 'yaml_file': 'RTS/Griddly_RTS.yaml', + 'global_observer_type': gd.ObserverType.ISOMETRIC, + 'level': 0, + 'record_actions': True, + 'max_steps': 1000, + }, + + 'record_video_config': { + 'frequency': 20000, # number of rollouts + 'directory': 'videos' + }, + + 'entropy_coeff_schedule': [ + [0, 0.001], + [max_training_steps, 0.0] + ], + 'lr_schedule': [ + [0, args.lr], + [max_training_steps, 0.0] + ], + + } + + stop = { + "timesteps_total": max_training_steps, + } + + result = tune.run(ConditionalActionImpalaTrainer, config=config, stop=stop) + diff --git a/python/examples/experiments/rts/griddly_rts.yaml b/python/examples/experiments/rts/griddly_rts.yaml deleted file mode 100644 index b54518097..000000000 --- a/python/examples/experiments/rts/griddly_rts.yaml +++ /dev/null @@ -1,542 +0,0 @@ -Version: "0.1" -Environment: - Name: GriddlyRTS - Description: An RTS Game. There's aliens and stuff. - Observers: - Sprite2D: - TileSize: 16 - BackgroundTile: oryx/oryx_tiny_galaxy/tg_sliced/tg_world/tg_world_floor_panel_metal_a.png - Isometric: - TileSize: [ 32, 48 ] - #TileSize: [ 64, 96 ] - BackgroundTile: oryx/oryx_iso_dungeon/floor-1.png - IsoTileHeight: 16 - #IsoTileHeight: 32 - IsoTileDepth: 4 - #IsoTileDepth: 8 - Vector: - IncludePlayerId: true - IncludeVariables: true - Variables: - - Name: player_resources - InitialValue: 0 - PerPlayer: true - Player: - Count: 2 - Termination: - Lose: - - Conditions: - - eq: [ base:count, 0 ] # If the player has no bases - Reward: -10 # -10 for a loss - OpposingReward: 10 # as the agent didnt lose - # Win: - # - eq: [_score, 100] # First player to 10 reward points - Levels: - - | - M M . . . . . . . . . . . . . . - M M . . . . . . . . . . . . . . - . . A1 H1 . . . . . . . . . . . . - . . H1 . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . H2 . . - . . . . . . . . . . . . H2 A2 . . - . . . . . . . . . . . . . . M M - . . . . . . . . . . . . . . M M -# - | -# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W -# W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W -# W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W -# W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W -# W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W -# W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . M M M M . . . . . . . . . . W -# W . . . . . . . . . . . . . . M M M M M M . . . . . . . . W -# W . . . . . . . . . . . . . M . . M . M M . . . . . . . . W -# W . . . . . . . . . . . . . M M M M M M M . . . . . . . . W -# W . . . . . . . . . . . . . . . M M M M . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W -# W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W -# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W -# - | -# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W -# W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W -# W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W -# W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W -# W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W -# W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W -# W W W W W W W W W . . . . . . . . . . . . . . W W W W W w W -# W . . . . . . W W . . . w w w w w w . . . . . W W W W W w W -# W . . . . . . . . . . . . . w w . . . . . . . W W W W W w W -# W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W -# W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W -# W . . . . . . . . . . . . . . M M M M . . . . W W W W W w W -# W . . . . P1 w . . . . . . . . M M M M M M . W W W W W W W W -# W . . . . P1 w . . . . . . . M . . M . M M . . . . . . . . W -# W . . . . P2 w . . . . . . . M M M M M M M . . . . . . . . W -# W . . . . P2 w . . . . . . . . . M M M M . . . . . . . . . W -# W . . . . P1 w . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W -# W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W -# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W -# - | -# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W -# W . . . . M M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . M M M M W -# W . . . . . M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . M M W -# W . . . . . . M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . H2 . . M W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . B2 H2 . M W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W W W w w W W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W . . W W W W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W W W W W W W W W W W W W w w w w w w w w w w w w w W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W M . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W M M . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W M M M . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W W W W W W W W W W W . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . W W W W W W W W W W W -# W . . . . . . . . . . . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . . . . . . . . M M M W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . M M W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . M W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . W w w w w w w w w w w w w w W W W W W W W W W W W W W . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W -# W W W W . . W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W w w W W W W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W M . H1 B1 . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W -# W M . . H1 . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M . . . . . . W -# W M M . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M M . . . . . W -# W M M M M . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W M M M . . . . W -# W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - -Actions: - - Name: spawn_worker - InputMapping: - Internal: true - Behaviours: - - Src: - Object: base - Commands: - - spawn: worker - - set: [ is_busy, 0 ] - Dst: - Object: _empty - - - Src: - Object: base - Dst: - Object: [ base, barracks, combat, worker, ranged, movable_wall ] - Commands: - # Try to spawn in another location on the next tick - - exec: - Action: spawn_worker - Delay: 1 - Randomize: true - - Name: spawn_combat - InputMapping: - Internal: true - Behaviours: - - Src: - Object: barracks - Commands: - - spawn: combat - - set: [ is_busy, 0 ] - Dst: - Object: _empty - - - Src: - Object: barracks - Dst: - Object: [ base, barracks, combat, worker, ranged, movable_wall ] - Commands: - # Try to spawn in another location on the next tick - - exec: - Action: spawn_combat - Delay: 1 - Randomize: true - - - Name: construct_barracks - InputMapping: - Inputs: - 1: - Description: Completes construction of a barracks - VectorToDest: [ 0, 0 ] - Internal: true - Behaviours: - - Src: - Object: barracks_disabled - Commands: - - set: [ is_busy, 0 ] - - change_to: barracks - Dst: - Object: barracks_disabled - - # worker costs 5 resources to build, get a reward when a worker is built - - Name: build_worker - InputMapping: - Inputs: - 1: - Description: Build - VectorToDest: [ 0, 0 ] - Behaviours: - - Src: - Object: base - Preconditions: - - gte: [ player_resources, 5 ] - - eq: [ is_busy, 0 ] - Commands: - - set: [ is_busy, 1 ] - - sub: [ player_resources, 5 ] - - reward: 1 - # Queue a build which will take 10 seconds - - exec: - Action: spawn_worker - Delay: 10 - Randomize: true - Executor: action - Dst: - Object: base - - - Name: build_combat - InputMapping: - Inputs: - 1: - Description: Build - VectorToDest: [ 0, 0 ] - Behaviours: - - Src: - Object: barracks - Preconditions: - - gte: [ player_resources, 5 ] - - eq: [ is_busy, 0 ] - Commands: - - set: [ is_busy, 1 ] - - sub: [ player_resources, 5 ] - - reward: 1 - - exec: - Action: spawn_combat - Delay: 10 - Randomize: true - Executor: action - Dst: - Object: barracks - - - Name: build_barracks - Behaviours: - - Src: - Object: worker - Preconditions: - - gte: [ player_resources, 20 ] - - eq: [ is_busy, 0 ] - Commands: - - sub: [ player_resources, 20 ] - - reward: 1 - - spawn: barracks_disabled - Dst: - Object: _empty - - - Name: gather - Behaviours: - - Src: - Object: worker - Preconditions: - - lt: [ resources, 5 ] - - eq: [ is_busy, 0 ] - Commands: - - incr: resources - - reward: 1 - Dst: - Object: minerals - Commands: - - decr: resources - - lt: - Arguments: [resources, 10] - Commands: - - set_tile: 1 - - lt: - Arguments: [ resources, 5 ] - Commands: - - set_tile: 2 - - eq: - Arguments: [ resources, 0 ] - Commands: - - remove: true - - Src: - Object: worker - Preconditions: - - eq: [ is_busy, 0 ] - - gt: [ resources, 0 ] - - eq: [ src._playerId, dst._playerId ] - Commands: - - decr: resources - - reward: 1 - Dst: - Object: base - Commands: - - incr: player_resources - - - Name: move - Behaviours: - - Src: - Preconditions: - - eq: [ is_busy, 0 ] - Object: [ worker, combat, ranged ] - Commands: - - mov: _dest # mov will move the object, _dest is the destination location of the action - Dst: - Object: _empty - - - Src: - Object: ranged - Commands: - - mov: _dest # mov will move the object, _dest is the destination location of the action - Dst: - Object: [ movable_wall, worker, combat ] - Commands: - - cascade: _dest # reapply the same action to the dest location of the action - - # Name: ranged_attack - - Name: attack - Behaviours: - - - Src: - Object: worker - Preconditions: - - neq: [ src._playerId, dst._playerId ] - - eq: [ is_busy, 0 ] - Commands: - - reward: 1 - Dst: - Object: [ base, combat, worker, ranged ] - Commands: - - sub: [ health, 1 ] - - eq: - Arguments: [ health, 0 ] - Commands: - - remove: true - - - Src: - Object: combat - Preconditions: - - neq: [ src._playerId, dst._playerId ] - - eq: [ is_busy, 0 ] - Commands: - - reward: 1 - Dst: - Object: [ base, combat, worker, ranged, barracks ] - Commands: - - sub: [ health, 5 ] - - eq: - Arguments: [ 0, health ] - Commands: - - remove: true - -Objects: - - Name: minerals - MapCharacter: M - Variables: - - Name: resources - InitialValue: 20 - Observers: - Sprite2D: - - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_items/tg_items_crystal_green.png - Block2D: - - Shape: triangle - Color: [ 0.0, 1.0, 0.0 ] - Scale: 1.0 - Isometric: - - Image: oryx/oryx_iso_dungeon/minerals-1-0.png - - Image: oryx/oryx_iso_dungeon/minerals-1-1.png - - Image: oryx/oryx_iso_dungeon/minerals-1-2.png - - - Name: worker - MapCharacter: H - Variables: - - Name: resources - InitialValue: 0 - - Name: health - InitialValue: 10 - - Name: is_busy - InitialValue: 0 - Observers: - Sprite2D: - - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_jelly_d1.png - Block2D: - - Shape: square - Color: [ 0.6, 0.2, 0.2 ] - Scale: 0.5 - Isometric: - - Image: oryx/oryx_iso_dungeon/jelly-1.png - - - Name: ranged - MapCharacter: r - Variables: - - Name: health - InitialValue: 20 - - Name: is_busy - InitialValue: 0 - Observers: - Sprite2D: - - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_crawler_queen_d1.png - Block2D: - - Shape: square - Color: [ 0.2, 0.2, 0.6 ] - Scale: 1.0 - Isometric: - - Image: oryx/oryx_iso_dungeon/queen-1.png - - - Name: combat - MapCharacter: c - Variables: - - Name: health - InitialValue: 30 - - Name: is_busy - InitialValue: 0 - Observers: - Sprite2D: - - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_beast_d1.png - Block2D: - - Color: [ 0.2, 0.6, 0.6 ] - Shape: square - Scale: 0.8 - Isometric: - - Image: oryx/oryx_iso_dungeon/beast-1.png - - - Name: fixed_wall - MapCharacter: W - Observers: - Sprite2D: - - TilingMode: WALL_2 # Will tile walls with two images - Image: - - oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img33.png - - oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img40.png - Block2D: - - Color: [ 0.5, 0.5, 0.5 ] - Shape: square - Isometric: - - Image: oryx/oryx_iso_dungeon/wall-grey-1.png - - - Name: movable_wall - MapCharacter: w - Observers: - Sprite2D: - - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img282.png - Block2D: - - Color: [ 0.8, 0.8, 0.8 ] - Shape: square - Isometric: - - Image: oryx/oryx_iso_dungeon/crate-1.png - - - Name: base - MapCharacter: A - Variables: - - Name: health - InitialValue: 50 - - Name: is_busy - InitialValue: 0 - Observers: - Sprite2D: - - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img324.png - Block2D: - - Color: [ 0.8, 0.8, 0.3 ] - Shape: triangle - Isometric: - - Image: oryx/oryx_iso_dungeon/base-1.png - - - Name: barracks_disabled - MapCharacter: b - InitialActions: - - Action: construct_barracks - Delay: 20 - Variables: - - Name: health - InitialValue: 20 - - Name: is_busy - InitialValue: 1 - Observers: - Sprite2D: - - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img280.png - Block2D: - - Color: [ 0.3, 0.3, 0.3 ] - Shape: triangle - Size: 0.5 - Isometric: - - Image: oryx/oryx_iso_dungeon/barracks-disabled-1.png - - - Name: barracks - MapCharacter: B - Variables: - - Name: health - InitialValue: 40 - - Name: is_busy - InitialValue: 0 - Observers: - Sprite2D: - - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img320.png - Block2D: - - Color: [ 0.8, 0.3, 0.8 ] - Shape: triangle - Isometric: - - Image: oryx/oryx_iso_dungeon/barracks-1.png diff --git a/python/examples/experiments/rts/rts/__init__.py b/python/examples/experiments/rts/rts/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/python/examples/experiments/rts/rts/models/__init__.py b/python/examples/experiments/rts/rts/models/__init__.py deleted file mode 100644 index 05ce93df3..000000000 --- a/python/examples/experiments/rts/rts/models/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from rts.models.impala_cnn import ImpalaCNNAgent \ No newline at end of file diff --git a/python/examples/experiments/rts/rts/models/simple_conv.py b/python/examples/experiments/rts/rts/models/simple_conv.py deleted file mode 100644 index e93b1465c..000000000 --- a/python/examples/experiments/rts/rts/models/simple_conv.py +++ /dev/null @@ -1,51 +0,0 @@ -from ray.rllib.models.torch.torch_modelv2 import TorchModelV2 -from torch import nn -import numpy as np - -from griddly.util.rllib.torch.agents.common import layer_init - -class SimpleConv(TorchModelV2, nn.Module): - def __init__(self, obs_space, action_space, num_outputs, model_config, name): - - super().__init__(obs_space, action_space, num_outputs, model_config, name) - nn.Module.__init__(self) - - self._num_objects = obs_space.shape[2] - self._num_actions = num_outputs - - linear_flatten = np.prod(obs_space.shape[:2]) * 64 - - self.network = nn.Sequential( - layer_init(nn.Conv2d(self._num_objects, 32, 3, padding=1)), - nn.ReLU(), - layer_init(nn.Conv2d(32, 64, 3, padding=1)), - nn.ReLU(), - nn.Flatten(), - layer_init(nn.Linear(linear_flatten, 1024)), - nn.ReLU(), - layer_init(nn.Linear(1024, 512)), - nn.ReLU(), - ) - - self._actor_head = nn.Sequential( - layer_init(nn.Linear(512, 256), std=0.01), - nn.ReLU(), - layer_init(nn.Linear(256, self._num_actions), std=0.01) - ) - - self._critic_head = nn.Sequential( - layer_init(nn.Linear(512, 1), std=0.01) - ) - - - def forward(self, input_dict, state, seq_lens): - obs_transformed = input_dict['obs'].permute(0, 3, 1, 2) - network_output = self.network(obs_transformed) - value = self._critic_head(network_output) - self._value = value.reshape(-1) - logits = self._actor_head(network_output) - return logits, state - - - def value_function(self): - return self._value diff --git a/python/examples/experiments/rts/rts_random_valid_actions.py b/python/examples/experiments/rts/rts_random_valid_actions.py deleted file mode 100644 index 9a0c3cd3a..000000000 --- a/python/examples/experiments/rts/rts_random_valid_actions.py +++ /dev/null @@ -1,76 +0,0 @@ -import gym -from collections import Counter -from griddly import GymWrapperFactory, gd -from griddly.util.wrappers import ValidActionSpaceWrapper - - -class EventFrequencyTracker(): - - def __init__(self, window_size): - self._steps = 0 - - self._window_size = window_size - - self._frequency_trackers = [Counter() for _ in range(window_size)] - - def process(self, events): - for e in events: - action_name = e['ActionName'] - self._frequency_trackers[-1][action_name] += 1 - - if action_name == 'build_barracks': - print('barracks placed') - - if action_name == 'build_combat': - print('combat build') - - self._frequency_trackers.pop(0) - self._frequency_trackers.append(Counter()) - - def get_frequencies(self): - event_totals = Counter() - for tracker in self._frequency_trackers: - for key, value in tracker.items(): - event_totals[key] += value - - event_averages = {} - for k, v in event_totals.items(): - event_averages[k] = v / self._window_size - - return event_totals - - -if __name__ == '__main__': - wrapper = GymWrapperFactory() - - wrapper.build_gym_from_yaml("GriddlyRTS-Adv", - 'griddly_rts.yaml', - global_observer_type=gd.ObserverType.ISOMETRIC, - player_observer_type=gd.ObserverType.VECTOR, - level=0) - - env_original = gym.make(f'GDY-GriddlyRTS-Adv-v0') - # env_original = gym.make(f'GDY-GriddlyRTS-Adv-v0') - - env_original.reset() - env_original.enable_history() - - env = ValidActionSpaceWrapper(env_original) - - event_tracker = EventFrequencyTracker(10) - - for i in range(100000): - action = env.action_space.sample() - - obs, reward, done, info = env.step(action) - - event_tracker.process(info['History']) - - #env.render(observer='global') - - #print(event_tracker.get_frequencies()) - - if done: - env.reset() - - # env.reset() diff --git a/python/examples/experiments/rts/rts_self_play.py b/python/examples/experiments/rts/rts_self_play.py deleted file mode 100644 index df8c34de4..000000000 --- a/python/examples/experiments/rts/rts_self_play.py +++ /dev/null @@ -1,133 +0,0 @@ -import os -import sys - -import ray -from ray import tune -from ray.rllib.models import ModelCatalog -from ray.tune.integration.wandb import WandbLoggerCallback -from ray.tune.registry import register_env - -from rts.models import ImpalaCNNAgent -from griddly import gd -from griddly.util.rllib.callbacks import MultiCallback, VideoCallback, ActionTrackerCallback -from griddly.util.rllib.environment.core import RLlibMultiAgentWrapper, RLlibEnv -from griddly.util.rllib.torch.conditional_actions.conditional_action_policy_trainer import \ - ConditionalActionImpalaTrainer - -import argparse - -parser = argparse.ArgumentParser(description='Run experiments') - -parser.add_argument('--debug', action='store_true', help='Debug mode') -parser.add_argument('--yaml-file', help='YAML file containing GDY for the game') -parser.add_argument('--root-directory', default=os.path.expanduser("~/ray_results"), - help='root directory for all data associated with the run') -parser.add_argument('--num-gpus', default=1, type=int, help='Number of GPUs to make available to ray.') -parser.add_argument('--num-cpus', default=8, type=int, help='Number of CPUs to make available to ray.') - -parser.add_argument('--num-workers', default=7, type=int, help='Number of workers') -parser.add_argument('--num-envs-per-worker', default=5, type=int, help='Number of workers') -parser.add_argument('--num-gpus-per-worker', default=0, type=float, help='Number of gpus per worker') -parser.add_argument('--num-cpus-per-worker', default=1, type=float, help='Number of gpus per worker') -parser.add_argument('--max-training-steps', default=20000000, type=int, help='Number of workers') -parser.add_argument('--train-batch-size', default=500, type=int, help='Training batch size') - -parser.add_argument('--capture-video', action='store_true', help='enable video capture') -parser.add_argument('--video-directory', default='videos', help='directory of video') -parser.add_argument('--video-frequency', type=int, default=1000000, help='Frequency of videos') - -parser.add_argument('--seed', type=int, default=1, help='seed for experiments') - -parser.add_argument('--lr', type=float, default=0.0005, help='learning rate') - -if __name__ == '__main__': - - args = parser.parse_args() - - sep = os.pathsep - os.environ['PYTHONPATH'] = sep.join(sys.path) - - if args.debug: - ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus, local_mode=True) - else: - ray.init(include_dashboard=False, num_gpus=args.num_gpus, num_cpus=args.num_cpus) - - - env_name = "griddly-rts-env" - - - def _create_env(env_config): - env = RLlibEnv(env_config) - return RLlibMultiAgentWrapper(env, env_config) - - register_env(env_name, _create_env) - ModelCatalog.register_custom_model("ImpalaCNN", ImpalaCNNAgent) - - wandbLoggerCallback = WandbLoggerCallback( - project='rts_experiments', - api_key_file='~/.wandb_rc', - dir=args.root_directory - ) - - max_training_steps = args.max_training_steps - - config = { - 'framework': 'torch', - 'seed': args.seed, - 'num_workers': args.num_workers, - 'num_envs_per_worker': args.num_envs_per_worker, - 'num_gpus_per_worker': float(args.num_gpus_per_worker), - 'num_cpus_per_worker': args.num_cpus_per_worker, - - 'train_batch_size': args.train_batch_size, - - 'callbacks': MultiCallback([ - VideoCallback, - ActionTrackerCallback - ]), - - 'model': { - 'custom_model': 'ImpalaCNN', - 'custom_model_config': {} - }, - 'env': env_name, - 'env_config': { - 'generate_valid_action_trees': True, - 'yaml_file': args.yaml_file, - 'global_observer_type': gd.ObserverType.ISOMETRIC, - 'level': 0, - 'record_actions': True, - 'max_steps': 1000, - }, - 'entropy_coeff_schedule': [ - [0, 0.001], - [max_training_steps, 0.0] - ], - 'lr_schedule': [ - [0, args.lr], - [max_training_steps, 0.0] - ], - - } - - if args.capture_video: - real_video_frequency = int(args.video_frequency / (args.num_envs_per_worker * args.num_workers)) - config['env_config']['record_video_config'] = { - 'frequency': real_video_frequency, - 'directory': os.path.join(args.root_directory, args.video_directory) - } - - stop = { - "timesteps_total": max_training_steps, - } - - trial_name_creator = lambda trial: f'RTS-self-play' - - result = tune.run( - ConditionalActionImpalaTrainer, - local_dir=args.root_directory, - config=config, - stop=stop, - callbacks=[wandbLoggerCallback], - trial_name_creator=trial_name_creator - ) diff --git a/python/examples/experiments/rts/tests/rts_tests.py b/python/examples/experiments/rts/tests/rts_tests.py deleted file mode 100644 index 3ff229b7e..000000000 --- a/python/examples/experiments/rts/tests/rts_tests.py +++ /dev/null @@ -1,164 +0,0 @@ -import numpy as np -import gym -import pytest - -from griddly import GymWrapperFactory, gd - - -@pytest.fixture -def test_name(request): - return request.node.name - - -def build_test_env(test_name, level_string): - wrapper_factory = GymWrapperFactory() - - wrapper_factory.build_gym_from_yaml( - test_name, - 'griddly_rts.yaml', - global_observer_type=gd.ObserverType.VECTOR, - player_observer_type=gd.ObserverType.VECTOR, - - ) - - env = gym.make(f'GDY-{test_name}-v0') - env.reset(level_string=level_string) - return env - - -def test_harvester(test_name): - """ - Test the mechanics of harvesters - """ - - level_string = ( - 'w w w w\n' - 'B1 H1 . M\n' - 'B2 H2 . M\n' - 'w w w w\n' - ) - - env = build_test_env(test_name, level_string) - - # Test that the valid action tree con only move right for both - trees = env.game.build_valid_action_trees() - assert len(trees) == 2 - # possible x positions - assert trees[0].keys() == {1} - assert trees[1].keys() == {1} - - # possible y positions - assert trees[0][1].keys() == {1} - assert trees[1][1].keys() == {2} - - # possible action_types (can move and attack) - # print(env.action_names) - assert trees[0][1][1].keys() == {2, 3} - assert trees[1][1][2].keys() == {2, 3} - - # Both harvesters can only move right (and NOP) - assert trees[0][1][1][2].keys() == {0, 3} - assert trees[1][1][2][2].keys() == {0, 3} - - # Move both harvesters right - observation, reward, done, info = env.step([ - [1, 1, 2, 3], - [1, 2, 2, 3] - ]) - - can_gather_tree = env.game.build_valid_action_trees() - - # Can gather, move and attack - assert can_gather_tree[0][2][1].keys() == {1, 2, 3} - assert can_gather_tree[1][2][2].keys() == {1, 2, 3} - - assert reward == [0, 0] - assert done == False - - # Gather right 5 times and check that the harvesters have 5 resources (and check rewards) - for i in range(1, 6): - observation, reward, done, info = env.step([ - [2, 1, 1, 3], - [2, 2, 1, 3] - ]) - - assert reward == [1, 1] - - # Check that the resource value increases for harvesters - assert observation[0][12, 2, 1] == i - assert observation[1][12, 2, 2] == i - - # Check that the resource value decreases for minerals - assert observation[0][12, 3, 1] == 20 - i - assert observation[1][12, 3, 2] == 20 - i - - # Check that there are no invalid actions in the tree - no_more_gather_tree = env.game.build_valid_action_trees() - - # Can move and attack - assert no_more_gather_tree[0][2][1].keys() == {2, 3} - assert no_more_gather_tree[1][2][2].keys() == {2, 3} - - # Check that gather does nothing - observation, reward, done, info = env.step([ - [2, 1, 1, 3], - [2, 2, 1, 3] - ]) - - # Check that the resource is not increased - assert observation[0][12, 2, 1] == 5 - assert observation[1][12, 2, 2] == 5 - - # Check that the resource value is not decreased - assert observation[0][12, 3, 1] == 15 - assert observation[1][12, 3, 2] == 15 - - assert reward == [0, 0] - assert done == False - - # Move back next to the base - observation, reward, done, info = env.step([ - [2, 1, 2, 1], - [2, 2, 2, 1] - ]) - - # Pass all the resources to the base - for i in [4, 3, 2, 1, 0]: - observation, reward, done, info = env.step([ - [1, 1, 1, 1], - [1, 2, 1, 1] - ]) - - assert reward == [1, 1] - - # Check that the resource value increases for harvesters - assert observation[0][12, 1, 1] == i - assert observation[1][12, 1, 2] == i - - # cannot give more resources to the base - observation, reward, done, info = env.step([ - [1, 1, 1, 1], - [1, 2, 1, 1] - ]) - - assert observation[0][12, 1, 1] == 0 - assert observation[1][12, 1, 2] == 0 - - # Now the players have 5 resources each, we should be able to build a new harvester - can_build_harvester = env.game.build_valid_action_trees() - assert can_build_harvester[0][0][1][0].keys() == {0, 1} - assert can_build_harvester[1][0][2][0].keys() == {0, 1} - - assert env.get_state()['GlobalVariables']['player_resources'][1] == 5 - assert env.get_state()['GlobalVariables']['player_resources'][2] == 5 - - # Build both harvesters - observation, reward, done, info = env.step([ - [0, 1, 0, 1], - [0, 2, 0, 1] - ]) - - assert env.get_state()['GlobalVariables']['player_resources'][1] == 0 - assert env.get_state()['GlobalVariables']['player_resources'][2] == 0 - - assert reward == [1, 1] \ No newline at end of file diff --git a/python/examples/rllib/rllib_rts.py b/python/examples/rllib/rllib_rts.py new file mode 100644 index 000000000..c8455ef3e --- /dev/null +++ b/python/examples/rllib/rllib_rts.py @@ -0,0 +1,76 @@ +import os +import sys + +import ray +from ray import tune +from ray.rllib.models import ModelCatalog +from ray.tune.registry import register_env + +from griddly import gd +from griddly.util.rllib.callbacks import ActionTrackerCallback +from griddly.util.rllib.environment.core import RLlibMultiAgentWrapper, RLlibEnv +from griddly.util.rllib.torch.agents.impala_cnn import ImpalaCNNAgent +from griddly.util.rllib.torch.conditional_actions.conditional_action_policy_trainer import \ + ConditionalActionImpalaTrainer + +if __name__ == '__main__': + sep = os.pathsep + os.environ['PYTHONPATH'] = sep.join(sys.path) + + ray.init(num_gpus=1) + + env_name = "griddly-rts-env" + + + def _create_env(env_config): + env = RLlibEnv(env_config) + return RLlibMultiAgentWrapper(env, env_config) + + + register_env(env_name, _create_env) + ModelCatalog.register_custom_model("ImpalaCNN", ImpalaCNNAgent) + + max_training_steps = 100000000 + + config = { + 'framework': 'torch', + + 'num_workers': 8, + 'num_envs_per_worker': 5, + + 'callbacks': ActionTrackerCallback, + + 'model': { + 'custom_model': 'ImpalaCNN', + 'custom_model_config': {} + }, + 'env': env_name, + 'env_config': { + 'generate_valid_action_trees': True, + 'yaml_file': 'RTS/GriddlyRTS.yaml', + 'global_observer_type': gd.ObserverType.ISOMETRIC, + 'level': 0, + 'record_actions': True, + 'max_steps': 1000, + + 'record_video_config': { + 'frequency': 20000, # number of rollouts + 'directory': 'videos' + }, + }, + 'entropy_coeff_schedule': [ + [0, 0.001], + [max_training_steps, 0.0] + ], + 'lr_schedule': [ + [0, 0.0005], + [max_training_steps, 0.0] + ], + + } + + stop = { + "timesteps_total": max_training_steps, + } + + result = tune.run(ConditionalActionImpalaTrainer, config=config, stop=stop) diff --git a/python/griddly/util/rllib/environment/core.py b/python/griddly/util/rllib/environment/core.py index b625f758e..3eddaf55c 100644 --- a/python/griddly/util/rllib/environment/core.py +++ b/python/griddly/util/rllib/environment/core.py @@ -61,7 +61,7 @@ def __init__(self, env_config): self.include_agent_videos = self.record_video_config.get('include_agents', False) os.makedirs(self.video_directory, exist_ok=True) - self._enable_history = env_config.get('record_actions', False) + self.record_actions = env_config.get('record_actions', False) self.generate_valid_action_trees = env_config.get('generate_valid_action_trees', False) self._random_level_on_reset = env_config.get('random_level_on_reset', False) @@ -70,7 +70,7 @@ def __init__(self, env_config): self.set_transform() - self.enable_history(self._enable_history) + self.enable_history(self.record_actions) def _transform(self, observation): @@ -260,12 +260,13 @@ def step(self, action_dict: MultiAgentDict): else: info_map = self._to_multi_agent_map(defaultdict(dict)) - for event in info['History']: - event_player_id = event['PlayerId'] - if event_player_id != 0: - if 'History' not in info_map[event_player_id]: - info_map[event_player_id]['History'] = [] - info_map[event_player_id]['History'].append(event) + if self.record_actions: + for event in info['History']: + event_player_id = event['PlayerId'] + if event_player_id != 0: + if 'History' not in info_map[event_player_id]: + info_map[event_player_id]['History'] = [] + info_map[event_player_id]['History'].append(event) obs_map = self._to_multi_agent_map(obs) reward_map = self._to_multi_agent_map(reward) diff --git a/python/examples/experiments/rts/rts/models/impala_cnn.py b/python/griddly/util/rllib/torch/agents/impala_cnn.py similarity index 100% rename from python/examples/experiments/rts/rts/models/impala_cnn.py rename to python/griddly/util/rllib/torch/agents/impala_cnn.py diff --git a/resources/games/RTS/GriddlyRTS.yaml b/resources/games/RTS/GriddlyRTS.yaml index 2dc2f1876..a1687daea 100644 --- a/resources/games/RTS/GriddlyRTS.yaml +++ b/resources/games/RTS/GriddlyRTS.yaml @@ -7,7 +7,7 @@ Environment: TileSize: 16 BackgroundTile: oryx/oryx_tiny_galaxy/tg_sliced/tg_world/tg_world_floor_panel_metal_a.png Isometric: - TileSize: [32, 48] + TileSize: [ 32, 48 ] BackgroundTile: oryx/oryx_iso_dungeon/floor-1.png IsoTileHeight: 16 IsoTileDepth: 4 @@ -22,102 +22,120 @@ Environment: Count: 2 Termination: Lose: - - eq: [base:count, 0] # If the player has no bases - Win: - - eq: [_score, 10] # First player to 10 reward points + - Conditions: + - eq: [ base:count, 0 ] # If the player has no bases + Reward: -10 # -10 for a loss + OpposingReward: 10 # as the agent didnt lose Levels: - | - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W - W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W - W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W - W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . M M M M . . . . . . . . . . W - W . . . . . . . . . . . . . . M M M M M M . . . . . . . . W - W . . . . . . . . . . . . . M . . M . M M . . . . . . . . W - W . . . . . . . . . . . . . M M M M M M M . . . . . . . . W - W . . . . . . . . . . . . . . . M M M M . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W - W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W + M M . . . . . . . . . . . . . . + M M . . . . . . . . . . . . . . + . . A1 H1 . . . . . . . . . . . . + . . H1 . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . H2 . . + . . . . . . . . . . . . H2 A2 . . + . . . . . . . . . . . . . . M M + . . . . . . . . . . . . . . M M + - | + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W + W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W + W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W + W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . M M M M . . . . . . . . . . W + W . . . . . . . . . . . . . . M M M M M M . . . . . . . . W + W . . . . . . . . . . . . . M . . M . M M . . . . . . . . W + W . . . . . . . . . . . . . M M M M M M M . . . . . . . . W + W . . . . . . . . . . . . . . . M M M M . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W + W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - | - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W - W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W - W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W - W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W - W W W W W W W W W . . . . . . . . . . . . . . W W W W W w W - W . . . . . . W W . . . w w w w w w . . . . . W W W W W w W - W . . . . . . . . . . . . . w w . . . . . . . W W W W W w W - W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W - W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W - W . . . . . . . . . . . . . . M M M M . . . . W W W W W w W - W . . . . P1 w . . . . . . . . M M M M M M . W W W W W W W W - W . . . . P1 w . . . . . . . M . . M . M M . . . . . . . . W - W . . . . P2 w . . . . . . . M M M M M M M . . . . . . . . W - W . . . . P2 w . . . . . . . . . M M M M . . . . . . . . . W - W . . . . P1 w . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W - W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W + W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W + W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W + W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W + W W W W W W W W W . . . . . . . . . . . . . . W W W W W w W + W . . . . . . W W . . . w w w w w w . . . . . W W W W W w W + W . . . . . . . . . . . . . w w . . . . . . . W W W W W w W + W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W + W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W + W . . . . . . . . . . . . . . M M M M . . . . W W W W W w W + W . . . . . w . . . . . . . . M M M M M M . W W W W W W W W + W . . . . . w . . . . . . . M . . M . M M . . . . . . . . W + W . . . . . w . . . . . . . M M M M M M M . . . . . . . . W + W . . . . . w . . . . . . . . . M M M M . . . . . . . . . W + W . . . . . w . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W + W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - | - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - W . . . . M M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . M M M M W - W . . . . . M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . M M W - W . . . . . . M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . H2 . . M W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . B2 H2 . M W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W W W w w W W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W . . W W W W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W W W W W W W W W W W W W w w w w w w w w w w w w w W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W M . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W M M . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W M M M . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . . . W - W W W W W W W W W W W . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . W W W W W W W W W W W + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + W . . . . M M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . M M M M W + W . . . . . M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . M M W + W . . . . . . M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . H2 . . M W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . B2 H2 . M W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W W W w w W W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W . . W W W W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W W W W W W W W W W W W W w w w w w w w w w w w w w W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W M . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W M M . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W M M M . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . . . W + W W W W W W W W W W W . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . W W W W W W W W W W W W . . . . . . . . . . . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . . . . . . . . M M M W W . . . . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . M M W W . . . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . M W @@ -149,48 +167,138 @@ Environment: W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W Actions: - - Name: spawn_harvester + - Name: spawn_worker InputMapping: Internal: true Behaviours: - Src: Object: base Commands: - - spawn: harvester + - spawn: worker + - set: [ is_busy, 0 ] Dst: Object: _empty - - Src: Object: base Dst: - Object: [base, puncher, harvester, pusher, movable_wall] + Object: [ base, barracks, combat, worker, ranged, movable_wall ] Commands: + # Try to spawn in another location on the next tick - exec: - Action: spawn_harvester + Action: spawn_worker + Delay: 1 + Randomize: true + - Name: spawn_combat + InputMapping: + Internal: true + Behaviours: + - Src: + Object: barracks + Commands: + - spawn: combat + - set: [ is_busy, 0 ] + Dst: + Object: _empty + + - Src: + Object: barracks + Dst: + Object: [ base, barracks, combat, worker, ranged, movable_wall ] + Commands: + # Try to spawn in another location on the next tick + - exec: + Action: spawn_combat Delay: 1 Randomize: true - # Harvester costs 5 resources to build - - Name: build_harvester + - Name: construct_barracks + InputMapping: + Inputs: + 1: + Description: Completes construction of a barracks + VectorToDest: [ 0, 0 ] + Internal: true + Behaviours: + - Src: + Object: barracks_disabled + Commands: + - set: [ is_busy, 0 ] + - change_to: barracks + Dst: + Object: barracks_disabled + + # worker costs 5 resources to build, get a reward when a worker is built + - Name: build_worker + InputMapping: + Inputs: + 1: + Description: Build + VectorToDest: [ 0, 0 ] Behaviours: - Src: - Preconditions: - - gt: [player_resources, 5] Object: base + Preconditions: + - gte: [ player_resources, 5 ] + - eq: [ is_busy, 0 ] + Commands: + - set: [ is_busy, 1 ] + - sub: [ player_resources, 5 ] + - reward: 1 + # Queue a build which will take 10 seconds + - exec: + Action: spawn_worker + Delay: 10 + Randomize: true + Executor: action Dst: Object: base + + - Name: build_combat + InputMapping: + Inputs: + 1: + Description: Build + VectorToDest: [ 0, 0 ] + Behaviours: + - Src: + Object: barracks + Preconditions: + - gte: [ player_resources, 5 ] + - eq: [ is_busy, 0 ] Commands: + - set: [ is_busy, 1 ] + - sub: [ player_resources, 5 ] + - reward: 1 - exec: - Action: spawn_harvester + Action: spawn_combat Delay: 10 Randomize: true - - + Executor: action + Dst: + Object: barracks + + - Name: build_barracks + Behaviours: + - Src: + Object: worker + Preconditions: + - gte: [ player_resources, 20 ] + - eq: [ is_busy, 0 ] + Commands: + - sub: [ player_resources, 20 ] + - reward: 1 + - spawn: barracks_disabled + Dst: + Object: _empty + - Name: gather Behaviours: - Src: - Object: harvester + Object: worker + Preconditions: + - lt: [ resources, 5 ] + - eq: [ is_busy, 0 ] Commands: - incr: resources - reward: 1 @@ -198,12 +306,24 @@ Actions: Object: minerals Commands: - decr: resources + - lt: + Arguments: [resources, 10] + Commands: + - set_tile: 1 + - lt: + Arguments: [ resources, 5 ] + Commands: + - set_tile: 2 - eq: - Arguments: [resources, 0] + Arguments: [ resources, 0 ] Commands: - remove: true - Src: - Object: harvester + Object: worker + Preconditions: + - eq: [ is_busy, 0 ] + - gt: [ resources, 0 ] + - eq: [ src._playerId, dst._playerId ] Commands: - decr: resources - reward: 1 @@ -215,33 +335,56 @@ Actions: - Name: move Behaviours: - Src: - Object: [harvester, puncher, pusher, movable_wall] + Preconditions: + - eq: [ is_busy, 0 ] + Object: [ worker, combat, ranged ] Commands: - mov: _dest # mov will move the object, _dest is the destination location of the action Dst: Object: _empty - Src: - Object: pusher + Object: ranged Commands: - mov: _dest # mov will move the object, _dest is the destination location of the action Dst: - Object: [movable_wall, harvester, puncher] + Object: [ movable_wall, worker, combat ] Commands: - cascade: _dest # reapply the same action to the dest location of the action - - Name: punch + # Name: ranged_attack + - Name: attack Behaviours: + + - Src: + Object: worker + Preconditions: + - neq: [ src._playerId, dst._playerId ] + - eq: [ is_busy, 0 ] + Commands: + - reward: 1 + Dst: + Object: [ base, combat, worker, ranged ] + Commands: + - sub: [ health, 1 ] + - eq: + Arguments: [ health, 0 ] + Commands: + - remove: true + - Src: - Object: puncher + Object: combat + Preconditions: + - neq: [ src._playerId, dst._playerId ] + - eq: [ is_busy, 0 ] Commands: - reward: 1 Dst: - Object: [puncher, harvester, pusher, base] + Object: [ base, combat, worker, ranged, barracks ] Commands: - - decr: health + - sub: [ health, 5 ] - eq: - Arguments: [0, health] + Arguments: [ 0, health ] Commands: - remove: true @@ -250,59 +393,67 @@ Objects: MapCharacter: M Variables: - Name: resources - InitialValue: 200 + InitialValue: 20 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_items/tg_items_crystal_green.png Block2D: - Shape: triangle - Color: [0.0, 1.0, 0.0] + Color: [ 0.0, 1.0, 0.0 ] Scale: 1.0 Isometric: - - Image: oryx/oryx_iso_dungeon/minerals-1.png + - Image: oryx/oryx_iso_dungeon/minerals-1-0.png + - Image: oryx/oryx_iso_dungeon/minerals-1-1.png + - Image: oryx/oryx_iso_dungeon/minerals-1-2.png - - Name: harvester + - Name: worker MapCharacter: H Variables: - Name: resources InitialValue: 0 - Name: health InitialValue: 10 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_jelly_d1.png Block2D: - Shape: square - Color: [0.6, 0.2, 0.2] + Color: [ 0.6, 0.2, 0.2 ] Scale: 0.5 Isometric: - Image: oryx/oryx_iso_dungeon/jelly-1.png - - Name: pusher - MapCharacter: P + - Name: ranged + MapCharacter: r Variables: - Name: health - InitialValue: 10 + InitialValue: 20 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_crawler_queen_d1.png Block2D: - Shape: square - Color: [0.2, 0.2, 0.6] + Color: [ 0.2, 0.2, 0.6 ] Scale: 1.0 Isometric: - Image: oryx/oryx_iso_dungeon/queen-1.png - - Name: puncher - MapCharacter: p + - Name: combat + MapCharacter: c Variables: - Name: health - InitialValue: 5 + InitialValue: 30 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_beast_d1.png Block2D: - - Color: [0.2, 0.6, 0.6] + - Color: [ 0.2, 0.6, 0.6 ] Shape: square Scale: 0.8 Isometric: @@ -317,7 +468,7 @@ Objects: - oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img33.png - oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img40.png Block2D: - - Color: [0.5, 0.5, 0.5] + - Color: [ 0.5, 0.5, 0.5 ] Shape: square Isometric: - Image: oryx/oryx_iso_dungeon/wall-grey-1.png @@ -328,21 +479,59 @@ Objects: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img282.png Block2D: - - Color: [0.8, 0.8, 0.8] + - Color: [ 0.8, 0.8, 0.8 ] Shape: square Isometric: - Image: oryx/oryx_iso_dungeon/crate-1.png - Name: base - MapCharacter: B + MapCharacter: A Variables: - Name: health - InitialValue: 10 + InitialValue: 50 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img324.png Block2D: - - Color: [0.8, 0.8, 0.3] + - Color: [ 0.8, 0.8, 0.3 ] Shape: triangle Isometric: - Image: oryx/oryx_iso_dungeon/base-1.png + + - Name: barracks_disabled + MapCharacter: b + InitialActions: + - Action: construct_barracks + Delay: 20 + Variables: + - Name: health + InitialValue: 20 + - Name: is_busy + InitialValue: 1 + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img280.png + Block2D: + - Color: [ 0.3, 0.3, 0.3 ] + Shape: triangle + Size: 0.5 + Isometric: + - Image: oryx/oryx_iso_dungeon/barracks-disabled-1.png + + - Name: barracks + MapCharacter: B + Variables: + - Name: health + InitialValue: 40 + - Name: is_busy + InitialValue: 0 + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img320.png + Block2D: + - Color: [ 0.8, 0.3, 0.8 ] + Shape: triangle + Isometric: + - Image: oryx/oryx_iso_dungeon/barracks-1.png From 7f2d836ad33b211e31cca646c7b544be86449054 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Wed, 5 May 2021 16:44:23 +0100 Subject: [PATCH 20/29] few minor fixes --- python/examples/experiments/rts-self-play | 1 + python/griddly/util/rllib/callbacks.py | 32 ++++++++++++++++--- .../environment/observer_episode_recorder.py | 14 ++++---- 3 files changed, 35 insertions(+), 12 deletions(-) create mode 160000 python/examples/experiments/rts-self-play diff --git a/python/examples/experiments/rts-self-play b/python/examples/experiments/rts-self-play new file mode 160000 index 000000000..035470983 --- /dev/null +++ b/python/examples/experiments/rts-self-play @@ -0,0 +1 @@ +Subproject commit 035470983e246d84943e42412f071f76c42af37a diff --git a/python/griddly/util/rllib/callbacks.py b/python/griddly/util/rllib/callbacks.py index 9a784126a..5684d2e73 100644 --- a/python/griddly/util/rllib/callbacks.py +++ b/python/griddly/util/rllib/callbacks.py @@ -2,6 +2,7 @@ from collections import Counter from ray.rllib import Policy, BaseEnv, SampleBatch from ray.rllib.agents.callbacks import DefaultCallbacks +from ray.rllib.env.base_env import _VectorEnvToBaseEnv from ray.rllib.evaluation import MultiAgentEpisode from ray.rllib.utils.typing import PolicyID, AgentID from wandb import Video @@ -61,6 +62,12 @@ def on_train_result(self, *, trainer, result: dict, **kwargs) -> None: class VideoCallback(DefaultCallbacks): + def _get_envs(self, base_env): + if isinstance(base_env, _VectorEnvToBaseEnv): + return base_env.vector_env.envs + else: + return base_env.envs + def on_episode_start(self, *, worker: "RolloutWorker", @@ -69,7 +76,9 @@ def on_episode_start(self, episode: MultiAgentEpisode, env_index: Optional[int] = None, **kwargs) -> None: - base_env.envs[env_index].on_episode_start(worker.worker_index, env_index) + + envs = self._get_envs(base_env) + envs[env_index].on_episode_start(worker.worker_index, env_index) def on_episode_end(self, *, @@ -79,7 +88,11 @@ def on_episode_end(self, episode: MultiAgentEpisode, env_index: Optional[int] = None, **kwargs) -> None: - info = episode.last_info_for(1) + + envs = self._get_envs(base_env) + num_players = envs[env_index].player_count + + info = episode.last_info_for(1) if num_players > 1 else episode.last_info_for() if 'videos' in info: for video in info['videos']: level = video['level'] @@ -94,6 +107,12 @@ def __init__(self): self._action_frequency_trackers = {} + def _get_envs(self, base_env): + if isinstance(base_env, _VectorEnvToBaseEnv): + return base_env.vector_env.envs + else: + return base_env.envs + def on_episode_start(self, *, worker: "RolloutWorker", @@ -102,7 +121,8 @@ def on_episode_start(self, episode: MultiAgentEpisode, env_index: Optional[int] = None, **kwargs) -> None: - num_players = base_env.envs[env_index].player_count + envs = self._get_envs(base_env) + num_players = envs[env_index].player_count self._action_frequency_trackers[episode.episode_id] = [] for p in range(0, num_players): self._action_frequency_trackers[episode.episode_id].append(Counter()) @@ -115,7 +135,8 @@ def on_episode_step(self, env_index: Optional[int] = None, **kwargs) -> None: - num_players = base_env.envs[env_index].player_count + envs = self._get_envs(base_env) + num_players = envs[env_index].player_count for p in range(0, num_players): info = episode.last_info_for(p+1) @@ -128,7 +149,8 @@ def on_episode_step(self, def on_episode_end(self, *, worker: "RolloutWorker", base_env: BaseEnv, policies: Dict[PolicyID, Policy], episode: MultiAgentEpisode, env_index: Optional[int] = None, **kwargs) -> None: - num_players = base_env.envs[env_index].player_count + envs = self._get_envs(base_env) + num_players = envs[env_index].player_count for p in range(0, num_players): for action_name, frequency in self._action_frequency_trackers[episode.episode_id][p].items(): diff --git a/python/griddly/util/rllib/environment/observer_episode_recorder.py b/python/griddly/util/rllib/environment/observer_episode_recorder.py index 2f9d804ec..c943cf07f 100644 --- a/python/griddly/util/rllib/environment/observer_episode_recorder.py +++ b/python/griddly/util/rllib/environment/observer_episode_recorder.py @@ -30,27 +30,27 @@ def step(self, level_id, step_count, done): self._recording_state = RecordingState.WAITING_FOR_EPISODE_START if self._recording_state == RecordingState.BEFORE_RECORDING: - global_obs = self._env.render(observer=self._observer, mode='rgb_array') - self._global_recorder = VideoRecorder() + obs = self._env.render(observer=self._observer, mode='rgb_array') + self._recorder = VideoRecorder() video_filename = os.path.join( self._video_directory, f'episode_video_{self._observer}_{uuid1()}_{level_id}_{step_count}.mp4' ) - self._global_recorder.start(video_filename, global_obs.shape) + self._recorder.start(video_filename, obs.shape) self._recording_state = RecordingState.RECORDING if self._recording_state == RecordingState.RECORDING: - global_obs = self._env.render(observer=self._observer, mode='rgb_array') - self._global_recorder.add_frame(global_obs) + obs = self._env.render(observer=self._observer, mode='rgb_array') + self._recorder.add_frame(obs) if done: self._recording_state = RecordingState.NOT_RECORDING - self._global_recorder.close() + self._recorder.close() video_info = { 'level': level_id, - 'path': self._global_recorder.output_file + 'path': self._recorder.output_file } if self._recording_state == RecordingState.WAITING_FOR_EPISODE_START: From 0b1b4d7d6fb3a60b302abb7492f0d59037b9d39e Mon Sep 17 00:00:00 2001 From: Bam4d Date: Wed, 5 May 2021 16:47:21 +0100 Subject: [PATCH 21/29] updating submodules --- python/examples/experiments/conditional-action-trees | 2 +- python/examples/experiments/rts-self-play | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/examples/experiments/conditional-action-trees b/python/examples/experiments/conditional-action-trees index 0c1cc7e39..3e3368b68 160000 --- a/python/examples/experiments/conditional-action-trees +++ b/python/examples/experiments/conditional-action-trees @@ -1 +1 @@ -Subproject commit 0c1cc7e39e3024d0538064c629142abe130b0a3d +Subproject commit 3e3368b6841dcc53efad96f0b7080f3d51d10e5c diff --git a/python/examples/experiments/rts-self-play b/python/examples/experiments/rts-self-play index 035470983..f25617863 160000 --- a/python/examples/experiments/rts-self-play +++ b/python/examples/experiments/rts-self-play @@ -1 +1 @@ -Subproject commit 035470983e246d84943e42412f071f76c42af37a +Subproject commit f256178635a7d1c518950fc99402969bcd13335f From 87c6c54019af0ca403e228ce4708579bc2bbe480 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Thu, 6 May 2021 10:30:16 +0100 Subject: [PATCH 22/29] docs update --- python/examples/experiments/conditional-action-trees | 2 +- python/examples/rllib/rllib_multi_agent.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/examples/experiments/conditional-action-trees b/python/examples/experiments/conditional-action-trees index 3e3368b68..ae95d516f 160000 --- a/python/examples/experiments/conditional-action-trees +++ b/python/examples/experiments/conditional-action-trees @@ -1 +1 @@ -Subproject commit 3e3368b6841dcc53efad96f0b7080f3d51d10e5c +Subproject commit ae95d516fa34e2f64eeda57600d4cff3c668409b diff --git a/python/examples/rllib/rllib_multi_agent.py b/python/examples/rllib/rllib_multi_agent.py index efa82c5a7..9b0a2b841 100644 --- a/python/examples/rllib/rllib_multi_agent.py +++ b/python/examples/rllib/rllib_multi_agent.py @@ -33,7 +33,7 @@ def _create_env(env_config): config = { 'framework': 'torch', - 'num_workers': 8, + 'num_workers': 3, 'num_envs_per_worker': 2, 'num_gpus': 1, From 9e1a41f389b6cb1a31a5116c6f1f8605a3e5147b Mon Sep 17 00:00:00 2001 From: Bam4d Date: Fri, 7 May 2021 07:37:04 +0100 Subject: [PATCH 23/29] docs update --- docs/games/Bait/img/Bait-level-Block2D-1.png | Bin 785 -> 276 bytes docs/games/Bait/img/Bait-level-Block2D-3.png | Bin 1072 -> 319 bytes .../img/Bait_With_Keys-level-Block2D-1.png | Bin 785 -> 276 bytes .../img/Bait_With_Keys-level-Block2D-3.png | Bin 1072 -> 319 bytes ...utterflies_and_Spiders-level-Block2D-1.png | Bin 1543 -> 595 bytes ...utterflies_and_Spiders-level-Block2D-3.png | Bin 1605 -> 595 bytes ...utterflies_and_Spiders-level-Block2D-5.png | Bin 1839 -> 595 bytes ...utterflies_and_Spiders-level-Block2D-7.png | Bin 1748 -> 595 bytes ...utterflies_and_Spiders-level-Block2D-9.png | Bin 1621 -> 643 bytes .../Clusters/img/Clusters-level-Block2D-1.png | Bin 1039 -> 298 bytes .../Clusters/img/Clusters-level-Block2D-3.png | Bin 965 -> 298 bytes .../img/Cook_Me_Pasta-level-Block2D-1.png | Bin 825 -> 338 bytes .../img/Cook_Me_Pasta-level-Block2D-3.png | Bin 882 -> 338 bytes .../img/Cook_Me_Pasta-level-Block2D-5.png | Bin 879 -> 338 bytes .../games/Doggo/img/Doggo-level-Block2D-1.png | Bin 442 -> 162 bytes .../games/Doggo/img/Doggo-level-Block2D-3.png | Bin 632 -> 248 bytes .../img/Drunk_Dwarf-level-Block2D-1.png | Bin 508 -> 162 bytes .../img/Drunk_Dwarf-level-Block2D-3.png | Bin 831 -> 248 bytes .../Foragers/img/Foragers-level-Block2D-1.png | Bin 1270 -> 231 bytes .../img/GriddlyRTS-level-Block2D-0.png | Bin 4152 -> 1498 bytes .../img/GriddlyRTS-level-Block2D-1.png | Bin 4397 -> 1588 bytes .../img/GriddlyRTS-level-Block2D-2.png | Bin 11227 -> 4282 bytes .../img/GriddlyRTS-level-Block2D-3.png | Bin 0 -> 5616 bytes .../img/GriddlyRTS-level-Isometric-0.png | Bin 27803 -> 7853 bytes .../img/GriddlyRTS-level-Isometric-1.png | Bin 32630 -> 20097 bytes .../img/GriddlyRTS-level-Isometric-2.png | Bin 115589 -> 23241 bytes .../img/GriddlyRTS-level-Isometric-3.png | Bin 0 -> 97731 bytes .../img/GriddlyRTS-level-Sprite2D-0.png | Bin 4996 -> 2747 bytes .../img/GriddlyRTS-level-Sprite2D-1.png | Bin 6780 -> 4940 bytes .../img/GriddlyRTS-level-Sprite2D-2.png | Bin 21954 -> 6086 bytes .../img/GriddlyRTS-level-Sprite2D-3.png | Bin 0 -> 21891 bytes .../img/GriddlyRTS-level-Vector-0.png | Bin 891 -> 370 bytes .../img/GriddlyRTS-level-Vector-1.png | Bin 994 -> 912 bytes .../img/GriddlyRTS-level-Vector-2.png | Bin 2212 -> 996 bytes .../img/GriddlyRTS-level-Vector-3.png | Bin 0 -> 2252 bytes .../img/GriddlyRTS-tile-barracks-Block2D.png | Bin 0 -> 157 bytes .../GriddlyRTS-tile-barracks-Isometric.png | Bin 0 -> 427 bytes .../img/GriddlyRTS-tile-barracks-Sprite2D.png | Bin 0 -> 203 bytes .../img/GriddlyRTS-tile-barracks-Vector.png | Bin 0 -> 78 bytes ...ddlyRTS-tile-barracks_disabled-Block2D.png | Bin 0 -> 157 bytes ...lyRTS-tile-barracks_disabled-Isometric.png | Bin 0 -> 414 bytes ...dlyRTS-tile-barracks_disabled-Sprite2D.png | Bin 0 -> 199 bytes ...iddlyRTS-tile-barracks_disabled-Vector.png | Bin 0 -> 78 bytes .../img/GriddlyRTS-tile-base-Isometric.png | Bin 1347 -> 416 bytes .../img/GriddlyRTS-tile-base-Vector.png | Bin 78 -> 78 bytes .../img/GriddlyRTS-tile-combat-Block2D.png | Bin 0 -> 101 bytes .../img/GriddlyRTS-tile-combat-Isometric.png | Bin 0 -> 1184 bytes .../img/GriddlyRTS-tile-combat-Sprite2D.png | Bin 0 -> 272 bytes .../img/GriddlyRTS-tile-combat-Vector.png | Bin 0 -> 78 bytes .../img/GriddlyRTS-tile-fixed_wall-Vector.png | Bin 78 -> 78 bytes .../GriddlyRTS-tile-minerals-Isometric.png | Bin 1305 -> 590 bytes .../img/GriddlyRTS-tile-minerals-Vector.png | Bin 78 -> 78 bytes .../GriddlyRTS-tile-movable_wall-Vector.png | Bin 77 -> 77 bytes .../img/GriddlyRTS-tile-ranged-Block2D.png | Bin 0 -> 91 bytes .../img/GriddlyRTS-tile-ranged-Isometric.png | Bin 0 -> 1173 bytes .../img/GriddlyRTS-tile-ranged-Sprite2D.png | Bin 0 -> 235 bytes .../img/GriddlyRTS-tile-ranged-Vector.png | Bin 0 -> 78 bytes .../img/GriddlyRTS-tile-worker-Block2D.png | Bin 0 -> 99 bytes .../img/GriddlyRTS-tile-worker-Isometric.png | Bin 0 -> 1232 bytes .../img/GriddlyRTS-tile-worker-Sprite2D.png | Bin 0 -> 324 bytes .../img/GriddlyRTS-tile-worker-Vector.png | Bin 0 -> 78 bytes docs/games/GriddlyRTS/index.rst | 587 +++++++++++++----- .../img/Heal_Or_Die-level-Block2D-1.png | Bin 5214 -> 876 bytes .../img/Labyrinth-level-Block2D-1.png | Bin 1160 -> 455 bytes .../img/Labyrinth-level-Block2D-3.png | Bin 1179 -> 455 bytes ...tially_Observable_Bait-level-Block2D-1.png | Bin 785 -> 276 bytes ...tially_Observable_Bait-level-Block2D-3.png | Bin 1072 -> 319 bytes ...ly_Observable_Clusters-level-Block2D-1.png | Bin 1039 -> 298 bytes ...ly_Observable_Clusters-level-Block2D-3.png | Bin 965 -> 298 bytes ...servable_Cook_Me_Pasta-level-Block2D-1.png | Bin 825 -> 338 bytes ...servable_Cook_Me_Pasta-level-Block2D-3.png | Bin 882 -> 338 bytes ...servable_Cook_Me_Pasta-level-Block2D-5.png | Bin 879 -> 338 bytes ...y_Observable_Labyrinth-level-Block2D-1.png | Bin 1160 -> 455 bytes ...y_Observable_Labyrinth-level-Block2D-3.png | Bin 1179 -> 455 bytes ...Observable_Sokoban_-_2-level-Block2D-1.png | Bin 1155 -> 200 bytes ...Observable_Sokoban_-_2-level-Block2D-3.png | Bin 1062 -> 149 bytes ...ially_Observable_Zelda-level-Block2D-1.png | Bin 1195 -> 481 bytes ..._Observable_Zen_Puzzle-level-Block2D-1.png | Bin 651 -> 321 bytes ..._Observable_Zen_Puzzle-level-Block2D-3.png | Bin 863 -> 301 bytes .../img/Push_Mania-level-Block2D-1.png | Bin 1885 -> 540 bytes .../Random_butterflies-level-Block2D-1.png | Bin 1543 -> 595 bytes .../Random_butterflies-level-Block2D-3.png | Bin 1605 -> 595 bytes .../Random_butterflies-level-Block2D-5.png | Bin 1839 -> 595 bytes .../Random_butterflies-level-Block2D-7.png | Bin 1748 -> 595 bytes .../Random_butterflies-level-Block2D-9.png | Bin 1621 -> 643 bytes docs/games/Random_butterflies/index.rst | 2 +- .../img/Robot_Tag_12v12-level-Block2D-0.png | Bin 1256 -> 1895 bytes .../img/Robot_Tag_12v12-level-Block2D-1.png | Bin 2945 -> 891 bytes .../img/Robot_Tag_12v12-level-Block2D-2.png | Bin 2660 -> 3129 bytes .../img/Robot_Tag_12v12-level-Block2D-3.png | Bin 6113 -> 3161 bytes .../img/Robot_Tag_12v12-level-Sprite2D-0.png | Bin 5380 -> 6411 bytes .../img/Robot_Tag_12v12-level-Sprite2D-1.png | Bin 12604 -> 13629 bytes .../img/Robot_Tag_12v12-level-Sprite2D-2.png | Bin 15770 -> 17277 bytes .../img/Robot_Tag_12v12-level-Sprite2D-3.png | Bin 38142 -> 40453 bytes .../img/Robot_Tag_12v12-level-Vector-0.png | Bin 266 -> 273 bytes .../img/Robot_Tag_12v12-level-Vector-1.png | Bin 620 -> 616 bytes .../img/Robot_Tag_12v12-level-Vector-2.png | Bin 664 -> 665 bytes .../img/Robot_Tag_12v12-level-Vector-3.png | Bin 1410 -> 1431 bytes ...Robot_Tag_12v12-tile-fixed_wall-Vector.png | Bin 77 -> 77 bytes ...ot_Tag_12v12-tile-moveable_wall-Vector.png | Bin 77 -> 77 bytes .../Robot_Tag_12v12-tile-tagger-Block2D.png | Bin 144 -> 203 bytes .../Robot_Tag_12v12-tile-tagger-Vector.png | Bin 77 -> 77 bytes docs/games/Robot_Tag_12v12/index.rst | 42 +- .../img/Robot_Tag_4v4-level-Block2D-1.png | Bin 2120 -> 891 bytes .../img/Robot_Tag_4v4-level-Block2D-3.png | Bin 5301 -> 3161 bytes .../img/Robot_Tag_8v8-level-Block2D-0.png | Bin 1895 -> 1256 bytes .../img/Robot_Tag_8v8-level-Block2D-1.png | Bin 2708 -> 891 bytes .../img/Robot_Tag_8v8-level-Block2D-2.png | Bin 3129 -> 2660 bytes .../img/Robot_Tag_8v8-level-Block2D-3.png | Bin 6641 -> 3161 bytes .../img/Robot_Tag_8v8-level-Sprite2D-0.png | Bin 6411 -> 5380 bytes .../img/Robot_Tag_8v8-level-Sprite2D-1.png | Bin 13629 -> 12604 bytes .../img/Robot_Tag_8v8-level-Sprite2D-2.png | Bin 17277 -> 15770 bytes .../img/Robot_Tag_8v8-level-Sprite2D-3.png | Bin 40453 -> 38142 bytes .../img/Robot_Tag_8v8-level-Vector-0.png | Bin 273 -> 266 bytes .../img/Robot_Tag_8v8-level-Vector-1.png | Bin 616 -> 620 bytes .../img/Robot_Tag_8v8-level-Vector-2.png | Bin 665 -> 664 bytes .../img/Robot_Tag_8v8-level-Vector-3.png | Bin 1431 -> 1410 bytes .../Robot_Tag_8v8-tile-fixed_wall-Vector.png | Bin 77 -> 77 bytes ...obot_Tag_8v8-tile-moveable_wall-Vector.png | Bin 77 -> 77 bytes .../img/Robot_Tag_8v8-tile-tagger-Block2D.png | Bin 203 -> 144 bytes .../img/Robot_Tag_8v8-tile-tagger-Vector.png | Bin 77 -> 77 bytes docs/games/Robot_Tag_8v8/index.rst | 42 +- .../Sokoban/img/Sokoban-level-Block2D-1.png | Bin 1650 -> 276 bytes .../Sokoban/img/Sokoban-level-Block2D-3.png | Bin 1521 -> 245 bytes .../Sokoban/img/Sokoban-level-Block2D-5.png | Bin 1286 -> 200 bytes .../img/Sokoban_-_2-level-Block2D-1.png | Bin 1155 -> 200 bytes .../img/Sokoban_-_2-level-Block2D-3.png | Bin 1062 -> 149 bytes .../Spiders/img/Spiders-level-Block2D-1.png | Bin 555 -> 162 bytes .../Spiders/img/Spiders-level-Block2D-3.png | Bin 842 -> 248 bytes .../games/Zelda/img/Zelda-level-Block2D-1.png | Bin 1108 -> 276 bytes .../img/Zelda_Sequential-level-Block2D-1.png | Bin 1108 -> 276 bytes .../img/Zen_Puzzle-level-Block2D-1.png | Bin 651 -> 321 bytes .../img/Zen_Puzzle-level-Block2D-3.png | Bin 863 -> 301 bytes docs/games/img/GriddlyRTS-taster.png | Bin 115589 -> 97731 bytes docs/games/img/Robot_Tag_12v12-taster.png | Bin 38142 -> 40453 bytes docs/games/img/Robot_Tag_8v8-taster.png | Bin 40453 -> 38142 bytes docs/games/index.rst | 14 +- docs/rllib/multi-agent/index.rst | 2 +- python/examples/rllib/rllib_rts.py | 11 +- 139 files changed, 486 insertions(+), 214 deletions(-) create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-3.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-3.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-level-Sprite2D-3.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-level-Vector-3.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks-Block2D.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks-Isometric.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks-Sprite2D.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks-Vector.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks_disabled-Block2D.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks_disabled-Isometric.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks_disabled-Sprite2D.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks_disabled-Vector.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-combat-Block2D.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-combat-Isometric.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-combat-Sprite2D.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-combat-Vector.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Block2D.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Isometric.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Sprite2D.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Vector.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Block2D.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Isometric.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Sprite2D.png create mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Vector.png diff --git a/docs/games/Bait/img/Bait-level-Block2D-1.png b/docs/games/Bait/img/Bait-level-Block2D-1.png index 9dfa12cf3769a0352d49d5d4e5373b33d6fd4eb5..54890ef95d46de3f83dab80c9c17c7f48fd7a024 100644 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TZ*VXH$q#xN+(7EKr;B4q#jUpo4H<#FLkqt8 h=kmxe05XR>uwxTD%D|XWAbJ|)6;D?`mvv4FO#uA(6kz}W literal 785 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TZ*VXH$q#xN+zbp%H#}V&Ln>~)y?d~5v4cR{ z#fjdM3uhEaOgUs==;-rfUGwS|sWbfV=hj4gPh4|;Z-)2gwT$iM*=u0j^X=AYB=GoS3Rq9MQ$h*1ne7zQyYI`ua+cD9|Ha*H$jo3UOF5<(;Q@C{U;7tqIds0W}6~k=DKHQ|>PC z@)-vM!?i!6r}nPdFn7{EzF$4J{+6uXU;c02UJJcnb?w=o)#oCA?tE`>e72{6!wP`||DTDidH;L+zdsgzd}rODL5~{jpr8lg2eEej zQfHof=K@{Mz_7vm`>$tbS3a84{H(&QmBFc%;h(JOjOtpDEOJzU;ua}h%N~4Qaj<6J z6_8a74AsT!^Y6{kI%k>Dmmb0au?A$-HbdXLCZ*@Vp_)TXsM_*w7dTdJlh&TF7@B|> w8Wi4rH9bD3!E#=pBE&%i(}#c-!;~Ma%f-BQ7My*d4NU3`p00i_>zopr00&nu@Bjb+ diff --git a/docs/games/Bait/img/Bait-level-Block2D-3.png b/docs/games/Bait/img/Bait-level-Block2D-3.png index d3bab6e323d334e59c256c27779308a2cad0bd04..fb6610be29cdec75d6fac4784d44b0e03a10868c 100644 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0y~yV6*^Y4h|-uh)a6?1R#ga)5S5Q;?~=PjJ!a>Lkqt9 i=kl|Q0GT5R{E;|T%D{Nw;dWb)uRUG;T-G@yGywo1I}|Yh literal 1072 zcmeAS@N?(olHy`uVBq!ia0y~yV6*^Y4h|-uh)a6?1O^7?@18D>Ar-gY-VMyV84fFlqyE@Wab=$cer+jzh0 z%h&6VZ!G?qZue*F_xHPxr@wz}Y~S}^_1*NQ|BKqhC(B*_GC@KnagmYk=}*_5uYY~( zsO8KpvsU!S%QFbh|HZV>xpvPV<%C5|0r%yXw`t8-p>W0N@s$8pVbPYTj5$)PKr-CD z!Oo&SAp%(!Ei+d%b#giBnke#yR-F91LS*-R<6D+$S*j5`Iwo(CK+g=XyN+xd$+nItk*ASQjBvyyKDP3%k}3^ z9&tg@4+};R4GKz&ivr&lr`?TyEh8*?!aDHnT2-d|_6!G%zx{HG75x4yO*A)tWAUvy z!tJZ~U1-!2zB(@g;y}iQSR4m3^wNqV`&G6ZfdSNc%J||pQS0SrEg2m2pyu5Ye*IiE ztKh0Q%pLfmv++`O?b}XP1_iC^+J);ns%u|%+n&ii_j3-=EfD*W+yDw32u7rn6=%;a zS$OmCoo6x(3T#j_-j>ULp0no7SJrzER_Pzrfych!j1~9|{ZwSHb#%%uaLj6L=zf|O zFnu4xf#CQLSIX<-_0$~MTexI7{#s>Sv)u@cRbX)XTsgc=cK`Orr{B+K0j3*hfFpbO z!OB_hzkaogGYCwS3ESup8@91w`921Q30>Wu0pSz({V_9VnpywsaD4UubANX2?e+x6 zKwbFrnj*g~@12Fg5$Lup_w%;1AivM=z5L$}lr1c*{G$0n7Xp*y%Hx@v7ixtV1SbP0l+XkK3=+0n diff --git a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-1.png b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-1.png index 9dfa12cf3769a0352d49d5d4e5373b33d6fd4eb5..54890ef95d46de3f83dab80c9c17c7f48fd7a024 100644 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TZ*VXH$q#xN+(7EKr;B4q#jUpo4H<#FLkqt8 h=kmxe05XR>uwxTD%D|XWAbJ|)6;D?`mvv4FO#uA(6kz}W literal 785 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TZ*VXH$q#xN+zbp%H#}V&Ln>~)y?d~5v4cR{ z#fjdM3uhEaOgUs==;-rfUGwS|sWbfV=hj4gPh4|;Z-)2gwT$iM*=u0j^X=AYB=GoS3Rq9MQ$h*1ne7zQyYI`ua+cD9|Ha*H$jo3UOF5<(;Q@C{U;7tqIds0W}6~k=DKHQ|>PC z@)-vM!?i!6r}nPdFn7{EzF$4J{+6uXU;c02UJJcnb?w=o)#oCA?tE`>e72{6!wP`||DTDidH;L+zdsgzd}rODL5~{jpr8lg2eEej zQfHof=K@{Mz_7vm`>$tbS3a84{H(&QmBFc%;h(JOjOtpDEOJzU;ua}h%N~4Qaj<6J z6_8a74AsT!^Y6{kI%k>Dmmb0au?A$-HbdXLCZ*@Vp_)TXsM_*w7dTdJlh&TF7@B|> w8Wi4rH9bD3!E#=pBE&%i(}#c-!;~Ma%f-BQ7My*d4NU3`p00i_>zopr00&nu@Bjb+ diff --git a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-3.png b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-3.png index d3bab6e323d334e59c256c27779308a2cad0bd04..fb6610be29cdec75d6fac4784d44b0e03a10868c 100644 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0y~yV6*^Y4h|-uh)a6?1R#ga)5S5Q;?~=PjJ!a>Lkqt9 i=kl|Q0GT5R{E;|T%D{Nw;dWb)uRUG;T-G@yGywo1I}|Yh literal 1072 zcmeAS@N?(olHy`uVBq!ia0y~yV6*^Y4h|-uh)a6?1O^7?@18D>Ar-gY-VMyV84fFlqyE@Wab=$cer+jzh0 z%h&6VZ!G?qZue*F_xHPxr@wz}Y~S}^_1*NQ|BKqhC(B*_GC@KnagmYk=}*_5uYY~( zsO8KpvsU!S%QFbh|HZV>xpvPV<%C5|0r%yXw`t8-p>W0N@s$8pVbPYTj5$)PKr-CD z!Oo&SAp%(!Ei+d%b#giBnke#yR-F91LS*-R<6D+$S*j5`Iwo(CK+g=XyN+xd$+nItk*ASQjBvyyKDP3%k}3^ z9&tg@4+};R4GKz&ivr&lr`?TyEh8*?!aDHnT2-d|_6!G%zx{HG75x4yO*A)tWAUvy z!tJZ~U1-!2zB(@g;y}iQSR4m3^wNqV`&G6ZfdSNc%J||pQS0SrEg2m2pyu5Ye*IiE ztKh0Q%pLfmv++`O?b}XP1_iC^+J);ns%u|%+n&ii_j3-=EfD*W+yDw32u7rn6=%;a zS$OmCoo6x(3T#j_-j>ULp0no7SJrzER_Pzrfych!j1~9|{ZwSHb#%%uaLj6L=zf|O zFnu4xf#CQLSIX<-_0$~MTexI7{#s>Sv)u@cRbX)XTsgc=cK`Orr{B+K0j3*hfFpbO z!OB_hzkaogGYCwS3ESup8@91w`921Q30>Wu0pSz({V_9VnpywsaD4UubANX2?e+x6 zKwbFrnj*g~@12Fg5$Lup_w%;1AivM=z5L$}lr1c*{G$0n7Xp*y%Hx@v7ixtV1SbP0l+XkK3=+0n diff --git a/docs/games/Butterflies_and_Spiders/img/Butterflies_and_Spiders-level-Block2D-1.png b/docs/games/Butterflies_and_Spiders/img/Butterflies_and_Spiders-level-Block2D-1.png index 74920bd7924dcf97535ad5318b5b037d85d31773..279576afa2fd8cc9f7e45d8d9a24830f347c5c6b 100644 GIT binary patch literal 595 zcmeAS@N?(olHy`uVBq!ia0y~yU|PVyz{tVD1Qg-_d9ep5Am!=e7*cWT?LkIHpkR~2 l|Mhtu4j|?z7}+79&!*78z*urU_b4bFJYD@<);T3K0RY(=6T|=j literal 1543 zcmeAS@N?(olHy`uVBq!ia0y~yU|PVyz{tVD1Qg-_d9jCqf%TlHi(^Q|t+#g_Cy7|{ zI0Vi-@%iP3T?=lC3tUJko0_wK`>Lsn3$1=f2MY@@GUTMYxP;z~Q8iwhEc-g*xYf0d ze)CJ~c06V{P{$(207L>63=R(%85-F^91Q+FF@}Z%%nVHY3>-EL3Liim1Rv-mhB7+1+%8{qv>&+3ag(Z{X#$L1<%Ox__i+Mj7LC$vNpD%l7^L`r#?F#rX#| z+#r)<*SELH%}Fnq#|m`P57%`>@TzyrY1fzD#sD%=80I>VQ$ZlMr(?yc*{f5Qtz~I& zx4D#h{~+^$Hf%mb4*}wRocna+9QirVF4S0{I#8x#xk-X$MA&2Cd}-~YT76wm(GHy$W>u=97NjXpRnh)Htuu+Q5) z|M=%e8Pj!d9NoYQ<}d-n8=fGbUIn>iiwVpnlV;CxZeXvM#|#x6@gFbaZP^|qynnlZ zQ;xysL-{&geR+llD?a|+D{FF)xqOqX`%wfBt57E6O!YKK{MD z^a3yx)PA_H(`~C@@RPfL|B@rnEi)d>-?dHR5u-(A&HsOVarbw8`;fzEal_sEh5be3 zcn7)h0l%9|$knr^M*jhjjMm|)i+A+5eIwt!-*N6 zJ~4iX19L8v`WUWh`0fPCKkcr^L=JOR=$n<_WIAV%!&ss31I{jpgaFDoKyaWPo-|uj zEABs>@cl~p2Zjxbz~}(Q2y%LCeEv7>$QJGgdk+)?6OO}!-SOe^b`1Bp&&z^T?t5K& zb*bnc@p-$S>w&D&FN!VAWPRWI{M}Cb2b);un}Hnh;f^m_t_9{|5ZJI)P%yN#c%gP3q3GL4w|2_?M)~>$yZ50qv*JI_*HsHeGu+rn* zigMs0Byr-$y8`^+VA*iuM_vaz*e4MwHReZ{!NrG;(LU)%j9@Q{N#5uEcpyzL`as<= z2{T5Jb29R=mm~kwtwGL0Ds>b-_@3dY|1EjW*y23M;F{mB9|CjJyn~fu;4q5g=e30w zE8Q_f@V*yV^2Y;13uK}ia&ZW9*e(gdz)lRl8rv#)f`<#btUl_nol?HN-TMU>b1 RvCaco=IQF^vd$@?2>=v$EfW9$ diff --git a/docs/games/Butterflies_and_Spiders/img/Butterflies_and_Spiders-level-Block2D-3.png b/docs/games/Butterflies_and_Spiders/img/Butterflies_and_Spiders-level-Block2D-3.png index 6102a454cb9dd72a1babd7af51cbfcef6f2de0ef..279576afa2fd8cc9f7e45d8d9a24830f347c5c6b 100644 GIT binary patch literal 595 zcmeAS@N?(olHy`uVBq!ia0y~yU|PVyz{tVD1Qg-_d9ep5Am!=e7*cWT?LkIHpkR~2 l|Mhtu4j|?z7}+79&!*78z*urU_b4bFJYD@<);T3K0RY(=6T|=j literal 1605 zcmbtUZA@Eb6h1A`GO#T$9Y!l4I0YjzM9CQ7m=+6UgE<8@gu#Maab=98Vw>`Hp?_py z6%!mVU~^7fnC)OlG?q9mWGh=(au*nY> z7VjT3S3Zcp)P78K35zyU5}2%{?(}n zI!M?CQk;PV6;yEb11|v}W2^lV3EX2Kzyz4u1;`BCaM%czdgvQ_{N$C1w9;&lgtlZ~ z=y6e3qM(oBVqF|OdQ?uWGfJXtNmLnfMwtEx4@UzP<(%I6 z^nM%0jfcAKi_ui@%Uv_fy*0{&_MS~d2p;~lH~Dx=Wj!G>?Kb_`Rih^+Ygy`x5WwLY zwTlCOpG2X68iXvq$H3?+0Yp8=9hxW4%#{#BkfW8|`uoqO=C6n; z8vpcEM@$rFhF9De1REv1x6w}{PZ>o70@DP04`#gBbckD23pIf)eOqP=DrPQspFTz* zCb+A|qLjnRprSYHeLUbyrCI00V0Q6ua0yhIh?m{;r`nnMJXfd=K|R#O4)gtQlJZR} z?sSaitPLE{(59gFBtgR0za7^YNICnEGHl{-D22>uy3GFk3Y3Kr4Ahq%7|nWQ6dkxO z!StSl_6jFCK9pOX`yXGQ2^~*p zU%IJ%L`7NfkI~cX95KfP?E$DR=e2?xTWr4T<7)*m=O7Oi3n}S=-^n6(w`d;(lLF$C z>S9Gy%x&BHNug1}pRxHyEaUAaRs~0kce+MceD+?%ZEpeE4nO^l%B3cJLa5tzW3b;4 z3kNkUQgALyAG!da&8|&OMRUbCEvgl}6XOlEhX@I=CB}0Ctke8Zikt>sZnTQQ6yK09 zrcL0k#NO;$#a{)_Y7D1aYya@V@k7Bi7K?kTFiCoc$?FfliH-)2*m{c&J6>_FmFSIA o?VGk391GM=A2CTpy@36^PT7^cv16yAcnMFI7@y3#_Fhiqzt<6SVgLXD diff --git a/docs/games/Butterflies_and_Spiders/img/Butterflies_and_Spiders-level-Block2D-5.png b/docs/games/Butterflies_and_Spiders/img/Butterflies_and_Spiders-level-Block2D-5.png index e9af362f65fa3368125a6acb5643b92a8f96b6b3..279576afa2fd8cc9f7e45d8d9a24830f347c5c6b 100644 GIT binary patch literal 595 zcmeAS@N?(olHy`uVBq!ia0y~yU|PVyz{tVD1Qg-_d9ep5Am!=e7*cWT?LkIHpkR~2 l|Mhtu4j|?z7}+79&!*78z*urU_b4bFJYD@<);T3K0RY(=6T|=j literal 1839 zcmZ`)eN<9s7=JG)SQ}Bc^`Qo~Oml6y&Ya~^&}N5;&a8FHwWTI5&9=$rN>f@sWG)#j@UW04enIkhK8dN&rBdoN&-We%8JZ0D>_zBzPUC`=7h*LRatUj*(FY(@>Sw z-BN$x;NiNXscCD(Bii_r&RKJ}tC#16A>gJ|Qh3jzE$lqv|L71)2p=;OTIt0pz@3Va z0geKu>w!Q(1P%efU4sNE@UPpPIA22)lb(XOfUIF7^ND3S^CRsEDf@|W2vxI((Y*^;5 z%Z%#&qLWwf4%hQ;&Hka*-z5OZA{E4^ExjE@AnFl3*T+_VnzNp-#sxJJniRKAIFk$R zL$enzTXae70X&-Q3Bc>1D<=c3p|kcawI=L?j6xTO%0V9=)YXaOm$Zi#lU!v!d!_ez zE{&nU3kae-^D#M>+dS2re=lyJk1R6N~!n;3XD!Qy-6{;j!px*zk%;b=`{SxP>SyE$+gZTKfhA=H9#drB~qU29lADj<5I zOc7O$R|BJuoT^YZD+4})FkAuzvrLIwh36aj-7>WJ72*Yo)u*BV zx8(3_qF^^X;KV`Gqi6xW?8TH-IMju9ed zC~3xnX522TISjMn9IPD6G6ePxa29ElQXd530y|g=(GxlV;++{OsdaKtPzk*zh7#r% zM7<&fjdPK<`pwCEdtXW3px>|z4KE8{`;2 zlB`%@5={z9rIP!XHACj;BdXzHoS^Rg`C$)BU|1KcmX+^JmTg}cFLmoci94S8-BA4$ zS>j7WleX$=ucspK*8<5-z3dq{BRwZz*zpxqH)hg_OysYXUkHh8yh~v%h_*2jZN)@aItp5f6m{y7Xj@Sw8Imp0H6)~RYb_ym9bg>0p@`2QUCw| diff --git a/docs/games/Butterflies_and_Spiders/img/Butterflies_and_Spiders-level-Block2D-7.png b/docs/games/Butterflies_and_Spiders/img/Butterflies_and_Spiders-level-Block2D-7.png index 0fb0fe63fb6ab9c918e3ddab2bb0b7fc8b59cc3f..279576afa2fd8cc9f7e45d8d9a24830f347c5c6b 100644 GIT binary patch literal 595 zcmeAS@N?(olHy`uVBq!ia0y~yU|PVyz{tVD1Qg-_d9ep5Am!=e7*cWT?LkIHpkR~2 l|Mhtu4j|?z7}+79&!*78z*urU_b4bFJYD@<);T3K0RY(=6T|=j literal 1748 zcmZ`)e@qi+82;Jg7y0YpV?K?bd;n1R|u!IodL@9yf*srSd_zBl*X^L+37JkRAu zN3C|4`t?)*fJ5XO&UygIrvM<)Xk=KS58poufL%!>XT?V3(aWwCsZRr@hu#1F-t#A0 zGgc&}cs;q~nJ_QUqzqmXEopBQKD_cvJ^-x?o$e>p2A$RI&JXG>-Ue^YOP@3EE&~NJ z4Mn1%05ToWSil_xaPjFngbb!5Ak0Vt*;HV|z!sBhNJ`RGba$DuZ7@ZV+*qbu?6DOmpfb!wyAVifRmsB6@(HN3suf>*mBk}E5$ zr-&-v-|4%5b(T6;vrOwGabSSBEe3sjPYMdq*dq-`F5jSpt%UT66F@QmrFzXvNDeG- zOK|f7)0UiR3eBNPeu4xD=J+uhD(EA@rxaI~jltBo?_&AVSFmNOc;o0<=F6qjS=?B6QF_bhG9kaT zho-S(KiJk*A*~=F0xZ(FJnJLgNNX=Ky7jU1PFEjDTdRB+L!NSUIgQ1Cg~gvTvE9b$`PN;~xCTlR!}lDLM&1BA%( z6sF^ddyUM4PuDtufd6R>+X*kD*ZXHRcI5lJ3Y3PA-2TlInHo->Bh15ifMS zGfOCToZs?jVW#16^-!1d-W)1mI0`2Q8iYxX<##`>+Y1{8<%W`5+NuMM-RVe*=-O@G zn|(II*g4r|H`NUuw|1S93cIQ59ZAhC+mqvW><$TP8Z=kcZ|SkcJ3A{Law@khJ_r({ zkMLBO!53Ja8vM9=N1ZR&@7n6uu$>B~Okqtr)GBrwYx_fwF`0sdyYd{*K=&gwUMzrI zD7YhhE<>>Fr=j_hJk`Fbv9eMO^B`LIFDz;ayw~SDl@d)g>EtEAySfq1mlF z%05Z}oR^`ED&lU@1%c)cH!MiT#IhKvORwhog{dzd5S2< zqj)GW5zU{40M!kOXJUr&VxTEF{R;G(1H*lwk;1M?ajB8ByE#Pc(7^?zsow_^y2V?| zi|8j;;1ayiXmH5jMs|() zk;ng3xX`xy@s|9`wIzz=r+g%qHX%!e!3 z&pTvS26KX3|0dtnCG>8Ls&TF=gUzFfdcXb47z`#HV21h>tnEO_^!e_^@4#$_X2W-H zna{}r1FVt#Mrn`n8Ow5T$SpW2kv;>aXtLosgXedE!Rzp#Q7w5+;<=rlCr;O8__i^p zvG_O(I5Z&v3Ub1M_Ar-_t7k)vE{8E4P?meSsr&2GuxE|4&eZ;X zunQ7rWwOQXyt{+fa|0vN;ep{keyOtMapFJ^G#p5-kvDncw^t7o@{PxT*k#<9TNTT& z|Jx?kKO17i8#uvH4vl}HOB&h;y95*%zl-Cbfl>GY7#Q5pz>qN!vC@YIhDC-(2~^SK z!V3W}_JAX{QSI@9g%>J6!UE&-A>4rhOswbPW1nk&yJ>aJGDY_N1I7deutm_63UxM6 z2$FJP{OznrDHRgRh?ENo@8!{gfuZK%Cw-zh8Tu=hoW6IE`G5m*szy)cFn&HaYF+_{ zH!SafO!nKZv}je{x=Ay)2{qU+vHqV>zo(hKp%Lgl6eoiC^Y*RlIIZ{P=KPhlRVNy)0&y7%_#T$-fCyMo1om7OTMMXjl(Rey<~-1@h+eR@kgZ fDQSsJgFjA```$1K2@zf#0E&B0S3j3^P6=PZ!6Kid%0F8ZrWThZcPG j&*kM`0AvnN&`{2tHXuX(yShE&{od&jYFv4Ma? zpwT0tF!{smE;1L6JIE++mhp9y;+Sz{*}dr0i%t%ocJERSIm}@4-jL_8iLZLU(fQ4f zE&3kEl+TH;3wQk8!sWyY!5pG3TpXeTS}?2-BA}%Z;;;gQ8v+;^Iu<>Pi+>RR?U$2? z6YD}I2u9Y5&<@ke5ODOc?t>}I{U53KH1FM4pjut4$hEL3fN`OdK=K^#vz5Q=e+B*e z9hP&d@^kvLpkLMdm%V+hRm}P6rD>oe&{7a)1gnQw*E)g8_Vw+@#e1s1{E&IS?z{Gx z;yr3$2P=fU=v3{UlN_sYVE+B&Z@&(ezWLg!0r%Xg`_raOn-U`qbaYYPn>~99Vu8Lr zb#Y_y=7+`CUkhm|T#-9=F1PJ`?0RpYmA@se%_Z#0_v!(C`8M}WiEYihs@VIcyIAjk z+PrQZw=guIfKhYvHTU&R*Tok>LXG8Nl#x%6wk zvv0_U<@&IofrKi^gNiEWf9+d){CUOq7auL}#a<76x8dpm7ib7G?6$qrbiShMutlN_ z&_~)p3j-k$1q|(}5+GmQVF!lL!#ftWm5smvD=3*GwF>A>r=^8iE4Y9zoqBBLLM>oa zhDa@MdzJX@SJ2J#yLNHHLT!icZFT!2y8;>*gs;ZM@95jRPoNbX?1~)@=YKuZ%>U;z z)B8sMp()$npO5*q+ukz2etNLi>-%l9Ry^>Jhb0a~JUMwZ&imT?N9Mhpt=;k6uWR+o zZ)7Db0>wBGH{5+wyi71`%K!5gH(qmxBLWVXzyA}l@Duxsqf0- z$EznQUc2=Z6k6~5*RSW_c_U*Gc5@iil{_B)L_S>3_$OU`%*}r~OV-N^U zG|MBzy_DB*v*sBDzWv(z8fa-C$Jf69uWj#wg7@hgaF{VJEP{ktix(u!1hgPw=CA@3 zW~+d156T1wYKzxZ%S>RP0u`t&0R}2i!K~i4tod%+7kHN?F)_&e5?*yJF8+9-%<-Ks vEcW>{@xh}Cny(bP0l+XkKM=i3b diff --git a/docs/games/Clusters/img/Clusters-level-Block2D-3.png b/docs/games/Clusters/img/Clusters-level-Block2D-3.png index c54c511f7a14e5595fa9fd0127aad82b1d1e6e07..19d7c21505d9a91ca6d27078a9da5cac8dcaf24d 100644 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TKX5PsN$HF41Ax>=PZ!6Kid%0F8ZrWThZcPG j&*kM`0AvnN&`{2tHXdpunnLn>~)y&LHF+CaeJ zqDZQ+=;;qki*+uXUa_m^Q~VOPS%q2Y=YFo5H({yx4xW%}2EGp8^)8#}p5F9%N@?ue z$1=~iSU*4gUF*gC0LK*#V9dC%DS&YylM^cpw{SVJws3KXg0O%V14E?CyRWQuo3D#+ z63_yPfUrUc2s^BRVKk!}1jPFr^lWNe_Z#_t`{m>f#A09zT2<2eAME$KS(m@y+T(k% z(Ox(I%-9+>-$EE_ z@tQjl;@U|C*UKwXZ{B+yef`z{)I}gaRk5Hu@leK{ud??d-|v35^LX|msNWj`)Z@Z) z78^e|M0f9BzTELKT>AyV3ITRQ;83umBe4*vF_Q!1RUElY4oVD zKre*Hgnysod&SW8?ONY`|HFWBb-DlYa`E}L>_EF^E9bnEY5R7cOH^Q0;ji|3n`bh> z$oi`D_)BkM#{acIM@cQWwo~{fQ}t}!`{OQe*S^jDzqWdh8Z_z{7%I-j#b=z3i$CE6 zj=>2oi+1l@n)BZ;es%fLs*O|L{ymU=wrKqgm}5cd0g)zxyh^TLx4pOV2}<|@BV5j= z#&N$1dH|;NCzN~>oelH>mXxOcblv+8Xi=*NirOSZxP0x||JK$96mF^SEo!S8f#!UA zXJH!B%Ed8tL1ESkU?^xgKE48s0)>#KV=I9%;IM+FHy9WJ4FQ~UC%3HvY7jC}`OA83 TvzQEE_GIvM^>bP0l+XkKYBq~S diff --git a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Block2D-1.png b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Block2D-1.png index 701ee2ae2109ae2cf6e03eb2869e5dd97418a1fa..14ad67145cc986e2664b03ae68d6e7fd9a1c9028 100644 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0y~yUEaktaqI0tLq?$Bp#@+4 hb9v+!0GT5k*s%#5VPGt0e|rTK5T34nF6*2UngC7T69fPN literal 825 zcmeAS@N?(olHy`uVBq!ia0y~yUmj!!Gb_N4d?cLG2o?K%MbC3QCq|AHSAbl9lBb`M&U>4^S>V)PVAAF1KL=3 zw9@?3%+K>|K8eY($Q!?Rvn#%r?EY`oH}QMh?%tNqxLtd<)*J3(kXH&ORliJ>dbgCF zjRRx=wg5m81nHSu{c`bLyZq(<-~4_2PWZ?1JKp>}#0Q?$_e+OO=%wZViRbH9ow9Zj zv7g3#kp0Z>hm4?5nhFdhps)Tc`keRVb6mr>6a3pj!t;Q_fuHLtfbsof>GQiM+|O2j zIuTtVP;+mO^v@NQ{jxt-hc~j+EjP}1*j{$~gfcLtoIbmIqB}6Xh|euo<_8AN0sCTo zTc5*wzZ_sV*o>Nr;Hd*SX@P=sLG`D-U(OZw703OQ`R~o|NMw>~*u0Nng3Rvd)1BW= PfsFBV^>bP0l+XkK<3}qw diff --git a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Block2D-3.png b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Block2D-3.png index 39e7dacb8f64d0f2f847f0e696f32fec2cda90ef..14ad67145cc986e2664b03ae68d6e7fd9a1c9028 100644 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0y~yUEaktaqI0tLq?$Bp#@+4 hb9v+!0GT5k*s%#5VPGt0e|rTK5T34nF6*2UngC7T69fPN literal 882 zcmeAS@N?(olHy`uVBq!ia0y~yU_4OU_D7?5G;xCLo&v(&+F!?pJV8+_~EOJL84l$7(LEX!kg}{;9(U&SSqHF#>J0 zJ5^!+M9@az$AZUqC!Ak4^^%bMc254L^CtIre}+7+{Rnc(!sELY=V$Fnm;0nj{y|i*DB&|K#p*id=Ck+5@3ieF-rZ-ecj5s)CZ9oK(4t~tp8VQ?c4kF zqwad2mq7Q)!)C9{^?!=Ifx-H40yL@wQbExKwA=Z`$9ZKZ{Nq@SPJF1h@&%d;O;kW* z8|oj${R(~4U)#6Qp7ij29dX>sJ??mTm4^$=O!UNv64ML}H(rao>HUg*6T|{a5)7WM KelF{r5}E+3R9tod diff --git a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Block2D-5.png b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Block2D-5.png index 0e0d8881a9e778a504390d4417fb67f645c36a75..14ad67145cc986e2664b03ae68d6e7fd9a1c9028 100644 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0y~yUEaktaqI0tLq?$Bp#@+4 hb9v+!0GT5k*s%#5VPGt0e|rTK5T34nF6*2UngC7T69fPN literal 879 zcmeAS@N?(olHy`uVBq!ia0y~yU11IB~QP3$cE5CIfHpydp^CZAs_@0)%6`&OOW z`2O?9AC}IO_kSU(bK^IhfIN{4Da+<-1V)ej6ppi+NO5OM=80|lWzFep`I-?!}n#`NTpJ<^{* z3NGPO0J30uvEJV)zfYa|yzAG$A71>eK;J>r9g?d+eu4N0DhSef_vG_S(Z{W>Nmk0n ozg#E)3=NcI3)hb9Q($1M&=2bn%_*HYNfu;?r>mdKI;Vst0E3THJpcdz diff --git a/docs/games/Doggo/img/Doggo-level-Block2D-1.png b/docs/games/Doggo/img/Doggo-level-Block2D-1.png index 331ec464dd2c353b12e2046f1a0632bfc466f234..a5bfa50ab7cc2d293059f33047a7c9d634816009 100644 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^D?pfo2}u6dG~)J;=xlN;uunK>+Nk{z9s{KhKnm7 z*2ruVm*G!H>bR2G_&w}jfY@J|I}We+vY-FFiS>}O4SpmjczcEL+uwQS+&xu%i}D^B zE0q?nd@lI#^J7-Ed9&Njug^F9ct@i~?w^40`J;!Q`^P6f+L`dfrj|i%UU$p+h3$!t zA}wnEy-o13>25tgNp(hr7{~ml+=d^0xaJ2>PkyAyGyn9Q7Uj0P;rHJx^|rdoyfjJGi6QMX4a*jj@(LnBq;X~f?Bs@gop9e>UUYD!sqYAC%nI__oLsvq6I&y bUuB*$K{5C8-;P{hoG^I0`njxgN@xNAhAhA+ diff --git a/docs/games/Doggo/img/Doggo-level-Block2D-3.png b/docs/games/Doggo/img/Doggo-level-Block2D-3.png index 0f440e8716270cc007807cb7fe009bfeb89e1fbc..49f4e9f67682a9051c479f20e550fa1583c79500 100644 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^A3&Ic2}o`+K!KzC#8Au8z`A zYwXtO-&i9kSrop4PsgL;rcF%WR0f@bMdSM8*w;7e6Y5bxd@)toHp= zjmYrevGV)Nsbk{9XQg+aQOBey&hWgO6gRJSQ(tB|8+Y%5&ChOnBrjCde&JEC5Rt)R zTc6r%A|~~WMfSE0=l`4=--|-hJH7cpPC|7D$aO&Xf}G@d0qk@(M`ei9iSPwB-OURG zi3|f8>V|s)Tllx#FSTG|>)`HRD<;K)O#vh{zyZ@HVi$aZqjb7>(!!nBtyh14CsM!* k2`;EF;Wl9ju02&u47G}XKc5ha0H!DgPgg&ebxsLQ0M4e)egFUf diff --git a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-1.png b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-1.png index 6228cc49b5af6b430b674f7a63b792bfd9c11625..a5bfa50ab7cc2d293059f33047a7c9d634816009 100644 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^D?pfo2}u6dG~)J;=xl449P7z-p|*3N}lmx_W2aX$uZf!Yo0$5;pqQ>A1#@3Y3EhhsX=X3 z32X1^8@ztJsbYFni+crr^iWU^ihg%`2p)>G(QetFfA@v%yqkyZ*W3Zpm52A=*?uwF z#<;D1bI#)J707X`SC|DCG6UE3h%r4ru6H- z&?(-w+Pd@h+s{nxhC508o~8iI%TT}1i>*8x8-MfB&F|(LuD#N!=z}Z9#fZPkJ2%1p Vr}a@u1z@Z)c)I$ztaD0e0st;!>wN$K diff --git a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-3.png b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-3.png index dd7cc19b48784bc840b821c6cf1bf521e59ba9e0..49f4e9f67682a9051c479f20e550fa1583c79500 100644 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^A3&Ic2}o`+PM3zK0DYS}(F} z4E%ONLhe*@MgN(Ud72ldJ;~2H{@g}1LwQQwE-jCfFP`?Jj_4{j;P%YSV6tuHmXUHD>f zKDloT(35k|d~Q(I&0z7h|7>&1W4Fh){K`{)AiJP`J^S^?c3Hu`J4bZCEQ=PClDBjK z%YcIj6bjJLa=ZWyt;6$Uf<0PxPK`g}^jMi4EC@FX5^kW-1iB5RS-=Etj^4SsljS0= zpY_}TwHaLr)O@6fF_!!Ov|_;&)h8COU&TZr8;0&EBu$XmW{(NJv2?}jpSSktU2uXM*H+jZH!U?%j1}lO+2z+(UTdh_SJ?pcTKn^# z&kjzkG`j>e*!}$Hi4*^o_V;c9N)&$HlfUG>&c=yiCLC6I^Zr|3;y1qmj2RYL^YiEX zzf69ey`=j3LDSaHZ*mX0_wC)Cy+pU<^|sv4e$n8hx9H4Lk#t6|d*P12=k%KItfyyW Wym`4N>p3uEFnGH9xvX+L~CULfz#g75yh heC7*)%s~hm!kH8L7#Q1Pb%H^z^K|udS?83{1OV6W7Ht3k literal 1270 zcmeAS@N?(olHy`uVBq!ia0vp^H-Pv92NRHdyVv$10|U!mPZ!6Kid%2*Ui6iA6luFC z?IOC6N8|9y!>Mbw^(^cSaEo#CkghCHQWQzp_`c`4)pHw3_KuHrKOHBs)kjWKeQ+ty zhLuCGr9;56g8+3Rpnd)8hp(;Ptlxe1m&@y4&zkcDe|Lxp*5|*8ect&t%I0nI^?xzf z9?#A{X(e87{VY3Mu>ZTg@*>%HF)xL5|5g2w6x?n0qUtV>N5SK{K9e3Cv-bYiQ!(f8 zbn_WE3;E*jt&mN!e%U`Gi|=^PqYl@atxawlPs#Mj9PLxww)uXe=d*$X8fEcE>fg-| zTw~OJ*llBYhwj(AJATM~lRLVv`^ULYl1H_QEz(4Gx7^sZ*I0bc;dP5|6bjnku~{6E z%E#W5RM(MvqP<|Et=!6XzNyZ?C}ziFVy;g8a1oaL{^_k{H3u>R^3+S-MRnMxAj-VP3xHP z+;qu(%k_UXh4<=xD|R_jwZpnzYW}y4HqUEf|NTB@{z7x#>E*gf*YxuvOpJ~MUt-N4x= zbH4sMasQIs#lxX?_F{rsI**o|`&r7*KhLh4P^$TpJ}2_#v7N%*9j<#CR9}DXSpVfu z{w|`~;g>;VWOhYq*!^x#X!KDR>+A!Bx`?f`SlHkUUBbDqwdRDojt3Xu`=XGe? zUH@bIwsgMyvnm@gY$+VB6mH+-wjJHux}QnvFW#E*c-{54Gg#&){l7MQ{hHTRQ>Sme zbp2}7oA3GiBF&E^*X(~+F1XQJ;;5AFJ^Ob`j|{Rz^4U~&eDq73dAPSc?2qI}i+25d zgUyd+_U#F@K2kpIyvDSdhZPrFBnif^T>wfQ%I+JJJLL1`1?m{L|8?K^Tj^i%e^6?Y zG3(mvbZ1AI+r~38W#~!!$I7|JU8&DDJl80TIl^y#9+X%a7tfG?#L1m5a{5f-_P{q= zJEX6J6Y;&pGh`l}yqyLTpC9;UQ^)*UmY`I;yDtfnM1dB|x}l|RP$C7Y|E8g)57rAz zu*(DIyc3xZa^~f>if609`6gK;-R63Z$p7t@XLt-#&x73UBY#xC`?}z>Q*~~HQl)?r ghoEAUz|3>`_q8o~PVeLP2bO0Hp00i_>zopr08rW|e*gdg diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-0.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-0.png index 543350561e8b5deb0682a8348d37f3866b675149..6b346a0044858a65983db2c71d52a9b9b61f0563 100644 GIT binary patch literal 1498 zcmeAS@N?(olHy`uVBq!ia0y~yU~B+k4kn<8_EM!63=FIbJzX3_DsH{KdpGyCheX@O zg%A6l7)>%;GwX%f9HS+(W^gNaDri5le?EI=@dk0fghF2FijN&}@0PF#T%T}B;H8y= zZd?s_!wP1Tn%@b9|8k0C9T*wk*f<=%Y_E4hUXVpYLE#$%@8thQVgEW5fKq|%88aeH zxa}fY8W}(7GAQw0$e8WZGkxtkW(|dgx$G|<>=JZLXkaMf514kppi{xXf#D~c#^d^@ zI!!>$Pb3z+@!!?05a7UYoG)O)|Jw^Wm{?f~dh}w-OX@Tj9O}-oGJkt0Cm>MPFo&B> zLt(*2#v(n51q}_y*iP(BXkcQJl2&-$#K^^wkwdD2WmC%aBIXBqy?o=&ZYmNmJ?XEp zneG4I$^mn(Z`yaqZt3Nx?p`bFe?M(!e<~hedD-}*J|pv%?)86m{$((5ko@G%;`q{Q z7kf##?ef$8ujg1h1}{6MfBgW%S?RvILj_+nmtM~NbH8-&ErkzaIV$z@{-`E2@SU0; zIiF2pK`u~pBjc(0_DUQ)0d0Rk!Sm^PKL-=@6vcWM0f_~FekwN|U`Pc8Hk(F0FqEP8 zbsn2@>BX}Z$@99fT+3l zC+7mS3eIu`*>*u+iKFWR>z`TIrgvLkSkSO(Z~mue+`v@xAWZzfcgZ|)i3K&UjUU>q ze`2GraiKe(5g2F8EZ7KxsqKM`K#jv2BuqTFouTW>_s8>#?W7eFet&&wZ+Gnb^S`z~ z*!KPiWMbn0CS+_xaHSZ}sgR?GSAc^@WZ`@DyVLlNt$(=i&&$eB$8W^_{js2lch?-d zV6Xh8t`nG=x;`!6!eQhPum_Z~4lpoUep$A*Hc!cK zV{CH1o_?t^uGW5^<6>vCr%Lyl7`tuvybQiDSAm&j>b`z&);pX)qeA~p5p`ta&^kL` zNa+NFWA4x302WDw73TGa+$S(LaeZDs1!Q6AzaxD>ZKcor1qD+Y7JU1|DFf8B>g@a< zf=^-$I>e3c&wu#q^QzSBPwzioN$_v4lo0LPn#3fw-RFk;lfA6XT8m!(@Rn4_IDRVH z((padf(*6#N3K8%etlNYVfm>mVKUk2<3ILJE{<81%0S0DdmR>w{}6VaQL5+-gQmiR zG}Cu>H-1{Nahy2Dz}TOaYVioj4sdXo^Cwcq(Rh7w0|P5d%c=RSf+qhV5?lVv6m{%g z2bN$tGk>o3Nd{oX@0e-7c>W%!-Wz`^KTRsVZs-6k8I+!%KPmdKI;Vst0O1k~@Bjb+ literal 4152 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 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-2.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-2.png index f191f3c35c2e9342e4f3254b3103e87cc7015eec..b6fe50b468277730cbf775dd6dcd1b07f0c93629 100644 GIT binary patch literal 4282 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 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-3.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-3.png new file mode 100644 index 0000000000000000000000000000000000000000..57770c1b8c70382599094d337ba180427efaad41 GIT binary patch literal 5616 zcmeAS@N?(olHy`uVBq!ia0y~yV2uFc0uCmih*|pLy9^AX+dW+zLn>~)J;=xi6l_xX zzdp~y0mK{yqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF i0;3@?8Uh0l0{U!boD7T#vS}_L%ROEFT-G@yGywpr{t{dO literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-0.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-0.png index 326c0dffd10c42a17ef6cb88205731e95bc510b1..df9a75136c835d35e6d663e8b38792f9604eb69b 100644 GIT binary patch literal 7853 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 E03)}>tpET3 literal 27803 zcmaI8c|6qX`#-K6IVCw-D3X(sN~mmQ8z<7HWQnqjHcPfC+hCYUokW^cLY6V&AjBl= zFk@-64+@iQChK4@7))cv_}#D3Iq&oSd_Ldb`NQLwUUR>$`?{~?c|EV|7IpE$Daj3T z8$?7zB+r~SwGt5#tq~DfyY<(#;1heVFMo)LcwIkZ`iD(W&lEZMts^5C&qXulX<@RC z-vF>std)J&!-`^eY;{9q5YVw)c$Ybv-E(tH{?+oUeU(fk`Db@UZ=Zh&D ztJ#~^9Uj$Xx_^##ER{JYbL)?-%8&jkkKP;k;Fm%K(iz1vVkE;hwRtW2F3tOfgr(Z# zrZvgJ6m>RLU^pYlR8>f(|MS1LP56~%*b1Mua-1M4Vyu`Rv|dDHDPJ$T{&UZ}NOP~= z-AdIfTxW*M8j&<(QIWe20qPIsBt?wF*NKQ&bSD1%-@93Pn%Z(Ach^dah@7``^Ux9z z5d*(Y^vQI%i->Fhzy9;62qyRMM-LBocIOb$UTL#tq9Pa5)`&#p>QVDZxLiu7bN0`V z)>Y{tbInj(^3R28p4u=1J^Ve{fB#-%$8hz$!;|;?`O>T3^NJE4^>u50{nryA0o^c9 z@t+bNp6MjQv5Ok`pTduM1S}#<_{~Exk@cdm1&d!0tKwh%HP?@PwkKyIrO(mgv4s!) zxT+FzC&^;wZ)wvY(Gu+39?q?uYP*2_EWfIkv5bkn3s`j-iQa6traV9LTBqFh^8xOp zb`g=S?jm=M@+mD{wr-<2tgxnyzvQmmBCl0bdJsC@MrLjP`OV1&!i-=o0brGKNxANAN>)BD;CWH`Mp6>A?x#7VuuxXzJhJudu-}FMYmn$;~Ze5}t;enB=$4 zN&4@`s}kDP#pHgzJT0%2Xsun5N+rU>)d`dl_Qpy&#rC}Cofyt-=7n!m+5*Ga6{r!x}pmP z>&c}oj|MD0r?-hZ#l(GL1_8}f7~f405s7%Gr|(~ChMLv0v%AJ}U`zyO|EPGWd(b^l zfc>fwjieupCH}VNSTFTh(Tj2;A~(%2dbTG}WC$jR$4~oojdwWr{i$0(ax+ z^yN(S<;YDvu);1j$e#y$10GOQW5ek3D6XUuaR(iZ=pBe>$*`z4s&_Gg<_=63GXHg1 zdMHABzrkBeU@+~yCJIyd1CSp8SGsx?C<{A1b%h}ywBt&WE@rH`YW&9yagmJ6xV-Uu zRN`o80NU5j$#ju+=d`J<3?cgTgMMOGe8GFsD8 z?QQtFyS1+=3kU78bNvhne%y$1zKB`TE_V(;q_g|ltpSfTwr@YM)3)A~I55OHNLGu=f@)K%SiJ5LuMpNty&60?ERD(@r+0D72L^GaKD^=WR= zhcpzfso}3!_0H~B-QLBKUUZ$z7m+fS2RRR_ZC3c0#h{TT3CwYs4N+a`dw0d2$ln2+ z2MSBuUrzL)vD1o#B3>7d)ezS-vhl-hnQyT6F*@Wm|2f#@p@4$2fI#5Aa!$(& z5!y?i65wyW&za6~`HNHfw1D~W%ZK7yTua96Evns>4{naSS=7BnC5G_k(8CkErH^bJ zQX!Go0@H<}?BTwEiZ^Ze#?&+4yZ4D%dQ?#8H5YCN zQFo3@+Hp8fp!VkCe*dvW{Zi%6w7?nfM6b_>H)g(&Q6`Y~2Yd{MduY+zg9_Y5M?Qk^0(sd5TepXlE_V$$ zW8z@n`415&Y(YWOw04DF_B_+{df(v`$>MjWZr-Zbw;_k$x$4~Ljq{P*gD*1o>ptje zzDMqH^5CyCKIO+6Z>>BGN9O7!&|#|*)||Fs_?mrXI>Isix-FgB6$ATFA&d(qJCv?( zH`Bp8J36a*H0+4DmeljcKs4X{tIp%}_`5q^CZ#<3^TdUQQm;JMAdctX3hX4_&<<$> zQEXGd3#xkzyWQR3s+@iFt)#}&@})R@U%bKGUCVmUqB;7>D<}20A2j!o=nmA{9Ch+W zyvqUQPw6ARGenXZ3W{!!`RLi=9P-*f3RIE+)Uj&|AknsWIwO8W z4j>i7Og+`oqfe?z$Iwezr9sz8K_+YS^FGH#Zu)ai&hTigg<-0B=Grx1+fS}oBM6t> zqynIL4Px3woW5@rY8~5aCmvIYNr5Cv{z!D> zwe9xu6oPlYu8wYTsi)vKM1JOeE1UF^Up8*j7G3kTL)XNk>pH%){ijQ1T*4{L0JW5E z$`8gRx5!F61=^S#*!Jr$2PsCX(w2j7{%T29T$f9c9{1_`=Y`KE95=xkln~(;0{pt) zym)s=HM!+Vd?t-QKubSq>bZVh#1{;rn^!!Ohne<{ z^^DN|zt#TuY``Kw5qe0S>U7@0O!Kc=8`UmJ_FOz0MapU(T4Npk(q1XuL^tM-1f4Db z7s^;EQ&-g>tOG<((<{3SzRG*%Obd&%`gHw{YT}`-k3KuJ8hhsN8Mv(^Ew!Vu!`{x& z^zw%8D!)LN*^oNVBR``|CvjX3OYP1M&3s{v!8yOo$|b@6$3kFZmHxgxH`EGr>4)hsgg=*>vzlitgh(iaISId=*Q#DA>&{}+ zq`Zn<8)nqAnHK~@bZ$f+pLnow!LT}XG~0*|3u;Doo7owJe0ys~O-5W!Q{c1B07iqt z`FT4C)EW|s&V|R@XKVD}5sPp90$LRMxN{~7(>r+`h_a{7MP^igWO>KflV%6$T`7r4o!sD?F+-mOoo`MM`83Kf-5$# z0c6{ssHBsqMhe0)a}GC36v%cvl7l&+oP73G+^tAYEBrH5vwLLjdfE9i7dQslAPq> zd*8#?ZO;dO-A$Hz7e4J(B?|0k`_XU4qQGzqIM3)g;NKEMIiaiR|8Dpj3NE)j2-kp6 zQ(TRoSAWm*)7O?G6w%q7m0Fff40)ai+xddYIU1uY#C3N41?3(v$j04cI9@eKkBP3bA6~H<(a~(yVFkUdv3}!Eha5a@Oa#%-Uf}5-UwY|S#yQK zY+X5P@tU@pb#iwn9OX$ArzT`zYbA|S|D+?xDpR8%^?dg&G1 zp6dh`+dZ~HZnrBCgz7!qO+TYxmCb+h>ttOxHpIb=BWLGC?elaDxFE%jJxG3$T>X-` zRl=0Dy%(mCTH2MrFjx_}|5*v&KI>)F-uGdsWrb!|o}3ywBm;Pg=!R3rMAnt)p}0Xl z`FaTl55e84*^uk{qQiOzZpc1oBs^EWrW$&)mn@FZ*U~wT7GR4A`Q*TopiUcC9lLtj z=)%iCx_;!p!rh=&tz65|`*b9f5Cam>-Ksw&wQ3FndAmy67f2NK4*hjgg?iKs09j~K z+l~bheEOS_zmB#nbd1(YO_ncA=~pcxE&j62|FGDPDG^NRZg7hZ4}EoYx$o2yquVpn zH!ydUlABpqlFLU2;#eIERJIk8y)cWCpL*~`r$+^$)$0x=J^vEDGTV%PGG)qUU@rL9 z_?sdQHj5)i?fKln3Vlejd_4Z6&#?D|A|-6ZfldnYIe_a94V)gg9+yZgxo#^<3u{#? zg89)qboVs}_+9IbNTAZG%<2^>blt2KlCgluHItn??kpAXV*+yWjlb+15ZRtOF}b{F zC&ABoL|>IAdI~esUn3E;aZrsorvr@6}}r(uKYdG?VE0irJby=Pa1M zK}e~1AvL_gY>^gcB2_>_Ib8QGRHf2e;S*Ms-a+>VK*q*j6_q@k(n*vfQNog)=Zxt| zJ;9$Y|FCet1op!>j^92SyIySVz-{1siqS^%h4m)mCnkm^VB`FPM=HOb`g#rvoG)ap zy!%~2E+q)ppVui8j3YCufp2ORKZo&E*h)%stuX@cLyFSUs_v?p<}U8-ROh8J_FSc8 z9{Y80j>2kUxN4eLBnoGQbT(eQOQM_~={=i(COflQ%!e%uXKBct!RTP6;DJIsniB@A zqP-3Yi1HNL~7lm8@$~ z;ifExHleEhMjE8(E8^9Dlh)OSjc^YQ>d)A-#}2}FK{#<;`tI2_s!D+wvjx%n$eGx^ zb=Inqp?gUfXo_zCDVm1KE8@glCQ(gE8p^Jlh93h>!(_EQC-A}bw^l7SuUb#N_9pHy-ww+N$`ovCxY)KvNXFSe^LiUS#pU9<@REa zf8}=n-=5qS@h9l%e+QsH%`(@0P~OR3+QD6CFmt8)jZYS!6eueBh%29z}x3^|5Zu65-T`y5ZR zdZ2J}LwNrT*+|>dzvbat32xu$Qf|W9{@YcqRTzjDF_wTNB2M%HkfTj&RoB&zp(gTu z;Xj-O7D$bft_pql1bjq)zTwpq^`MO79c#Wz>$Hi$0qYi%0;nvcnp5z$K!F=XPXJ(3 zgw!DLsL6)+&!MH*hW3B-kvl%jFTL>aH&MgY**hYtu7S6X%@F`91DaLH`-vp#pjZX4 zgqYmbKXZjpLX$0egl-4-AhqAqh0x96od7|^C?i*qnAd-hSkbIP4*v-%=i&H54rG&( z4B2fZ-#+zN0%~h`6~=)IFEob&H%f1m@+$WnC)v1hgeXkY?Op?cGCP>LYlNC@lOgXh ze$eBN$rP@RYqhEyAWu!ggd=Nc13{BJ9CN}503(o}06J6D1o%e<<39&L%Hv;y(yn#n zX#!qqq9)>bDEQ2-x_ST`A^lKN>#+|6q1sj<)ZD4#5MlzmbkFn41|@~tT!RWd6L4^S zR#GwmTL2SZlM8q+cM_#pvo#d3VylmD&-L?^mnBh#V=bx@AP@o`e3cKjbYey?*1`w` z%A9t<%%tg|guqM%&tGH%$-u@VO7-k88@~ta!-vl4$AOS|)wotv@`EjIR<9CMT=d6Y zJXo$1BzyM_I&FsyI*Bxg!0cSG7f7<|pRY>2#JJE2WCE{8bAB!yVvFm|0bw=KEtN~7 zfC3ZX*7-MjWu?-!OmiddFvnz7TgI(`XeJ|F3R>&rC4uN;R{{#q$)AN^ zl{yO^ylb>ZN^2e!@R>O&Xm5&$5vujRu3U}XH)E3(z*Hh~0F4cu0-j&nvbsnOv+pYV z&yl;Ka}CHGz^RsX+!qrn&@5N4%o>zYnym)x4~9Ssz@h+LMjTpIU&hnFKPvrsDBzfc zXMGW8_;cfsl7Y<{2lxznZ-vYO=p8)b47Ax_0Hs%$TzAbga2B{mBw%XW?f@}4fQc$2 z0WVqIJy@aJOjJxR;w?mL4++ntp-z6v$OOA?gVx4N5Uo2D;F=mdnuu`QB@`S`&Sj;R zHA1z-#^_dbx5|2GT}-?78dB=%pUa|$h3fwxVh6O6AXEvYE#xBmft=)4_wBh8j>|d^ z0fYxL01fP3ob` z52F@rPMF5a5^m)OhlM1sD%r>uRARvNM-vsNf^q6T3guz!uZoSI-*2IZhO9KXy}{l* zt3|M=ZWeCpeoQB^g!SX++Ki5_&KZu>bpMhpt9=(KjL4xU_}ZKA4d&t3xM%QLXq{cVT;1OeLnSD^?R>G{S-UEq#K@pMP+c#9T= z)c!@TvxGu0gRHl--i3BhN!}p`5yprb%5Jrtd=^XvakHlU3`Idy7|K<3u`LMT8av=H6&vN< zA%`yWmUP?Spx6~!O>SCX2f#B^`u$u#oW@lulT+$@xX5a!FoB)YsV6(*e`rJ(I(SZL zjq7sS8aloh(8dIig8@q#hgf$kWJ#yGD;+gpMut^MLB59M^59$V-s<_dm~c~`9rz|i z+f&Uu6EKfEr93O29vJ6a45^4H>&$JW?%HJbIi*z%3itjQ!9q>%g8EIX2I0-}oeKT> z_WEpd(y~<`BQNo}Zw??kNNW^c|3}(&|PO%@}qld#ZGUmqhkhQx6b zhLV-mr?+ZO`!6Swdli3t@5d+0;bS{8o>%Wb`1|!ok^7aeKf;~gCwn2aNHI8YV$gmQ z0<=;9H)HtV;jbX4+`)W&TT=H6SzhNLsE=Y7N-5JZ^){IPW$Ba&0&oZ8VSU=jLi5~c z$YI=pv%eoreHqkS`;qCU5m`TK+gSLC`wVmIR=<|0eYAV#THD{>Wxgma+3&PfHDgOM z^WE+UQgnkf%drsnBn@sX? ztcIr&*azdDN9Q$UHb*30Nvc;@c@#*Kafnv#kvU@eaaO(BB_`Qijlz3|se91Go+v&m zE3B#Gne3hadO>px}Tdbq0^1e6ZBc65?$GItR$Q3v`sHXVy zfXxCs1!PLfqNl&E;ue3E*b8SfMCCgbMW>UWPsFU@oZko}a}WfbFr2T+8af$R1s``Z zDr=clmo2%pKll0{#c^8>L>|rKlxymLuAVD-h}&6L**DAYtj24+#p4U?!Cp1V`GEI4?ryP|0}f2JT0xeHjj_-TGN&bZ(I%nw}b_OKK`Y zD#EmM@kK2sC~cfKXYLd=SCTwkS5)@S$*|r%m#2-~(dV^`%lP0+6@zs`@2CwqqX!f5 z$B7{mE5`-*Kd5fOSFuv>ZxNpxkZN2an)-xRzvJ{T5B`OqvVt;@(>+spx=EmvM1zj+ z(^hT;cCi!ihFQiRjBVXmfKUT4L#l$>jbQomxLJ=qRo!~Ky3XEI+wMCz)Sk#&oF=}d z+9y?S)^h$JkJYUx>ILx1I6O-ad3QptALfR`Elz^Y)slBl7~69B$oHx%yYYN9MGDI- ziIR;k9o5yi;9Ar>tYB#wEbV#SYZAjB6TgsBwSck^YsLGKnz&^l2`z?S-98Co3TPwU z`R0Sy$7VlGE>IZqL#SwdHn--}SS*wKpyN~G96#q{$I5)02?2kc-BFaNtDai1Ike#W zhXp%S1`)>FT}?7WmdcblXXtyDq?=i%T?4EIc{P=Y@2=+1Mgr&RHr%lHKjMq7g`4MB zYdd>oc6_@$SRjgoSBAK7|0Jg-(l^3uW{&jG`wsS?bnV(upIzrOWRr{5rOb2ViMIUOY^{AW| z)+SJvdG!ElQn-mc#=V9N58+dkT9 z=eOB#62{_(=0mCIdRYvAC_$a^xO30Y;iQ34pM66BBDq9N$Sg#hA3=tvKhP<>F_-*Qn`{DOL84FJtlJt54Z3~6AIleIMmf2uK{!E-|En_Y$5#Jhv zFHNm@S9p7Bet224S1?tl64SS`DGGBUufO5u#Db<7w4ZzzUO>bKb{i)!Kz-{f-?C0F^bMsGm^3KRU^}_- zE%9c?Xl(0;xlW$qpfYP;fS`I~fvw(&4 zt^B>FWDRq26a3O#g9g4e^J~LooS0um7VW!W;!k(DgHW~W=-b=#=K_4D2$E1?tvDOnq@I=T<`I&B zjqA_4R*J8d3Cqkv1~ad}*J{=w*Q;|CX7z@!`TIE~|Q;}R>qmp>X(m0nW4ek^QH)|G4U-kyItWH~7 z(Zr+xw_jM*16rTwN=>|S)00i-y;{?WS)rDwO@Kj~2NRHHUOuP~e7-3dU8;B!Vy z7{*&O?%+DL{G>T0R3oB}`54#<6{xCaT}XYN--3=XO~n#S#U-0;>^G{qcg(8ik=&(C z4y=DcI7b@k-Q4%>u)0Pj6P3WK80sl$%7*L5!qwcTOwjV+(AtM98D*uyX6pv6;>*B3 ziUxki^L<7uQ3(!BWovWtX0sE%G{H$t&MOpaRrwvaK1cW2pe5i8BMz`F&Ka~P6hSYh zg>^&SOHS9Qi^E+gtCNR4Eya50$DF!!RWr&$adtUx9N~SA3u8`Iyf1@IDy_kbO1d~Y znCw|03y*!728=YzSjs#=U7Vl^x0-9VEhY>*)}?IPE!F?6Q_rV$7& z4vgl$0!?%Pv$ka{dj4c{&Y_EFF37-^sYjnQJr~c#3WA=wxw`c}vu=GFOgzCK^c^0*_m`vzvMV}ta6XY`7~pm3!l6^C>Wj%# zqAG37+_&{}yqEVrB1~KzRHSdir|$$509^_B3*K(}yXO2B(-3dE{k;8A|EeMQaG3&$ z&Ch(0xy8dfa~zbLkQj)Y`>y|?rc`*@(GRo99_`r+`2|q6H=rPz*WCjJr3%dT^I9(F zLv7D%&#d?K-3#ezvu!Wb7ExTB%pt;D6dhh-0>idQ>ewab54+@}ku@I3`5T%&p zg&?laE{y{KF4 ze{5q2wvyV7I>5Za`S9rvfGJVbp3xhUR0j28y|eRWsh7MHpPT(u@O>$l@FXPtm3J>y z^SE^4;|L42e1oOW4c2zvMUoo6^kCd_1AhIk^=BXR{C>26WC@8r!}h5^Cd_LmJwSXWWQn$GTJ{o_JI7Njx6 zH!4VNy%!r|&zx&lCFazbQosE)HgQAes7-S5ImO#;+kQ2laLNk~yE8zF z-1((4yQ6^A_|2+Wc~4>qF~HBFIyix+v{Im7;8YnpQKC8Cd9Ujc&w9p8w?`cs`Vp&e z6IP3BA(j(WC8JL`DjlWJCKY+w^m=ey`*r;lE$PUXQN_nSe&>TT#QQ;0M?kG+cQl%r znZ9`bh~3tQ|A3?01D^s$^K}(OO2Vspg@=>zlyGvJ*Vp*;uJnz{*Hzc6%%?Z?ZU{&WM^j1d zwI>cIDcWe1jF}oGY+HY4nH5D1zx^Y;=tK8Z!=f1A}JHH0CJ+ZBuQWNYU5R`mo zy8GMn{Fc2ODegAFnjUBqb;gmsa84V1wBl!~0t$4UarDV6j1c-l#nAF0S%{1kIOxD5 z45b?r&qi-HN#3pCbct$_qhdPzR1kH*FxhU0!w-$S>uFah<%DOxb$N!W=U zWsgoDO$?nZtV@N>&YeqC)Jj%tWhJ-pZyq|fPghZCSg@OZ16#1aJX6D`fDm$^O_Jd` z3Xs~aBss&^r;g3&u@yjR97_ko>OmQ+D5@Gn$@YJu+sadxeG6pz(-U1pz(34M-r=r! z>}uFH&7F2|W6{oX2q@UlNpLi=&MYQHdJ{WBx97L^v*y;~rXQ_NGV^I;Hb-6-ew7$d zJc&#}@z$VNi!+oU{&|AmSOk?jcy{`ud~L@dEwS&u<(@8A0eD4?B*E_h<{$=fq`cVO z0B^5r#qc?!q4F+J(2uaguf)|q+w)La&~$wg)D%kZO5*rkNPN)1a1>RdF1@!kgd|A& zNW|154p!S_c=|+UPQEgZDJiFgeh6J5wTqImyZ%}`HBw{dMy5=Ql`T!aLxnFIv6gGr zSsa177t2raEq|?5M$EUgCM46`ry^tguGGmZloS`1-|jrBIcu2MGONN$!iLV#Dy7a> ze`4}S>@K8MByVR{g>^V-+%BWQLYQJm2u!{d27hI$OwvkO|};fynN%#_w0iT9Sj z8_reYZBEgHZ8lf$_Mj&70syw|@YAT8OTesjzW?!l^hd0?+n(y4u_euMEns(Q!D)zXv=lF2jO4iM&NGJ zH~c)Odh2#!1Re5qeyvkU-E-qhiEgw^GivDmwoEhRO&Sa_U(-2;)@TdDai64sK7it2 zs4Swm@LjJ~^CFv?PWZtH2n53s!+>k5mxUrw!6i2h%%3CTI(;SnU{st(LRIm)5;dzJ&|y30@h+70n%kOLL=T)!`(WDrHXUc-z#;H~>R$nJ~NN*w~l78&x zZ(rh8%2KJ^xz5>Bsow&3$4&eI4AfI+4Pb8nqiZ)7{<^^zUbg9Q~=X(xzH!Pfc=W3agwdeXN&|<7qkQ&!cp`Zz32>(Gb1+B{_qcYU; zb>;@{d21yiKBec$e|EuxvYOnH?*s!@0tW>S=P7y?#Mn`NFA%FST5K@5l0V`Q-qHEv z>$<PxHCYLHA}^(DjfuMnee2D{I_wbhRPl_se^SDoUP>PEflY!LJBD;aY&_Jp>5b z$MCI1X*>B4IJW-kqTvIs&`R>osPbMy5_q~+z8@YiohR3yycW#- zDUe=*2BHDGg_4}LE!wSXGGRtf6E?^O`QWWkR%j`FDD1y5CzQTpbVE*W0JDx04t-73 z<6F$2Aj49|@VwBhUT1T2A(1Wzu_yQKguBSDw{8HMGU84#^iLhzFdN-dz>?EH?i^Eo%i44^WEV+G1Lj$Qb4K9yMUUC&|IT(A4$IfhG> zf#Og7!$z2-zhZ0IpzbX7ZrVlM<2a`mbFw7TE6WpwLq52lwb?Sg*y{RLW&CqV>8K`C z;}iB?`Ti|yTbLGtt0Q(D?y`BGe+<6}VjEXBgKqE?cCo|^Sp^gjxZ?9%6D|}S&5+$& z@|(cYzfOo>SXCga_wyhnF6+Zmk3x;p29|x5i|ZijX!4K+OnqQ78r=F-F;6Wgjc{9jy$fCI*it=Yxd0tR{55c&G(ejbN))zI>D_?2}4@b}BLl zO3_tfJxDQa1 z5O7-=+7-lA6NnS8wft03YclF0#YR}C0RlwPqnJ9;?Eu>S({2g9iFK>ZMVL9)ev;H^ zx;M}m_PdgF)W{{X=oY4l5f`3IY|>e3L0s`vm>B!cm(O;dzNgzWUa`y5e@GJSo5NZ> zc3+r`=m;)IMypoT1IpcN^7;0!e|GqRv4I2M14}+L0QF*?Fov)`7am`De|M^E!`@#mF@o4a-O$O{Ad(fzblu%^d zYTJADeZc*unvrgz%iz}1YtG7~O2v3*o{{KJfFpbc^K!0|g`KAC82i$y7F=XpRz2_2 z^&T9$P+;f>aMsEp?DUfd8H0>?8<{aH?DRdmRw*fAw@bKZ&^;F#kR53lmn{`cF5@f-}3^L`5CB%X82dJii&X_$7U#l zzO-6WLjMjPGD)E)>GmKz9j#$yA3ei;FxP04Iu$#GVEyMKA6~Hf<@;gFMI9$ZzdU}( z0ylGz1NtIJ#A;Fd^8_qG5z@k(yi+yrMN5_kV>sjuAwlcJR((~t5=aez??o+agp(!x zKeg`8F?eq|-N{au9;aA8jX^UB|NZc&zIIR38S!eh+aqEXqu}wdbroV#&L9EN7_&!( z-UJ1)W~nX`eYx!um|F+W@P4~SmYYgf7=NPMv&@-O*uA<-uvOslynZS95S*uA=kufw zSPB0Yx&F3ZDo#_i^LWY`rJn~2vfrD~YTm0;1iu!%iItRvSVg*-?xD6#{lOkz8isQ& zL+19=<{CMbir~^y0oU)e-o>+ z4b%TD+sk+5Ip}v1#ek&TiHW{%qWy1;?V34px;=>l2kidGiam6_vhM+b2ilB6zU4axv2=f7&Un^5EGy9Ii}6~XHj3GA8> zoIFLpv-|kC<hmS1@tGMH`2=2VA%?m3-h%3eAQEcJr{>?54< zC^%u_kW#DRtiq+G=XG*Z*E?^c!*!Eb?jRtPv;91n{|En_x-wd*A|oSna<5E`CrDpF zZ&H^8Z7AG1wq#xr8+Pdv%;z!$c4o{fF*wajVEb*{z{81Hb*DoHNKV0b1evqAM;!Kh zR7}3g7H8hWI=DX4#ZUFq>QdH%$ROO7q1at{ep74vJ9H{sYx7@!0<9EuHe|+9XREfI zE;w&cRjge-v-CgNY6qRz96Jl#GLSH3Q~nG0Rq;T|>Ln~SGAGG;mD}7CMi#C0DJH`mp__Y80s-SGg;cYVn0@|&+2Tq*w40=?*4W*jHz$26Bbr_ zUFzqSZ3Vvqb4(2{xPnvYQy(crteh8`BkLl_n@wCaDnWh}K&zgQQo8S=lV$f=pSxkJ zbM+UA#$O{Nt#oyyhoXL*g7LTT7MsBc#p-$Ae-3*GcVl%DXV+DX>QoFyiqYIDr=M8} zZU-eW8BEgIr;eg$SNep)@8 z(Kylf5YG6rV=SVRNL=e=nUUx4<~!DB9;axr27pEwDuFptmtAMK#iAfvR#)S^jBQ=M z*M7X_Q88XEY8VO2c~ZrGy%%lLQDF6?>s_L`A!kq(D%@-9U$TwzR;3OC^ulH4w!T#1 zu~8Z%VqVL@e}!uEL^pIfsi}m0{=+K6*o`B&K6f2`KmC5`rSzf8R?WltA9&eDJT_86 z&%f*!)|L|MzxMZZ*}u3JxjoszlWw&5<7c(+J&1*djl>8=57(+0>noL^vF1I}Zk) z+C%FAnD|1cjf8MlX-Er73u7{Lx7(Pb>7%UerI`|9szpeis3M8yXFcTiJj7;B_N17p zxwLeqsd-^h!|?kCzr{VR7n~fM2Cxu>0wHYqUaud3x4-;#Y2Bc-$?RA8DfGvxrNsc) zduK3DdFq#X6%cDcCpg44*w64KWvlXUJ1opeQ&$HUieyc1`l*h58|2ql7Z>{^t;s)G zY_&%9w{EMmz4kBEAH}stwFGoO{fq2B(mmg`-sR61(uZHT=SP=5dGOx4{Xlz^%^l@i z1wW9>eJ~KR(AHcu2j8`8%e>FG*E4#R=1VrX-hSh9 zI%?uuZpvlQ3VQMQs8@bK`}1@c*+Zz-`BDyf%GkKs?Sf-@DY*NGy_>T(!Ybl&slufp zO)kgBr4*M?C#ypMEI!yhDm8{m+|x;n73;|agxTT`YK=sYYJ*}XG>ijh;|=fd9cT3$ z+PLXwAFTB_h@^5pZm&#CMr1PK~e$} zp|kQtB7xC)D^C5;FY{L{0}Zy9d;2QM{F-{*oR%IfSMS|c^ftufO+%Llj1Y3|?%6 ztp10tuIxl`jC%(7<8d7c&c}n7JU*8PTD&KDYR)P_-&Lu$;|AdzX7o5{(S8`m{HJ}a=QT!!@h5ixswwK_Yyodyf-I6guTDj~^=g;pk@@z9}N465I5Z^@rBC|EVU#NTA$$jga%!84(+-8R~RS_ zl!Dz$DgC{WEd#nAIXo;CR%JmO`FHm~n^3pWxfk=}$8g_5ij#XclMi~m7qTqW>M*y1 zdoKbLz;p3IYa|06x;4|J{I+#v? z_`Ob&U}}q{=5KBGB`Ju;@>1VYZ|{85u6w%~OaE(F0fGfcO<=bPd46TOZEApN(fJsZ z5qvNabaXkrl_@_7z?&^h-Set4ty>3W6ZTlh?)BbY5fyqP6fxV+<^QpkAy>rvVgY-xHUA8rnn{LP_MqR!befp3LwWQ!b4Uyt;e&PFC8&Q>;`huq>;zqVChPa|NgI;wromF234)c?U7g-CzU#WNeq*|7NU>V?w z7Wg{=0gLZWgPE&EBf2($eRbvg z>ZnFrp4}YvF1*O5{(K{4seI3+K+y zC8Ct6;>5631KO~i7h^^3iEA^TL6V%ukOGUK3Griol{xc*@u zT1m(U<|KOAs>ftyQXJzO;_-fHp*oR1%w)$A3@1qxF!*NhYFEhBud` zh>NFNTk4bZkLtgKOn_$4+wBcyOwieZ+@dTFqzXbQWn}-j-3-VT`!H?nlLl{?i|BpIoRLykp({z+Bz^RQhNi_W{*HK2bJM?NR-B-lqrLZ)(Jxsjsnr zKs|AgQu;%|EhIRO7be>OUZ>)^3Frc6r#7&>t5~#=|7zY`vW5@;i2jOap4nmBAC16I0j7dh2U|vO1C1c|j8~eW4`79;zp(ZJUYJ#hAyf~zv*R%hrHAv=2TD{4M@zT*HJoby!&4*Ao`E$%|BZ}ABMrngF$(4 z4Le(0zj{0H!o#v-YjVLP5r}}5|1^}fM^1L7Zz#R>|2w_lTn+v}1=MlI3q`BgaO2zd z9-&**%43nSd_gno9+G%K!}n+$MQ$_J?4;=-l{3dHuc`gPARkF+j6A)6XK8Wnon=Wf zWqC>{7au+X2(9gH69(VJDinp|8^Dm9=GAqlPO5*?)^I#7by@yZd88wrP=UVj0oVoT z&8(RQoh8;85YNMDdUl}~Hm--}9%5m?K^S{^QOP0jj@r^A4BQRS-Z{hXql9R#g%D8= z69Vxd+`}wAsSoQaFwpI8&_pw=)~C6wkm_{_Fwd7KSHSJczgy2Lz!=p)E%)>isTB*={0wy^j;tFwDD2oZx3iYEK+a#j17pnEPU$TU3FPHvc{N(+0cx zC5!7o|7a}f`@&v23qnq4)U&v6KgSEgzzwEadGfQwNU@U0kJs-A185LV{|F3l7#oVS z<-p)r_is<>m7y?FlXu87`H+l!;|UM`c;@^&3vgxfU;P*GR-l(s#=~Z&dHAk+=$j3S zi_is_?2UL34wWoA}~+(bva4r1rUR!CHJ+L*92+&d5V13N}r7-7KdMYyYc z|DXZDK(l6Gj5d&C=4@}T+hPn_M9_2=+BAVTJ)2k76S;?VubwuX)c!w*hl}8DUmuj*t?teqV0_zE^ba%=3aYw8SlUA84PR{(DTjZ?6QQ)z-l*U~fgRcv|4DFy{uI`yv9eE+ z6%b2^ImOamJ;lH@J?k`aU->Br$VgcW3W!d)S#|2H5~E_;Y1bjv0)+kW!!bcdaJN#* zuG;ql+o0O8fum0sqPuboeE12Vofp+PZ7A~FxBHbK8*TwH+y_mR8x{h0*P~e)jpVpzM6`zXhBzLHv=y3iWk z2RLW|JYm5EH*nVhs6xsbs3KQWED2(-AS!8hlpX5XzlS;X;ltpL6*?q=*MbW3lUnX# zG6Z|UAF<&;*W1@ho~H`WMOnGJgf9ml{(sDQe5JW#NKIi(azQy7SOy3>flT4o!wOf^ zzqsm3glu3v>?P}l2U{4Er&4iA z&XRX9&ozQ@o-N-4Tty{KN`xn!#-PtDG42KK^`QJe=OYn_VvudWe5ts#jt}l-4==Ha zZ%#)752|JIyMW<%rM+@4ZQmw;oz!j+VARNcB75B3z1_8zGIHslBKdi8$R*SFd7M9s z%KmgY)*kzrIq1!D^$7F3iG+@Q=V zJ0uaT;6lX}86jw7C_+S*%&3T{NB{-GOh87E2w?}vy3Yw{d++^!xgYKqK7{u@?-|c| z&NF_`@7(TAI1I`B!_y<5Kj3D^a8y;i4gCDs2ZdNoYlwkiit-7ldh4z!N19#Vok(?Nu8>`cQ5l{%$8n zwa%h0*|kf}^f(+|sI(88>DRXqz>2dK)&Qg|!7cE{84TbjwpVb<4m5bGX@k^Cqd{tW z-p^2*@KShzh1Jql=f3UaCqG{4a%Y)-yx4HxvgzH^tQT-168NLJZ)%4CN@`{<%$<^- zT96+lNS#;~ALHL}#B0;j#wYInlcD_tE5@JF9`_7Tw$bnfz(o^?jDqXl4jC7He!KPR zJ3oTvZB^YPYgdO3jwnN?S}Gxv<(Fh;&UZ&T-rSr_no+IZ8z6g-Z9IQ&a1e?blnI=w z&(U03{h;2?Fuz3M=I{g(nFuf1K!Mdb@=DqNMZ19Ez26@;cY$J(Q+DHN@@I{9=lsMkQQ;l9NZt9Mi z&RM2Tk6Yj!vB{~+8LWz%06grR?r<{k)mlr_)#_Rcs29)vomKB}viiu$gYO*$U8PX5 z)09(Gs=jSWt=7}%^j>G~;<+)F6DwIy%^*+DtB`PmX{oc*|6RSVQ^;QI3OHb>^LU`< z{MW1ddl}Bk=?21q$50U+j%K5U)hAV z{$PcuB$jYY_x_GmR6pR0uu{J~+g{gTA@63xa>`(O!<#k2B5~EQBOqV_-tsW@ANp4~aAP1RDWz5NwA ziKDM)2Of@C$15<-H=KG1Qg&bq@#jZqc5cg8c{NX|Ox>ES+2x)ww0>b!{WR&>3l^*H z*e}x^P3RcnTamYn7Xim(JJ~;vHV(z$waeZCbphB^NS?a|-~q&r=!t2SbbZ*@16Zi> zm84bI>h4E?!{+`)avy$fYh+(4nwqcsRv%EyS*_=fLjXP^K!a)E=$e337lLXdT!L&* z7dm55OHk6y*ya^rat49%+Wqw8SOPp-lEQJLhB^Luc>r(Ryb2W_cZk*_rGb<}Bp5-B z?PYgW``O^jj2FE_sxdt2xzZd0c$tb=o@TK^`M6C3WVo_oAn;%yt;ilqYM>rFFsmw3Qvy%p|I%s)K22My<1)6Z;Q z)Qdn`Dqk@-_*_)+e#zmAaeiCUC6sAo5x%~%6g7TL^CscByA=u&_DGYnMaG5f4NqG` zXRw}6bshyG!PxUfou8wKl0Xj!fZ1|V?DiDk?Q;)6Hp*@2@AIe{oJpPPe5jgpE`k^Y zGKd@HYjSP&UL%b*zfN$%4ZT;OBweAtUj-#DbF7e#tN|^G3(A;Cv{p3y^|1Oh1IVN=Hs14=eCLoglz#u# zg*$YaJ=0#bTb4(LDEceKQa}OyCWP4BMphx-JI6ifDw0I9nhSn5jNkkDa;mGHzr)3i zw;x)Ztj@^^D0Ou$>+MgeIc^)U$;aIj# zRw-k5HygRcHJVdL$G+eh!c%eV z7F<{CJDW$twqCL$UADjcSaj4w?i<+XkXv_IpmpD(ZqPmYi1v+HqTUe*7}EL1Vp-L0 zKd-uvkQO9vZT)F^{n^m4pO;s$K>p3Whk2%fxkCb>Htv*d`(- z;JHHu&d|u72;dVHYTjhOE*F=DSgB{L?=$gUbQEhEP?=K|amHo5&R9R*(bCn3P9sk2 zo!EXN?QZS)0N$DMFO|*4BauIxX>qF0Y3t-=>2P3EkYa=)@wq9^Qhn=q*z+Z4U(TPq zbX7lIbkVpm!)NPg={epUNh@GPG(FJYS+y3jrsH$39r$@6AE(hNQQ z_L^Fhk|3a1N1R@EuF`3?GsX0_d@w+h*jbYpveJITQ&IZzV4u#GrUf^(W~X(ENgy)3 zp%4~N)4{-F?5{)SJdDc z4po?C_vev*8Qhb9ed29poG;nFbm8BDl((9lU-!VURixgEj1&`f$eS-kmP6BVY7kX& zcmz+CuX@RneHuMr3OH!bNxmYS+|k~uM6Y(45UJjR&wlB8&)7?VQPilWJ}6qhlG%@? zc0FWo_#RkJW~c*>W)S}meG#R{-i6dQdna|x4bAaH4nfu)aM8(+soghDMuMg=r>i!4 zBpeQWuHHiO&SIP=k6DQ|Cu$DP5BkDt8Ijqrw6%B=`KYv+>EuJEW|Civtw1wPoqiis z4D*xrl}sTpfl;|4zU3DtTWheN!jo4qX?|p>R9{2#xiU`AT2?~!7AMoU>T7ArtKXg& zD%dPs{y9Ct_sat@r$n-$LM#;l0dE?T}yOi2jGZ}vXPxf2VySsPZ#@E#tmJrjBn~L5g`1UR3>h+ z-t7DkZ%3QQ0&|!zHiw*bD8Cs_H=e2OF=1V;d9^|5!4_zbFt#zRI{>)UR{+v2rwRyQJ%pJtIB%A zj!eGM#H(`0r$Q3n#+!A0E9;ii4~}g=H}!1`Y`T~6c3{Xmj^x>!om!fjv@tVpd+`A% zn9hCeJ*RiMIFI5_aI$$Yi*T%vT_ImFY)iA+x0q>QCI@OfJe3R4$32aBaYv*c?@rJQ zF{MV2-;TrPb$Avxga~Vsx5{7BcW|9-JT)ZGuR8LI+ubQ5i&M2&51!Osz#}t!a+bbP zRj#Wfb#yDu6q=5zu6g=a5}*A8jzF(Vr%Sk9xuc>~NLJ1sx%wLsNHz`$RN&<4&&6L$ zGM;FkZJ+GwU$DGmZ0y=@OI{Gg+sTu=_O)+FU%cnNdHmwRG;hMz+*@o9(=DRmhr{RJ zJN%kDTUgA$(?HMj?onUZm7n*-v!q<-qUti{nJpAnKUPWQM<5^zycr&WRr?AU0uhZ~Y+wVv z;G=Y>$`)}A#V<*Gg8gu1r(XkU$X+^&N(~Y2|2t`rf$w-eK@+|!77Vl+aJF;kHk~X< zOBrFa-#X1Vi?4hs(uvS;3KHeKdhljDg@7A(ej^eK?Tsm`EX_}8fDTrwfiIbP_T$BE zk$TAyT;7eD6LmFgo!2iZjT4!I(IdY{+>G9}_QzQfP_QpPFnsUY4h>6HTikf`O}6k+ zVAzlPgFcGT24W7v+A*wl{<5BpFF0WMdQI}HCjW-x+|`sPu&-;A?YX=`y2TjBrCFnV zr^TzMo{6^}s_0JeDS}fc>l3l+~no7)*0MxsD4SL7lO(;6vE=h zM!%8QFpDQ%s$SKzS%n+4VirltgbVU|2ra>2rHG?Y%t0Y4iFm5PF2lwmt-YLCB5Q)5 z^fa$VGs%5Ob)6fp;L3aV^4a^_ zPVfyrAFJs3V&*rae-=F#&X6D(PBhm858^?;N~_=^+8H{8g>>?!*#*w z@zmI1;;mTFuj)dN{$0U9mp?#(3Q}W2M_aiVZ@t&>gko0gOe0Ifm>!iXYnaz6J?j-cJ}FO5-2#Tte<;KJ zRxJBP5Z0b49%<*uCB2zigB_Z@AucZ@JEYYGjwMR-6CUi&6GPHsd1~svsmb;toA|j| z9cVEP_v@;Xep$X``RNGdP-hr4oVj4q4}Xui)WSneYC?_k!zv4l2TPTjobPAVSw1W- zA`gmz0zFccSzf`mM|LJg2Gr;YLqG~vI{z|Ipu%*q3%`+rxrvy@M0|sIS;LY+(3mUU zQL9LP(hg%uaHhx=pn#<}{#;+&IdenIh*<&OUbEf@PIp9y^_#-s>H#EyazKfiGcb*X z`u79p`L=d?;)~0o+!HctU-ZzJzPRCxIw?>J6?Dc#N{$_^e71X0m?O!*p~#F#57;b- zTT1tpl`loK(BXLyiv&1s*fy^OoQ!cZY-f;97YdOfuB$8iBmFZ@nXpn)O7-fl#uzrP zM&7N6*K{*72`m^U+apAbgVp&6h33vaEpyZ-i}FGIf&c5Qn)F1ZS4v_k;3=~MH27AE z5XG5bVp7hq-4DPfH#)TWaBq&4N;#Vw@LlhVlK~i{o3X0CBFf~hzic4a@?#i=l4oHaJ z;tD7mfYgM-qkwh6fMWmZ>}em+hk8{Vbl@UJH;>8Fn?Jp3|=0v;aN8*rjl#i}{C904Xl-6zKYQ)=%6GN_nU@Otecj~0tjxDkt# z*dc|pdYI8%pfE2{*A?zvukAF1wy#Ko)G6pq^yCxwEUQUSqb_d0*ex6vMYn9Hei4291^J=9w!apIK%UW^i6gk8#dv<`UyBdP3l8}FNLZo& z!)u8QdB^C*LCOROxt?KGTrg`sK;L2Lz*-9(#sFbgq){{FwAkXIa)E~r+&tiyU5XH# z93^OFcsYp0o*&>w1_4of`<>&_;RE^=zIGY%+Div>JY!Di(dEWbVS9C-pt~Hv$i-|h zLw6NezRRud9IiD&{4_kt#N7FL?%J~R+gs@Z>uYaa_O#z~+mp3qb+yj{<u+ej%;a_5 z+fDfbqegouFpDwq#IL^PkV5RYzHH=&y&ck(mwYBK?(kB}iwn%TXPyyGyF-5rf%Fjm zHbM}0_hLOdRl5=i9>^?4>c~h8h`=`DGKrbm>#t8I7$Z+Nr>E!j#kTjnKQTlKA~`8q z46g~fdL7!-J$qgW<1o!T%WjUQ)SIQRb$V;*5dBv=j_j{uHD=>?#Er-Bk@`&)Jl5Pl z2apT392aMrbC&PLfwxI>57hwqHrQ}TJ>t{xP*KuIgq#L&(}EJd^s6G7q*7n7x>kKN&k4)O+6( zr@=)Z95~9*kEe!zCo+nNRE54nVt3ZK@n!(TpK2#32U3;nx=%m><(j5i8{P6&7?H`g zZXFkxDPCa58WoRMa$yJ5O_f}TQZ4h`aviF?*CTfJpB@+#2R&PJtFcV2mF zoKNd%Zdl*^1#K9B$^8=4#nN}haqLU}7l)g_fnivOEwz65#3NBxHCE&^Um zjuDf9Cw}+!6{twTMV?s1$|;(fgR zA~#Vcx+s=f5c^qDh_ zFqmMlWHD#Gs$Mp9$Edqedyt*9ehWr1Mtlb9TF#V6punql)(WG>>4riNup*J} zzyyMshNFG$(%F2&{H|r+9tHd3l0ntiN1xSpf0+Cq24mK)*1PHCf4pDo|MSPQ)vfZG Y_hc4=suG=p=tF<(*lm%%{ZQC{0l42f)Bpeg diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-1.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-1.png index 258515942c90e63b6a403d97c4cd21bf5979f5d9..04971bc3b810025f949f570d781d55319959f1f8 100644 GIT binary patch literal 20097 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 bs^`|09de5M`uPgPwx;}-efpNjtv2h3Oa literal 115589 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 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-3.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-3.png new file mode 100644 index 0000000000000000000000000000000000000000..cf1a023c2ccd64a34bf3570d46bef502dfcb2834 GIT binary patch literal 97731 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 N^_$nFthGP>{{V*5o?rj~ literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Sprite2D-0.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Sprite2D-0.png index d33f360f9e4984e1a37ba8da8bb35dcbcd964a6d..2bafc42fab104cfae366f76991b3970b5383eea3 100644 GIT binary patch literal 2747 zcmY*bdpy)xA3kFkwrEgtjmfg@esUQ#t&|wzMdh-t<&vpHB-hj!mWgdm$*tD?(o~k$ z-MVWUBWx<Bt)R0U)op?fE_VbW+smK;n`g4E6Njle@!w)2apD=M^cs0*L#U$X#xq2 zLdR@>cTryz5o)%n)QjRV*{9PhI+QD?<@7blxAouI{Z^pamaUa#uXRcO)J0{}N6Gh< zUMEnBE|;H?@AHU!i#JqCut>vX^@gjS$uMBQR(#B6@e;4w>^XjXy%=2il22;0l`?po zD&(KcY4~;Zo6zg)9ADn;)uKn9X)k7F;>e-Yv4EZ@^YKv(K%r1pI_|vEmO1C)QLDbo zByQb%b4Ostu5BBCyMheNxD;Vi|JdUM7Ju|}N>^0K)6J<=Pfi!z;A6Qe>fXGFBC|>0 zrlBJrb)>LWH;Tq>cbaA;{jSew+NkEI%(7sn*N82h)dgwS7M5D5cf+be4^H8|C2?b&Q@7nGyLP1MaG7y2{K9vOuH za#JiLBSTuI=v2TWbB$GVhD6fR)~+Q)LgDCgkeHNcJ{}o19L3`Q#Ma~N+I*1FjT;=N ztjDC1g!U_Oh&n8|8;?sf9rYXQgp*y$d{hC|?*toQWj?59^T#o4fIf=AsRB&XPA_P1 zR3?T4yKCTrD)>zqn;{Om%qvs-JK@AWIcTG&K?IE?o-fP`2cyMMK5zu9+gP`Ty1_PP zHW=}BT@pMNZg(ZW`%$fCz1H)S+hiJyK;@j>5WJ#!1YR6pC>rDDD7)1?3@A-=u$Ep>;hV=H0g zLT*wNahZph^o_1NF;Ang%T9*t-JHVq)J*6NJ+#W#R{rg#^PxL6+}SX$pch%$G;xF& zJ2h*(FQw30Y5EJ}wcy?Pa1Yhj`;qsw151-UM>nbn8ObC5>f`;tald|-xu_Gi9VQRdFXgQ$$i2%*0LOQ$yK(i zL5ZZKmjuk-Kb zB`hz7Ug{{Y{PZf8bnVu8yuiR>JlAK`P@McHU^+2ckzJRu>^h%IKfBu(@s$Aipd0x- z*T+pUQ0P1TdDnrS`NXD!1g87S7(O3eiKui?(jg68wYT;5@v|>EO~tr>@+HC;BE1Y`DR`4#NK@ORNEAfj#6XW9 zs1OKR%W{E zUue_-ReqaOHyqf(!7n?Zd?ks8Aw|?eir^G44?wb#+>U7m+lh!KKLY;fWEd+`994eo zjUlKM6Y1H(25nC5nc~hj z{wlz~1$_kAiNbOJguImrmn?;)9VO%vz9I$ww?IvcAqXA}X2N<(-u{JM349*|+j{4} zu1CK_kUdqXHjrCvAq9|^xL!~tHn5Je!KBml7Is@Hu;=;qL$@(+GUoLcV}DzP8w!-6 zky!VzoGq%h%%~6n?&AItw0*r~6>L)8qQU_pW(z4%Tbk&c@s&J?sx9meaA1yxZrTpQ zeSJM*2yo(`yesngij1q@22{wO)6Dw^l%6;q+V}XGDxz2ZQQ?qGDV{V~jpv2&eN>zYXRo zLKPuiOcSzojgO@3Fm)Q4G|l7}_xmV3hCbj=LzJrJM?7gAsxk@p`IF9?dC8lfi=1AS zk`GPSdj5pYFs5RAekkYjm+WR#zwa(QT%Fxz-ojaVnE0|E7pMxy>M!;)j1Mi{H^6VK z>T_ku`;!S`aO``%vg4UUT}zS2GP_Pcp$X5doa|?Kp4w9?h-z0~;KU9I=!OVlfW4BA zJDuXX+sfNVDP_9M&s}JaMi47?Mf#$mqeI113^A=H+^I{^#t5Py=$=4OI1)V+Z8jcI z8&dE3%~IWvhzSG#d2K=^y&kxiH7%n5wsex3V7qcMchc!g$5sDKBzWbrRo zg1;43Vd!!v7)YWKVZCiUjZ|7*exrQi0gj|_=T+IP8Xeufl4FzyG2>XxND@yRxCBT+ zD-jXRNqNo^Bt)pEP+K;ACoQZ0vpkK#8!HZ5Ztu$u^c1Wq5F|k_8O<&&x~%-{S#l`#&9Rwa` literal 4996 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 E2l-!0Z~y=R diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Sprite2D-1.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Sprite2D-1.png index 2d0f010cc063ba6d018c67c6ea361ed0eb6b13cd..36e45f02e3b2c0494b072ea8f9374b5f1d38c81f 100644 GIT binary patch literal 4940 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 literal 6780 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 NBZuq`7VbY6`(O6-K9T?c diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Sprite2D-2.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Sprite2D-2.png index 0b8fe81bce6fcfed5d005ef821851206bb7906ee..a80797ab27b206a5a8ef4c78e68409bc7574ec9a 100644 GIT binary patch literal 6086 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 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Sprite2D-3.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Sprite2D-3.png new file mode 100644 index 0000000000000000000000000000000000000000..e74fba634f3da67a7a38c4fea53083f5cf4a3823 GIT binary patch literal 21891 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 literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Vector-0.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Vector-0.png index 674000fdbb13f65d679dde7506112cd221a7c38f..b6de172d811d94151acbe1b983eac0a84bac6fc6 100644 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I2}rW6{ZPfgz-Z~|;uunK>+P+BybTHh42}jS zZmL((RHwAbN<3cKXz|-HUfFNeE1V*uh+DN&D zk8KOK&DzHcDn+Cg$@8ywEEAsd6_ gI-ZDzt#0fO)^g5!a{O~XFf187UHx3vIVCg!0LNl-HUIzs literal 891 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4kn<;H+e}V1_ov)PZ!6Kid%2*9_(#45O4^T z*~z-gGdjdEx@5A_p6#K2(>5gce5?*vX_BesZ4VThrmX8=ukX&F#3IOqjIVe7JpEEu zEAQXQxY)UNlR0kgHJL21r>}{FQ4oO}yN^yY-!9Corr04MfP(M%$$Z}Uw~ALyQNc+7 z1qZBne9Y(UweGnRK28oT3MhC%!0}$mX#E5sh!u`44IB{czK7$`{_ zi>$tRWn*qKG$cWh1`SDbv$VDe_kC|#->v+76ck>lkpR-mzk#20l}ZqQlI*$&F<#v)t($30xl@{$_7K{jb+uk zuS1?^0KJ4r7@(*+a5U#kKu#$OW-9DCag68B>(BWCYKj%Itf&cGocr{|IZRjrpx-|8 Xm7+wxvvxNyQ!#kD`njxgN@xNA-!%<| diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Vector-1.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Vector-1.png index d9c0a2c859e52314b893e0d75cebc1c0bfdc92cf..9da20c9b4639a797f8d460d2ed1b955394c91a3e 100644 GIT binary patch literal 912 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4kn<;H+e}V1_tJEPZ!6Kid%2*I_5PS2si}# zA3a(mbncjEkx6=Z>gAOk&Akuz>IO;e{3WIDrsB1hRpR+^!3GY;7G&%Y@BMFwn@P!6=Bpjpvl=kNey{#uL!hD_J1R>cXMKg23vV&-~oFcQ4yy z0RhDh6#V1Df$}pqsverntUS)MqmN06MG%2oj6bgSDX2*^OFK|1f~s@Q$wwUf(ruq^ zzx5~C$H}2Z0R=yp+dK30>F*V9F3$kUxHF)ddV8bcX7AI{DccU)Nn*O_#=&D}#Cvab zZtPALLO2ELENhpQrj;?ua|E}fO$$pCYI?1K>K#-^(q7Kx1qa0M1<~EgGwxfxc%RpI zPX##)LF^XEn=>9J>&~{?mh0mrpr`=F5a&r8J9b9o)7>e#7u47PGgL#19|6TPCyt$A zT_ap)ge>L4(IMc%!6Ur%+LOZG0=LQ1TfaUkpMKBCTiclPV5ta18l(h-OVX0r`p%y@ zh7rH0?nERe?=4u=*6CuF=} zjb*Lny+e)s_a}#oFF)_v@+5ASCr6&UV@m@E0y`vro++QF&gSDJps0X?GtS+4e*W7R zDIXM5K{hA^AMKr~9IaoLWWdQN*u;U18+}C0({lDUcycJQxB#&r6AX)<>3dN8&iCJ{ ztMbQGz;YmY82-1((0I=mx&B(I$pS7f&^%LMX_j`c=!vG$>&*E*o*W$lE+}}hEO4g}&BcdolH1NL+3ug!dH>|yP3@pC zLiQ1(pp$c4&Y3Mc=N8DFzj9Co$xC26S|0AbG2>-n^OB3Y^YZFMDU8MU_K~!J?ajB?qo`V|otVvmpMHk3BOP?`YS)fAzu_CC)%` z_#$w#v~l&Pq)(=<_Yy-+O!S?5Wt;Dfr1Eq@xu5%Qs<3QdjFwIe&d+%1RArvJ_RGn1 z+uLgQ4kgs@|H3x`TUs$oV=H+7VX`47A^|}RTOcKE9Bc7j(G@w|)K=weIUJT^zDU z1u=vEg0i&nhmhyF0cwgnWLXjE6%@Ixt(o0^jF@?2N1uG0xw+`O6LX7!d6&V{)z4*} HQ$iB}-(W^6 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Vector-2.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Vector-2.png index abd8913001b99ae6709c51cb6da84b5e71779e07..d74317d5c6e456f2842139c04312653265834896 100644 GIT binary patch literal 996 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4kn<;H+e}V1_tKUo-U3d6}R5rJ(&C0K)@l; zC_uhYd!5VHl|tJm`OSzHdg5?+kt*NH@9Wt1w3*2tKHP9>09n7ZI=CZ7K>i)oHKg@ z*Uy#MZGq|94^4BtR@TH6ed}3Zx;ZOVP0^ySiGxuPfg309Ol~`PWxIdXPoLlAr+u6X zWLO26lvog0y?T?OaIy76i+5KJsvwDj)wH~{y*Wd&uvz8VwDY+Kt}fPp?W~64c91{L zWE|RVbo9=r%$s(ZH@9v4nk0l`0mz{LI&zLR+v0qXq5wHMP}vFUQYmY}XHFXoz71 zB86}U2s$Ck06~j8pFZ5u;wQe%?AM(Qcm01>OWui-nd>X?er@>5%T-&;e(f#at<7*u zEgY)8h?N11Am%yf&HH*t?&!s88ks+pDfUS1tJ&2aE$fzjdInLDdHIb3@FGuJ`KK_x$8x_%FC5ssGJ71_^k& zfF}ync*9IIK>4+n!u0@Ij?J1nUfVrE6`jBP1md=sZ#crGUPK4JZ8smoQTRu?@xdgHv) zhGVy4vE+Yn3>{eB^)xYEiQ&qQM_RXD{h7Yu?pt8Gm<=m0(9*@u46XFimMC)CAK*@47FSybwF`WG~-wQQ+MBSHEcX7 zid@dXlPHd&g=l#+ufQA**N;OUYZd?p9afJ6O+k``8xD6oA$g$Y=c2v`kG@^DVE+dn zHAY~-p(PqvG4kND#nq&WOis0jZ@y;~^@Gv|YRUm-DTr3Q#nTG0WxAz5A8l#*uD|Q1 z>Gc@V0|&WFc5i(bwvoyHcgSI2gfQZ8^MvlF4~yr0DmW)>_#>mbu*A%9PPXcrU-wpC z{XXqFzS;mDDma3ikUagP1b39ms6sM&pv+xuy_~Xq24HqauA<<1{Rvk?;n8XGadtD4 z%zp!GHb2=-NCg8tt|01Xt+u(k=-J#?H{URu6mK=who=IJs7$cf__Te!=>OjZ`3zQT z&!@*Ug7Pn}5Zq~yds2rXp&V3`1Jytfa&XGLmTr^C6ZYP;rxe)wVDNPHb6Mw<&;$Ub Cq|877 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Vector-3.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Vector-3.png new file mode 100644 index 0000000000000000000000000000000000000000..18254137f497b33f73277b75cf9afd5471bed135 GIT binary patch literal 2252 zcmeAS@N?(olHy`uVBq!ia0y~yV6p;Y7Y-(%$OI-yH3kNb$(}BbAr-gY-nlsOmVt;v z;NG6!4Po1amYb|diH_8&{P|5q+31ARG|T7LxwBQ)SpRYeG~#BExvlTa&=A82L<->y z5OhM60fIJ1zM5{FbfI_c+WR%d){yyFhZ2-R)RL1IC?94(k|zXo5BrJ>g;iqHWVG^KZ`- zXZTwazP^q(a{gPO!Eje$7%XWY^4I*T`DVTg3!a|g-mT5x=L<6tVjPg%$pl0VYc*z0 zJuO+djsH*L{OR9!T-z7+^!RnI*P)-EZ{5w5z*NMF%lBYEKqTSr00t1MQ*g;c0sv+> zrhXjqsD=Z>5Y2oX@|aPFWd4D;MJZ)fuf02`$N$!_OtCOJRL*2^is^1{ZC>Q-Uw5b8 z6=k?QSsN4uurLD#8zhPnUY}ek=2yw^z}Iorw-fKU8aROtz#A?|_ClNvblQd6NgQe7 zGuaY%cyl%z+*y2OUMo*=N;x=*zG*SrmEYL2zrMQ5!IS_F7Zyjc z>dT`({CE4Cc2EE3_sw#j*3GFj{JvS>S_Ci(P?f^N=SPV5-%ZAX3{i6mMc7!_$!NpUW@s$T|I; z{^#7<4>}+Icowc=#hqYJuN3?2zfh9p{2}%;3xFwG7#IZ*$KyyDIDCd9kl;SY5wnEk zF=HOpeq8c698ZMj`mzmKo|pM18{AtwgKfiZXvT(n4`xC`|KpJEm#Hm|7B?z^2&*D;jEE!e%bbo!@XQQtL^S0$FS9$*1_7wi`_kKTxS zHNC&`)L}#aBM&CWu8v;Ff`9?_q6*V^^&y>dFRTWwF0vR*m;UcgoggQu&X%Q~loCIGve;m-g7 literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks-Block2D.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks-Block2D.png new file mode 100644 index 0000000000000000000000000000000000000000..d1dffcb3da08217b858d93ac53ac693a733ca8b7 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9DV{ElAr-fdUUuYT5a3~P*mM5! zZw>Q_tERoWH2H{`HG5E%SxBeW%#A`%Lcd&!9!qa+5k zTR+2+c$9BF=}2sN(P6yarCUa3n}k+Tv0KOtjrgKpCK)o?D>kJrZUWlJ;OXk;vd$@? F2>{s#HZ=eM literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks-Isometric.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks-Isometric.png new file mode 100644 index 0000000000000000000000000000000000000000..3e1f2788b24333e922849a3f92cdbaec6b58e99c GIT binary patch literal 427 zcmV;c0aX5pP))>prkc51i`hZ1LTpD7>ngtUX7#L>Fn?;Fn zX-R457BDa{h>A-yFfc%@;oujet`C^tEQmGK4EMkmCPen8gA~;Y~ zRH-j1p_K)%Up{SIzk(`;h9u-eicY8nuU|f;Zdrs}LbJSn`4n#SkB_gYXa~eAH1Pql znJj2Rlmkc4VB}C?d3fi#yox5ZjK&NJMg|53QyVu11_n%Phz~S8fsANXkY^3D(MY8- zj%Eu<*5GnAnl+4A-G$#8Vp1L48b&;dD36=(-@Y;uR79RNMEQU`Ylw;i@~pv{iU38H Vii3|z(6|5q002ovPDHLkV1n(ytx^C0 literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks-Sprite2D.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks-Sprite2D.png new file mode 100644 index 0000000000000000000000000000000000000000..55dcd31884948eba93568e97cc1412bc069125f8 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|lRRA}1U%6tKpuoC;}1|2e;5KBIX;(gAL_ bRVEB-9*mc!oSl&cRKVcr>gTe~DWM4fe=`&n literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks_disabled-Block2D.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks_disabled-Block2D.png new file mode 100644 index 0000000000000000000000000000000000000000..c74bc2db8bbfd59fd0227cf0aba520ced654b190 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9DV{ElAr-fdUiRi=5a3}6n3Mmm zUe0>rs%y)g!-X!NiJow2Gb6)+-l;40Jt{i#aJ7d|VGi*{`2V_^G$wY_5&fA}c=oad-gjWAJqKb6Mw< G&;$T$rZ)>prkc51i`hZ1LTpD7>ngtUX7#L>Fn?;Fn zX-R457BDa{h>A-yFfc%@;oujet`C^tEQmGK43nC)Dg3p5Q-@bBkag!HBM5Q85F7EH&zS1as zpg{!j!S`=p1$dY-QxWmriVF_Fmx_?%fYczuYBYK(qG1rhfuf>HeMt$eEO`C$Y2*48 zR53IpAsfqKe;!#9-+2V$q*&-+-<#>OTF#BqAt=5D{Qv-jZ12L75SPlbN|c`MGnDPqg9@-g=#_cWBrZxY*dHaO4ENDA_zs}IWfPtYaO--QCj{hLgWelFKelF{r5}E+LwM}#Y literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks_disabled-Vector.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-barracks_disabled-Vector.png new file mode 100644 index 0000000000000000000000000000000000000000..0dea1ddcafcc14f793d3b3594bd9a39302c7f696 GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih}1|2e;5KBIX;(gAL_ bRVEB-9*mc!oSl&cRKVcr>gTe~DWM4fe=`&n literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-base-Isometric.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-base-Isometric.png index 5e41fe194cca5c604feaa65f222d919853a0d4c6..b38fad7ffd3085a35f124fa4cf133ca55e03947f 100644 GIT binary patch delta 390 zcmV;10eSwz3ZMg!BYy#BNkl8&{@+z9NFdEUaGqrJJU|_(s22V|g1|Wfq zRXrn|MV>XtMnlRpw1S5bO#|`P;BqyZHH=u@h2I)H0fK1_BOXPR$IbU|Ul|E1BF`G4 kd_bNxM8yGl)?iIV06SoQC)tr^C;$Ke07*qoM6N<$f@EQuN<2!c`yUi7B;1^QX~1*A8<5K6&Y6@-eFN-dSxrfRLxzNSew$!4=VGtV>6@nVwQ z&1RCuc$>2<3_CODH|PI9=j;G`u@`%>7klylgIY%u6R({;`+r%f)Eh;S?*}t8e_pxr z#q#pfOH=grmd~I6d~|fY*=%^8SF0^wyY}Vu^i+0MwXQ3bO5@{4hyVtNf*_onJU%n? zR}ci-WN$PYqoZR-k4}bR5zHVA3=Ee_rPc*)fH5YHqe7toh7csBIDPtq6DL-clG^}` zNy9LdQV_vf27eI8u`wnGFgO3=`uE={M=`@%TPPIv^;LR`Jw((YBUNE_3r*H&uFYk+eXE?&KS2|zI{j*lI39Jk$IMEdFD)d<>z(<14AR{E?fjK_2V~5k^sca03ZZ8?r>`MH|o?_g4 zA=Y|*GeAn^`=OG88B$6T4Pk9k?yJ9XO6Y{8>VF2L#yYMp_qo>ko)`E*nx;gMQc9Uu zfi`+&r6vV2LkN*1G3&%u`d0^s0ityeJ7$0YW@A_R&H+4nG;{yX zQ)UL(n6wy%W20kXv1HbUfb;ektAe*$ul;c2dVMvUc}i0~JNtYCpxIaj5XJGm`@g2f zFn^#EU8z)jKd2;HYn_*Ujo~;>b+LN?_vvc2>bMR8Y;A3Q2mq*NW7Q8r0QKbsN4c5F zj&h9FckfL}rPjK3D*{n!jL|v>0wT&LIa>#706z$`3P2=;U|u_CnU`zJ%r{8FxrQL`tbH?SBaXAuCC)8%SGN)NQg`D74ll5v6GwMRA&@ zS>fxQ12DsJe6R49O;4uUV>}k(Tj@L_;pI`(7RtghM{%sR?gV7&5ObkWIKuW*qf5-U zrMxNCKLn4lQ-HNBh3F}U)^cZl&c0G8!VMv3UC(7K5G{bbEqb91s4Z1H8-|Falz&1n zHW3670l$%)Qj!75@WAf64N5t0zyI;qUtMVf=4PJ&D3vQusqKL=W~E-&+K7!FFtb-E z6pNuNNHX&#lZmKQu4Ehf>g7vnZuUvGP3NCKBBD(3>_AG%jLjZMDTzpQo#+4%&_6T+ z;M|3a?Fy(Xix54<;x_ZO{Qzb;2Y-e}+8!*-&n_)5waTT|C;zX0%jI$Ey^nbPKL&vM z`@!_V!xI23Bhjf&VkuQtJ-0|(N9Q%C&wPT8)a}_k`OX;t!>^3ima5j;mbRsGWry#F zo*!&Z-TmsAVX|sEBlot=TDP`xws>*?{}t1jx-+^k`TA~;*(!A|W;+9SCn{POhF*Hn n?l3#5V0V}ud9XW7ZWsLv<*apazB1=300000NkvXXu0mjfA*OG0 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-base-Vector.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-base-Vector.png index 40f1980b9b0683d6813528f049be942d1565f878..0dea1ddcafcc14f793d3b3594bd9a39302c7f696 100644 GIT binary patch delta 37 rcmebCo1mw#VLqdILec?lw^b$#Y95T2rktIT#Q+4Ju6{1-oD!MB z8+Hx=0MqGkSQRbXp|&}e>KB3o&p#F4%bGsFDq^&}Szgao>(4g|%+Ae!{NAGHu3N1^U{XZ{@QY0BDw(J{i6`74b`$ z1GoYp1-R%()gk}~EV+TN?HF(0+%D?0We=k9WHg?fotvMXo3F2FtXq;L{N-wKEwcxb z!cx;rjUbYvgBN)31b65cKkxokvc?mN!+5J^9P}U>PXd6e@yYww6bS>s-9q)lA9H7h z<>7&TvG-97z!`;TnicRLt3Q3TRLGU-#mR8I+gGVp8Ry<5YJOYEt)CH=7k=Biv0NY) z1AwuF`uekv1V^4`p%cQ!*WWDO`gAF4*c<>x(b90I*ZC5YKs;nj4Wa{pqG|vDtW1$lQMIU= zoSmBo&VTvp9WgWjk_yb`S|S?TRW@@~n{xoagsV0)DQ_w859%gFHHzXzV#B z&s@1cdrW=1r@=hTsNI|O?IjGWh|`a zvl$U+I%M>jIiOCKCrnTT9W~CDE906+G@kUc@=)nB zf!ljh|5o6vgK9=i%}|Og#;R*hU~*GE>8_`zr!@-fQ`fTLMBsKo9=WYus6UpI$8|9> zS-Qb(!ytOS3pB_a^q`)49|E_#Dr*`Lqy)3_nC;XSvxnzZvSBlUut#IV1y<@|An$dYRQO)b=86pCJsdF;`&`PEgv?=m|Lmf?~ac`P3ZnVJ8Wm-kuAmi<^?Pb~&q*vi-(5?S>m^ODVl1y0u~7M<;xd{!B7oI z?5P*|;R+ZS7?_Zq0cW$G?8YjNq5*E$Z}U<(2@%1fAzS|=L~iOue%6!Szs*ZoPj}1|2e;5KBIX;(gAL_ bRVEB-9*mc!oSl&cRKVcr>gTe~DWM4fe=`&n literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-fixed_wall-Vector.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-fixed_wall-Vector.png index ebe2993c51e189337f6bfa4c2d3a16ed25b6ec68..50a43e1f746ddb37e467f9db2d780a8a55e5bc8d 100644 GIT binary patch delta 38 scmebCo1m-sYQVgzWFBG%)~yr>mdKI;Vst00V&xJ^%m! delta 38 scmebCo1m*`@o7Gzc|y_wZnsq?4BEVm*B2DJo@W38Pgg&ebxsLQ0QNZyQ~&?~ diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-minerals-Isometric.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-minerals-Isometric.png index 2b4841ceca055590281c760f6954e07c376f59cf..b080c5097479e64f80c77d99b7e9dd5f7dd18a02 100644 GIT binary patch delta 566 zcmV-60?GZE3eE(OBYy%FNklu>NKzSUsYw2!#2>xOs6$4(9I6pKqn4oXPI-Zr5hYeX1Y9+a}Li{ zM|tZzH*=4^&p8i*fC`f6#1US&V$kh|TkX@>e-|STUvXLkK?eY9){)Oub7^0uZ-?6r ziBhG{1n7{f!+!~Cb>W5Uc0+8_x4nCz)Y9iRIS2xrsSVDL+ZBhesE5GqhFUu9q9g~> zzwTQDZJVV%$*KeC4X@eonkqfZL6aSV4gmdLXVF72x5=23^D6*YT`MC_rl)T+O`FPS zG1BjK8ea2bIst$}vDEK%(zMxj?FaxKZm(wo6|Dv}FMp4BvO^ZgiwOYZ(GWG($@!HT zO*FDY2nbzdJQ~_~L7^G_F`X2OrH0o`YBPc!kA|yjWt$8c(1l_NM`VXe7ie4SrGecBYMWA5|n8H4!iXAd3Ejv4LZ|Vpj5}3-r~wOVju6F>~csQKNR5 zK-bGw*KsSSR_Yrw@4k2D^y$;7wzjH1M0M>1tDc(o#_HQ!!XRF7LKx9hduC{8XlQ6C zl}Z7q;6qf^Zhs}IZ^-U_p(&j2bZ>RQvq3(fQmNF)$jHdZNRgwQ4^dTn%U-*&y_v#> zU@;lyk_ZiuW>!R$PN%E-5H)CT4(B`be|IR?6lOp|10Y&!tm;FQ%Z!EX1|Js9hFwtuxS)wOiB(_OYgRzXN%09GCl zfaGSeYd#*xRjD~(MkGQlZD#v^tM|D$E7Kt(Fr+YDh0yU;rl%>^uop%T)Er0vAy_jr z37Os{UVG)h*o6aMpPQS>hJH|HRb(EqhTm%5_e@Mn3OvDH6rqIBii1Eo-OWdj?|Y{y z*^c}u{D0dZ1CZ;2CA6Dcocwll{LK3ouUucOG|9{aCNh)}T_Ix4AP%7%PAo4WhgF@O zyii!VOd>+U5CmopHOC@WQYNG@HzH8NLGg&vPeyxQOqdBN1heK)BUCz2y0f+M`N#Jd zkmoPonwncSq%b5IL?ofK<^oOp;9R?upPpX!ynnES10wi7Pfhq!*>KT7OTQgSh=@sb zwva+H3&+dNten@(Q!dYh6eUstRvhgI9IWc>xI6h>0sb0PF->K6h!Gdfk43v)s>^hm zhx)9Rda>$-AXR5GfaL<1Mcgvxb9(HCKXJ#u^Zm;FRafV0*`@?A!n|I%<|Z;`Z>A2U zAJsk&0j;O_3c}hVEyrl;kT7^A`8yNE59tK z>5ct8{f*5_jt8K@w#Kvbqkml)zpLf!(|1O{30C!%_DU%lK6wg2Yg-2ZuTWTZCud}C zVovQcb!)5vKz1oVF{fr`qlLM)9^>$d;eXu#zWn6u!`p}|Ks$vz06P{}I?UUD>ZaeG z>a^ZGco4vcV`INhcw*s@nD3B6+Oar*?95#NUwnMFG{I)*jZjI_ffGm_^Bp|L z^ZMa#0H6MP`}UNT@s71dc865Zq!f#y{4F$85_;|U1jmiQ6bzPu_I%3w_N3SJ2Y&!- z;R(ylSg4aQK`PLc56w{Dm%Bkj!zWKY3|%Z!==z8!i9rx7BWy3w^f>(tpq~etIPH_8 zNr9o5a=sPlt-CopbJy5lD@U^)4egT?MQjfr1rSBdCx@ZS{eJ_~c=)GHpcH7S5i)}W z0h(YXxE+9^(9r=vQV1drwB+^c+<$^YM+OGF`}()=7azM$-Vm^D`@wBO02o{hyyrRq zB9^UK%$7O{0&rwt5I{MaTB^b!-@o_m(QJm^n43z2Ry$2O)mvyvZ_~;&wWMx?rqZkH wf4>{2kgxvwzCD_n9BhxKraRakP01Af1E&3Jz-aS{{r~^~07*qoM6N<$f)vGnaR2}S diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-minerals-Vector.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-minerals-Vector.png index 5f7dd9cd6db566faa415255c6cbd8c5b5ca0832d..5137506e109c19d1934c36b2dd9423da73634bdd 100644 GIT binary patch delta 37 rcmebCo1mv4aK1s>!0-X9a;Ox;W=X~(E9=Mt1|aZs^>bP0l+XkK#cv8c delta 37 rcmebCo1muJt!0-X9a;Ox;*=oj)U6O|$F#v(5tDnm{r-UW|=^_k5 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-movable_wall-Vector.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-movable_wall-Vector.png index 81269459b38b16ce85e5ccbff1159e393735adcc..e7623ec6f4adff7e888c7b5f8ada7ce019a7b4c3 100644 GIT binary patch delta 38 scmebEouH#Q<^TBxb^}9$9zopr03fOk9RL6T diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Block2D.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Block2D.png new file mode 100644 index 0000000000000000000000000000000000000000..980bf50f3049381bfb9c535fc0fc1c14fc57d273 GIT binary patch literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9N}eu`Ar-fhP0Z$%t1h#caJ&CLqQWW`-(PM*Wj|0(n5y44$rjF6*2UngFq%7%Tt) literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Isometric.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Isometric.png new file mode 100644 index 0000000000000000000000000000000000000000..3919050b0187bda85430af79326b6a1d769b0256 GIT binary patch literal 1173 zcmV;G1Zw+v z=cUkIf52e;`0eKwYeIk!7zhjF(~fFI8=rRYb_xKd-tG|&QM{d6UMQ_bMDx$h0RZ6j z2h37T3?YCJZ~{K{PS5FCH-e`;02l}hgD(mM!0w>3tCB40t=s_s&0U_aU*|S6CdTPw zKKL{^JZ^8(f!K28t54R7TWZS|S=RN{EL{CEFl0jrbiGNh2?2~DFl3{dc5|=-s$#{& zyft$HqrU;(T1M58IVuyE8#o#Y&^KAx&j+iD3fh$k;N?s07Gva|nq4YQKG-zx7jLk8R2e z_Er@b$|r`zZO_2eHNIOmTo8h4nfvVGy>v`6YicEISQ{9FWRa{#ZJr2YBc=->z}U!p zAD_AK(ZxNF^zM+23e0LKR(VoL%N1_?jMO`_jsSE*z}PVe)2uQuu`USRv*#~ycKPS; zz7}`1mK8jcXo8&=?77WMSK!adnW)zvs41-RiaJqMT~u{ZC#sQ>HHG#11Cuk+59iOe z$~5aaFix`9A8@!f1Xn6}@}^Ym%|^nW;m9%1>3-+y0FWwPOXipIu`tnb@Z?RwRdBd` ztul>nv<4s)qi8ClDXgbIoBYeQk??gN1s6XUa=!}zB{>u{;a03n#xd& z;`R3dAPWY~U7oMA1^{3Marl)RJ6pZkNLbhC!!JBIJaQj_&eDfC$^ihfR#IwZ0{HQR z(Z>%*FjeadN4k9*v0JYyqF~81oZHNJ{Q=V*00_anvq&_osjNSg!W7QOLkx#YMZCPo zEH5&pB4#+8kB2aY{h^emvP8qYvq%W8&orZH^s~(Ygmhb1S=w#2OgW6IrG|b|&xXPbL;$ z^9^Qfp2#m>*oR(HPrR)E`i(7@vN0?N0IDK;`=vMEmsXZ={0?(=u3Ft5*-8Wkr>^Hy z$L?PB)Hj@7i?0NSPMCnr6fPH?@q2~zTF%xZW#Sy7HCd9gF%CcxD`fy+SS}kQcW+4P zD3^(&JJ&_2kdsP$^5I0i_3ouVaq0~KsK=~EBZ@5bc>J1HLkJ^`b**Mbf^lduMH5{o zM5id)*LSqh+WJ+|h^fDVTB&}1O*74!Af00@o4eJ$(mbNtV_I1^#k9Ll_t!KFX74Y% n{b4$)V1Jm7X0Sg@(_Qo*auXAHIMIdV00000NkvXXu0mjf{2wqY literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Sprite2D.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Sprite2D.png new file mode 100644 index 0000000000000000000000000000000000000000..6cd64873a2db08d35c4d48c0501a6b2686f3b3d0 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|n><|{Ln>}1U%6tKpuoDpz`)=` z(Z+?Hb^pF`Pqz?mIePeTvrgcqAN406{Xd~pz}hp*itU8j((`{h(_Wn^Dbq1~5Y(%A z;)sLN0w3m0#f6+k52qh9Y2w^3ZrI$&Suc?2wUAx=2(Krb_#_@ZhdC{20w#|hcon+J zxG+xZX!bboliqH8q4&ZS!x`0a_s^Wkc~@DRnVHFkF+lOPO-~@u^$eb_elF{r5}E*hlUSqx literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Vector.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-ranged-Vector.png new file mode 100644 index 0000000000000000000000000000000000000000..0dea1ddcafcc14f793d3b3594bd9a39302c7f696 GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih}1|2e;5KBIX;(gAL_ bRVEB-9*mc!oSl&cRKVcr>gTe~DWM4fe=`&n literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Block2D.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Block2D.png new file mode 100644 index 0000000000000000000000000000000000000000..defb66f97e2e8b6b3784e215e680ab5a826c3806 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9TAnVBAr-fh6C_xj`3;h|&YGC1 wtmdKI;Vst0BkoKwg3PC literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Isometric.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Isometric.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd05489765d3de6c213a28d34e2c45efa23c098 GIT binary patch literal 1232 zcmV;>1TXuEP)pZ) z=RY$5+t|i7wy}+E{4aojTaE%W4kI7~w*GuVeNz=x+qa*5;Y1X#uU?qT!oG zudJXP=i^J>5@nP}o&qJ5#Q1nxh$n=2qe2M)pzde~fNB{A3;{FIOodhqYR;MSvLN-u zvMNz&nU=jW07O76IVICGqb)?{lonpmsZrkseE*|Qs^9a=xj^Qmdg7FN>R%^U(2InU z1F3<&u0642{QmUJRB0;b<#^;R+jTromPv=ad&MoDojaR%^BXjI-Oa1HL-K-LG1mHy zw{{GuKmRnQ7wLX~@A>kt)9#EXIIc@yf9=I1eS5F`aNE+|!T12-$i`D-8hRk(S-i94 z$xPYRpNqPVosV2H3LY!-2Yb4|9DVoV)$xx%{V^I9g%tG4nGY)O{JuQ)dH##g z9tic+kM99OC1y%o^!aknVe9Y>@sEYb;!WN8{_3?`lk<*XyPP$!vgf6hqp6mp4!TD5 z@F_A4y@q-n9ED}MG{Ab(iRALyqd2cb*2q_%jYR~ZSL(EweT*C!!XvJ47rf&7^{jOu z$x5gL0I(wNjTi1R{%(s--n)5HcA@}4MIRA)#ZB=+{{4{gr9_}yserVAOx$wV;mo zPd`enDi%S8#1#PG%HiAl?`7Va9lCaKvVPe#6sV>S+$3} zxzw8C>URCI2@$BKu69!tR}+d9Py+%o42oeI`YNxLV=+-74%neP?Xf^Tbv355g}JU$ zk(PXe#Xu4$&s-V|cMvj(6S`~y85|xt(}=nrRCoFpJGEAKK9%3h`TTNjV+YjpJnCA8 zfq;^t-09Bg+L~YTqO!yQIOGH|f{2ZJ*{lZva`UrGxd$XF0RSQ(B4fZ9b6v-$G?qwa z`v%1bX~ZMUO;2XBdzwrUBAABe*j8PZ;CY@;Jww+L5z;6{;jghP!BZod2#LlMX^!XX ztLIZ1m1S9JX;S2;SsgkyR3lS86;0Y$?Orxx8e^)~DYA(}!>S|<~{qfsc u(Q0IH!$Vt>*_4B=$!w|zTayW$qW=KMOJ@?(zqfe+0000hV?APnSs2F3vFp;QFfVONGt-aI7cnZ?-!{UKB;f7($odtAl*x0N!su zj4=QtsT45Xzj@>YQW%haCrm%w_ktYmQw1}-nscy*fAtRJx?mH`|>IDpa}zTmyHP4H`5KuF|Cs98~zvTIJE-A;?GB z!i2)+J~!5rprFK=CXY6ALXmtLr#S{xa2j=81Niy<18{lKA~B9*1{5ueUm`T{eP9oe WOm>>eorA{!0000}1|2e;5KBIX;(gAL_ bRVEB-9*mc!oSl&cRKVcr>gTe~DWM4fe=`&n literal 0 HcmV?d00001 diff --git a/docs/games/GriddlyRTS/index.rst b/docs/games/GriddlyRTS/index.rst index 50bcf19d1..06c8f4be2 100644 --- a/docs/games/GriddlyRTS/index.rst +++ b/docs/games/GriddlyRTS/index.rst @@ -28,7 +28,7 @@ Levels * - Level ID - 0 * - Size - - 30x30 + - 16x16 - .. thumbnail:: img/GriddlyRTS-level-Vector-0.png - .. thumbnail:: img/GriddlyRTS-level-Sprite2D-0.png - .. thumbnail:: img/GriddlyRTS-level-Block2D-0.png @@ -48,11 +48,21 @@ Levels * - Level ID - 2 * - Size - - 57x58 + - 30x30 - .. thumbnail:: img/GriddlyRTS-level-Vector-2.png - .. thumbnail:: img/GriddlyRTS-level-Sprite2D-2.png - .. thumbnail:: img/GriddlyRTS-level-Block2D-2.png - .. thumbnail:: img/GriddlyRTS-level-Isometric-2.png + * - .. list-table:: + + * - Level ID + - 3 + * - Size + - 57x58 + - .. thumbnail:: img/GriddlyRTS-level-Vector-3.png + - .. thumbnail:: img/GriddlyRTS-level-Sprite2D-3.png + - .. thumbnail:: img/GriddlyRTS-level-Block2D-3.png + - .. thumbnail:: img/GriddlyRTS-level-Isometric-3.png Code Example ------------ @@ -92,59 +102,71 @@ Objects * - Name -> - minerals - - harvester - - pusher - - puncher + - worker + - ranged + - combat - fixed_wall - movable_wall - base + - barracks_disabled + - barracks * - Map Char -> - `M` - `H` - - `P` - - `p` + - `r` + - `c` - `W` - `w` + - `A` + - `b` - `B` * - Vector - .. image:: img/GriddlyRTS-tile-minerals-Vector.png - - .. image:: img/GriddlyRTS-tile-harvester-Vector.png - - .. image:: img/GriddlyRTS-tile-pusher-Vector.png - - .. image:: img/GriddlyRTS-tile-puncher-Vector.png + - .. image:: img/GriddlyRTS-tile-worker-Vector.png + - .. image:: img/GriddlyRTS-tile-ranged-Vector.png + - .. image:: img/GriddlyRTS-tile-combat-Vector.png - .. image:: img/GriddlyRTS-tile-fixed_wall-Vector.png - .. image:: img/GriddlyRTS-tile-movable_wall-Vector.png - .. image:: img/GriddlyRTS-tile-base-Vector.png + - .. image:: img/GriddlyRTS-tile-barracks_disabled-Vector.png + - .. image:: img/GriddlyRTS-tile-barracks-Vector.png * - Sprite2D - .. image:: img/GriddlyRTS-tile-minerals-Sprite2D.png - - .. image:: img/GriddlyRTS-tile-harvester-Sprite2D.png - - .. image:: img/GriddlyRTS-tile-pusher-Sprite2D.png - - .. image:: img/GriddlyRTS-tile-puncher-Sprite2D.png + - .. image:: img/GriddlyRTS-tile-worker-Sprite2D.png + - .. image:: img/GriddlyRTS-tile-ranged-Sprite2D.png + - .. image:: img/GriddlyRTS-tile-combat-Sprite2D.png - .. image:: img/GriddlyRTS-tile-fixed_wall-Sprite2D.png - .. image:: img/GriddlyRTS-tile-movable_wall-Sprite2D.png - .. image:: img/GriddlyRTS-tile-base-Sprite2D.png + - .. image:: img/GriddlyRTS-tile-barracks_disabled-Sprite2D.png + - .. image:: img/GriddlyRTS-tile-barracks-Sprite2D.png * - Block2D - .. image:: img/GriddlyRTS-tile-minerals-Block2D.png - - .. image:: img/GriddlyRTS-tile-harvester-Block2D.png - - .. image:: img/GriddlyRTS-tile-pusher-Block2D.png - - .. image:: img/GriddlyRTS-tile-puncher-Block2D.png + - .. image:: img/GriddlyRTS-tile-worker-Block2D.png + - .. image:: img/GriddlyRTS-tile-ranged-Block2D.png + - .. image:: img/GriddlyRTS-tile-combat-Block2D.png - .. image:: img/GriddlyRTS-tile-fixed_wall-Block2D.png - .. image:: img/GriddlyRTS-tile-movable_wall-Block2D.png - .. image:: img/GriddlyRTS-tile-base-Block2D.png + - .. image:: img/GriddlyRTS-tile-barracks_disabled-Block2D.png + - .. image:: img/GriddlyRTS-tile-barracks-Block2D.png * - Isometric - .. image:: img/GriddlyRTS-tile-minerals-Isometric.png - - .. image:: img/GriddlyRTS-tile-harvester-Isometric.png - - .. image:: img/GriddlyRTS-tile-pusher-Isometric.png - - .. image:: img/GriddlyRTS-tile-puncher-Isometric.png + - .. image:: img/GriddlyRTS-tile-worker-Isometric.png + - .. image:: img/GriddlyRTS-tile-ranged-Isometric.png + - .. image:: img/GriddlyRTS-tile-combat-Isometric.png - .. image:: img/GriddlyRTS-tile-fixed_wall-Isometric.png - .. image:: img/GriddlyRTS-tile-movable_wall-Isometric.png - .. image:: img/GriddlyRTS-tile-base-Isometric.png + - .. image:: img/GriddlyRTS-tile-barracks_disabled-Isometric.png + - .. image:: img/GriddlyRTS-tile-barracks-Isometric.png Actions ------- -gather -^^^^^^ +build_barracks +^^^^^^^^^^^^^^ .. list-table:: :header-rows: 1 @@ -179,8 +201,8 @@ move - Down -spawn_harvester -^^^^^^^^^^^^^^^ +spawn_combat +^^^^^^^^^^^^ :Internal: This action can only be called from other actions, not by the player. @@ -199,8 +221,8 @@ spawn_harvester - Down -punch -^^^^^ +attack +^^^^^^ .. list-table:: :header-rows: 1 @@ -217,8 +239,10 @@ punch - Down -build_harvester -^^^^^^^^^^^^^^^ +spawn_worker +^^^^^^^^^^^^ + +:Internal: This action can only be called from other actions, not by the player. .. list-table:: :header-rows: 1 @@ -235,6 +259,62 @@ build_harvester - Down +construct_barracks +^^^^^^^^^^^^^^^^^^ + +:Internal: This action can only be called from other actions, not by the player. + +.. list-table:: + :header-rows: 1 + + * - Action Id + - Mapping + * - 1 + - Completes construction of a barracks + + +build_combat +^^^^^^^^^^^^ + +.. list-table:: + :header-rows: 1 + + * - Action Id + - Mapping + * - 1 + - Build + + +gather +^^^^^^ + +.. list-table:: + :header-rows: 1 + + * - Action Id + - Mapping + * - 1 + - Left + * - 2 + - Up + * - 3 + - Right + * - 4 + - Down + + +build_worker +^^^^^^^^^^^^ + +.. list-table:: + :header-rows: 1 + + * - Action Id + - Mapping + * - 1 + - Build + + YAML ---- @@ -249,7 +329,7 @@ YAML TileSize: 16 BackgroundTile: oryx/oryx_tiny_galaxy/tg_sliced/tg_world/tg_world_floor_panel_metal_a.png Isometric: - TileSize: [32, 48] + TileSize: [ 32, 48 ] BackgroundTile: oryx/oryx_iso_dungeon/floor-1.png IsoTileHeight: 16 IsoTileDepth: 4 @@ -264,102 +344,120 @@ YAML Count: 2 Termination: Lose: - - eq: [base:count, 0] # If the player has no bases - Win: - - eq: [_score, 10] # First player to 10 reward points + - Conditions: + - eq: [ base:count, 0 ] # If the player has no bases + Reward: -10 # -10 for a loss + OpposingReward: 10 # as the agent didnt lose Levels: - | - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W - W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W - W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W - W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . M M M M . . . . . . . . . . W - W . . . . . . . . . . . . . . M M M M M M . . . . . . . . W - W . . . . . . . . . . . . . M . . M . M M . . . . . . . . W - W . . . . . . . . . . . . . M M M M M M M . . . . . . . . W - W . . . . . . . . . . . . . . . M M M M . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W - W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W + M M . . . . . . . . . . . . . . + M M . . . . . . . . . . . . . . + . . A1 H1 . . . . . . . . . . . . + . . H1 . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . H2 . . + . . . . . . . . . . . . H2 A2 . . + . . . . . . . . . . . . . . M M + . . . . . . . . . . . . . . M M + - | + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W + W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W + W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W + W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . M M M M . . . . . . . . . . W + W . . . . . . . . . . . . . . M M M M M M . . . . . . . . W + W . . . . . . . . . . . . . M . . M . M M . . . . . . . . W + W . . . . . . . . . . . . . M M M M M M M . . . . . . . . W + W . . . . . . . . . . . . . . . M M M M . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W + W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - | - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W - W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W - W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W - W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W - W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W - W W W W W W W W W . . . . . . . . . . . . . . W W W W W w W - W . . . . . . W W . . . w w w w w w . . . . . W W W W W w W - W . . . . . . . . . . . . . w w . . . . . . . W W W W W w W - W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W - W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W - W . . . . . . . . . . . . . . M M M M . . . . W W W W W w W - W . . . . P1 w . . . . . . . . M M M M M M . W W W W W W W W - W . . . . P1 w . . . . . . . M . . M . M M . . . . . . . . W - W . . . . P2 w . . . . . . . M M M M M M M . . . . . . . . W - W . . . . P2 w . . . . . . . . . M M M M . . . . . . . . . W - W . . . . P1 w . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W - W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + W . . B1 . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . H1 . . . . . . . . . . . . . . . . . . . . . . W + W . . . H1 . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M . . . . . . . . . . . . . W + W . . . . . . . . . . M M M M M M . . . . . . . . . . . . W + W . . . . . . . . . M M . M M M M . . . . . . . . . . . . W + W . . . . . . . . . M . M M M . M . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W + W W W W W W W W W . . . . . . . . . . . . . . W W W W W w W + W . . . . . . W W . . . w w w w w w . . . . . W W W W W w W + W . . . . . . . . . . . . . w w . . . . . . . W W W W W w W + W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W + W . . . . . . . . . . . . . . . . . . . . . . W W W W W w W + W . . . . . . . . . . . . . . M M M M . . . . W W W W W w W + W . . . . . w . . . . . . . . M M M M M M . W W W W W W W W + W . . . . . w . . . . . . . M . . M . M M . . . . . . . . W + W . . . . . w . . . . . . . M M M M M M M . . . . . . . . W + W . . . . . w . . . . . . . . . M M M M . . . . . . . . . W + W . . . . . w . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . H2 . . . . . . W + W . . . . . . . . . . . . . . . . . . H2 . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . B2 . . W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - | - W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W - W . . . . M M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . M M M M W - W . . . . . M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . M M W - W . . . . . . M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . H2 . . M W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . B2 H2 . M W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W - W W W w w W W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W . . W W W W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W W W W W W W W W W W W W w w w w w w w w w w w w w W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W M . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W M M . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . . W - W M M M . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . . . W - W W W W W W W W W W W . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . W W W W W W W W W W W + W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W + W . . . . M M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . M M M M W + W . . . . . M M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . M M W + W . . . . . . M W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . H2 . . M W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . B2 H2 . M W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W . . . . . . . W . . . . . . . . . . . . . . . . . . . w . . . . . . . . . . . . . . . . . . . W . . . . . . . W + W W W w w W W W W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W W W . . W W W W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W W W W W W W W W W W W W w w w w w w w w w w w w w W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W . . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W M . . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W M M . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . . W + W M M M . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . . . W + W W W W W W W W W W W . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . W W W W W W W W W W W W . . . . . . . . . . . . . . W . . . . . . . . . . M M M M M . . . . . . . . . . W . . . . . . . . . . . M M M W W . . . . . . . . . . . . . . W . . . . . . . . . . . M M M . . . . . . . . . . . W . . . . . . . . . . . . M M W W . . . . . . . . . . . . . . W . . . . . . . . . . . . M . . . . . . . . . . . . W . . . . . . . . . . . . . M W @@ -391,48 +489,138 @@ YAML W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W Actions: - - Name: spawn_harvester + - Name: spawn_worker InputMapping: Internal: true Behaviours: - Src: Object: base Commands: - - spawn: harvester + - spawn: worker + - set: [ is_busy, 0 ] Dst: Object: _empty - - Src: Object: base Dst: - Object: [base, puncher, harvester, pusher, movable_wall] + Object: [ base, barracks, combat, worker, ranged, movable_wall ] Commands: + # Try to spawn in another location on the next tick - exec: - Action: spawn_harvester + Action: spawn_worker + Delay: 1 + Randomize: true + - Name: spawn_combat + InputMapping: + Internal: true + Behaviours: + - Src: + Object: barracks + Commands: + - spawn: combat + - set: [ is_busy, 0 ] + Dst: + Object: _empty + + - Src: + Object: barracks + Dst: + Object: [ base, barracks, combat, worker, ranged, movable_wall ] + Commands: + # Try to spawn in another location on the next tick + - exec: + Action: spawn_combat Delay: 1 Randomize: true - # Harvester costs 5 resources to build - - Name: build_harvester + - Name: construct_barracks + InputMapping: + Inputs: + 1: + Description: Completes construction of a barracks + VectorToDest: [ 0, 0 ] + Internal: true + Behaviours: + - Src: + Object: barracks_disabled + Commands: + - set: [ is_busy, 0 ] + - change_to: barracks + Dst: + Object: barracks_disabled + + # worker costs 5 resources to build, get a reward when a worker is built + - Name: build_worker + InputMapping: + Inputs: + 1: + Description: Build + VectorToDest: [ 0, 0 ] Behaviours: - Src: - Preconditions: - - gt: [player_resources, 5] Object: base + Preconditions: + - gte: [ player_resources, 5 ] + - eq: [ is_busy, 0 ] + Commands: + - set: [ is_busy, 1 ] + - sub: [ player_resources, 5 ] + - reward: 1 + # Queue a build which will take 10 seconds + - exec: + Action: spawn_worker + Delay: 10 + Randomize: true + Executor: action Dst: Object: base + + - Name: build_combat + InputMapping: + Inputs: + 1: + Description: Build + VectorToDest: [ 0, 0 ] + Behaviours: + - Src: + Object: barracks + Preconditions: + - gte: [ player_resources, 5 ] + - eq: [ is_busy, 0 ] Commands: + - set: [ is_busy, 1 ] + - sub: [ player_resources, 5 ] + - reward: 1 - exec: - Action: spawn_harvester + Action: spawn_combat Delay: 10 Randomize: true - - + Executor: action + Dst: + Object: barracks + + - Name: build_barracks + Behaviours: + - Src: + Object: worker + Preconditions: + - gte: [ player_resources, 20 ] + - eq: [ is_busy, 0 ] + Commands: + - sub: [ player_resources, 20 ] + - reward: 1 + - spawn: barracks_disabled + Dst: + Object: _empty + - Name: gather Behaviours: - Src: - Object: harvester + Object: worker + Preconditions: + - lt: [ resources, 5 ] + - eq: [ is_busy, 0 ] Commands: - incr: resources - reward: 1 @@ -440,12 +628,24 @@ YAML Object: minerals Commands: - decr: resources + - lt: + Arguments: [resources, 10] + Commands: + - set_tile: 1 + - lt: + Arguments: [ resources, 5 ] + Commands: + - set_tile: 2 - eq: - Arguments: [resources, 0] + Arguments: [ resources, 0 ] Commands: - remove: true - Src: - Object: harvester + Object: worker + Preconditions: + - eq: [ is_busy, 0 ] + - gt: [ resources, 0 ] + - eq: [ src._playerId, dst._playerId ] Commands: - decr: resources - reward: 1 @@ -457,33 +657,56 @@ YAML - Name: move Behaviours: - Src: - Object: [harvester, puncher, pusher, movable_wall] + Preconditions: + - eq: [ is_busy, 0 ] + Object: [ worker, combat, ranged ] Commands: - mov: _dest # mov will move the object, _dest is the destination location of the action Dst: Object: _empty - Src: - Object: pusher + Object: ranged Commands: - mov: _dest # mov will move the object, _dest is the destination location of the action Dst: - Object: [movable_wall, harvester, puncher] + Object: [ movable_wall, worker, combat ] Commands: - cascade: _dest # reapply the same action to the dest location of the action - - Name: punch + # Name: ranged_attack + - Name: attack Behaviours: + - Src: - Object: puncher + Object: worker + Preconditions: + - neq: [ src._playerId, dst._playerId ] + - eq: [ is_busy, 0 ] Commands: - reward: 1 Dst: - Object: [puncher, harvester, pusher, base] + Object: [ base, combat, worker, ranged ] Commands: - - decr: health + - sub: [ health, 1 ] - eq: - Arguments: [0, health] + Arguments: [ health, 0 ] + Commands: + - remove: true + + - Src: + Object: combat + Preconditions: + - neq: [ src._playerId, dst._playerId ] + - eq: [ is_busy, 0 ] + Commands: + - reward: 1 + Dst: + Object: [ base, combat, worker, ranged, barracks ] + Commands: + - sub: [ health, 5 ] + - eq: + Arguments: [ 0, health ] Commands: - remove: true @@ -492,59 +715,67 @@ YAML MapCharacter: M Variables: - Name: resources - InitialValue: 200 + InitialValue: 20 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_items/tg_items_crystal_green.png Block2D: - Shape: triangle - Color: [0.0, 1.0, 0.0] + Color: [ 0.0, 1.0, 0.0 ] Scale: 1.0 Isometric: - - Image: oryx/oryx_iso_dungeon/minerals-1.png + - Image: oryx/oryx_iso_dungeon/minerals-1-0.png + - Image: oryx/oryx_iso_dungeon/minerals-1-1.png + - Image: oryx/oryx_iso_dungeon/minerals-1-2.png - - Name: harvester + - Name: worker MapCharacter: H Variables: - Name: resources InitialValue: 0 - Name: health InitialValue: 10 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_jelly_d1.png Block2D: - Shape: square - Color: [0.6, 0.2, 0.2] + Color: [ 0.6, 0.2, 0.2 ] Scale: 0.5 Isometric: - Image: oryx/oryx_iso_dungeon/jelly-1.png - - Name: pusher - MapCharacter: P + - Name: ranged + MapCharacter: r Variables: - Name: health - InitialValue: 10 + InitialValue: 20 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_crawler_queen_d1.png Block2D: - Shape: square - Color: [0.2, 0.2, 0.6] + Color: [ 0.2, 0.2, 0.6 ] Scale: 1.0 Isometric: - Image: oryx/oryx_iso_dungeon/queen-1.png - - Name: puncher - MapCharacter: p + - Name: combat + MapCharacter: c Variables: - Name: health - InitialValue: 5 + InitialValue: 30 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_beast_d1.png Block2D: - - Color: [0.2, 0.6, 0.6] + - Color: [ 0.2, 0.6, 0.6 ] Shape: square Scale: 0.8 Isometric: @@ -559,7 +790,7 @@ YAML - oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img33.png - oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img40.png Block2D: - - Color: [0.5, 0.5, 0.5] + - Color: [ 0.5, 0.5, 0.5 ] Shape: square Isometric: - Image: oryx/oryx_iso_dungeon/wall-grey-1.png @@ -570,23 +801,61 @@ YAML Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img282.png Block2D: - - Color: [0.8, 0.8, 0.8] + - Color: [ 0.8, 0.8, 0.8 ] Shape: square Isometric: - Image: oryx/oryx_iso_dungeon/crate-1.png - Name: base - MapCharacter: B + MapCharacter: A Variables: - Name: health - InitialValue: 10 + InitialValue: 50 + - Name: is_busy + InitialValue: 0 Observers: Sprite2D: - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img324.png Block2D: - - Color: [0.8, 0.8, 0.3] + - Color: [ 0.8, 0.8, 0.3 ] Shape: triangle Isometric: - Image: oryx/oryx_iso_dungeon/base-1.png + - Name: barracks_disabled + MapCharacter: b + InitialActions: + - Action: construct_barracks + Delay: 20 + Variables: + - Name: health + InitialValue: 20 + - Name: is_busy + InitialValue: 1 + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img280.png + Block2D: + - Color: [ 0.3, 0.3, 0.3 ] + Shape: triangle + Size: 0.5 + Isometric: + - Image: oryx/oryx_iso_dungeon/barracks-disabled-1.png + + - Name: barracks + MapCharacter: B + Variables: + - Name: health + InitialValue: 40 + - Name: is_busy + InitialValue: 0 + Observers: + Sprite2D: + - Image: oryx/oryx_tiny_galaxy/tg_sliced/tg_world_fixed/img320.png + Block2D: + - Color: [ 0.8, 0.3, 0.8 ] + Shape: triangle + Isometric: + - Image: oryx/oryx_iso_dungeon/barracks-1.png + diff --git a/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Block2D-1.png b/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Block2D-1.png index a0a6b2686af07fce516cfb5800bc95f46ef15941..bb8de1c9af0963d7a3ccb698af39d634fcf5433b 100644 GIT binary patch literal 876 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1U_8OW1Qe0&Vh&|sU^e!2aSW-r_4Z&RP>kX5 sf}g?h4;exkL7Y)A8UmvsfDr=g89VkcFh0?|Iu|76>FVdQ&MBb@0M$7ajsO4v literal 5214 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 jXaD<OS~c diff --git a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-1.png b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-1.png index b30b59e8fbb4a6910cf4ca81700f1abec76ed58d..3e24d7b291079f2a082233e2421810ecf2efdfd9 100644 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0y~yU~B;501hUgh~;d%<3LWIr;B4q#jUpo4HFVdQ&MBb@0M0NL8~^|S literal 1160 zcmeAS@N?(olHy`uVBq!ia0y~yU~B;501hUgh~;d%;|vTe{+=$5Ar-gY-u2FVV-7(Tyk zSue$NMaiLofsu(t0Yq^KC^#@Mv2X}r5rWD9ZT~ojJFU;M_Dp7P@xg|DoIpJUw1Q28 z8p^=nu;)baL5;(IXML{QT6TXfH`^EAhK8(Z+HLDze_ma`|9yEmQx3uvR~qI7nX$8Q zBrIZhI$iu3&?p|+1%JMI7XvMA;|}=uV|MYmMmgQRdoIqlOkidLJEpGmq_M*P{ro^a z3kL&3!<0GP$12y(t$zCX&c)jAJRB?BAT9#?9IONAWd%?uaG(kSd0-g^hDWaRK%P#2 z=2AGz4s)=6ur1IC zVqg%^{}i(!@VtGK@f_}N&;C}hv4kjt9ZgaUDxGKTHhT5jF#X*5^DE|nqX5|T_q!s(Z&~0_gfX{*2AnC^?!U5%uZjmfACC-`5y~2G}yot14EnXr=1DU zzL*|=o_^@{8%cqHUa-;F(iFmf$bregaHLo-VyESlhcO%a>ilh)nN|rx0s&uKK`c=K zQ@}W{ILE4Oe*CN9@#h~t)Y(vCL}Be2%QGLzOEp_7^dv6WJ#S*H6^8j>LDScr>&}NZ zFh~m+T>e#Dq3F=S%P}MQujWn`P61#z&x)+?(sg8FxzW%t?b>`J?+FZyW(o^7eqDY* zNCl)cBmeKtD$b}o%rmal-OqJsus;Y)qYMlQ0TZ7$%}nmId{$$6+*o0O6eu-gP1L9n h4dj7Cm4WRWziiF-m3-kF>w$Tk!PC{xWt~$(69Cz7GeH0V diff --git a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-3.png b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-3.png index d0cc64affd7a493dce5c488d86b4fa4d6c48da5e..3e24d7b291079f2a082233e2421810ecf2efdfd9 100644 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0y~yU~B;501hUgh~;d%<3LWIr;B4q#jUpo4HFVdQ&MBb@0M0NL8~^|S literal 1179 zcmeAS@N?(olHy`uVBq!ia0y~yU~B;501hUgh~;d%;|vTeNuDl_Ar-gY-gV4-yHB+p!u)*m88G~H?T%*HljKL<~#<5M_+67CB7Wlo4_y; zY(0K=gH3_@h=D;N?)>+r(Ake`j@iu5dcXS0>yJDf9?B3kxEv4n57ei?IQV#nyX=n4 zbK_?}L#pGK#`UK=I7orQ4Jr7VWU{kY2ZIEX)_i^bk{#p(iR8Z`SCYL7^MXad>ZP?^xbWq)JtLC`*9H6S z(%u3+IqU6@Z;TOd=YGP%p^?|W|9$XNZ3$ppGca5U{1~@k#r5D^zpbA?R`&kfIepe+ z@)E*M@tixBcKXlf*c~@kQ0N6GUHl0V6qi6pfTNUw;mGO=eTnCf;x;7L>EGdI6YwNG zEr#w9KVutw{LIHn%jaJ#=P@#7l948lRv&Em1$4li+2~%djgF3H1qME2@>+X;dk$a} zF&&Gj?~7?-0STsFn}2xPg6_raYSID^z@ZDzXdjlHs6Kec5SY>8$O_$tzFKDXt;hD& TO|yCpOp*+qu6{1-oD!MRoG diff --git a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-1.png b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-1.png index 9dfa12cf3769a0352d49d5d4e5373b33d6fd4eb5..54890ef95d46de3f83dab80c9c17c7f48fd7a024 100644 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TZ*VXH$q#xN+(7EKr;B4q#jUpo4H<#FLkqt8 h=kmxe05XR>uwxTD%D|XWAbJ|)6;D?`mvv4FO#uA(6kz}W literal 785 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TZ*VXH$q#xN+zbp%H#}V&Ln>~)y?d~5v4cR{ z#fjdM3uhEaOgUs==;-rfUGwS|sWbfV=hj4gPh4|;Z-)2gwT$iM*=u0j^X=AYB=GoS3Rq9MQ$h*1ne7zQyYI`ua+cD9|Ha*H$jo3UOF5<(;Q@C{U;7tqIds0W}6~k=DKHQ|>PC z@)-vM!?i!6r}nPdFn7{EzF$4J{+6uXU;c02UJJcnb?w=o)#oCA?tE`>e72{6!wP`||DTDidH;L+zdsgzd}rODL5~{jpr8lg2eEej zQfHof=K@{Mz_7vm`>$tbS3a84{H(&QmBFc%;h(JOjOtpDEOJzU;ua}h%N~4Qaj<6J z6_8a74AsT!^Y6{kI%k>Dmmb0au?A$-HbdXLCZ*@Vp_)TXsM_*w7dTdJlh&TF7@B|> w8Wi4rH9bD3!E#=pBE&%i(}#c-!;~Ma%f-BQ7My*d4NU3`p00i_>zopr00&nu@Bjb+ diff --git a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-3.png b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-3.png index d3bab6e323d334e59c256c27779308a2cad0bd04..fb6610be29cdec75d6fac4784d44b0e03a10868c 100644 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0y~yV6*^Y4h|-uh)a6?1R#ga)5S5Q;?~=PjJ!a>Lkqt9 i=kl|Q0GT5R{E;|T%D{Nw;dWb)uRUG;T-G@yGywo1I}|Yh literal 1072 zcmeAS@N?(olHy`uVBq!ia0y~yV6*^Y4h|-uh)a6?1O^7?@18D>Ar-gY-VMyV84fFlqyE@Wab=$cer+jzh0 z%h&6VZ!G?qZue*F_xHPxr@wz}Y~S}^_1*NQ|BKqhC(B*_GC@KnagmYk=}*_5uYY~( zsO8KpvsU!S%QFbh|HZV>xpvPV<%C5|0r%yXw`t8-p>W0N@s$8pVbPYTj5$)PKr-CD z!Oo&SAp%(!Ei+d%b#giBnke#yR-F91LS*-R<6D+$S*j5`Iwo(CK+g=XyN+xd$+nItk*ASQjBvyyKDP3%k}3^ z9&tg@4+};R4GKz&ivr&lr`?TyEh8*?!aDHnT2-d|_6!G%zx{HG75x4yO*A)tWAUvy z!tJZ~U1-!2zB(@g;y}iQSR4m3^wNqV`&G6ZfdSNc%J||pQS0SrEg2m2pyu5Ye*IiE ztKh0Q%pLfmv++`O?b}XP1_iC^+J);ns%u|%+n&ii_j3-=EfD*W+yDw32u7rn6=%;a zS$OmCoo6x(3T#j_-j>ULp0no7SJrzER_Pzrfych!j1~9|{ZwSHb#%%uaLj6L=zf|O zFnu4xf#CQLSIX<-_0$~MTexI7{#s>Sv)u@cRbX)XTsgc=cK`Orr{B+K0j3*hfFpbO z!OB_hzkaogGYCwS3ESup8@91w`921Q30>Wu0pSz({V_9VnpywsaD4UubANX2?e+x6 zKwbFrnj*g~@12Fg5$Lup_w%;1AivM=z5L$}lr1c*{G$0n7Xp*y%Hx@v7ixtV1SbP0l+XkK3=+0n diff --git a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-1.png b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-1.png index b2af26802fe14e7244f2890fb2426f30197c5c4a..19d7c21505d9a91ca6d27078a9da5cac8dcaf24d 100644 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TKX5PsN$HF41Ax>=PZ!6Kid%0F8ZrWThZcPG j&*kM`0AvnN&`{2tHXuX(yShE&{od&jYFv4Ma? zpwT0tF!{smE;1L6JIE++mhp9y;+Sz{*}dr0i%t%ocJERSIm}@4-jL_8iLZLU(fQ4f zE&3kEl+TH;3wQk8!sWyY!5pG3TpXeTS}?2-BA}%Z;;;gQ8v+;^Iu<>Pi+>RR?U$2? z6YD}I2u9Y5&<@ke5ODOc?t>}I{U53KH1FM4pjut4$hEL3fN`OdK=K^#vz5Q=e+B*e z9hP&d@^kvLpkLMdm%V+hRm}P6rD>oe&{7a)1gnQw*E)g8_Vw+@#e1s1{E&IS?z{Gx z;yr3$2P=fU=v3{UlN_sYVE+B&Z@&(ezWLg!0r%Xg`_raOn-U`qbaYYPn>~99Vu8Lr zb#Y_y=7+`CUkhm|T#-9=F1PJ`?0RpYmA@se%_Z#0_v!(C`8M}WiEYihs@VIcyIAjk z+PrQZw=guIfKhYvHTU&R*Tok>LXG8Nl#x%6wk zvv0_U<@&IofrKi^gNiEWf9+d){CUOq7auL}#a<76x8dpm7ib7G?6$qrbiShMutlN_ z&_~)p3j-k$1q|(}5+GmQVF!lL!#ftWm5smvD=3*GwF>A>r=^8iE4Y9zoqBBLLM>oa zhDa@MdzJX@SJ2J#yLNHHLT!icZFT!2y8;>*gs;ZM@95jRPoNbX?1~)@=YKuZ%>U;z z)B8sMp()$npO5*q+ukz2etNLi>-%l9Ry^>Jhb0a~JUMwZ&imT?N9Mhpt=;k6uWR+o zZ)7Db0>wBGH{5+wyi71`%K!5gH(qmxBLWVXzyA}l@Duxsqf0- z$EznQUc2=Z6k6~5*RSW_c_U*Gc5@iil{_B)L_S>3_$OU`%*}r~OV-N^U zG|MBzy_DB*v*sBDzWv(z8fa-C$Jf69uWj#wg7@hgaF{VJEP{ktix(u!1hgPw=CA@3 zW~+d156T1wYKzxZ%S>RP0u`t&0R}2i!K~i4tod%+7kHN?F)_&e5?*yJF8+9-%<-Ks vEcW>{@xh}Cny(bP0l+XkKM=i3b diff --git a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-3.png b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-3.png index c54c511f7a14e5595fa9fd0127aad82b1d1e6e07..19d7c21505d9a91ca6d27078a9da5cac8dcaf24d 100644 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TKX5PsN$HF41Ax>=PZ!6Kid%0F8ZrWThZcPG j&*kM`0AvnN&`{2tHXdpunnLn>~)y&LHF+CaeJ zqDZQ+=;;qki*+uXUa_m^Q~VOPS%q2Y=YFo5H({yx4xW%}2EGp8^)8#}p5F9%N@?ue z$1=~iSU*4gUF*gC0LK*#V9dC%DS&YylM^cpw{SVJws3KXg0O%V14E?CyRWQuo3D#+ z63_yPfUrUc2s^BRVKk!}1jPFr^lWNe_Z#_t`{m>f#A09zT2<2eAME$KS(m@y+T(k% z(Ox(I%-9+>-$EE_ z@tQjl;@U|C*UKwXZ{B+yef`z{)I}gaRk5Hu@leK{ud??d-|v35^LX|msNWj`)Z@Z) z78^e|M0f9BzTELKT>AyV3ITRQ;83umBe4*vF_Q!1RUElY4oVD zKre*Hgnysod&SW8?ONY`|HFWBb-DlYa`E}L>_EF^E9bnEY5R7cOH^Q0;ji|3n`bh> z$oi`D_)BkM#{acIM@cQWwo~{fQ}t}!`{OQe*S^jDzqWdh8Z_z{7%I-j#b=z3i$CE6 zj=>2oi+1l@n)BZ;es%fLs*O|L{ymU=wrKqgm}5cd0g)zxyh^TLx4pOV2}<|@BV5j= z#&N$1dH|;NCzN~>oelH>mXxOcblv+8Xi=*NirOSZxP0x||JK$96mF^SEo!S8f#!UA zXJH!B%Ed8tL1ESkU?^xgKE48s0)>#KV=I9%;IM+FHy9WJ4FQ~UC%3HvY7jC}`OA83 TvzQEE_GIvM^>bP0l+XkKYBq~S diff --git a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Block2D-1.png b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Block2D-1.png index 701ee2ae2109ae2cf6e03eb2869e5dd97418a1fa..14ad67145cc986e2664b03ae68d6e7fd9a1c9028 100644 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0y~yUEaktaqI0tLq?$Bp#@+4 hb9v+!0GT5k*s%#5VPGt0e|rTK5T34nF6*2UngC7T69fPN literal 825 zcmeAS@N?(olHy`uVBq!ia0y~yUmj!!Gb_N4d?cLG2o?K%MbC3QCq|AHSAbl9lBb`M&U>4^S>V)PVAAF1KL=3 zw9@?3%+K>|K8eY($Q!?Rvn#%r?EY`oH}QMh?%tNqxLtd<)*J3(kXH&ORliJ>dbgCF zjRRx=wg5m81nHSu{c`bLyZq(<-~4_2PWZ?1JKp>}#0Q?$_e+OO=%wZViRbH9ow9Zj zv7g3#kp0Z>hm4?5nhFdhps)Tc`keRVb6mr>6a3pj!t;Q_fuHLtfbsof>GQiM+|O2j zIuTtVP;+mO^v@NQ{jxt-hc~j+EjP}1*j{$~gfcLtoIbmIqB}6Xh|euo<_8AN0sCTo zTc5*wzZ_sV*o>Nr;Hd*SX@P=sLG`D-U(OZw703OQ`R~o|NMw>~*u0Nng3Rvd)1BW= PfsFBV^>bP0l+XkK<3}qw diff --git a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Block2D-3.png b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Block2D-3.png index 39e7dacb8f64d0f2f847f0e696f32fec2cda90ef..14ad67145cc986e2664b03ae68d6e7fd9a1c9028 100644 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0y~yUEaktaqI0tLq?$Bp#@+4 hb9v+!0GT5k*s%#5VPGt0e|rTK5T34nF6*2UngC7T69fPN literal 882 zcmeAS@N?(olHy`uVBq!ia0y~yU_4OU_D7?5G;xCLo&v(&+F!?pJV8+_~EOJL84l$7(LEX!kg}{;9(U&SSqHF#>J0 zJ5^!+M9@az$AZUqC!Ak4^^%bMc254L^CtIre}+7+{Rnc(!sELY=V$Fnm;0nj{y|i*DB&|K#p*id=Ck+5@3ieF-rZ-ecj5s)CZ9oK(4t~tp8VQ?c4kF zqwad2mq7Q)!)C9{^?!=Ifx-H40yL@wQbExKwA=Z`$9ZKZ{Nq@SPJF1h@&%d;O;kW* z8|oj${R(~4U)#6Qp7ij29dX>sJ??mTm4^$=O!UNv64ML}H(rao>HUg*6T|{a5)7WM KelF{r5}E+3R9tod diff --git a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Block2D-5.png b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Block2D-5.png index 0e0d8881a9e778a504390d4417fb67f645c36a75..14ad67145cc986e2664b03ae68d6e7fd9a1c9028 100644 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0y~yUEaktaqI0tLq?$Bp#@+4 hb9v+!0GT5k*s%#5VPGt0e|rTK5T34nF6*2UngC7T69fPN literal 879 zcmeAS@N?(olHy`uVBq!ia0y~yU11IB~QP3$cE5CIfHpydp^CZAs_@0)%6`&OOW z`2O?9AC}IO_kSU(bK^IhfIN{4Da+<-1V)ej6ppi+NO5OM=80|lWzFep`I-?!}n#`NTpJ<^{* z3NGPO0J30uvEJV)zfYa|yzAG$A71>eK;J>r9g?d+eu4N0DhSef_vG_S(Z{W>Nmk0n ozg#E)3=NcI3)hb9Q($1M&=2bn%_*HYNfu;?r>mdKI;Vst0E3THJpcdz diff --git a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-1.png b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-1.png index b30b59e8fbb4a6910cf4ca81700f1abec76ed58d..3e24d7b291079f2a082233e2421810ecf2efdfd9 100644 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0y~yU~B;501hUgh~;d%<3LWIr;B4q#jUpo4HFVdQ&MBb@0M0NL8~^|S literal 1160 zcmeAS@N?(olHy`uVBq!ia0y~yU~B;501hUgh~;d%;|vTe{+=$5Ar-gY-u2FVV-7(Tyk zSue$NMaiLofsu(t0Yq^KC^#@Mv2X}r5rWD9ZT~ojJFU;M_Dp7P@xg|DoIpJUw1Q28 z8p^=nu;)baL5;(IXML{QT6TXfH`^EAhK8(Z+HLDze_ma`|9yEmQx3uvR~qI7nX$8Q zBrIZhI$iu3&?p|+1%JMI7XvMA;|}=uV|MYmMmgQRdoIqlOkidLJEpGmq_M*P{ro^a z3kL&3!<0GP$12y(t$zCX&c)jAJRB?BAT9#?9IONAWd%?uaG(kSd0-g^hDWaRK%P#2 z=2AGz4s)=6ur1IC zVqg%^{}i(!@VtGK@f_}N&;C}hv4kjt9ZgaUDxGKTHhT5jF#X*5^DE|nqX5|T_q!s(Z&~0_gfX{*2AnC^?!U5%uZjmfACC-`5y~2G}yot14EnXr=1DU zzL*|=o_^@{8%cqHUa-;F(iFmf$bregaHLo-VyESlhcO%a>ilh)nN|rx0s&uKK`c=K zQ@}W{ILE4Oe*CN9@#h~t)Y(vCL}Be2%QGLzOEp_7^dv6WJ#S*H6^8j>LDScr>&}NZ zFh~m+T>e#Dq3F=S%P}MQujWn`P61#z&x)+?(sg8FxzW%t?b>`J?+FZyW(o^7eqDY* zNCl)cBmeKtD$b}o%rmal-OqJsus;Y)qYMlQ0TZ7$%}nmId{$$6+*o0O6eu-gP1L9n h4dj7Cm4WRWziiF-m3-kF>w$Tk!PC{xWt~$(69Cz7GeH0V diff --git a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-3.png b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-3.png index d0cc64affd7a493dce5c488d86b4fa4d6c48da5e..3e24d7b291079f2a082233e2421810ecf2efdfd9 100644 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0y~yU~B;501hUgh~;d%<3LWIr;B4q#jUpo4HFVdQ&MBb@0M0NL8~^|S literal 1179 zcmeAS@N?(olHy`uVBq!ia0y~yU~B;501hUgh~;d%;|vTeNuDl_Ar-gY-gV4-yHB+p!u)*m88G~H?T%*HljKL<~#<5M_+67CB7Wlo4_y; zY(0K=gH3_@h=D;N?)>+r(Ake`j@iu5dcXS0>yJDf9?B3kxEv4n57ei?IQV#nyX=n4 zbK_?}L#pGK#`UK=I7orQ4Jr7VWU{kY2ZIEX)_i^bk{#p(iR8Z`SCYL7^MXad>ZP?^xbWq)JtLC`*9H6S z(%u3+IqU6@Z;TOd=YGP%p^?|W|9$XNZ3$ppGca5U{1~@k#r5D^zpbA?R`&kfIepe+ z@)E*M@tixBcKXlf*c~@kQ0N6GUHl0V6qi6pfTNUw;mGO=eTnCf;x;7L>EGdI6YwNG zEr#w9KVutw{LIHn%jaJ#=P@#7l948lRv&Em1$4li+2~%djgF3H1qME2@>+X;dk$a} zF&&Gj?~7?-0STsFn}2xPg6_raYSID^z@ZDzXdjlHs6Kec5SY>8$O_$tzFKDXt;hD& TO|yCpOp*+qu6{1-oD!MRoG diff --git a/docs/games/Partially_Observable_Sokoban_-_2/img/Partially_Observable_Sokoban_-_2-level-Block2D-1.png b/docs/games/Partially_Observable_Sokoban_-_2/img/Partially_Observable_Sokoban_-_2-level-Block2D-1.png index fef97ca21b1727dc03e8b91a2b8dc48a12a57328..6abfd74ba5086b15bbf1f9368c8edc66a23b18a4 100644 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0y~yU{nCICvY$UN%a^-F(B3N>EaktaqI0tMqVKA(1P#& hx%})RK<0peKN8R8GccxEd|m~z-qY33Wt~$(698PL6c_*i delta 1135 zcmX|AX;70_6b;LyLnojVD?wwz1ZNOrNI*&W*wv(EYosWSPFcdDqEv$)wlR?s;Ok%{ zY+=z@gs=^ysDYxEfgvFfS|W?A#g?_2g%C#&2?#hyU+A>|-o5wSbI+Z3kID?ODstjk zhKA6NoxU;oW+vw96nQs2-dSJJA$b@g==*8B)!gfTaLt9BI^zLNb@FRLZs`r<{8X<6 zDl?_Ut-r+$)~GJ2HlAdoIO$jM^`y?^fN8C&E#3w(tH7+m*C_-eteK|V>dM5UZ{Cci z;7lO|LKxYCX?Pz!0P{Ei{S-arSI@?SvMQcjHOxHY0>S2KSd7F|b zFnc68oJ4G{Zt}dnK<^3PG{^}Cx}}ZC^_v8)t;apN&*CkvZI-eiv`iFB8)#^9H_=v& zFgTx$3HUCnQ5`%Jp22YmG2tJ``_@j#_(7RM&x4d>q*uKK;yzqntsr|Vf<)Y{t4TEt zncfVYF)8WVn`w^UvWw!Vxuh@t?TWVH9Eq6@ptc8&&y2o5(K^r z#s8-iU(J5(FK7I@9mlr$7x+?LCv5Mi@czj2{MA1oMY(6NC~W6z=bI%Blg8B#UuvdZK`k9w*b18rXO+(R?f77U7d8_# zXOMAB0#nydM+R2npexWK(fszFRbrnoZ3vM2I1G$&A(#OSHLTomQSy8`5UEA4Jc@$g z<1p}?mq_Ob!8PD{=%^?vwBWu1G&W*%3?UBs1t>1X?r?Mif2yb=YQ0v)0hg~kB4R!2 e6PDbya1?YhJNE}go)i;+5>yDCL6aV5X8!|9RV7aV diff --git a/docs/games/Partially_Observable_Sokoban_-_2/img/Partially_Observable_Sokoban_-_2-level-Block2D-3.png b/docs/games/Partially_Observable_Sokoban_-_2/img/Partially_Observable_Sokoban_-_2-level-Block2D-3.png index da519cf4c2fbf16c6e0aaf685d002def00abec6f..78ba6ee1b2626595ead907dfbb54d4b8c50d8054 100644 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^6M%RH2NRHN;QgQvq+&c>978H@y*{9m8v e;Q(S%4nAbam@_b5-e)}(WR|C^pUXO@geCxU7Zj2J delta 1042 zcmbQrxQt_hay|1~PZ!6Kid%2zCI&Sd2)JoJ?yb@|e`I0RvLD9-+m%{2aQ=R~FaJ;A z);C)e`6qwKS=K2~ls+vra$2jE->WlUJl39RUtarl!Oq_S$CvQ6uqx%0Zkuf_SjzL- zAwuMk+4*8;^+kQTvK-uwH_l1gUF}?v9LIj>3#auP<*9Q!tZZM^JIt_1{8IJ2RKaJa zfm`0c*A6pu64%&yTxm4$Jrv;>zLGhysijanVl|&)%LL)+e(UBj-(uG{{9?1_JBPYK zT(kQm0kIB))ser-Pnk@eQ4yOXzvsx5mdLdx{~v9w65w9{?At+aAI}+A?_SDX<>j+S z3Zz*zG3?lRIe%5PxaGI%A^g3MXDksCUVl%-X@*f^nDU&cHlX5NeJYAR(?Et>Rsp%U z!VI%s)qJU{=TCS6G|{X0$^+F&+$|4Jm)15{bhb?RZZrS%XU;2SpEu0)Ru4aKSg$Et z*=e7{7#V-)gAhBvOKe4__Ns<8;)%!NlCr&yUO!>A_jzT#d3EP(8^)QoKv5;btmlIQp|_t_{E&)FSBZPyerEe)))d{AhpK*YAERU~st<6VI49Vq|6FGM z{&xF055CqGd= zdQDss-=RHkKTKv>fB0MD27#8!+e`IC<9_dNGN=WLZE!%v(p53W_hC*VE+=Ajglg>wSDn7Zi^zzi{ z5?Aw&c=OouOPetr$=~y1pMs7+;=MgbR@5oSC3zj%Q`s5#*9{cQm7j$c|LU#i)a3m9 zOx5kH^hcp!AvLdlnG}%FWI0AI$F}J+CT(C?Eg>}Fq3SXfoikp0icfq1suFvXw<#LP z;#91E(x#p7p?`7q{f_ApRdQ&?!3n;L;*UV9E6azDSRqVrV!;T^MW*o^kLIB`hI?r{k(l~CpC z6Ef~+c>2mALIIeLWUn=D&;Ul~uQkkxiX4Z%OQJ#9>9F^g81_R)I2T{HUeBC(s>QJA zb3FT@6wc(Yj*IwOGKG$D?edc45LW5geITl|BWNFk(9L6F{&TzcF>o_5FnGH9xvX*oqTp(wKr;B4q#jUpo85x0sO$z_l j=Xp4Qn4@4Yg+PsD=q(0D2BD{aL9X(2^>bP0l+XkKsTmXu literal 1195 zcmeAS@N?(olHy`uVBq!ia0y~yV9WsG1`Z~m2>*oqTm}Y~B2O2`kcwMx?{3UxGL&db zjDMo)_vXpeHPI)n6^}J2-R)#c`ET_6`AUsN8XsNP?+bXacIz|-yN}N~7#=dTFbnWG zSO6JN3dF}D3{=*_ETR4Vm)la2<(!jWm-bIO%E-a4Ak$F5a0tkNQeZv~;X{lHG6xcF z3a(js{jb!!%Ns!^!Yu|n1IkAd#_1k>&Lm_gvR%aZ9ctH$wRYLHVb4KcblLg-ckTVZ ztZU57{q#ZBv7PU|%zbU9v|BqcI0UWDd-_tJw_Q{ODm`+JcX9H~orxu&P}x{~_(eon zo`ftg$lTxDF|e98SK94(`6sLWuik$Au;<{ThCJ&-FE&^xES=K#wtzzn7QXOcR*(UQ zHjLk{Ohg!x>fMI=%5Cy1wmw_=N8r4+o959+41ZQL5go(Ogs@@K%XgtO-~Q`Z{i;;H z>v?J+10+=#xUF3ob{wSW;Dw!qRg9ptll-jhVk1z*@dPkLK%vP23`lm6j3O|+K+ac4 z0frgKfR;17ihEw4nopRWMYOZ z!(k}0Fsb2(>e3H>Wh~iROD$M*Ao+FOk!l%%rL{l43h(Cy1}!M4pq@eU6GB-0*=Gxd xQ>}K-u08^%mjtKi?6aB-@Z?2`L diff --git a/docs/games/Partially_Observable_Zen_Puzzle/img/Partially_Observable_Zen_Puzzle-level-Block2D-1.png b/docs/games/Partially_Observable_Zen_Puzzle/img/Partially_Observable_Zen_Puzzle-level-Block2D-1.png index d1ec79f173defaca77d06ce3155a889473b263f6..72c16bc324e98146ec5ecf2e65ee8b80283f33ae 100644 GIT binary patch delta 80 zcmeBXJ;*dcS)7r>)5S5Q;?~=PhKvjh42Kqc_0Q$yUohE`$#`-AlL|VXSimJ#VRF`& VfpM<-68}v^Y?Y+q|DfNkH`z%l7rmIN*@5WUjulnt^~s=JV4XoIvSYn9|#>JrUt}(|!Nd zUh7h^p1s>nbbx)9lhpD3;2m+p>xEh$?Ql2==q!f>sKah|a>z#pov-XUo_F^5zn%Jz zb~N6#uQS^BLu32${@Yy~^K-*Hy_Y&9B%itdW;@WA5p7_nuuKEHl%a7c*rg5$5SI!> zKwLWQO{wYL>?h_iD${Q~H??Fv&c9}>n!$giO^>;?)*k^|?Irc7cEhUg{3Y>69)Bjr zr5jGv3a0Ov|FFJ4xKrEGAwj_agasr(7&Z8zUL%)k*e-XWw9kKbg>ntZ2v1i(mvv4F FO#s|RyQBaB diff --git a/docs/games/Partially_Observable_Zen_Puzzle/img/Partially_Observable_Zen_Puzzle-level-Block2D-3.png b/docs/games/Partially_Observable_Zen_Puzzle/img/Partially_Observable_Zen_Puzzle-level-Block2D-3.png index de58597253f1f79014a3097fa0d517d3fdda422d..cf8d2d9f1ce16cd8a6487bf45fa488cb4063d821 100644 GIT binary patch delta 77 zcmcc5ww7svvIN5yPZ!6Kid%0FHZlOg;RQc~?>}G(Wt=R?Y(80mSpykQEMOJ;z*A$& Uz}PV9v@}S$r>mdKI;Vst02{U#$p8QV literal 863 zcmeAS@N?(olHy`uVBq!ia0y~yU{nBN4h|-uNP*nG9tH+xHBT4EkcwMx?>Oe&G2meh zsC*!8nSN?v)v_Ock?9F6Q+-dS{JEFKB@$)u@7LQS3E4oMlmPy1xwp6FR-RKl@~bEP z`{vj0-~Zmf@c9h?wLfD%79CevxqdtU_j%0?jSUxrt;J8Pzmj3$Vd?pI%QDt3@VP>Q zLc*N2bA_J@m+~>OF&*1_>!sHG6~zJu0tQN1=|!g%f$}cjPqySs2?B+VnVh_^-Bu#Y zu;~wD_S(03+_-%CYTMpIevl9T9Qx-_JTKuZ%NHB%o!{7RrO&wkdS&27`wMee zd05uG+q&w=naBeU2TsMU_BsO=dPBUB<+Vrb^(TPlUrS(q@1dG@4rJj3-z)zde#-?% z&j0x4mVAa?y>>$U|Ju&FA5-6*|JxW|_g$)#FK|yc2h+EnUsit}{{egKSN8LgpEsN} zfL^;38?S!qxSSIsGo!M5ZRym0+ZJFbxGnoN>rN4e1c$`MTBC=v-B@_Mq`sQ%Eq}s1 z`^kr^KUNe&L%{tv^IOF){w|09DVx0Ltp+*hf%rG}S)W-}t1oySd2*}$1-rw4;{1D0 zef!2(EM_3E!Rq=dA>(wQZQ9jqwG6>Rn}`>B9?>oTNAWlF*~n(zJ<3yOSTX}`bTA79 zI-}Yrwf5NN?D_>i?;Kto6#44)+rxXok^AM!xuc&pwg&)%eaHHJe$yd7Ja+eM>7tr9 ziXy;BExHmO4h@c!RqIdcwgXd&;9Yg$eVHymO%j(?obP{2SaFo&6Z;z3xBOe$1DXY| kDK_8R!4C2-+2DcQ{pph*Y*=YHB^G3cr>mdKI;Vst01?|!H2?qr diff --git a/docs/games/Push_Mania/img/Push_Mania-level-Block2D-1.png b/docs/games/Push_Mania/img/Push_Mania-level-Block2D-1.png index 32571325f4814e2415547bff9c686f53ece54044..395c7a354d7b1981175fa22db99bf05e48d8b821 100644 GIT binary patch literal 540 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1VC3Ln0*de?$vy;f9(%ethE&{odytVAD0pbW lcmG^|b`cBxEMBu2#up%#ew}h)p?FS37Dm zXvuj)g^7@1DM~ryuroQ#N>hYMk#*d647J;3KXmQ=>Al|je*XXa!|(q*=l46@h z1^}$Kv$b*tK*AjW6b2)K{8{yb8Xo|uZ|tmgxzM;HJxgxQ)?vJ_@g?gUUs1eL0zZ)M?0F}mg%nCbw@>o`6M7i#H z^s}VJd&%(cZf~dk zyB=WV7T?t98dFzab_{U<l6Edj{g5OFKAATo0P zzHx&N+IE{%I`lR3GF4u^ax%e^;ZGIzcU;ZFI7S}*DpPKK4@9SVxi~z*)0(zeCW_i* z+F&kgBfk3#HXtWL3A`z7m{(I5oll!0_=p7>HJxD9o?1bFg~>Fls%5l+HB=~F{1hT~ zSy$1|mT(tXD(`GHDwjQYVvl5;{S*oA(?xgtU_Hln#}Q-fJi~i+&<{f3zJ!G zdo?npMF)MiZSq=V%BDK0b!C{$Q|`7&PMC`%Y{N@*QZ1pMR8n>2#4#**y{>yMFU<+g zi`&Fo*ga&)2+~)YwHUjkF6P30lymtgckBEg(cGCL(~g2P#nGMp^Ob{@=Fc?&%@@J^ zGuS_Yg)~+y<(`*{rN>p&UBfgy1^ICCPcxcs6&jve4+YAh?5fC<#i>QJ1{{8y16&ekqOh;V?>z(Fk`iObf)uk!(?1j;~fm| zk)rx#$(m{^Sp+r0T*wmo;9Rgc4cdF<%MM1C9Kiyc$DFl3271~8-0ZDhS0pnCzt^Hw zMf~Dq(>Ate2Xda7M-=V}<4XtgAY!sYkmr@Te1oCB!$~YO3ICl{IT)k=%1{4&k>vW(sOoy6zMeKg9;?X9Fj8bn)}W~5deMr` zF*#;h&lUlXbxUe$EXTwWM(P(wys6|?@rd?(r;?a*itQrhLhcr6)a_S%c2uTLdxPRGm6;IQ;`u)V5{(uGv}3IX{exuEqldY# zsFRlWRH^y*^lHqh_UMgE#bQ{TF2OWKeCTUP8$#n@}+qUgc7b$;aELd}WvK*Zy}B3!{W5 z!*yyB|Nr*yv36qLL0*$y?bz>6`hF3vAGt+79=G>&)NAv*;lJ diff --git a/docs/games/Random_butterflies/img/Random_butterflies-level-Block2D-1.png b/docs/games/Random_butterflies/img/Random_butterflies-level-Block2D-1.png index 74920bd7924dcf97535ad5318b5b037d85d31773..279576afa2fd8cc9f7e45d8d9a24830f347c5c6b 100644 GIT binary patch literal 595 zcmeAS@N?(olHy`uVBq!ia0y~yU|PVyz{tVD1Qg-_d9ep5Am!=e7*cWT?LkIHpkR~2 l|Mhtu4j|?z7}+79&!*78z*urU_b4bFJYD@<);T3K0RY(=6T|=j literal 1543 zcmeAS@N?(olHy`uVBq!ia0y~yU|PVyz{tVD1Qg-_d9jCqf%TlHi(^Q|t+#g_Cy7|{ zI0Vi-@%iP3T?=lC3tUJko0_wK`>Lsn3$1=f2MY@@GUTMYxP;z~Q8iwhEc-g*xYf0d ze)CJ~c06V{P{$(207L>63=R(%85-F^91Q+FF@}Z%%nVHY3>-EL3Liim1Rv-mhB7+1+%8{qv>&+3ag(Z{X#$L1<%Ox__i+Mj7LC$vNpD%l7^L`r#?F#rX#| z+#r)<*SELH%}Fnq#|m`P57%`>@TzyrY1fzD#sD%=80I>VQ$ZlMr(?yc*{f5Qtz~I& zx4D#h{~+^$Hf%mb4*}wRocna+9QirVF4S0{I#8x#xk-X$MA&2Cd}-~YT76wm(GHy$W>u=97NjXpRnh)Htuu+Q5) z|M=%e8Pj!d9NoYQ<}d-n8=fGbUIn>iiwVpnlV;CxZeXvM#|#x6@gFbaZP^|qynnlZ zQ;xysL-{&geR+llD?a|+D{FF)xqOqX`%wfBt57E6O!YKK{MD z^a3yx)PA_H(`~C@@RPfL|B@rnEi)d>-?dHR5u-(A&HsOVarbw8`;fzEal_sEh5be3 zcn7)h0l%9|$knr^M*jhjjMm|)i+A+5eIwt!-*N6 zJ~4iX19L8v`WUWh`0fPCKkcr^L=JOR=$n<_WIAV%!&ss31I{jpgaFDoKyaWPo-|uj zEABs>@cl~p2Zjxbz~}(Q2y%LCeEv7>$QJGgdk+)?6OO}!-SOe^b`1Bp&&z^T?t5K& zb*bnc@p-$S>w&D&FN!VAWPRWI{M}Cb2b);un}Hnh;f^m_t_9{|5ZJI)P%yN#c%gP3q3GL4w|2_?M)~>$yZ50qv*JI_*HsHeGu+rn* zigMs0Byr-$y8`^+VA*iuM_vaz*e4MwHReZ{!NrG;(LU)%j9@Q{N#5uEcpyzL`as<= z2{T5Jb29R=mm~kwtwGL0Ds>b-_@3dY|1EjW*y23M;F{mB9|CjJyn~fu;4q5g=e30w zE8Q_f@V*yV^2Y;13uK}ia&ZW9*e(gdz)lRl8rv#)f`<#btUl_nol?HN-TMU>b1 RvCaco=IQF^vd$@?2>=v$EfW9$ diff --git a/docs/games/Random_butterflies/img/Random_butterflies-level-Block2D-3.png b/docs/games/Random_butterflies/img/Random_butterflies-level-Block2D-3.png index 6102a454cb9dd72a1babd7af51cbfcef6f2de0ef..279576afa2fd8cc9f7e45d8d9a24830f347c5c6b 100644 GIT binary patch literal 595 zcmeAS@N?(olHy`uVBq!ia0y~yU|PVyz{tVD1Qg-_d9ep5Am!=e7*cWT?LkIHpkR~2 l|Mhtu4j|?z7}+79&!*78z*urU_b4bFJYD@<);T3K0RY(=6T|=j literal 1605 zcmbtUZA@Eb6h1A`GO#T$9Y!l4I0YjzM9CQ7m=+6UgE<8@gu#Maab=98Vw>`Hp?_py z6%!mVU~^7fnC)OlG?q9mWGh=(au*nY> z7VjT3S3Zcp)P78K35zyU5}2%{?(}n zI!M?CQk;PV6;yEb11|v}W2^lV3EX2Kzyz4u1;`BCaM%czdgvQ_{N$C1w9;&lgtlZ~ z=y6e3qM(oBVqF|OdQ?uWGfJXtNmLnfMwtEx4@UzP<(%I6 z^nM%0jfcAKi_ui@%Uv_fy*0{&_MS~d2p;~lH~Dx=Wj!G>?Kb_`Rih^+Ygy`x5WwLY zwTlCOpG2X68iXvq$H3?+0Yp8=9hxW4%#{#BkfW8|`uoqO=C6n; z8vpcEM@$rFhF9De1REv1x6w}{PZ>o70@DP04`#gBbckD23pIf)eOqP=DrPQspFTz* zCb+A|qLjnRprSYHeLUbyrCI00V0Q6ua0yhIh?m{;r`nnMJXfd=K|R#O4)gtQlJZR} z?sSaitPLE{(59gFBtgR0za7^YNICnEGHl{-D22>uy3GFk3Y3Kr4Ahq%7|nWQ6dkxO z!StSl_6jFCK9pOX`yXGQ2^~*p zU%IJ%L`7NfkI~cX95KfP?E$DR=e2?xTWr4T<7)*m=O7Oi3n}S=-^n6(w`d;(lLF$C z>S9Gy%x&BHNug1}pRxHyEaUAaRs~0kce+MceD+?%ZEpeE4nO^l%B3cJLa5tzW3b;4 z3kNkUQgALyAG!da&8|&OMRUbCEvgl}6XOlEhX@I=CB}0Ctke8Zikt>sZnTQQ6yK09 zrcL0k#NO;$#a{)_Y7D1aYya@V@k7Bi7K?kTFiCoc$?FfliH-)2*m{c&J6>_FmFSIA o?VGk391GM=A2CTpy@36^PT7^cv16yAcnMFI7@y3#_Fhiqzt<6SVgLXD diff --git a/docs/games/Random_butterflies/img/Random_butterflies-level-Block2D-5.png b/docs/games/Random_butterflies/img/Random_butterflies-level-Block2D-5.png index e9af362f65fa3368125a6acb5643b92a8f96b6b3..279576afa2fd8cc9f7e45d8d9a24830f347c5c6b 100644 GIT binary patch literal 595 zcmeAS@N?(olHy`uVBq!ia0y~yU|PVyz{tVD1Qg-_d9ep5Am!=e7*cWT?LkIHpkR~2 l|Mhtu4j|?z7}+79&!*78z*urU_b4bFJYD@<);T3K0RY(=6T|=j literal 1839 zcmZ`)eN<9s7=JG)SQ}Bc^`Qo~Oml6y&Ya~^&}N5;&a8FHwWTI5&9=$rN>f@sWG)#j@UW04enIkhK8dN&rBdoN&-We%8JZ0D>_zBzPUC`=7h*LRatUj*(FY(@>Sw z-BN$x;NiNXscCD(Bii_r&RKJ}tC#16A>gJ|Qh3jzE$lqv|L71)2p=;OTIt0pz@3Va z0geKu>w!Q(1P%efU4sNE@UPpPIA22)lb(XOfUIF7^ND3S^CRsEDf@|W2vxI((Y*^;5 z%Z%#&qLWwf4%hQ;&Hka*-z5OZA{E4^ExjE@AnFl3*T+_VnzNp-#sxJJniRKAIFk$R zL$enzTXae70X&-Q3Bc>1D<=c3p|kcawI=L?j6xTO%0V9=)YXaOm$Zi#lU!v!d!_ez zE{&nU3kae-^D#M>+dS2re=lyJk1R6N~!n;3XD!Qy-6{;j!px*zk%;b=`{SxP>SyE$+gZTKfhA=H9#drB~qU29lADj<5I zOc7O$R|BJuoT^YZD+4})FkAuzvrLIwh36aj-7>WJ72*Yo)u*BV zx8(3_qF^^X;KV`Gqi6xW?8TH-IMju9ed zC~3xnX522TISjMn9IPD6G6ePxa29ElQXd530y|g=(GxlV;++{OsdaKtPzk*zh7#r% zM7<&fjdPK<`pwCEdtXW3px>|z4KE8{`;2 zlB`%@5={z9rIP!XHACj;BdXzHoS^Rg`C$)BU|1KcmX+^JmTg}cFLmoci94S8-BA4$ zS>j7WleX$=ucspK*8<5-z3dq{BRwZz*zpxqH)hg_OysYXUkHh8yh~v%h_*2jZN)@aItp5f6m{y7Xj@Sw8Imp0H6)~RYb_ym9bg>0p@`2QUCw| diff --git a/docs/games/Random_butterflies/img/Random_butterflies-level-Block2D-7.png b/docs/games/Random_butterflies/img/Random_butterflies-level-Block2D-7.png index 0fb0fe63fb6ab9c918e3ddab2bb0b7fc8b59cc3f..279576afa2fd8cc9f7e45d8d9a24830f347c5c6b 100644 GIT binary patch literal 595 zcmeAS@N?(olHy`uVBq!ia0y~yU|PVyz{tVD1Qg-_d9ep5Am!=e7*cWT?LkIHpkR~2 l|Mhtu4j|?z7}+79&!*78z*urU_b4bFJYD@<);T3K0RY(=6T|=j literal 1748 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 literal 1256 zcmeAS@N?(olHy`uVBq!ia0vp^H-Pv92NRHdyVv$10|U!?PZ!6Kid%2*9?ZQJAanfV zb&cyj2j;TcIKH2!yl*;V0NV?O^Tki@=^bF&d3oK%=EWSEt&>FT_doytytqiaL*VbL zbYaJzo9@3C)_Hp_xIw_NgF~>Tg8;SW=HIn-7cO6(oc_7^*PMCnSDsI~^!niE3ul`5 zUw!`QeQAJacjcQPFK0Uo)6G6j;s2Hj%)D#TzMS1D<)LMdWtY>M3_j)lq&oti^`6Eq zEtV({d4DL(;-5{QegElg6?y-e`W6Kj1I2Sil-n%MJ}lYuMk6j_U&i7L!Pj#S2P~G* zJ961FrcC7j&dP;u7nQ?|hb4dhX$E{>&F=Z#(J8MmFZ2 zPByn$_w(%Sb%N46ta=KTY8+vEW^icgB7x{xhei7r3EZA>_-g;6{>kU^s^;$YZ2up> z>AB+4sr$0Fb?DAr5dOzHw>zRld?PVoi3n~ESLZXDsprd`Kbbv!d&}vJX7Am?H+@k# zOAqD!x!7ypwe`gnpBcfQP1-MS49rR8TYfkR7$Th;JC+w`h}@n9^i+l*=LTRfT+rBN z+I|!mGMm1++L*VyZCq=qW85V+F;xH2Q%jSs+_Q;|fpcD0hqX=llvsTB?21DlicZ9@ z-x-;#*tO=U*!7=DtOOGP)X@qqEgViR9mG=~w4P7dED&jOkh^})@x9CE?%!4+b9~CB zWmhz!TrTbZp8rp#^+dc+aYdDa%d~lil@@EboI96zGEhf6$#3_ZvVSvY&pG_l{o}fb z*5vQGZ}w$^d}h|=ceWR6QuJ$?eRm5#|9Bxak?YxoZqaFT4_mGiY0co% zRXTg_;aT^K$2}iQwoSS8OzpA-&+mQPJ9KKB_T7!Vr_^@usPv8Zx=ODVNejI>(esPu zXZ@PbwB0gyv%uldAG=@Im)Gj*<`sXxP|ja_Lu~FW!AFaLArNlZb^DI(9=mxPfGI-o z(WT;uqZ;$hBt8N9mSba+WlV+0{j-TTz`Q=om>iMwXA;kVd9y5I5=8XRB_0Uu`DCko zKJx|t&snoYs~q$XKb&bP0l+XkKewIDL diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-1.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-1.png index 23b60e96e08196f8175c8ce42cf8b79fa35c7cbe..1a15d7130dec39a07785b51736912fd3f24faa11 100644 GIT binary patch literal 891 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 JZwRDt{sA0*&IbSh delta 1604 zcmZvce>9VO9LK+Fzp(jL$}>sq>GVU`?5GS^`mw2Wh>CuoEz7NlTS-)GO{6@`n$GE_ zn`$AFiaLI@gt4n1EV@NyBfEYj)(B;l`>gJ{f8FPt?>Wyo-}m$Re7~>f^L|%Be_Lh4 zK_*MruU)kz;mxqB?%>;CtF+c3az&BP@nt@9vOl~gP6T5htL_lw!bTtwSBIs@P|r^o7>(2sU5KPAQ>UyqhI+%;mqGDu%U>4raz zza5Nv6Uj4HG>mh2U>gMcp=x%2<5=%K7-rEUhY2v&USALKRTgXl-GjyuArmPF<-5_+ zqb|sqp*n+_^+w#9K#x(Iun9hjRM)5#5T$lN*2HA&FjIJj2*sG}C~oH+2qAOg!WY<5 zn!jW6Sre-g(?=v)n|1GtG9s#SNB0TEapAI1-Jm%iF?W+QKL_NlJh$UxFYz`H+_Oda zM_V#jrDpcfnZ8spX466XhK8Jq1x{t=2w7mg?BPHdwR%4Pb5GagvM}`{a&>@Z_!q*B zgWQ~SO)|ez>+7osioJ=yQkELHFgi;+Oa?(Nh$eZuZw3&$GHC2+W5IQjrn%SvEJB?| zX9%9;=oe24@3zU%_hV6aSMrn8dEO!I$StDOX=)#EtD%=V8N=8cG2vdjN@94?9#C&# z5(AjJAg!h-+n3E5Hol7Zl)&IB6Oifj6I5}o^~+2olOQcgW&y`=s60MJjM=h+_TGlF zlg$2-A3{VA_=BzBeIJVjM;zvxOP%7fTOzDFwx^Fg&Hu{meSwR}Pt+Z1EX;URY!Y2c zG3`u0@NHdj^yntguzZ(1q2JFk{4v<;1??Fl;w+GO1Fese=mD0NuWpa4%E>pw`^ZVs z=stT89mj=;V2-2|f5M@5?t^@@IPbhanomvD9G&UNAg_^BJRMUW5s5@|2w=!k@{Z(g z2S6R*6r0?%{x}<*=TJ!&&TQtLFwa8!!WykLvxQFf zFVN2;N$l}%5@-CP|5+Ahf&(2)JkwO(y`ZwIu3j>Y+iH+G;jm~!dx@c8p0cIS#O$=Z zpyqOoR<&d{C5^jzm#9DUh?lqbj(<(!`C zdS%YcuwS|0`NfMu9fL;gxi>vP-0bskj7ps-j0jtKp^OgpE`@IQqm2LZrtP<-pr}mo znrVaM_UEBLn@qwAf`vM%!EX1J8P)8xRE*E8x=L?84Iy8dNDORk>X^Ds80^_xwQ>}3gZ6= z3Bl0i{>CAaP#hDEI`%`N_z;g53dIJa_t}_d{kt#w8V89ng0UAKIxsT-D^j4$K(oP* zzOa;N*s^OwkWiB537R&7!7*xo(>hCJ`vWu=BDHC@Fx*-X{fLgEYp&Z+hKZWAMh;Jq z$iJ)Dij%e(xK!La?FCD9oKD$ngiNO)2ttZ@6@wP5df@Q5X)hDfh8nX87p&Rr(x2w2 zm2G?HC~R#)tyzn%L(WKU1)4GFq>HH#$ps5zpOIkcw^Uurc|$8M&&>{LTygS;qII-> z8*e^D@#LU4ro|7dt``nadq&D?83|`yu8oD^hV^Z%1{L*bw_mw(t~yx%!hFUS`P=>F z&Pcl_mNU{~uQH4$)A)jBP1j`04Aee4yt}XjQ(x`4$pz@Mp5?!` IbTvo#4;@C*tpET3 diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-3.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-3.png index 8b5dbd30c1c5027989da1f59e6e8e9a6725e86b5..68ea3825a175ca7fe31e2bcecccad97dbf886653 100644 GIT binary patch literal 3161 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 diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-0.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-0.png index 458f4e0783d15b110e93879262ce292ea5b27c5d..dab6f0806648adde74c92f1a0e4efd62b91775f3 100644 GIT binary patch literal 6411 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 K09LMM8}={s3$Zi+ literal 5380 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 diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-1.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-1.png index e8292f96cacca8cabf2eb37a6ed94e54abaa38a8..e43b91a99cef3d893a5e8d590dfdecaf59114e85 100644 GIT binary patch literal 13629 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 literal 12604 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 diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-2.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-2.png index 44c3393d3a9c7094952919c7e88b8f1b54d77b5c..4e16ca6fe2120c15cc365e826231b79b3c75bb6c 100644 GIT binary patch literal 17277 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 z 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 diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-3.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-3.png index 73d55deda61db384f0142c068e28e547f24ad826..fa3426c08cab8803928c76ed3a737b67cf41db45 100644 GIT binary patch literal 40453 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 literal 38142 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 R)Byd+;OXk;vd$@?2>{!GYrp^i literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^Q9zu+!2~2bcWvkZQWrg4978H@y}jee)u152dZDN9 z$xNG&^iO_UvsZRY%z5;8t;&}lPCWrTf2sMGu~-y5IMB$<&L^W?h}nJLnY5*a#;13fye)`;nIPXCxv~su8r)bA zLox5eR*)4C+N0db%zur8Ujsq zCdh6uD?7kfn!_&P93A)EXLhzu%}+^_y>|D1GCEgAGP!Ura+#vw1*Lw7)y4Qv>)=kA zEOgwwLnyFGLr}Ft$fZ-`A^*ce=lia%KKh7%{bjycQ!Ms5P611RDNgoW|B^+lcOq)P zcYAg|mIi8Ygc({eYn!^&Q6{~$m;YgCL$(^|0+v9dnH%oPKIhzDY@`V{0PMJw?BBK* zJN#y1yOJp0v!r<&%+SyeT#$t@6S3ZI}_#vun9OdLVXDL4?HlyVPY^r zwBB8Pr}AV_C_p@m>}t4E7PUyXzI|um|6}gn#mrFWL8qfAy;Q^IToeFE&J6}`|=USvjiS;ye&L8Xs?v+`%7KmKt_tWg2~$T?#mg`M?y!;OXk;vd$@?2>^w(+*$wt literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^cR-kf2}n+{h`7eUz+~*{;uunK>+M~~b&N!%uP&Z_bU$vnc1BRrZ#JN)fGSv0Kvm@2-HV0i z({iHcug=Gio7VjPMa63=T_E0;57*Km6xgI8s0ydR&gfC`EkE}0zn~aS#;cCF)f)qSZi+?OOxhr{`xqfqci323;plVX`KHt4~Qg0VQ=Nwvk&UW$U zu>QPhD~%jK0T$)%%m2k!f3Kdm?y{(f=EmA)S v`Sj0&7m{-~xXhT+aY+asPC!?;oU@ahEb%}3UOX`QFfe$!`njxgN@xNAQ9k9N diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Vector-2.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Vector-2.png index a615e574f48568dc2987e8613dc3d5afae424e33..f6405ed4c7febecbab28c277648a910223a13306 100644 GIT binary patch literal 665 zcmeAS@N?(olHy`uVBq!ia0vp^cR-kf2}n+{h`7eUz?9(W;uunK>+Rjsy@wS<94?;h z*c)BUe#MP_%QLP?rF$46k35`Qye&*gdYv4%wsC*@ujYk+qM2Mc7r9JP@Pbkm;#${} zm;biv3OAQF|LLVRS?IWVhfrXXhM;PPkV~h=!={4A-?2}%C9a`H`0V#4Rkz8002#fYXi9(?s;GsAZzN>NL0}NCqMT^rw__8o}JA%(H*>F!8f<`*Cp}a_qKPK)i(U~Ra5QD z$7(b*E*z)msF>7N<^Rap_T%vDE&EZ_16_2;^S1Qdm_56q?=4M*#3LfiA9^3^y+2p? t{S&LV3(#Yu;8TTKcY`NdusByUPQM}dUe55K7cj{&c)I$ztaD0e0sx`s0*n9v literal 664 zcmeAS@N?(olHy`uVBq!ia0vp^cR-kf2}n+{h`7eUz!dN4;uunK>+RjMxrY@P8ZHJI z3K^$roOelE)IR4C^R!kC`?~j8sznckJzQ5Td?G*N)OtmSDGFXLoQqr_R7?KHN0m~a zqjrYGYt7hk)ZHjrb7O6@hM;PPP+*gWueQo#m*lx-DNobrDOT zk{6gdZO)yJ9cG>B@ zd+}t`UHx<1`-)$gNi;t*-@A6ojeQ{d!A60cY~B)N|InkYgKyJRq1)zQ_kpw`+X&=A zd}bzO{>S(CU8|}awp!Xq&IQ>G*9r6>x&g>R0}3IySNk_T{(sT4ZsJt9eefVeQMah2 zzNFAyeY#}4RcjmnbJp~g5Btt7G5)bFDCsvFEYLvq-YF!P5?^T|E#ddZ9N+<#S z`cS3pPhPs&YH5?^Ft42Z$X;!k9I(mpfESvVf`2n>{M9`DG4X;PFvT%=y85}Sb4q9e E0Ml>&`v3p{ diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Vector-3.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Vector-3.png index f8d23fb2db1125aaad1e7ad1b650e0b323906bd9..87c50c37e142ffc747996e554bc62fb19ecb93b2 100644 GIT binary patch literal 1431 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKNXE>OEA|(?u#Tgh_<2+p)Ln>~)y>l`5u!4xg z#U-EihbJ?iKgO1C>OUcmAyk%UMsZ!Bu=sTC2?6)#|6!VOs9%$Th1+2R!$Bqi9UuW_ zvv5Zo4wJOEvb`QDbGLoY>9X@Sk8}3yS={?)wn1Ung7`-=tN?C<&qf61skly0|YTlANx--+$47D7xMVnAnt zTnltEm>rV8>;2J-Au_y|t!=g+3*Tn``-yfcZqHRm&Tx3J&*(-XV_yr*2-FZjGas*H zQz{oYz|s7T%U8%TgY0EwHbxW@ElIROWGf!1&DN~g5hG*!#|;=Jcs)ykByx&^h3Ee* zGn?A2q1M0zp^*qR8XTb{STkx0o+Mn*{PvPRFq_VZiwN3`Bf%d~$}+!uUU7ca_ec9w z{C}Kjzy3`%dEL7WhnZwJ8If}`n7zvUZuMPF`@OTGcbJ~b$hN-?%|y_m11&a?GbuPu zn{P_hm1*_0oovr6jk*gfeo&Qd=$K}Hckxa2<$m|Mi#>(c#fA;lMJ(m9}XZ+?ytgEdk~h|tdViJS4h&g6%ees2U8xD1}IelF{r5}E)Y CvyI~b literal 1410 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKNXE>OEA|(?u#Tgh_Jw06~)y?rtFumXd_ zK>42y(rC%mf*3}*T&JS{`xC#ym0c2x!zZifvF2blzPfCQM$!X4q9 z)3dyK*;Mb+pu{6fZSv0A*n7yF%^4^27We*M+StK&XaWb-SBg|6|J delta 37 rcmebEouI2w-^R$Fkdz=X^%x6-*=ol7#{0e%G5~?6tDnm{r-UW|66p00i_>zopr00)Q+%m4rY delta 38 scmebEouH#=^LIWYe?n4%#MEOf45rSE_x@M0?P34|Pgg&ebxsLQ0Qap7djJ3c diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-tile-tagger-Block2D.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-tile-tagger-Block2D.png index 3fe75e180fad1754366b239ff9b055829590d275..13f54c88ddfb1b9470756a6b1fd68ed24c9c7a13 100644 GIT binary patch delta 175 zcmV;g08sys0m}i9B!7}gL_t(|+O5#h4TK;NgyFeAc4QmZ;1*>W_Hhs93;|i##d#nC zv*e3XKlWd(*!Hryw=(Iw?~?2|{3bqU=5X-Pm5Wn;#2&KIkBf;ag^wb{aSBXwhA5(( zUX6Kco@a-4RAMJUdVBF(7=(Mw^4Q=(oI deagp=*298lQW9o(iU#-e&X9)owcc!8GP+|yxcRK?@=cYQf~LOS>3#-j;fV;htg z@8%C!)vISzxrzC8%rcW}*H!PUNm$PopI^S`hk@OKSmPg8uJ2!xHGMjh!q=Zt$4*UG z+B1o<;6uWdclsO(631tXyRjXZT=Hen_v6{#pJSq9xf+=Ddv2X|Wq47ND8bGk290lw z*ayZiQY6Ee)KzvMpUwS%lx2GR2IZw9?G3Hagh#GrwGuLn*;9gKm?9+5k}}vt+=&;K z;;E=?1ADV_hvxG;Ppp7Gds%q=5Cd{ffTebfEOKzTD_g)1440Kt9tqgIOGreEC6Wpp zs>GSV$p;(}%Fo{jlq~@|X#=dFA~SkGeoN>L>T+h_W=1Rez$VhFu)|iuHq4a>mJJr= zVaQwh=-6~eo_XvH+_MAypHI1D!Y(T*#&)3gv(lRr0z3__>pnkv&3lj`;o_tYGb0w} z2Yr=-l_@NIZfjSD*|Qx;{;c%iM2A#Ql>hUOC32?BJIdpL#n(So)(u&k}DFW{aQISCwFJpDphDPEUfN@!8Qv z_qGIvEqB=2$|?VIkmtu*y_dZB|1C}{A=%pWhXMU+>iv88?dqmmKNz( zXgGw&6`k{A1f?BV`h!)N#3dXVMu=lKtc@2wee+LE#*}%$76OB(tDnm{r-UW|vM36@ diff --git a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-3.png b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-3.png index d3f4b76f58e2da7c81e44465ae6b809ec08a2551..68ea3825a175ca7fe31e2bcecccad97dbf886653 100644 GIT binary patch literal 3161 zcmeAS@N?(olHy`uVBq!ia0y~yU_QXWz!Jd01Qc0Yx}K4Nfk(m9#WAGf*4u-OKpsPr z!vFPo9u6SpC>RZa(GVC7fzc2c4S~@R7!85Z5Eu=C(GVDEA@H89TY-U*(Og{%Tq#LvVcr;++j&)Ipr5pwFwuk{!L7s-kbPoj=DMrOUtH4e(|RLM0!9W02Wy~B2p%&-LjxNF10yd``7J>PBp!<9 zKA>^vMlJAlUdz37%A99SmGf4|q|3OszpVSY|G@J@&+q=e@VCmLXXB|-9k{i~76FaM z?t&pEvCGi1<;_24hCBJQ4{v)s;g!jPVvgNskLP_}xR8ssU*U7kpKleEVo138 z^G{5Pg;O**_Tr0j>-2hnp?W=L_WbU9ZW-L52!3IF`g3t&3mb#QcAycly%(I-|34RT zvfH!vr!fOV-(LU3+4rygnc0xH0qC%bH4A?pHXf!C(-3ZSW!D9p^M1k=T@s6(D-<g_gU2-FA zU;wT2f*3KNNFw7(z-y<+7FK6jKigQd{O}L*;$w8^zblfwrbu=ev^XxT%RO;>0xPi9 ze#h^5tGu;gg**d8LAdktvwAHCvR1MSb%D*ZYtmb_&$9(tOwCz`cIAPT$2ZxI+dEb_fP+H+!}Y zGLA6ac7w)u1E+Ga3+YfaU9%hF=FI0-HeoohykS>;;Jd^YxvHK2FPB6JAHV!$F%v_{x>I#~cz@b% zi41dgf6rRT!?5Aj;pn1!Zd=k){o-3|Ux wfB!v;8p0z{2QJrk8(Oh4FhrcB`S?XVN9UhxEeV62zyUu7Pgg&ebxsLQ08_@2R{#J2 diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-0.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-0.png index 41745cc8cf4c469e538b504ce35b42e8a2c916b0..be9331bfe0d0276e3b68f14d9a871b52907714d0 100644 GIT binary patch literal 1256 zcmeAS@N?(olHy`uVBq!ia0vp^H-Pv92NRHdyVv$10|U!?PZ!6Kid%2*9?ZQJAanfV zb&cyj2j;TcIKH2!yl*;V0NV?O^Tki@=^bF&d3oK%=EWSEt&>FT_doytytqiaL*VbL zbYaJzo9@3C)_Hp_xIw_NgF~>Tg8;SW=HIn-7cO6(oc_7^*PMCnSDsI~^!niE3ul`5 zUw!`QeQAJacjcQPFK0Uo)6G6j;s2Hj%)D#TzMS1D<)LMdWtY>M3_j)lq&oti^`6Eq zEtV({d4DL(;-5{QegElg6?y-e`W6Kj1I2Sil-n%MJ}lYuMk6j_U&i7L!Pj#S2P~G* zJ961FrcC7j&dP;u7nQ?|hb4dhX$E{>&F=Z#(J8MmFZ2 zPByn$_w(%Sb%N46ta=KTY8+vEW^icgB7x{xhei7r3EZA>_-g;6{>kU^s^;$YZ2up> z>AB+4sr$0Fb?DAr5dOzHw>zRld?PVoi3n~ESLZXDsprd`Kbbv!d&}vJX7Am?H+@k# zOAqD!x!7ypwe`gnpBcfQP1-MS49rR8TYfkR7$Th;JC+w`h}@n9^i+l*=LTRfT+rBN z+I|!mGMm1++L*VyZCq=qW85V+F;xH2Q%jSs+_Q;|fpcD0hqX=llvsTB?21DlicZ9@ z-x-;#*tO=U*!7=DtOOGP)X@qqEgViR9mG=~w4P7dED&jOkh^})@x9CE?%!4+b9~CB zWmhz!TrTbZp8rp#^+dc+aYdDa%d~lil@@EboI96zGEhf6$#3_ZvVSvY&pG_l{o}fb z*5vQGZ}w$^d}h|=ceWR6QuJ$?eRm5#|9Bxak?YxoZqaFT4_mGiY0co% zRXTg_;aT^K$2}iQwoSS8OzpA-&+mQPJ9KKB_T7!Vr_^@usPv8Zx=ODVNejI>(esPu zXZ@PbwB0gyv%uldAG=@Im)Gj*<`sXxP|ja_Lu~FW!AFaLArNlZb^DI(9=mxPfGI-o z(WT;uqZ;$hBt8N9mSba+WlV+0{j-TTz`Q=om>iMwXA;kVd9y5I5=8XRB_0Uu`DCko zKJx|t&snoYs~q$XKb&bP0l+XkKewIDL literal 1895 zcmbW2Yg7|Q6vqQnN6l!qV`6lszILWovDi=ZVyutp4#iYOMkdTLug^z`vz{`bzz&fRn7{?31R z0e)*ujjfGwIGm~PI%E?T?_y)jNFUSDE2{@^xc41>5zjzY@2KczrfQ|R$APbXRmtB4 zSfi114Jq_Xg9+AV#}=heh3^zZUL!PiU(CEewH%yiQ!8pV45(UlEbs`!jHvH{;1C1E zzytZW30XbzO2?eOc4R%PruRl`>*bWqlnxS4{i*b-`*EUR$aAr9DU{9jJg-e6U3|hn ztQnv2uNh)m01Bq%U}pZU&yYP``MC#Z3By@&#ucd+fX&cJsfPWN?%cRSA4<-aUV|M^ zeRCO}*ec62PFt%xfApYF)yF`gi_#VK&$|-@Hae*Kr{D9@#m%@Kk8px2%0=72Ej<;5 z@I;V|{gjO)7NuUHR+#`{kMh02utye;T|#AwSO-w9h>cl;#-fbRmS3d_6Ux)7Nt$XTH3Dy^L>H>6%_?(I)`7TaIB zSaNqauyKDBftpo7A<7No?S5_YO}Ss_lQkup={x6cbLz28zjgz#(P{bQWE#|C?%bif zWaEq)agB~}k8p9^ze)bOA>x-npWiAdLwm?)m*#5RycE0={v2;Gghdel^qtf%;agE4 zHEBI0X3lLEl%H%}2$cpMx8v`!rf$z!m9A>>Y!UjW4Uyc@eN%Vnph(TlCWbm0;29fM zn6$9{2C;@&De2)L{yN@5&VKsLiYkEa2V$SEu$(PWZG3O)c!Vdg_qj=562StyeSW$a zEgi(6c&vB&64vFzU(%ZHHIKoi4|AU8ROj(I5eFh(Eawp2)+X*4eR*cd>18Uf7hdA} zfU6l86HX))`}^sBF$=D-D-I1IbK+>JUo%BWRrp&v-t^dnr`l__TEc=W?dFw%%R+9# zad5~S+R`AIu$IYJUGHt6V&(HClN79g`&KRQIm+%0hS9uxJ*glc)D?HRB5$REs-u}5 z6thVES#8~lvZ#4-QBce(bb{I!P%ozaE-N{(lz6U6EMws5j-R>6*& z?T?Lq6?htcp%e8Lb%x=`;~DXB+x(*K$A(80u^o}Qhkg|7WZomEOJ9{Szz$!l z;KmQR?dNA-*mtoDTt@A4?RG9)@+AM!86~*S?^*A3K}7mqdClnAIXo6e400SLC+x|^V{zw z;-XpmUrwA#oiU4>V$Jg((FOAP_R;ReuVZO+XLM(aW*>QL)ob@G^UO+o9e z9Sta4dQPbe1gPC)wNi)pV2)8NSqBWryM!OKx6tR$s4G!8boh;sTrk(!LPo(%Vri>= z6?8~JPXL>TNGs8>B!Z<}SnGhNqU+2KZutd|p&}Je+H&Z$)C}(#`0DKjFWNco5Q(vO zK9J2Mn9JovLnQGNPQhz%ENDxg$?ryIlxt%`)iT?0RL6b5N=r%K?p>vKhHP8brY)uJ z5$>+#3)AfmdF0(ob`xl4UPYWRvK-3bTXGe2-Wdow>5UpaaN($FL&-l(=NJMhD|`pZ zMCN&}`N5-gt2#EzDjFFcZkrIs`~S`3-+2&ZDu$IJ$h4$-eufW%H@Q_3eS25P?NdqX z8@AzHDYKw7^;q@RwIHQf`5@*A1qA`~Puw_r5nVHJf=I>OYOAN2M8e9G#$i{i2WZ;p zA)t1oQVDNDJY>6)2!Onpm`sqz9oo4gCu(j_Q)jHlc#}`H9$>Sls!lJ_C+fsopPTa{ p(S4q)vBx_Yy`l6USI#b+(Ki~76fNKd)3FB>=S%fND!jsv{swa!GMxYb diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-1.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-1.png index 6d711a4110e07da06b72d152664b5e930571f046..1a15d7130dec39a07785b51736912fd3f24faa11 100644 GIT binary patch literal 891 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 IbTvo#4;@C*tpET3 delta 2064 zcmYjSc~sI_8~!0K32x0e1046EMXN7~XT0&ax)0ZK2{b>zX zPdw}|I!zJ>iCE1v5kTothrxtwxS#WOLXgAN3BtiNsV>XXtM_f{alBUYK~h>v+lz#= zr?A3YV;>f{Ei5CfnF4?%XY;I)$EPy@unCi)yA-8t2_&85!oZ_sTW`EEoKoB^p=WOc zfzn@Bh1g*@Fffr^;)7RO5*wl$e35MKOtn-Hc?e7`U+BwT&g!$EOiElcsd}s%d-ufU zGC^bl=s5G{_@Dy#wugr|L~hLVu*I|RXOZ$jMm!bZX@c^wogKi67>m_>{%wwSQ3B%G zzZl-e#{&qKH9KZ@h-gX3FJ-X^%lQ%j~zLmux`>KIBD zFq7~$;8J?e&ftKl*0rY63n|=tS-EYWJwII3Zn9uEGFCEOSu((LK(d0-N&##)j58<8BgwBx#b?T*pXV&NL{wFZlkS;p$gg>@{rYRJAnp3%^~v>ExPD4$ z^YQji$Pv$LXqEler`~Yn$gO+gAr-I{B#w3cwQN-N2UnZ28;t?FEr?-?Mn!E`QDcqNld=Oi6n(LnA0sXjW1&P~~ zOy#Gnz{1hxs3fA{-Yq!(iQ7bRhX|}}OZn7H!la_K)e({~oxH&g^V<`is(_!5<9F?q zDS-Ys&`*SVPLkhLQK&$TfvZm@ze}RpGvaT?niEZ>6$bt5_#xJ_?|F=4Sle zB_=vFWInSZwME=-HnbKVGFyCU;e7pT+B>6{qvqX*pZ$rWczDy{wcpnt)BgMF;`rOY z$IRiER;D|6cg$6Ef5H%l3!Of#f)6WXFSmCHw(($`<5{jB+7+LN0HnCB*|Da)mY~?62-l zjM|o5qYV~~r0>&E7bJ=C!XkLM&=Ilb|8@tfM$5JJRlD}}d71l7QR0O(<3qv*V~lG= zarBG4hQ1qj<}Ei~cvQ#qr424zG2|gy(6y%I6lydF|JRo;(jV%t!uM@Ned%7`(Wx5~ zgv!_@&%Vld+Tc%UAje4vGh?z6iwX4vlD%tvNiGby(_rWI_B4{z&)o(3`FFyddUtk7 zPXSJK3B#TK$6OZSVfRI-HgQx)=!08jsJRCrZsmI%&0Mcx<{pGY$8&swI&QJ#8RIB6 z(E~Zs`StzLWXud-(qGPJYujuFZ1RLTnZ zg(tk#v|ip4ibC%B92ZA-`I_$qwV;CDvJNV(1xbt-e(2WO+ycIXapLCo=)tl*Y8Z$+ zU%+ofUZnI?qIe|ve+&N!uM0cU>DyEzXwp$$1Zcw|*BgVlv7vvx3tWTVsp;Yf+#6RJ zLb4<=Al~%+Lo!ibmmg`?4!8uh7b6T*F9UUAtm~%0{hkX%ojh6Ui6?qI+(?vXLd?&r zmA1MT84RlCZ5zS@S_W7Wm!LAJg)kCyi^i1FEyn2@GqC3Y*LC!oAOEWNM_|wlikr7R#|%G4m%8myn#tK=v1xgl5U#}VASzC5kw-@m&~xjrG9h`y7g0`r9~?j828_nKUYl(kLWmqNg9sueVxlpVvA|}y zch9U5pCRo-uUCiS%-Tg20@zsBn^WRg^Fe!z9fC!qhluJ$0$7el;<-#8SolS|1BoT& z#8u|Y^9PVFGZ%HcE=N#Og{QOEu zFFd*?*lk(jTvl1ZWa@vv-0Sjacz+to8F#~>VqFC>qWC}lrAMB%k5BFPPsR98K03k* z-@9niu0Q9fuklVC_b3cq_rB11Y4#fDtEc901ZZK~30Br(oF4SnFCo|GRv_#P#KQ^DTI`$xL;RVbtGLTL$s@ z(;V#qGBoerFd~N)jUWpM{I*j|BF4+~Gy|;EMf5^2P<^*UMj{5w^wck?DnemEjrMd1 zNJMuTx(r1$ZA^790r6qAIZL7odsFIOKaMu(;k`8T8e626Ar?Yx;KS=%I@-tUB_ngp zd5r1SVaW>r5(;3SL_XmY3j${^p-wqq)^cDrZPt)$ggw{}IEs@9>cH~>X)pE!|A+>b zl_Iaxkju@N=W&GsV=r@XSbUdOZUSs5HuiKrh5&3V0At98b=HGJs*x+NwyFVW1qX#~ JZwRDt{sA0*&IbSh diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-3.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-3.png index 3affb57896b810533f384496e7c9120da74913c4..68ea3825a175ca7fe31e2bcecccad97dbf886653 100644 GIT binary patch literal 3161 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 literal 6411 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 K09LMM8}={s3$Zi+ diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-1.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-1.png index e43b91a99cef3d893a5e8d590dfdecaf59114e85..e8292f96cacca8cabf2eb37a6ed94e54abaa38a8 100644 GIT binary patch literal 12604 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 literal 13629 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 diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-2.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-2.png index 4e16ca6fe2120c15cc365e826231b79b3c75bb6c..44c3393d3a9c7094952919c7e88b8f1b54d77b5c 100644 GIT binary patch literal 15770 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 literal 17277 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 SZ{UBqbTm|e#n|}Pwu*1U(M|xx?Nvw>fs)< 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 diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Vector-0.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Vector-0.png index 4defc15fb218362be404b4d7e54dece2b524a9ab..8f61177e00f9f356544cbe07084e9abf960c21d4 100644 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^Q9zu+!2~2bcWvkZQWrg4978H@y}jee)u152dZDN9 z$xNG&^iO_UvsZRY%z5;8t;&}lPCWrTf2sMGu~-y5IMB$<&L^W?h}nJLnY5*a#;13fye)`;nIPXCxv~su8r)bA zLox5eR*)4CZx*}^ZJQgrU!KgD8Orx3C9^_?dt`xw~yWGo6E9B5Qla!=pO6Ju>2{(8&J zGQYPUHUI^gL9%w+wPihdXI+IVWM=Q%|JLjCfqR8#Bi}-m6g-H~U->yM^XFYz>x19n zIzi@wjVR#gE1&Zq8)g@?dkrctt*&|g?A4{W)|A0@)aag!|FRXL8{|A2^An|F{{IcW R)Byd+;OXk;vd$@?2>{!GYrp^i diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Vector-1.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Vector-1.png index 84997a7a0415392a060e186ef1655e4c5a0e6e3a..d2bbfe5a7ba213262dcb0d582c4ca12e2d633f1d 100644 GIT binary patch literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^cR-kf2}n+{h`7eUz+~*{;uunK>+M~~b&N!%uP&Z_bU$vnc1BRrZ#JN)fGSv0Kvm@2-HV0i z({iHcug=Gio7VjPMa63=T_E0;57*Km6xgI8s0ydR&gfC`EkE}0zn~aS#;cCF)f)qSZi+?OOxhr{`xqfqci323;plVX`KHt4~Qg0VQ=Nwvk&UW$U zu>QPhD~%jK0T$)%%m2k!f3Kdm?y{(f=EmA)S v`Sj0&7m{-~xXhT+aY+asPC!?;oU@ahEb%}3UOX`QFfe$!`njxgN@xNAQ9k9N literal 616 zcmeAS@N?(olHy`uVBq!ia0vp^cR-kf2}n+{h`7eUz@+c#;uunK>+N0db%zur8Ujsq zCdh6uD?7kfn!_&P93A)EXLhzu%}+^_y>|D1GCEgAGP!Ura+#vw1*Lw7)y4Qv>)=kA zEOgwwLnyFGLr}Ft$fZ-`A^*ce=lia%KKh7%{bjycQ!Ms5P611RDNgoW|B^+lcOq)P zcYAg|mIi8Ygc({eYn!^&Q6{~$m;YgCL$(^|0+v9dnH%oPKIhzDY@`V{0PMJw?BBK* zJN#y1yOJp0v!r<&%+SyeT#$t@6S3ZI}_#vun9OdLVXDL4?HlyVPY^r zwBB8Pr}AV_C_p@m>}t4E7PUyXzI|um|6}gn#mrFWL8qfAy;Q^IToeFE&J6}`|=USvjiS;ye&L8Xs?v+`%7KmKt_tWg2~$T?#mg`M?y!;OXk;vd$@?2>^w(+*$wt diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Vector-2.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Vector-2.png index f6405ed4c7febecbab28c277648a910223a13306..a615e574f48568dc2987e8613dc3d5afae424e33 100644 GIT binary patch literal 664 zcmeAS@N?(olHy`uVBq!ia0vp^cR-kf2}n+{h`7eUz!dN4;uunK>+RjMxrY@P8ZHJI z3K^$roOelE)IR4C^R!kC`?~j8sznckJzQ5Td?G*N)OtmSDGFXLoQqr_R7?KHN0m~a zqjrYGYt7hk)ZHjrb7O6@hM;PPP+*gWueQo#m*lx-DNobrDOT zk{6gdZO)yJ9cG>B@ zd+}t`UHx<1`-)$gNi;t*-@A6ojeQ{d!A60cY~B)N|InkYgKyJRq1)zQ_kpw`+X&=A zd}bzO{>S(CU8|}awp!Xq&IQ>G*9r6>x&g>R0}3IySNk_T{(sT4ZsJt9eefVeQMah2 zzNFAyeY#}4RcjmnbJp~g5Btt7G5)bFDCsvFEYLvq-YF!P5?^T|E#ddZ9N+<#S z`cS3pPhPs&YH5?^Ft42Z$X;!k9I(mpfESvVf`2n>{M9`DG4X;PFvT%=y85}Sb4q9e E0Ml>&`v3p{ literal 665 zcmeAS@N?(olHy`uVBq!ia0vp^cR-kf2}n+{h`7eUz?9(W;uunK>+Rjsy@wS<94?;h z*c)BUe#MP_%QLP?rF$46k35`Qye&*gdYv4%wsC*@ujYk+qM2Mc7r9JP@Pbkm;#${} zm;biv3OAQF|LLVRS?IWVhfrXXhM;PPkV~h=!={4A-?2}%C9a`H`0V#4Rkz8002#fYXi9(?s;GsAZzN>NL0}NCqMT^rw__8o}JA%(H*>F!8f<`*Cp}a_qKPK)i(U~Ra5QD z$7(b*E*z)msF>7N<^Rap_T%vDE&EZ_16_2;^S1Qdm_56q?=4M*#3LfiA9^3^y+2p? t{S&LV3(#Yu;8TTKcY`NdusByUPQM}dUe55K7cj{&c)I$ztaD0e0sx`s0*n9v diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Vector-3.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Vector-3.png index 87c50c37e142ffc747996e554bc62fb19ecb93b2..f8d23fb2db1125aaad1e7ad1b650e0b323906bd9 100644 GIT binary patch literal 1410 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKNXE>OEA|(?u#Tgh_Jw06~)y?rtFumXd_ zK>42y(rC%mf*3}*T&JS{`xC#ym0c2x!zZifvF2blzPfCQM$!X4q9 z)3dyK*;Mb+pu{6fZSv0A*n7yF%^4^27We*M+StK&XaWb-SBgOEA|(?u#Tgh_<2+p)Ln>~)y>l`5u!4xg z#U-EihbJ?iKgO1C>OUcmAyk%UMsZ!Bu=sTC2?6)#|6!VOs9%$Th1+2R!$Bqi9UuW_ zvv5Zo4wJOEvb`QDbGLoY>9X@Sk8}3yS={?)wn1Ung7`-=tN?C<&qf61skly0|YTlANx--+$47D7xMVnAnt zTnltEm>rV8>;2J-Au_y|t!=g+3*Tn``-yfcZqHRm&Tx3J&*(-XV_yr*2-FZjGas*H zQz{oYz|s7T%U8%TgY0EwHbxW@ElIROWGf!1&DN~g5hG*!#|;=Jcs)ykByx&^h3Ee* zGn?A2q1M0zp^*qR8XTb{STkx0o+Mn*{PvPRFq_VZiwN3`Bf%d~$}+!uUU7ca_ec9w z{C}Kjzy3`%dEL7WhnZwJ8If}`n7zvUZuMPF`@OTGcbJ~b$hN-?%|y_m11&a?GbuPu zn{P_hm1*_0oovr6jk*gfeo&Qd=$K}Hckxa2<$m|Mi#>(c#fA;lMJ(m9}XZ+?ytgEdk~h|tdViJS4h&g6%ees2U8xD1}IelF{r5}E)Y CvyI~b diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-fixed_wall-Vector.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-fixed_wall-Vector.png index fcb8b23fd0c0ccaca98aa4c6c6040c2f1c87339f..0aa5dff5ad6126803962e78ad3463f9347b56f9b 100644 GIT binary patch delta 37 rcmebEouI2w-^R$Fkdz=X^%x6-*=ol7#{0e%G5~?6tDnm{r-UW||6|J diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-moveable_wall-Vector.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-moveable_wall-Vector.png index 29635546f4ba8201baddb654afcd0858db329678..3220f5d4c4685edb3f04f74a03286533d1ee3f7b 100644 GIT binary patch delta 38 scmebEouH#=^LIWYe?n4%#MEOf45rSE_x@M0?P34|Pgg&ebxsLQ0Qap7djJ3c delta 38 scmebEouH%m=l?`T{)D6iiK)j}7?SmwSSCE4-^>66p00i_>zopr00)Q+%m4rY diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-tagger-Block2D.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-tagger-Block2D.png index 13f54c88ddfb1b9470756a6b1fd68ed24c9c7a13..3fe75e180fad1754366b239ff9b055829590d275 100644 GIT binary patch delta 115 zcmX@jIDv73N=~?^i(^Q|t>gp=*298lQW9o(iU#-e&XW_Hhs93;|i##d#nC zv*e3XKlWd(*!Hryw=(Iw?~?2|{3bqU=5X-Pm5Wn;#2&KIkBf;ag^wb{aSBXwhA5(( zUX6Kco@a-4RAMJUdVBF(7=(Mw^4Q=(oI deauwxTD%D|XWAbJ|)6;D?`mvv4FO#uA(6kz}W literal 1650 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 delta 1267 zcmXw3ZB&wH7{=wclb(aV)l6sPCY!pmN(r&aI%5)NtRo|8mO{{aEHpRZf^KqG8b@e8yFbm5KZV1jNVS<$6jvlY>`59{S11%PGJNv*8vt)+@E zFXB=}fb;_B4T1$z7?lf1*`nz=HnM33hs!!xp^H;5m`M~OCvlfItE?FRp>}oEW2YQ{ zGM&G2-ib8ZVDzX}02OUW}-G5o6-hZs7 zfSEi-voF}jk67WFd`ms2Qkr5;JyB#c$!_(HHS(+Ylg$Zinw--UoeJ}+71`lexX0R2 z`$}~ZbqBW4(S4h7?;&4xB94|mX`i%Z_Ae&+ zV<*OT--FJ&rMEPA4P5rFHTE{6d>xJgd~(ux)8iK#a4q{9c;zM9;(|B7E}soTLsZyr z61tn@)*D9$*H7j1QLls$)S57vyf!{DF|ntrZHTIkxfA<$XCxW3>iN|g@PHJhgGEJh1V+H(lq&ma975a-4#`!>I@ z-q?9&Uh4wWtgB*5T1}9rjYCR?DV0t{*@eMi0UJEcK8mpi=5-Vn{BRgt8jek@^D>6O5xzx!diz# zMN}too=#?=lNK5IswBbP3jcK(<$4aaczC_JoS70#2sPwbB)!pEF1nHnk!zwqizNxhpxpi5~v+~hEH4JzI|o$`*B&cw3_-(6+|+? zqA8tkaAnavX$wd=k9bN&smqTBlJb-?IR{~bh=+?GQMC1;d;(0XfTXIK9W`LbV>S44E7~SlymLYE2nSA3U?@$t|NC?Q E19HWBCjbBd diff --git a/docs/games/Sokoban_-_2/img/Sokoban_-_2-level-Block2D-1.png b/docs/games/Sokoban_-_2/img/Sokoban_-_2-level-Block2D-1.png index fef97ca21b1727dc03e8b91a2b8dc48a12a57328..6abfd74ba5086b15bbf1f9368c8edc66a23b18a4 100644 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0y~yU{nCICvY$UN%a^-F(B3N>EaktaqI0tMqVKA(1P#& hx%})RK<0peKN8R8GccxEd|m~z-qY33Wt~$(698PL6c_*i delta 1135 zcmX|AX;70_6b;LyLnojVD?wwz1ZNOrNI*&W*wv(EYosWSPFcdDqEv$)wlR?s;Ok%{ zY+=z@gs=^ysDYxEfgvFfS|W?A#g?_2g%C#&2?#hyU+A>|-o5wSbI+Z3kID?ODstjk zhKA6NoxU;oW+vw96nQs2-dSJJA$b@g==*8B)!gfTaLt9BI^zLNb@FRLZs`r<{8X<6 zDl?_Ut-r+$)~GJ2HlAdoIO$jM^`y?^fN8C&E#3w(tH7+m*C_-eteK|V>dM5UZ{Cci z;7lO|LKxYCX?Pz!0P{Ei{S-arSI@?SvMQcjHOxHY0>S2KSd7F|b zFnc68oJ4G{Zt}dnK<^3PG{^}Cx}}ZC^_v8)t;apN&*CkvZI-eiv`iFB8)#^9H_=v& zFgTx$3HUCnQ5`%Jp22YmG2tJ``_@j#_(7RM&x4d>q*uKK;yzqntsr|Vf<)Y{t4TEt zncfVYF)8WVn`w^UvWw!Vxuh@t?TWVH9Eq6@ptc8&&y2o5(K^r z#s8-iU(J5(FK7I@9mlr$7x+?LCv5Mi@czj2{MA1oMY(6NC~W6z=bI%Blg8B#UuvdZK`k9w*b18rXO+(R?f77U7d8_# zXOMAB0#nydM+R2npexWK(fszFRbrnoZ3vM2I1G$&A(#OSHLTomQSy8`5UEA4Jc@$g z<1p}?mq_Ob!8PD{=%^?vwBWu1G&W*%3?UBs1t>1X?r?Mif2yb=YQ0v)0hg~kB4R!2 e6PDbya1?YhJNE}go)i;+5>yDCL6aV5X8!|9RV7aV diff --git a/docs/games/Sokoban_-_2/img/Sokoban_-_2-level-Block2D-3.png b/docs/games/Sokoban_-_2/img/Sokoban_-_2-level-Block2D-3.png index da519cf4c2fbf16c6e0aaf685d002def00abec6f..78ba6ee1b2626595ead907dfbb54d4b8c50d8054 100644 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^6M%RH2NRHN;QgQvq+&c>978H@y*{9m8v e;Q(S%4nAbam@_b5-e)}(WR|C^pUXO@geCxU7Zj2J delta 1042 zcmbQrxQt_hay|1~PZ!6Kid%2zCI&Sd2)JoJ?yb@|e`I0RvLD9-+m%{2aQ=R~FaJ;A z);C)e`6qwKS=K2~ls+vra$2jE->WlUJl39RUtarl!Oq_S$CvQ6uqx%0Zkuf_SjzL- zAwuMk+4*8;^+kQTvK-uwH_l1gUF}?v9LIj>3#auP<*9Q!tZZM^JIt_1{8IJ2RKaJa zfm`0c*A6pu64%&yTxm4$Jrv;>zLGhysijanVl|&)%LL)+e(UBj-(uG{{9?1_JBPYK zT(kQm0kIB))ser-Pnk@eQ4yOXzvsx5mdLdx{~v9w65w9{?At+aAI}+A?_SDX<>j+S z3Zz*zG3?lRIe%5PxaGI%A^g3MXDksCUVl%-X@*f^nDU&cHlX5NeJYAR(?Et>Rsp%U z!VI%s)qJU{=TCS6G|{X0$^+F&+$|4Jm)15{bhb?RZZrS%XU;2SpEu0)Ru4aKSg$Et z*=e7{7#V-)gAhBvOKe4__Ns<8;)%!NlCr&yUO!>A_jzT#d3EP(8^)QoKv5;btmlIQp|_t_{E&)FSBZPyerEe)))d{AhpK*YAERU~st<6VI49Vq|6FGM z{&xF055CqGd= zdQDss-=RHkKTKv>fB0MD27#8!+e`IC<9_dNGN=WLZE!%v(p53W_hC*VE+=Ajglg>wSDn7Zi^zzi{ z5?Aw&c=OouOPetr$=~y1pMs7+;=MgbR@5oSC3zj%Q`s5#*9{cQm7j$c|LU#i)a3m9 zOx5kH^hcp!AvLdlnG}%FWI0AI$F}J+CT(C?Eg>}Fq3SXfoikp0icfq1suFvXw<#LP z;#91E(x#p7p?`7q{f_ApRdQ&?!3n;L;*UV9E6azDSRqVrV!;T^MW*o^kLIB`hI?r{k(l~CpC z6Ef~+c>2mALIIeLWUn=D&;Ul~uQkkxiX4Z%OQJ#9>9F^g81_R)I2T{HUeBC(s>QJA zb3FT@6wc(Yj*IwOGKG$D?edc45LW5geITl|BWNFk(9L6F{&TzcF>o_5FnGH9xvX~)J;=xl*V3$ATd&igopL%u#Q;bV@J-MzZbqniVN{P;0D!sg`R9iQ`Ve;!bF_xZh_Ug+L?v(n*03T2Ov88{N7t2`t6c*t zIKTCOGx@srzkK@6zs&CONy&Sq&*pD?k-q2knd;TgXJ&rAC(GLHUeSUdt$)SZ#TDTA Ut?BV?U?O1fboFyt=akR{00O%c(*OVf diff --git a/docs/games/Spiders/img/Spiders-level-Block2D-3.png b/docs/games/Spiders/img/Spiders-level-Block2D-3.png index bb57cdf9a25103847b7939bbdd87b933ba2b786c..49f4e9f67682a9051c479f20e550fa1583c79500 100644 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^A3&Ic2}o`+N0dyk-Li*TCS7 zc4Du2cO708vPy{QndE%qMf*LLhWnR1(%E{A$^YY1F@+2P6Ames-UW^qAWX+*D6@$T z%4FdMG7no`+Z>m1+pK)@;d55<$DAHdWM+x=(q6jraYRN3_pZM?8Mt{F9k2=Db_f1%($6D$OndUCn-e^F+B@zuv^3*Hjdf0(+!+LFN4g z&!=%nai3-Ryk|Gi;8{y5OS}8=X1InF96*R3NK|yxbil+LBkbK5c^+rs}9cvdSdy^ z=XY6wn$^#4o+t+NaRp%?I|_q+%rOh(O2gr6{+wbwensp&~d((Y|3Ro0r>E4uwxTD%D|XWAbJ|)6;D?`mvv4FO#uA(6kz}W literal 1108 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TZ*VXH$q#xN+zbpX(w;7kAr-gY-VMyV6(!OZ zxWbB4yZF_XRjuTTgvI^#F<ThaZJtGJh`f7Rorx-W1h^JyX0~3*IhstsD6I4M0)tDI+(@rscy7cqJyAf5@!6FXQ6V0-%e%#$o`ye% zawOeDSCqmyFWo{{EQN7)0y$Sh=WC5)Z@1qXUW zh(gK={_uji}IWW$+ySZ9;N-xh- zkpjxN*5q62l~`T3Il1Xo>BGhP3c#2M_$fK{|Jl!Xp4J|_sNb~_o|b~97WcPuIkn0a z@2Y47I&(w0U+*d)eIb(oU8>&uO6{D_BI)OH(cqXqV4THw?(xw@;1oJ9&~n4t{qNL2 z*egds5+EpTf*hg%j42ofh06i`PqiVhv`T!Yx`I>n`4t5*pKaQIeMZvv{$k$R)B2zL zzS&)T*B{XMXJK61LnEGl&-TsgKH4qyUij@l4$%|xuWG$}UrpXwQE0Mgum6_c${`B% zE4oEZSFQfNAsI=C|NG??>+}vUyVwCY&Mwk#@vdE*_houB;D)_QldBAwyzXg#Z^Rb+ z^Ldw{bd*J_WEcU`}ZMOp-aKLQnND_eWw=kq^mK4a^=qXz%+o7Cn5eu_#KiS gAZg+d;~(bIhf^Z&9h@x*EG-y3UHx3vIVCg!01&h4c>n+a diff --git a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-1.png b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-1.png index 3ff00298885d1818bd0d3d34735b5c2527338b11..54890ef95d46de3f83dab80c9c17c7f48fd7a024 100644 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TZ*VXH$q#xN+(7EKr;B4q#jUpo4H<#FLkqt8 h=kmxe05XR>uwxTD%D|XWAbJ|)6;D?`mvv4FO#uA(6kz}W literal 1108 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_TZ*VXH$q#xN+zbpX(w;7kAr-gY-VMyV6(!OZ zxWbB4yZF_XRjuTTgvI^#F<ThaZJtGJh`f7Rorx-W1h^JyX0~3*IhstsD6I4M0)tDI+(@rscy7cqJyAf5@!6FXQ6V0-%e%#$o`ye% zawOeDSCqmyFWo{{EQN7)0y$Sh=WC5)Z@1qXUW zh(gK={_uji}IWW$+ySZ9;N-xh- zkpjxN*5q62l~`T3Il1Xo>BGhP3c#2M_$fK{|Jl!Xp4J|_sNb~_o|b~97WcPuIkn0a z@2Y47I&(w0U+*d)eIb(oU8>&uO6{D_BI)OH(cqXqV4THw?(xw@;1oJ9&~n4t{qNL2 z*egds5+EpTf*hg%j42ofh06i`PqiVhv`T!Yx`I>n`4t5*pKaQIeMZvv{$k$R)B2zL zzS&)T*B{XMXJK61LnEGl&-TsgKH4qyUij@l4$%|xuWG$}UrpXwQE0Mgum6_c${`B% zE4oEZSFQfNAsI=C|NG??>+}vUyVwCY&Mwk#@vdE*_houB;D)_QldBAwyzXg#Z^Rb+ z^Ldw{bd*J_WEcU`}ZMOp-aKLQnND_eWw=kq^mK4a^=qXz%+o7Cn5eu_#KiS gAZg+d;~(bIhf^Z&9h@x*EG-y3UHx3vIVCg!01&h4c>n+a diff --git a/docs/games/Zen_Puzzle/img/Zen_Puzzle-level-Block2D-1.png b/docs/games/Zen_Puzzle/img/Zen_Puzzle-level-Block2D-1.png index d1ec79f173defaca77d06ce3155a889473b263f6..72c16bc324e98146ec5ecf2e65ee8b80283f33ae 100644 GIT binary patch delta 80 zcmeBXJ;*dcS)7r>)5S5Q;?~=PhKvjh42Kqc_0Q$yUohE`$#`-AlL|VXSimJ#VRF`& VfpM<-68}v^Y?Y+q|DfNkH`z%l7rmIN*@5WUjulnt^~s=JV4XoIvSYn9|#>JrUt}(|!Nd zUh7h^p1s>nbbx)9lhpD3;2m+p>xEh$?Ql2==q!f>sKah|a>z#pov-XUo_F^5zn%Jz zb~N6#uQS^BLu32${@Yy~^K-*Hy_Y&9B%itdW;@WA5p7_nuuKEHl%a7c*rg5$5SI!> zKwLWQO{wYL>?h_iD${Q~H??Fv&c9}>n!$giO^>;?)*k^|?Irc7cEhUg{3Y>69)Bjr zr5jGv3a0Ov|FFJ4xKrEGAwj_agasr(7&Z8zUL%)k*e-XWw9kKbg>ntZ2v1i(mvv4F FO#s|RyQBaB diff --git a/docs/games/Zen_Puzzle/img/Zen_Puzzle-level-Block2D-3.png b/docs/games/Zen_Puzzle/img/Zen_Puzzle-level-Block2D-3.png index de58597253f1f79014a3097fa0d517d3fdda422d..cf8d2d9f1ce16cd8a6487bf45fa488cb4063d821 100644 GIT binary patch delta 77 zcmcc5ww7svvIN5yPZ!6Kid%0FHZlOg;RQc~?>}G(Wt=R?Y(80mSpykQEMOJ;z*A$& Uz}PV9v@}S$r>mdKI;Vst02{U#$p8QV literal 863 zcmeAS@N?(olHy`uVBq!ia0y~yU{nBN4h|-uNP*nG9tH+xHBT4EkcwMx?>Oe&G2meh zsC*!8nSN?v)v_Ock?9F6Q+-dS{JEFKB@$)u@7LQS3E4oMlmPy1xwp6FR-RKl@~bEP z`{vj0-~Zmf@c9h?wLfD%79CevxqdtU_j%0?jSUxrt;J8Pzmj3$Vd?pI%QDt3@VP>Q zLc*N2bA_J@m+~>OF&*1_>!sHG6~zJu0tQN1=|!g%f$}cjPqySs2?B+VnVh_^-Bu#Y zu;~wD_S(03+_-%CYTMpIevl9T9Qx-_JTKuZ%NHB%o!{7RrO&wkdS&27`wMee zd05uG+q&w=naBeU2TsMU_BsO=dPBUB<+Vrb^(TPlUrS(q@1dG@4rJj3-z)zde#-?% z&j0x4mVAa?y>>$U|Ju&FA5-6*|JxW|_g$)#FK|yc2h+EnUsit}{{egKSN8LgpEsN} zfL^;38?S!qxSSIsGo!M5ZRym0+ZJFbxGnoN>rN4e1c$`MTBC=v-B@_Mq`sQ%Eq}s1 z`^kr^KUNe&L%{tv^IOF){w|09DVx0Ltp+*hf%rG}S)W-}t1oySd2*}$1-rw4;{1D0 zef!2(EM_3E!Rq=dA>(wQZQ9jqwG6>Rn}`>B9?>oTNAWlF*~n(zJ<3yOSTX}`bTA79 zI-}Yrwf5NN?D_>i?;Kto6#44)+rxXok^AM!xuc&pwg&)%eaHHJe$yd7Ja+eM>7tr9 ziXy;BExHmO4h@c!RqIdcwgXd&;9Yg$eVHymO%j(?obP{2SaFo&6Z;z3xBOe$1DXY| kDK_8R!4C2-+2DcQ{pph*Y*=YHB^G3cr>mdKI;Vst01?|!H2?qr diff --git a/docs/games/img/GriddlyRTS-taster.png b/docs/games/img/GriddlyRTS-taster.png index 4acb8f75642a147cd2e8f7112598efb7e52835ea..cf1a023c2ccd64a34bf3570d46bef502dfcb2834 100644 GIT binary patch literal 97731 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 N^_$nFthGP>{{V*5o?rj~ literal 115589 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 diff --git a/docs/games/img/Robot_Tag_12v12-taster.png b/docs/games/img/Robot_Tag_12v12-taster.png index 73d55deda61db384f0142c068e28e547f24ad826..fa3426c08cab8803928c76ed3a737b67cf41db45 100644 GIT binary patch literal 40453 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 literal 38142 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 SZ{UBqbTm+oE!QW2k&mM$fvT9&HI*I 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 SZ{UBqbTm|e#n|}Pwu*1U(M|xx?Nvw>fs)< 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 diff --git a/docs/games/index.rst b/docs/games/index.rst index ef8f4875d..da26d16ef 100644 --- a/docs/games/index.rst +++ b/docs/games/index.rst @@ -273,25 +273,25 @@ Multi-Agent .. toctree:: :hidden: - Robot_Tag_8v8/index Robot_Tag_12v12/index + Robot_Tag_8v8/index Foragers/index Robot_Tag_4v4/index .. list-table:: :class: game-gallery - * - **Robot Tag 8v8** + * - **Robot Tag 12v12** - .. image:: img/Robot_Tag_8v8-taster.png - :target: Robot_Tag_8v8/index.html + .. image:: img/Robot_Tag_12v12-taster.png + :target: Robot_Tag_12v12/index.html :width: 200 Robots start randomly as "tagged" or not, robots can "tag" other robots. Any robot that is "tagged" 3 times dies. - - **Robot Tag 12v12** + - **Robot Tag 8v8** - .. image:: img/Robot_Tag_12v12-taster.png - :target: Robot_Tag_12v12/index.html + .. image:: img/Robot_Tag_8v8-taster.png + :target: Robot_Tag_8v8/index.html :width: 200 Robots start randomly as "tagged" or not, robots can "tag" other robots. Any robot that is "tagged" 3 times dies. diff --git a/docs/rllib/multi-agent/index.rst b/docs/rllib/multi-agent/index.rst index 0d1b61a7a..db7f4776f 100644 --- a/docs/rllib/multi-agent/index.rst +++ b/docs/rllib/multi-agent/index.rst @@ -10,7 +10,7 @@ To register the multi-agent Griddly environment for usage with RLLib, the enviro .. code-block:: python - # Create the gridnet environment and wrap it in a multi-agent wrapper for self-play + # Create the environment and wrap it in a multi-agent wrapper for self-play def _create_env(env_config): env = RLlibEnv(env_config) return RLlibMultiAgentWrapper(env, env_config) diff --git a/python/examples/rllib/rllib_rts.py b/python/examples/rllib/rllib_rts.py index c8455ef3e..fe96e0a3b 100644 --- a/python/examples/rllib/rllib_rts.py +++ b/python/examples/rllib/rllib_rts.py @@ -7,7 +7,7 @@ from ray.tune.registry import register_env from griddly import gd -from griddly.util.rllib.callbacks import ActionTrackerCallback +from griddly.util.rllib.callbacks import ActionTrackerCallback, MultiCallback, VideoCallback from griddly.util.rllib.environment.core import RLlibMultiAgentWrapper, RLlibEnv from griddly.util.rllib.torch.agents.impala_cnn import ImpalaCNNAgent from griddly.util.rllib.torch.conditional_actions.conditional_action_policy_trainer import \ @@ -35,10 +35,13 @@ def _create_env(env_config): config = { 'framework': 'torch', - 'num_workers': 8, - 'num_envs_per_worker': 5, + 'num_workers': 3, + 'num_envs_per_worker': 2, - 'callbacks': ActionTrackerCallback, + 'callbacks': MultiCallback([ + ActionTrackerCallback, + VideoCallback + ]), 'model': { 'custom_model': 'ImpalaCNN', From a754a940563478693f67c30a02d70a1ec6b55a2f Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 10 May 2021 16:12:59 +0100 Subject: [PATCH 24/29] adding videos to rllib examples --- python/examples/rllib/rllib_multi_agent.py | 6 +++--- python/examples/rllib/rllib_single_agent.py | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/python/examples/rllib/rllib_multi_agent.py b/python/examples/rllib/rllib_multi_agent.py index 9b0a2b841..031da44ce 100644 --- a/python/examples/rllib/rllib_multi_agent.py +++ b/python/examples/rllib/rllib_multi_agent.py @@ -2,9 +2,9 @@ import sys import ray +from griddly.util.rllib.callbacks import VideoCallback from ray import tune from ray.rllib.agents.impala import ImpalaTrainer -from ray.rllib.agents.ppo import PPOTrainer from ray.rllib.models import ModelCatalog from ray.tune.registry import register_env @@ -34,9 +34,9 @@ def _create_env(env_config): config = { 'framework': 'torch', 'num_workers': 3, - 'num_envs_per_worker': 2, + 'num_envs_per_worker': 1, - 'num_gpus': 1, + 'callbacks': VideoCallback, 'model': { 'custom_model': 'SimpleConv', diff --git a/python/examples/rllib/rllib_single_agent.py b/python/examples/rllib/rllib_single_agent.py index 4f6b47a1d..aa80a90df 100644 --- a/python/examples/rllib/rllib_single_agent.py +++ b/python/examples/rllib/rllib_single_agent.py @@ -2,6 +2,7 @@ import sys import ray +from griddly.util.rllib.callbacks import VideoCallback from ray import tune from ray.rllib.agents.impala import ImpalaTrainer from ray.rllib.models import ModelCatalog @@ -29,12 +30,15 @@ 'num_workers': 8, 'num_envs_per_worker': 4, + 'callbacks': VideoCallback, + 'model': { 'custom_model': 'GAP', 'custom_model_config': {} }, 'env': env_name, 'env_config': { + 'record_video_config': { 'frequency': 100000, 'directory': 'videos' From d60e7ffdcbb8b10201ebda259fbc8a1dc350116d Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 10 May 2021 19:07:11 +0100 Subject: [PATCH 25/29] updating docs --- .../img/GriddlyRTS-tile-harvester-Block2D.png | Bin 99 -> 0 bytes .../img/GriddlyRTS-tile-harvester-Isometric.png | Bin 1232 -> 0 bytes .../img/GriddlyRTS-tile-harvester-Sprite2D.png | Bin 324 -> 0 bytes .../img/GriddlyRTS-tile-harvester-Vector.png | Bin 78 -> 0 bytes .../img/GriddlyRTS-tile-puncher-Block2D.png | Bin 101 -> 0 bytes .../img/GriddlyRTS-tile-puncher-Isometric.png | Bin 1184 -> 0 bytes .../img/GriddlyRTS-tile-puncher-Sprite2D.png | Bin 272 -> 0 bytes .../img/GriddlyRTS-tile-puncher-Vector.png | Bin 78 -> 0 bytes .../img/GriddlyRTS-tile-pusher-Block2D.png | Bin 91 -> 0 bytes .../img/GriddlyRTS-tile-pusher-Isometric.png | Bin 1173 -> 0 bytes .../img/GriddlyRTS-tile-pusher-Sprite2D.png | Bin 235 -> 0 bytes .../img/GriddlyRTS-tile-pusher-Vector.png | Bin 78 -> 0 bytes 12 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-harvester-Block2D.png delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-harvester-Isometric.png delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-harvester-Sprite2D.png delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-harvester-Vector.png delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-puncher-Block2D.png delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-puncher-Isometric.png delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-puncher-Sprite2D.png delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-puncher-Vector.png delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Block2D.png delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Isometric.png delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Sprite2D.png delete mode 100644 docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Vector.png diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-harvester-Block2D.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-harvester-Block2D.png deleted file mode 100644 index defb66f97e2e8b6b3784e215e680ab5a826c3806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9TAnVBAr-fh6C_xj`3;h|&YGC1 wtmdKI;Vst0BkoKwg3PC diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-harvester-Isometric.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-harvester-Isometric.png deleted file mode 100644 index 2dd05489765d3de6c213a28d34e2c45efa23c098..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1232 zcmV;>1TXuEP)pZ) z=RY$5+t|i7wy}+E{4aojTaE%W4kI7~w*GuVeNz=x+qa*5;Y1X#uU?qT!oG zudJXP=i^J>5@nP}o&qJ5#Q1nxh$n=2qe2M)pzde~fNB{A3;{FIOodhqYR;MSvLN-u zvMNz&nU=jW07O76IVICGqb)?{lonpmsZrkseE*|Qs^9a=xj^Qmdg7FN>R%^U(2InU z1F3<&u0642{QmUJRB0;b<#^;R+jTromPv=ad&MoDojaR%^BXjI-Oa1HL-K-LG1mHy zw{{GuKmRnQ7wLX~@A>kt)9#EXIIc@yf9=I1eS5F`aNE+|!T12-$i`D-8hRk(S-i94 z$xPYRpNqPVosV2H3LY!-2Yb4|9DVoV)$xx%{V^I9g%tG4nGY)O{JuQ)dH##g z9tic+kM99OC1y%o^!aknVe9Y>@sEYb;!WN8{_3?`lk<*XyPP$!vgf6hqp6mp4!TD5 z@F_A4y@q-n9ED}MG{Ab(iRALyqd2cb*2q_%jYR~ZSL(EweT*C!!XvJ47rf&7^{jOu z$x5gL0I(wNjTi1R{%(s--n)5HcA@}4MIRA)#ZB=+{{4{gr9_}yserVAOx$wV;mo zPd`enDi%S8#1#PG%HiAl?`7Va9lCaKvVPe#6sV>S+$3} zxzw8C>URCI2@$BKu69!tR}+d9Py+%o42oeI`YNxLV=+-74%neP?Xf^Tbv355g}JU$ zk(PXe#Xu4$&s-V|cMvj(6S`~y85|xt(}=nrRCoFpJGEAKK9%3h`TTNjV+YjpJnCA8 zfq;^t-09Bg+L~YTqO!yQIOGH|f{2ZJ*{lZva`UrGxd$XF0RSQ(B4fZ9b6v-$G?qwa z`v%1bX~ZMUO;2XBdzwrUBAABe*j8PZ;CY@;Jww+L5z;6{;jghP!BZod2#LlMX^!XX ztLIZ1m1S9JX;S2;SsgkyR3lS86;0Y$?Orxx8e^)~DYA(}!>S|<~{qfsc u(Q0IH!$Vt>*_4B=$!w|zTayW$qW=KMOJ@?(zqfe+0000hV?APnSs2F3vFp;QFfVONGt-aI7cnZ?-!{UKB;f7($odtAl*x0N!su zj4=QtsT45Xzj@>YQW%haCrm%w_ktYmQw1}-nscy*fAtRJx?mH`|>IDpa}zTmyHP4H`5KuF|Cs98~zvTIJE-A;?GB z!i2)+J~!5rprFK=CXY6ALXmtLr#S{xa2j=81Niy<18{lKA~B9*1{5ueUm`T{eP9oe WOm>>eorA{!0000}1|2h9*7NdDW(gAL_ bRVED4JdFQBwH_`7Dq!$*^>bP0l+XkKg0vJD diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-puncher-Block2D.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-puncher-Block2D.png deleted file mode 100644 index f1a63a27fecbc28f583056a388ab7de490cf967b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9I-V|$Ar-fh6C`pP1f3+$&+*(Q yn11=Pq=dwb6;BrhHoNgknPyyB5ZK(t$H4IN0kekx0Z(_JJ_b)$KbLh*2~7agX&j#b diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-puncher-Isometric.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-puncher-Isometric.png deleted file mode 100644 index ac016a2212ee51a2eb5a2a154c257317bcd007ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1184 zcmV;R1Yi4!P)B z8+Hx=0MqGkSQRbXp|&}e>KB3o&p#F4%bGsFDq^&}Szgao>(4g|%+Ae!{NAGHu3N1^U{XZ{@QY0BDw(J{i6`74b`$ z1GoYp1-R%()gk}~EV+TN?HF(0+%D?0We=k9WHg?fotvMXo3F2FtXq;L{N-wKEwcxb z!cx;rjUbYvgBN)31b65cKkxokvc?mN!+5J^9P}U>PXd6e@yYww6bS>s-9q)lA9H7h z<>7&TvG-97z!`;TnicRLt3Q3TRLGU-#mR8I+gGVp8Ry<5YJOYEt)CH=7k=Biv0NY) z1AwuF`uekv1V^4`p%cQ!*WWDO`gAF4*c<>x(b90I*ZC5YKs;nj4Wa{pqG|vDtW1$lQMIU= zoSmBo&VTvp9WgWjk_yb`S|S?TRW@@~n{xoagsV0)DQ_w859%gFHHzXzV#B z&s@1cdrW=1r@=hTsNI|O?IjGWh|`a zvl$U+I%M>jIiOCKCrnTT9W~CDE906+G@kUc@=)nB zf!ljh|5o6vgK9=i%}|Og#;R*hU~*GE>8_`zr!@-fQ`fTLMBsKo9=WYus6UpI$8|9> zS-Qb(!ytOS3pB_a^q`)49|E_#Dr*`Lqy)3_nC;XSvxnzZvSBlUut#IV1y<@|An$dYRQO)b=86pCJsdF;`&`PEgv?=m|Lmf?~ac`P3ZnVJ8Wm-kuAmi<^?Pb~&q*vi-(5?S>m^ODVl1y0u~7M<;xd{!B7oI z?5P*|;R+ZS7?_Zq0cW$G?8YjNq5*E$Z}U<(2@%1fAzS|=L~iOue%6!Szs*ZoPj}1|2h9*7NdDW(gAL_ bRVED4JdFQBwH_`7Dq!$*^>bP0l+XkKg0vJD diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Block2D.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Block2D.png deleted file mode 100644 index 980bf50f3049381bfb9c535fc0fc1c14fc57d273..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9N}eu`Ar-fhP0Z$%t1h#caJ&CLqQWW`-(PM*Wj|0(n5y44$rjF6*2UngFq%7%Tt) diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Isometric.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Isometric.png deleted file mode 100644 index 3919050b0187bda85430af79326b6a1d769b0256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1173 zcmV;G1Zw+v z=cUkIf52e;`0eKwYeIk!7zhjF(~fFI8=rRYb_xKd-tG|&QM{d6UMQ_bMDx$h0RZ6j z2h37T3?YCJZ~{K{PS5FCH-e`;02l}hgD(mM!0w>3tCB40t=s_s&0U_aU*|S6CdTPw zKKL{^JZ^8(f!K28t54R7TWZS|S=RN{EL{CEFl0jrbiGNh2?2~DFl3{dc5|=-s$#{& zyft$HqrU;(T1M58IVuyE8#o#Y&^KAx&j+iD3fh$k;N?s07Gva|nq4YQKG-zx7jLk8R2e z_Er@b$|r`zZO_2eHNIOmTo8h4nfvVGy>v`6YicEISQ{9FWRa{#ZJr2YBc=->z}U!p zAD_AK(ZxNF^zM+23e0LKR(VoL%N1_?jMO`_jsSE*z}PVe)2uQuu`USRv*#~ycKPS; zz7}`1mK8jcXo8&=?77WMSK!adnW)zvs41-RiaJqMT~u{ZC#sQ>HHG#11Cuk+59iOe z$~5aaFix`9A8@!f1Xn6}@}^Ym%|^nW;m9%1>3-+y0FWwPOXipIu`tnb@Z?RwRdBd` ztul>nv<4s)qi8ClDXgbIoBYeQk??gN1s6XUa=!}zB{>u{;a03n#xd& z;`R3dAPWY~U7oMA1^{3Marl)RJ6pZkNLbhC!!JBIJaQj_&eDfC$^ihfR#IwZ0{HQR z(Z>%*FjeadN4k9*v0JYyqF~81oZHNJ{Q=V*00_anvq&_osjNSg!W7QOLkx#YMZCPo zEH5&pB4#+8kB2aY{h^emvP8qYvq%W8&orZH^s~(Ygmhb1S=w#2OgW6IrG|b|&xXPbL;$ z^9^Qfp2#m>*oR(HPrR)E`i(7@vN0?N0IDK;`=vMEmsXZ={0?(=u3Ft5*-8Wkr>^Hy z$L?PB)Hj@7i?0NSPMCnr6fPH?@q2~zTF%xZW#Sy7HCd9gF%CcxD`fy+SS}kQcW+4P zD3^(&JJ&_2kdsP$^5I0i_3ouVaq0~KsK=~EBZ@5bc>J1HLkJ^`b**Mbf^lduMH5{o zM5id)*LSqh+WJ+|h^fDVTB&}1O*74!Af00@o4eJ$(mbNtV_I1^#k9Ll_t!KFX74Y% n{b4$)V1Jm7X0Sg@(_Qo*auXAHIMIdV00000NkvXXu0mjf{2wqY diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Sprite2D.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Sprite2D.png deleted file mode 100644 index 6cd64873a2db08d35c4d48c0501a6b2686f3b3d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|n><|{Ln>}1U%6tKpuoDpz`)=` z(Z+?Hb^pF`Pqz?mIePeTvrgcqAN406{Xd~pz}hp*itU8j((`{h(_Wn^Dbq1~5Y(%A z;)sLN0w3m0#f6+k52qh9Y2w^3ZrI$&Suc?2wUAx=2(Krb_#_@ZhdC{20w#|hcon+J zxG+xZX!bboliqH8q4&ZS!x`0a_s^Wkc~@DRnVHFkF+lOPO-~@u^$eb_elF{r5}E*hlUSqx diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Vector.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-pusher-Vector.png deleted file mode 100644 index 40f1980b9b0683d6813528f049be942d1565f878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih}1|2h9*7NdDW(gAL_ bRVED4JdFQBwH_`7Dq!$*^>bP0l+XkKg0vJD From 8f35363f5e66f8f2ece940cc51af89a1d408537d Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 10 May 2021 19:13:16 +0100 Subject: [PATCH 26/29] updating submodules --- python/examples/experiments/conditional-action-trees | 2 +- python/examples/experiments/rts-self-play | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/examples/experiments/conditional-action-trees b/python/examples/experiments/conditional-action-trees index ae95d516f..0fd2cdf11 160000 --- a/python/examples/experiments/conditional-action-trees +++ b/python/examples/experiments/conditional-action-trees @@ -1 +1 @@ -Subproject commit ae95d516fa34e2f64eeda57600d4cff3c668409b +Subproject commit 0fd2cdf11c2785aa469fc0704be2aff7a3807974 diff --git a/python/examples/experiments/rts-self-play b/python/examples/experiments/rts-self-play index f25617863..5f1b1be2e 160000 --- a/python/examples/experiments/rts-self-play +++ b/python/examples/experiments/rts-self-play @@ -1 +1 @@ -Subproject commit f256178635a7d1c518950fc99402969bcd13335f +Subproject commit 5f1b1be2e66496b84cd572505559a62036182c2d From 481f023d16298db06ebd75cf432b6712eab969b1 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 10 May 2021 20:07:52 +0100 Subject: [PATCH 27/29] fixing tests --- .../Griddly/Core/GDY/Objects/ObjectTest.cpp | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/tests/src/Griddly/Core/GDY/Objects/ObjectTest.cpp b/tests/src/Griddly/Core/GDY/Objects/ObjectTest.cpp index 7559757db..41768926d 100644 --- a/tests/src/Griddly/Core/GDY/Objects/ObjectTest.cpp +++ b/tests/src/Griddly/Core/GDY/Objects/ObjectTest.cpp @@ -458,7 +458,7 @@ TEST(ObjectTest, command_set) { ASSERT_EQ(*srcObjectPtr->getVariableValue("test_param"), 5); ASSERT_EQ(*dstObjectPtr->getVariableValue("test_param"), 5); - verifyMocks(mockActionPtr); + verifyMocks(mockActionPtr, mockGridPtr); } TEST(ObjectTest, command_add) { @@ -476,7 +476,7 @@ TEST(ObjectTest, command_add) { ASSERT_EQ(*srcObjectPtr->getVariableValue("test_param"), 25); ASSERT_EQ(*dstObjectPtr->getVariableValue("test_param"), 25); - verifyMocks(mockActionPtr); + verifyMocks(mockActionPtr, mockGridPtr); } TEST(ObjectTest, command_sub) { @@ -494,7 +494,7 @@ TEST(ObjectTest, command_sub) { ASSERT_EQ(*srcObjectPtr->getVariableValue("test_param"), 15); ASSERT_EQ(*dstObjectPtr->getVariableValue("test_param"), 15); - verifyMocks(mockActionPtr); + verifyMocks(mockActionPtr, mockGridPtr); } TEST(ObjectTest, command_incr) { @@ -512,7 +512,7 @@ TEST(ObjectTest, command_incr) { ASSERT_EQ(*srcObjectPtr->getVariableValue("test_param"), 21); ASSERT_EQ(*dstObjectPtr->getVariableValue("test_param"), 21); - verifyMocks(mockActionPtr); + verifyMocks(mockActionPtr, mockGridPtr); } TEST(ObjectTest, command_decr) { @@ -530,7 +530,7 @@ TEST(ObjectTest, command_decr) { ASSERT_EQ(*srcObjectPtr->getVariableValue("test_param"), 19); ASSERT_EQ(*dstObjectPtr->getVariableValue("test_param"), 19); - verifyMocks(mockActionPtr); + verifyMocks(mockActionPtr, mockGridPtr); } TEST(ObjectTest, command_mov_dest) { @@ -1176,7 +1176,7 @@ TEST(ObjectTest, command_eq) { ASSERT_EQ(*srcObjectPtr->getVariableValue("resource"), 1); ASSERT_EQ(*dstObjectPtr->getVariableValue("resource"), 0); - verifyMocks(mockActionPtr); + verifyMocks(mockActionPtr, mockGridPtr); } TEST(ObjectTest, command_eq_qualifiers) { @@ -1210,7 +1210,7 @@ TEST(ObjectTest, command_eq_qualifiers) { ASSERT_EQ(*srcObjectPtr->getVariableValue("resource"), 1); ASSERT_EQ(*dstObjectPtr->getVariableValue("resource"), 0); - verifyMocks(mockActionPtr); + verifyMocks(mockActionPtr, mockGridPtr); } TEST(ObjectTest, command_lt) { @@ -1243,6 +1243,8 @@ TEST(ObjectTest, command_lt) { ASSERT_EQ(*srcObjectPtr->getVariableValue("resource"), 1); ASSERT_EQ(*dstObjectPtr->getVariableValue("resource"), 0); + + verifyMocks(mockActionPtr, mockGridPtr); } TEST(ObjectTest, command_gt) { @@ -1276,7 +1278,7 @@ TEST(ObjectTest, command_gt) { ASSERT_EQ(*srcObjectPtr->getVariableValue("resource"), 2); ASSERT_EQ(*dstObjectPtr->getVariableValue("resource"), 1); - verifyMocks(mockActionPtr); + verifyMocks(mockActionPtr, mockGridPtr); } TEST(ObjectTest, command_neq) { @@ -1310,7 +1312,7 @@ TEST(ObjectTest, command_neq) { ASSERT_EQ(*srcObjectPtr->getVariableValue("resource"), 2); ASSERT_EQ(*dstObjectPtr->getVariableValue("resource"), 1); - verifyMocks(mockActionPtr); + verifyMocks(mockActionPtr, mockGridPtr); } TEST(ObjectTest, isValidAction) { @@ -1335,7 +1337,6 @@ TEST(ObjectTest, isValidAction) { ASSERT_EQ(*srcObject->getVariableValue("counter"), 5); ASSERT_TRUE(preconditionResult); - verifyMocks(mockActionPtr); } TEST(ObjectTest, isValidActionNotDefinedForAction) { From fb6560060a0b0db839e717fc295de441ab98fffd Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 10 May 2021 21:11:02 +0100 Subject: [PATCH 28/29] update submodule --- python/examples/experiments/rts-self-play | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/examples/experiments/rts-self-play b/python/examples/experiments/rts-self-play index 5f1b1be2e..6cca22aee 160000 --- a/python/examples/experiments/rts-self-play +++ b/python/examples/experiments/rts-self-play @@ -1 +1 @@ -Subproject commit 5f1b1be2e66496b84cd572505559a62036182c2d +Subproject commit 6cca22aeeffcb590913fd380d86b131c7d6697c9 From 1e77492cbee839d618a027179ce2cb41492d5bb4 Mon Sep 17 00:00:00 2001 From: Bam4d Date: Mon, 10 May 2021 21:41:44 +0100 Subject: [PATCH 29/29] version bump and schema docs --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- CMakeLists.txt | 2 +- bindings/python.cpp | 2 +- docs/conf.py | 2 +- .../gt/index.rst | 4 +- .../gte/index.rst | 34 ++++++++++ .../index.rst | 10 ++- .../lt/index.rst | 4 +- .../lte/index.rst | 34 ++++++++++ .../gte/index.rst | 36 +++++++++++ .../index.rst | 6 ++ .../lte/index.rst | 36 +++++++++++ .../GDY/Environment/Termination/End/index.rst | 28 ++++----- .../Environment/Termination/Lose/index.rst | 28 ++++----- .../GDY/Environment/Termination/Win/index.rst | 28 ++++----- .../terminationConditionV1/eq/index.rst | 36 +++++++++++ .../terminationConditionV1/gt/index.rst | 36 +++++++++++ .../terminationConditionV1/gte/index.rst | 36 +++++++++++ .../terminationConditionV1/index.rst | 44 +++++++++++++ .../terminationConditionV1/lt/index.rst | 36 +++++++++++ .../terminationConditionV1/lte/index.rst | 36 +++++++++++ .../terminationConditionV1/neq/index.rst | 36 +++++++++++ .../terminationArgument/index.rst | 33 ++++++++++ .../Conditions/index.rst | 32 ++++++++++ .../OpposingReward/index.rst | 17 +++++ .../terminationConditionV2/Reward/index.rst | 17 +++++ .../terminationConditionV2/index.rst | 35 +++++++++++ python/setup.py | 2 +- resources/gdy-schema.json | 63 ++++++++++++------- 29 files changed, 635 insertions(+), 80 deletions(-) create mode 100644 docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/gte/index.rst create mode 100644 docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/lte/index.rst create mode 100644 docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/gte/index.rst create mode 100644 docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/lte/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV1/eq/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV1/gt/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV1/gte/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV1/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV1/lt/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV1/lte/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV1/neq/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV1/terminationArgument/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV2/Conditions/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV2/OpposingReward/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV2/Reward/index.rst create mode 100644 docs/reference/GDY/Environment/Termination/terminationConditionV2/index.rst diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 67a9183de..6180919f5 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -24,7 +24,7 @@ If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - OS: [e.g. mac/linux/windows] - - Version [e.g. 1.0.2] + - Version [e.g. 1.1.0] **Additional context** Add any other context about the problem here. diff --git a/CMakeLists.txt b/CMakeLists.txt index fe71fc69f..fce710fb8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10.0) -project(Griddly VERSION 1.0.2) +project(Griddly VERSION 1.1.0) set(BINARY ${CMAKE_PROJECT_NAME}) diff --git a/bindings/python.cpp b/bindings/python.cpp index 096ab806a..5f49ab57c 100644 --- a/bindings/python.cpp +++ b/bindings/python.cpp @@ -12,7 +12,7 @@ namespace griddly { PYBIND11_MODULE(python_griddly, m) { m.doc() = "Griddly python bindings"; - m.attr("version") = "1.0.2"; + m.attr("version") = "1.1.0"; #ifndef NDEBUG spdlog::set_level(spdlog::level::debug); diff --git a/docs/conf.py b/docs/conf.py index 791cda6d3..9def514bc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -22,7 +22,7 @@ author = 'Chris Bamford' # The full version, including alpha/beta/rc tags -release = '1.0.2' +release = '1.1.0' # -- General configuration --------------------------------------------------- diff --git a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/gt/index.rst b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/gt/index.rst index b17171929..12afd72ba 100644 --- a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/gt/index.rst +++ b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/gt/index.rst @@ -1,6 +1,6 @@ -.. _#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lt: +.. _#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gt: -.. #/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lt +.. #/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gt Greater Than ============ diff --git a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/gte/index.rst b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/gte/index.rst new file mode 100644 index 000000000..e33e2f05c --- /dev/null +++ b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/gte/index.rst @@ -0,0 +1,34 @@ +.. _#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gte: + +.. #/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gte + +Greater Than Or Equal +===================== + +:Description: The specified commands will only be run if the value of the first argument is greater than or equal to the second. + +.. list-table:: + + * - **Data Type** + - **YAML Key** + * - object + - ``gte`` + + +:Properties: + +.. list-table:: + + * - **Property** + - **Required** + * - :ref:`Arguments <#/properties/Actions/items/properties/Behaviours/definitions/commandArgument>` + - + * - :ref:`Commands <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommandList>` + - + + +.. toctree:: + :hidden: + + /reference/GDY/Actions/items/Behaviours/commandArgument/index + /reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommandList/index diff --git a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/index.rst b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/index.rst index 67acf5c70..89c897441 100644 --- a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/index.rst +++ b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/index.rst @@ -15,9 +15,13 @@ Conditional Behaviour Command - **Required** * - :ref:`eq <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/eq>` - - * - :ref:`lt <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gt>` + * - :ref:`lt <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lt>` - - * - :ref:`gt <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lt>` + * - :ref:`lte <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lte>` + - + * - :ref:`gt <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gt>` + - + * - :ref:`gte <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gte>` - @@ -26,4 +30,6 @@ Conditional Behaviour Command eq/index lt/index + lte/index gt/index + gte/index diff --git a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/lt/index.rst b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/lt/index.rst index b3559569f..21f59e255 100644 --- a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/lt/index.rst +++ b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/lt/index.rst @@ -1,6 +1,6 @@ -.. _#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gt: +.. _#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lt: -.. #/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/gt +.. #/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lt Less Than ========= diff --git a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/lte/index.rst b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/lte/index.rst new file mode 100644 index 000000000..e3acf8980 --- /dev/null +++ b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommand/lte/index.rst @@ -0,0 +1,34 @@ +.. _#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lte: + +.. #/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommand/properties/lte + +Less Than Or Equal +================== + +:Description: The specified commands will only be run if the value of the first argument is less than or equal to the second. + +.. list-table:: + + * - **Data Type** + - **YAML Key** + * - object + - ``lte`` + + +:Properties: + +.. list-table:: + + * - **Property** + - **Required** + * - :ref:`Arguments <#/properties/Actions/items/properties/Behaviours/definitions/commandArgumentList>` + - + * - :ref:`Commands <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionConditionalCommandList>` + - + + +.. toctree:: + :hidden: + + /reference/GDY/Actions/items/Behaviours/commandArgumentList/index + /reference/GDY/Actions/items/Behaviours/behaviourDefinitionConditionalCommandList/index diff --git a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/gte/index.rst b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/gte/index.rst new file mode 100644 index 000000000..fd95c5aff --- /dev/null +++ b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/gte/index.rst @@ -0,0 +1,36 @@ +.. _#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionPreconditionCommand/properties/gte: + +.. #/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionPreconditionCommand/properties/gte + +Greater Than Or Equal +===================== + +:Description: Check if the first argument is greater than or equal to the second + +.. list-table:: + + * - **Data Type** + - **YAML Key** + - **Max Items** + - **Min Items** + * - array + - ``gte`` + - 2 + - 2 + + +:Array Type: + +.. list-table:: + + * - **Type** + - **Description** + * - :ref:`Command Argument<#/properties/Actions/items/properties/Behaviours/definitions/commandArgument>` + - An argument to a behaviour command. + + +.. toctree:: + :maxdepth: 5 + :hidden: + + /reference/GDY/Actions/items/Behaviours/commandArgument/index diff --git a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/index.rst b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/index.rst index 2045263e1..ebeb2be84 100644 --- a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/index.rst +++ b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/index.rst @@ -19,8 +19,12 @@ Behaviour Precondition - * - :ref:`gt <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionPreconditionCommand/properties/gt>` - + * - :ref:`gte <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionPreconditionCommand/properties/gte>` + - * - :ref:`lt <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionPreconditionCommand/properties/lt>` - + * - :ref:`lte <#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionPreconditionCommand/properties/lte>` + - .. toctree:: @@ -29,4 +33,6 @@ Behaviour Precondition eq/index neq/index gt/index + gte/index lt/index + lte/index diff --git a/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/lte/index.rst b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/lte/index.rst new file mode 100644 index 000000000..f46235818 --- /dev/null +++ b/docs/reference/GDY/Actions/items/Behaviours/behaviourDefinitionPreconditionCommand/lte/index.rst @@ -0,0 +1,36 @@ +.. _#/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionPreconditionCommand/properties/lte: + +.. #/properties/Actions/items/properties/Behaviours/definitions/behaviourDefinitionPreconditionCommand/properties/lte + +Less Than Or Equal +================== + +:Description: Check if the first argument is less than or equal to the second + +.. list-table:: + + * - **Data Type** + - **YAML Key** + - **Max Items** + - **Min Items** + * - array + - ``lte`` + - 2 + - 2 + + +:Array Type: + +.. list-table:: + + * - **Type** + - **Description** + * - :ref:`Command Argument<#/properties/Actions/items/properties/Behaviours/definitions/commandArgument>` + - An argument to a behaviour command. + + +.. toctree:: + :maxdepth: 5 + :hidden: + + /reference/GDY/Actions/items/Behaviours/commandArgument/index diff --git a/docs/reference/GDY/Environment/Termination/End/index.rst b/docs/reference/GDY/Environment/Termination/End/index.rst index 5c1674eee..fefb3c696 100644 --- a/docs/reference/GDY/Environment/Termination/End/index.rst +++ b/docs/reference/GDY/Environment/Termination/End/index.rst @@ -7,26 +7,24 @@ End Conditions :Description: If any of these conditions are met, the game will end. -.. list-table:: +:Possible Values: - * - **Data Type** - - **YAML Key** - * - array - - ``End`` +.. list-table:: + * - **Value** + - **Type** + - **Description** + * - V1 Termination Conditions + - array + - V1 Termination Conditions + * - V2 Termination Conditions + - array + - V2 Termination Conditions -:Array Type: .. list-table:: - * - **Type** - - **Description** - * - :ref:`Termination Conditions<#/properties/Environment/properties/Termination/definitions/terminationCondition>` - - When a termination condition is met, the game will reset itself. If there are multiple players, the termination arguments are expanded internally "per player". This can be used to find the first player to a certain number of objects, or the first player to reach a certain score - + * - **YAML Key** + * - ``End`` -.. toctree:: - :maxdepth: 5 - :hidden: - /reference/GDY/Environment/Termination/terminationCondition/index diff --git a/docs/reference/GDY/Environment/Termination/Lose/index.rst b/docs/reference/GDY/Environment/Termination/Lose/index.rst index e574d049e..1865e854e 100644 --- a/docs/reference/GDY/Environment/Termination/Lose/index.rst +++ b/docs/reference/GDY/Environment/Termination/Lose/index.rst @@ -7,26 +7,24 @@ Lose Conditions :Description: If any of these conditions are met, the player associated with this condition will lose the game. -.. list-table:: +:Possible Values: - * - **Data Type** - - **YAML Key** - * - array - - ``Lose`` +.. list-table:: + * - **Value** + - **Type** + - **Description** + * - V1 Termination Conditions + - array + - V1 Termination Conditions + * - V2 Termination Conditions + - array + - V2 Termination Conditions -:Array Type: .. list-table:: - * - **Type** - - **Description** - * - :ref:`Termination Conditions<#/properties/Environment/properties/Termination/definitions/terminationCondition>` - - When a termination condition is met, the game will reset itself. If there are multiple players, the termination arguments are expanded internally "per player". This can be used to find the first player to a certain number of objects, or the first player to reach a certain score - + * - **YAML Key** + * - ``Lose`` -.. toctree:: - :maxdepth: 5 - :hidden: - /reference/GDY/Environment/Termination/terminationCondition/index diff --git a/docs/reference/GDY/Environment/Termination/Win/index.rst b/docs/reference/GDY/Environment/Termination/Win/index.rst index 3f3bb33ab..20c4d817e 100644 --- a/docs/reference/GDY/Environment/Termination/Win/index.rst +++ b/docs/reference/GDY/Environment/Termination/Win/index.rst @@ -7,26 +7,24 @@ Win Conditions :Description: If any of these conditions are met, the player associated with this condition will win the game. -.. list-table:: +:Possible Values: - * - **Data Type** - - **YAML Key** - * - array - - ``Win`` +.. list-table:: + * - **Value** + - **Type** + - **Description** + * - V1 Termination Conditions + - array + - V1 Termination Conditions + * - V2 Termination Conditions + - array + - V2 Termination Conditions -:Array Type: .. list-table:: - * - **Type** - - **Description** - * - :ref:`Termination Conditions<#/properties/Environment/properties/Termination/definitions/terminationCondition>` - - When a termination condition is met, the game will reset itself. If there are multiple players, the termination arguments are expanded internally "per player". This can be used to find the first player to a certain number of objects, or the first player to reach a certain score - + * - **YAML Key** + * - ``Win`` -.. toctree:: - :maxdepth: 5 - :hidden: - /reference/GDY/Environment/Termination/terminationCondition/index diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV1/eq/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV1/eq/index.rst new file mode 100644 index 000000000..6387fa32b --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV1/eq/index.rst @@ -0,0 +1,36 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/eq: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/eq + +Equals +====== + +:Description: Check if the arguments are equal + +.. list-table:: + + * - **Data Type** + - **YAML Key** + - **Max Items** + - **Min Items** + * - array + - ``eq`` + - 2 + - 2 + + +:Array Type: + +.. list-table:: + + * - **Type** + - **Description** + * - :ref:`Termination Arguments<#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument>` + - An argument to the termination condition. If there are multiple players, then these arguments expand internally as "per player" + + +.. toctree:: + :maxdepth: 5 + :hidden: + + /reference/GDY/Environment/Termination/terminationConditionV1/terminationArgument/index diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV1/gt/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV1/gt/index.rst new file mode 100644 index 000000000..a217dbe63 --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV1/gt/index.rst @@ -0,0 +1,36 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/gt: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/gt + +Greater Than +============ + +:Description: Check if the first argument is greater than the second + +.. list-table:: + + * - **Data Type** + - **YAML Key** + - **Max Items** + - **Min Items** + * - array + - ``gt`` + - 2 + - 2 + + +:Array Type: + +.. list-table:: + + * - **Type** + - **Description** + * - :ref:`Termination Arguments<#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument>` + - An argument to the termination condition. If there are multiple players, then these arguments expand internally as "per player" + + +.. toctree:: + :maxdepth: 5 + :hidden: + + /reference/GDY/Environment/Termination/terminationConditionV1/terminationArgument/index diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV1/gte/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV1/gte/index.rst new file mode 100644 index 000000000..096d539fe --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV1/gte/index.rst @@ -0,0 +1,36 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/gte: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/gte + +Greater Than Or Equal +===================== + +:Description: Check if the first argument is greater than or equal to the second + +.. list-table:: + + * - **Data Type** + - **YAML Key** + - **Max Items** + - **Min Items** + * - array + - ``gte`` + - 2 + - 2 + + +:Array Type: + +.. list-table:: + + * - **Type** + - **Description** + * - :ref:`Termination Arguments<#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument>` + - An argument to the termination condition. If there are multiple players, then these arguments expand internally as "per player" + + +.. toctree:: + :maxdepth: 5 + :hidden: + + /reference/GDY/Environment/Termination/terminationConditionV1/terminationArgument/index diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV1/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV1/index.rst new file mode 100644 index 000000000..a50367ab7 --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV1/index.rst @@ -0,0 +1,44 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV1: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV1 + +Termination Conditions V1 +========================= + +:Description: When a termination condition is met, the game will reset itself. If there are multiple players, the termination arguments are expanded internally "per player". This can be used to find the first player to a certain number of objects, or the first player to reach a certain score + +.. list-table:: + + * - **Data Type** + * - object + + +:Properties: + +.. list-table:: + + * - **Property** + - **Required** + * - :ref:`eq <#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/eq>` + - + * - :ref:`neq <#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/neq>` + - + * - :ref:`gt <#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/gt>` + - + * - :ref:`gte <#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/gte>` + - + * - :ref:`lt <#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/lt>` + - + * - :ref:`lte <#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/lte>` + - + + +.. toctree:: + :hidden: + + eq/index + neq/index + gt/index + gte/index + lt/index + lte/index diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV1/lt/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV1/lt/index.rst new file mode 100644 index 000000000..b559ba1da --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV1/lt/index.rst @@ -0,0 +1,36 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/lt: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/lt + +Less Than +========= + +:Description: Check if the first argument is less than the second + +.. list-table:: + + * - **Data Type** + - **YAML Key** + - **Max Items** + - **Min Items** + * - array + - ``lt`` + - 2 + - 2 + + +:Array Type: + +.. list-table:: + + * - **Type** + - **Description** + * - :ref:`Termination Arguments<#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument>` + - An argument to the termination condition. If there are multiple players, then these arguments expand internally as "per player" + + +.. toctree:: + :maxdepth: 5 + :hidden: + + /reference/GDY/Environment/Termination/terminationConditionV1/terminationArgument/index diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV1/lte/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV1/lte/index.rst new file mode 100644 index 000000000..89829ca7e --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV1/lte/index.rst @@ -0,0 +1,36 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/lte: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/lte + +Less Than Or Equal +================== + +:Description: Check if the first argument is less than or equal to the second + +.. list-table:: + + * - **Data Type** + - **YAML Key** + - **Max Items** + - **Min Items** + * - array + - ``lte`` + - 2 + - 2 + + +:Array Type: + +.. list-table:: + + * - **Type** + - **Description** + * - :ref:`Termination Arguments<#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument>` + - An argument to the termination condition. If there are multiple players, then these arguments expand internally as "per player" + + +.. toctree:: + :maxdepth: 5 + :hidden: + + /reference/GDY/Environment/Termination/terminationConditionV1/terminationArgument/index diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV1/neq/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV1/neq/index.rst new file mode 100644 index 000000000..7f65591c9 --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV1/neq/index.rst @@ -0,0 +1,36 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/neq: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV1/properties/neq + +Not Equals +========== + +:Description: Check if the arguments are not equal + +.. list-table:: + + * - **Data Type** + - **YAML Key** + - **Max Items** + - **Min Items** + * - array + - ``neq`` + - 2 + - 2 + + +:Array Type: + +.. list-table:: + + * - **Type** + - **Description** + * - :ref:`Termination Arguments<#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument>` + - An argument to the termination condition. If there are multiple players, then these arguments expand internally as "per player" + + +.. toctree:: + :maxdepth: 5 + :hidden: + + /reference/GDY/Environment/Termination/terminationConditionV1/terminationArgument/index diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV1/terminationArgument/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV1/terminationArgument/index.rst new file mode 100644 index 000000000..ff95e6725 --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV1/terminationArgument/index.rst @@ -0,0 +1,33 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV1/definitions/terminationArgument + +Termination Arguments +===================== + +:Description: An argument to the termination condition. If there are multiple players, then these arguments expand internally as "per player" + +:Possible Values: + +.. list-table:: + + * - **Value** + - **Type** + - **Description** + * - ``\w+`` + - string + - Any global variable + * - ``\w+:count`` + - string + - Returns the number of objects of the object name before the colon, for example ``flower:count`` or ``car:count`` + * - ``_steps`` + - string + - Returns the number of game ticks that have passed + * - ``_score`` + - string + - The current score + * - ``[integer]`` + - integer + - Any Integer value + + diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV2/Conditions/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV2/Conditions/index.rst new file mode 100644 index 000000000..b10e4bbbd --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV2/Conditions/index.rst @@ -0,0 +1,32 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/Conditions: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/Conditions + +Conditions +========== + +:Description: If any of these conditions are met, the game will end and distribute rewards to the associated players. + +.. list-table:: + + * - **Data Type** + - **YAML Key** + * - array + - ``Conditions`` + + +:Array Type: + +.. list-table:: + + * - **Type** + - **Description** + * - :ref:`Termination Conditions V1<#/properties/Environment/properties/Termination/definitions/terminationConditionV1>` + - When a termination condition is met, the game will reset itself. If there are multiple players, the termination arguments are expanded internally "per player". This can be used to find the first player to a certain number of objects, or the first player to reach a certain score + + +.. toctree:: + :maxdepth: 5 + :hidden: + + /reference/GDY/Environment/Termination/terminationConditionV1/index diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV2/OpposingReward/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV2/OpposingReward/index.rst new file mode 100644 index 000000000..b0ec17c44 --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV2/OpposingReward/index.rst @@ -0,0 +1,17 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/OpposingReward: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/OpposingReward + +Opposing Reward +=============== + +:Description: The reward given to other agents if this condition is met. + +.. list-table:: + + * - **Data Type** + - **YAML Key** + * - integer + - ``OpposingReward`` + + diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV2/Reward/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV2/Reward/index.rst new file mode 100644 index 000000000..be0d051d6 --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV2/Reward/index.rst @@ -0,0 +1,17 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/Reward: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/Reward + +Reward +====== + +:Description: The reward given to the agent if this conditions is met. + +.. list-table:: + + * - **Data Type** + - **YAML Key** + * - integer + - ``Reward`` + + diff --git a/docs/reference/GDY/Environment/Termination/terminationConditionV2/index.rst b/docs/reference/GDY/Environment/Termination/terminationConditionV2/index.rst new file mode 100644 index 000000000..aa67e7ef9 --- /dev/null +++ b/docs/reference/GDY/Environment/Termination/terminationConditionV2/index.rst @@ -0,0 +1,35 @@ +.. _#/properties/Environment/properties/Termination/definitions/terminationConditionV2: + +.. #/properties/Environment/properties/Termination/definitions/terminationConditionV2 + +Termination Conditions V2 +========================= + +:Description: When a termination condition is met, the game will reset itself. If there are multiple players, the termination arguments are expanded internally "per player". This can be used to find the first player to a certain number of objects, or the first player to reach a certain score + +.. list-table:: + + * - **Data Type** + * - object + + +:Properties: + +.. list-table:: + + * - **Property** + - **Required** + * - :ref:`Conditions <#/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/Conditions>` + - + * - :ref:`Reward <#/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/Reward>` + - + * - :ref:`OpposingReward <#/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/OpposingReward>` + - + + +.. toctree:: + :hidden: + + Conditions/index + Reward/index + OpposingReward/index diff --git a/python/setup.py b/python/setup.py index f30016c60..6873b62b6 100644 --- a/python/setup.py +++ b/python/setup.py @@ -71,7 +71,7 @@ def griddly_package_data(config='Debug'): setup( name='griddly', - version="1.0.2", + version="1.1.0", author_email="chrisbam4d@gmail.com", description="Griddly Python Libraries", long_description=long_description, diff --git a/resources/gdy-schema.json b/resources/gdy-schema.json index a9198b1c4..84c4c4903 100644 --- a/resources/gdy-schema.json +++ b/resources/gdy-schema.json @@ -309,7 +309,8 @@ "oneOf": [ { "type": "array", - "description": "V1 termination Conditions", + "title": "V1 Termination Conditions", + "description": "V1 Termination Conditions", "additionalItems": false, "items": { "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1" @@ -317,7 +318,8 @@ }, { "type": "array", - "description": "V2 termination Conditions", + "title": "V2 Termination Conditions", + "description": "V2 Termination Conditions", "additionalItems": false, "items": { "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV2" @@ -333,7 +335,8 @@ "oneOf": [ { "type": "array", - "description": "V1 termination Conditions", + "title": "V1 Termination Conditions", + "description": "V1 Termination Conditions", "additionalItems": false, "items": { "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1" @@ -341,7 +344,8 @@ }, { "type": "array", - "description": "V2 termination Conditions", + "title": "V2 Termination Conditions", + "description": "V2 Termination Conditions", "additionalItems": false, "items": { "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV2" @@ -357,7 +361,8 @@ "oneOf": [ { "type": "array", - "description": "V1 termination Conditions", + "title": "V1 Termination Conditions", + "description": "V1 Termination Conditions", "additionalItems": false, "items": { "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1" @@ -365,7 +370,8 @@ }, { "type": "array", - "description": "V2 termination Conditions", + "title": "V2 Termination Conditions", + "description": "V2 Termination Conditions", "additionalItems": false, "items": { "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV2" @@ -376,25 +382,34 @@ }, "definitions": { "terminationConditionV2": { - "Conditions": { - "$id": "#/properties/Environment/properties/Termination/properties/Conditions", - "type": "array", - "title": "Conditions", - "description": "If any of these conditions are met, the game will end and distribute rewards to the associated players.", - "additionalItems": false, - "items": { - "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1" + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV2", + "type": "object", + "title": "Termination Conditions V2", + "description": "When a termination condition is met, the game will reset itself. If there are multiple players, the termination arguments are expanded internally \"per player\". This can be used to find the first player to a certain number of objects, or the first player to reach a certain score", + "additionalProperties": false, + "properties": { + "Conditions": { + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/Conditions", + "type": "array", + "title": "Conditions", + "description": "If any of these conditions are met, the game will end and distribute rewards to the associated players.", + "additionalItems": false, + "items": { + "$ref": "#/properties/Environment/properties/Termination/definitions/terminationConditionV1" + } + }, + "Reward": { + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/Reward", + "type": "integer", + "title": "Reward", + "description": "The reward given to the agent if this conditions is met." + }, + "OpposingReward": { + "$id": "#/properties/Environment/properties/Termination/definitions/terminationConditionV2/properties/OpposingReward", + "type": "integer", + "title": "Opposing Reward", + "description": "The reward given to other agents if this condition is met." } - }, - "Reward": { - "type": "integer", - "title": "Reward", - "description": "The reward given to the agent if this conditions is met." - }, - "OpposingReward": { - "type": "integer", - "title": "Opposing Reward", - "description": "The reward given to other agents if this condition is met." } }, "terminationConditionV1": {