├── .gitignore ├── docs ├── cover.jpeg ├── demo.webm ├── editor.jpeg ├── loading.jpeg └── sockets.jpeg ├── .gitattributes ├── example ├── tilemap_packed.png ├── walker.gd ├── tilemap_packed.png.import ├── wfc_event_watcher.gd ├── main.tscn ├── tileset.tres ├── create_wfc_tile_set.tscn └── wfc_tiles.tres ├── addons └── lommix_infinite_worlds │ ├── resources │ ├── wfc_preset.gd │ ├── wfc_tile.gd │ └── wfc_tile_set.gd │ ├── plugin.cfg │ ├── singletons │ └── wfc_map_container.gd │ ├── lommix_infinite_worlds.gd │ ├── structs │ └── wfc_cell.gd │ ├── scenes │ ├── wfc_preset_editor.tscn │ ├── wfc_slicer_tab.gd │ ├── wfc_preset_editor.gd │ ├── tile_set_editor.gd │ └── wfc_slicer_tab.tscn │ ├── static │ └── slicer.gd │ └── nodes │ └── wfc_tile_map.gd ├── tree.tscn ├── LICENSE ├── project.godot └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Godot 4+ specific ignores 2 | .godot/ 3 | *.import 4 | -------------------------------------------------------------------------------- /docs/cover.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lommix/infinite_worlds/HEAD/docs/cover.jpeg -------------------------------------------------------------------------------- /docs/demo.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lommix/infinite_worlds/HEAD/docs/demo.webm -------------------------------------------------------------------------------- /docs/editor.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lommix/infinite_worlds/HEAD/docs/editor.jpeg -------------------------------------------------------------------------------- /docs/loading.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lommix/infinite_worlds/HEAD/docs/loading.jpeg -------------------------------------------------------------------------------- /docs/sockets.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lommix/infinite_worlds/HEAD/docs/sockets.jpeg -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Normalize EOL for all files that Git considers text files. 2 | * text=auto eol=lf 3 | -------------------------------------------------------------------------------- /example/tilemap_packed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lommix/infinite_worlds/HEAD/example/tilemap_packed.png -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/resources/wfc_preset.gd: -------------------------------------------------------------------------------- 1 | class_name WfcPreset 2 | extends Resource 3 | 4 | @export var name : String 5 | @export var tiles := {} 6 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/plugin.cfg: -------------------------------------------------------------------------------- 1 | [plugin] 2 | 3 | name="lommix_infinite_worlds" 4 | description="WFC based map generator" 5 | author="Lorenz Mielke" 6 | version="0.9" 7 | script="lommix_infinite_worlds.gd" 8 | -------------------------------------------------------------------------------- /tree.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://d0ope0oyjy3wi"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://bg20v24b02sbj" path="res://example/tilemap_packed.png" id="1_pnbrn"] 4 | 5 | [node name="Node2D" type="Node2D"] 6 | 7 | [node name="tree" type="Sprite2D" parent="."] 8 | position = Vector2(0, -11) 9 | texture = ExtResource("1_pnbrn") 10 | region_enabled = true 11 | region_rect = Rect2(530, 163, 12, 28) 12 | -------------------------------------------------------------------------------- /example/walker.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | 4 | ## This is a demo walker. This Node acts as a center for the infinite generated wave function collapse Tilemap 5 | 6 | 7 | @export var speed : float = 500. 8 | @onready var camera : Camera2D = $Camera2D 9 | 10 | 11 | func _physics_process(delta: float) -> void: 12 | var direction := Vector2( 13 | Input.get_action_strength("right") - Input.get_action_strength("left"), 14 | Input.get_action_strength("down") - Input.get_action_strength("up") 15 | ) 16 | global_position += direction * speed * delta 17 | 18 | 19 | func _input(event: InputEvent) -> void: 20 | if event.is_action("zoom_in"): 21 | camera.zoom *= 1.1 22 | if event.is_action("zoom_out"): 23 | camera.zoom *= 0.9 24 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/singletons/wfc_map_container.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | #---------------------------------- 3 | #signals to extend and interact with 4 | #---------------------------------- 5 | ##called before the final tile is decided [async] 6 | # signal before_collapse(cell: WfcCell) 7 | ##called after the final tile is decided [async] 8 | # signal after_collapse(cell: WfcCell) 9 | ##called on contradiction, a cell has 0 possible outcomes [async] 10 | signal on_contradiction(cell: WfcCell) 11 | #---------------------------------- 12 | ##called when drawing to tilemap [mainthread] 13 | signal on_cell_draw(cell: WfcCell) 14 | #---------------------------------- 15 | #global cell storage 16 | ## key:Vector2i value: WfcCell 17 | var loaded_cell := {} 18 | -------------------------------------------------------------------------------- /example/tilemap_packed.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bg20v24b02sbj" 6 | path="res://.godot/imported/tilemap_packed.png-ebc0baab5209c5d0c9cd62b3f99344ce.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://example/tilemap_packed.png" 14 | dest_files=["res://.godot/imported/tilemap_packed.png-ebc0baab5209c5d0c9cd62b3f99344ce.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /example/wfc_event_watcher.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | 4 | @onready var trees : Node2D = $trees 5 | @onready var houses : TileMap = $houses 6 | 7 | var tree_scene = preload("res://tree.tscn") 8 | 9 | 10 | func _ready() -> void: 11 | wfc_map.on_cell_draw.connect(wfc_draw_event) 12 | pass 13 | 14 | 15 | func wfc_draw_event(cell: WfcCell): 16 | for plot in cell.get_layer_used_tiles("house_plots"): 17 | if randf() < 0.4: 18 | spawn_house_at(plot) 19 | 20 | for plot in cell.get_layer_used_tiles("tree_plots"): 21 | if randf() < 0.4: 22 | spawn_tree_at(plot) 23 | 24 | 25 | func spawn_tree_at(pos : Vector2): 26 | var tree = tree_scene.instantiate() 27 | tree.global_position = pos 28 | trees.add_child(tree) 29 | 30 | 31 | func spawn_house_at(pos : Vector2): 32 | if pos.x < 0.0 : 33 | pos.x -= houses.tile_set.tile_size.x 34 | 35 | if pos.y < 0.0 : 36 | pos.y -= houses.tile_set.tile_size.y 37 | 38 | var tile_position = pos / houses.tile_set.tile_size.x 39 | houses.set_pattern(0, tile_position, houses.tile_set.get_pattern(randi() % houses.tile_set.get_patterns_count())) 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Lorenz Mielke 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/resources/wfc_tile.gd: -------------------------------------------------------------------------------- 1 | class_name WfcTile 2 | extends Resource 3 | 4 | ## socket pattern 5 | @export var pattern: TileMapPattern 6 | ## visual layers 7 | @export var additional_layers : Array [TileMapPattern] = [] 8 | @export var additional_layers_name : Array[String] = [] 9 | ## has of all layers 10 | @export var hash : int 11 | @export var width : int 12 | @export var weight: float = 100 13 | @export var name: String 14 | @export var group: String 15 | 16 | @export var sockets := { 17 | Vector2i.UP: 0, 18 | Vector2i.RIGHT: 0, 19 | Vector2i.DOWN: 0, 20 | Vector2i.LEFT: 0, 21 | } 22 | @export var allowed_neighbors := { 23 | Vector2i.UP: [], 24 | Vector2i.RIGHT: [], 25 | Vector2i.DOWN: [], 26 | Vector2i.LEFT: [], 27 | } 28 | 29 | func from_pattern(tilemap_pattern: TileMapPattern): 30 | pattern = tilemap_pattern 31 | width = pattern.get_size().x 32 | var used = pattern.get_used_cells() 33 | var tiles = pattern.get_used_cells().map(func(vec:Vector2): return pattern.get_cell_atlas_coords(vec)) 34 | var up = tiles.slice(0, tiles.size() - (width -1), width) 35 | var down = tiles.slice(width-1, tiles.size(), width) 36 | var left = tiles.slice(0, width) 37 | var right = tiles.slice(tiles.size() - width, tiles.size()) 38 | sockets[Vector2i.UP] = up.hash() 39 | sockets[Vector2i.DOWN] = down.hash() 40 | sockets[Vector2i.LEFT] = left.hash() 41 | sockets[Vector2i.RIGHT] = right.hash() 42 | hash = tiles.hash() 43 | -------------------------------------------------------------------------------- /example/main.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=3 uid="uid://x6dlb35sjrdw"] 2 | 3 | [ext_resource type="TileSet" uid="uid://b3hngxhf5khj" path="res://example/tileset.tres" id="1_xlsi0"] 4 | [ext_resource type="Script" path="res://addons/lommix_infinite_worlds/nodes/wfc_tile_map.gd" id="2_dedbv"] 5 | [ext_resource type="Resource" uid="uid://dv7m7gt5bo387" path="res://example/wfc_tiles.tres" id="3_5mihr"] 6 | [ext_resource type="Script" path="res://example/wfc_event_watcher.gd" id="4_mmtdy"] 7 | [ext_resource type="Script" path="res://example/walker.gd" id="6_qrq7f"] 8 | 9 | [node name="main" type="Node2D"] 10 | 11 | [node name="WfcTileMap" type="TileMap" parent="."] 12 | tile_set = ExtResource("1_xlsi0") 13 | format = 2 14 | script = ExtResource("2_dedbv") 15 | wfc_tile_set = ExtResource("3_5mihr") 16 | loading_radius = 7 17 | follow_path = NodePath("../walker") 18 | 19 | [node name="wfc_event_watcher" type="Node2D" parent="."] 20 | script = ExtResource("4_mmtdy") 21 | 22 | [node name="trees" type="Node2D" parent="wfc_event_watcher"] 23 | z_index = 6 24 | 25 | [node name="houses" type="TileMap" parent="wfc_event_watcher"] 26 | tile_set = ExtResource("1_xlsi0") 27 | format = 2 28 | layer_0/tile_data = PackedInt32Array(-131072, 1245188, 5, -65536, 393220, 4, -131071, 1376260, 5, -65535, 393220, 4) 29 | 30 | [node name="walker" type="Node2D" parent="."] 31 | script = ExtResource("6_qrq7f") 32 | speed = 2000.0 33 | 34 | [node name="Camera2D" type="Camera2D" parent="walker"] 35 | 36 | [node name="ColorRect" type="ColorRect" parent="walker"] 37 | anchors_preset = 8 38 | anchor_left = 0.5 39 | anchor_top = 0.5 40 | anchor_right = 0.5 41 | anchor_bottom = 0.5 42 | offset_left = -8.0 43 | offset_top = -8.0 44 | offset_right = 8.0 45 | offset_bottom = 8.0 46 | grow_horizontal = 2 47 | grow_vertical = 2 48 | color = Color(0.317647, 0, 0.317647, 1) 49 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/resources/wfc_tile_set.gd: -------------------------------------------------------------------------------- 1 | class_name WfcTileSet 2 | extends Resource 3 | 4 | ## Wave function collapse Tile set 5 | ## - generate by using the Wfc Slicer! 6 | ## see : [class WfcTileMap] 7 | ## available wfc tiles 8 | @export var wfc_tiles : Array[WfcTile] 9 | ## layer data 10 | @export var original_layers : Array 11 | ## pixel size of a single tile 12 | @export var quad_size : int 13 | ## pattern size 14 | @export var pattern_size : Vector2i 15 | ## original tile set 16 | @export var tile_set : TileSet 17 | 18 | ## find tile by hash 19 | func find_tile(hash:int) -> WfcTile: 20 | for tile in wfc_tiles: 21 | if tile.hash == hash: 22 | return tile 23 | return null 24 | 25 | #save layer config 26 | static func save_layers(tile_map:TileMap, tile_set: WfcTileSet): 27 | tile_set.original_layers = [] 28 | for i in tile_map.get_layers_count(): 29 | var layer_data = {} 30 | layer_data["z"] = tile_map.get_layer_z_index(i) 31 | layer_data["name"] = tile_map.get_layer_name(i) 32 | layer_data["sort"] = tile_map.get_layer_y_sort_origin(i) 33 | layer_data["color"] = tile_map.get_layer_modulate(i) 34 | layer_data["render"] = true 35 | tile_set.original_layers.append(layer_data) 36 | 37 | #load layer config into tilemap 38 | static func load_layers(tile_map:TileMap, tile_set: WfcTileSet): 39 | assert(tile_set.original_layers, "no layer data provided") 40 | if tile_map.get_layers_count() > 3: 41 | print(tile_map) 42 | 43 | #clear all layers 44 | var start_index = tile_map.get_layers_count() - 1 45 | for i in tile_map.get_layers_count(): 46 | tile_map.remove_layer(start_index - i) 47 | 48 | for i in tile_set.original_layers.size(): 49 | tile_map.add_layer(i) 50 | tile_map.set_layer_name(i, tile_set.original_layers[i]["name"]) 51 | tile_map.set_layer_z_index(i, tile_set.original_layers[i]["z"]) 52 | tile_map.set_layer_y_sort_origin(i, tile_set.original_layers[i]["sort"]) 53 | tile_map.set_layer_modulate(i, tile_set.original_layers[i]["color"]) 54 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/lommix_infinite_worlds.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends EditorPlugin 3 | 4 | const tab_scene : PackedScene = preload("res://addons/lommix_infinite_worlds/scenes/wfc_slicer_tab.tscn") 5 | const preset_editor_scene : PackedScene = preload("res://addons/lommix_infinite_worlds/scenes/wfc_preset_editor.tscn") 6 | 7 | var wfc_tab : Control 8 | var wfc_preset_editor : Control 9 | 10 | func _enter_tree(): 11 | # Initialization of the plugin goes here. 12 | add_autoload_singleton('wfc_map',"res://addons/lommix_infinite_worlds/singletons/wfc_map_container.gd") 13 | get_editor_interface().get_selection().connect("selection_changed", update_ui) 14 | wfc_tab = tab_scene.instantiate() 15 | wfc_preset_editor = preset_editor_scene.instantiate() 16 | add_control_to_bottom_panel(wfc_tab, "Wfc Slicer") 17 | #äget_editor_interface().get_viewport().call_deferred("add_child",wfc_preset_editor) 18 | get_editor_interface().get_editor_main_screen().call_deferred("add_child",wfc_preset_editor) 19 | _make_visible(false) 20 | 21 | func _exit_tree(): 22 | # Clean-up of the plugin goes here. 23 | remove_autoload_singleton('wfc_map') 24 | get_editor_interface().get_selection().disconnect("selection_changed", update_ui) 25 | remove_control_from_bottom_panel(wfc_tab) 26 | remove_control_from_container(EditorPlugin.CONTAINER_CANVAS_EDITOR_MENU,wfc_preset_editor) 27 | if wfc_tab: 28 | wfc_tab.free() 29 | if wfc_preset_editor: 30 | wfc_preset_editor.free() 31 | 32 | func _has_main_screen() -> bool: 33 | return true 34 | 35 | func _make_visible(visible: bool) -> void: 36 | if wfc_preset_editor: 37 | wfc_preset_editor.visible = visible 38 | 39 | func update_ui(): 40 | var selection = get_editor_interface().get_selection().get_selected_nodes() 41 | if selection.size() == 0: 42 | return 43 | if selection[0] is TileMap: 44 | wfc_tab.inject_target_tilemap(selection[0]) 45 | 46 | func _get_plugin_icon() -> Texture2D: 47 | return get_editor_interface().get_base_control().get_theme_icon("Node", "EditorIcon") 48 | 49 | func _get_plugin_name() -> String: 50 | return "Wfc Preset" 51 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/structs/wfc_cell.gd: -------------------------------------------------------------------------------- 1 | class_name WfcCell 2 | extends RefCounted 3 | 4 | var possible_tiles: Array[WfcTile] 5 | var collapsed_to: WfcTile 6 | 7 | #gloabl position in the cell grid! 8 | var cell_grid_position : Vector2i 9 | var global_position : Vector2 10 | var global_center : Vector2 11 | var wfc_tile_set : WfcTileSet 12 | 13 | func _init(set : WfcTileSet, cell_pos : Vector2i) -> void: 14 | possible_tiles = set.wfc_tiles.duplicate() 15 | cell_grid_position = cell_pos 16 | wfc_tile_set = set 17 | global_position = cell_pos * wfc_tile_set.pattern_size * wfc_tile_set.quad_size 18 | global_center = global_position + wfc_tile_set.pattern_size * wfc_tile_set.quad_size * 0.5 19 | 20 | 21 | func get_layer_used_tiles(layer : String) -> Array: 22 | var positions = [] 23 | for i in collapsed_to.additional_layers_name.size(): 24 | if collapsed_to.additional_layers_name[i] == layer: 25 | for pos in collapsed_to.additional_layers[i].get_used_cells(): 26 | positions.append(global_position + Vector2(pos.x,pos.y) * wfc_tile_set.quad_size + Vector2(0.5,0.5) * wfc_tile_set.quad_size) 27 | return positions 28 | 29 | 30 | func collapse() -> WfcTile: 31 | if possible_tiles.size() == 0: 32 | wfc_map.on_contradiction.emit(self) 33 | collapsed_to = get_weighted_random() 34 | return collapsed_to 35 | 36 | func get_weighted_random() -> WfcTile: 37 | var total_weight : float = 0 38 | var accumlation := [] 39 | for i in possible_tiles.size(): 40 | total_weight += possible_tiles[i].weight 41 | accumlation.insert(i, total_weight) 42 | 43 | var roll := randf_range(0.0,total_weight) 44 | for i in possible_tiles.size(): 45 | if accumlation[i] > roll: 46 | return possible_tiles[i] 47 | 48 | if possible_tiles.size() > 0: 49 | return possible_tiles[randi() % possible_tiles.size()] 50 | return null 51 | 52 | func is_collapsed() -> bool: 53 | return collapsed_to != null 54 | 55 | #get by socket rule 56 | func get_possible_sockets(direction: Vector2i) -> Array: 57 | if collapsed_to: 58 | return [collapsed_to.sockets[direction]] 59 | var possible := [] 60 | for tile in possible_tiles: 61 | if !possible.has(tile.sockets[direction]): 62 | possible.append(tile.sockets[direction]) 63 | return possible 64 | 65 | #remove by socket rule 66 | func reduce_possible_sockets(direction: Vector2i, allowed: Array) -> bool: 67 | var to_remove := [] 68 | for tile in possible_tiles: 69 | if !allowed.has(tile.sockets[direction]): 70 | to_remove.append(tile) 71 | for tile in to_remove: 72 | possible_tiles.erase(tile) 73 | if possible_tiles.size() == 1: 74 | return true 75 | return false 76 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=5 10 | 11 | [application] 12 | 13 | config/name="Lommix Wfc" 14 | run/main_scene="res://example/main.tscn" 15 | config/features=PackedStringArray("4.2", "Forward Plus") 16 | 17 | [autoload] 18 | 19 | wfc_map="*res://addons/lommix_infinite_worlds/singletons/wfc_map_container.gd" 20 | 21 | [editor_plugins] 22 | 23 | enabled=PackedStringArray("res://addons/lommix_infinite_worlds/plugin.cfg") 24 | 25 | [input] 26 | 27 | left={ 28 | "deadzone": 0.5, 29 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null) 30 | ] 31 | } 32 | right={ 33 | "deadzone": 0.5, 34 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null) 35 | ] 36 | } 37 | up={ 38 | "deadzone": 0.5, 39 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null) 40 | ] 41 | } 42 | down={ 43 | "deadzone": 0.5, 44 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null) 45 | ] 46 | } 47 | zoom_in={ 48 | "deadzone": 0.5, 49 | "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null) 50 | ] 51 | } 52 | zoom_out={ 53 | "deadzone": 0.5, 54 | "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null) 55 | ] 56 | } 57 | 58 | [rendering] 59 | 60 | textures/canvas_textures/default_texture_filter=0 61 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/scenes/wfc_preset_editor.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://co4e23ttlb357"] 2 | 3 | [ext_resource type="Script" path="res://addons/lommix_infinite_worlds/scenes/wfc_preset_editor.gd" id="1_6ss66"] 4 | 5 | [sub_resource type="LabelSettings" id="LabelSettings_n7rnf"] 6 | line_spacing = 20.0 7 | font_size = 24 8 | 9 | [node name="wfc_preset_editor" type="CenterContainer"] 10 | offset_right = 1040.0 11 | offset_bottom = 836.0 12 | script = ExtResource("1_6ss66") 13 | 14 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 15 | offset_right = 1040.0 16 | offset_bottom = 894.0 17 | 18 | [node name="Label" type="Label" parent="VBoxContainer"] 19 | offset_right = 1040.0 20 | offset_bottom = 54.0 21 | text = "Wfc Preset Editor" 22 | label_settings = SubResource("LabelSettings_n7rnf") 23 | 24 | [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] 25 | offset_top = 58.0 26 | offset_right = 1040.0 27 | offset_bottom = 894.0 28 | 29 | [node name="draw" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"] 30 | offset_right = 836.0 31 | offset_bottom = 836.0 32 | 33 | [node name="CenterContainer" type="CenterContainer" parent="VBoxContainer/HBoxContainer/draw"] 34 | offset_right = 836.0 35 | offset_bottom = 836.0 36 | 37 | [node name="draw_surface" type="GridContainer" parent="VBoxContainer/HBoxContainer/draw/CenterContainer"] 38 | unique_name_in_owner = true 39 | offset_right = 836.0 40 | offset_bottom = 836.0 41 | columns = 10 42 | 43 | [node name="actions" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"] 44 | offset_left = 840.0 45 | offset_right = 1040.0 46 | offset_bottom = 836.0 47 | size_flags_horizontal = 3 48 | 49 | [node name="tile_set_container" type="PanelContainer" parent="VBoxContainer/HBoxContainer/actions"] 50 | unique_name_in_owner = true 51 | custom_minimum_size = Vector2(0, 30) 52 | offset_right = 200.0 53 | offset_bottom = 31.0 54 | 55 | [node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/HBoxContainer/actions"] 56 | offset_top = 35.0 57 | offset_right = 200.0 58 | offset_bottom = 70.0 59 | 60 | [node name="tile_select" type="GridContainer" parent="VBoxContainer/HBoxContainer/actions/VBoxContainer2"] 61 | unique_name_in_owner = true 62 | offset_right = 200.0 63 | columns = 4 64 | 65 | [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer/actions/VBoxContainer2"] 66 | offset_top = 4.0 67 | offset_right = 200.0 68 | offset_bottom = 35.0 69 | 70 | [node name="clear" type="Button" parent="VBoxContainer/HBoxContainer/actions/VBoxContainer2/HBoxContainer"] 71 | unique_name_in_owner = true 72 | offset_right = 120.0 73 | offset_bottom = 31.0 74 | text = "clear selection" 75 | 76 | [node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer/actions"] 77 | offset_top = 770.0 78 | offset_right = 200.0 79 | offset_bottom = 836.0 80 | size_flags_vertical = 10 81 | 82 | [node name="save_button" type="Button" parent="VBoxContainer/HBoxContainer/actions/VBoxContainer"] 83 | unique_name_in_owner = true 84 | offset_right = 200.0 85 | offset_bottom = 31.0 86 | text = "Create Resource 87 | " 88 | 89 | [node name="save_container" type="PanelContainer" parent="VBoxContainer/HBoxContainer/actions/VBoxContainer"] 90 | unique_name_in_owner = true 91 | custom_minimum_size = Vector2(0, 30) 92 | offset_top = 35.0 93 | offset_right = 200.0 94 | offset_bottom = 66.0 95 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/scenes/wfc_slicer_tab.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends Control 3 | 4 | @onready var pattern_y: SpinBox = %pattern_y 5 | @onready var pattern_x: SpinBox = %pattern_x 6 | @onready var region_y: SpinBox = %region_y 7 | @onready var region_x: SpinBox = %region_x 8 | @onready var tile_set_editor: HBoxContainer = $tile_set_editor 9 | @onready var slice_btn: Button = %slice_btn 10 | @onready var grid_show: Button = %grid_show 11 | @onready var actions: HBoxContainer = %Actions 12 | @onready var border: SpinBox = %border 13 | @onready var render: MenuButton = %render 14 | 15 | var tilemap : TileMap 16 | var draw_agent : Node2D 17 | var wfc_tile_set : WfcTileSet 18 | var slice_region_size: Vector2i = Vector2i(5,5) 19 | var pattern_size: Vector2i = Vector2i(3,3) 20 | var border_size:int = 3 21 | var picker: EditorResourcePicker 22 | 23 | func _ready() -> void: 24 | pattern_x.value_changed.connect(func(value): pattern_size.x = value; draw_agent.queue_redraw()) 25 | pattern_y.value_changed.connect(func(value): pattern_size.y = value; draw_agent.queue_redraw()) 26 | region_y.value_changed.connect(func(value): slice_region_size.y = value; draw_agent.queue_redraw()) 27 | region_x.value_changed.connect(func(value): slice_region_size.x = value; draw_agent.queue_redraw()) 28 | border.value_changed.connect(func(value): border_size = value; draw_agent.queue_redraw()) 29 | grid_show.pressed.connect(func(): if draw_agent: draw_agent.visible = true) 30 | slice_btn.pressed.connect(slice) 31 | 32 | if !Engine.is_editor_hint(): 33 | return 34 | picker = EditorResourcePicker.new() 35 | actions.add_child(picker) 36 | picker.custom_minimum_size = Vector2(200,50) 37 | picker.resource_changed.connect(on_resource_change) 38 | 39 | func toggle_layer_state(id : int): 40 | wfc_tile_set.original_layers[id]["render"] = !wfc_tile_set.original_layers[id]["render"] 41 | render.get_popup().set_item_checked(id,wfc_tile_set.original_layers[id]["render"]) 42 | 43 | func load_render_layer_menu(): 44 | render.get_popup().clear() 45 | for i in wfc_tile_set.original_layers.size(): 46 | render.get_popup().add_check_item(wfc_tile_set.original_layers[i]["name"],i) 47 | render.get_popup().set_item_checked(i,wfc_tile_set.original_layers[i]["render"]) 48 | render.get_popup().index_pressed.connect(toggle_layer_state) 49 | 50 | func on_resource_change(res): 51 | if !res || !res is WfcTileSet: 52 | tile_set_editor.unload() 53 | render.get_popup().clear() 54 | return 55 | wfc_tile_set = res 56 | tile_set_editor.load_tile_set(res) 57 | load_render_layer_menu() 58 | 59 | func inject_target_tilemap(target: TileMap): 60 | if draw_agent: 61 | draw_agent.free() 62 | tilemap = target 63 | draw_agent = Node2D.new() 64 | draw_agent.top_level = true 65 | draw_agent.visible = false 66 | draw_agent.connect("draw", draw_grid) 67 | tilemap.add_child(draw_agent) 68 | 69 | func _exit_tree() -> void: 70 | if draw_agent: 71 | draw_agent.queue_free() 72 | 73 | #draw slice grid to editor window 74 | func draw_grid(): 75 | var tile_size = tilemap.tile_set.tile_size.x 76 | var slice_width = pattern_size.x * tile_size * slice_region_size.x 77 | var slice_height = pattern_size.y * tile_size * slice_region_size.y 78 | for i in slice_region_size.x: 79 | draw_agent.draw_line(Vector2(tile_size * i * pattern_size.x,0), Vector2(tile_size * i * pattern_size.x,slice_height), Color.LIGHT_BLUE, border_size) 80 | for i in slice_region_size.y: 81 | draw_agent.draw_line(Vector2(0,tile_size * i * pattern_size.y), Vector2(slice_width,tile_size * i * pattern_size.y), Color.LIGHT_BLUE, border_size) 82 | var rect := Rect2(Vector2.ZERO, Vector2(slice_width,slice_height)) 83 | draw_agent.draw_rect(rect,Color.LIGHT_BLUE,false,border_size) 84 | 85 | #slice tilemap 86 | func slice(): 87 | wfc_tile_set = Slicer.slice(tilemap, pattern_size, slice_region_size) 88 | tile_set_editor.load_tile_set(wfc_tile_set) 89 | picker.edited_resource = wfc_tile_set 90 | load_render_layer_menu() 91 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/scenes/wfc_preset_editor.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends Control 3 | 4 | @onready var tile_set_container: PanelContainer = %tile_set_container 5 | @onready var draw_surface: GridContainer = %draw_surface 6 | @onready var tile_select: GridContainer = %tile_select 7 | @onready var save_button: Button = %save_button 8 | @onready var save_container: PanelContainer = %save_container 9 | @onready var clear: Button = %clear 10 | 11 | var draw_buttons := {} 12 | var preset_grid := {} 13 | var tile_set_picker : EditorResourcePicker 14 | var preset_save_picker : EditorResourcePicker 15 | var tileset : WfcTileSet 16 | var current_selection : WfcTile 17 | 18 | 19 | func _ready() -> void: 20 | for y in 10: 21 | for x in 10: 22 | var button = Button.new() 23 | button.custom_minimum_size = Vector2(80,80) 24 | var coord = Vector2i(x, y) 25 | draw_buttons[coord] = button 26 | button.pressed.connect(func(): on_draw_input(coord, button)) 27 | draw_surface.add_child(button) 28 | 29 | if !Engine.is_editor_hint(): 30 | return 31 | tile_set_picker = EditorResourcePicker.new() 32 | tile_set_container.add_child(tile_set_picker) 33 | tile_set_picker.custom_minimum_size = Vector2(200,30) 34 | tile_set_picker.resource_changed.connect(on_tile_set_change) 35 | preset_save_picker = EditorResourcePicker.new() 36 | save_container.add_child(preset_save_picker) 37 | preset_save_picker.custom_minimum_size = Vector2(200,30) 38 | preset_save_picker.resource_changed.connect(on_tile_set_change) 39 | save_button.pressed.connect(save_as_resource) 40 | clear.pressed.connect(func(): current_selection = null) 41 | 42 | func save_as_resource(): 43 | var preset = WfcPreset.new() 44 | for coord in preset_grid: 45 | if preset_grid[coord]: 46 | preset.tiles[coord] = preset_grid[coord].hash 47 | preset_save_picker.edited_resource = preset 48 | 49 | func on_draw_input(coords: Vector2i, button : Button): 50 | for child in button.get_children(): 51 | child.free() 52 | preset_grid[coords] = current_selection 53 | if current_selection: 54 | var icon = create_icon(current_selection) 55 | button.add_child(icon) 56 | 57 | func on_tile_set_change(res): 58 | if !res || !res is WfcTileSet: 59 | clear_draw_set() 60 | return 61 | load_draw_set(res) 62 | 63 | func on_preset_save_change(res): 64 | if !res || !res is WfcPreset: 65 | return 66 | for child in draw_surface.get_children(): 67 | if child.get_child(0): 68 | child.get_child(0).free() 69 | if !tileset: 70 | push_error("no tileset") 71 | return 72 | for coord in res.tiles: 73 | var icon = create_icon(res.tiles[coord]) 74 | preset_grid[coord] = tileset.find_tile(res.tiles[coord].hash) 75 | draw_buttons[coord].add_child(icon) 76 | 77 | func clear_draw_set(): 78 | for child in tile_select.get_children(): 79 | child.free() 80 | for child in draw_surface.get_children(): 81 | if child.get_child(0): 82 | child.get_child(0).free() 83 | 84 | func load_draw_set(tileset : WfcTileSet): 85 | clear_draw_set() 86 | self.tileset = tileset 87 | for tile in tileset.wfc_tiles: 88 | add_list_item(tile) 89 | 90 | func create_icon(tile:WfcTile) -> TileMap: 91 | var tilemap = TileMap.new() 92 | tilemap.tile_set = tileset.tile_set 93 | tilemap.cell_quadrant_size = tileset.quad_size 94 | WfcTileSet.load_layers(tilemap,tileset) 95 | var scale = 80.0/(tileset.quad_size as float * tileset.pattern_size.x as float) 96 | tilemap.scale = Vector2(scale,scale) 97 | for i in tile.additional_layers.size(): 98 | tilemap.set_pattern(i, Vector2i.ZERO, tile.additional_layers[i]) 99 | return tilemap 100 | 101 | func add_list_item(tile:WfcTile): 102 | var button = BaseButton.new() 103 | button.custom_minimum_size = Vector2i(80,80) 104 | var icon = create_icon(tile) 105 | button.add_child(icon) 106 | button.connect("pressed", func(): current_selection = tile) 107 | tile_select.call_deferred("add_child",button) 108 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/scenes/tile_set_editor.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends HBoxContainer 3 | 4 | @onready var socket_label: Label = %socket_label 5 | @onready var name_input: TextEdit = %name_input 6 | @onready var weight_input: SpinBox = %weight_input 7 | @onready var tile_set_list: GridContainer = %tile_set_list 8 | @onready var cursor: ColorRect = %cursor 9 | @onready var r: Button = %R 10 | @onready var g: Button = %G 11 | @onready var b: Button = %B 12 | @onready var w: Button = %W 13 | 14 | 15 | const MAX_DETAIL_SIZE = 160 16 | const MAX_LIST_SIZE = 80 17 | 18 | var detail_scale:float 19 | var list_scale:float 20 | var current_detail:WfcTile 21 | var current_wfc_tile_set:WfcTileSet 22 | var current_button : BaseButton 23 | var current_color_mode : String = "" 24 | 25 | func _ready() -> void: 26 | name_input.text_changed.connect(set_tile_name) 27 | weight_input.value_changed.connect(set_tile_weight) 28 | r.pressed.connect(func(): set_color_mode("red")) 29 | g.pressed.connect(func(): set_color_mode("green")) 30 | b.pressed.connect(func(): set_color_mode("blue")) 31 | w.pressed.connect(func(): set_color_mode("white")) 32 | 33 | func set_tile_name() -> void: 34 | if current_detail: 35 | current_detail.name = name_input.text 36 | 37 | 38 | func set_color_mode(color : String): 39 | current_color_mode = color 40 | pass 41 | 42 | 43 | func set_tile_weight(value:float) -> void: 44 | if current_detail: 45 | current_detail.weight = value 46 | #tile_set, quad_size 47 | func load_tile_set(tile_set: WfcTileSet): 48 | unload() 49 | detail_scale = MAX_DETAIL_SIZE as float / (tile_set.quad_size as float * tile_set.pattern_size.x as float) 50 | list_scale = MAX_LIST_SIZE as float / (tile_set.quad_size as float * tile_set.pattern_size.x as float) 51 | current_wfc_tile_set = tile_set 52 | for child in tile_set_list.get_children(): 53 | child.free() 54 | for tile in tile_set.wfc_tiles: 55 | add_list_item(tile) 56 | 57 | func _physics_process(delta: float) -> void: 58 | if current_detail && current_button: 59 | cursor.visible = true 60 | cursor.global_position = current_button.global_position + Vector2(-2,-2) 61 | else : 62 | cursor.visible = false 63 | 64 | func unload(): 65 | current_detail = null 66 | socket_label.text = "" 67 | weight_input.value = 0 68 | name_input.text = "" 69 | cursor.visible = false 70 | current_button = null 71 | for child in tile_set_list.get_children(): 72 | child.free() 73 | 74 | func on_tile_click(tile: WfcTile, button : BaseButton): 75 | if current_color_mode: 76 | button.modulate = Color(current_color_mode) 77 | if current_color_mode == "white": 78 | tile.group = "" 79 | else: 80 | tile.group = current_color_mode 81 | 82 | current_detail = tile 83 | socket_label.text = "Used Layers: %s \n\n" % (tile.additional_layers.size() + 1) 84 | socket_label.text += "UP: %s\n" % tile.sockets[Vector2i.UP] 85 | socket_label.text += "DOWN: %s\n" % tile.sockets[Vector2i.DOWN] 86 | socket_label.text += "LEFT: %s\n" % tile.sockets[Vector2i.LEFT] 87 | socket_label.text += "RIGHT: %s\n" % tile.sockets[Vector2i.RIGHT] 88 | socket_label.text += "HASH: %s\n\n" % tile.hash 89 | weight_input.value = tile.weight 90 | name_input.text = tile.name 91 | current_button = button 92 | #group_input.select(tile.group) 93 | 94 | func calculate_scale_factor() -> Vector2: 95 | return Vector2.ONE 96 | 97 | func add_list_item(tile:WfcTile): 98 | var button = BaseButton.new() 99 | button.custom_minimum_size = Vector2i(MAX_LIST_SIZE,MAX_LIST_SIZE) 100 | var tilemap = TileMap.new() 101 | WfcTileSet.load_layers(tilemap,current_wfc_tile_set) 102 | tilemap.tile_set = current_wfc_tile_set.tile_set 103 | tilemap.cell_quadrant_size = current_wfc_tile_set.quad_size 104 | tilemap.scale = Vector2(self.list_scale,self.list_scale) 105 | tilemap.set_pattern(0, Vector2i.ZERO, tile.pattern) 106 | for i in tile.additional_layers.size(): 107 | tilemap.set_pattern(i+1, Vector2i.ZERO, tile.additional_layers[i]) 108 | button.add_child(tilemap) 109 | button.connect("pressed", func(): on_tile_click(tile, button)) 110 | tile_set_list.add_child(button) 111 | 112 | 113 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Infinite Worlds 2 | 3 | Godot addon for generating infinite growing worlds using Wave-Function-Collapse algorithm. 4 | 5 | [demo.webm](https://github.com/Lommix/infinite_worlds/assets/84206502/b6d2381a-fa34-48ba-8079-87f886f27c6c) 6 | 7 | How cool would it be. Draw some tiles, define some simple rules and an infinite world awaits you! 8 | 9 | Well this addon makes it possible. It uses the Wave-Function-Collapse algorithm to generate the world. 10 | 11 | All you have to do, is draw some patterns on a reference tilemap and use the in-build editor tool to generate a wave function collapse ruleset from that. 12 | 13 | Then plug it into a special tilemap node, and you are good to go. 14 | 15 | All calculations happen on a different thread! Only the drawing part requires the main thread, which makes this pretty fast. 16 | 17 | ![editor](docs/editor.jpeg) 18 | 19 | By using multiple layers, you can define connective rules on the first, and decorative rules on the other layers. All you do is "color code" the first socket layer with tiles from your tileset. 20 | Each Pattern can only connect to other patterns with the same color rules on that particular side. 21 | 22 | ![rules](docs/sockets.jpeg) 23 | 24 | Here you can see the socket layer, which just consists of 2 different tiles from your tileset. Beware, if you have patterns that cannot connect to any other pattern, the algorithm will fail. 25 | 26 | ## Installation 27 | 28 | To use in your project, just copy the addons/infinite_worlds folder into your project addons folder. Then activate the addon in the project settings. 29 | The rest of this repository is just a demo project, which you can use to play around with. 30 | 31 | ## Usage 32 | 33 | - Create a new Scene. Add a TileMap node to it. 34 | - Add a new TileSet to the TileMap node. 35 | - Start drawing some patterns on the TileMap. Each beeing equal in size. 36 | - Select the TileMap node and click, open the Wfc Slicer in the bottom panel. 37 | - Click on `Toggle Grid` to display the grid. Adjust the `pattern x & y` values to match the size of your patterns. `region x & y` determine the amount of patterns in the grid. 38 | - Once all patterns are in place, click on `slice`. This will generate a ruleset from the patterns you drew. 39 | - In the `Render Options` you can determine, which layers should later be rendered. For example the first layer, that determines the connectivity of the patterns, can be hidden. 40 | - You can click on each Pattern and set a `Name` and a `Weight` (default 100). The weight determines the probability of the pattern beeing selected. The higher the weight, the more likely it will be selected. 41 | - Once you are happy with the ruleset, right click the dropdown menu on the far right, and save the ruleset to a file. 42 | - In your main scene, add a new `WfcTileMap` node. Add the ruleset you just saved to the `Wfc Tile Set` property. 43 | - Set a Loading Radius and an Unstable Radius. The Loading Radius determines how many chunks are collapsed around the player. The Unstable Radius should be at least 2 and determines how many new unstable chunks are added around the player. 44 | - The `Follow Path` is a node, most likely your player, the world is generated around. 45 | - You can use the color groups to add a group to a pattern. I never used this, but it might be useful for you. You can access this in the signals for example. 46 | 47 | ## Extend 48 | 49 | - This addons adds some signals, you can subscribe to. For each pattern that is collapsed/drawn, a `on_cell_draw` signal is emitted. You can use this to add some logic to your game. For example, spawn buildings, trees, or enemies. Check out the example project for more details. 50 | 51 | ```gdscript 52 | ## /addons/infinite_worlds/singletons/wfc_map_container.gd 53 | 54 | ## called on contradiction, a cell has 0 possible outcomes [async] 55 | ## never used this, might be useful to recalculate some broken chunks in complex rulesets. 56 | signal on_contradiction(cell: WfcCell) 57 | 58 | ## called when drawing to tilemap [mainthread] 59 | signal on_cell_draw(cell: WfcCell) 60 | ``` 61 | 62 | ## How the loading works 63 | 64 | ![loading](docs/loading.jpeg) 65 | 66 | ## Final Words 67 | 68 | This is a work in progress/demo addon and not production ready, there are many bugs. I used this to generate the world in my [godot game](https://youtu.be/3B0e7ffAoKQ?t=48), but for reasons (Rust addict) I switched 69 | to the bevy game engine. Would be a shame to let this go to waste, so I decided to share it with you. 70 | 71 | I will not add any new features. If you want to contribute, feel free to do so. I'll do my best to help you out. 72 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/static/slicer.gd: -------------------------------------------------------------------------------- 1 | class_name Slicer 2 | extends Node 3 | 4 | #offset list in clockwise order for propation 5 | const prop_map := [ 6 | #first ring 7 | [Vector2i(0,-1), Vector2i(1,0), Vector2i(0,1), Vector2i(-1,0)], 8 | #second ring 9 | [Vector2i(0,-2), Vector2i(1,-1), Vector2i(2,0), Vector2i(1,1), Vector2i(0,2), Vector2i(-1,1), Vector2i(-2,0), Vector2i(-1,-1)], 10 | #third ring 11 | [Vector2i(0,-3),Vector2i(1,-2),Vector2i(2,-1),Vector2i(3,0),Vector2i(2,1),Vector2i(1,2),Vector2i(0,3), 12 | Vector2i(-1,2),Vector2i(-2,1),Vector2i(-3,0),Vector2i(-2,-1),Vector2i(-1,-2)], 13 | #fourth ring 14 | [Vector2i(0,-4),Vector2i(1,-3),Vector2i(2,-2),Vector2i(3,-1),Vector2i(4,0), 15 | Vector2i(4,0),Vector2i(3,1),Vector2i(2,2),Vector2i(1,3),Vector2i(0,4), 16 | Vector2i(0,4),Vector2i(-1,3),Vector2i(-2,2),Vector2i(-3,1),Vector2i(-4,0), 17 | Vector2i(-4,0),Vector2i(-3,-1),Vector2i(-2,-2),Vector2i(-1,-3)] 18 | ] 19 | const dir_sequence := [Vector2i.UP, Vector2i.RIGHT, Vector2i.DOWN, Vector2i.LEFT] 20 | 21 | #starting point, slice the map, return the wfc tile set 22 | static func slice(tilemap: TileMap, pattern_size:Vector2i, size: Vector2i) -> WfcTileSet: 23 | var unique_tiles := {} 24 | var connection_map := {} 25 | #var truesize = pattern_size * size 26 | for x in size.x: 27 | for y in size.y: 28 | var tile_position = Vector2i(x * pattern_size.x, y * pattern_size.y) 29 | var tile = read_tile(tilemap, pattern_size, tile_position) 30 | if !tile: 31 | continue 32 | var layer_tuple = find_additional_layers(tilemap,pattern_size,tile_position) 33 | if layer_tuple[0].size() > 0: 34 | tile.additional_layers = layer_tuple[0] 35 | #adding hashes to generate a new unique one, might cause bugs at some point 36 | tile.hash += layer_tuple[1] 37 | tile.additional_layers_name = layer_tuple[2] 38 | 39 | connection_map[Vector2i(x,y)] = tile.hash 40 | if unique_tiles.has(tile.hash): 41 | unique_tiles[tile.hash].weight += 1 42 | else: 43 | unique_tiles[tile.hash] = tile 44 | 45 | #generate allowed neighbors 46 | collect_neighbor_data(connection_map, unique_tiles) 47 | #cast to resource 48 | var wfc_tile_set = WfcTileSet.new() 49 | for tile in unique_tiles.values(): 50 | wfc_tile_set.wfc_tiles.append(tile) 51 | WfcTileSet.save_layers(tilemap,wfc_tile_set) 52 | wfc_tile_set.pattern_size = pattern_size 53 | wfc_tile_set.tile_set = tilemap.tile_set 54 | wfc_tile_set.quad_size = tilemap.tile_set.tile_size.x 55 | return wfc_tile_set 56 | 57 | # adding additional layers and generate combined hash 58 | # returns tuple [Array[TileMapPattern], hash:int] 59 | static func find_additional_layers(tilemap: TileMap, pattern_size:Vector2i, position: Vector2i) -> Array: 60 | var layers: Array[TileMapPattern] = [] 61 | var names : Array[String] = [] 62 | var hash_list : Array[int] = [] 63 | for i in tilemap.get_layers_count(): 64 | if i == 0: continue 65 | var pattern := TileMapPattern.new() 66 | var is_valid = false 67 | var tile_sequence : Array[Vector2i] = [] 68 | for x in pattern_size.x: 69 | for y in pattern_size.y: 70 | var cell_pos = Vector2i(x,y) 71 | var atlas_pos := tilemap.get_cell_atlas_coords(i,position + cell_pos) 72 | var source := tilemap.get_cell_source_id(i,position + cell_pos) 73 | var alternative := tilemap.get_cell_alternative_tile(i,position + cell_pos) 74 | if(atlas_pos != Vector2i(-1,-1)): 75 | pattern.set_cell(cell_pos, source, atlas_pos, alternative) 76 | is_valid = true 77 | if is_valid: 78 | layers.append(pattern) 79 | names.append(tilemap.get_layer_name(i)) 80 | hash_list.append(generate_hash_from_pattern(pattern)) 81 | return [layers, hash_list.hash(), names] 82 | 83 | 84 | #generating a hash from a tilemap pattern sequence 85 | static func generate_hash_from_pattern(pattern: TileMapPattern) -> int : 86 | return pattern.get_used_cells().map(func(vec:Vector2): return pattern.get_cell_atlas_coords(vec)).hash() 87 | 88 | #collection neighbor data for bitmap mode 89 | #todo: wrap around, missing for completion. 90 | static func collect_neighbor_data(connection_map: Dictionary, unique_tiles : Dictionary): 91 | for pos in connection_map: 92 | for dir in dir_sequence: 93 | if connection_map.has(pos + dir): 94 | if !unique_tiles[connection_map[pos]].allowed_neighbors[dir].has(connection_map[pos + dir]): 95 | unique_tiles[connection_map[pos]].allowed_neighbors[dir].append(connection_map[pos + dir]) 96 | 97 | #read a single tile from a griven tilemap and return the wfc tile resource 98 | #can return null, if tile has empty cell 99 | static func read_tile(tilemap: TileMap, pattern_size:Vector2i, position: Vector2i) -> WfcTile: 100 | var pattern := TileMapPattern.new() 101 | for x in pattern_size.x: 102 | for y in pattern_size.y: 103 | var cell_pos = Vector2i(x,y) 104 | var atlas_pos := tilemap.get_cell_atlas_coords(0,position + cell_pos) 105 | var source := tilemap.get_cell_source_id(0,position + cell_pos) 106 | var alternative := tilemap.get_cell_alternative_tile(0,position + cell_pos) 107 | if atlas_pos == Vector2i(-1,-1): 108 | return null 109 | pattern.set_cell(cell_pos, source, atlas_pos, alternative) 110 | #read sockets 111 | var wfc_tile := WfcTile.new() 112 | wfc_tile.pattern = pattern 113 | var values = read_sockets(pattern) 114 | wfc_tile.hash = values["hash"] 115 | wfc_tile.sockets = values["sockets"] 116 | return wfc_tile 117 | 118 | #generate socket hashes for each side of a tile map pattern 119 | static func read_sockets(pattern:TileMapPattern)->Dictionary: 120 | var sockets := {} 121 | var width = pattern.get_size().y 122 | print(pattern.get_size()) 123 | var used = pattern.get_used_cells() 124 | var tiles = pattern.get_used_cells().map(func(vec:Vector2): return pattern.get_cell_atlas_coords(vec)) 125 | var up = tiles.slice(0, tiles.size() - (width -1), width) 126 | var down = tiles.slice(width-1, tiles.size(), width) 127 | var left = tiles.slice(0, width) 128 | var right = tiles.slice(tiles.size() - width, tiles.size()) 129 | sockets[Vector2i.UP] = up.hash() 130 | sockets[Vector2i.DOWN] = down.hash() 131 | sockets[Vector2i.LEFT] = left.hash() 132 | sockets[Vector2i.RIGHT] = right.hash() 133 | return {"sockets": sockets, "hash": tiles.hash()} 134 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/nodes/wfc_tile_map.gd: -------------------------------------------------------------------------------- 1 | class_name WfcTileMap 2 | extends TileMap 3 | 4 | @export var wfc_tile_set: WfcTileSet 5 | @export var loading_radius : int = 3 6 | @export var unstable_layer_thickness : int = 3 7 | @export_range(0, 1) var update_intervall : float = 0.1 8 | @export var follow_path: NodePath 9 | @export var debug : bool = false 10 | 11 | #load around this nodes position 12 | var follow : Node2D 13 | var timer : float = 0.0 14 | 15 | var draw_node : Node2D = Node2D.new() 16 | var grid_node : Node2D = Node2D.new() 17 | var rects : Array[Rect2] = [] 18 | 19 | #buffer for tiles to be drawn 20 | var draw_buffer : Array[WfcCell] = [] 21 | 22 | 23 | var thread_id : int = 0 24 | var last_pos : Vector2i 25 | 26 | func _ready(): 27 | if follow_path: 28 | follow = get_node(follow_path) 29 | 30 | WfcTileSet.load_layers(self,wfc_tile_set) 31 | add_child(draw_node) 32 | add_child(grid_node) 33 | grid_node.top_level = true 34 | draw_node.top_level = true 35 | draw_node.draw.connect(draw_loading_radius) 36 | grid_node.draw.connect(draw_grid) 37 | 38 | func _physics_process(delta: float): 39 | if !is_instance_valid(follow): 40 | follow = null 41 | return 42 | 43 | draw_node.global_position = follow.global_position 44 | timer += delta 45 | if timer < update_intervall: 46 | return 47 | timer = 0.0 48 | last_pos = get_pattern_pos_from_global(follow.global_position) 49 | 50 | if thread_id && WorkerThreadPool.is_task_completed(thread_id): 51 | consume_draw_buffer() 52 | thread_id = 0 53 | 54 | if !thread_id: 55 | thread_id = WorkerThreadPool.add_task(load_and_collapse) 56 | 57 | 58 | # draw_node.visible = GameContext.debug_mode 59 | # grid_node.visible = GameContext.debug_mode 60 | # if debug: 61 | # draw_node.queue_redraw() 62 | # grid_node.queue_redraw() 63 | 64 | ## global position to load next 65 | func queue_load(position : Vector2) -> bool: 66 | return false 67 | 68 | 69 | func load_and_collapse(): 70 | load_unstable_cells(last_pos) 71 | collapse_next(last_pos) 72 | 73 | #draw debug radius 74 | func draw_loading_radius(): 75 | if !debug: 76 | return 77 | var inner_size = loading_radius * 2 + 1 78 | var rect_inner = Rect2( 79 | wfc_tile_set.pattern_size * inner_size * -0.5 * wfc_tile_set.quad_size, 80 | wfc_tile_set.pattern_size * inner_size * wfc_tile_set.quad_size) 81 | var outer_size = (loading_radius + unstable_layer_thickness) * 2 +1 82 | var rect_outer = Rect2( 83 | wfc_tile_set.pattern_size * outer_size * -0.5 * wfc_tile_set.quad_size, 84 | wfc_tile_set.pattern_size * outer_size * wfc_tile_set.quad_size) 85 | draw_node.draw_rect(rect_inner, Color.DARK_BLUE, false, wfc_tile_set.pattern_size.x * 2) 86 | draw_node.draw_rect(rect_outer, Color.RED, false, wfc_tile_set.pattern_size.x * 2) 87 | 88 | #draw debug grid 89 | func draw_grid(): 90 | if !debug: 91 | return 92 | for rect in rects: 93 | grid_node.draw_rect(rect, Color.WHITE, false, wfc_tile_set.pattern_size.x) 94 | 95 | #transform a global position to a cell on the cell grid 96 | func get_pattern_pos_from_global(global_pos:Vector2) -> Vector2i: 97 | var tile_pos := Vector2i(global_pos.x / wfc_tile_set.quad_size, global_pos.y / wfc_tile_set.quad_size) 98 | var pattern_pos = Vector2i((tile_pos.x / wfc_tile_set.pattern_size.x), (tile_pos.y / wfc_tile_set.pattern_size.y)) 99 | if global_pos.x < 0: pattern_pos.x -=1; 100 | if global_pos.y < 0: pattern_pos.y -=1; 101 | return pattern_pos 102 | 103 | #add new unstable cells to the world map 104 | func load_unstable_cells(center : Vector2i): 105 | var mean_radius = loading_radius + unstable_layer_thickness 106 | for x in mean_radius * 2 + 1: 107 | for y in mean_radius * 2 + 1: 108 | var offset = Vector2i(x + center.x - mean_radius, y + center.y - mean_radius) 109 | if wfc_map.loaded_cell.has(offset): 110 | continue 111 | wfc_map.loaded_cell[offset] = WfcCell.new(wfc_tile_set, offset) 112 | rects.append(Rect2(offset * wfc_tile_set.quad_size * wfc_tile_set.pattern_size, wfc_tile_set.pattern_size * wfc_tile_set.quad_size)) 113 | 114 | #load next collapse buffer from world map into array 115 | func get_next_collapse_buffer(center : Vector2i) -> Array[WfcCell]: 116 | var next_to_collapse : Array[WfcCell] = [] 117 | for x in loading_radius * 2 + 1: 118 | for y in loading_radius * 2 + 1: 119 | var offset = Vector2i(x + center.x - loading_radius, y + center.y - loading_radius) 120 | if wfc_map.loaded_cell.has(offset) && !wfc_map.loaded_cell[offset].is_collapsed(): 121 | next_to_collapse.append(wfc_map.loaded_cell[offset]) 122 | return next_to_collapse 123 | 124 | #collapse the next buffer 125 | func collapse_next(center : Vector2i): 126 | var next_array = get_next_collapse_buffer(center) 127 | var stable_result : Array[WfcCell] = [] 128 | #get lowest 129 | for i in next_array.size(): 130 | var lowest = get_lowest_entropy_cell(next_array) 131 | #collapse 132 | lowest.collapse() 133 | draw_buffer.append(lowest) 134 | propagate(lowest.cell_grid_position) 135 | 136 | #empty the draw buffer by drawing the result 137 | func consume_draw_buffer(): 138 | for cell in draw_buffer: 139 | draw_pattern(cell.cell_grid_position, cell.collapsed_to) 140 | wfc_map.on_cell_draw.emit(cell) 141 | draw_buffer.clear() 142 | 143 | #propagate cell change after collapse 144 | func propagate(coords: Vector2i): 145 | for layer in Slicer.prop_map: 146 | for offset in layer: 147 | var next_eval_coord = coords + offset 148 | evaluate(next_eval_coord) 149 | 150 | #evalate a given cell position 151 | func evaluate(coords : Vector2i): 152 | if !wfc_map.loaded_cell.has(coords) || wfc_map.loaded_cell[coords].is_collapsed(): 153 | return 154 | var current_cell = wfc_map.loaded_cell[coords] 155 | var cell: WfcCell = wfc_map.loaded_cell[coords] 156 | for direction in Slicer.dir_sequence: 157 | if !wfc_map.loaded_cell.has(coords + direction): 158 | continue 159 | var neighbor_cell : WfcCell = wfc_map.loaded_cell[coords + direction] 160 | var allowed = neighbor_cell.get_possible_sockets(direction * -1) 161 | #if there is only one left, collapse and propagate before contradiction 162 | if wfc_map.loaded_cell[coords].reduce_possible_sockets(direction, allowed): 163 | wfc_map.loaded_cell[coords].collapse() 164 | draw_buffer.append(wfc_map.loaded_cell[coords]) 165 | propagate(coords) 166 | 167 | #draw wfc tile to tilemap 168 | func draw_pattern(vec:Vector2i, tile : WfcTile): 169 | if wfc_tile_set.original_layers[0]["render"]: 170 | set_pattern(0, vec * tile.pattern.get_size(), tile.pattern) 171 | for i in tile.additional_layers.size(): 172 | if wfc_tile_set.original_layers[1+i]["render"]: 173 | set_pattern(i+1, vec * tile.pattern.get_size(), tile.additional_layers[i]) 174 | 175 | func build_preset(coord : Vector2i, preset : WfcPreset): 176 | for pos in preset.tiles: 177 | var cell := WfcCell.new(wfc_tile_set, coord + pos) 178 | cell.collapsed_to = wfc_tile_set.find_tile(preset.tiles[pos]) 179 | draw_pattern(cell.cell_grid_position, cell.collapsed_to) 180 | wfc_map.on_cell_draw.emit(cell) 181 | wfc_map.loaded_cell[coord + pos] = cell 182 | 183 | #find lowest entropy cell in collapse buffer 184 | func get_lowest_entropy_cell(array : Array[WfcCell]) -> WfcCell: 185 | var lowest : WfcCell 186 | for cell in array: 187 | if !lowest: 188 | lowest = cell 189 | continue 190 | if lowest.possible_tiles.size() > cell.possible_tiles.size(): 191 | lowest = cell 192 | array.erase(lowest) 193 | return lowest 194 | 195 | -------------------------------------------------------------------------------- /addons/lommix_infinite_worlds/scenes/wfc_slicer_tab.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=8 format=3 uid="uid://c08wqfmporgf7"] 2 | 3 | [ext_resource type="Script" path="res://addons/lommix_infinite_worlds/scenes/wfc_slicer_tab.gd" id="1_t16jv"] 4 | [ext_resource type="Script" path="res://addons/lommix_infinite_worlds/scenes/tile_set_editor.gd" id="2_3ttdf"] 5 | 6 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ustq7"] 7 | bg_color = Color(0.784314, 0, 0, 1) 8 | 9 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8t6un"] 10 | bg_color = Color(0, 0.784314, 0, 1) 11 | 12 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_efcan"] 13 | bg_color = Color(0, 0, 0.784314, 1) 14 | 15 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_s1m3y"] 16 | bg_color = Color(0.6, 0.6, 0.6, 0) 17 | border_width_left = 2 18 | border_width_top = 2 19 | border_width_right = 2 20 | border_width_bottom = 2 21 | border_color = Color(0.952941, 0, 0, 1) 22 | border_blend = true 23 | 24 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nkgdg"] 25 | bg_color = Color(0.164706, 0.164706, 0.164706, 1) 26 | 27 | [node name="wfc_slicer_tab" type="VBoxContainer"] 28 | custom_minimum_size = Vector2(0, 300) 29 | anchors_preset = 10 30 | anchor_right = 1.0 31 | offset_bottom = 335.0 32 | grow_horizontal = 2 33 | script = ExtResource("1_t16jv") 34 | 35 | [node name="control" type="HBoxContainer" parent="."] 36 | layout_mode = 2 37 | offset_right = 1152.0 38 | offset_bottom = 89.0 39 | 40 | [node name="tilemap_actions" type="HBoxContainer" parent="control"] 41 | layout_mode = 2 42 | offset_right = 835.0 43 | offset_bottom = 89.0 44 | 45 | [node name="VBoxContainer" type="VBoxContainer" parent="control/tilemap_actions"] 46 | layout_mode = 2 47 | offset_right = 76.0 48 | offset_bottom = 89.0 49 | 50 | [node name="label_pattern_x" type="Label" parent="control/tilemap_actions/VBoxContainer"] 51 | layout_mode = 2 52 | offset_right = 76.0 53 | offset_bottom = 26.0 54 | text = "pattern x:" 55 | 56 | [node name="label_pattern_y" type="Label" parent="control/tilemap_actions/VBoxContainer"] 57 | layout_mode = 2 58 | offset_top = 30.0 59 | offset_right = 76.0 60 | offset_bottom = 56.0 61 | text = "pattern y:" 62 | 63 | [node name="VBoxContainer2" type="VBoxContainer" parent="control/tilemap_actions"] 64 | layout_mode = 2 65 | offset_left = 80.0 66 | offset_right = 163.0 67 | offset_bottom = 89.0 68 | 69 | [node name="pattern_x" type="SpinBox" parent="control/tilemap_actions/VBoxContainer2"] 70 | unique_name_in_owner = true 71 | layout_mode = 2 72 | offset_right = 83.0 73 | offset_bottom = 31.0 74 | min_value = 1.0 75 | value = 3.0 76 | 77 | [node name="pattern_y" type="SpinBox" parent="control/tilemap_actions/VBoxContainer2"] 78 | unique_name_in_owner = true 79 | layout_mode = 2 80 | offset_top = 35.0 81 | offset_right = 83.0 82 | offset_bottom = 66.0 83 | min_value = 1.0 84 | value = 3.0 85 | 86 | [node name="VBoxContainer3" type="VBoxContainer" parent="control/tilemap_actions"] 87 | layout_mode = 2 88 | offset_left = 167.0 89 | offset_right = 234.0 90 | offset_bottom = 89.0 91 | 92 | [node name="region_label_x" type="Label" parent="control/tilemap_actions/VBoxContainer3"] 93 | layout_mode = 2 94 | offset_right = 67.0 95 | offset_bottom = 26.0 96 | text = "region x:" 97 | 98 | [node name="region_label_y" type="Label" parent="control/tilemap_actions/VBoxContainer3"] 99 | layout_mode = 2 100 | offset_top = 30.0 101 | offset_right = 67.0 102 | offset_bottom = 56.0 103 | text = "region y:" 104 | 105 | [node name="VBoxContainer4" type="VBoxContainer" parent="control/tilemap_actions"] 106 | layout_mode = 2 107 | offset_left = 238.0 108 | offset_right = 321.0 109 | offset_bottom = 89.0 110 | 111 | [node name="region_x" type="SpinBox" parent="control/tilemap_actions/VBoxContainer4"] 112 | unique_name_in_owner = true 113 | layout_mode = 2 114 | offset_right = 83.0 115 | offset_bottom = 31.0 116 | min_value = 1.0 117 | value = 5.0 118 | 119 | [node name="region_y" type="SpinBox" parent="control/tilemap_actions/VBoxContainer4"] 120 | unique_name_in_owner = true 121 | layout_mode = 2 122 | offset_top = 35.0 123 | offset_right = 83.0 124 | offset_bottom = 66.0 125 | min_value = 1.0 126 | value = 5.0 127 | 128 | [node name="slice_btn" type="Button" parent="control/tilemap_actions"] 129 | unique_name_in_owner = true 130 | custom_minimum_size = Vector2(100, 0) 131 | layout_mode = 2 132 | offset_left = 325.0 133 | offset_right = 425.0 134 | offset_bottom = 89.0 135 | text = "slice" 136 | 137 | [node name="VBoxContainer5" type="VBoxContainer" parent="control/tilemap_actions"] 138 | layout_mode = 2 139 | offset_left = 429.0 140 | offset_right = 579.0 141 | offset_bottom = 89.0 142 | 143 | [node name="HBoxContainer" type="HBoxContainer" parent="control/tilemap_actions/VBoxContainer5"] 144 | layout_mode = 2 145 | offset_right = 150.0 146 | offset_bottom = 31.0 147 | 148 | [node name="grid_show" type="Button" parent="control/tilemap_actions/VBoxContainer5/HBoxContainer"] 149 | unique_name_in_owner = true 150 | custom_minimum_size = Vector2(150, 0) 151 | layout_mode = 2 152 | offset_right = 150.0 153 | offset_bottom = 31.0 154 | text = "Toggle Grid" 155 | 156 | [node name="HBoxContainer2" type="HBoxContainer" parent="control/tilemap_actions/VBoxContainer5"] 157 | layout_mode = 2 158 | offset_top = 35.0 159 | offset_right = 150.0 160 | offset_bottom = 66.0 161 | 162 | [node name="Label" type="Label" parent="control/tilemap_actions/VBoxContainer5/HBoxContainer2"] 163 | layout_mode = 2 164 | offset_top = 2.0 165 | offset_right = 53.0 166 | offset_bottom = 28.0 167 | text = "border" 168 | 169 | [node name="border" type="SpinBox" parent="control/tilemap_actions/VBoxContainer5/HBoxContainer2"] 170 | unique_name_in_owner = true 171 | layout_mode = 2 172 | offset_left = 57.0 173 | offset_right = 140.0 174 | offset_bottom = 31.0 175 | min_value = 1.0 176 | value = 3.0 177 | 178 | [node name="VBoxContainer6" type="VBoxContainer" parent="control/tilemap_actions"] 179 | layout_mode = 2 180 | offset_left = 583.0 181 | offset_right = 835.0 182 | offset_bottom = 89.0 183 | 184 | [node name="Label" type="Label" parent="control/tilemap_actions/VBoxContainer6"] 185 | layout_mode = 2 186 | offset_right = 252.0 187 | offset_bottom = 26.0 188 | text = "Color Groups" 189 | 190 | [node name="colors" type="HBoxContainer" parent="control/tilemap_actions/VBoxContainer6"] 191 | layout_mode = 2 192 | offset_top = 30.0 193 | offset_right = 252.0 194 | offset_bottom = 89.0 195 | 196 | [node name="R" type="Button" parent="control/tilemap_actions/VBoxContainer6/colors"] 197 | unique_name_in_owner = true 198 | custom_minimum_size = Vector2(60, 0) 199 | layout_mode = 2 200 | offset_right = 60.0 201 | offset_bottom = 59.0 202 | theme_override_colors/font_outline_color = Color(0, 0, 0, 1) 203 | theme_override_constants/outline_size = 5 204 | theme_override_font_sizes/font_size = 40 205 | theme_override_styles/normal = SubResource("StyleBoxFlat_ustq7") 206 | text = "R" 207 | 208 | [node name="G" type="Button" parent="control/tilemap_actions/VBoxContainer6/colors"] 209 | unique_name_in_owner = true 210 | custom_minimum_size = Vector2(60, 0) 211 | layout_mode = 2 212 | offset_left = 64.0 213 | offset_right = 124.0 214 | offset_bottom = 59.0 215 | theme_override_colors/font_outline_color = Color(0, 0, 0, 1) 216 | theme_override_constants/outline_size = 5 217 | theme_override_font_sizes/font_size = 40 218 | theme_override_styles/normal = SubResource("StyleBoxFlat_8t6un") 219 | text = "G" 220 | 221 | [node name="B" type="Button" parent="control/tilemap_actions/VBoxContainer6/colors"] 222 | unique_name_in_owner = true 223 | custom_minimum_size = Vector2(60, 0) 224 | layout_mode = 2 225 | offset_left = 128.0 226 | offset_right = 188.0 227 | offset_bottom = 59.0 228 | theme_override_colors/font_outline_color = Color(0, 0, 0, 1) 229 | theme_override_constants/outline_size = 5 230 | theme_override_font_sizes/font_size = 40 231 | theme_override_styles/normal = SubResource("StyleBoxFlat_efcan") 232 | text = "B" 233 | 234 | [node name="W" type="Button" parent="control/tilemap_actions/VBoxContainer6/colors"] 235 | unique_name_in_owner = true 236 | custom_minimum_size = Vector2(60, 0) 237 | layout_mode = 2 238 | offset_left = 192.0 239 | offset_right = 252.0 240 | offset_bottom = 59.0 241 | theme_override_colors/font_outline_color = Color(0, 0, 0, 1) 242 | theme_override_constants/outline_size = 5 243 | theme_override_font_sizes/font_size = 40 244 | theme_override_styles/normal = SubResource("StyleBoxFlat_s1m3y") 245 | text = "X" 246 | 247 | [node name="PanelContainer" type="PanelContainer" parent="control"] 248 | layout_mode = 2 249 | offset_left = 839.0 250 | offset_right = 906.0 251 | offset_bottom = 89.0 252 | theme_override_styles/panel = SubResource("StyleBoxFlat_nkgdg") 253 | 254 | [node name="render" type="MenuButton" parent="control/PanelContainer"] 255 | unique_name_in_owner = true 256 | layout_mode = 2 257 | offset_right = 67.0 258 | offset_bottom = 89.0 259 | text = "Render 260 | options" 261 | switch_on_hover = true 262 | 263 | [node name="Actions" type="HBoxContainer" parent="control"] 264 | unique_name_in_owner = true 265 | layout_mode = 2 266 | offset_left = 910.0 267 | offset_right = 1152.0 268 | offset_bottom = 89.0 269 | size_flags_horizontal = 3 270 | alignment = 2 271 | 272 | [node name="tile_set_editor" type="HBoxContainer" parent="."] 273 | layout_mode = 2 274 | offset_top = 93.0 275 | offset_right = 1152.0 276 | offset_bottom = 335.0 277 | size_flags_vertical = 3 278 | script = ExtResource("2_3ttdf") 279 | 280 | [node name="PanelContainer" type="PanelContainer" parent="tile_set_editor"] 281 | layout_mode = 2 282 | offset_right = 150.0 283 | offset_bottom = 242.0 284 | 285 | [node name="socket_label" type="Label" parent="tile_set_editor/PanelContainer"] 286 | unique_name_in_owner = true 287 | layout_mode = 2 288 | offset_right = 150.0 289 | offset_bottom = 115.0 290 | size_flags_vertical = 0 291 | theme_override_font_sizes/font_size = 14 292 | text = "hash: 293 | up: 294 | down: 295 | left: 296 | right:" 297 | 298 | [node name="VBoxContainer" type="VBoxContainer" parent="tile_set_editor/PanelContainer"] 299 | layout_mode = 2 300 | offset_right = 150.0 301 | offset_bottom = 242.0 302 | 303 | [node name="CenterContainer" type="CenterContainer" parent="tile_set_editor/PanelContainer/VBoxContainer"] 304 | layout_mode = 2 305 | offset_right = 150.0 306 | offset_bottom = 119.0 307 | size_flags_horizontal = 3 308 | size_flags_vertical = 3 309 | 310 | [node name="HBoxContainer3" type="HBoxContainer" parent="tile_set_editor/PanelContainer/VBoxContainer"] 311 | layout_mode = 2 312 | offset_top = 123.0 313 | offset_right = 150.0 314 | offset_bottom = 242.0 315 | size_flags_vertical = 3 316 | alignment = 2 317 | 318 | [node name="HBoxContainer" type="VBoxContainer" parent="tile_set_editor/PanelContainer/VBoxContainer/HBoxContainer3"] 319 | layout_mode = 2 320 | offset_right = 63.0 321 | offset_bottom = 119.0 322 | alignment = 2 323 | 324 | [node name="n" type="Label" parent="tile_set_editor/PanelContainer/VBoxContainer/HBoxContainer3/HBoxContainer"] 325 | layout_mode = 2 326 | offset_top = 63.0 327 | offset_right = 63.0 328 | offset_bottom = 89.0 329 | text = "Name: " 330 | 331 | [node name="w" type="Label" parent="tile_set_editor/PanelContainer/VBoxContainer/HBoxContainer3/HBoxContainer"] 332 | layout_mode = 2 333 | offset_top = 93.0 334 | offset_right = 63.0 335 | offset_bottom = 119.0 336 | text = "Weight: " 337 | 338 | [node name="HBoxContainer2" type="VBoxContainer" parent="tile_set_editor/PanelContainer/VBoxContainer/HBoxContainer3"] 339 | layout_mode = 2 340 | offset_left = 67.0 341 | offset_right = 150.0 342 | offset_bottom = 119.0 343 | alignment = 2 344 | 345 | [node name="name_input" type="TextEdit" parent="tile_set_editor/PanelContainer/VBoxContainer/HBoxContainer3/HBoxContainer2"] 346 | unique_name_in_owner = true 347 | custom_minimum_size = Vector2(0, 34) 348 | layout_mode = 2 349 | offset_top = 50.0 350 | offset_right = 83.0 351 | offset_bottom = 84.0 352 | 353 | [node name="weight_input" type="SpinBox" parent="tile_set_editor/PanelContainer/VBoxContainer/HBoxContainer3/HBoxContainer2"] 354 | unique_name_in_owner = true 355 | layout_mode = 2 356 | offset_top = 88.0 357 | offset_right = 83.0 358 | offset_bottom = 119.0 359 | size_flags_horizontal = 3 360 | max_value = 99999.0 361 | 362 | [node name="PanelContainer2" type="PanelContainer" parent="tile_set_editor"] 363 | layout_mode = 2 364 | offset_left = 154.0 365 | offset_right = 1152.0 366 | offset_bottom = 242.0 367 | size_flags_horizontal = 3 368 | 369 | [node name="Control" type="Control" parent="tile_set_editor/PanelContainer2"] 370 | layout_mode = 2 371 | anchors_preset = 0 372 | offset_right = 998.0 373 | offset_bottom = 242.0 374 | 375 | [node name="cursor" type="ColorRect" parent="tile_set_editor/PanelContainer2/Control"] 376 | unique_name_in_owner = true 377 | visible = false 378 | layout_direction = 1 379 | layout_mode = 0 380 | offset_right = 84.0 381 | offset_bottom = 84.0 382 | 383 | [node name="CenterContainer" type="CenterContainer" parent="tile_set_editor/PanelContainer2"] 384 | layout_mode = 2 385 | offset_right = 998.0 386 | offset_bottom = 242.0 387 | 388 | [node name="tile_set_list" type="GridContainer" parent="tile_set_editor/PanelContainer2/CenterContainer"] 389 | unique_name_in_owner = true 390 | layout_mode = 2 391 | offset_left = 499.0 392 | offset_top = 121.0 393 | offset_right = 499.0 394 | offset_bottom = 121.0 395 | columns = 10 396 | -------------------------------------------------------------------------------- /example/tileset.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="TileSet" load_steps=6 format=3 uid="uid://b3hngxhf5khj"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://bg20v24b02sbj" path="res://example/tilemap_packed.png" id="1_gvk5p"] 4 | 5 | [sub_resource type="TileMapPattern" id="TileMapPattern_w6n5x"] 6 | tile_data = PackedInt32Array(0, 65540, 2, 65536, 131076, 4, 1, 196612, 2, 65537, 196612, 5) 7 | 8 | [sub_resource type="TileMapPattern" id="TileMapPattern_bhjw5"] 9 | tile_data = PackedInt32Array(0, 1245188, 9, 65536, 655364, 4, 1, 1376260, 9, 65537, 720900, 5) 10 | 11 | [sub_resource type="TileMapPattern" id="TileMapPattern_ups46"] 12 | tile_data = PackedInt32Array(0, 1245188, 5, 65536, 393220, 4, 1, 1376260, 5, 65537, 393220, 4) 13 | 14 | [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_1pang"] 15 | texture = ExtResource("1_gvk5p") 16 | 0:0/0 = 0 17 | 1:0/0 = 0 18 | 2:0/0 = 0 19 | 3:0/0 = 0 20 | 4:0/0 = 0 21 | 5:0/0 = 0 22 | 6:0/0 = 0 23 | 7:0/0 = 0 24 | 8:0/0 = 0 25 | 0:1/0 = 0 26 | 1:1/0 = 0 27 | 2:1/0 = 0 28 | 3:1/0 = 0 29 | 4:1/0 = 0 30 | 5:1/0 = 0 31 | 6:1/0 = 0 32 | 7:1/0 = 0 33 | 8:1/0 = 0 34 | 0:2/0 = 0 35 | 1:2/0 = 0 36 | 2:2/0 = 0 37 | 3:2/0 = 0 38 | 4:2/0 = 0 39 | 5:2/0 = 0 40 | 6:2/0 = 0 41 | 7:2/0 = 0 42 | 8:2/0 = 0 43 | 0:3/0 = 0 44 | 1:3/0 = 0 45 | 2:3/0 = 0 46 | 3:3/0 = 0 47 | 4:3/0 = 0 48 | 5:3/0 = 0 49 | 6:3/0 = 0 50 | 7:3/0 = 0 51 | 8:3/0 = 0 52 | 0:4/0 = 0 53 | 1:4/0 = 0 54 | 2:4/0 = 0 55 | 3:4/0 = 0 56 | 4:4/0 = 0 57 | 5:4/0 = 0 58 | 6:4/0 = 0 59 | 7:4/0 = 0 60 | 8:4/0 = 0 61 | 0:5/0 = 0 62 | 1:5/0 = 0 63 | 2:5/0 = 0 64 | 3:5/0 = 0 65 | 4:5/0 = 0 66 | 5:5/0 = 0 67 | 6:5/0 = 0 68 | 7:5/0 = 0 69 | 8:5/0 = 0 70 | 0:6/0 = 0 71 | 1:6/0 = 0 72 | 2:6/0 = 0 73 | 3:6/0 = 0 74 | 4:6/0 = 0 75 | 5:6/0 = 0 76 | 6:6/0 = 0 77 | 7:6/0 = 0 78 | 8:6/0 = 0 79 | 12:0/0 = 0 80 | 13:0/0 = 0 81 | 14:0/0 = 0 82 | 15:0/0 = 0 83 | 11:0/0 = 0 84 | 10:0/0 = 0 85 | 9:0/0 = 0 86 | 16:0/0 = 0 87 | 17:0/0 = 0 88 | 18:0/0 = 0 89 | 19:0/0 = 0 90 | 20:0/0 = 0 91 | 21:0/0 = 0 92 | 22:1/0 = 0 93 | 23:1/0 = 0 94 | 24:1/0 = 0 95 | 25:1/0 = 0 96 | 26:1/0 = 0 97 | 27:1/0 = 0 98 | 28:1/0 = 0 99 | 29:1/0 = 0 100 | 30:1/0 = 0 101 | 31:1/0 = 0 102 | 32:1/0 = 0 103 | 33:1/0 = 0 104 | 34:1/0 = 0 105 | 35:1/0 = 0 106 | 35:2/0 = 0 107 | 36:2/0 = 0 108 | 36:1/0 = 0 109 | 34:0/0 = 0 110 | 33:0/0 = 0 111 | 32:0/0 = 0 112 | 31:0/0 = 0 113 | 30:0/0 = 0 114 | 29:0/0 = 0 115 | 28:0/0 = 0 116 | 27:0/0 = 0 117 | 26:0/0 = 0 118 | 25:0/0 = 0 119 | 24:0/0 = 0 120 | 23:0/0 = 0 121 | 22:0/0 = 0 122 | 35:0/0 = 0 123 | 36:0/0 = 0 124 | 21:1/0 = 0 125 | 20:1/0 = 0 126 | 19:1/0 = 0 127 | 18:1/0 = 0 128 | 17:1/0 = 0 129 | 16:1/0 = 0 130 | 15:1/0 = 0 131 | 14:1/0 = 0 132 | 13:1/0 = 0 133 | 12:1/0 = 0 134 | 11:1/0 = 0 135 | 10:1/0 = 0 136 | 9:1/0 = 0 137 | 9:2/0 = 0 138 | 10:2/0 = 0 139 | 11:2/0 = 0 140 | 12:3/0 = 0 141 | 13:3/0 = 0 142 | 14:3/0 = 0 143 | 15:3/0 = 0 144 | 16:3/0 = 0 145 | 17:3/0 = 0 146 | 18:3/0 = 0 147 | 19:3/0 = 0 148 | 20:3/0 = 0 149 | 21:3/0 = 0 150 | 22:3/0 = 0 151 | 23:3/0 = 0 152 | 24:3/0 = 0 153 | 25:3/0 = 0 154 | 26:3/0 = 0 155 | 27:3/0 = 0 156 | 28:3/0 = 0 157 | 29:3/0 = 0 158 | 30:3/0 = 0 159 | 31:3/0 = 0 160 | 32:3/0 = 0 161 | 33:3/0 = 0 162 | 34:3/0 = 0 163 | 35:3/0 = 0 164 | 11:3/0 = 0 165 | 10:3/0 = 0 166 | 9:3/0 = 0 167 | 16:2/0 = 0 168 | 17:2/0 = 0 169 | 18:2/0 = 0 170 | 19:2/0 = 0 171 | 20:2/0 = 0 172 | 21:2/0 = 0 173 | 22:2/0 = 0 174 | 23:2/0 = 0 175 | 24:2/0 = 0 176 | 25:2/0 = 0 177 | 26:2/0 = 0 178 | 27:2/0 = 0 179 | 28:2/0 = 0 180 | 29:2/0 = 0 181 | 30:2/0 = 0 182 | 31:2/0 = 0 183 | 32:2/0 = 0 184 | 33:2/0 = 0 185 | 34:2/0 = 0 186 | 36:3/0 = 0 187 | 9:5/0 = 0 188 | 10:5/0 = 0 189 | 11:5/0 = 0 190 | 12:5/0 = 0 191 | 13:5/0 = 0 192 | 14:5/0 = 0 193 | 15:5/0 = 0 194 | 16:5/0 = 0 195 | 17:5/0 = 0 196 | 18:5/0 = 0 197 | 19:5/0 = 0 198 | 20:5/0 = 0 199 | 21:5/0 = 0 200 | 22:5/0 = 0 201 | 23:5/0 = 0 202 | 24:5/0 = 0 203 | 25:5/0 = 0 204 | 26:5/0 = 0 205 | 27:5/0 = 0 206 | 28:5/0 = 0 207 | 29:5/0 = 0 208 | 30:5/0 = 0 209 | 31:5/0 = 0 210 | 32:5/0 = 0 211 | 33:5/0 = 0 212 | 34:5/0 = 0 213 | 35:5/0 = 0 214 | 36:5/0 = 0 215 | 33:4/0 = 0 216 | 32:4/0 = 0 217 | 31:4/0 = 0 218 | 30:4/0 = 0 219 | 29:4/0 = 0 220 | 28:4/0 = 0 221 | 27:4/0 = 0 222 | 26:4/0 = 0 223 | 25:4/0 = 0 224 | 24:4/0 = 0 225 | 23:4/0 = 0 226 | 22:4/0 = 0 227 | 21:4/0 = 0 228 | 20:4/0 = 0 229 | 19:4/0 = 0 230 | 18:4/0 = 0 231 | 17:4/0 = 0 232 | 16:4/0 = 0 233 | 15:4/0 = 0 234 | 14:4/0 = 0 235 | 13:4/0 = 0 236 | 12:4/0 = 0 237 | 11:4/0 = 0 238 | 10:4/0 = 0 239 | 9:4/0 = 0 240 | 34:4/0 = 0 241 | 35:4/0 = 0 242 | 36:4/0 = 0 243 | 12:2/0 = 0 244 | 13:2/0 = 0 245 | 14:2/0 = 0 246 | 15:2/0 = 0 247 | 27:6/0 = 0 248 | 26:6/0 = 0 249 | 25:6/0 = 0 250 | 24:6/0 = 0 251 | 23:6/0 = 0 252 | 22:6/0 = 0 253 | 21:6/0 = 0 254 | 20:6/0 = 0 255 | 19:6/0 = 0 256 | 18:6/0 = 0 257 | 17:6/0 = 0 258 | 16:6/0 = 0 259 | 15:6/0 = 0 260 | 14:6/0 = 0 261 | 13:6/0 = 0 262 | 12:6/0 = 0 263 | 11:6/0 = 0 264 | 10:7/0 = 0 265 | 9:7/0 = 0 266 | 8:7/0 = 0 267 | 7:7/0 = 0 268 | 6:7/0 = 0 269 | 5:7/0 = 0 270 | 4:7/0 = 0 271 | 3:7/0 = 0 272 | 2:7/0 = 0 273 | 1:7/0 = 0 274 | 0:8/0 = 0 275 | 0:7/0 = 0 276 | 11:7/0 = 0 277 | 12:7/0 = 0 278 | 13:7/0 = 0 279 | 14:7/0 = 0 280 | 15:7/0 = 0 281 | 28:6/0 = 0 282 | 29:6/0 = 0 283 | 30:6/0 = 0 284 | 31:6/0 = 0 285 | 32:6/0 = 0 286 | 33:6/0 = 0 287 | 34:6/0 = 0 288 | 35:6/0 = 0 289 | 36:6/0 = 0 290 | 10:6/0 = 0 291 | 9:6/0 = 0 292 | 16:7/0 = 0 293 | 17:7/0 = 0 294 | 18:7/0 = 0 295 | 19:7/0 = 0 296 | 20:7/0 = 0 297 | 21:7/0 = 0 298 | 22:7/0 = 0 299 | 23:7/0 = 0 300 | 24:7/0 = 0 301 | 25:7/0 = 0 302 | 26:7/0 = 0 303 | 27:7/0 = 0 304 | 28:7/0 = 0 305 | 29:7/0 = 0 306 | 30:7/0 = 0 307 | 31:7/0 = 0 308 | 32:7/0 = 0 309 | 33:7/0 = 0 310 | 34:7/0 = 0 311 | 35:7/0 = 0 312 | 36:7/0 = 0 313 | 36:8/0 = 0 314 | 35:8/0 = 0 315 | 34:8/0 = 0 316 | 33:8/0 = 0 317 | 32:8/0 = 0 318 | 31:8/0 = 0 319 | 30:8/0 = 0 320 | 29:8/0 = 0 321 | 28:8/0 = 0 322 | 27:8/0 = 0 323 | 26:9/0 = 0 324 | 25:9/0 = 0 325 | 24:9/0 = 0 326 | 23:9/0 = 0 327 | 22:9/0 = 0 328 | 21:9/0 = 0 329 | 20:9/0 = 0 330 | 19:9/0 = 0 331 | 18:9/0 = 0 332 | 17:10/0 = 0 333 | 16:10/0 = 0 334 | 15:10/0 = 0 335 | 14:10/0 = 0 336 | 13:10/0 = 0 337 | 12:10/0 = 0 338 | 11:10/0 = 0 339 | 10:10/0 = 0 340 | 9:11/0 = 0 341 | 8:11/0 = 0 342 | 7:11/0 = 0 343 | 6:11/0 = 0 344 | 5:11/0 = 0 345 | 4:11/0 = 0 346 | 3:11/0 = 0 347 | 2:11/0 = 0 348 | 1:11/0 = 0 349 | 0:11/0 = 0 350 | 2:10/0 = 0 351 | 3:10/0 = 0 352 | 4:10/0 = 0 353 | 5:10/0 = 0 354 | 6:10/0 = 0 355 | 7:10/0 = 0 356 | 8:10/0 = 0 357 | 9:10/0 = 0 358 | 18:10/0 = 0 359 | 19:10/0 = 0 360 | 20:10/0 = 0 361 | 21:10/0 = 0 362 | 22:10/0 = 0 363 | 23:10/0 = 0 364 | 24:10/0 = 0 365 | 25:10/0 = 0 366 | 27:9/0 = 0 367 | 28:9/0 = 0 368 | 29:9/0 = 0 369 | 30:9/0 = 0 370 | 31:9/0 = 0 371 | 32:9/0 = 0 372 | 33:9/0 = 0 373 | 34:9/0 = 0 374 | 35:9/0 = 0 375 | 36:9/0 = 0 376 | 26:8/0 = 0 377 | 25:8/0 = 0 378 | 24:8/0 = 0 379 | 23:8/0 = 0 380 | 22:8/0 = 0 381 | 21:8/0 = 0 382 | 20:8/0 = 0 383 | 19:8/0 = 0 384 | 18:8/0 = 0 385 | 17:8/0 = 0 386 | 16:8/0 = 0 387 | 15:8/0 = 0 388 | 14:8/0 = 0 389 | 13:8/0 = 0 390 | 12:8/0 = 0 391 | 11:8/0 = 0 392 | 10:8/0 = 0 393 | 9:8/0 = 0 394 | 8:8/0 = 0 395 | 7:8/0 = 0 396 | 6:8/0 = 0 397 | 5:8/0 = 0 398 | 4:8/0 = 0 399 | 3:8/0 = 0 400 | 2:8/0 = 0 401 | 1:8/0 = 0 402 | 0:9/0 = 0 403 | 1:9/0 = 0 404 | 2:9/0 = 0 405 | 3:9/0 = 0 406 | 4:9/0 = 0 407 | 5:9/0 = 0 408 | 6:9/0 = 0 409 | 7:9/0 = 0 410 | 8:9/0 = 0 411 | 9:9/0 = 0 412 | 10:9/0 = 0 413 | 11:9/0 = 0 414 | 12:9/0 = 0 415 | 13:9/0 = 0 416 | 14:9/0 = 0 417 | 15:9/0 = 0 418 | 16:9/0 = 0 419 | 17:9/0 = 0 420 | 26:10/0 = 0 421 | 27:10/0 = 0 422 | 28:10/0 = 0 423 | 29:10/0 = 0 424 | 30:10/0 = 0 425 | 31:10/0 = 0 426 | 32:10/0 = 0 427 | 33:10/0 = 0 428 | 34:10/0 = 0 429 | 35:10/0 = 0 430 | 36:10/0 = 0 431 | 36:11/0 = 0 432 | 35:11/0 = 0 433 | 34:11/0 = 0 434 | 33:11/0 = 0 435 | 32:11/0 = 0 436 | 31:11/0 = 0 437 | 30:11/0 = 0 438 | 29:11/0 = 0 439 | 28:11/0 = 0 440 | 27:11/0 = 0 441 | 26:11/0 = 0 442 | 25:11/0 = 0 443 | 24:11/0 = 0 444 | 23:11/0 = 0 445 | 22:11/0 = 0 446 | 21:11/0 = 0 447 | 20:11/0 = 0 448 | 19:11/0 = 0 449 | 18:11/0 = 0 450 | 17:11/0 = 0 451 | 16:11/0 = 0 452 | 15:11/0 = 0 453 | 14:11/0 = 0 454 | 13:11/0 = 0 455 | 12:11/0 = 0 456 | 11:11/0 = 0 457 | 10:11/0 = 0 458 | 8:12/0 = 0 459 | 7:12/0 = 0 460 | 6:12/0 = 0 461 | 5:12/0 = 0 462 | 4:12/0 = 0 463 | 3:12/0 = 0 464 | 2:12/0 = 0 465 | 1:12/0 = 0 466 | 0:12/0 = 0 467 | 9:12/0 = 0 468 | 10:12/0 = 0 469 | 11:12/0 = 0 470 | 12:12/0 = 0 471 | 13:12/0 = 0 472 | 14:12/0 = 0 473 | 15:12/0 = 0 474 | 16:12/0 = 0 475 | 17:12/0 = 0 476 | 18:12/0 = 0 477 | 19:12/0 = 0 478 | 20:12/0 = 0 479 | 21:12/0 = 0 480 | 22:12/0 = 0 481 | 23:12/0 = 0 482 | 24:12/0 = 0 483 | 25:12/0 = 0 484 | 26:12/0 = 0 485 | 27:12/0 = 0 486 | 28:12/0 = 0 487 | 29:12/0 = 0 488 | 36:12/0 = 0 489 | 36:13/0 = 0 490 | 35:13/0 = 0 491 | 34:13/0 = 0 492 | 33:13/0 = 0 493 | 32:13/0 = 0 494 | 31:13/0 = 0 495 | 30:13/0 = 0 496 | 29:13/0 = 0 497 | 28:13/0 = 0 498 | 27:13/0 = 0 499 | 26:13/0 = 0 500 | 25:13/0 = 0 501 | 24:13/0 = 0 502 | 23:13/0 = 0 503 | 22:13/0 = 0 504 | 21:13/0 = 0 505 | 20:13/0 = 0 506 | 19:13/0 = 0 507 | 18:13/0 = 0 508 | 17:13/0 = 0 509 | 16:13/0 = 0 510 | 15:13/0 = 0 511 | 14:13/0 = 0 512 | 13:13/0 = 0 513 | 12:13/0 = 0 514 | 11:13/0 = 0 515 | 10:13/0 = 0 516 | 9:13/0 = 0 517 | 8:13/0 = 0 518 | 7:13/0 = 0 519 | 6:13/0 = 0 520 | 5:13/0 = 0 521 | 4:13/0 = 0 522 | 3:14/0 = 0 523 | 2:14/0 = 0 524 | 1:14/0 = 0 525 | 0:14/0 = 0 526 | 4:14/0 = 0 527 | 5:14/0 = 0 528 | 6:14/0 = 0 529 | 7:14/0 = 0 530 | 8:14/0 = 0 531 | 9:14/0 = 0 532 | 10:14/0 = 0 533 | 11:14/0 = 0 534 | 12:14/0 = 0 535 | 13:14/0 = 0 536 | 14:14/0 = 0 537 | 15:14/0 = 0 538 | 16:14/0 = 0 539 | 17:14/0 = 0 540 | 18:14/0 = 0 541 | 19:14/0 = 0 542 | 20:14/0 = 0 543 | 21:14/0 = 0 544 | 22:14/0 = 0 545 | 23:14/0 = 0 546 | 24:14/0 = 0 547 | 25:14/0 = 0 548 | 26:14/0 = 0 549 | 27:14/0 = 0 550 | 28:14/0 = 0 551 | 29:14/0 = 0 552 | 30:14/0 = 0 553 | 31:14/0 = 0 554 | 32:14/0 = 0 555 | 33:14/0 = 0 556 | 34:14/0 = 0 557 | 35:14/0 = 0 558 | 36:14/0 = 0 559 | 20:15/0 = 0 560 | 19:15/0 = 0 561 | 18:15/0 = 0 562 | 17:15/0 = 0 563 | 16:15/0 = 0 564 | 15:15/0 = 0 565 | 14:15/0 = 0 566 | 13:15/0 = 0 567 | 12:15/0 = 0 568 | 11:15/0 = 0 569 | 10:15/0 = 0 570 | 9:15/0 = 0 571 | 8:15/0 = 0 572 | 7:15/0 = 0 573 | 6:15/0 = 0 574 | 5:15/0 = 0 575 | 4:15/0 = 0 576 | 3:15/0 = 0 577 | 2:16/0 = 0 578 | 1:16/0 = 0 579 | 0:16/0 = 0 580 | 3:16/0 = 0 581 | 4:16/0 = 0 582 | 5:16/0 = 0 583 | 6:16/0 = 0 584 | 7:16/0 = 0 585 | 8:16/0 = 0 586 | 9:16/0 = 0 587 | 10:16/0 = 0 588 | 11:16/0 = 0 589 | 12:16/0 = 0 590 | 13:16/0 = 0 591 | 14:16/0 = 0 592 | 15:16/0 = 0 593 | 16:16/0 = 0 594 | 17:16/0 = 0 595 | 18:16/0 = 0 596 | 19:16/0 = 0 597 | 20:16/0 = 0 598 | 21:16/0 = 0 599 | 22:16/0 = 0 600 | 23:16/0 = 0 601 | 24:16/0 = 0 602 | 25:16/0 = 0 603 | 26:16/0 = 0 604 | 27:16/0 = 0 605 | 28:16/0 = 0 606 | 29:16/0 = 0 607 | 30:16/0 = 0 608 | 31:16/0 = 0 609 | 32:16/0 = 0 610 | 33:16/0 = 0 611 | 34:16/0 = 0 612 | 35:16/0 = 0 613 | 36:16/0 = 0 614 | 36:17/0 = 0 615 | 36:18/0 = 0 616 | 35:18/0 = 0 617 | 34:18/0 = 0 618 | 33:18/0 = 0 619 | 32:18/0 = 0 620 | 31:18/0 = 0 621 | 30:18/0 = 0 622 | 29:18/0 = 0 623 | 28:18/0 = 0 624 | 27:18/0 = 0 625 | 26:18/0 = 0 626 | 25:18/0 = 0 627 | 24:18/0 = 0 628 | 23:18/0 = 0 629 | 22:18/0 = 0 630 | 21:18/0 = 0 631 | 20:18/0 = 0 632 | 19:18/0 = 0 633 | 18:18/0 = 0 634 | 17:18/0 = 0 635 | 16:18/0 = 0 636 | 15:18/0 = 0 637 | 14:18/0 = 0 638 | 13:18/0 = 0 639 | 12:18/0 = 0 640 | 11:18/0 = 0 641 | 10:18/0 = 0 642 | 9:18/0 = 0 643 | 8:18/0 = 0 644 | 7:18/0 = 0 645 | 6:18/0 = 0 646 | 5:18/0 = 0 647 | 4:18/0 = 0 648 | 3:18/0 = 0 649 | 2:18/0 = 0 650 | 1:18/0 = 0 651 | 0:18/0 = 0 652 | 36:19/0 = 0 653 | 36:20/0 = 0 654 | 35:20/0 = 0 655 | 34:20/0 = 0 656 | 33:20/0 = 0 657 | 32:20/0 = 0 658 | 31:20/0 = 0 659 | 30:20/0 = 0 660 | 29:20/0 = 0 661 | 28:20/0 = 0 662 | 27:20/0 = 0 663 | 26:20/0 = 0 664 | 25:20/0 = 0 665 | 24:20/0 = 0 666 | 23:20/0 = 0 667 | 22:20/0 = 0 668 | 21:20/0 = 0 669 | 20:19/0 = 0 670 | 19:19/0 = 0 671 | 18:19/0 = 0 672 | 17:19/0 = 0 673 | 16:19/0 = 0 674 | 15:19/0 = 0 675 | 14:19/0 = 0 676 | 13:19/0 = 0 677 | 12:19/0 = 0 678 | 11:19/0 = 0 679 | 10:19/0 = 0 680 | 9:19/0 = 0 681 | 8:20/0 = 0 682 | 7:20/0 = 0 683 | 6:20/0 = 0 684 | 5:20/0 = 0 685 | 4:20/0 = 0 686 | 3:20/0 = 0 687 | 2:20/0 = 0 688 | 1:21/0 = 0 689 | 0:21/0 = 0 690 | 0:22/0 = 0 691 | 1:22/0 = 0 692 | 2:22/0 = 0 693 | 3:22/0 = 0 694 | 4:22/0 = 0 695 | 5:22/0 = 0 696 | 6:22/0 = 0 697 | 7:22/0 = 0 698 | 8:22/0 = 0 699 | 9:22/0 = 0 700 | 10:22/0 = 0 701 | 11:22/0 = 0 702 | 12:22/0 = 0 703 | 13:22/0 = 0 704 | 14:22/0 = 0 705 | 15:22/0 = 0 706 | 16:22/0 = 0 707 | 17:22/0 = 0 708 | 18:22/0 = 0 709 | 19:22/0 = 0 710 | 20:22/0 = 0 711 | 21:22/0 = 0 712 | 22:22/0 = 0 713 | 23:22/0 = 0 714 | 24:22/0 = 0 715 | 25:22/0 = 0 716 | 26:22/0 = 0 717 | 27:22/0 = 0 718 | 28:22/0 = 0 719 | 29:22/0 = 0 720 | 30:22/0 = 0 721 | 31:22/0 = 0 722 | 32:22/0 = 0 723 | 33:22/0 = 0 724 | 34:22/0 = 0 725 | 35:22/0 = 0 726 | 36:22/0 = 0 727 | 36:23/0 = 0 728 | 35:23/0 = 0 729 | 34:23/0 = 0 730 | 33:23/0 = 0 731 | 32:23/0 = 0 732 | 31:23/0 = 0 733 | 30:23/0 = 0 734 | 29:23/0 = 0 735 | 10:23/0 = 0 736 | 9:23/0 = 0 737 | 8:23/0 = 0 738 | 7:23/0 = 0 739 | 6:23/0 = 0 740 | 5:23/0 = 0 741 | 4:23/0 = 0 742 | 3:23/0 = 0 743 | 2:23/0 = 0 744 | 1:23/0 = 0 745 | 0:23/0 = 0 746 | 0:24/0 = 0 747 | 1:24/0 = 0 748 | 2:24/0 = 0 749 | 3:24/0 = 0 750 | 4:24/0 = 0 751 | 5:24/0 = 0 752 | 6:24/0 = 0 753 | 7:24/0 = 0 754 | 8:24/0 = 0 755 | 9:24/0 = 0 756 | 10:24/0 = 0 757 | 11:24/0 = 0 758 | 12:24/0 = 0 759 | 13:24/0 = 0 760 | 14:24/0 = 0 761 | 15:24/0 = 0 762 | 16:24/0 = 0 763 | 17:24/0 = 0 764 | 18:24/0 = 0 765 | 19:24/0 = 0 766 | 20:24/0 = 0 767 | 21:24/0 = 0 768 | 22:24/0 = 0 769 | 23:24/0 = 0 770 | 24:24/0 = 0 771 | 25:24/0 = 0 772 | 26:24/0 = 0 773 | 27:24/0 = 0 774 | 28:24/0 = 0 775 | 29:24/0 = 0 776 | 30:25/0 = 0 777 | 31:25/0 = 0 778 | 32:25/0 = 0 779 | 33:25/0 = 0 780 | 34:25/0 = 0 781 | 35:25/0 = 0 782 | 36:25/0 = 0 783 | 36:26/0 = 0 784 | 35:26/0 = 0 785 | 34:26/0 = 0 786 | 33:26/0 = 0 787 | 32:26/0 = 0 788 | 31:26/0 = 0 789 | 30:26/0 = 0 790 | 29:25/0 = 0 791 | 28:25/0 = 0 792 | 27:25/0 = 0 793 | 26:25/0 = 0 794 | 25:25/0 = 0 795 | 24:25/0 = 0 796 | 23:25/0 = 0 797 | 22:25/0 = 0 798 | 21:25/0 = 0 799 | 20:25/0 = 0 800 | 19:25/0 = 0 801 | 18:25/0 = 0 802 | 17:25/0 = 0 803 | 16:25/0 = 0 804 | 15:25/0 = 0 805 | 14:25/0 = 0 806 | 13:25/0 = 0 807 | 12:25/0 = 0 808 | 11:25/0 = 0 809 | 10:25/0 = 0 810 | 9:25/0 = 0 811 | 8:25/0 = 0 812 | 7:25/0 = 0 813 | 6:25/0 = 0 814 | 5:25/0 = 0 815 | 4:25/0 = 0 816 | 3:25/0 = 0 817 | 2:25/0 = 0 818 | 1:25/0 = 0 819 | 0:25/0 = 0 820 | 7:26/0 = 0 821 | 8:26/0 = 0 822 | 9:26/0 = 0 823 | 10:26/0 = 0 824 | 11:26/0 = 0 825 | 12:26/0 = 0 826 | 13:26/0 = 0 827 | 14:26/0 = 0 828 | 15:26/0 = 0 829 | 16:26/0 = 0 830 | 17:26/0 = 0 831 | 18:26/0 = 0 832 | 19:26/0 = 0 833 | 20:26/0 = 0 834 | 21:26/0 = 0 835 | 22:26/0 = 0 836 | 23:26/0 = 0 837 | 24:26/0 = 0 838 | 25:26/0 = 0 839 | 26:26/0 = 0 840 | 27:26/0 = 0 841 | 28:26/0 = 0 842 | 29:26/0 = 0 843 | 6:26/0 = 0 844 | 5:27/0 = 0 845 | 4:27/0 = 0 846 | 3:27/0 = 0 847 | 2:27/0 = 0 848 | 1:27/0 = 0 849 | 0:27/0 = 0 850 | 6:27/0 = 0 851 | 7:27/0 = 0 852 | 8:27/0 = 0 853 | 9:27/0 = 0 854 | 10:27/0 = 0 855 | 11:27/0 = 0 856 | 12:27/0 = 0 857 | 13:27/0 = 0 858 | 14:27/0 = 0 859 | 15:27/0 = 0 860 | 16:27/0 = 0 861 | 17:27/0 = 0 862 | 18:27/0 = 0 863 | 19:27/0 = 0 864 | 20:27/0 = 0 865 | 21:27/0 = 0 866 | 22:27/0 = 0 867 | 23:27/0 = 0 868 | 24:27/0 = 0 869 | 25:27/0 = 0 870 | 26:27/0 = 0 871 | 27:27/0 = 0 872 | 28:27/0 = 0 873 | 29:27/0 = 0 874 | 30:27/0 = 0 875 | 31:27/0 = 0 876 | 32:27/0 = 0 877 | 33:27/0 = 0 878 | 34:27/0 = 0 879 | 35:27/0 = 0 880 | 36:27/0 = 0 881 | 10:21/0 = 0 882 | 11:21/0 = 0 883 | 12:20/0 = 0 884 | 13:20/0 = 0 885 | 13:17/0 = 0 886 | 7:17/0 = 0 887 | 7:19/0 = 0 888 | 7:21/0 = 0 889 | 5:21/0 = 0 890 | 4:19/0 = 0 891 | 3:17/0 = 0 892 | 2:15/0 = 0 893 | 1:13/0 = 0 894 | 1:10/0 = 0 895 | 0:10/0 = 0 896 | 0:13/0 = 0 897 | 0:15/0 = 0 898 | 0:17/0 = 0 899 | 0:19/0 = 0 900 | 0:20/0 = 0 901 | 2:13/0 = 0 902 | 2:17/0 = 0 903 | 2:19/0 = 0 904 | 2:21/0 = 0 905 | 2:26/0 = 0 906 | 1:20/0 = 0 907 | 1:19/0 = 0 908 | 1:17/0 = 0 909 | 1:15/0 = 0 910 | 5:17/0 = 0 911 | 5:19/0 = 0 912 | 4:21/0 = 0 913 | 3:26/0 = 0 914 | 1:26/0 = 0 915 | 0:26/0 = 0 916 | 4:17/0 = 0 917 | 5:26/0 = 0 918 | 4:26/0 = 0 919 | 3:13/0 = 0 920 | 6:21/0 = 0 921 | 6:19/0 = 0 922 | 6:17/0 = 0 923 | 3:19/0 = 0 924 | 3:21/0 = 0 925 | 11:17/0 = 0 926 | 11:20/0 = 0 927 | 11:23/0 = 0 928 | 10:17/0 = 0 929 | 9:17/0 = 0 930 | 9:20/0 = 0 931 | 9:21/0 = 0 932 | 8:21/0 = 0 933 | 8:19/0 = 0 934 | 8:17/0 = 0 935 | 10:20/0 = 0 936 | 14:20/0 = 0 937 | 14:21/0 = 0 938 | 14:23/0 = 0 939 | 15:23/0 = 0 940 | 15:21/0 = 0 941 | 15:20/0 = 0 942 | 15:17/0 = 0 943 | 14:17/0 = 0 944 | 13:23/0 = 0 945 | 13:21/0 = 0 946 | 12:17/0 = 0 947 | 16:21/0 = 0 948 | 16:23/0 = 0 949 | 23:23/0 = 0 950 | 24:23/0 = 0 951 | 25:23/0 = 0 952 | 28:23/0 = 0 953 | 27:23/0 = 0 954 | 26:23/0 = 0 955 | 35:24/0 = 0 956 | 34:24/0 = 0 957 | 33:24/0 = 0 958 | 32:24/0 = 0 959 | 31:24/0 = 0 960 | 30:24/0 = 0 961 | 22:23/0 = 0 962 | 21:23/0 = 0 963 | 20:23/0 = 0 964 | 19:23/0 = 0 965 | 18:23/0 = 0 966 | 17:23/0 = 0 967 | 36:21/0 = 0 968 | 35:21/0 = 0 969 | 34:21/0 = 0 970 | 33:21/0 = 0 971 | 32:21/0 = 0 972 | 31:21/0 = 0 973 | 30:21/0 = 0 974 | 29:21/0 = 0 975 | 28:21/0 = 0 976 | 27:21/0 = 0 977 | 26:21/0 = 0 978 | 25:21/0 = 0 979 | 24:21/0 = 0 980 | 23:21/0 = 0 981 | 22:21/0 = 0 982 | 21:21/0 = 0 983 | 20:21/0 = 0 984 | 19:21/0 = 0 985 | 18:21/0 = 0 986 | 17:21/0 = 0 987 | 20:20/0 = 0 988 | 27:19/0 = 0 989 | 26:19/0 = 0 990 | 25:19/0 = 0 991 | 24:19/0 = 0 992 | 23:19/0 = 0 993 | 22:19/0 = 0 994 | 21:19/0 = 0 995 | 17:20/0 = 0 996 | 16:20/0 = 0 997 | 31:17/0 = 0 998 | 30:17/0 = 0 999 | 29:17/0 = 0 1000 | 28:17/0 = 0 1001 | 27:17/0 = 0 1002 | 26:17/0 = 0 1003 | 25:17/0 = 0 1004 | 24:17/0 = 0 1005 | 23:17/0 = 0 1006 | 22:17/0 = 0 1007 | 21:17/0 = 0 1008 | 20:17/0 = 0 1009 | 19:17/0 = 0 1010 | 18:17/0 = 0 1011 | 17:17/0 = 0 1012 | 16:17/0 = 0 1013 | 32:17/0 = 0 1014 | 33:17/0 = 0 1015 | 34:17/0 = 0 1016 | 35:17/0 = 0 1017 | 25:15/0 = 0 1018 | 24:15/0 = 0 1019 | 23:15/0 = 0 1020 | 22:15/0 = 0 1021 | 21:15/0 = 0 1022 | 26:15/0 = 0 1023 | 27:15/0 = 0 1024 | 28:15/0 = 0 1025 | 29:15/0 = 0 1026 | 30:15/0 = 0 1027 | 31:15/0 = 0 1028 | 31:12/0 = 0 1029 | 32:12/0 = 0 1030 | 33:12/0 = 0 1031 | 35:12/0 = 0 1032 | 35:15/0 = 0 1033 | 36:15/0 = 0 1034 | 35:19/0 = 0 1035 | 34:12/0 = 0 1036 | 36:24/0 = 0 1037 | 34:19/0 = 0 1038 | 33:19/0 = 0 1039 | 32:15/0 = 0 1040 | 31:19/0 = 0 1041 | 29:19/0 = 0 1042 | 30:12/0 = 0 1043 | 12:23/0 = 0 1044 | 18:20/0 = 0 1045 | 34:15/0 = 0 1046 | 1047 | [resource] 1048 | sources/4 = SubResource("TileSetAtlasSource_1pang") 1049 | pattern_0 = SubResource("TileMapPattern_w6n5x") 1050 | pattern_1 = SubResource("TileMapPattern_bhjw5") 1051 | pattern_2 = SubResource("TileMapPattern_ups46") 1052 | -------------------------------------------------------------------------------- /example/create_wfc_tile_set.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://svcvx8l55myf"] 2 | 3 | [ext_resource type="TileSet" uid="uid://b3hngxhf5khj" path="res://example/tileset.tres" id="1_kg70i"] 4 | 5 | [node name="create_wfc_tile_set" type="Node2D"] 6 | 7 | [node name="reference" type="TileMap" parent="."] 8 | tile_set = ExtResource("1_kg70i") 9 | format = 2 10 | layer_0/name = "sockets" 11 | layer_0/tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 1441796, 0, 196608, 1441796, 0, 262144, 1441796, 0, 327680, 1441796, 0, 393216, 1441796, 0, 458752, 1441796, 0, 524288, 1441796, 0, 589824, 1441796, 0, 655360, 1441796, 0, 720896, 1441796, 0, 786432, 1441796, 0, 851968, 1441796, 0, 917504, 1441796, 0, 983040, 1441796, 0, 1048576, 1441796, 0, 1114112, 1441796, 0, 1, 1441796, 0, 327681, 1441796, 0, 393217, 1441796, 0, 720897, 1441796, 0, 786433, 1441796, 0, 1114113, 1441796, 0, 2, 1441796, 0, 327682, 720900, 19, 393218, 720900, 19, 720898, 1441796, 0, 786434, 720900, 19, 1114114, 720900, 19, 3, 1441796, 0, 327683, 720900, 19, 393219, 720900, 19, 720899, 1441796, 0, 1114115, 720900, 19, 4, 1441796, 0, 327684, 1441796, 0, 393220, 1441796, 0, 720900, 1441796, 0, 786436, 1441796, 0, 1114116, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 720900, 19, 262149, 1441796, 0, 327685, 1441796, 0, 393221, 1441796, 0, 458757, 1441796, 0, 524293, 720900, 19, 589829, 720900, 19, 655365, 1441796, 0, 720901, 1441796, 0, 786437, 1441796, 0, 851973, 1441796, 0, 917509, 1441796, 0, 983045, 1441796, 0, 1048581, 1441796, 0, 1114117, 1441796, 0, 6, 1441796, 0, 65542, 1441796, 0, 131078, 720900, 19, 196614, 720900, 19, 262150, 1441796, 0, 327686, 1441796, 0, 393222, 1441796, 0, 458758, 1441796, 0, 524294, 720900, 19, 589830, 720900, 19, 655366, 1441796, 0, 720902, 1441796, 0, 786438, 1441796, 0, 851974, 1441796, 0, 917510, 720900, 19, 983046, 720900, 19, 1048582, 1441796, 0, 1114118, 1441796, 0, 7, 1441796, 0, 327687, 1441796, 0, 393223, 1441796, 0, 720903, 1441796, 0, 786439, 1441796, 0, 1114119, 1441796, 0, 8, 1441796, 0, 327688, 720900, 19, 393224, 720900, 19, 720904, 1441796, 0, 786440, 1441796, 0, 1114120, 1441796, 0, 9, 1441796, 0, 327689, 720900, 19, 393225, 720900, 19, 720905, 1441796, 0, 786441, 1441796, 0, 1114121, 1441796, 0, 10, 1441796, 0, 327690, 1441796, 0, 393226, 1441796, 0, 720906, 1441796, 0, 786442, 1441796, 0, 1114122, 1441796, 0, 11, 1441796, 0, 65547, 1441796, 0, 131083, 1441796, 0, 196619, 1441796, 0, 262155, 1441796, 0, 327691, 1441796, 0, 393227, 1441796, 0, 458763, 1441796, 0, 524299, 1441796, 0, 589835, 1441796, 0, 655371, 1441796, 0, 720907, 1441796, 0, 786443, 1441796, 0, 851979, 1441796, 0, 917515, 720900, 19, 983051, 720900, 19, 1048587, 1441796, 0, 1114123, 1441796, 0, 12, 1441796, 0, 65548, 1441796, 0, 131084, 1441796, 0, 196620, 1441796, 0, 262156, 1441796, 0, 327692, 1441796, 0, 393228, 1441796, 0, 458764, 1441796, 0, 524300, 720900, 19, 589836, 720900, 19, 655372, 1441796, 0, 720908, 1441796, 0, 13, 1441796, 0, 327693, 1441796, 0, 393229, 1441796, 0, 720909, 1441796, 0, 14, 720900, 19, 327694, 720900, 19, 393230, 1441796, 0, 720910, 720900, 19, 15, 720900, 19, 327695, 720900, 19, 393231, 1441796, 0, 720911, 720900, 19, 16, 1441796, 0, 327696, 1441796, 0, 393232, 1441796, 0, 720912, 1441796, 0, 17, 1441796, 0, 65553, 1441796, 0, 131089, 720900, 19, 196625, 720900, 19, 262161, 1441796, 0, 327697, 1441796, 0, 393233, 1441796, 0, 458769, 1441796, 0, 524305, 720900, 19, 589841, 720900, 19, 655377, 1441796, 0, 720913, 1441796, 0, 18, 1441796, 0, 65554, 1441796, 0, 131090, 720900, 19, 196626, 720900, 19, 262162, 1441796, 0, 327698, 1441796, 0, 393234, 1441796, 0, 458770, 1441796, 0, 524306, 720900, 19, 589842, 720900, 19, 655378, 1441796, 0, 720914, 1441796, 0, 19, 1441796, 0, 327699, 1441796, 0, 393235, 1441796, 0, 720915, 1441796, 0, 20, 720900, 19, 327700, 720900, 19, 393236, 720900, 19, 720916, 1441796, 0, 21, 720900, 19, 327701, 720900, 19, 393237, 720900, 19, 720917, 1441796, 0, 22, 1441796, 0, 327702, 1441796, 0, 393238, 1441796, 0, 720918, 1441796, 0, 23, 1441796, 0, 65559, 1441796, 0, 131095, 1441796, 0, 196631, 1441796, 0, 262167, 1441796, 0, 327703, 1441796, 0, 393239, 1441796, 0, 458775, 1441796, 0, 524311, 720900, 19, 589847, 720900, 19, 655383, 1441796, 0, 720919, 1441796, 0, 24, 1441796, 0, 65560, 1441796, 0, 131096, 720900, 19, 196632, 720900, 19, 262168, 1441796, 0, 327704, 1441796, 0, 393240, 1441796, 0, 458776, 1441796, 0, 524312, 1441796, 0, 589848, 1441796, 0, 655384, 1441796, 0, 720920, 1441796, 0, 25, 1441796, 0, 327705, 1441796, 0, 393241, 1441796, 0, 720921, 1441796, 0, 26, 720900, 19, 327706, 720900, 19, 393242, 1441796, 0, 720922, 1441796, 0, 27, 720900, 19, 327707, 720900, 19, 393243, 1441796, 0, 720923, 1441796, 0, 28, 1441796, 0, 327708, 1441796, 0, 393244, 1441796, 0, 720924, 1441796, 0, 29, 1441796, 0, 65565, 1441796, 0, 131101, 720900, 19, 196637, 720900, 19, 262173, 1441796, 0, 327709, 1441796, 0, 393245, 1441796, 0, 458781, 1441796, 0, 524317, 1441796, 0, 589853, 1441796, 0, 655389, 1441796, 0, 720925, 1441796, 0, 196621, 1441796, 0, 196622, 720900, 19, 196623, 720900, 19, 262159, 720900, 19, 262158, 720900, 19, 262157, 1441796, 0, 262160, 1441796, 0, 196624, 720900, 19, 131088, 720900, 19, 65551, 720900, 19, 65550, 720900, 19, 131086, 720900, 19, 131085, 1441796, 0, 65549, 1441796, 0, 131087, 720900, 19, 65552, 1441796, 0, 65543, 1441796, 0, 131079, 720900, 19, 196615, 720900, 19, 262151, 1441796, 0, 262152, 720900, 19, 262153, 720900, 19, 262154, 1441796, 0, 196618, 1441796, 0, 131082, 1441796, 0, 65546, 1441796, 0, 65545, 1441796, 0, 65544, 1441796, 0, 131080, 720900, 19, 196616, 720900, 19, 196617, 720900, 19, 131081, 720900, 19, 65537, 1441796, 0, 131074, 720900, 19, 131075, 720900, 19, 196611, 720900, 19, 196612, 720900, 19, 262148, 1441796, 0, 131073, 1441796, 0, 196609, 1441796, 0, 262145, 1441796, 0, 196610, 720900, 19, 262146, 720900, 19, 262147, 720900, 19, 65539, 1441796, 0, 65540, 1441796, 0, 131076, 720900, 19, 65538, 1441796, 0, 458753, 1441796, 0, 524289, 1441796, 0, 589825, 1441796, 0, 589826, 720900, 19, 655362, 1441796, 0, 524290, 720900, 19, 655361, 1441796, 0, 458754, 720900, 19, 458755, 720900, 19, 524291, 720900, 19, 458756, 1441796, 0, 524292, 720900, 19, 589828, 720900, 19, 655364, 1441796, 0, 655363, 1441796, 0, 589827, 720900, 19, 458759, 1441796, 0, 524295, 720900, 19, 589831, 720900, 19, 655367, 1441796, 0, 655368, 1441796, 0, 589832, 720900, 19, 524296, 720900, 19, 458760, 720900, 19, 655369, 1441796, 0, 589833, 720900, 19, 524297, 720900, 19, 458761, 720900, 19, 458762, 1441796, 0, 524298, 1441796, 0, 589834, 1441796, 0, 655370, 1441796, 0, 458765, 1441796, 0, 524301, 720900, 19, 589837, 720900, 19, 655373, 1441796, 0, 655374, 720900, 19, 589838, 720900, 19, 524302, 720900, 19, 458766, 1441796, 0, 655375, 720900, 19, 655376, 1441796, 0, 589840, 720900, 19, 524304, 720900, 19, 458768, 1441796, 0, 458767, 1441796, 0, 589839, 720900, 19, 524303, 720900, 19, 196629, 720900, 19, 131093, 720900, 19, 65557, 720900, 19, 65556, 720900, 19, 65555, 1441796, 0, 131091, 720900, 19, 196627, 720900, 19, 262163, 1441796, 0, 262164, 720900, 19, 196628, 720900, 19, 131092, 720900, 19, 262165, 720900, 19, 262166, 1441796, 0, 196630, 1441796, 0, 131094, 1441796, 0, 65558, 1441796, 0, 655380, 1441796, 0, 589844, 720900, 19, 524308, 720900, 19, 458772, 720900, 19, 458771, 1441796, 0, 524307, 720900, 19, 589843, 720900, 19, 655379, 1441796, 0, 458773, 720900, 19, 524309, 720900, 19, 589845, 720900, 19, 655381, 1441796, 0, 655382, 1441796, 0, 589846, 720900, 19, 524310, 720900, 19, 458774, 1441796, 0, 131098, 720900, 19, 65562, 720900, 19, 65561, 1441796, 0, 131097, 720900, 19, 196633, 720900, 19, 262169, 1441796, 0, 262170, 720900, 19, 196634, 720900, 19, 196635, 720900, 19, 131099, 720900, 19, 65563, 720900, 19, 65564, 1441796, 0, 131100, 720900, 19, 196636, 720900, 19, 262172, 1441796, 0, 262171, 720900, 19, 524314, 1441796, 0, 458778, 1441796, 0, 458777, 1441796, 0, 524313, 1441796, 0, 589849, 1441796, 0, 655385, 1441796, 0, 655386, 1441796, 0, 589850, 1441796, 0, 589851, 1441796, 0, 524315, 1441796, 0, 458779, 1441796, 0, 458780, 1441796, 0, 524316, 1441796, 0, 589852, 1441796, 0, 655388, 1441796, 0, 655387, 1441796, 0, 983047, 720900, 19, 917511, 720900, 19, 851975, 1441796, 0, 851976, 1441796, 0, 917512, 720900, 19, 983048, 720900, 19, 1048584, 1441796, 0, 1048583, 1441796, 0, 1048585, 1441796, 0, 983049, 720900, 19, 917513, 720900, 19, 851977, 1441796, 0, 851978, 1441796, 0, 917514, 720900, 19, 983050, 720900, 19, 1048586, 1441796, 0, 983043, 720900, 19, 917507, 720900, 19, 851971, 720900, 19, 851970, 720900, 19, 851969, 1441796, 0, 917505, 1441796, 0, 983041, 1441796, 0, 1048577, 1441796, 0, 1048578, 720900, 19, 983042, 720900, 19, 917506, 720900, 19, 1048579, 720900, 19, 1048580, 1441796, 0, 983044, 1441796, 0, 917508, 1441796, 0, 851972, 1441796, 0, 786435, 720900, 19, 196613, 720900, 19) 12 | layer_1/name = "ground" 13 | layer_1/tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 393216, 65540, 26, 458752, 65540, 26, 524288, 65540, 26, 589824, 65540, 26, 655360, 65540, 26, 720896, 65540, 26, 786432, 65540, 26, 851968, 65540, 26, 917504, 65540, 26, 983040, 65540, 26, 1048576, 65540, 26, 1114112, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 393217, 65540, 26, 458753, 65540, 26, 524289, 65540, 26, 589825, 65540, 26, 655361, 65540, 26, 720897, 65540, 26, 786433, 65540, 26, 851969, 65540, 26, 917505, 65540, 26, 983041, 65540, 26, 1048577, 65540, 26, 1114113, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 393218, 65540, 26, 458754, 65540, 26, 524290, 65540, 26, 589826, 65540, 26, 655362, 65540, 26, 720898, 65540, 26, 786434, 65540, 26, 851970, 65540, 26, 917506, 65540, 26, 983042, 65540, 26, 1048578, 65540, 26, 1114114, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 393219, 65540, 26, 458755, 65540, 26, 524291, 65540, 26, 589827, 65540, 26, 655363, 65540, 26, 720899, 65540, 26, 786435, 65540, 26, 851971, 65540, 26, 917507, 65540, 26, 983043, 65540, 26, 1048579, 65540, 26, 1114115, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 393220, 65540, 26, 458756, 65540, 26, 524292, 65540, 26, 589828, 65540, 26, 655364, 65540, 26, 720900, 65540, 26, 786436, 65540, 26, 851972, 65540, 26, 917508, 65540, 26, 983044, 65540, 26, 1048580, 65540, 26, 1114116, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26, 393221, 65540, 26, 458757, 65540, 26, 524293, 65540, 26, 589829, 65540, 26, 655365, 65540, 26, 720901, 65540, 26, 786437, 65540, 26, 851973, 65540, 26, 917509, 65540, 26, 983045, 65540, 26, 1048581, 65540, 26, 1114117, 65540, 26, 6, 65540, 26, 65542, 65540, 26, 131078, 65540, 26, 196614, 65540, 26, 262150, 65540, 26, 327686, 65540, 26, 393222, 65540, 26, 458758, 65540, 26, 524294, 65540, 26, 589830, 65540, 26, 655366, 65540, 26, 720902, 65540, 26, 786438, 65540, 26, 851974, 65540, 26, 917510, 65540, 26, 983046, 65540, 26, 1048582, 65540, 26, 1114118, 65540, 26, 7, 65540, 26, 65543, 65540, 26, 131079, 65540, 26, 196615, 65540, 26, 262151, 65540, 26, 327687, 65540, 26, 393223, 65540, 26, 458759, 65540, 26, 524295, 65540, 26, 589831, 65540, 26, 655367, 65540, 26, 720903, 65540, 26, 786439, 65540, 26, 851975, 65540, 26, 917511, 65540, 26, 983047, 65540, 26, 1048583, 65540, 26, 1114119, 65540, 26, 8, 65540, 26, 65544, 65540, 26, 131080, 65540, 26, 196616, 65540, 26, 262152, 65540, 26, 327688, 65540, 26, 393224, 65540, 26, 458760, 65540, 26, 524296, 65540, 26, 589832, 65540, 26, 655368, 65540, 26, 720904, 65540, 26, 786440, 65540, 26, 851976, 65540, 26, 917512, 65540, 26, 983048, 65540, 26, 1048584, 65540, 26, 1114120, 65540, 26, 9, 65540, 26, 65545, 65540, 26, 131081, 65540, 26, 196617, 65540, 26, 262153, 65540, 26, 327689, 65540, 26, 393225, 65540, 26, 458761, 65540, 26, 524297, 65540, 26, 589833, 65540, 26, 655369, 65540, 26, 720905, 65540, 26, 786441, 65540, 26, 851977, 65540, 26, 917513, 65540, 26, 983049, 65540, 26, 1048585, 65540, 26, 1114121, 65540, 26, 10, 65540, 26, 65546, 65540, 26, 131082, 65540, 26, 196618, 65540, 26, 262154, 65540, 26, 327690, 65540, 26, 393226, 65540, 26, 458762, 65540, 26, 524298, 65540, 26, 589834, 65540, 26, 655370, 65540, 26, 720906, 65540, 26, 786442, 65540, 26, 851978, 65540, 26, 917514, 65540, 26, 983050, 65540, 26, 1048586, 65540, 26, 1114122, 65540, 26, 11, 65540, 26, 65547, 65540, 26, 131083, 65540, 26, 196619, 65540, 26, 262155, 65540, 26, 327691, 65540, 26, 393227, 65540, 26, 458763, 65540, 26, 524299, 65540, 26, 589835, 65540, 26, 655371, 65540, 26, 720907, 65540, 26, 786443, 65540, 26, 851979, 65540, 26, 917515, 65540, 26, 983051, 65540, 26, 1048587, 65540, 26, 1114123, 65540, 26, 12, 65540, 26, 65548, 65540, 26, 131084, 65540, 26, 196620, 65540, 26, 262156, 65540, 26, 327692, 65540, 26, 393228, 65540, 26, 458764, 65540, 26, 524300, 65540, 26, 589836, 65540, 26, 655372, 65540, 26, 720908, 65540, 26, 13, 65540, 26, 65549, 65540, 26, 131085, 65540, 26, 196621, 65540, 26, 262157, 65540, 26, 327693, 65540, 26, 393229, 65540, 26, 458765, 65540, 26, 524301, 65540, 26, 589837, 65540, 26, 655373, 65540, 26, 720909, 65540, 26, 14, 65540, 26, 65550, 65540, 26, 131086, 65540, 26, 196622, 65540, 26, 262158, 65540, 26, 327694, 65540, 26, 393230, 65540, 26, 458766, 65540, 26, 524302, 65540, 26, 589838, 65540, 26, 655374, 65540, 26, 720910, 65540, 26, 15, 65540, 26, 65551, 65540, 26, 131087, 65540, 26, 196623, 65540, 26, 262159, 65540, 26, 327695, 65540, 26, 393231, 65540, 26, 458767, 65540, 26, 524303, 65540, 26, 589839, 65540, 26, 655375, 65540, 26, 720911, 65540, 26, 16, 65540, 26, 65552, 65540, 26, 131088, 65540, 26, 196624, 65540, 26, 262160, 65540, 26, 327696, 65540, 26, 393232, 65540, 26, 458768, 65540, 26, 524304, 65540, 26, 589840, 65540, 26, 655376, 65540, 26, 720912, 65540, 26, 17, 65540, 26, 65553, 65540, 26, 131089, 65540, 26, 196625, 65540, 26, 262161, 65540, 26, 327697, 65540, 26, 393233, 65540, 26, 458769, 65540, 26, 524305, 65540, 26, 589841, 65540, 26, 655377, 65540, 26, 720913, 65540, 26, 18, 65540, 26, 65554, 65540, 26, 131090, 65540, 26, 196626, 65540, 26, 262162, 65540, 26, 327698, 65540, 26, 393234, 65540, 26, 458770, 65540, 26, 524306, 65540, 26, 589842, 65540, 26, 655378, 65540, 26, 720914, 65540, 26, 19, 65540, 26, 65555, 65540, 26, 131091, 65540, 26, 196627, 65540, 26, 262163, 65540, 26, 327699, 65540, 26, 393235, 65540, 26, 458771, 65540, 26, 524307, 65540, 26, 589843, 65540, 26, 655379, 65540, 26, 720915, 65540, 26, 20, 65540, 26, 65556, 65540, 26, 131092, 65540, 26, 196628, 65540, 26, 262164, 65540, 26, 327700, 65540, 26, 393236, 65540, 26, 458772, 65540, 26, 524308, 65540, 26, 589844, 65540, 26, 655380, 65540, 26, 720916, 65540, 26, 21, 65540, 26, 65557, 65540, 26, 131093, 65540, 26, 196629, 65540, 26, 262165, 65540, 26, 327701, 65540, 26, 393237, 65540, 26, 458773, 65540, 26, 524309, 65540, 26, 589845, 65540, 26, 655381, 65540, 26, 720917, 65540, 26, 22, 65540, 26, 65558, 65540, 26, 131094, 65540, 26, 196630, 65540, 26, 262166, 65540, 26, 327702, 65540, 26, 393238, 65540, 26, 458774, 65540, 26, 524310, 65540, 26, 589846, 65540, 26, 655382, 65540, 26, 720918, 65540, 26, 23, 65540, 26, 65559, 65540, 26, 131095, 65540, 26, 196631, 65540, 26, 262167, 65540, 26, 327703, 65540, 26, 393239, 65540, 26, 458775, 65540, 26, 524311, 65540, 26, 589847, 65540, 26, 655383, 65540, 26, 720919, 65540, 26, 24, 65540, 26, 65560, 65540, 26, 131096, 65540, 26, 196632, 65540, 26, 262168, 65540, 26, 327704, 65540, 26, 393240, 65540, 26, 458776, 65540, 26, 524312, 65540, 26, 589848, 65540, 26, 655384, 65540, 26, 720920, 65540, 26, 25, 65540, 26, 65561, 65540, 26, 131097, 65540, 26, 196633, 65540, 26, 262169, 65540, 26, 327705, 65540, 26, 393241, 65540, 26, 458777, 65540, 26, 524313, 65540, 26, 589849, 65540, 26, 655385, 65540, 26, 720921, 65540, 26, 26, 65540, 26, 65562, 65540, 26, 131098, 65540, 26, 196634, 65540, 26, 262170, 65540, 26, 327706, 65540, 26, 393242, 65540, 26, 458778, 65540, 26, 524314, 65540, 26, 589850, 65540, 26, 655386, 65540, 26, 720922, 65540, 26, 27, 65540, 26, 65563, 65540, 26, 131099, 65540, 26, 196635, 65540, 26, 262171, 65540, 26, 327707, 65540, 26, 393243, 65540, 26, 458779, 65540, 26, 524315, 65540, 26, 589851, 65540, 26, 655387, 65540, 26, 720923, 65540, 26, 28, 65540, 26, 65564, 65540, 26, 131100, 65540, 26, 196636, 65540, 26, 262172, 65540, 26, 327708, 65540, 26, 393244, 65540, 26, 458780, 65540, 26, 524316, 65540, 26, 589852, 65540, 26, 655388, 65540, 26, 720924, 65540, 26, 29, 65540, 26, 65565, 65540, 26, 131101, 65540, 26, 196637, 65540, 26, 262173, 65540, 26, 327709, 65540, 26, 393245, 65540, 26, 458781, 65540, 26, 524317, 65540, 26, 589853, 65540, 26, 655389, 65540, 26, 720925, 65540, 26) 14 | layer_2/name = "street" 15 | layer_2/tile_data = PackedInt32Array(524300, 655364, 19, 524301, 655364, 19, 524302, 720900, 19, 524303, 720900, 19, 524304, 655364, 19, 524305, 655364, 19, 589836, 655364, 20, 589837, 655364, 20, 589838, 720900, 19, 589839, 720900, 19, 589840, 655364, 20, 589841, 655364, 20, 589842, 655364, 20, 589843, 655364, 20, 589844, 720900, 19, 589845, 720900, 19, 589846, 655364, 20, 589847, 655364, 20, 524306, 655364, 19, 524307, 655364, 19, 524308, 720900, 19, 524309, 720900, 19, 524310, 655364, 19, 524311, 655364, 19, 458772, 589828, 21, 393236, 589828, 21, 327700, 589828, 21, 262164, 589828, 21, 327694, 589828, 21, 262158, 589828, 21, 196622, 720900, 19, 131086, 720900, 19, 65550, 589828, 21, 14, 589828, 21, 196628, 720900, 19, 131092, 720900, 19, 65556, 589828, 21, 20, 589828, 21, 327706, 589828, 21, 262170, 851972, 22, 196634, 720900, 19, 131098, 720900, 19, 65562, 851972, 22, 26, 589828, 21, 327707, 655364, 21, 262171, 851972, 22, 196635, 720900, 19, 131099, 720900, 19, 65563, 851972, 22, 27, 655364, 21, 21, 655364, 21, 65557, 655364, 21, 131093, 720900, 19, 196629, 720900, 19, 262165, 655364, 21, 327701, 655364, 21, 393237, 655364, 21, 458773, 655364, 21, 327695, 655364, 21, 262159, 655364, 21, 196623, 720900, 19, 131087, 720900, 19, 65551, 655364, 21, 15, 655364, 21, 655375, 655364, 21, 720911, 655364, 21, 655374, 589828, 21, 720910, 589828, 21, 131088, 655364, 19, 131089, 655364, 19, 131090, 655364, 19, 131091, 655364, 19, 196624, 655364, 20, 196625, 655364, 20, 196626, 655364, 20, 196627, 655364, 20, 196632, 655364, 20, 196633, 589828, 22, 196636, 589828, 22, 196637, 655364, 20, 131096, 655364, 19, 131097, 589828, 22, 131100, 589828, 22, 131101, 655364, 19, 524290, 720900, 19, 589826, 720900, 19, 524291, 720900, 19, 589827, 720900, 19, 524292, 655364, 19, 589828, 655364, 20, 524293, 655364, 19, 589829, 655364, 20, 524294, 655364, 19, 589830, 655364, 20, 524295, 655364, 19, 589831, 655364, 20, 524296, 720900, 19, 589832, 720900, 19, 524297, 720900, 19, 589833, 720900, 19, 131074, 720900, 19, 196610, 720900, 19, 131075, 720900, 19, 196611, 720900, 19, 131076, 655364, 19, 196612, 655364, 20, 131077, 655364, 19, 196613, 655364, 20, 131078, 655364, 19, 196614, 655364, 20, 131079, 655364, 19, 196615, 655364, 20, 131080, 720900, 19, 196616, 720900, 19, 131081, 720900, 19, 196617, 720900, 19, 262152, 720900, 19, 327688, 589828, 21, 262153, 720900, 19, 327689, 655364, 21, 393224, 589828, 21, 458760, 589828, 21, 393225, 655364, 21, 458761, 655364, 21, 262146, 589828, 21, 327682, 589828, 21, 262147, 655364, 21, 327683, 655364, 21, 393218, 589828, 21, 458754, 589828, 21, 393219, 655364, 21, 458755, 655364, 21, 786434, 589828, 21, 851970, 589828, 21, 786435, 655364, 21, 851971, 655364, 21, 917506, 589828, 21, 983042, 589828, 21, 917507, 655364, 21, 983043, 655364, 21, 1048578, 589828, 21, 1114114, 589828, 21, 1048579, 655364, 21, 1114115, 655364, 21, 917510, 655364, 19, 983046, 655364, 20, 917511, 655364, 19, 983047, 655364, 20, 917512, 655364, 19, 983048, 655364, 20, 917513, 655364, 19, 983049, 655364, 20, 917514, 655364, 19, 983050, 655364, 20, 917515, 655364, 19, 983051, 655364, 20, 589851, 65540, 26) 16 | layer_3/name = "tree_plots" 17 | layer_3/modulate = Color(0.2, 0.686275, 0, 1) 18 | layer_3/tile_data = PackedInt32Array(851974, 1769476, 19, 786438, 1769476, 19, 786439, 1769476, 19, 851975, 1769476, 19, 851976, 1769476, 19, 786440, 1769476, 19, 1048582, 1769476, 19, 1048583, 1769476, 19, 1048584, 1769476, 19, 1114120, 1769476, 19, 1114119, 1769476, 19, 1114118, 1769476, 19, 1114123, 1769476, 19, 1048587, 1769476, 19, 851979, 1769476, 19, 786443, 1769476, 19, 917508, 1769476, 19, 917509, 1769476, 19, 983045, 1769476, 19, 983044, 1769476, 19, 917504, 1769476, 19, 917505, 1769476, 19, 1114113, 1769476, 19, 1114112, 1769476, 19, 393221, 1769476, 19, 393220, 1769476, 19, 458756, 1769476, 19, 458757, 1769476, 19, 458758, 1769476, 19, 458759, 1769476, 19, 393223, 1769476, 19, 327687, 1769476, 19, 262151, 1769476, 19, 262150, 1769476, 19, 262149, 1769476, 19, 262148, 1769476, 19, 327684, 1769476, 19, 327685, 1769476, 19, 327686, 1769476, 19, 393222, 1769476, 19, 393230, 1769476, 19, 458766, 1769476, 19, 262169, 1769476, 19, 262168, 1769476, 19, 327704, 1769476, 19, 327705, 1769476, 19, 65555, 1769476, 19, 19, 1769476, 19, 18, 1769476, 19, 65554, 1769476, 19, 262163, 1769476, 19, 262162, 1769476, 19, 327698, 1769476, 19, 327699, 1769476, 19, 262161, 1769476, 19, 262160, 1769476, 19, 327696, 1769476, 19, 327697, 1769476, 19, 393216, 1769476, 19, 458752, 1769476, 19, 458753, 1769476, 19, 393217, 1769476, 19, 458777, 1769476, 19, 589852, 1769476, 19, 655385, 1769476, 19, 393243, 1769476, 19, 524315, 1769476, 19, 655387, 1769476, 19, 524313, 1769476, 19, 458781, 1769476, 19, 655389, 1769476, 19, 720921, 1769476, 19, 524312, 1769476, 19, 458776, 1769476, 19, 393240, 1769476, 19, 720920, 1769476, 19, 720925, 1769476, 19, 393245, 1769476, 19, 720923, 1769476, 19, 393241, 1769476, 19, 589849, 1769476, 19, 589848, 1769476, 19, 655384, 1769476, 19, 720922, 1769476, 19, 655386, 1769476, 19, 589850, 1769476, 19, 524314, 1769476, 19, 458778, 1769476, 19, 393242, 1769476, 19, 458779, 1769476, 19, 589851, 1769476, 19, 458780, 1769476, 19, 393244, 1769476, 19, 524317, 1769476, 19, 524316, 1769476, 19, 655388, 1769476, 19, 720924, 1769476, 19, 589853, 1769476, 19) 19 | layer_4/name = "house_plots" 20 | layer_4/modulate = Color(0.580392, 0.580392, 0.580392, 1) 21 | layer_4/tile_data = PackedInt32Array(1048585, 1769476, 19, 786441, 1769476, 19, 786432, 1769476, 19, 983040, 1769476, 19, 851972, 1769476, 19, 1048580, 1769476, 19, 393228, 1769476, 19, 393232, 1769476, 19, 393234, 1769476, 19, 393238, 1769476, 19, 655378, 1769476, 19, 655382, 1769476, 19, 655380, 1769476, 19, 655372, 1769476, 19, 655376, 1769476, 19, 12, 1769476, 19, 131084, 1769476, 19, 262156, 1769476, 19, 16, 1769476, 19, 22, 1769476, 19, 131094, 1769476, 19, 262166, 1769476, 19, 6, 1769476, 19, 8, 1769476, 19, 10, 1769476, 19, 131082, 1769476, 19, 262154, 1769476, 19, 393226, 1769476, 19, 524298, 1769476, 19, 655370, 1769476, 19, 655368, 1769476, 19, 655366, 1769476, 19, 655364, 1769476, 19, 655362, 1769476, 19, 655360, 1769476, 19, 524288, 1769476, 19, 262144, 1769476, 19, 131072, 1769476, 19, 0, 1769476, 19, 2, 1769476, 19, 4, 1769476, 19, 24, 1769476, 19, 28, 1769476, 19, 262172, 1769476, 19) 22 | -------------------------------------------------------------------------------- /example/wfc_tiles.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" script_class="WfcTileSet" load_steps=74 format=3 uid="uid://dv7m7gt5bo387"] 2 | 3 | [ext_resource type="Script" path="res://addons/lommix_infinite_worlds/resources/wfc_tile_set.gd" id="1_7iggk"] 4 | [ext_resource type="TileSet" uid="uid://b3hngxhf5khj" path="res://example/tileset.tres" id="2_pyt1t"] 5 | [ext_resource type="Script" path="res://addons/lommix_infinite_worlds/resources/wfc_tile.gd" id="3_0h1xu"] 6 | 7 | [sub_resource type="TileMapPattern" id="TileMapPattern_7wdq1"] 8 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 9 | 10 | [sub_resource type="TileMapPattern" id="TileMapPattern_kjkt5"] 11 | tile_data = PackedInt32Array(131074, 720900, 19, 196610, 720900, 19, 262146, 589828, 21, 327682, 589828, 21, 131075, 720900, 19, 196611, 720900, 19, 262147, 655364, 21, 327683, 655364, 21, 131076, 655364, 19, 196612, 655364, 20, 131077, 655364, 19, 196613, 655364, 20) 12 | 13 | [sub_resource type="TileMapPattern" id="TileMapPattern_qo7qx"] 14 | tile_data = PackedInt32Array(262148, 1769476, 19, 327684, 1769476, 19, 262149, 1769476, 19, 327685, 1769476, 19) 15 | 16 | [sub_resource type="TileMapPattern" id="TileMapPattern_csss1"] 17 | tile_data = PackedInt32Array(0, 1769476, 19, 131072, 1769476, 19, 262144, 1769476, 19, 2, 1769476, 19, 4, 1769476, 19) 18 | 19 | [sub_resource type="TileMapPattern" id="TileMapPattern_phtlq"] 20 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 1441796, 0, 196608, 1441796, 0, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 1441796, 0, 196609, 1441796, 0, 262145, 1441796, 0, 327681, 1441796, 0, 2, 1441796, 0, 65538, 1441796, 0, 131074, 720900, 19, 196610, 720900, 19, 262146, 720900, 19, 327682, 720900, 19, 3, 1441796, 0, 65539, 1441796, 0, 131075, 720900, 19, 196611, 720900, 19, 262147, 720900, 19, 327683, 720900, 19, 4, 1441796, 0, 65540, 1441796, 0, 131076, 720900, 19, 196612, 720900, 19, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 720900, 19, 196613, 720900, 19, 262149, 1441796, 0, 327685, 1441796, 0) 21 | 22 | [sub_resource type="Resource" id="Resource_wfmkw"] 23 | script = ExtResource("3_0h1xu") 24 | pattern = SubResource("TileMapPattern_phtlq") 25 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_7wdq1"), SubResource("TileMapPattern_kjkt5"), SubResource("TileMapPattern_qo7qx"), SubResource("TileMapPattern_csss1")]) 26 | additional_layers_name = Array[String](["ground", "street", "tree_plots", "house_plots"]) 27 | hash = 4780589443 28 | width = 0 29 | weight = 100.0 30 | name = "" 31 | group = "" 32 | sockets = { 33 | Vector2i(-1, 0): 3140704587, 34 | Vector2i(0, -1): 3140704587, 35 | Vector2i(0, 1): 4048461711, 36 | Vector2i(1, 0): 4048461711 37 | } 38 | allowed_neighbors = { 39 | Vector2i(-1, 0): [], 40 | Vector2i(0, -1): [], 41 | Vector2i(0, 1): [5430716088], 42 | Vector2i(1, 0): [4570948542] 43 | } 44 | 45 | [sub_resource type="TileMapPattern" id="TileMapPattern_dyteq"] 46 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 47 | 48 | [sub_resource type="TileMapPattern" id="TileMapPattern_iethi"] 49 | tile_data = PackedInt32Array(2, 589828, 21, 65538, 589828, 21, 131074, 720900, 19, 196610, 720900, 19, 3, 655364, 21, 65539, 655364, 21, 131075, 720900, 19, 196611, 720900, 19, 131076, 655364, 19, 196612, 655364, 20, 131077, 655364, 19, 196613, 655364, 20) 50 | 51 | [sub_resource type="TileMapPattern" id="TileMapPattern_rfdad"] 52 | tile_data = PackedInt32Array(0, 1769476, 19, 65536, 1769476, 19, 1, 1769476, 19, 65537, 1769476, 19, 4, 1769476, 19, 65540, 1769476, 19, 5, 1769476, 19, 65541, 1769476, 19) 53 | 54 | [sub_resource type="TileMapPattern" id="TileMapPattern_hlwxy"] 55 | tile_data = PackedInt32Array(131072, 1769476, 19, 262144, 1769476, 19, 262146, 1769476, 19, 262148, 1769476, 19) 56 | 57 | [sub_resource type="TileMapPattern" id="TileMapPattern_jgqs7"] 58 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 1441796, 0, 196608, 1441796, 0, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 1441796, 0, 196609, 1441796, 0, 262145, 1441796, 0, 327681, 1441796, 0, 2, 720900, 19, 65538, 720900, 19, 131074, 720900, 19, 196610, 720900, 19, 262146, 1441796, 0, 327682, 1441796, 0, 3, 720900, 19, 65539, 720900, 19, 131075, 720900, 19, 196611, 720900, 19, 262147, 1441796, 0, 327683, 1441796, 0, 4, 1441796, 0, 65540, 1441796, 0, 131076, 720900, 19, 196612, 720900, 19, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 720900, 19, 196613, 720900, 19, 262149, 1441796, 0, 327685, 1441796, 0) 59 | 60 | [sub_resource type="Resource" id="Resource_4rl84"] 61 | script = ExtResource("3_0h1xu") 62 | pattern = SubResource("TileMapPattern_jgqs7") 63 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_dyteq"), SubResource("TileMapPattern_iethi"), SubResource("TileMapPattern_rfdad"), SubResource("TileMapPattern_hlwxy")]) 64 | additional_layers_name = Array[String](["ground", "street", "tree_plots", "house_plots"]) 65 | hash = 5430716088 66 | width = 0 67 | weight = 100.0 68 | name = "" 69 | group = "" 70 | sockets = { 71 | Vector2i(-1, 0): 3140704587, 72 | Vector2i(0, -1): 4048461711, 73 | Vector2i(0, 1): 3140704587, 74 | Vector2i(1, 0): 4048461711 75 | } 76 | allowed_neighbors = { 77 | Vector2i(-1, 0): [], 78 | Vector2i(0, -1): [4780589443], 79 | Vector2i(0, 1): [5847891474], 80 | Vector2i(1, 0): [4209070775] 81 | } 82 | 83 | [sub_resource type="TileMapPattern" id="TileMapPattern_okvd0"] 84 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 85 | 86 | [sub_resource type="TileMapPattern" id="TileMapPattern_3lom6"] 87 | tile_data = PackedInt32Array(2, 589828, 21, 65538, 589828, 21, 131074, 589828, 21, 196610, 589828, 21, 262146, 589828, 21, 327682, 589828, 21, 3, 655364, 21, 65539, 655364, 21, 131075, 655364, 21, 196611, 655364, 21, 262147, 655364, 21, 327683, 655364, 21) 88 | 89 | [sub_resource type="TileMapPattern" id="TileMapPattern_0j2lr"] 90 | tile_data = PackedInt32Array(131072, 1769476, 19, 327680, 1769476, 19, 131073, 1769476, 19, 327681, 1769476, 19, 131076, 1769476, 19, 196612, 1769476, 19, 131077, 1769476, 19, 196613, 1769476, 19) 91 | 92 | [sub_resource type="TileMapPattern" id="TileMapPattern_q4w3i"] 93 | tile_data = PackedInt32Array(0, 1769476, 19, 196608, 1769476, 19, 65540, 1769476, 19, 262148, 1769476, 19) 94 | 95 | [sub_resource type="TileMapPattern" id="TileMapPattern_yea3j"] 96 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 1441796, 0, 196608, 1441796, 0, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 1441796, 0, 196609, 1441796, 0, 262145, 1441796, 0, 327681, 1441796, 0, 2, 720900, 19, 65538, 720900, 19, 131074, 720900, 19, 196610, 720900, 19, 262146, 720900, 19, 327682, 720900, 19, 3, 720900, 19, 65539, 720900, 19, 131075, 720900, 19, 196611, 720900, 19, 262147, 720900, 19, 327683, 720900, 19, 4, 1441796, 0, 65540, 1441796, 0, 131076, 1441796, 0, 196612, 1441796, 0, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 1441796, 0, 196613, 1441796, 0, 262149, 1441796, 0, 327685, 1441796, 0) 97 | 98 | [sub_resource type="Resource" id="Resource_uvujq"] 99 | script = ExtResource("3_0h1xu") 100 | pattern = SubResource("TileMapPattern_yea3j") 101 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_okvd0"), SubResource("TileMapPattern_3lom6"), SubResource("TileMapPattern_0j2lr"), SubResource("TileMapPattern_q4w3i")]) 102 | additional_layers_name = Array[String](["ground", "street", "tree_plots", "house_plots"]) 103 | hash = 5847891474 104 | width = 0 105 | weight = 200.0 106 | name = "" 107 | group = "" 108 | sockets = { 109 | Vector2i(-1, 0): 3140704587, 110 | Vector2i(0, -1): 4048461711, 111 | Vector2i(0, 1): 4048461711, 112 | Vector2i(1, 0): 3140704587 113 | } 114 | allowed_neighbors = { 115 | Vector2i(-1, 0): [], 116 | Vector2i(0, -1): [5430716088], 117 | Vector2i(0, 1): [], 118 | Vector2i(1, 0): [4987051580] 119 | } 120 | 121 | [sub_resource type="TileMapPattern" id="TileMapPattern_hfeqg"] 122 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 123 | 124 | [sub_resource type="TileMapPattern" id="TileMapPattern_4k85k"] 125 | tile_data = PackedInt32Array(131072, 655364, 19, 196608, 655364, 20, 131073, 655364, 19, 196609, 655364, 20, 131074, 720900, 19, 196610, 720900, 19, 262146, 720900, 19, 327682, 589828, 21, 131075, 720900, 19, 196611, 720900, 19, 262147, 720900, 19, 327683, 655364, 21) 126 | 127 | [sub_resource type="TileMapPattern" id="TileMapPattern_fbl8m"] 128 | tile_data = PackedInt32Array(262144, 1769476, 19, 327680, 1769476, 19, 262145, 1769476, 19, 327681, 1769476, 19) 129 | 130 | [sub_resource type="TileMapPattern" id="TileMapPattern_p7mbg"] 131 | tile_data = PackedInt32Array(0, 1769476, 19, 2, 1769476, 19, 4, 1769476, 19, 131076, 1769476, 19, 262148, 1769476, 19) 132 | 133 | [sub_resource type="TileMapPattern" id="TileMapPattern_amnok"] 134 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 720900, 19, 196608, 720900, 19, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 720900, 19, 196609, 720900, 19, 262145, 1441796, 0, 327681, 1441796, 0, 2, 1441796, 0, 65538, 1441796, 0, 131074, 720900, 19, 196610, 720900, 19, 262146, 720900, 19, 327682, 720900, 19, 3, 1441796, 0, 65539, 1441796, 0, 131075, 720900, 19, 196611, 720900, 19, 262147, 720900, 19, 327683, 720900, 19, 4, 1441796, 0, 65540, 1441796, 0, 131076, 1441796, 0, 196612, 1441796, 0, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 1441796, 0, 196613, 1441796, 0, 262149, 1441796, 0, 327685, 1441796, 0) 135 | 136 | [sub_resource type="Resource" id="Resource_vf8t6"] 137 | script = ExtResource("3_0h1xu") 138 | pattern = SubResource("TileMapPattern_amnok") 139 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_hfeqg"), SubResource("TileMapPattern_4k85k"), SubResource("TileMapPattern_fbl8m"), SubResource("TileMapPattern_p7mbg")]) 140 | additional_layers_name = Array[String](["ground", "street", "tree_plots", "house_plots"]) 141 | hash = 4570948542 142 | width = 0 143 | weight = 100.0 144 | name = "" 145 | group = "" 146 | sockets = { 147 | Vector2i(-1, 0): 4048461711, 148 | Vector2i(0, -1): 3140704587, 149 | Vector2i(0, 1): 4048461711, 150 | Vector2i(1, 0): 3140704587 151 | } 152 | allowed_neighbors = { 153 | Vector2i(-1, 0): [4780589443], 154 | Vector2i(0, -1): [], 155 | Vector2i(0, 1): [4209070775], 156 | Vector2i(1, 0): [1161627202] 157 | } 158 | 159 | [sub_resource type="TileMapPattern" id="TileMapPattern_vul5v"] 160 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 161 | 162 | [sub_resource type="TileMapPattern" id="TileMapPattern_6r4lb"] 163 | tile_data = PackedInt32Array(131072, 655364, 19, 196608, 655364, 20, 131073, 655364, 19, 196609, 655364, 20, 2, 589828, 21, 65538, 589828, 21, 131074, 720900, 19, 196610, 720900, 19, 3, 655364, 21, 65539, 655364, 21, 131075, 720900, 19, 196611, 720900, 19) 164 | 165 | [sub_resource type="TileMapPattern" id="TileMapPattern_t3iqx"] 166 | tile_data = PackedInt32Array(0, 1769476, 19, 65536, 1769476, 19, 1, 1769476, 19, 65537, 1769476, 19) 167 | 168 | [sub_resource type="TileMapPattern" id="TileMapPattern_m2k2e"] 169 | tile_data = PackedInt32Array(262144, 1769476, 19, 262146, 1769476, 19, 4, 1769476, 19, 131076, 1769476, 19, 262148, 1769476, 19) 170 | 171 | [sub_resource type="TileMapPattern" id="TileMapPattern_o3lsy"] 172 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 720900, 19, 196608, 720900, 19, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 720900, 19, 196609, 720900, 19, 262145, 1441796, 0, 327681, 1441796, 0, 2, 720900, 19, 65538, 720900, 19, 131074, 720900, 19, 196610, 720900, 19, 262146, 1441796, 0, 327682, 1441796, 0, 3, 720900, 19, 65539, 720900, 19, 131075, 720900, 19, 196611, 720900, 19, 262147, 1441796, 0, 327683, 1441796, 0, 4, 1441796, 0, 65540, 1441796, 0, 131076, 1441796, 0, 196612, 1441796, 0, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 1441796, 0, 196613, 1441796, 0, 262149, 1441796, 0, 327685, 1441796, 0) 173 | 174 | [sub_resource type="Resource" id="Resource_0c5lo"] 175 | script = ExtResource("3_0h1xu") 176 | pattern = SubResource("TileMapPattern_o3lsy") 177 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_vul5v"), SubResource("TileMapPattern_6r4lb"), SubResource("TileMapPattern_t3iqx"), SubResource("TileMapPattern_m2k2e")]) 178 | additional_layers_name = Array[String](["ground", "street", "tree_plots", "house_plots"]) 179 | hash = 4209070775 180 | width = 0 181 | weight = 100.0 182 | name = "" 183 | group = "" 184 | sockets = { 185 | Vector2i(-1, 0): 4048461711, 186 | Vector2i(0, -1): 4048461711, 187 | Vector2i(0, 1): 3140704587, 188 | Vector2i(1, 0): 3140704587 189 | } 190 | allowed_neighbors = { 191 | Vector2i(-1, 0): [5430716088], 192 | Vector2i(0, -1): [4570948542], 193 | Vector2i(0, 1): [4987051580], 194 | Vector2i(1, 0): [3815200611] 195 | } 196 | 197 | [sub_resource type="TileMapPattern" id="TileMapPattern_okphg"] 198 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 199 | 200 | [sub_resource type="TileMapPattern" id="TileMapPattern_5hl28"] 201 | tile_data = PackedInt32Array(131072, 655364, 19, 196608, 655364, 20, 131073, 655364, 19, 196609, 655364, 20, 131074, 655364, 19, 196610, 655364, 20, 131075, 655364, 19, 196611, 655364, 20, 131076, 655364, 19, 196612, 655364, 20, 131077, 655364, 19, 196613, 655364, 20) 202 | 203 | [sub_resource type="TileMapPattern" id="TileMapPattern_8n01j"] 204 | tile_data = PackedInt32Array(0, 1769476, 19, 65536, 1769476, 19, 262144, 1769476, 19, 327680, 1769476, 19, 1, 1769476, 19, 65537, 1769476, 19, 262145, 1769476, 19, 327681, 1769476, 19, 2, 1769476, 19, 65538, 1769476, 19, 262146, 1769476, 19, 327682, 1769476, 19, 5, 1769476, 19, 65541, 1769476, 19, 262149, 1769476, 19, 327685, 1769476, 19) 205 | 206 | [sub_resource type="TileMapPattern" id="TileMapPattern_mih66"] 207 | tile_data = PackedInt32Array(3, 1769476, 19, 262147, 1769476, 19) 208 | 209 | [sub_resource type="TileMapPattern" id="TileMapPattern_htr6b"] 210 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 720900, 19, 196608, 720900, 19, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 720900, 19, 196609, 720900, 19, 262145, 1441796, 0, 327681, 1441796, 0, 2, 1441796, 0, 65538, 1441796, 0, 131074, 720900, 19, 196610, 720900, 19, 262146, 1441796, 0, 327682, 1441796, 0, 3, 1441796, 0, 65539, 1441796, 0, 131075, 720900, 19, 196611, 720900, 19, 262147, 1441796, 0, 327683, 1441796, 0, 4, 1441796, 0, 65540, 1441796, 0, 131076, 720900, 19, 196612, 720900, 19, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 720900, 19, 196613, 720900, 19, 262149, 1441796, 0, 327685, 1441796, 0) 211 | 212 | [sub_resource type="Resource" id="Resource_au5lo"] 213 | script = ExtResource("3_0h1xu") 214 | pattern = SubResource("TileMapPattern_htr6b") 215 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_okphg"), SubResource("TileMapPattern_5hl28"), SubResource("TileMapPattern_8n01j"), SubResource("TileMapPattern_mih66")]) 216 | additional_layers_name = Array[String](["ground", "street", "tree_plots", "house_plots"]) 217 | hash = 4987051580 218 | width = 0 219 | weight = 200.0 220 | name = "" 221 | group = "" 222 | sockets = { 223 | Vector2i(-1, 0): 4048461711, 224 | Vector2i(0, -1): 3140704587, 225 | Vector2i(0, 1): 3140704587, 226 | Vector2i(1, 0): 4048461711 227 | } 228 | allowed_neighbors = { 229 | Vector2i(-1, 0): [5847891474], 230 | Vector2i(0, -1): [4209070775], 231 | Vector2i(0, 1): [], 232 | Vector2i(1, 0): [] 233 | } 234 | 235 | [sub_resource type="TileMapPattern" id="TileMapPattern_3g5p3"] 236 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 237 | 238 | [sub_resource type="TileMapPattern" id="TileMapPattern_drgjg"] 239 | tile_data = PackedInt32Array(2, 589828, 21, 65538, 589828, 21, 131074, 720900, 19, 196610, 720900, 19, 262146, 589828, 21, 327682, 589828, 21, 3, 655364, 21, 65539, 655364, 21, 131075, 720900, 19, 196611, 720900, 19, 262147, 655364, 21, 327683, 655364, 21, 131076, 655364, 19, 196612, 655364, 20, 131077, 655364, 19, 196613, 655364, 20) 240 | 241 | [sub_resource type="TileMapPattern" id="TileMapPattern_2jrjh"] 242 | tile_data = PackedInt32Array(262148, 1769476, 19, 327684, 1769476, 19, 262149, 1769476, 19, 327685, 1769476, 19) 243 | 244 | [sub_resource type="TileMapPattern" id="TileMapPattern_1kubm"] 245 | tile_data = PackedInt32Array(0, 1769476, 19, 131072, 1769476, 19, 262144, 1769476, 19, 4, 1769476, 19) 246 | 247 | [sub_resource type="TileMapPattern" id="TileMapPattern_xcnqq"] 248 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 1441796, 0, 196608, 1441796, 0, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 1441796, 0, 196609, 1441796, 0, 262145, 1441796, 0, 327681, 1441796, 0, 2, 720900, 19, 65538, 720900, 19, 131074, 720900, 19, 196610, 720900, 19, 262146, 720900, 19, 327682, 720900, 19, 3, 720900, 19, 65539, 720900, 19, 131075, 720900, 19, 196611, 720900, 19, 262147, 720900, 19, 327683, 720900, 19, 4, 1441796, 0, 65540, 1441796, 0, 131076, 720900, 19, 196612, 720900, 19, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 720900, 19, 196613, 720900, 19, 262149, 1441796, 0, 327685, 1441796, 0) 249 | 250 | [sub_resource type="Resource" id="Resource_aaokl"] 251 | script = ExtResource("3_0h1xu") 252 | pattern = SubResource("TileMapPattern_xcnqq") 253 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_3g5p3"), SubResource("TileMapPattern_drgjg"), SubResource("TileMapPattern_2jrjh"), SubResource("TileMapPattern_1kubm")]) 254 | additional_layers_name = Array[String](["ground", "street", "tree_plots", "house_plots"]) 255 | hash = 1161627202 256 | width = 0 257 | weight = 100.0 258 | name = "" 259 | group = "" 260 | sockets = { 261 | Vector2i(-1, 0): 3140704587, 262 | Vector2i(0, -1): 4048461711, 263 | Vector2i(0, 1): 4048461711, 264 | Vector2i(1, 0): 4048461711 265 | } 266 | allowed_neighbors = { 267 | Vector2i(-1, 0): [4570948542], 268 | Vector2i(0, -1): [], 269 | Vector2i(0, 1): [3815200611], 270 | Vector2i(1, 0): [3298704679] 271 | } 272 | 273 | [sub_resource type="TileMapPattern" id="TileMapPattern_fpp5e"] 274 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 275 | 276 | [sub_resource type="TileMapPattern" id="TileMapPattern_hmcpk"] 277 | tile_data = PackedInt32Array(131072, 655364, 19, 196608, 655364, 20, 131073, 655364, 19, 196609, 655364, 20, 131074, 720900, 19, 196610, 720900, 19, 262146, 589828, 21, 327682, 589828, 21, 131075, 720900, 19, 196611, 720900, 19, 262147, 655364, 21, 327683, 655364, 21, 131076, 655364, 19, 196612, 655364, 20, 131077, 655364, 19, 196613, 655364, 20) 278 | 279 | [sub_resource type="TileMapPattern" id="TileMapPattern_pxmu5"] 280 | tile_data = PackedInt32Array(2, 1769476, 19, 65538, 1769476, 19) 281 | 282 | [sub_resource type="TileMapPattern" id="TileMapPattern_irvgd"] 283 | tile_data = PackedInt32Array(0, 1769476, 19, 262144, 1769476, 19, 4, 1769476, 19, 262148, 1769476, 19) 284 | 285 | [sub_resource type="TileMapPattern" id="TileMapPattern_sw3eh"] 286 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 720900, 19, 196608, 720900, 19, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 720900, 19, 196609, 720900, 19, 262145, 1441796, 0, 327681, 1441796, 0, 2, 1441796, 0, 65538, 1441796, 0, 131074, 720900, 19, 196610, 720900, 19, 262146, 720900, 19, 327682, 720900, 19, 3, 1441796, 0, 65539, 1441796, 0, 131075, 720900, 19, 196611, 720900, 19, 262147, 720900, 19, 327683, 720900, 19, 4, 1441796, 0, 65540, 1441796, 0, 131076, 720900, 19, 196612, 720900, 19, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 720900, 19, 196613, 720900, 19, 262149, 1441796, 0, 327685, 1441796, 0) 287 | 288 | [sub_resource type="Resource" id="Resource_gu2mi"] 289 | script = ExtResource("3_0h1xu") 290 | pattern = SubResource("TileMapPattern_sw3eh") 291 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_fpp5e"), SubResource("TileMapPattern_hmcpk"), SubResource("TileMapPattern_pxmu5"), SubResource("TileMapPattern_irvgd")]) 292 | additional_layers_name = Array[String](["ground", "street", "tree_plots", "house_plots"]) 293 | hash = 3815200611 294 | width = 0 295 | weight = 100.0 296 | name = "" 297 | group = "" 298 | sockets = { 299 | Vector2i(-1, 0): 4048461711, 300 | Vector2i(0, -1): 3140704587, 301 | Vector2i(0, 1): 4048461711, 302 | Vector2i(1, 0): 4048461711 303 | } 304 | allowed_neighbors = { 305 | Vector2i(-1, 0): [4209070775], 306 | Vector2i(0, -1): [1161627202], 307 | Vector2i(0, 1): [], 308 | Vector2i(1, 0): [3384106273] 309 | } 310 | 311 | [sub_resource type="TileMapPattern" id="TileMapPattern_cct7t"] 312 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 313 | 314 | [sub_resource type="TileMapPattern" id="TileMapPattern_srnis"] 315 | tile_data = PackedInt32Array(131072, 655364, 19, 196608, 655364, 20, 131073, 655364, 19, 196609, 655364, 20, 2, 589828, 21, 65538, 589828, 21, 131074, 720900, 19, 196610, 720900, 19, 262146, 589828, 21, 327682, 589828, 21, 3, 655364, 21, 65539, 655364, 21, 131075, 720900, 19, 196611, 720900, 19, 262147, 655364, 21, 327683, 655364, 21) 316 | 317 | [sub_resource type="TileMapPattern" id="TileMapPattern_7sk2e"] 318 | tile_data = PackedInt32Array(0, 1769476, 19, 65536, 1769476, 19, 262144, 1769476, 19, 327680, 1769476, 19, 1, 1769476, 19, 65537, 1769476, 19, 262145, 1769476, 19, 327681, 1769476, 19) 319 | 320 | [sub_resource type="TileMapPattern" id="TileMapPattern_dy2ut"] 321 | tile_data = PackedInt32Array(4, 1769476, 19, 131076, 1769476, 19, 262148, 1769476, 19) 322 | 323 | [sub_resource type="TileMapPattern" id="TileMapPattern_fa77e"] 324 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 720900, 19, 196608, 720900, 19, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 720900, 19, 196609, 720900, 19, 262145, 1441796, 0, 327681, 1441796, 0, 2, 720900, 19, 65538, 720900, 19, 131074, 720900, 19, 196610, 720900, 19, 262146, 720900, 19, 327682, 720900, 19, 3, 720900, 19, 65539, 720900, 19, 131075, 720900, 19, 196611, 720900, 19, 262147, 720900, 19, 327683, 720900, 19, 4, 1441796, 0, 65540, 1441796, 0, 131076, 1441796, 0, 196612, 1441796, 0, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 1441796, 0, 196613, 1441796, 0, 262149, 1441796, 0, 327685, 1441796, 0) 325 | 326 | [sub_resource type="Resource" id="Resource_idpie"] 327 | script = ExtResource("3_0h1xu") 328 | pattern = SubResource("TileMapPattern_fa77e") 329 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_cct7t"), SubResource("TileMapPattern_srnis"), SubResource("TileMapPattern_7sk2e"), SubResource("TileMapPattern_dy2ut")]) 330 | additional_layers_name = Array[String](["ground", "street", "tree_plots", "house_plots"]) 331 | hash = 3298704679 332 | width = 0 333 | weight = 100.0 334 | name = "" 335 | group = "" 336 | sockets = { 337 | Vector2i(-1, 0): 4048461711, 338 | Vector2i(0, -1): 4048461711, 339 | Vector2i(0, 1): 4048461711, 340 | Vector2i(1, 0): 3140704587 341 | } 342 | allowed_neighbors = { 343 | Vector2i(-1, 0): [1161627202], 344 | Vector2i(0, -1): [], 345 | Vector2i(0, 1): [3384106273], 346 | Vector2i(1, 0): [3498367148] 347 | } 348 | 349 | [sub_resource type="TileMapPattern" id="TileMapPattern_clatx"] 350 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 351 | 352 | [sub_resource type="TileMapPattern" id="TileMapPattern_hip55"] 353 | tile_data = PackedInt32Array(131072, 655364, 19, 196608, 655364, 20, 131073, 655364, 19, 196609, 655364, 20, 2, 589828, 21, 65538, 589828, 21, 131074, 720900, 19, 196610, 720900, 19, 3, 655364, 21, 65539, 655364, 21, 131075, 720900, 19, 196611, 720900, 19, 131076, 655364, 19, 196612, 655364, 20, 131077, 655364, 19, 196613, 655364, 20) 354 | 355 | [sub_resource type="TileMapPattern" id="TileMapPattern_ijbl4"] 356 | tile_data = PackedInt32Array(0, 1769476, 19, 262144, 1769476, 19, 262146, 1769476, 19, 4, 1769476, 19, 262148, 1769476, 19) 357 | 358 | [sub_resource type="TileMapPattern" id="TileMapPattern_cqsqw"] 359 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 720900, 19, 196608, 720900, 19, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 720900, 19, 196609, 720900, 19, 262145, 1441796, 0, 327681, 1441796, 0, 2, 720900, 19, 65538, 720900, 19, 131074, 720900, 19, 196610, 720900, 19, 262146, 1441796, 0, 327682, 1441796, 0, 3, 720900, 19, 65539, 720900, 19, 131075, 720900, 19, 196611, 720900, 19, 262147, 1441796, 0, 327683, 1441796, 0, 4, 1441796, 0, 65540, 1441796, 0, 131076, 720900, 19, 196612, 720900, 19, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 720900, 19, 196613, 720900, 19, 262149, 1441796, 0, 327685, 1441796, 0) 360 | 361 | [sub_resource type="Resource" id="Resource_2doot"] 362 | script = ExtResource("3_0h1xu") 363 | pattern = SubResource("TileMapPattern_cqsqw") 364 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_clatx"), SubResource("TileMapPattern_hip55"), SubResource("TileMapPattern_ijbl4")]) 365 | additional_layers_name = Array[String](["ground", "street", "house_plots"]) 366 | hash = 3384106273 367 | width = 0 368 | weight = 100.0 369 | name = "" 370 | group = "" 371 | sockets = { 372 | Vector2i(-1, 0): 4048461711, 373 | Vector2i(0, -1): 4048461711, 374 | Vector2i(0, 1): 3140704587, 375 | Vector2i(1, 0): 4048461711 376 | } 377 | allowed_neighbors = { 378 | Vector2i(-1, 0): [3815200611], 379 | Vector2i(0, -1): [3298704679], 380 | Vector2i(0, 1): [], 381 | Vector2i(1, 0): [3575203905] 382 | } 383 | 384 | [sub_resource type="TileMapPattern" id="TileMapPattern_275qy"] 385 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 386 | 387 | [sub_resource type="TileMapPattern" id="TileMapPattern_vrdin"] 388 | tile_data = PackedInt32Array(131072, 655364, 19, 196608, 655364, 20, 131073, 589828, 22, 196609, 589828, 22, 2, 589828, 21, 65538, 851972, 22, 131074, 720900, 19, 196610, 720900, 19, 262146, 851972, 22, 327682, 589828, 21, 3, 655364, 21, 65539, 851972, 22, 131075, 720900, 19, 196611, 720900, 19, 262147, 851972, 22, 327683, 655364, 21, 131076, 589828, 22, 196612, 589828, 22, 131077, 655364, 19, 196613, 655364, 20) 389 | 390 | [sub_resource type="TileMapPattern" id="TileMapPattern_t203l"] 391 | tile_data = PackedInt32Array(262144, 1769476, 19, 327680, 1769476, 19, 262145, 1769476, 19, 327681, 1769476, 19) 392 | 393 | [sub_resource type="TileMapPattern" id="TileMapPattern_j8k2u"] 394 | tile_data = PackedInt32Array(0, 1769476, 19, 4, 1769476, 19, 262148, 1769476, 19) 395 | 396 | [sub_resource type="TileMapPattern" id="TileMapPattern_t7trg"] 397 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 720900, 19, 196608, 720900, 19, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 720900, 19, 196609, 720900, 19, 262145, 1441796, 0, 327681, 1441796, 0, 2, 720900, 19, 65538, 720900, 19, 131074, 720900, 19, 196610, 720900, 19, 262146, 720900, 19, 327682, 720900, 19, 3, 720900, 19, 65539, 720900, 19, 131075, 720900, 19, 196611, 720900, 19, 262147, 720900, 19, 327683, 720900, 19, 4, 1441796, 0, 65540, 1441796, 0, 131076, 720900, 19, 196612, 720900, 19, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 720900, 19, 196613, 720900, 19, 262149, 1441796, 0, 327685, 1441796, 0) 398 | 399 | [sub_resource type="Resource" id="Resource_oexei"] 400 | script = ExtResource("3_0h1xu") 401 | pattern = SubResource("TileMapPattern_t7trg") 402 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_275qy"), SubResource("TileMapPattern_vrdin"), SubResource("TileMapPattern_t203l"), SubResource("TileMapPattern_j8k2u")]) 403 | additional_layers_name = Array[String](["ground", "street", "tree_plots", "house_plots"]) 404 | hash = 3498367148 405 | width = 0 406 | weight = 100.0 407 | name = "" 408 | group = "" 409 | sockets = { 410 | Vector2i(-1, 0): 4048461711, 411 | Vector2i(0, -1): 4048461711, 412 | Vector2i(0, 1): 4048461711, 413 | Vector2i(1, 0): 4048461711 414 | } 415 | allowed_neighbors = { 416 | Vector2i(-1, 0): [3298704679], 417 | Vector2i(0, -1): [], 418 | Vector2i(0, 1): [3575203905], 419 | Vector2i(1, 0): [] 420 | } 421 | 422 | [sub_resource type="TileMapPattern" id="TileMapPattern_v8ob5"] 423 | tile_data = PackedInt32Array(0, 65540, 26, 65536, 65540, 26, 131072, 65540, 26, 196608, 65540, 26, 262144, 65540, 26, 327680, 65540, 26, 1, 65540, 26, 65537, 65540, 26, 131073, 65540, 26, 196609, 65540, 26, 262145, 65540, 26, 327681, 65540, 26, 2, 65540, 26, 65538, 65540, 26, 131074, 65540, 26, 196610, 65540, 26, 262146, 65540, 26, 327682, 65540, 26, 3, 65540, 26, 65539, 65540, 26, 131075, 65540, 26, 196611, 65540, 26, 262147, 65540, 26, 327683, 65540, 26, 4, 65540, 26, 65540, 65540, 26, 131076, 65540, 26, 196612, 65540, 26, 262148, 65540, 26, 327684, 65540, 26, 5, 65540, 26, 65541, 65540, 26, 131077, 65540, 26, 196613, 65540, 26, 262149, 65540, 26, 327685, 65540, 26) 424 | 425 | [sub_resource type="TileMapPattern" id="TileMapPattern_3w20x"] 426 | tile_data = PackedInt32Array(196611, 65540, 26) 427 | 428 | [sub_resource type="TileMapPattern" id="TileMapPattern_wiijc"] 429 | tile_data = PackedInt32Array(0, 1769476, 19, 65536, 1769476, 19, 131072, 1769476, 19, 196608, 1769476, 19, 262144, 1769476, 19, 327680, 1769476, 19, 1, 1769476, 19, 65537, 1769476, 19, 131073, 1769476, 19, 196609, 1769476, 19, 262145, 1769476, 19, 327681, 1769476, 19, 2, 1769476, 19, 65538, 1769476, 19, 131074, 1769476, 19, 196610, 1769476, 19, 262146, 1769476, 19, 327682, 1769476, 19, 3, 1769476, 19, 65539, 1769476, 19, 131075, 1769476, 19, 196611, 1769476, 19, 262147, 1769476, 19, 327683, 1769476, 19, 4, 1769476, 19, 65540, 1769476, 19, 131076, 1769476, 19, 196612, 1769476, 19, 262148, 1769476, 19, 327684, 1769476, 19, 5, 1769476, 19, 65541, 1769476, 19, 131077, 1769476, 19, 196613, 1769476, 19, 262149, 1769476, 19, 327685, 1769476, 19) 430 | 431 | [sub_resource type="TileMapPattern" id="TileMapPattern_dgnia"] 432 | tile_data = PackedInt32Array(0, 1441796, 0, 65536, 1441796, 0, 131072, 1441796, 0, 196608, 1441796, 0, 262144, 1441796, 0, 327680, 1441796, 0, 1, 1441796, 0, 65537, 1441796, 0, 131073, 1441796, 0, 196609, 1441796, 0, 262145, 1441796, 0, 327681, 1441796, 0, 2, 1441796, 0, 65538, 1441796, 0, 131074, 1441796, 0, 196610, 1441796, 0, 262146, 1441796, 0, 327682, 1441796, 0, 3, 1441796, 0, 65539, 1441796, 0, 131075, 1441796, 0, 196611, 1441796, 0, 262147, 1441796, 0, 327683, 1441796, 0, 4, 1441796, 0, 65540, 1441796, 0, 131076, 1441796, 0, 196612, 1441796, 0, 262148, 1441796, 0, 327684, 1441796, 0, 5, 1441796, 0, 65541, 1441796, 0, 131077, 1441796, 0, 196613, 1441796, 0, 262149, 1441796, 0, 327685, 1441796, 0) 433 | 434 | [sub_resource type="Resource" id="Resource_4ckbw"] 435 | script = ExtResource("3_0h1xu") 436 | pattern = SubResource("TileMapPattern_dgnia") 437 | additional_layers = Array[TileMapPattern]([SubResource("TileMapPattern_v8ob5"), SubResource("TileMapPattern_3w20x"), SubResource("TileMapPattern_wiijc")]) 438 | additional_layers_name = Array[String](["ground", "street", "tree_plots"]) 439 | hash = 3575203905 440 | width = 0 441 | weight = 5000.0 442 | name = "" 443 | group = "" 444 | sockets = { 445 | Vector2i(-1, 0): 3140704587, 446 | Vector2i(0, -1): 3140704587, 447 | Vector2i(0, 1): 3140704587, 448 | Vector2i(1, 0): 3140704587 449 | } 450 | allowed_neighbors = { 451 | Vector2i(-1, 0): [3384106273], 452 | Vector2i(0, -1): [3498367148], 453 | Vector2i(0, 1): [], 454 | Vector2i(1, 0): [] 455 | } 456 | 457 | [resource] 458 | script = ExtResource("1_7iggk") 459 | wfc_tiles = Array[ExtResource("3_0h1xu")]([SubResource("Resource_wfmkw"), SubResource("Resource_4rl84"), SubResource("Resource_uvujq"), SubResource("Resource_vf8t6"), SubResource("Resource_0c5lo"), SubResource("Resource_au5lo"), SubResource("Resource_aaokl"), SubResource("Resource_gu2mi"), SubResource("Resource_idpie"), SubResource("Resource_2doot"), SubResource("Resource_oexei"), SubResource("Resource_4ckbw")]) 460 | original_layers = [{ 461 | "color": Color(1, 1, 1, 1), 462 | "name": "sockets", 463 | "render": false, 464 | "sort": 0, 465 | "z": 0 466 | }, { 467 | "color": Color(1, 1, 1, 1), 468 | "name": "ground", 469 | "render": true, 470 | "sort": 0, 471 | "z": 0 472 | }, { 473 | "color": Color(1, 1, 1, 1), 474 | "name": "street", 475 | "render": true, 476 | "sort": 0, 477 | "z": 0 478 | }, { 479 | "color": Color(0.2, 0.686275, 0, 1), 480 | "name": "tree_plots", 481 | "render": false, 482 | "sort": 0, 483 | "z": 0 484 | }, { 485 | "color": Color(0.580392, 0.580392, 0.580392, 1), 486 | "name": "house_plots", 487 | "render": false, 488 | "sort": 0, 489 | "z": 0 490 | }] 491 | quad_size = 16 492 | pattern_size = Vector2i(6, 6) 493 | tile_set = ExtResource("2_pyt1t") 494 | --------------------------------------------------------------------------------