From ebd52c6afa8616c383333dc3783ae34504476ea6 Mon Sep 17 00:00:00 2001 From: "A.Bond" Date: Fri, 27 Sep 2024 22:10:47 +0600 Subject: [PATCH] add initial rule getter to 2D WFC mapper; use tileset terrainsettings for initial rules on tilemap layers --- README.md | 3 +- .../assets/kenney-pixel-shmup/License.txt | 22 + .../kenney-pixel-shmup/tile-set-main.tres | 940 ++++++++++++++++++ .../kenney-pixel-shmup/tiles_packed.png | Bin 0 -> 3759 bytes .../tiles_packed.png.import | 34 + .../tile-set-decorations.tres | 39 + .../demo_wfc_2d_tilemaplayer_terrain.tscn | 71 ++ addons/wfc/problems/2d/mappers/mapper_2d.gd | 26 + .../2d/mappers/mapper_2d_layered_map.gd | 34 + .../2d/mappers/mapper_2d_tilemaplayer.gd | 143 +++ addons/wfc/problems/2d/rules_2d.gd | 13 + 11 files changed, 1324 insertions(+), 1 deletion(-) create mode 100644 addons/wfc/examples/assets/kenney-pixel-shmup/License.txt create mode 100644 addons/wfc/examples/assets/kenney-pixel-shmup/tile-set-main.tres create mode 100644 addons/wfc/examples/assets/kenney-pixel-shmup/tiles_packed.png create mode 100644 addons/wfc/examples/assets/kenney-pixel-shmup/tiles_packed.png.import create mode 100644 addons/wfc/examples/demo_wfc_2d_tilemaplayer_terrain.tscn diff --git a/README.md b/README.md index cc6a537..9a6b4f1 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Features: The algorithm also tries to infer some valid cell combinations beyond those provided in the example. In cases when the algorithm produces some invalid or not-nice-looking cell combinations, it's possible to also provide examples of cell combinations that should not appear in the final result. Or stop the generator from searching for additional cell combinations and provide all possible combinations in the initial example. + Rules can also in some cases be learned from terrain settings of tilesets used in `TileMapLayer` maps. - Supports **different node types**: - `TileMapLayer` and `TileMap` (including some **hexagonal** tilemaps, see [example](addons/wfc/examples/demo_wfc_2d_hex_tilemap.tscn)) - `GridMap` (a flat map in one of XY/YZ/XZ planes can be generated) @@ -118,7 +119,7 @@ So please refer to source code to find a way to do what you need and feel free t This addon is licenced under MIT licence. -Examples/demos use assets (["tiny dungeon" tileset](addons/wfc/examples/assets/kenney-tiny-dungeon), ["nature kit" models pack](addons/wfc/examples/assets/kenny-nature-kit)) from [Kenney](https://kenney.nl/). +Examples/demos use assets (["tiny dungeon" tileset](addons/wfc/examples/assets/kenney-tiny-dungeon), ["Pixel Shmup" tileset](https://www.kenney.nl/assets/pixel-shmup), ["nature kit" models pack](addons/wfc/examples/assets/kenny-nature-kit)) from [Kenney](https://kenney.nl/). Hexagonal tilemap example [uses](addons/wfc/examples/assets/Underearth) ["Underearth Hex Dungeon" tile set](https://opengameart.org/content/underearth-hex-dungeon). This addon uses [GUT](https://github.com/bitwes/Gut) for unit testing (not included in downloadable archive). diff --git a/addons/wfc/examples/assets/kenney-pixel-shmup/License.txt b/addons/wfc/examples/assets/kenney-pixel-shmup/License.txt new file mode 100644 index 0000000..dce291a --- /dev/null +++ b/addons/wfc/examples/assets/kenney-pixel-shmup/License.txt @@ -0,0 +1,22 @@ + + + Pixel Shmup (1.1) + + Created/distributed by Kenney (www.kenney.nl) + Creation date: 01-11-2021 + + ------------------------------ + + License: (Creative Commons Zero, CC0) + http://creativecommons.org/publicdomain/zero/1.0/ + + This content is free to use in personal, educational and commercial projects. + Support us by crediting Kenney or www.kenney.nl (this is not mandatory) + + ------------------------------ + + Donate: http://support.kenney.nl + Patreon: http://patreon.com/kenney/ + + Follow on Twitter for updates: + http://twitter.com/KenneyNL \ No newline at end of file diff --git a/addons/wfc/examples/assets/kenney-pixel-shmup/tile-set-main.tres b/addons/wfc/examples/assets/kenney-pixel-shmup/tile-set-main.tres new file mode 100644 index 0000000..5f40ec9 --- /dev/null +++ b/addons/wfc/examples/assets/kenney-pixel-shmup/tile-set-main.tres @@ -0,0 +1,940 @@ +[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://bf6ft5mo8umpn"] + +[ext_resource type="Texture2D" uid="uid://cmph00k1t22u5" path="res://addons/wfc/examples/assets/kenney-pixel-shmup/tiles_packed.png" id="1_7v70a"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_xm183"] +texture = ExtResource("1_7v70a") +0:3/0 = 0 +0:3/0/terrain_set = 0 +0:3/0/terrain = 1 +0:3/0/terrains_peering_bit/right_side = 1 +0:3/0/terrains_peering_bit/bottom_right_corner = 1 +0:3/0/terrains_peering_bit/bottom_side = 1 +0:3/0/terrains_peering_bit/bottom_left_corner = 1 +0:3/0/terrains_peering_bit/left_side = 1 +0:3/0/terrains_peering_bit/top_left_corner = 1 +0:3/0/terrains_peering_bit/top_side = 1 +0:3/0/terrains_peering_bit/top_right_corner = 1 +1:3/0 = 0 +1:3/0/terrain_set = 0 +1:3/0/terrain = 1 +1:3/0/terrains_peering_bit/right_side = 1 +1:3/0/terrains_peering_bit/bottom_right_corner = 1 +1:3/0/terrains_peering_bit/bottom_side = 1 +1:3/0/terrains_peering_bit/bottom_left_corner = 2 +1:3/0/terrains_peering_bit/left_side = 2 +1:3/0/terrains_peering_bit/top_left_corner = 2 +1:3/0/terrains_peering_bit/top_side = 2 +1:3/0/terrains_peering_bit/top_right_corner = 2 +2:3/0 = 0 +2:3/0/terrain_set = 0 +2:3/0/terrain = 1 +2:3/0/terrains_peering_bit/right_side = 1 +2:3/0/terrains_peering_bit/bottom_right_corner = 1 +2:3/0/terrains_peering_bit/bottom_side = 1 +2:3/0/terrains_peering_bit/bottom_left_corner = 1 +2:3/0/terrains_peering_bit/left_side = 1 +2:3/0/terrains_peering_bit/top_left_corner = 2 +2:3/0/terrains_peering_bit/top_side = 2 +2:3/0/terrains_peering_bit/top_right_corner = 2 +3:3/0 = 0 +3:3/0/terrain_set = 0 +3:3/0/terrain = 1 +3:3/0/terrains_peering_bit/right_side = 2 +3:3/0/terrains_peering_bit/bottom_right_corner = 2 +3:3/0/terrains_peering_bit/bottom_side = 1 +3:3/0/terrains_peering_bit/bottom_left_corner = 1 +3:3/0/terrains_peering_bit/left_side = 1 +3:3/0/terrains_peering_bit/top_left_corner = 2 +3:3/0/terrains_peering_bit/top_side = 2 +3:3/0/terrains_peering_bit/top_right_corner = 2 +4:3/0 = 0 +4:3/0/terrain_set = 0 +4:3/0/terrain = 1 +4:3/0/terrains_peering_bit/right_side = 1 +4:3/0/terrains_peering_bit/bottom_right_corner = 2 +4:3/0/terrains_peering_bit/bottom_side = 1 +4:3/0/terrains_peering_bit/bottom_left_corner = 1 +4:3/0/terrains_peering_bit/left_side = 1 +4:3/0/terrains_peering_bit/top_left_corner = 1 +4:3/0/terrains_peering_bit/top_side = 1 +4:3/0/terrains_peering_bit/top_right_corner = 1 +5:3/0 = 0 +5:3/0/terrain_set = 0 +5:3/0/terrain = 1 +5:3/0/terrains_peering_bit/right_side = 1 +5:3/0/terrains_peering_bit/bottom_right_corner = 1 +5:3/0/terrains_peering_bit/bottom_side = 1 +5:3/0/terrains_peering_bit/bottom_left_corner = 2 +5:3/0/terrains_peering_bit/left_side = 1 +5:3/0/terrains_peering_bit/top_left_corner = 1 +5:3/0/terrains_peering_bit/top_side = 1 +5:3/0/terrains_peering_bit/top_right_corner = 1 +6:3/0 = 0 +6:3/0/terrain_set = 0 +6:3/0/terrain = 2 +6:3/0/terrains_peering_bit/right_side = 2 +6:3/0/terrains_peering_bit/bottom_right_corner = 2 +6:3/0/terrains_peering_bit/bottom_side = 2 +6:3/0/terrains_peering_bit/bottom_left_corner = 2 +6:3/0/terrains_peering_bit/left_side = 2 +6:3/0/terrains_peering_bit/top_left_corner = 2 +6:3/0/terrains_peering_bit/top_side = 2 +6:3/0/terrains_peering_bit/top_right_corner = 2 +7:3/0 = 0 +7:3/0/terrain_set = 0 +7:3/0/terrain = 0 +7:3/0/terrains_peering_bit/right_side = 0 +7:3/0/terrains_peering_bit/bottom_right_corner = 0 +7:3/0/terrains_peering_bit/bottom_side = 0 +7:3/0/terrains_peering_bit/bottom_left_corner = 2 +7:3/0/terrains_peering_bit/left_side = 2 +7:3/0/terrains_peering_bit/top_left_corner = 2 +7:3/0/terrains_peering_bit/top_side = 2 +7:3/0/terrains_peering_bit/top_right_corner = 2 +8:3/0 = 0 +8:3/0/terrain_set = 0 +8:3/0/terrain = 0 +8:3/0/terrains_peering_bit/right_side = 0 +8:3/0/terrains_peering_bit/bottom_right_corner = 0 +8:3/0/terrains_peering_bit/bottom_side = 0 +8:3/0/terrains_peering_bit/bottom_left_corner = 0 +8:3/0/terrains_peering_bit/left_side = 0 +8:3/0/terrains_peering_bit/top_left_corner = 2 +8:3/0/terrains_peering_bit/top_side = 2 +8:3/0/terrains_peering_bit/top_right_corner = 2 +9:3/0 = 0 +9:3/0/terrain_set = 0 +9:3/0/terrain = 0 +9:3/0/terrains_peering_bit/right_side = 2 +9:3/0/terrains_peering_bit/bottom_right_corner = 2 +9:3/0/terrains_peering_bit/bottom_side = 0 +9:3/0/terrains_peering_bit/bottom_left_corner = 0 +9:3/0/terrains_peering_bit/left_side = 0 +9:3/0/terrains_peering_bit/top_left_corner = 2 +9:3/0/terrains_peering_bit/top_side = 2 +9:3/0/terrains_peering_bit/top_right_corner = 2 +10:3/0 = 0 +10:3/0/terrain_set = 0 +10:3/0/terrain = 0 +10:3/0/terrains_peering_bit/right_side = 0 +10:3/0/terrains_peering_bit/bottom_right_corner = 2 +10:3/0/terrains_peering_bit/bottom_side = 0 +10:3/0/terrains_peering_bit/bottom_left_corner = 0 +10:3/0/terrains_peering_bit/left_side = 0 +10:3/0/terrains_peering_bit/top_left_corner = 0 +10:3/0/terrains_peering_bit/top_side = 0 +10:3/0/terrains_peering_bit/top_right_corner = 0 +11:3/0 = 0 +11:3/0/terrain_set = 0 +11:3/0/terrain = 0 +11:3/0/terrains_peering_bit/right_side = 0 +11:3/0/terrains_peering_bit/bottom_right_corner = 0 +11:3/0/terrains_peering_bit/bottom_side = 0 +11:3/0/terrains_peering_bit/bottom_left_corner = 2 +11:3/0/terrains_peering_bit/left_side = 0 +11:3/0/terrains_peering_bit/top_left_corner = 0 +11:3/0/terrains_peering_bit/top_side = 0 +11:3/0/terrains_peering_bit/top_right_corner = 0 +0:4/0 = 0 +0:4/0/terrain_set = 0 +0:4/0/terrain = 1 +0:4/0/terrains_peering_bit/right_side = 1 +0:4/0/terrains_peering_bit/bottom_right_corner = 1 +0:4/0/terrains_peering_bit/bottom_side = 1 +0:4/0/terrains_peering_bit/bottom_left_corner = 1 +0:4/0/terrains_peering_bit/left_side = 1 +0:4/0/terrains_peering_bit/top_left_corner = 1 +0:4/0/terrains_peering_bit/top_side = 1 +0:4/0/terrains_peering_bit/top_right_corner = 1 +1:4/0 = 0 +1:4/0/terrain_set = 0 +1:4/0/terrain = 1 +1:4/0/terrains_peering_bit/right_side = 1 +1:4/0/terrains_peering_bit/bottom_right_corner = 1 +1:4/0/terrains_peering_bit/bottom_side = 1 +1:4/0/terrains_peering_bit/bottom_left_corner = 2 +1:4/0/terrains_peering_bit/left_side = 2 +1:4/0/terrains_peering_bit/top_left_corner = 2 +1:4/0/terrains_peering_bit/top_side = 1 +1:4/0/terrains_peering_bit/top_right_corner = 1 +2:4/0 = 0 +2:4/0/terrain_set = 0 +2:4/0/terrain = 1 +2:4/0/terrains_peering_bit/right_side = 1 +2:4/0/terrains_peering_bit/bottom_right_corner = 1 +2:4/0/terrains_peering_bit/bottom_side = 1 +2:4/0/terrains_peering_bit/bottom_left_corner = 1 +2:4/0/terrains_peering_bit/left_side = 1 +2:4/0/terrains_peering_bit/top_left_corner = 1 +2:4/0/terrains_peering_bit/top_side = 1 +2:4/0/terrains_peering_bit/top_right_corner = 1 +3:4/0 = 0 +3:4/0/terrain_set = 0 +3:4/0/terrain = 1 +3:4/0/terrains_peering_bit/right_side = 2 +3:4/0/terrains_peering_bit/bottom_right_corner = 2 +3:4/0/terrains_peering_bit/bottom_side = 1 +3:4/0/terrains_peering_bit/bottom_left_corner = 1 +3:4/0/terrains_peering_bit/left_side = 1 +3:4/0/terrains_peering_bit/top_left_corner = 1 +3:4/0/terrains_peering_bit/top_side = 1 +3:4/0/terrains_peering_bit/top_right_corner = 2 +4:4/0 = 0 +4:4/0/terrain_set = 0 +4:4/0/terrain = 1 +4:4/0/terrains_peering_bit/right_side = 1 +4:4/0/terrains_peering_bit/bottom_right_corner = 1 +4:4/0/terrains_peering_bit/bottom_side = 1 +4:4/0/terrains_peering_bit/bottom_left_corner = 1 +4:4/0/terrains_peering_bit/left_side = 1 +4:4/0/terrains_peering_bit/top_left_corner = 1 +4:4/0/terrains_peering_bit/top_side = 1 +4:4/0/terrains_peering_bit/top_right_corner = 2 +5:4/0 = 0 +5:4/0/terrain_set = 0 +5:4/0/terrain = 1 +5:4/0/terrains_peering_bit/right_side = 1 +5:4/0/terrains_peering_bit/bottom_right_corner = 1 +5:4/0/terrains_peering_bit/bottom_side = 1 +5:4/0/terrains_peering_bit/bottom_left_corner = 1 +5:4/0/terrains_peering_bit/left_side = 1 +5:4/0/terrains_peering_bit/top_left_corner = 2 +5:4/0/terrains_peering_bit/top_side = 1 +5:4/0/terrains_peering_bit/top_right_corner = 1 +6:4/0 = 0 +6:4/0/terrain_set = 0 +6:4/0/terrain = 0 +6:4/0/terrains_peering_bit/right_side = 0 +6:4/0/terrains_peering_bit/bottom_right_corner = 0 +6:4/0/terrains_peering_bit/bottom_side = 0 +6:4/0/terrains_peering_bit/bottom_left_corner = 0 +6:4/0/terrains_peering_bit/left_side = 0 +6:4/0/terrains_peering_bit/top_left_corner = 0 +6:4/0/terrains_peering_bit/top_side = 0 +6:4/0/terrains_peering_bit/top_right_corner = 0 +7:4/0 = 0 +7:4/0/terrain_set = 0 +7:4/0/terrain = 0 +7:4/0/terrains_peering_bit/right_side = 0 +7:4/0/terrains_peering_bit/bottom_right_corner = 0 +7:4/0/terrains_peering_bit/bottom_side = 0 +7:4/0/terrains_peering_bit/bottom_left_corner = 2 +7:4/0/terrains_peering_bit/left_side = 2 +7:4/0/terrains_peering_bit/top_left_corner = 2 +7:4/0/terrains_peering_bit/top_side = 0 +7:4/0/terrains_peering_bit/top_right_corner = 0 +8:4/0 = 0 +8:4/0/terrain_set = 0 +8:4/0/terrain = 0 +8:4/0/terrains_peering_bit/right_side = 0 +8:4/0/terrains_peering_bit/bottom_right_corner = 0 +8:4/0/terrains_peering_bit/bottom_side = 0 +8:4/0/terrains_peering_bit/bottom_left_corner = 0 +8:4/0/terrains_peering_bit/left_side = 0 +8:4/0/terrains_peering_bit/top_left_corner = 0 +8:4/0/terrains_peering_bit/top_side = 0 +8:4/0/terrains_peering_bit/top_right_corner = 0 +9:4/0 = 0 +9:4/0/terrain_set = 0 +9:4/0/terrain = 0 +9:4/0/terrains_peering_bit/right_side = 2 +9:4/0/terrains_peering_bit/bottom_right_corner = 2 +9:4/0/terrains_peering_bit/bottom_side = 0 +9:4/0/terrains_peering_bit/bottom_left_corner = 0 +9:4/0/terrains_peering_bit/left_side = 0 +9:4/0/terrains_peering_bit/top_left_corner = 0 +9:4/0/terrains_peering_bit/top_side = 0 +9:4/0/terrains_peering_bit/top_right_corner = 2 +10:4/0 = 0 +10:4/0/terrain_set = 0 +10:4/0/terrain = 0 +10:4/0/terrains_peering_bit/right_side = 0 +10:4/0/terrains_peering_bit/bottom_right_corner = 0 +10:4/0/terrains_peering_bit/bottom_side = 0 +10:4/0/terrains_peering_bit/bottom_left_corner = 0 +10:4/0/terrains_peering_bit/left_side = 0 +10:4/0/terrains_peering_bit/top_left_corner = 0 +10:4/0/terrains_peering_bit/top_side = 0 +10:4/0/terrains_peering_bit/top_right_corner = 2 +11:4/0 = 0 +11:4/0/terrain_set = 0 +11:4/0/terrain = 0 +11:4/0/terrains_peering_bit/right_side = 0 +11:4/0/terrains_peering_bit/bottom_right_corner = 0 +11:4/0/terrains_peering_bit/bottom_side = 0 +11:4/0/terrains_peering_bit/bottom_left_corner = 0 +11:4/0/terrains_peering_bit/left_side = 0 +11:4/0/terrains_peering_bit/top_left_corner = 2 +11:4/0/terrains_peering_bit/top_side = 0 +11:4/0/terrains_peering_bit/top_right_corner = 0 +0:5/0 = 0 +0:5/0/terrain_set = 0 +0:5/0/terrain = 1 +0:5/0/terrains_peering_bit/right_side = 1 +0:5/0/terrains_peering_bit/bottom_right_corner = 1 +0:5/0/terrains_peering_bit/bottom_side = 1 +0:5/0/terrains_peering_bit/bottom_left_corner = 1 +0:5/0/terrains_peering_bit/left_side = 1 +0:5/0/terrains_peering_bit/top_left_corner = 1 +0:5/0/terrains_peering_bit/top_side = 1 +0:5/0/terrains_peering_bit/top_right_corner = 1 +1:5/0 = 0 +1:5/0/terrain_set = 0 +1:5/0/terrain = 1 +1:5/0/terrains_peering_bit/right_side = 1 +1:5/0/terrains_peering_bit/bottom_right_corner = 2 +1:5/0/terrains_peering_bit/bottom_side = 2 +1:5/0/terrains_peering_bit/bottom_left_corner = 2 +1:5/0/terrains_peering_bit/left_side = 2 +1:5/0/terrains_peering_bit/top_left_corner = 2 +1:5/0/terrains_peering_bit/top_side = 1 +1:5/0/terrains_peering_bit/top_right_corner = 1 +2:5/0 = 0 +2:5/0/terrain_set = 0 +2:5/0/terrain = 1 +2:5/0/terrains_peering_bit/right_side = 1 +2:5/0/terrains_peering_bit/bottom_right_corner = 2 +2:5/0/terrains_peering_bit/bottom_side = 2 +2:5/0/terrains_peering_bit/bottom_left_corner = 2 +2:5/0/terrains_peering_bit/left_side = 1 +2:5/0/terrains_peering_bit/top_left_corner = 1 +2:5/0/terrains_peering_bit/top_side = 1 +2:5/0/terrains_peering_bit/top_right_corner = 1 +3:5/0 = 0 +3:5/0/terrain_set = 0 +3:5/0/terrain = 1 +3:5/0/terrains_peering_bit/right_side = 2 +3:5/0/terrains_peering_bit/bottom_right_corner = 2 +3:5/0/terrains_peering_bit/bottom_side = 2 +3:5/0/terrains_peering_bit/bottom_left_corner = 2 +3:5/0/terrains_peering_bit/left_side = 1 +3:5/0/terrains_peering_bit/top_left_corner = 1 +3:5/0/terrains_peering_bit/top_side = 1 +3:5/0/terrains_peering_bit/top_right_corner = 2 +4:5/0 = 0 +4:5/0/terrain_set = 0 +4:5/0/terrain = 1 +4:5/0/terrains_peering_bit/right_side = 2 +4:5/0/terrains_peering_bit/bottom_right_corner = 2 +4:5/0/terrains_peering_bit/bottom_side = 2 +4:5/0/terrains_peering_bit/bottom_left_corner = 2 +4:5/0/terrains_peering_bit/left_side = 2 +4:5/0/terrains_peering_bit/top_left_corner = 2 +4:5/0/terrains_peering_bit/top_side = 2 +4:5/0/terrains_peering_bit/top_right_corner = 2 +5:5/0 = 0 +5:5/0/terrain_set = 0 +5:5/0/terrain = 2 +5:5/0/terrains_peering_bit/right_side = 2 +5:5/0/terrains_peering_bit/bottom_right_corner = 2 +5:5/0/terrains_peering_bit/bottom_side = 2 +5:5/0/terrains_peering_bit/bottom_left_corner = 2 +5:5/0/terrains_peering_bit/left_side = 2 +5:5/0/terrains_peering_bit/top_left_corner = 2 +5:5/0/terrains_peering_bit/top_side = 2 +5:5/0/terrains_peering_bit/top_right_corner = 2 +6:5/0 = 0 +6:5/0/terrain_set = 0 +6:5/0/terrain = 0 +6:5/0/terrains_peering_bit/right_side = 0 +6:5/0/terrains_peering_bit/bottom_right_corner = 0 +6:5/0/terrains_peering_bit/bottom_side = 0 +6:5/0/terrains_peering_bit/bottom_left_corner = 0 +6:5/0/terrains_peering_bit/left_side = 0 +6:5/0/terrains_peering_bit/top_left_corner = 0 +6:5/0/terrains_peering_bit/top_side = 0 +6:5/0/terrains_peering_bit/top_right_corner = 0 +7:5/0 = 0 +7:5/0/terrain_set = 0 +7:5/0/terrain = 0 +7:5/0/terrains_peering_bit/right_side = 0 +7:5/0/terrains_peering_bit/bottom_right_corner = 2 +7:5/0/terrains_peering_bit/bottom_side = 2 +7:5/0/terrains_peering_bit/bottom_left_corner = 2 +7:5/0/terrains_peering_bit/left_side = 2 +7:5/0/terrains_peering_bit/top_left_corner = 2 +7:5/0/terrains_peering_bit/top_side = 0 +7:5/0/terrains_peering_bit/top_right_corner = 0 +8:5/0 = 0 +8:5/0/terrain_set = 0 +8:5/0/terrain = 0 +8:5/0/terrains_peering_bit/right_side = 0 +8:5/0/terrains_peering_bit/bottom_right_corner = 2 +8:5/0/terrains_peering_bit/bottom_side = 2 +8:5/0/terrains_peering_bit/bottom_left_corner = 2 +8:5/0/terrains_peering_bit/left_side = 0 +8:5/0/terrains_peering_bit/top_left_corner = 0 +8:5/0/terrains_peering_bit/top_side = 0 +8:5/0/terrains_peering_bit/top_right_corner = 0 +9:5/0 = 0 +9:5/0/terrain_set = 0 +9:5/0/terrain = 0 +9:5/0/terrains_peering_bit/right_side = 2 +9:5/0/terrains_peering_bit/bottom_right_corner = 2 +9:5/0/terrains_peering_bit/bottom_side = 2 +9:5/0/terrains_peering_bit/bottom_left_corner = 2 +9:5/0/terrains_peering_bit/left_side = 0 +9:5/0/terrains_peering_bit/top_left_corner = 0 +9:5/0/terrains_peering_bit/top_side = 0 +9:5/0/terrains_peering_bit/top_right_corner = 2 +10:5/0 = 0 +10:5/0/terrain_set = 0 +10:5/0/terrain = 0 +10:5/0/terrains_peering_bit/right_side = 2 +10:5/0/terrains_peering_bit/bottom_right_corner = 2 +10:5/0/terrains_peering_bit/bottom_side = 2 +10:5/0/terrains_peering_bit/bottom_left_corner = 2 +10:5/0/terrains_peering_bit/left_side = 2 +10:5/0/terrains_peering_bit/top_left_corner = 2 +10:5/0/terrains_peering_bit/top_side = 2 +10:5/0/terrains_peering_bit/top_right_corner = 2 +11:5/0 = 0 +11:5/0/terrain_set = 0 +11:5/0/terrain = 2 +11:5/0/terrains_peering_bit/right_side = 2 +11:5/0/terrains_peering_bit/bottom_right_corner = 2 +11:5/0/terrains_peering_bit/bottom_side = 2 +11:5/0/terrains_peering_bit/bottom_left_corner = 2 +11:5/0/terrains_peering_bit/left_side = 2 +11:5/0/terrains_peering_bit/top_left_corner = 2 +11:5/0/terrains_peering_bit/top_side = 2 +11:5/0/terrains_peering_bit/top_right_corner = 2 +0:6/0 = 0 +0:6/0/terrain_set = 0 +0:6/0/terrain = 1 +0:6/0/terrains_peering_bit/right_side = 1 +0:6/0/terrains_peering_bit/bottom_right_corner = 1 +0:6/0/terrains_peering_bit/bottom_side = 1 +0:6/0/terrains_peering_bit/bottom_left_corner = 1 +0:6/0/terrains_peering_bit/left_side = 1 +0:6/0/terrains_peering_bit/top_left_corner = 1 +0:6/0/terrains_peering_bit/top_side = 1 +0:6/0/terrains_peering_bit/top_right_corner = 1 +1:6/0 = 0 +1:6/0/terrain_set = 0 +1:6/0/terrain = 0 +1:6/0/terrains_peering_bit/right_side = 0 +1:6/0/terrains_peering_bit/bottom_right_corner = 1 +1:6/0/terrains_peering_bit/bottom_side = 0 +1:6/0/terrains_peering_bit/bottom_left_corner = 1 +1:6/0/terrains_peering_bit/left_side = 1 +1:6/0/terrains_peering_bit/top_left_corner = 1 +1:6/0/terrains_peering_bit/top_side = 1 +1:6/0/terrains_peering_bit/top_right_corner = 1 +2:6/0 = 0 +2:6/0/terrain_set = 0 +2:6/0/terrain = 0 +2:6/0/terrains_peering_bit/right_side = 0 +2:6/0/terrains_peering_bit/bottom_right_corner = 1 +2:6/0/terrains_peering_bit/bottom_side = 1 +2:6/0/terrains_peering_bit/bottom_left_corner = 1 +2:6/0/terrains_peering_bit/left_side = 0 +2:6/0/terrains_peering_bit/top_left_corner = 1 +2:6/0/terrains_peering_bit/top_side = 1 +2:6/0/terrains_peering_bit/top_right_corner = 1 +3:6/0 = 0 +3:6/0/terrain_set = 0 +3:6/0/terrain = 0 +3:6/0/terrains_peering_bit/right_side = 1 +3:6/0/terrains_peering_bit/bottom_right_corner = 1 +3:6/0/terrains_peering_bit/bottom_side = 0 +3:6/0/terrains_peering_bit/bottom_left_corner = 1 +3:6/0/terrains_peering_bit/left_side = 0 +3:6/0/terrains_peering_bit/top_left_corner = 1 +3:6/0/terrains_peering_bit/top_side = 1 +3:6/0/terrains_peering_bit/top_right_corner = 1 +4:6/0 = 0 +4:6/0/terrain_set = 0 +4:6/0/terrain = 0 +4:6/0/terrains_peering_bit/right_side = 0 +4:6/0/terrains_peering_bit/bottom_right_corner = 1 +4:6/0/terrains_peering_bit/bottom_side = 0 +4:6/0/terrains_peering_bit/bottom_left_corner = 1 +4:6/0/terrains_peering_bit/left_side = 1 +4:6/0/terrains_peering_bit/top_left_corner = 1 +4:6/0/terrains_peering_bit/top_side = 0 +4:6/0/terrains_peering_bit/top_right_corner = 1 +5:6/0 = 0 +5:6/0/terrain_set = 0 +5:6/0/terrain = 0 +5:6/0/terrains_peering_bit/right_side = 1 +5:6/0/terrains_peering_bit/bottom_right_corner = 1 +5:6/0/terrains_peering_bit/bottom_side = 0 +5:6/0/terrains_peering_bit/bottom_left_corner = 1 +5:6/0/terrains_peering_bit/left_side = 0 +5:6/0/terrains_peering_bit/top_left_corner = 1 +5:6/0/terrains_peering_bit/top_side = 0 +5:6/0/terrains_peering_bit/top_right_corner = 1 +6:6/0 = 0 +6:6/0/terrain_set = 0 +6:6/0/terrain = 0 +6:6/0/terrains_peering_bit/right_side = 0 +6:6/0/terrains_peering_bit/bottom_right_corner = 0 +6:6/0/terrains_peering_bit/bottom_side = 0 +6:6/0/terrains_peering_bit/bottom_left_corner = 0 +6:6/0/terrains_peering_bit/left_side = 0 +6:6/0/terrains_peering_bit/top_left_corner = 0 +6:6/0/terrains_peering_bit/top_side = 0 +6:6/0/terrains_peering_bit/top_right_corner = 0 +7:6/0 = 0 +7:6/0/terrain_set = 0 +7:6/0/terrain = 2 +7:6/0/terrains_peering_bit/right_side = 2 +7:6/0/terrains_peering_bit/bottom_right_corner = 0 +7:6/0/terrains_peering_bit/bottom_side = 2 +7:6/0/terrains_peering_bit/bottom_left_corner = 0 +7:6/0/terrains_peering_bit/left_side = 0 +7:6/0/terrains_peering_bit/top_left_corner = 0 +7:6/0/terrains_peering_bit/top_side = 0 +7:6/0/terrains_peering_bit/top_right_corner = 0 +8:6/0 = 0 +8:6/0/terrain_set = 0 +8:6/0/terrain = 2 +8:6/0/terrains_peering_bit/right_side = 2 +8:6/0/terrains_peering_bit/bottom_right_corner = 0 +8:6/0/terrains_peering_bit/bottom_side = 0 +8:6/0/terrains_peering_bit/bottom_left_corner = 0 +8:6/0/terrains_peering_bit/left_side = 2 +8:6/0/terrains_peering_bit/top_left_corner = 0 +8:6/0/terrains_peering_bit/top_side = 0 +8:6/0/terrains_peering_bit/top_right_corner = 0 +9:6/0 = 0 +9:6/0/terrain_set = 0 +9:6/0/terrain = 2 +9:6/0/terrains_peering_bit/right_side = 0 +9:6/0/terrains_peering_bit/bottom_right_corner = 0 +9:6/0/terrains_peering_bit/bottom_side = 2 +9:6/0/terrains_peering_bit/bottom_left_corner = 0 +9:6/0/terrains_peering_bit/left_side = 2 +9:6/0/terrains_peering_bit/top_left_corner = 0 +9:6/0/terrains_peering_bit/top_side = 0 +9:6/0/terrains_peering_bit/top_right_corner = 0 +10:6/0 = 0 +10:6/0/terrain_set = 0 +10:6/0/terrain = 2 +10:6/0/terrains_peering_bit/right_side = 2 +10:6/0/terrains_peering_bit/bottom_right_corner = 0 +10:6/0/terrains_peering_bit/bottom_side = 2 +10:6/0/terrains_peering_bit/bottom_left_corner = 0 +10:6/0/terrains_peering_bit/left_side = 0 +10:6/0/terrains_peering_bit/top_left_corner = 0 +10:6/0/terrains_peering_bit/top_side = 2 +10:6/0/terrains_peering_bit/top_right_corner = 0 +11:6/0 = 0 +11:6/0/terrain_set = 0 +11:6/0/terrain = 2 +11:6/0/terrains_peering_bit/right_side = 0 +11:6/0/terrains_peering_bit/bottom_right_corner = 0 +11:6/0/terrains_peering_bit/bottom_side = 2 +11:6/0/terrains_peering_bit/bottom_left_corner = 0 +11:6/0/terrains_peering_bit/left_side = 2 +11:6/0/terrains_peering_bit/top_left_corner = 0 +11:6/0/terrains_peering_bit/top_side = 2 +11:6/0/terrains_peering_bit/top_right_corner = 0 +0:7/0 = 0 +0:7/0/terrain_set = 0 +0:7/0/terrain = 1 +0:7/0/terrains_peering_bit/right_side = 1 +0:7/0/terrains_peering_bit/bottom_right_corner = 1 +0:7/0/terrains_peering_bit/bottom_side = 1 +0:7/0/terrains_peering_bit/bottom_left_corner = 1 +0:7/0/terrains_peering_bit/left_side = 1 +0:7/0/terrains_peering_bit/top_left_corner = 1 +0:7/0/terrains_peering_bit/top_side = 1 +0:7/0/terrains_peering_bit/top_right_corner = 1 +1:7/0 = 0 +1:7/0/terrain_set = 0 +1:7/0/terrain = 0 +1:7/0/terrains_peering_bit/right_side = 1 +1:7/0/terrains_peering_bit/bottom_right_corner = 1 +1:7/0/terrains_peering_bit/bottom_side = 0 +1:7/0/terrains_peering_bit/bottom_left_corner = 1 +1:7/0/terrains_peering_bit/left_side = 1 +1:7/0/terrains_peering_bit/top_left_corner = 1 +1:7/0/terrains_peering_bit/top_side = 0 +1:7/0/terrains_peering_bit/top_right_corner = 1 +2:7/0 = 0 +2:7/0/terrain_set = 0 +2:7/0/terrain = 0 +2:7/0/terrains_peering_bit/right_side = 0 +2:7/0/terrains_peering_bit/bottom_right_corner = 1 +2:7/0/terrains_peering_bit/bottom_side = 0 +2:7/0/terrains_peering_bit/bottom_left_corner = 1 +2:7/0/terrains_peering_bit/left_side = 0 +2:7/0/terrains_peering_bit/top_left_corner = 1 +2:7/0/terrains_peering_bit/top_side = 0 +2:7/0/terrains_peering_bit/top_right_corner = 1 +3:7/0 = 0 +3:7/0/terrain_set = 0 +3:7/0/terrain = 0 +3:7/0/terrains_peering_bit/right_side = 1 +3:7/0/terrains_peering_bit/bottom_right_corner = 1 +3:7/0/terrains_peering_bit/bottom_side = 0 +3:7/0/terrains_peering_bit/bottom_left_corner = 1 +3:7/0/terrains_peering_bit/left_side = 1 +3:7/0/terrains_peering_bit/top_left_corner = 1 +3:7/0/terrains_peering_bit/top_side = 0 +3:7/0/terrains_peering_bit/top_right_corner = 1 +4:7/0 = 0 +4:7/0/terrain_set = 0 +4:7/0/terrain = 0 +4:7/0/terrains_peering_bit/right_side = 0 +4:7/0/terrains_peering_bit/bottom_right_corner = 1 +4:7/0/terrains_peering_bit/bottom_side = 0 +4:7/0/terrains_peering_bit/bottom_left_corner = 1 +4:7/0/terrains_peering_bit/left_side = 0 +4:7/0/terrains_peering_bit/top_left_corner = 1 +4:7/0/terrains_peering_bit/top_side = 1 +4:7/0/terrains_peering_bit/top_right_corner = 1 +5:7/0 = 0 +5:7/0/terrain_set = 0 +5:7/0/terrain = 0 +5:7/0/terrains_peering_bit/right_side = 0 +5:7/0/terrains_peering_bit/bottom_right_corner = 1 +5:7/0/terrains_peering_bit/bottom_side = 1 +5:7/0/terrains_peering_bit/bottom_left_corner = 1 +5:7/0/terrains_peering_bit/left_side = 0 +5:7/0/terrains_peering_bit/top_left_corner = 1 +5:7/0/terrains_peering_bit/top_side = 0 +5:7/0/terrains_peering_bit/top_right_corner = 1 +6:7/0 = 0 +6:7/0/terrain_set = 0 +6:7/0/terrain = 0 +6:7/0/terrains_peering_bit/right_side = 0 +6:7/0/terrains_peering_bit/bottom_right_corner = 0 +6:7/0/terrains_peering_bit/bottom_side = 0 +6:7/0/terrains_peering_bit/bottom_left_corner = 0 +6:7/0/terrains_peering_bit/left_side = 0 +6:7/0/terrains_peering_bit/top_left_corner = 0 +6:7/0/terrains_peering_bit/top_side = 0 +6:7/0/terrains_peering_bit/top_right_corner = 0 +7:7/0 = 0 +7:7/0/terrain_set = 0 +7:7/0/terrain = 2 +7:7/0/terrains_peering_bit/right_side = 0 +7:7/0/terrains_peering_bit/bottom_right_corner = 0 +7:7/0/terrains_peering_bit/bottom_side = 2 +7:7/0/terrains_peering_bit/bottom_left_corner = 0 +7:7/0/terrains_peering_bit/left_side = 0 +7:7/0/terrains_peering_bit/top_left_corner = 0 +7:7/0/terrains_peering_bit/top_side = 2 +7:7/0/terrains_peering_bit/top_right_corner = 0 +8:7/0 = 0 +8:7/0/terrain_set = 0 +8:7/0/terrain = 2 +8:7/0/terrains_peering_bit/right_side = 2 +8:7/0/terrains_peering_bit/bottom_right_corner = 0 +8:7/0/terrains_peering_bit/bottom_side = 2 +8:7/0/terrains_peering_bit/bottom_left_corner = 0 +8:7/0/terrains_peering_bit/left_side = 2 +8:7/0/terrains_peering_bit/top_left_corner = 0 +8:7/0/terrains_peering_bit/top_side = 2 +8:7/0/terrains_peering_bit/top_right_corner = 0 +9:7/0 = 0 +9:7/0/terrain_set = 0 +9:7/0/terrain = 2 +9:7/0/terrains_peering_bit/right_side = 0 +9:7/0/terrains_peering_bit/bottom_right_corner = 0 +9:7/0/terrains_peering_bit/bottom_side = 2 +9:7/0/terrains_peering_bit/bottom_left_corner = 0 +9:7/0/terrains_peering_bit/left_side = 0 +9:7/0/terrains_peering_bit/top_left_corner = 0 +9:7/0/terrains_peering_bit/top_side = 2 +9:7/0/terrains_peering_bit/top_right_corner = 0 +10:7/0 = 0 +10:7/0/terrain_set = 0 +10:7/0/terrain = 2 +10:7/0/terrains_peering_bit/right_side = 2 +10:7/0/terrains_peering_bit/bottom_right_corner = 0 +10:7/0/terrains_peering_bit/bottom_side = 2 +10:7/0/terrains_peering_bit/bottom_left_corner = 0 +10:7/0/terrains_peering_bit/left_side = 2 +10:7/0/terrains_peering_bit/top_left_corner = 0 +10:7/0/terrains_peering_bit/top_side = 0 +10:7/0/terrains_peering_bit/top_right_corner = 0 +11:7/0 = 0 +11:7/0/terrain_set = 0 +11:7/0/terrain = 2 +11:7/0/terrains_peering_bit/right_side = 2 +11:7/0/terrains_peering_bit/bottom_right_corner = 0 +11:7/0/terrains_peering_bit/bottom_side = 0 +11:7/0/terrains_peering_bit/bottom_left_corner = 0 +11:7/0/terrains_peering_bit/left_side = 2 +11:7/0/terrains_peering_bit/top_left_corner = 0 +11:7/0/terrains_peering_bit/top_side = 2 +11:7/0/terrains_peering_bit/top_right_corner = 0 +0:8/0 = 0 +0:8/0/terrain_set = 0 +0:8/0/terrain = 1 +0:8/0/terrains_peering_bit/right_side = 1 +0:8/0/terrains_peering_bit/bottom_right_corner = 1 +0:8/0/terrains_peering_bit/bottom_side = 1 +0:8/0/terrains_peering_bit/bottom_left_corner = 1 +0:8/0/terrains_peering_bit/left_side = 1 +0:8/0/terrains_peering_bit/top_left_corner = 1 +0:8/0/terrains_peering_bit/top_side = 1 +0:8/0/terrains_peering_bit/top_right_corner = 1 +1:8/0 = 0 +1:8/0/terrain_set = 0 +1:8/0/terrain = 0 +1:8/0/terrains_peering_bit/right_side = 0 +1:8/0/terrains_peering_bit/bottom_right_corner = 1 +1:8/0/terrains_peering_bit/bottom_side = 1 +1:8/0/terrains_peering_bit/bottom_left_corner = 1 +1:8/0/terrains_peering_bit/left_side = 1 +1:8/0/terrains_peering_bit/top_left_corner = 1 +1:8/0/terrains_peering_bit/top_side = 0 +1:8/0/terrains_peering_bit/top_right_corner = 1 +2:8/0 = 0 +2:8/0/terrain_set = 0 +2:8/0/terrain = 0 +2:8/0/terrains_peering_bit/right_side = 0 +2:8/0/terrains_peering_bit/bottom_right_corner = 1 +2:8/0/terrains_peering_bit/bottom_side = 1 +2:8/0/terrains_peering_bit/bottom_left_corner = 1 +2:8/0/terrains_peering_bit/left_side = 0 +2:8/0/terrains_peering_bit/top_left_corner = 1 +2:8/0/terrains_peering_bit/top_side = 1 +2:8/0/terrains_peering_bit/top_right_corner = 1 +3:8/0 = 0 +3:8/0/terrain_set = 0 +3:8/0/terrain = 0 +3:8/0/terrains_peering_bit/right_side = 1 +3:8/0/terrains_peering_bit/bottom_right_corner = 1 +3:8/0/terrains_peering_bit/bottom_side = 1 +3:8/0/terrains_peering_bit/bottom_left_corner = 1 +3:8/0/terrains_peering_bit/left_side = 0 +3:8/0/terrains_peering_bit/top_left_corner = 1 +3:8/0/terrains_peering_bit/top_side = 0 +3:8/0/terrains_peering_bit/top_right_corner = 1 +4:8/0 = 0 +4:8/0/terrain_set = 0 +4:8/0/terrain = 0 +4:8/0/terrains_peering_bit/right_side = 1 +4:8/0/terrains_peering_bit/bottom_right_corner = 1 +4:8/0/terrains_peering_bit/bottom_side = 0 +4:8/0/terrains_peering_bit/bottom_left_corner = 1 +4:8/0/terrains_peering_bit/left_side = 1 +4:8/0/terrains_peering_bit/top_left_corner = 1 +4:8/0/terrains_peering_bit/top_side = 1 +4:8/0/terrains_peering_bit/top_right_corner = 1 +5:8/0 = 0 +5:8/0/terrain_set = 0 +5:8/0/terrain = 0 +5:8/0/terrains_peering_bit/right_side = 0 +5:8/0/terrains_peering_bit/bottom_right_corner = 1 +5:8/0/terrains_peering_bit/bottom_side = 1 +5:8/0/terrains_peering_bit/bottom_left_corner = 1 +5:8/0/terrains_peering_bit/left_side = 1 +5:8/0/terrains_peering_bit/top_left_corner = 1 +5:8/0/terrains_peering_bit/top_side = 1 +5:8/0/terrains_peering_bit/top_right_corner = 1 +6:8/0 = 0 +6:8/0/terrain_set = 0 +6:8/0/terrain = 0 +6:8/0/terrains_peering_bit/right_side = 0 +6:8/0/terrains_peering_bit/bottom_right_corner = 0 +6:8/0/terrains_peering_bit/bottom_side = 0 +6:8/0/terrains_peering_bit/bottom_left_corner = 0 +6:8/0/terrains_peering_bit/left_side = 0 +6:8/0/terrains_peering_bit/top_left_corner = 0 +6:8/0/terrains_peering_bit/top_side = 0 +6:8/0/terrains_peering_bit/top_right_corner = 0 +7:8/0 = 0 +7:8/0/terrain_set = 0 +7:8/0/terrain = 2 +7:8/0/terrains_peering_bit/right_side = 2 +7:8/0/terrains_peering_bit/bottom_right_corner = 0 +7:8/0/terrains_peering_bit/bottom_side = 0 +7:8/0/terrains_peering_bit/bottom_left_corner = 0 +7:8/0/terrains_peering_bit/left_side = 0 +7:8/0/terrains_peering_bit/top_left_corner = 0 +7:8/0/terrains_peering_bit/top_side = 2 +7:8/0/terrains_peering_bit/top_right_corner = 0 +8:8/0 = 0 +8:8/0/terrain_set = 0 +8:8/0/terrain = 2 +8:8/0/terrains_peering_bit/right_side = 2 +8:8/0/terrains_peering_bit/bottom_right_corner = 0 +8:8/0/terrains_peering_bit/bottom_side = 0 +8:8/0/terrains_peering_bit/bottom_left_corner = 0 +8:8/0/terrains_peering_bit/left_side = 2 +8:8/0/terrains_peering_bit/top_left_corner = 0 +8:8/0/terrains_peering_bit/top_side = 0 +8:8/0/terrains_peering_bit/top_right_corner = 0 +9:8/0 = 0 +9:8/0/terrain_set = 0 +9:8/0/terrain = 2 +9:8/0/terrains_peering_bit/right_side = 0 +9:8/0/terrains_peering_bit/bottom_right_corner = 0 +9:8/0/terrains_peering_bit/bottom_side = 0 +9:8/0/terrains_peering_bit/bottom_left_corner = 0 +9:8/0/terrains_peering_bit/left_side = 2 +9:8/0/terrains_peering_bit/top_left_corner = 0 +9:8/0/terrains_peering_bit/top_side = 2 +9:8/0/terrains_peering_bit/top_right_corner = 0 +10:8/0 = 0 +10:8/0/terrain_set = 0 +10:8/0/terrain = 2 +10:8/0/terrains_peering_bit/right_side = 0 +10:8/0/terrains_peering_bit/bottom_right_corner = 0 +10:8/0/terrains_peering_bit/bottom_side = 2 +10:8/0/terrains_peering_bit/bottom_left_corner = 0 +10:8/0/terrains_peering_bit/left_side = 0 +10:8/0/terrains_peering_bit/top_left_corner = 0 +10:8/0/terrains_peering_bit/top_side = 0 +10:8/0/terrains_peering_bit/top_right_corner = 0 +11:8/0 = 0 +11:8/0/terrain_set = 0 +11:8/0/terrain = 2 +11:8/0/terrains_peering_bit/right_side = 2 +11:8/0/terrains_peering_bit/bottom_right_corner = 0 +11:8/0/terrains_peering_bit/bottom_side = 0 +11:8/0/terrains_peering_bit/bottom_left_corner = 0 +11:8/0/terrains_peering_bit/left_side = 0 +11:8/0/terrains_peering_bit/top_left_corner = 0 +11:8/0/terrains_peering_bit/top_side = 0 +11:8/0/terrains_peering_bit/top_right_corner = 0 +0:9/0 = 0 +0:9/0/terrain_set = 0 +0:9/0/terrain = 1 +0:9/0/terrains_peering_bit/right_side = 1 +0:9/0/terrains_peering_bit/bottom_right_corner = 1 +0:9/0/terrains_peering_bit/bottom_side = 1 +0:9/0/terrains_peering_bit/bottom_left_corner = 1 +0:9/0/terrains_peering_bit/left_side = 1 +0:9/0/terrains_peering_bit/top_left_corner = 1 +0:9/0/terrains_peering_bit/top_side = 1 +0:9/0/terrains_peering_bit/top_right_corner = 1 +1:9/0 = 0 +1:9/0/terrain_set = 0 +1:9/0/terrain = 1 +1:9/0/terrains_peering_bit/right_side = 1 +1:9/0/terrains_peering_bit/bottom_right_corner = 1 +1:9/0/terrains_peering_bit/bottom_side = 1 +1:9/0/terrains_peering_bit/bottom_left_corner = 1 +1:9/0/terrains_peering_bit/left_side = 1 +1:9/0/terrains_peering_bit/top_left_corner = 1 +1:9/0/terrains_peering_bit/top_side = 1 +1:9/0/terrains_peering_bit/top_right_corner = 1 +2:9/0 = 0 +2:9/0/terrain_set = 0 +2:9/0/terrain = 1 +2:9/0/terrains_peering_bit/right_side = 1 +2:9/0/terrains_peering_bit/bottom_right_corner = 1 +2:9/0/terrains_peering_bit/bottom_side = 1 +2:9/0/terrains_peering_bit/bottom_left_corner = 1 +2:9/0/terrains_peering_bit/left_side = 1 +2:9/0/terrains_peering_bit/top_left_corner = 1 +2:9/0/terrains_peering_bit/top_side = 1 +2:9/0/terrains_peering_bit/top_right_corner = 1 +3:9/0 = 0 +3:9/0/terrain_set = 0 +3:9/0/terrain = 0 +3:9/0/terrains_peering_bit/right_side = 1 +3:9/0/terrains_peering_bit/bottom_right_corner = 1 +3:9/0/terrains_peering_bit/bottom_side = 1 +3:9/0/terrains_peering_bit/bottom_left_corner = 1 +3:9/0/terrains_peering_bit/left_side = 1 +3:9/0/terrains_peering_bit/top_left_corner = 1 +3:9/0/terrains_peering_bit/top_side = 1 +3:9/0/terrains_peering_bit/top_right_corner = 1 +4:9/0 = 0 +4:9/0/terrain_set = 0 +4:9/0/terrain = 0 +4:9/0/terrains_peering_bit/right_side = 1 +4:9/0/terrains_peering_bit/bottom_right_corner = 1 +4:9/0/terrains_peering_bit/bottom_side = 1 +4:9/0/terrains_peering_bit/bottom_left_corner = 1 +4:9/0/terrains_peering_bit/left_side = 1 +4:9/0/terrains_peering_bit/top_left_corner = 1 +4:9/0/terrains_peering_bit/top_side = 0 +4:9/0/terrains_peering_bit/top_right_corner = 1 +5:9/0 = 0 +5:9/0/terrain_set = 0 +5:9/0/terrain = 0 +5:9/0/terrains_peering_bit/right_side = 1 +5:9/0/terrains_peering_bit/bottom_right_corner = 1 +5:9/0/terrains_peering_bit/bottom_side = 1 +5:9/0/terrains_peering_bit/bottom_left_corner = 1 +5:9/0/terrains_peering_bit/left_side = 0 +5:9/0/terrains_peering_bit/top_left_corner = 1 +5:9/0/terrains_peering_bit/top_side = 1 +5:9/0/terrains_peering_bit/top_right_corner = 1 +6:9/0 = 0 +6:9/0/terrain_set = 0 +6:9/0/terrain = 0 +6:9/0/terrains_peering_bit/right_side = 0 +6:9/0/terrains_peering_bit/bottom_right_corner = 0 +6:9/0/terrains_peering_bit/bottom_side = 0 +6:9/0/terrains_peering_bit/bottom_left_corner = 0 +6:9/0/terrains_peering_bit/left_side = 0 +6:9/0/terrains_peering_bit/top_left_corner = 0 +6:9/0/terrains_peering_bit/top_side = 0 +6:9/0/terrains_peering_bit/top_right_corner = 0 +7:9/0 = 0 +7:9/0/terrain_set = 0 +7:9/0/terrain = 0 +7:9/0/terrains_peering_bit/right_side = 0 +7:9/0/terrains_peering_bit/bottom_right_corner = 0 +7:9/0/terrains_peering_bit/bottom_side = 0 +7:9/0/terrains_peering_bit/bottom_left_corner = 0 +7:9/0/terrains_peering_bit/left_side = 0 +7:9/0/terrains_peering_bit/top_left_corner = 0 +7:9/0/terrains_peering_bit/top_side = 0 +7:9/0/terrains_peering_bit/top_right_corner = 0 +8:9/0 = 0 +8:9/0/terrain_set = 0 +8:9/0/terrain = 0 +8:9/0/terrains_peering_bit/right_side = 0 +8:9/0/terrains_peering_bit/bottom_right_corner = 0 +8:9/0/terrains_peering_bit/bottom_side = 0 +8:9/0/terrains_peering_bit/bottom_left_corner = 0 +8:9/0/terrains_peering_bit/left_side = 0 +8:9/0/terrains_peering_bit/top_left_corner = 0 +8:9/0/terrains_peering_bit/top_side = 0 +8:9/0/terrains_peering_bit/top_right_corner = 0 +9:9/0 = 0 +9:9/0/terrain_set = 0 +9:9/0/terrain = 0 +9:9/0/terrains_peering_bit/right_side = 0 +9:9/0/terrains_peering_bit/bottom_right_corner = 0 +9:9/0/terrains_peering_bit/bottom_side = 0 +9:9/0/terrains_peering_bit/bottom_left_corner = 0 +9:9/0/terrains_peering_bit/left_side = 0 +9:9/0/terrains_peering_bit/top_left_corner = 0 +9:9/0/terrains_peering_bit/top_side = 0 +9:9/0/terrains_peering_bit/top_right_corner = 0 +10:9/0 = 0 +10:9/0/terrain_set = 0 +10:9/0/terrain = 2 +10:9/0/terrains_peering_bit/right_side = 0 +10:9/0/terrains_peering_bit/bottom_right_corner = 0 +10:9/0/terrains_peering_bit/bottom_side = 0 +10:9/0/terrains_peering_bit/bottom_left_corner = 0 +10:9/0/terrains_peering_bit/left_side = 0 +10:9/0/terrains_peering_bit/top_left_corner = 0 +10:9/0/terrains_peering_bit/top_side = 2 +10:9/0/terrains_peering_bit/top_right_corner = 0 +11:9/0 = 0 +11:9/0/terrain_set = 0 +11:9/0/terrain = 2 +11:9/0/terrains_peering_bit/right_side = 0 +11:9/0/terrains_peering_bit/bottom_right_corner = 0 +11:9/0/terrains_peering_bit/bottom_side = 0 +11:9/0/terrains_peering_bit/bottom_left_corner = 0 +11:9/0/terrains_peering_bit/left_side = 2 +11:9/0/terrains_peering_bit/top_left_corner = 0 +11:9/0/terrains_peering_bit/top_side = 0 +11:9/0/terrains_peering_bit/top_right_corner = 0 + +[resource] +terrain_set_0/mode = 0 +terrain_set_0/terrain_0/name = "Dirt" +terrain_set_0/terrain_0/color = Color(0.5, 0.34375, 0.25, 1) +terrain_set_0/terrain_1/name = "Grass" +terrain_set_0/terrain_1/color = Color(0.310093, 0.500492, 0.235633, 1) +terrain_set_0/terrain_2/name = "Water" +terrain_set_0/terrain_2/color = Color(0.219042, 0.405193, 1, 1) +sources/0 = SubResource("TileSetAtlasSource_xm183") diff --git a/addons/wfc/examples/assets/kenney-pixel-shmup/tiles_packed.png b/addons/wfc/examples/assets/kenney-pixel-shmup/tiles_packed.png new file mode 100644 index 0000000000000000000000000000000000000000..20b6292ae5ce32d64655b6ce2862170460a9594a GIT binary patch literal 3759 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 xNG?IabE#_Tn?uJTvl0`afd!%Vz)p literal 0 HcmV?d00001 diff --git a/addons/wfc/examples/assets/kenney-pixel-shmup/tiles_packed.png.import b/addons/wfc/examples/assets/kenney-pixel-shmup/tiles_packed.png.import new file mode 100644 index 0000000..8c38755 --- /dev/null +++ b/addons/wfc/examples/assets/kenney-pixel-shmup/tiles_packed.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmph00k1t22u5" +path="res://.godot/imported/tiles_packed.png-f6443080012acbd45f60f7cb06dacf7b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/wfc/examples/assets/kenney-pixel-shmup/tiles_packed.png" +dest_files=["res://.godot/imported/tiles_packed.png-f6443080012acbd45f60f7cb06dacf7b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/wfc/examples/assets/kenney-tiny-dungeon/tile-set-decorations.tres b/addons/wfc/examples/assets/kenney-tiny-dungeon/tile-set-decorations.tres index b95ae0e..db8b499 100644 --- a/addons/wfc/examples/assets/kenney-tiny-dungeon/tile-set-decorations.tres +++ b/addons/wfc/examples/assets/kenney-tiny-dungeon/tile-set-decorations.tres @@ -10,16 +10,52 @@ texture = ExtResource("1_eqa2d") 7:4/0 = 0 8:4/0 = 0 8:5/0 = 0 +8:5/0/terrain_set = 0 +8:5/0/terrain = 0 +8:5/0/terrains_peering_bit/top_side = 0 7:5/0 = 0 +7:5/0/terrain_set = 0 +7:5/0/terrain = 0 +7:5/0/terrains_peering_bit/bottom_side = 0 6:5/0 = 0 7:6/0 = 0 +7:6/0/terrain_set = 0 +7:6/0/terrain = 0 +7:6/0/terrains_peering_bit/right_side = 0 8:6/0 = 0 +8:6/0/terrain_set = 0 +8:6/0/terrain = 0 +8:6/0/terrains_peering_bit/left_side = 0 9:6/0 = 0 +9:6/0/terrain_set = 0 +9:6/0/terrain = 0 +9:6/0/terrains_peering_bit/bottom_side = 0 +9:6/0/terrains_peering_bit/top_side = 0 9:5/0 = 0 +9:5/0/terrain_set = 0 +9:5/0/terrain = 0 +9:5/0/terrains_peering_bit/right_side = 0 +9:5/0/terrains_peering_bit/bottom_side = 0 10:5/0 = 0 +10:5/0/terrain_set = 0 +10:5/0/terrain = 0 +10:5/0/terrains_peering_bit/right_side = 0 +10:5/0/terrains_peering_bit/left_side = 0 11:5/0 = 0 +11:5/0/terrain_set = 0 +11:5/0/terrain = 0 +11:5/0/terrains_peering_bit/bottom_side = 0 +11:5/0/terrains_peering_bit/left_side = 0 11:7/0 = 0 +11:7/0/terrain_set = 0 +11:7/0/terrain = 0 +11:7/0/terrains_peering_bit/left_side = 0 +11:7/0/terrains_peering_bit/top_side = 0 9:7/0 = 0 +9:7/0/terrain_set = 0 +9:7/0/terrain = 0 +9:7/0/terrains_peering_bit/right_side = 0 +9:7/0/terrains_peering_bit/top_side = 0 10:6/0 = 0 2:6/0 = 0 0:6/0 = 0 @@ -30,4 +66,7 @@ texture = ExtResource("1_eqa2d") 8:7/0 = 0 [resource] +terrain_set_0/mode = 2 +terrain_set_0/terrain_0/name = "Rails" +terrain_set_0/terrain_0/color = Color(1, 0.404642, 0.360349, 1) sources/0 = SubResource("TileSetAtlasSource_t4hvi") diff --git a/addons/wfc/examples/demo_wfc_2d_tilemaplayer_terrain.tscn b/addons/wfc/examples/demo_wfc_2d_tilemaplayer_terrain.tscn new file mode 100644 index 0000000..5b0d8e5 --- /dev/null +++ b/addons/wfc/examples/demo_wfc_2d_tilemaplayer_terrain.tscn @@ -0,0 +1,71 @@ +[gd_scene load_steps=9 format=4 uid="uid://dff7jl20fso08"] + +[ext_resource type="Script" path="res://addons/wfc/nodes/layered_map_2d.gd" id="1_60xrd"] +[ext_resource type="Script" path="res://addons/wfc/problems/2d/mappers/mapper_2d_factory.gd" id="2_ksjcu"] +[ext_resource type="TileSet" uid="uid://bf6ft5mo8umpn" path="res://addons/wfc/examples/assets/kenney-pixel-shmup/tile-set-main.tres" id="3_87shy"] +[ext_resource type="TileSet" uid="uid://drvu3d0pwtf50" path="res://addons/wfc/examples/assets/kenney-tiny-dungeon/tile-set-decorations.tres" id="4_t22ok"] +[ext_resource type="Script" path="res://addons/wfc/nodes/generator_2d.gd" id="5_wpxmk"] +[ext_resource type="PackedScene" uid="uid://dt2nffs32s7o1" path="res://addons/wfc/examples/helpers/progress_indicator.tscn" id="6_qbmmu"] + +[sub_resource type="GDScript" id="GDScript_pxd4v"] +script/source = "extends Node2D + + +func _ready() -> void: + $sample.hide() + $target.show() + $WFC2DGenerator.start() +" + +[sub_resource type="Resource" id="Resource_f7540"] +script = ExtResource("2_ksjcu") + +[node name="Example" type="Node2D"] +script = SubResource("GDScript_pxd4v") + +[node name="sample" type="Node" parent="."] +script = ExtResource("1_60xrd") +mapper_factory = SubResource("Resource_f7540") + +[node name="main" type="TileMapLayer" parent="sample"] +tile_map_data = PackedByteArray("AAAAAAAAAAAAAAMAAAACAAAAAAABAAMAAAAEAAAAAAACAAMAAAAGAAAAAAADAAMAAAAIAAAAAAAEAAMAAAAKAAAAAAAFAAMAAAAMAAAAAAAGAAMAAAAOAAAAAAAHAAMAAAAQAAAAAAAIAAMAAAASAAAAAAAJAAMAAAAUAAAAAAAKAAMAAAAWAAAAAAALAAMAAAAAAAIAAAAAAAQAAAACAAIAAAABAAQAAAAEAAIAAAACAAQAAAAGAAIAAAADAAQAAAAIAAIAAAAEAAQAAAAKAAIAAAAFAAQAAAAMAAIAAAAGAAQAAAAOAAIAAAAHAAQAAAAQAAIAAAAIAAQAAAASAAIAAAAJAAQAAAAUAAIAAAAKAAQAAAAWAAIAAAALAAQAAAAAAAQAAAAAAAUAAAACAAQAAAABAAUAAAAEAAQAAAACAAUAAAAGAAQAAAADAAUAAAAIAAQAAAAEAAUAAAAKAAQAAAAFAAUAAAAMAAQAAAAGAAUAAAAOAAQAAAAHAAUAAAAQAAQAAAAIAAUAAAASAAQAAAAJAAUAAAAUAAQAAAAKAAUAAAAWAAQAAAALAAUAAAAAAAYAAAAAAAYAAAACAAYAAAABAAYAAAAEAAYAAAACAAYAAAAGAAYAAAADAAYAAAAIAAYAAAAEAAYAAAAKAAYAAAAFAAYAAAAMAAYAAAAGAAYAAAAOAAYAAAAHAAYAAAAQAAYAAAAIAAYAAAASAAYAAAAJAAYAAAAUAAYAAAAKAAYAAAAWAAYAAAALAAYAAAAAAAgAAAAAAAcAAAACAAgAAAABAAcAAAAEAAgAAAACAAcAAAAGAAgAAAADAAcAAAAIAAgAAAAEAAcAAAAKAAgAAAAFAAcAAAAMAAgAAAAGAAcAAAAOAAgAAAAHAAcAAAAQAAgAAAAIAAcAAAASAAgAAAAJAAcAAAAUAAgAAAAKAAcAAAAWAAgAAAALAAcAAAAAAAoAAAAAAAgAAAACAAoAAAABAAgAAAAEAAoAAAACAAgAAAAGAAoAAAADAAgAAAAIAAoAAAAEAAgAAAAKAAoAAAAFAAgAAAAMAAoAAAAGAAgAAAAOAAoAAAAHAAgAAAAQAAoAAAAIAAgAAAASAAoAAAAJAAgAAAAUAAoAAAAKAAgAAAAWAAoAAAALAAgAAAAAAAwAAAAAAAkAAAACAAwAAAABAAkAAAAEAAwAAAACAAkAAAAGAAwAAAADAAkAAAAIAAwAAAAEAAkAAAAKAAwAAAAFAAkAAAAMAAwAAAAGAAkAAAAOAAwAAAAHAAkAAAAQAAwAAAAIAAkAAAASAAwAAAAJAAkAAAAUAAwAAAAKAAkAAAAWAAwAAAALAAkAAAAaAAAAAAACAAQAAAAaAAIAAAACAAQAAAAaAAQAAAACAAQAAAAcAAQAAAACAAQAAAAeAAQAAAACAAQAAAAeAAIAAAACAAQAAAAeAAAAAAACAAQAAAAcAAAAAAACAAQAAAAcAAIAAAACAAQAAAAcAAYAAAACAAQAAAAiAAAAAAAIAAQAAAAiAAIAAAAIAAQAAAAiAAQAAAAIAAQAAAAkAAQAAAAIAAQAAAAkAAIAAAAIAAQAAAAmAAIAAAAIAAQAAAAmAAAAAAAIAAQAAAAkAAAAAAAIAAQAAAAmAAQAAAAIAAQAAAAkAAYAAAAIAAQAAAAaAAkAAAACAAQAAAAiAAkAAAAIAAQAAAAkAAkAAAAIAAQAAAAmAAkAAAAIAAQAAAAcAAkAAAACAAQAAAAeAAkAAAACAAQAAAA=") +tile_set = ExtResource("3_87shy") + +[node name="decorations" type="TileMapLayer" parent="sample"] +tile_map_data = PackedByteArray("AAAaAAAAAAAJAAUAAAAcAAAAAAAKAAUAAAAeAAAAAAALAAUAAAAeAAQAAAALAAcAAAAaAAQAAAAJAAcAAAAaAAIAAAAJAAYAAAAcAAIAAAAHAAUAAAAeAAIAAAAIAAUAAAAcAAQAAAAHAAYAAAAcAAYAAAAIAAYAAAAiAAAAAAAJAAUAAAAkAAAAAAAKAAUAAAAmAAAAAAALAAUAAAAiAAIAAAAJAAYAAAAiAAQAAAAJAAcAAAAmAAQAAAALAAcAAAAkAAQAAAAHAAYAAAAkAAYAAAAIAAYAAAAkAAIAAAAHAAUAAAAmAAIAAAAIAAUAAAAaAAkAAAABAAYAAAAiAAkAAAAEAAUAAAAcAAkAAAAFAAcAAAAkAAkAAAAFAAUAAAA=") +tile_set = ExtResource("4_t22ok") + +[node name="target" type="Node" parent="."] +script = ExtResource("1_60xrd") +mapper_factory = SubResource("Resource_f7540") + +[node name="main" type="TileMapLayer" parent="target"] +visible = false +tile_map_data = PackedByteArray("AAAFAAUAAAACAAQAAAAcABwAAAAIAAQAAAAGABsAAAAGAAMAAAAaAAYAAAAGAAMAAAA=") +tile_set = ExtResource("3_87shy") + +[node name="decorations" type="TileMapLayer" parent="target"] +visible = false +tile_map_data = PackedByteArray("AAAFAAUAAAAJAAYAAAAcABwAAAAJAAYAAAA=") +tile_set = ExtResource("4_t22ok") + +[node name="WFC2DGenerator" type="Node" parent="."] +script = ExtResource("5_wpxmk") +target = NodePath("../target") +rect = Rect2i(0, 0, 121, 68) +positive_sample = NodePath("../sample") +render_intermediate_results = true + +[node name="progressIndicator" parent="." node_paths=PackedStringArray("generator") instance=ExtResource("6_qbmmu")] +generator = NodePath("../WFC2DGenerator") + +[node name="RichTextLabel" type="RichTextLabel" parent="."] +offset_left = 20.0 +offset_top = 234.0 +offset_right = 928.0 +offset_bottom = 572.0 +text = "Rules can be learned from tilemap terrain settings. + +In a multi-layer setup, tilesets of all layers should contain at least one terrain set. + +If terrain configuration covers all needed rules, it's enough to just place all tiles that should be placable by WFC in the sample map - as it's done in this example." diff --git a/addons/wfc/problems/2d/mappers/mapper_2d.gd b/addons/wfc/problems/2d/mappers/mapper_2d.gd index 9821a53..a07841d 100644 --- a/addons/wfc/problems/2d/mappers/mapper_2d.gd +++ b/addons/wfc/problems/2d/mappers/mapper_2d.gd @@ -95,3 +95,29 @@ func clear(): ## Return true if this mapper is ready to read/write a map. func is_ready() -> bool: return size() > 0 + +## Values returned by [method get_initial_rule]. +enum InitialRule { + UNKNOWN = 0, + ALLOWWED = 1, + FORBIDDEN = 2, +} + +## Get initial WFC rule for a pair of tiles. +## [br] +## Checks if [param _tile1] and [param _tile2] can be adjacent according to the rules discoverable +## by the mapper itself. +## Returns [member WFCMapper2D.InitialRule.ALLOWED] if they can, +## [member WFCMapper2D.InitialRule.FORBIDDEN] if they cannot and +## [member WFCMapper2D.InitialRule.UNKNOWN] if it's neither explicitly allowed or forbidden. +func get_initial_rule(_tile1: int, _tile2: int, _direction: Vector2i) -> InitialRule: + return InitialRule.UNKNOWN + +## Returns [code]true[/code] if there are some WFC rules discoverable by this mapper. +## I.e. if [method WFCMapper2D.get_initial_rule] doesn't always return +## [member WFCMapper2D.InitialRule.UNKNOWN]. +## [br] +## It may still return [code]true[/code] if [method WFCMapper2D.get_initial_rule] always returns +## [member WFCMapper2D.InitialRule.UNKNOWN]. +func has_initial_rules() -> bool: + return false diff --git a/addons/wfc/problems/2d/mappers/mapper_2d_layered_map.gd b/addons/wfc/problems/2d/mappers/mapper_2d_layered_map.gd index 878eaa8..dc6c30f 100644 --- a/addons/wfc/problems/2d/mappers/mapper_2d_layered_map.gd +++ b/addons/wfc/problems/2d/mappers/mapper_2d_layered_map.gd @@ -189,6 +189,40 @@ func size() -> int: func supports_map(map: Node) -> bool: return map is WFC2DLayeredMap +## @inheritdoc +func get_initial_rule(tile1: int, tile2: int, direction: Vector2i) -> InitialRule: + _ensure_reverse_mapping() + + var result := InitialRule.UNKNOWN + + for layer in range(layer_mappers.size()): + var tile1_layer: int = -1 + var tile2_layer: int = -1 + + if tile1 >= 0: + tile1_layer = id_to_attrs[tile1][layer] + + if tile2 >= 0: + tile2_layer = id_to_attrs[tile2][layer] + + result = max(result, layer_mappers[layer].get_initial_rule(tile1_layer, tile2_layer, direction)) + + if result == InitialRule.FORBIDDEN: + break + + return result + +## @inheritdoc +func has_initial_rules() -> bool: + assert(is_ready()) + + for mapper in layer_mappers: + if not mapper.has_initial_rules(): + return false + + return true + + func clear(): layer_names.clear() layer_mappers.clear() diff --git a/addons/wfc/problems/2d/mappers/mapper_2d_tilemaplayer.gd b/addons/wfc/problems/2d/mappers/mapper_2d_tilemaplayer.gd index 26607fa..6a04038 100644 --- a/addons/wfc/problems/2d/mappers/mapper_2d_tilemaplayer.gd +++ b/addons/wfc/problems/2d/mappers/mapper_2d_tilemaplayer.gd @@ -135,3 +135,146 @@ func read_tile_probability(tile: int) -> float: return _read_builtin_probabilities(tile) return super.read_tile_probability(tile) + +func _check_terrain_adjacency_to_empty( + td: TileData, + edge: TileSet.CellNeighbor, + corner1: TileSet.CellNeighbor, + corner2: TileSet.CellNeighbor, +) -> InitialRule: + if td == null: + return InitialRule.UNKNOWN + + if td.is_valid_terrain_peering_bit(edge) and td.get_terrain_peering_bit(edge) >= 0: + return InitialRule.FORBIDDEN + + if td.is_valid_terrain_peering_bit(corner1) and td.get_terrain_peering_bit(corner1) >= 0: + return InitialRule.FORBIDDEN + + if td.is_valid_terrain_peering_bit(corner2) and td.get_terrain_peering_bit(corner2) >= 0: + return InitialRule.FORBIDDEN + + return InitialRule.UNKNOWN + +## Get a [TileData] for given tile id. +## +## Returns [code]null[/code] if tile is an empty tile ([code]-1[/code]) or the corresponding source +## is not an atlas source. +func _get_tile_data_for(tile: int) -> TileData: + _ensure_reverse_mapping() + + if tile < 0: + return null + + var attrs := id_to_attrs[tile] + var source := tile_set.get_source(attrs.x) as TileSetAtlasSource + + if source == null: + return null + + return source.get_tile_data(Vector2i(attrs.y, attrs.z), attrs.w) + +func _check_terrain_adjacency( + tile1: int, + edge1: TileSet.CellNeighbor, + corner11: TileSet.CellNeighbor, + corner12: TileSet.CellNeighbor, + tile2: int, + edge2: TileSet.CellNeighbor, + corner21: TileSet.CellNeighbor, + corner22: TileSet.CellNeighbor, +) -> InitialRule: + var td1 := _get_tile_data_for(tile1) + var td2 := _get_tile_data_for(tile2) + + if td1 == null: + return _check_terrain_adjacency_to_empty(td2, edge2, corner21, corner22) + + if td2 == null: + return _check_terrain_adjacency_to_empty(td1, edge1, corner11, corner12) + + var ts1 := td1.terrain_set + var ts2 := td2.terrain_set + + if ts1 < 0: + if ts2 < 0: + return InitialRule.UNKNOWN + return _check_terrain_adjacency_to_empty(td2, edge2, corner21, corner22) + + if ts2 < 0: + return _check_terrain_adjacency_to_empty(td1, edge1, corner11, corner12) + + if ts1 != ts2: + # Tiles with different terrain sets can be neighbours if the corresponding edges/corners do + # not have terrain set. + return max( + _check_terrain_adjacency_to_empty(td2, edge2, corner21, corner22), + _check_terrain_adjacency_to_empty(td1, edge1, corner11, corner12) + ) + + var result := InitialRule.UNKNOWN + + if td1.is_valid_terrain_peering_bit(edge1): + var bit := td1.get_terrain_peering_bit(edge1) + if bit != td2.get_terrain_peering_bit(edge2): + return InitialRule.FORBIDDEN + if bit >= 0: + # Allow tile combination if there is at least one matching terrain bit + result = InitialRule.ALLOWWED + + if td1.is_valid_terrain_peering_bit(corner11): + var bit := td1.get_terrain_peering_bit(corner11) + if bit != td2.get_terrain_peering_bit(corner21): + return InitialRule.FORBIDDEN + if bit >= 0: + result = InitialRule.ALLOWWED + + if td1.is_valid_terrain_peering_bit(corner12): + var bit := td1.get_terrain_peering_bit(corner12) + if bit != td2.get_terrain_peering_bit(corner22): + return InitialRule.FORBIDDEN + if bit >= 0: + result = InitialRule.ALLOWWED + + return result + +## @inheritdoc +func get_initial_rule(tile1: int, tile2: int, direction: Vector2i) -> InitialRule: + assert(is_ready()) + + if tile_set.tile_shape == TileSet.TileShape.TILE_SHAPE_SQUARE: + if direction.length_squared() != 1: + return InitialRule.UNKNOWN + if direction.x + direction.y < 0: + return get_initial_rule(tile2, tile1, -direction) + if direction == Vector2i(1, 0): + return _check_terrain_adjacency( + tile1, + TileSet.CELL_NEIGHBOR_RIGHT_SIDE, + TileSet.CELL_NEIGHBOR_TOP_RIGHT_CORNER, + TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER, + tile2, + TileSet.CELL_NEIGHBOR_LEFT_SIDE, + TileSet.CELL_NEIGHBOR_TOP_LEFT_CORNER, + TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_CORNER, + ) + if direction == Vector2i(0, 1): + return _check_terrain_adjacency( + tile1, + TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, + TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_CORNER, + TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER, + tile2, + TileSet.CELL_NEIGHBOR_TOP_SIDE, + TileSet.CELL_NEIGHBOR_TOP_LEFT_CORNER, + TileSet.CELL_NEIGHBOR_TOP_RIGHT_CORNER, + ) + else: + pass # Unsupported tile shape/layout. TODO: Print a warning (but only once)? + + return InitialRule.UNKNOWN + +func has_initial_rules() -> bool: + assert(is_ready()) + + return tile_set.get_terrain_sets_count() > 0 diff --git a/addons/wfc/problems/2d/rules_2d.gd b/addons/wfc/problems/2d/rules_2d.gd index cd52cbe..92913c9 100644 --- a/addons/wfc/problems/2d/rules_2d.gd +++ b/addons/wfc/problems/2d/rules_2d.gd @@ -110,6 +110,16 @@ func _learn_edge_conditions(): if not ed.is_empty(): edge_domain = ed +func _learn_initial_rules(): + for i in range(axes.size()): + var direction := axes[i] + var matrix := axis_matrices[i] + + for tile1 in range(mapper.size()): + for tile2 in range(mapper.size()): + if mapper.get_initial_rule(tile1, tile2, direction) == WFCMapper2D.InitialRule.ALLOWWED: + matrix.set_bit(tile1, tile2) + ## Learn rules from given sample map. ## [br] ## Also learns tile probabilities from [member mapper] (if [member probabilities_enabled] enabled @@ -136,6 +146,9 @@ func learn_from(map: Node): for i in range(axes.size()): axis_matrices.append(WFCBitMatrix.new(num_cell_types, num_cell_types)) + if mapper.has_initial_rules(): + _learn_initial_rules() + _learn_from(map, true) if complete_matrices: