From 7dc6a4c420977daa5c0da3393a898ed99ac50b5b Mon Sep 17 00:00:00 2001 From: Antti Hakkarainen Date: Sun, 12 Feb 2023 13:54:14 +0200 Subject: [PATCH] implement tilemap chunk generator --- maps/tampere_10x10km_1024px.png | Bin 0 -> 17940 bytes maps/tampere_10x10km_1024px.png.import | 14 + maps/tampere_10x10km_4096px.png | Bin 0 -> 76146 bytes maps/tampere_10x10km_4096px.png.import | 14 + project.godot | 4 + scenes/Main.tscn | 1476 +---------------- scripts/Control.gd | 6 +- scripts/{World.gd => EntityPlacer.gd} | 71 +- scripts/Globals.gd | 23 +- scripts/Main.gd | 34 +- scripts/TileMapGenerator.gd | 57 + .../{WorldGeneration.gd => WorldGenerator.gd} | 137 +- 12 files changed, 244 insertions(+), 1592 deletions(-) create mode 100644 maps/tampere_10x10km_1024px.png create mode 100644 maps/tampere_10x10km_1024px.png.import create mode 100644 maps/tampere_10x10km_4096px.png create mode 100644 maps/tampere_10x10km_4096px.png.import rename scripts/{World.gd => EntityPlacer.gd} (59%) create mode 100644 scripts/TileMapGenerator.gd rename scripts/{WorldGeneration.gd => WorldGenerator.gd} (62%) diff --git a/maps/tampere_10x10km_1024px.png b/maps/tampere_10x10km_1024px.png new file mode 100644 index 0000000000000000000000000000000000000000..8176c886a1c9cd9b5c4bdc38972681d5f0e9b4c2 GIT binary patch literal 17940 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 U?%&z}JQ;w%)78&qol`;+05ez2B>(^b literal 0 HcmV?d00001 diff --git a/maps/tampere_10x10km_1024px.png.import b/maps/tampere_10x10km_1024px.png.import new file mode 100644 index 0000000..bd32059 --- /dev/null +++ b/maps/tampere_10x10km_1024px.png.import @@ -0,0 +1,14 @@ +[remap] + +importer="image" +type="Image" +uid="uid://dprlyk4ednkp8" +path="res://.godot/imported/tampere_10x10km_1024px.png-569f3285557c876bd7277d49b8414424.image" + +[deps] + +source_file="res://maps/tampere_10x10km_1024px.png" +dest_files=["res://.godot/imported/tampere_10x10km_1024px.png-569f3285557c876bd7277d49b8414424.image"] + +[params] + diff --git a/maps/tampere_10x10km_4096px.png b/maps/tampere_10x10km_4096px.png new file mode 100644 index 0000000000000000000000000000000000000000..1488a1b97946d49cb234147970629060ff99f9d4 GIT binary patch literal 76146 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Ĕ==q`JyAlFetg_T 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 XFE7xr`q}+sNd~&d4i{=W-1vV0t5)_J literal 0 HcmV?d00001 diff --git a/maps/tampere_10x10km_4096px.png.import b/maps/tampere_10x10km_4096px.png.import new file mode 100644 index 0000000..7dc78c6 --- /dev/null +++ b/maps/tampere_10x10km_4096px.png.import @@ -0,0 +1,14 @@ +[remap] + +importer="image" +type="Image" +uid="uid://bl4xbe4vb3nft" +path="res://.godot/imported/tampere_10x10km_4096px.png-a656fcf9b79fbe6e529e735982b88a37.image" + +[deps] + +source_file="res://maps/tampere_10x10km_4096px.png" +dest_files=["res://.godot/imported/tampere_10x10km_4096px.png-a656fcf9b79fbe6e529e735982b88a37.image"] + +[params] + diff --git a/project.godot b/project.godot index ab7ce6c..5f5dd92 100644 --- a/project.godot +++ b/project.godot @@ -19,6 +19,10 @@ config/icon="res://icon.svg" Globals="*res://scripts/Globals.gd" +[debug] + +gdscript/warnings/integer_division=0 + [display] window/size/viewport_height=1080 diff --git a/scenes/Main.tscn b/scenes/Main.tscn index acab0fd..8dd1ab3 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -1,1472 +1,25 @@ -[gd_scene load_steps=12 format=3 uid="uid://ciperl36hv26g"] +[gd_scene load_steps=6 format=3 uid="uid://ciperl36hv26g"] [ext_resource type="Script" path="res://scripts/Main.gd" id="1_ysxum"] -[ext_resource type="Texture2D" uid="uid://byy4k72uxx7sj" path="res://art/buildings/residential/med/med20x20res001.png" id="2_sfv1p"] +[ext_resource type="Script" path="res://scripts/TileMapGenerator.gd" id="2_cbjcm"] [ext_resource type="Script" path="res://scripts/Control.gd" id="3_1t1c8"] -[ext_resource type="Script" path="res://scripts/World.gd" id="3_6q5ju"] -[ext_resource type="Texture2D" uid="uid://dakvtfpnjuwwl" path="res://art/placeholder/outdoors.png" id="3_yddbk"] [ext_resource type="PackedScene" uid="uid://2we3txfr812u" path="res://scenes/Camera_zoom_2d.tscn" id="4_rx82t"] -[ext_resource type="Texture2D" uid="uid://djy5ne2grdc03" path="res://art/terrain/terrain.png" id="5_bqev6"] - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_3q7ue"] -texture = ExtResource("2_sfv1p") -0:0/size_in_atlas = Vector2i(20, 20) -0:0/next_alternative_id = 2 -0:0/0 = 0 - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_s55i2"] -texture = ExtResource("3_yddbk") -0:0/0 = 0 -1:0/0 = 0 -2:0/0 = 0 -3:0/0 = 0 -8:0/0 = 0 -9:0/0 = 0 -10:0/0 = 0 -14:0/0 = 0 -15:0/0 = 0 -16:0/0 = 0 -17:0/0 = 0 -20:0/0 = 0 -21:0/0 = 0 -22:0/0 = 0 -23:0/0 = 0 -24:0/0 = 0 -25:0/0 = 0 -26:0/0 = 0 -27:0/0 = 0 -0:1/0 = 0 -1:1/0 = 0 -2:1/0 = 0 -3:1/0 = 0 -8:1/0 = 0 -9:1/0 = 0 -10:1/0 = 0 -14:1/0 = 0 -15:1/0 = 0 -16:1/0 = 0 -17:1/0 = 0 -21:1/0 = 0 -23:1/0 = 0 -25:1/0 = 0 -27:1/0 = 0 -28:1/0 = 0 -0:2/0 = 0 -1:2/0 = 0 -2:2/0 = 0 -3:2/0 = 0 -8:2/0 = 0 -9:2/0 = 0 -10:2/0 = 0 -11:2/0 = 0 -12:2/0 = 0 -13:2/0 = 0 -18:2/0 = 0 -19:2/0 = 0 -21:2/0 = 0 -22:2/0 = 0 -23:2/0 = 0 -24:2/0 = 0 -25:2/0 = 0 -27:2/0 = 0 -28:2/0 = 0 -0:3/0 = 0 -1:3/0 = 0 -2:3/0 = 0 -3:3/0 = 0 -8:3/0 = 0 -9:3/0 = 0 -10:3/0 = 0 -11:3/0 = 0 -12:3/0 = 0 -13:3/0 = 0 -18:3/0 = 0 -19:3/0 = 0 -21:3/0 = 0 -23:3/0 = 0 -25:3/0 = 0 -0:4/0 = 0 -1:4/0 = 0 -2:4/0 = 0 -3:4/0 = 0 -8:4/0 = 0 -9:4/0 = 0 -10:4/0 = 0 -11:4/0 = 0 -12:4/0 = 0 -13:4/0 = 0 -18:4/0 = 0 -19:4/0 = 0 -20:4/0 = 0 -21:4/0 = 0 -22:4/0 = 0 -23:4/0 = 0 -24:4/0 = 0 -25:4/0 = 0 -26:4/0 = 0 -27:4/0 = 0 -28:4/0 = 0 -0:5/0 = 0 -1:5/0 = 0 -2:5/0 = 0 -3:5/0 = 0 -8:5/0 = 0 -9:5/0 = 0 -10:5/0 = 0 -11:5/0 = 0 -12:5/0 = 0 -13:5/0 = 0 -18:5/0 = 0 -19:5/0 = 0 -20:5/0 = 0 -21:5/0 = 0 -22:5/0 = 0 -23:5/0 = 0 -24:5/0 = 0 -25:5/0 = 0 -26:5/0 = 0 -27:5/0 = 0 -28:5/0 = 0 -0:6/0 = 0 -1:6/0 = 0 -2:6/0 = 0 -3:6/0 = 0 -8:6/0 = 0 -9:6/0 = 0 -10:6/0 = 0 -11:6/0 = 0 -14:6/0 = 0 -15:6/0 = 0 -16:6/0 = 0 -17:6/0 = 0 -20:6/0 = 0 -21:6/0 = 0 -22:6/0 = 0 -23:6/0 = 0 -24:6/0 = 0 -25:6/0 = 0 -27:6/0 = 0 -28:6/0 = 0 -0:7/0 = 0 -1:7/0 = 0 -2:7/0 = 0 -3:7/0 = 0 -8:7/0 = 0 -9:7/0 = 0 -10:7/0 = 0 -11:7/0 = 0 -14:7/0 = 0 -15:7/0 = 0 -16:7/0 = 0 -17:7/0 = 0 -20:7/0 = 0 -21:7/0 = 0 -24:7/0 = 0 -25:7/0 = 0 -26:7/0 = 0 -27:7/0 = 0 -0:8/0 = 0 -1:8/0 = 0 -2:8/0 = 0 -3:8/0 = 0 -8:8/0 = 0 -9:8/0 = 0 -10:8/0 = 0 -11:8/0 = 0 -12:8/0 = 0 -13:8/0 = 0 -14:8/0 = 0 -15:8/0 = 0 -16:8/0 = 0 -17:8/0 = 0 -18:8/0 = 0 -19:8/0 = 0 -20:8/0 = 0 -21:8/0 = 0 -22:8/0 = 0 -23:8/0 = 0 -24:8/0 = 0 -25:8/0 = 0 -26:8/0 = 0 -27:8/0 = 0 -0:9/0 = 0 -1:9/0 = 0 -2:9/0 = 0 -3:9/0 = 0 -8:9/0 = 0 -9:9/0 = 0 -10:9/0 = 0 -11:9/0 = 0 -12:9/0 = 0 -13:9/0 = 0 -14:9/0 = 0 -15:9/0 = 0 -16:9/0 = 0 -17:9/0 = 0 -18:9/0 = 0 -19:9/0 = 0 -22:9/0 = 0 -23:9/0 = 0 -26:9/0 = 0 -27:9/0 = 0 -0:10/0 = 0 -1:10/0 = 0 -2:10/0 = 0 -3:10/0 = 0 -8:10/0 = 0 -9:10/0 = 0 -10:10/0 = 0 -12:10/0 = 0 -13:10/0 = 0 -14:10/0 = 0 -15:10/0 = 0 -16:10/0 = 0 -17:10/0 = 0 -18:10/0 = 0 -19:10/0 = 0 -22:10/0 = 0 -23:10/0 = 0 -26:10/0 = 0 -27:10/0 = 0 -0:11/0 = 0 -8:11/0 = 0 -9:11/0 = 0 -10:11/0 = 0 -12:11/0 = 0 -13:11/0 = 0 -14:11/0 = 0 -15:11/0 = 0 -16:11/0 = 0 -17:11/0 = 0 -18:11/0 = 0 -19:11/0 = 0 -20:11/0 = 0 -21:11/0 = 0 -22:11/0 = 0 -23:11/0 = 0 -24:11/0 = 0 -25:11/0 = 0 -26:11/0 = 0 -0:12/0 = 0 -8:12/0 = 0 -9:12/0 = 0 -10:12/0 = 0 -11:12/0 = 0 -12:12/0 = 0 -13:12/0 = 0 -14:12/0 = 0 -15:12/0 = 0 -16:12/0 = 0 -17:12/0 = 0 -18:12/0 = 0 -19:12/0 = 0 -21:12/0 = 0 -22:12/0 = 0 -24:12/0 = 0 -25:12/0 = 0 -26:12/0 = 0 -0:13/0 = 0 -8:13/0 = 0 -9:13/0 = 0 -10:13/0 = 0 -11:13/0 = 0 -12:13/0 = 0 -13:13/0 = 0 -14:13/0 = 0 -15:13/0 = 0 -16:13/0 = 0 -17:13/0 = 0 -18:13/0 = 0 -19:13/0 = 0 -21:13/0 = 0 -22:13/0 = 0 -24:13/0 = 0 -25:13/0 = 0 -26:13/0 = 0 -0:14/0 = 0 -8:14/0 = 0 -9:14/0 = 0 -10:14/0 = 0 -11:14/0 = 0 -12:14/0 = 0 -13:14/0 = 0 -14:14/0 = 0 -15:14/0 = 0 -16:14/0 = 0 -17:14/0 = 0 -18:14/0 = 0 -19:14/0 = 0 -24:14/0 = 0 -10:15/0 = 0 -11:15/0 = 0 -12:15/0 = 0 -13:15/0 = 0 -14:15/0 = 0 -15:15/0 = 0 -16:15/0 = 0 -17:15/0 = 0 -18:15/0 = 0 -19:15/0 = 0 -21:15/0 = 0 -22:15/0 = 0 -23:15/0 = 0 -24:15/0 = 0 -25:15/0 = 0 -26:15/0 = 0 -27:15/0 = 0 -28:15/0 = 0 -21:16/0 = 0 -22:16/0 = 0 -23:16/0 = 0 -24:16/0 = 0 -25:16/0 = 0 -26:16/0 = 0 -27:16/0 = 0 -28:16/0 = 0 -21:17/0 = 0 -22:17/0 = 0 -23:17/0 = 0 -24:17/0 = 0 -25:17/0 = 0 -26:17/0 = 0 -27:17/0 = 0 -28:17/0 = 0 -8:18/0 = 0 -9:18/0 = 0 -10:18/0 = 0 -11:18/0 = 0 -21:18/0 = 0 -22:18/0 = 0 -23:18/0 = 0 -24:18/0 = 0 -25:18/0 = 0 -26:18/0 = 0 -27:18/0 = 0 -28:18/0 = 0 -8:19/0 = 0 -11:19/0 = 0 -21:19/0 = 0 -22:19/0 = 0 -23:19/0 = 0 -24:19/0 = 0 -25:19/0 = 0 -26:19/0 = 0 -27:19/0 = 0 -28:19/0 = 0 -8:20/0 = 0 -9:20/0 = 0 -10:20/0 = 0 -11:20/0 = 0 -21:20/0 = 0 -22:20/0 = 0 -23:20/0 = 0 -24:20/0 = 0 -25:20/0 = 0 -26:20/0 = 0 -27:20/0 = 0 -28:20/0 = 0 -9:21/0 = 0 -10:21/0 = 0 -11:21/0 = 0 -21:21/0 = 0 -22:21/0 = 0 -23:21/0 = 0 -24:21/0 = 0 -25:21/0 = 0 -26:21/0 = 0 -27:21/0 = 0 -28:21/0 = 0 -9:22/0 = 0 -10:22/0 = 0 -21:22/0 = 0 -22:22/0 = 0 -23:22/0 = 0 -24:22/0 = 0 -25:22/0 = 0 -26:22/0 = 0 -27:22/0 = 0 -28:22/0 = 0 -21:23/0 = 0 -22:23/0 = 0 -23:23/0 = 0 -24:23/0 = 0 -21:24/0 = 0 -22:24/0 = 0 -23:24/0 = 0 -24:24/0 = 0 -7:0/size_in_atlas = Vector2i(1, 3) -7:0/0 = 0 -7:3/0 = 0 -4:3/size_in_atlas = Vector2i(3, 1) -4:3/0 = 0 -4:0/size_in_atlas = Vector2i(3, 3) -4:0/0 = 0 -13:18/size_in_atlas = Vector2i(2, 5) -13:18/0 = 0 -12:20/size_in_atlas = Vector2i(1, 3) -12:20/0 = 0 -15:20/size_in_atlas = Vector2i(1, 3) -15:20/0 = 0 -4:24/size_in_atlas = Vector2i(3, 3) -4:24/0 = 0 -4:27/size_in_atlas = Vector2i(3, 1) -4:27/0 = 0 -7:27/0 = 0 -7:24/size_in_atlas = Vector2i(1, 3) -7:24/0 = 0 -4:20/size_in_atlas = Vector2i(3, 3) -4:20/0 = 0 -4:23/size_in_atlas = Vector2i(3, 1) -4:23/0 = 0 -7:23/0 = 0 -7:20/size_in_atlas = Vector2i(1, 3) -7:20/0 = 0 -4:16/size_in_atlas = Vector2i(3, 3) -4:16/0 = 0 -4:19/size_in_atlas = Vector2i(3, 1) -4:19/0 = 0 -7:19/0 = 0 -7:16/size_in_atlas = Vector2i(1, 3) -7:16/0 = 0 -7:15/0 = 0 -4:15/size_in_atlas = Vector2i(3, 1) -4:15/0 = 0 -4:12/size_in_atlas = Vector2i(3, 3) -4:12/0 = 0 -7:12/size_in_atlas = Vector2i(1, 3) -7:12/0 = 0 -4:4/size_in_atlas = Vector2i(3, 3) -4:4/0 = 0 -7:4/size_in_atlas = Vector2i(1, 3) -7:4/0 = 0 -7:7/0 = 0 -4:7/size_in_atlas = Vector2i(3, 1) -4:7/0 = 0 -4:8/size_in_atlas = Vector2i(3, 3) -4:8/0 = 0 -7:8/size_in_atlas = Vector2i(1, 3) -7:8/0 = 0 -7:11/0 = 0 -4:11/size_in_atlas = Vector2i(3, 1) -4:11/0 = 0 -8:15/size_in_atlas = Vector2i(2, 3) -8:15/0 = 0 -10:16/size_in_atlas = Vector2i(3, 2) -10:16/0 = 0 -13:16/size_in_atlas = Vector2i(3, 2) -13:16/0 = 0 -16:16/size_in_atlas = Vector2i(2, 2) -16:16/0 = 0 -14:2/size_in_atlas = Vector2i(4, 4) -14:2/0 = 0 - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_hwjm3"] -texture = ExtResource("5_bqev6") -0:0/next_alternative_id = 4 -0:0/0 = 0 -0:0/1 = 1 -0:0/1/flip_h = true -0:0/2 = 2 -0:0/2/flip_v = true -0:0/3 = 3 -0:0/3/transpose = true -1:0/next_alternative_id = 4 -1:0/0 = 0 -1:0/1 = 1 -1:0/1/flip_h = true -1:0/2 = 2 -1:0/2/flip_v = true -1:0/3 = 3 -1:0/3/transpose = true -2:0/0 = 0 -3:0/0 = 0 -4:0/0 = 0 -5:0/0 = 0 -6:0/0 = 0 -7:0/0 = 0 -8:0/0 = 0 -9:0/0 = 0 -10:0/0 = 0 -11:0/0 = 0 -12:0/0 = 0 -13:0/0 = 0 -14:0/0 = 0 -15:0/0 = 0 -16:0/0 = 0 -17:0/0 = 0 -18:0/0 = 0 -19:0/0 = 0 -20:0/0 = 0 -21:0/0 = 0 -22:0/0 = 0 -23:0/0 = 0 -24:0/0 = 0 -25:0/0 = 0 -26:0/0 = 0 -27:0/0 = 0 -28:0/0 = 0 -29:0/0 = 0 -30:0/0 = 0 -31:0/0 = 0 -0:1/0 = 0 -1:1/0 = 0 -2:1/0 = 0 -3:1/0 = 0 -4:1/0 = 0 -5:1/next_alternative_id = 4 -5:1/0 = 0 -5:1/1 = 1 -5:1/1/flip_h = true -5:1/2 = 2 -5:1/2/flip_v = true -5:1/3 = 3 -5:1/3/transpose = true -6:1/0 = 0 -7:1/0 = 0 -8:1/0 = 0 -9:1/0 = 0 -10:1/0 = 0 -11:1/0 = 0 -12:1/0 = 0 -13:1/0 = 0 -14:1/0 = 0 -15:1/0 = 0 -16:1/0 = 0 -17:1/0 = 0 -18:1/0 = 0 -19:1/0 = 0 -20:1/0 = 0 -21:1/0 = 0 -22:1/0 = 0 -23:1/0 = 0 -24:1/0 = 0 -25:1/0 = 0 -26:1/0 = 0 -27:1/0 = 0 -28:1/0 = 0 -29:1/0 = 0 -30:1/0 = 0 -31:1/0 = 0 -0:2/0 = 0 -1:2/0 = 0 -2:2/0 = 0 -3:2/0 = 0 -4:2/0 = 0 -5:2/0 = 0 -6:2/0 = 0 -7:2/0 = 0 -8:2/0 = 0 -9:2/0 = 0 -10:2/0 = 0 -11:2/0 = 0 -12:2/0 = 0 -13:2/0 = 0 -14:2/0 = 0 -15:2/0 = 0 -16:2/0 = 0 -17:2/0 = 0 -18:2/0 = 0 -19:2/0 = 0 -20:2/0 = 0 -21:2/0 = 0 -22:2/0 = 0 -23:2/0 = 0 -24:2/0 = 0 -25:2/0 = 0 -26:2/0 = 0 -27:2/0 = 0 -28:2/0 = 0 -29:2/0 = 0 -30:2/0 = 0 -31:2/0 = 0 -0:3/0 = 0 -1:3/0 = 0 -2:3/0 = 0 -3:3/0 = 0 -4:3/0 = 0 -5:3/0 = 0 -6:3/0 = 0 -7:3/0 = 0 -8:3/0 = 0 -9:3/0 = 0 -10:3/0 = 0 -11:3/0 = 0 -12:3/0 = 0 -13:3/0 = 0 -14:3/0 = 0 -15:3/0 = 0 -16:3/0 = 0 -17:3/0 = 0 -18:3/0 = 0 -19:3/0 = 0 -20:3/0 = 0 -21:3/0 = 0 -22:3/0 = 0 -23:3/0 = 0 -24:3/0 = 0 -25:3/0 = 0 -26:3/0 = 0 -27:3/0 = 0 -28:3/0 = 0 -29:3/0 = 0 -30:3/0 = 0 -31:3/0 = 0 -0:4/0 = 0 -1:4/0 = 0 -2:4/0 = 0 -3:4/0 = 0 -4:4/0 = 0 -5:4/0 = 0 -6:4/0 = 0 -7:4/0 = 0 -8:4/0 = 0 -9:4/0 = 0 -10:4/0 = 0 -11:4/0 = 0 -12:4/0 = 0 -13:4/0 = 0 -14:4/0 = 0 -15:4/0 = 0 -16:4/0 = 0 -17:4/0 = 0 -18:4/0 = 0 -19:4/0 = 0 -20:4/0 = 0 -21:4/0 = 0 -22:4/0 = 0 -23:4/0 = 0 -24:4/0 = 0 -25:4/0 = 0 -26:4/0 = 0 -27:4/0 = 0 -28:4/0 = 0 -29:4/0 = 0 -30:4/0 = 0 -31:4/0 = 0 -0:5/0 = 0 -1:5/0 = 0 -2:5/0 = 0 -3:5/0 = 0 -4:5/0 = 0 -5:5/0 = 0 -6:5/0 = 0 -7:5/0 = 0 -8:5/0 = 0 -9:5/0 = 0 -10:5/0 = 0 -11:5/0 = 0 -12:5/0 = 0 -13:5/0 = 0 -14:5/0 = 0 -15:5/0 = 0 -16:5/0 = 0 -17:5/0 = 0 -18:5/0 = 0 -19:5/0 = 0 -20:5/0 = 0 -21:5/0 = 0 -22:5/0 = 0 -23:5/0 = 0 -24:5/0 = 0 -25:5/0 = 0 -26:5/0 = 0 -27:5/0 = 0 -28:5/0 = 0 -29:5/0 = 0 -30:5/0 = 0 -31:5/0 = 0 -0:6/0 = 0 -1:6/0 = 0 -2:6/0 = 0 -3:6/0 = 0 -4:6/0 = 0 -5:6/0 = 0 -6:6/0 = 0 -7:6/0 = 0 -8:6/0 = 0 -9:6/0 = 0 -10:6/0 = 0 -11:6/0 = 0 -12:6/0 = 0 -13:6/0 = 0 -14:6/0 = 0 -15:6/0 = 0 -16:6/0 = 0 -17:6/0 = 0 -18:6/0 = 0 -19:6/0 = 0 -20:6/0 = 0 -21:6/0 = 0 -22:6/0 = 0 -23:6/0 = 0 -24:6/0 = 0 -25:6/0 = 0 -26:6/0 = 0 -27:6/0 = 0 -28:6/0 = 0 -29:6/0 = 0 -30:6/0 = 0 -31:6/0 = 0 -0:7/0 = 0 -1:7/0 = 0 -2:7/0 = 0 -3:7/0 = 0 -4:7/0 = 0 -5:7/0 = 0 -6:7/0 = 0 -7:7/0 = 0 -8:7/0 = 0 -9:7/0 = 0 -10:7/0 = 0 -11:7/0 = 0 -12:7/0 = 0 -13:7/0 = 0 -14:7/0 = 0 -15:7/0 = 0 -16:7/0 = 0 -17:7/0 = 0 -18:7/0 = 0 -19:7/0 = 0 -20:7/0 = 0 -21:7/0 = 0 -22:7/0 = 0 -23:7/0 = 0 -24:7/0 = 0 -25:7/0 = 0 -26:7/0 = 0 -27:7/0 = 0 -28:7/0 = 0 -29:7/0 = 0 -30:7/0 = 0 -31:7/0 = 0 -0:8/0 = 0 -1:8/0 = 0 -2:8/0 = 0 -3:8/0 = 0 -4:8/0 = 0 -5:8/0 = 0 -6:8/0 = 0 -7:8/0 = 0 -8:8/0 = 0 -9:8/0 = 0 -10:8/0 = 0 -11:8/0 = 0 -12:8/0 = 0 -13:8/0 = 0 -14:8/0 = 0 -15:8/0 = 0 -16:8/0 = 0 -17:8/0 = 0 -18:8/0 = 0 -19:8/0 = 0 -20:8/0 = 0 -21:8/0 = 0 -22:8/0 = 0 -23:8/0 = 0 -24:8/0 = 0 -25:8/0 = 0 -26:8/0 = 0 -27:8/0 = 0 -28:8/0 = 0 -29:8/0 = 0 -30:8/0 = 0 -31:8/0 = 0 -0:9/0 = 0 -1:9/0 = 0 -2:9/0 = 0 -3:9/0 = 0 -4:9/0 = 0 -5:9/0 = 0 -6:9/0 = 0 -7:9/0 = 0 -8:9/0 = 0 -9:9/0 = 0 -10:9/0 = 0 -11:9/0 = 0 -12:9/0 = 0 -13:9/0 = 0 -14:9/0 = 0 -15:9/0 = 0 -16:9/0 = 0 -17:9/0 = 0 -18:9/0 = 0 -19:9/0 = 0 -20:9/0 = 0 -21:9/0 = 0 -22:9/0 = 0 -23:9/0 = 0 -24:9/0 = 0 -25:9/0 = 0 -26:9/0 = 0 -27:9/0 = 0 -28:9/0 = 0 -29:9/0 = 0 -30:9/0 = 0 -31:9/0 = 0 -0:10/0 = 0 -1:10/0 = 0 -2:10/0 = 0 -3:10/0 = 0 -4:10/0 = 0 -5:10/0 = 0 -6:10/0 = 0 -7:10/0 = 0 -8:10/0 = 0 -9:10/0 = 0 -10:10/0 = 0 -11:10/0 = 0 -12:10/0 = 0 -13:10/0 = 0 -14:10/0 = 0 -15:10/0 = 0 -16:10/0 = 0 -17:10/0 = 0 -18:10/0 = 0 -19:10/0 = 0 -20:10/0 = 0 -21:10/0 = 0 -22:10/0 = 0 -23:10/0 = 0 -24:10/0 = 0 -25:10/0 = 0 -26:10/0 = 0 -27:10/0 = 0 -28:10/0 = 0 -29:10/0 = 0 -30:10/0 = 0 -31:10/0 = 0 -0:11/0 = 0 -1:11/0 = 0 -2:11/0 = 0 -3:11/0 = 0 -4:11/0 = 0 -5:11/0 = 0 -6:11/0 = 0 -7:11/0 = 0 -8:11/0 = 0 -9:11/0 = 0 -10:11/0 = 0 -11:11/0 = 0 -12:11/0 = 0 -13:11/0 = 0 -14:11/0 = 0 -15:11/0 = 0 -16:11/0 = 0 -17:11/0 = 0 -18:11/0 = 0 -19:11/0 = 0 -20:11/0 = 0 -21:11/0 = 0 -22:11/0 = 0 -23:11/0 = 0 -24:11/0 = 0 -25:11/0 = 0 -26:11/0 = 0 -27:11/0 = 0 -28:11/0 = 0 -29:11/0 = 0 -30:11/0 = 0 -31:11/0 = 0 -0:12/0 = 0 -1:12/0 = 0 -2:12/0 = 0 -3:12/0 = 0 -4:12/0 = 0 -5:12/0 = 0 -6:12/0 = 0 -7:12/0 = 0 -8:12/0 = 0 -9:12/0 = 0 -10:12/0 = 0 -11:12/0 = 0 -12:12/0 = 0 -13:12/0 = 0 -14:12/0 = 0 -15:12/0 = 0 -16:12/0 = 0 -17:12/0 = 0 -18:12/0 = 0 -19:12/0 = 0 -20:12/0 = 0 -21:12/0 = 0 -22:12/0 = 0 -23:12/0 = 0 -24:12/0 = 0 -25:12/0 = 0 -26:12/0 = 0 -27:12/0 = 0 -28:12/0 = 0 -29:12/0 = 0 -30:12/0 = 0 -31:12/0 = 0 -0:13/0 = 0 -1:13/0 = 0 -2:13/0 = 0 -3:13/0 = 0 -4:13/0 = 0 -5:13/0 = 0 -6:13/0 = 0 -7:13/0 = 0 -8:13/0 = 0 -9:13/0 = 0 -10:13/0 = 0 -11:13/0 = 0 -12:13/0 = 0 -13:13/0 = 0 -14:13/0 = 0 -15:13/0 = 0 -16:13/0 = 0 -17:13/0 = 0 -18:13/0 = 0 -19:13/0 = 0 -20:13/0 = 0 -21:13/0 = 0 -22:13/0 = 0 -23:13/0 = 0 -24:13/0 = 0 -25:13/0 = 0 -26:13/0 = 0 -27:13/0 = 0 -28:13/0 = 0 -29:13/0 = 0 -30:13/0 = 0 -31:13/0 = 0 -0:14/0 = 0 -1:14/0 = 0 -2:14/0 = 0 -3:14/0 = 0 -4:14/0 = 0 -5:14/0 = 0 -6:14/0 = 0 -7:14/0 = 0 -8:14/0 = 0 -9:14/0 = 0 -10:14/0 = 0 -11:14/0 = 0 -12:14/0 = 0 -13:14/0 = 0 -14:14/0 = 0 -15:14/0 = 0 -16:14/0 = 0 -17:14/0 = 0 -18:14/0 = 0 -19:14/0 = 0 -20:14/0 = 0 -21:14/0 = 0 -22:14/0 = 0 -23:14/0 = 0 -24:14/0 = 0 -25:14/0 = 0 -26:14/0 = 0 -27:14/0 = 0 -28:14/0 = 0 -29:14/0 = 0 -30:14/0 = 0 -31:14/0 = 0 -0:15/0 = 0 -1:15/0 = 0 -2:15/0 = 0 -3:15/0 = 0 -4:15/0 = 0 -5:15/0 = 0 -6:15/0 = 0 -7:15/0 = 0 -8:15/0 = 0 -9:15/0 = 0 -10:15/0 = 0 -11:15/0 = 0 -12:15/0 = 0 -13:15/0 = 0 -14:15/0 = 0 -15:15/0 = 0 -16:15/0 = 0 -17:15/0 = 0 -18:15/0 = 0 -19:15/0 = 0 -20:15/0 = 0 -21:15/0 = 0 -22:15/0 = 0 -23:15/0 = 0 -24:15/0 = 0 -25:15/0 = 0 -26:15/0 = 0 -27:15/0 = 0 -28:15/0 = 0 -29:15/0 = 0 -30:15/0 = 0 -31:15/0 = 0 -0:16/0 = 0 -1:16/0 = 0 -2:16/0 = 0 -3:16/0 = 0 -4:16/0 = 0 -5:16/0 = 0 -6:16/0 = 0 -7:16/0 = 0 -8:16/0 = 0 -9:16/0 = 0 -10:16/0 = 0 -11:16/0 = 0 -12:16/0 = 0 -13:16/0 = 0 -14:16/0 = 0 -15:16/0 = 0 -16:16/0 = 0 -17:16/0 = 0 -18:16/0 = 0 -19:16/0 = 0 -20:16/0 = 0 -21:16/0 = 0 -22:16/0 = 0 -23:16/0 = 0 -24:16/0 = 0 -25:16/0 = 0 -26:16/0 = 0 -27:16/0 = 0 -28:16/0 = 0 -29:16/0 = 0 -30:16/0 = 0 -31:16/0 = 0 -0:17/0 = 0 -1:17/0 = 0 -2:17/0 = 0 -3:17/0 = 0 -4:17/0 = 0 -5:17/0 = 0 -6:17/0 = 0 -7:17/0 = 0 -8:17/0 = 0 -9:17/0 = 0 -10:17/0 = 0 -11:17/0 = 0 -12:17/0 = 0 -13:17/0 = 0 -14:17/0 = 0 -15:17/0 = 0 -16:17/0 = 0 -17:17/0 = 0 -18:17/0 = 0 -19:17/0 = 0 -20:17/0 = 0 -21:17/0 = 0 -22:17/0 = 0 -23:17/0 = 0 -24:17/0 = 0 -25:17/0 = 0 -26:17/0 = 0 -27:17/0 = 0 -28:17/0 = 0 -29:17/0 = 0 -30:17/0 = 0 -31:17/0 = 0 -0:18/0 = 0 -1:18/0 = 0 -2:18/0 = 0 -3:18/0 = 0 -4:18/0 = 0 -5:18/0 = 0 -6:18/0 = 0 -7:18/0 = 0 -8:18/0 = 0 -9:18/0 = 0 -10:18/0 = 0 -11:18/0 = 0 -12:18/0 = 0 -13:18/0 = 0 -14:18/0 = 0 -15:18/0 = 0 -16:18/0 = 0 -17:18/0 = 0 -18:18/0 = 0 -19:18/0 = 0 -20:18/0 = 0 -21:18/0 = 0 -22:18/0 = 0 -23:18/0 = 0 -24:18/0 = 0 -25:18/0 = 0 -26:18/0 = 0 -27:18/0 = 0 -28:18/0 = 0 -29:18/0 = 0 -30:18/0 = 0 -31:18/0 = 0 -0:19/0 = 0 -1:19/0 = 0 -2:19/0 = 0 -3:19/0 = 0 -4:19/0 = 0 -5:19/0 = 0 -6:19/0 = 0 -7:19/0 = 0 -8:19/0 = 0 -9:19/0 = 0 -10:19/0 = 0 -11:19/0 = 0 -12:19/0 = 0 -13:19/0 = 0 -14:19/0 = 0 -15:19/0 = 0 -16:19/0 = 0 -17:19/0 = 0 -18:19/0 = 0 -19:19/0 = 0 -20:19/0 = 0 -21:19/0 = 0 -22:19/0 = 0 -23:19/0 = 0 -24:19/0 = 0 -25:19/0 = 0 -26:19/0 = 0 -27:19/0 = 0 -28:19/0 = 0 -29:19/0 = 0 -30:19/0 = 0 -31:19/0 = 0 -0:20/0 = 0 -1:20/0 = 0 -2:20/0 = 0 -3:20/0 = 0 -4:20/0 = 0 -5:20/0 = 0 -6:20/0 = 0 -7:20/0 = 0 -8:20/0 = 0 -9:20/0 = 0 -10:20/0 = 0 -11:20/0 = 0 -12:20/0 = 0 -13:20/0 = 0 -14:20/0 = 0 -15:20/0 = 0 -16:20/0 = 0 -17:20/0 = 0 -18:20/0 = 0 -19:20/0 = 0 -20:20/0 = 0 -21:20/0 = 0 -22:20/0 = 0 -23:20/0 = 0 -24:20/0 = 0 -25:20/0 = 0 -26:20/0 = 0 -27:20/0 = 0 -28:20/0 = 0 -29:20/0 = 0 -30:20/0 = 0 -31:20/0 = 0 -0:21/0 = 0 -1:21/0 = 0 -2:21/0 = 0 -3:21/0 = 0 -4:21/0 = 0 -5:21/0 = 0 -6:21/0 = 0 -7:21/0 = 0 -8:21/0 = 0 -9:21/0 = 0 -10:21/0 = 0 -11:21/0 = 0 -12:21/0 = 0 -13:21/0 = 0 -14:21/0 = 0 -15:21/0 = 0 -16:21/0 = 0 -17:21/0 = 0 -18:21/0 = 0 -19:21/0 = 0 -20:21/0 = 0 -21:21/0 = 0 -22:21/0 = 0 -23:21/0 = 0 -24:21/0 = 0 -25:21/0 = 0 -26:21/0 = 0 -27:21/0 = 0 -28:21/0 = 0 -29:21/0 = 0 -30:21/0 = 0 -31:21/0 = 0 -0:22/0 = 0 -1:22/0 = 0 -2:22/0 = 0 -3:22/0 = 0 -4:22/0 = 0 -5:22/0 = 0 -6:22/0 = 0 -7:22/0 = 0 -8:22/0 = 0 -9:22/0 = 0 -10:22/0 = 0 -11:22/0 = 0 -12:22/0 = 0 -13:22/0 = 0 -14:22/0 = 0 -15:22/0 = 0 -16:22/0 = 0 -17:22/0 = 0 -18:22/0 = 0 -19:22/0 = 0 -20:22/0 = 0 -21:22/0 = 0 -22:22/0 = 0 -23:22/0 = 0 -24:22/0 = 0 -25:22/0 = 0 -26:22/0 = 0 -27:22/0 = 0 -28:22/0 = 0 -29:22/0 = 0 -30:22/0 = 0 -31:22/0 = 0 -0:23/0 = 0 -1:23/0 = 0 -2:23/0 = 0 -3:23/0 = 0 -4:23/0 = 0 -5:23/0 = 0 -6:23/0 = 0 -7:23/0 = 0 -8:23/0 = 0 -9:23/0 = 0 -10:23/0 = 0 -11:23/0 = 0 -12:23/0 = 0 -13:23/0 = 0 -14:23/0 = 0 -15:23/0 = 0 -16:23/0 = 0 -17:23/0 = 0 -18:23/0 = 0 -19:23/0 = 0 -20:23/0 = 0 -21:23/0 = 0 -22:23/0 = 0 -23:23/0 = 0 -24:23/0 = 0 -25:23/0 = 0 -26:23/0 = 0 -27:23/0 = 0 -28:23/0 = 0 -29:23/0 = 0 -30:23/0 = 0 -31:23/0 = 0 -0:24/0 = 0 -1:24/0 = 0 -2:24/0 = 0 -3:24/0 = 0 -4:24/0 = 0 -5:24/0 = 0 -6:24/0 = 0 -7:24/0 = 0 -8:24/0 = 0 -9:24/0 = 0 -10:24/0 = 0 -11:24/0 = 0 -12:24/0 = 0 -13:24/0 = 0 -14:24/0 = 0 -15:24/0 = 0 -16:24/0 = 0 -17:24/0 = 0 -18:24/0 = 0 -19:24/0 = 0 -20:24/0 = 0 -21:24/0 = 0 -22:24/0 = 0 -23:24/0 = 0 -24:24/0 = 0 -25:24/0 = 0 -26:24/0 = 0 -27:24/0 = 0 -28:24/0 = 0 -29:24/0 = 0 -30:24/0 = 0 -31:24/0 = 0 -0:25/0 = 0 -1:25/0 = 0 -2:25/0 = 0 -3:25/0 = 0 -4:25/0 = 0 -5:25/0 = 0 -6:25/0 = 0 -7:25/0 = 0 -8:25/0 = 0 -9:25/0 = 0 -10:25/0 = 0 -11:25/0 = 0 -12:25/0 = 0 -13:25/0 = 0 -14:25/0 = 0 -15:25/0 = 0 -16:25/0 = 0 -17:25/0 = 0 -18:25/0 = 0 -19:25/0 = 0 -20:25/0 = 0 -21:25/0 = 0 -22:25/0 = 0 -23:25/0 = 0 -24:25/0 = 0 -25:25/0 = 0 -26:25/0 = 0 -27:25/0 = 0 -28:25/0 = 0 -29:25/0 = 0 -30:25/0 = 0 -31:25/0 = 0 -0:26/0 = 0 -1:26/0 = 0 -2:26/0 = 0 -3:26/0 = 0 -4:26/0 = 0 -5:26/0 = 0 -6:26/0 = 0 -7:26/0 = 0 -8:26/0 = 0 -9:26/0 = 0 -10:26/0 = 0 -11:26/0 = 0 -12:26/0 = 0 -13:26/0 = 0 -14:26/0 = 0 -15:26/0 = 0 -16:26/0 = 0 -17:26/0 = 0 -18:26/0 = 0 -19:26/0 = 0 -20:26/0 = 0 -21:26/0 = 0 -22:26/0 = 0 -23:26/0 = 0 -24:26/0 = 0 -25:26/0 = 0 -26:26/0 = 0 -27:26/0 = 0 -28:26/0 = 0 -29:26/0 = 0 -30:26/0 = 0 -31:26/0 = 0 -0:27/0 = 0 -1:27/0 = 0 -2:27/0 = 0 -3:27/0 = 0 -4:27/0 = 0 -5:27/0 = 0 -6:27/0 = 0 -7:27/0 = 0 -8:27/0 = 0 -9:27/0 = 0 -10:27/0 = 0 -11:27/0 = 0 -12:27/0 = 0 -13:27/0 = 0 -14:27/0 = 0 -15:27/0 = 0 -16:27/0 = 0 -17:27/0 = 0 -18:27/0 = 0 -19:27/0 = 0 -20:27/0 = 0 -21:27/0 = 0 -22:27/0 = 0 -23:27/0 = 0 -24:27/0 = 0 -25:27/0 = 0 -26:27/0 = 0 -27:27/0 = 0 -28:27/0 = 0 -29:27/0 = 0 -30:27/0 = 0 -31:27/0 = 0 -0:28/0 = 0 -1:28/0 = 0 -2:28/0 = 0 -3:28/0 = 0 -4:28/0 = 0 -5:28/0 = 0 -6:28/0 = 0 -7:28/0 = 0 -8:28/0 = 0 -9:28/0 = 0 -10:28/0 = 0 -11:28/0 = 0 -12:28/0 = 0 -13:28/0 = 0 -14:28/0 = 0 -15:28/0 = 0 -16:28/0 = 0 -17:28/0 = 0 -18:28/0 = 0 -19:28/0 = 0 -20:28/0 = 0 -21:28/0 = 0 -22:28/0 = 0 -23:28/0 = 0 -24:28/0 = 0 -25:28/0 = 0 -26:28/0 = 0 -27:28/0 = 0 -28:28/0 = 0 -29:28/0 = 0 -30:28/0 = 0 -31:28/0 = 0 -0:29/0 = 0 -1:29/0 = 0 -2:29/0 = 0 -3:29/0 = 0 -4:29/0 = 0 -5:29/0 = 0 -6:29/0 = 0 -7:29/0 = 0 -8:29/0 = 0 -9:29/0 = 0 -10:29/0 = 0 -11:29/0 = 0 -12:29/0 = 0 -13:29/0 = 0 -14:29/0 = 0 -15:29/0 = 0 -16:29/0 = 0 -17:29/0 = 0 -18:29/0 = 0 -19:29/0 = 0 -20:29/0 = 0 -21:29/0 = 0 -22:29/0 = 0 -23:29/0 = 0 -24:29/0 = 0 -25:29/0 = 0 -26:29/0 = 0 -27:29/0 = 0 -28:29/0 = 0 -29:29/0 = 0 -30:29/0 = 0 -31:29/0 = 0 - -[sub_resource type="TileSet" id="TileSet_t3bbo"] -terrain_set_0/mode = 0 -sources/1 = SubResource("TileSetAtlasSource_s55i2") -sources/0 = SubResource("TileSetAtlasSource_3q7ue") -sources/2 = SubResource("TileSetAtlasSource_hwjm3") +[ext_resource type="Script" path="res://scripts/EntityPlacer.gd" id="5_8jju5"] [node name="Main" type="Node"] script = ExtResource("1_ysxum") -[node name="World" type="TileMap" parent="."] -tile_set = SubResource("TileSet_t3bbo") -format = 2 -layer_0/name = "Terrain" -layer_1/name = "Buildings" -layer_1/enabled = true -layer_1/modulate = Color(1, 1, 1, 1) -layer_1/y_sort_enabled = false -layer_1/y_sort_origin = 0 -layer_1/z_index = 0 -layer_1/tile_data = PackedInt32Array() -script = ExtResource("3_6q5ju") +[node name="TileMapGenerator" type="CanvasLayer" parent="."] +script = ExtResource("2_cbjcm") -[node name="CameraZoom2D" parent="World" instance=ExtResource("4_rx82t")] +[node name="EntityPlacer" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 +script = ExtResource("5_8jju5") + +[node name="CameraZoom2D" parent="." instance=ExtResource("4_rx82t")] position = Vector2(960, 536) limit_left = -40000 limit_top = -40000 @@ -1535,8 +88,7 @@ offset_right = 936.0 offset_bottom = 256.0 horizontal_alignment = 2 -[connection signal="set_camera_position" from="." to="World/CameraZoom2D" method="_on_set_camera_position"] -[connection signal="button_pressed" from="UILayer/Control" to="World" method="_on_control_button_pressed"] +[connection signal="set_camera_position" from="." to="CameraZoom2D" method="_on_set_camera_position"] [connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_residental" to="UILayer/Control" method="_on_button_residental_pressed"] [connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_commercial" to="UILayer/Control" method="_on_button_commercial_pressed"] [connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_industrial" to="UILayer/Control" method="_on_button_industrial_pressed"] diff --git a/scripts/Control.gd b/scripts/Control.gd index a125fb3..ab6a5db 100644 --- a/scripts/Control.gd +++ b/scripts/Control.gd @@ -22,7 +22,11 @@ func _ready(): # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): - debug_info.set_text(str(get_viewport().get_mouse_position()) +"\n" + "FPS " + str(Engine.get_frames_per_second())) + debug_info.set_text( + str(get_viewport().get_mouse_position()) +"\n" + + "FPS " + str(Engine.get_frames_per_second()) + "\n" + + "Zoom lvl: " + str(Globals.CAMERA_ZOOM_LEVEL) + ) # defines construction toolbar buttons func create_buttons(): diff --git a/scripts/World.gd b/scripts/EntityPlacer.gd similarity index 59% rename from scripts/World.gd rename to scripts/EntityPlacer.gd index cec4a31..d6a1275 100644 --- a/scripts/World.gd +++ b/scripts/EntityPlacer.gd @@ -1,22 +1,11 @@ -class_name World -extends TileMap +class_name EntityPlacer +extends Control var has_placeable_building: bool = false var building var building_type: String var scene -func _init(): - Globals.world_map = self - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(_delta): - pass - func get_building_properties() -> Array: var tileset_id = 0 # default value var tilemap_tile_coords: Vector2i @@ -62,40 +51,40 @@ func _on_control_button_pressed(type): scene = load(Globals.SCENE_PATH + "Building.tscn") building = scene.instantiate() #building.set_cell(0, Vector2i(0,0), building_properties[0], building_properties[1], 0) - add_child(building) + #add_child(building) has_placeable_building = true -func _input(event): - # place the building - if event.is_action_pressed("place_building") and has_placeable_building: - has_placeable_building = false - place_building_to_map() - - # cancel placement - if event.is_action_pressed("cancel"): - if has_placeable_building: - pass +#func _input(event): +# # place the building +# if event.is_action_pressed("place_building") and has_placeable_building: +# has_placeable_building = false +# place_building_to_map() +# +# # cancel placement +# if event.is_action_pressed("cancel"): +# if has_placeable_building: +# pass func calculate_grid_coordinates(map_position: Vector2) -> Vector2: return (map_position).floor() -func place_building_to_map(): - var building_properties = get_building_properties() - var tile_on_mouse = local_to_map(get_global_mouse_position()) - - if !Globals.are_coords_valid( - tile_on_mouse.y, - Vector2i(0, Globals.map_image_size.y), - Globals.ERROR_TILE_Y_COORDS_OUT_OF_BOUNDS - ): - return false - elif !Globals.are_coords_valid( - tile_on_mouse.x, - Vector2i(0, Globals.map_image_size.x), - Globals.ERROR_TILE_X_COORDS_OUT_OF_BOUNDS - ): - return false +#func place_building_to_map(): +# var building_properties = get_building_properties() +# #var tile_on_mouse = local_to_map(get_global_mouse_position()) +# +# if !Globals.are_coords_valid( +# tile_on_mouse.y, +# Vector2i(0, Globals.map_image_size.y), +# Globals.ERROR_TILE_Y_COORDS_OUT_OF_BOUNDS +# ): +# return false +# elif !Globals.are_coords_valid( +# tile_on_mouse.x, +# Vector2i(0, Globals.map_image_size.x), +# Globals.ERROR_TILE_X_COORDS_OUT_OF_BOUNDS +# ): +# return false - set_cell(Globals.LAYER_BUILDINGS, tile_on_mouse, building_properties[0], building_properties[1], 0) +# set_cell(Globals.LAYER_BUILDINGS, tile_on_mouse, building_properties[0], building_properties[1], 0) diff --git a/scripts/Globals.gd b/scripts/Globals.gd index dd5fd1b..78fbb50 100644 --- a/scripts/Globals.gd +++ b/scripts/Globals.gd @@ -20,8 +20,17 @@ func are_coords_valid(value:int, bounds:Vector2i, errmsg:String) -> bool: func choose_randomly(list_of_entries): return list_of_entries[randi() % list_of_entries.size()] -var world_map: TileMap -var map_image_size:Vector2i +# map size is based on input image x*y pixel size +var map_size:Vector2i + +# store terrain type (water, land, forest etc. for every map cell) +var map_terrain_data:Array[Array] = [[]] + +# preprocess and store exact tile for every map cell to speed up setting tiles +var map_tile_data:Array[Array] = [[]] + +# current camera zoom level +var CAMERA_ZOOM_LEVEL: float = 1.0 # FILE PATHS const SCENE_PATH:String = "res://scenes/" @@ -52,8 +61,6 @@ const TYPE_ROADS:String = "roads" const TYPE_DEMOLISH:String = "demolish" # camera movement settings -var CAMERA_ZOOM_LEVEL: float = 1.0 - const CAMERA_MIN_ZOOM_LEVEL: float = 0.1 const CAMERA_MAX_ZOOM_LEVEL: float = 2.0 const CAMERA_ZOOM_FACTOR: float = 0.1 @@ -65,10 +72,10 @@ const GROUND_TILE_COLOR_IN_MAP_FILE: Color = Color(0,0,0,1) const WATER_TILE_COLOR_IN_MAP_FILE: Color = Color(1,1,1,1) # min and max sizes for a map so the map won't be unreasonably small or large -const MAP_MIN_HEIGHT:int = 100 -const MAP_MAX_HEIGHT:int = 1000 -const MAP_MIN_WIDTH:int = 100 -const MAP_MAX_WIDTH:int = 1000 +const MAP_MIN_HEIGHT:int = 128 +const MAP_MAX_HEIGHT:int = 4096 +const MAP_MIN_WIDTH:int = 128 +const MAP_MAX_WIDTH:int = 4096 # tile size const TILE_SIZE_X:int = 16 diff --git a/scripts/Main.gd b/scripts/Main.gd index 13241f7..49b2b3f 100644 --- a/scripts/Main.gd +++ b/scripts/Main.gd @@ -12,10 +12,15 @@ extends Node signal set_camera_position(pos:Vector2) # The idea is for the user to be able to choose the map from GUI later -#var map_filename: String = "res://maps/tampere_10x10km_1000px.png" -var map_filename:String = "res://maps/tampere_200px_crop.png" -var _world := World.new() -var _world_generator := WorldGeneration.new() +var map_filenames:Array = [ + "res://maps/tampere_10x10km_1000px.png", + "res://maps/tampere_10x10km_1024px.png", + "res://maps/varkaus_256x256px_test.png" + ] +var map_filename:String = map_filenames[2] +var _world_generator:WorldGenerator +var _tilemap_generator:TileMapGenerator + func _init(): # DisplayServer.window_set_size( @@ -26,20 +31,27 @@ func _init(): # Called when the node enters the scene tree for the first time. func _ready(): - if !_world: - push_error(Globals.ERROR_MAKING_WORLD_INSTANCE) - quit_game() - + # create a new world and worldgenerator + _world_generator = WorldGenerator.new() + _tilemap_generator = TileMapGenerator.new() + # generate terrain. quit game if generation fails. if !_world_generator.generate_world(map_filename): push_error(Globals.ERROR_WHILE_GENERATING_MAP) - quit_game() + quit_game() + + if !_tilemap_generator: + push_error(Globals.ERROR_MAKING_WORLD_INSTANCE) + quit_game() + + _tilemap_generator.start() + _tilemap_generator.test_func() # center camera to world map emit_signal( "set_camera_position", - Vector2(Globals.map_image_size.x / 2.0 * Globals.TILE_SIZE_X, - Globals.map_image_size.y / 2.0 * Globals.TILE_SIZE_Y) + Vector2(Globals.map_size.x / 2.0 * Globals.TILE_SIZE_X, + Globals.map_size.y / 2.0 * Globals.TILE_SIZE_Y) ) # Called every frame. 'delta' is the elapsed time since the previous frame. diff --git a/scripts/TileMapGenerator.gd b/scripts/TileMapGenerator.gd new file mode 100644 index 0000000..2e3bbbc --- /dev/null +++ b/scripts/TileMapGenerator.gd @@ -0,0 +1,57 @@ +class_name TileMapGenerator +extends CanvasLayer + +# one tilemap is one chunk +# map consists of many chunks +# chunks are loaded to view when needed +# chunks are deleted after they are no longer needed (in view) + +# This is done to speed up game loading and avoiding setting one large tilemap in one go +# which is extremely slow in godot 4.0, 4096x4096 takes minutes to fill with set_cell() commands + +const CHUNK_SIZE = Vector2i(128,128) + +var map_tiles:Array[Array] = [[]] + +func start() -> void: + # Initialize the map tile array with enough chunks to cover the whole map + + var ms:int = Globals.map_size.y/CHUNK_SIZE.y + map_tiles.resize(2) + print("map tiles size y: ", map_tiles.size()) + + for y in ms: + map_tiles[y].resize(2) + print("map tiles size x: ", map_tiles[y].size()) + for x in ms: + map_tiles[y][x] = TileMap.new() + +func test_func(): + self.set_chunk_tiles(Vector2i(1,0)) + #self.map_tiles[0][1].visible() + print(map_tiles[0][1]) + +func clear_chunk_tiles(chunk_pos:Vector2i) -> void: + map_tiles[chunk_pos.y][chunk_pos.x].clear() + +func set_chunk_tiles(chunk_pos:Vector2i) -> void: + # Set an invidiual chunk's tiles based on map terrain data + + # Try to load the world tilemap where we place the tiles + if (map_tiles[chunk_pos.y][chunk_pos.x] == null): + var errmsg = Globals.ERROR_TILEMAP_NODE_MISSING + push_error(errmsg % str(chunk_pos)) + #return false + + for y in CHUNK_SIZE.y: + for x in CHUNK_SIZE.x: + var tile_data: Array = Globals.map_tile_data[chunk_pos.y*CHUNK_SIZE.y][chunk_pos.x*CHUNK_SIZE.x] + + # layer | tile coords at tilemap | tilemap id | coords of the tile at tileset | alternative tile + map_tiles[chunk_pos.y][chunk_pos.x].set_cell( + Globals.LAYER_TERRAIN, + Vector2i(x, y), + 2, + tile_data[0], + tile_data[1] + ) diff --git a/scripts/WorldGeneration.gd b/scripts/WorldGenerator.gd similarity index 62% rename from scripts/WorldGeneration.gd rename to scripts/WorldGenerator.gd index fb27efd..6327970 100644 --- a/scripts/WorldGeneration.gd +++ b/scripts/WorldGenerator.gd @@ -1,8 +1,8 @@ -class_name WorldGeneration +class_name WorldGenerator extends RefCounted var image:Image = Image.new() -var map_tile_data:Array[Array] = [[]] # store map tile info to a 2d array + var directions:Array = [ Vector2i(0,1), # south Vector2i(1,0), # east @@ -10,15 +10,15 @@ var directions:Array = [ Vector2i(-1,0) # west ] -func choose_tile(tile:Vector2i, selected, surrounding) -> void: +func choose_tile(tile:Vector2i, selected, surrounding) -> Array: var surrounding_tiles:Array = [] # determine which directions have land around the tile for dir in directions: # avoid index out of bounds - if (tile.y+dir.y >= Globals.map_image_size.y) or (tile.x+dir.x >= Globals.map_image_size.x): + if (tile.y+dir.y >= Globals.map_size.y) or (tile.x+dir.x >= Globals.map_size.x): surrounding_tiles.append(surrounding) - elif map_tile_data[tile.y+dir.y][tile.x+dir.x] == surrounding: + elif Globals.map_terrain_data[tile.y+dir.y][tile.x+dir.x] == surrounding: surrounding_tiles.append(surrounding) else: surrounding_tiles.append(selected) @@ -33,14 +33,10 @@ func choose_tile(tile:Vector2i, selected, surrounding) -> void: else: tile_coords = selected_tile[0] - # layer | position coords | tilemap id | coords of the tile at tilemap | alternative tile - Globals.world_map.set_cell( - Globals.LAYER_TERRAIN, - Vector2i(tile.x, tile.y), - 2, + return [ tile_coords, 0 if selected_tile else Globals.choose_randomly([0,1,2,3]) - ) + ] # Generates biomes, like forest and bog func generate_biomes() -> void: @@ -56,25 +52,25 @@ func generate_biomes() -> void: var water_next_to_tile:bool = false - for y in map_tile_data.size(): - for x in map_tile_data[y].size(): + for y in Globals.map_terrain_data.size(): + for x in Globals.map_terrain_data[y].size(): # replace non-water with biomes - if map_tile_data[y][x] > 0: + if Globals.map_terrain_data[y][x] > 0: water_next_to_tile = false # don't put forest next to water for dir in directions: - if (y+dir.y >= Globals.map_image_size.y) or (x+dir.x >= Globals.map_image_size.x): + if (y+dir.y >= Globals.map_size.y) or (x+dir.x >= Globals.map_size.x): continue - if map_tile_data[y+dir.y][x+dir.x] == Globals.TILE_WATER: + if Globals.map_terrain_data[y+dir.y][x+dir.x] == Globals.TILE_WATER: water_next_to_tile = true # if there's no water next to a land tile, it can be replaced with forest if !water_next_to_tile: var noise_sample = fnl.get_noise_2d(x,y) if noise_sample < 0.1: - map_tile_data[y][x] = Globals.TILE_FOREST + Globals.map_terrain_data[y][x] = Globals.TILE_FOREST # can add other tresholds here for other biomes func generate_world(filename) -> bool: @@ -86,58 +82,67 @@ func generate_world(filename) -> bool: return false # Check if image is too small or too large - Globals.map_image_size = image.get_size() + Globals.map_size = image.get_size() if !validate_mapgen_params(): return false + var start = Time.get_ticks_usec() read_image_pixel_data() + var end = Time.get_ticks_usec() + print("read image data ", (end-start)/1000.0, "ms") + + start = Time.get_ticks_usec() smooth_land_features(Globals.TILE_WATER) # smooth water + end = Time.get_ticks_usec() + print("smooth water ", (end-start)/1000.0, "ms") + + start = Time.get_ticks_usec() generate_biomes() + end = Time.get_ticks_usec() + print("generate biomes ", (end-start)/1000.0, "ms") + + start = Time.get_ticks_usec() smooth_land_features(Globals.TILE_FOREST) # smooth out forest - set_tilemap_tiles() + end = Time.get_ticks_usec() + print("smooth forest ", (end-start)/1000.0, "ms") + + start = Time.get_ticks_usec() + set_tilemap_tiles() + end = Time.get_ticks_usec() + print("set tiles ", (end-start)/1000.0, "ms") return true func read_image_pixel_data(): # initialize the array to have enough rows - map_tile_data.resize(Globals.map_image_size.y) + Globals.map_terrain_data.resize(Globals.map_size.y) + Globals.map_tile_data.resize(Globals.map_size.y) - for y in Globals.map_image_size.y: + for y in Globals.map_size.y: #initialize the row to have enough columns - map_tile_data[y].resize(Globals.map_image_size.y) + Globals.map_terrain_data[y].resize(Globals.map_size.y) + Globals.map_tile_data[y].resize(Globals.map_size.y) + - for x in Globals.map_image_size.x: + for x in Globals.map_size.x: if image.get_pixel(x, y) == Globals.WATER_TILE_COLOR_IN_MAP_FILE: - map_tile_data[y][x] = Globals.TILE_WATER + Globals.map_terrain_data[y][x] = Globals.TILE_WATER else: - map_tile_data[y][x] = Globals.TILE_TERRAIN + Globals.map_terrain_data[y][x] = Globals.TILE_TERRAIN func set_tilemap_tiles() -> void: - for y in map_tile_data.size(): - for x in map_tile_data[y].size(): + for y in Globals.map_terrain_data.size(): + for x in Globals.map_terrain_data[y].size(): # layer | position coords | tilemap id | coords of the tile at tilemap | alternative tile - match map_tile_data[y][x]: + match Globals.map_terrain_data[y][x]: Globals.TILE_WATER: # water or shoreline - choose_tile(Vector2i(x, y), Globals.TILE_WATER, Globals.TILE_TERRAIN) + Globals.map_tile_data[y][x] = choose_tile(Vector2i(x, y), Globals.TILE_WATER, Globals.TILE_TERRAIN) Globals.TILE_TERRAIN: #terrain or forest edge -# Globals.world_map.set_cell( -# Globals.LAYER_TERRAIN, -# Vector2i(x, y), -# 2, -# Vector2i(0,0), -# Globals.choose_randomly([0,1,2,3]) -# ) - choose_tile(Vector2i(x,y), Globals.TILE_TERRAIN, Globals.TILE_FOREST) + Globals.map_tile_data[y][x] = choose_tile(Vector2i(x,y), Globals.TILE_TERRAIN, Globals.TILE_FOREST) Globals.TILE_FOREST: - Globals.world_map.set_cell( - Globals.LAYER_TERRAIN, - Vector2i(x, y), - 2, - Vector2i(5,1), - Globals.choose_randomly([0,1,2,3]) - ) + Globals.map_tile_data[y][x] = [Vector2i(5,1), Globals.choose_randomly([0,1,2,3])] _: #default pass @@ -147,9 +152,9 @@ func set_tilemap_tiles() -> void: # Do it recursively with limit of n recursions! func smooth_land_features(tile_type:int) -> void: # TODO for testing avoid map borders to make it simpler to implement - for y in range(1, Globals.map_image_size.y-1): - for x in range(1, Globals.map_image_size.x-1): - if map_tile_data[y][x] != tile_type: + for y in range(1, Globals.map_size.y-1): + for x in range(1, Globals.map_size.x-1): + if Globals.map_terrain_data[y][x] != tile_type: continue match tile_type: @@ -173,26 +178,26 @@ func smooth_forest_recursively(pos:Vector2i, selected:int, comp:int) -> void: # determine which directions have land around the tile for dir in directions: - if map_tile_data[pos.y+dir.y][pos.x+dir.x] == comp: + if Globals.map_terrain_data[pos.y+dir.y][pos.x+dir.x] == comp: surrounding_tiles.append(comp) - elif map_tile_data[pos.y+dir.y][pos.x+dir.x] == selected: + elif Globals.map_terrain_data[pos.y+dir.y][pos.x+dir.x] == selected: surrounding_tiles.append(selected) match surrounding_tiles: [1,1,1,2]: #west - map_tile_data[pos.y][pos.x] = comp + Globals.map_terrain_data[pos.y][pos.x] = comp pos.x -= 1 [1,1,2,1]: #north - map_tile_data[pos.y][pos.x] = comp + Globals.map_terrain_data[pos.y][pos.x] = comp pos.y -= 1 [1,2,1,1]: #east - map_tile_data[pos.y][pos.x] = comp + Globals.map_terrain_data[pos.y][pos.x] = comp pos.x += 1 [2,1,1,1]: #south - map_tile_data[pos.y][pos.x] = comp + Globals.map_terrain_data[pos.y][pos.x] = comp pos.y += 1 [1,1,1,1]: # remove solo forests - map_tile_data[pos.y][pos.x] = comp + Globals.map_terrain_data[pos.y][pos.x] = comp return _: return @@ -205,46 +210,40 @@ func smooth_recursively(pos:Vector2i, selected:int, comp:int) -> void: # determine which directions have land around the tile for dir in directions: - if map_tile_data[pos.y+dir.y][pos.x+dir.x] == comp: + if Globals.map_terrain_data[pos.y+dir.y][pos.x+dir.x] == comp: surrounding_tiles.append(comp) - elif map_tile_data[pos.y+dir.y][pos.x+dir.x] == selected: + elif Globals.map_terrain_data[pos.y+dir.y][pos.x+dir.x] == selected: surrounding_tiles.append(selected) match surrounding_tiles: [1,1,1,0]: #west - map_tile_data[pos.y][pos.x] = comp + Globals.map_terrain_data[pos.y][pos.x] = comp pos.x -= 1 [1,1,0,1]: #north - map_tile_data[pos.y][pos.x] = comp + Globals.map_terrain_data[pos.y][pos.x] = comp pos.y -= 1 [1,0,1,1]: #east - map_tile_data[pos.y][pos.x] = comp + Globals.map_terrain_data[pos.y][pos.x] = comp pos.x += 1 [0,1,1,1]: #south - map_tile_data[pos.y][pos.x] = comp + Globals.map_terrain_data[pos.y][pos.x] = comp pos.y += 1 _: return smooth_recursively(pos, selected, comp) - + func validate_mapgen_params() -> bool: if !Globals.are_coords_valid( - Globals.map_image_size.y, + Globals.map_size.y, Vector2i(Globals.MAP_MIN_HEIGHT, Globals.MAP_MAX_HEIGHT), Globals.ERROR_IMAGE_HEIGHT_INCORRECT): return false elif !Globals.are_coords_valid( - Globals.map_image_size.x, + Globals.map_size.x, Vector2i(Globals.MAP_MIN_WIDTH, Globals.MAP_MAX_WIDTH), Globals.ERROR_IMAGE_WIDTH_INCORRECT): return false - # Try to load the world tilemap where we place the tiles - if (Globals.world_map == null): - var errmsg = Globals.ERROR_WORLD_TILEMAP_NODE_MISSING % Globals.WORLD_NODE - push_error(errmsg) - return false - return true