Compare commits

..

7 Commits

Author SHA1 Message Date
gdz
d1357482bd New Standard Map for testing new stuff. 2025-12-13 22:11:42 +01:00
gdz
28466d71c9 Trying out new generation tech for maps... 2025-12-08 21:56:09 +01:00
gdz
a5523f4107 some changes in the TileSet 2025-12-08 21:55:49 +01:00
gdz
f8b4ab793c Full random map generation, and testing of some new generation tech. 2025-12-08 21:55:24 +01:00
gdz
c57076cd52 Map generation fully working 2025-12-07 21:55:28 +01:00
gdz
dd50a00cfa Set up SmartCamera2D 2025-12-07 21:32:45 +01:00
gdz
9429d48e32 Installed SmartCamera2D plugin. 2025-12-07 21:32:24 +01:00
22 changed files with 792 additions and 179 deletions

1
README.md Normal file
View File

@@ -0,0 +1 @@
# SmartCamera2D for Godot 4.x

View File

@@ -1,7 +1,16 @@
[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://duodt2t14xjc8"]
[gd_resource type="TileSet" load_steps=6 format=3 uid="uid://duodt2t14xjc8"]
[ext_resource type="Texture2D" uid="uid://cgvyfsuri6vmx" path="res://Graphics/TileMaps/kenney_rpgUrbanKit/Tilemap/tilemap.png" id="1_q1pea"]
[sub_resource type="TileMapPattern" id="TileMapPattern_vrbvq"]
tile_data = PackedInt32Array(0, 131073, 16, 1, 196609, 16, 2, 262145, 16)
[sub_resource type="TileMapPattern" id="TileMapPattern_07llt"]
tile_data = PackedInt32Array(0, 1, 15, 65536, 1, 16, 131072, 1, 17)
[sub_resource type="TileMapPattern" id="TileMapPattern_cfbhl"]
tile_data = PackedInt32Array(0, 655361, 16, 65536, 655361, 16, 131072, 655361, 16, 196608, 655361, 16, 262144, 655361, 16, 327680, 655361, 16, 393216, 655361, 16, 458752, 655361, 16, 1, 65537, 17, 65537, 65537, 17, 131073, 65537, 17, 196609, 65537, 17, 262145, 65537, 17, 327681, 65537, 17, 393217, 65537, 17, 458753, 65537, 17, 2, 131073, 17, 65538, 131073, 17, 131074, 131073, 17, 196610, 131073, 17, 262146, 131073, 17, 327682, 131073, 17, 393218, 131073, 17, 458754, 131073, 17, 3, 196609, 17, 65539, 196609, 17, 131075, 196609, 17, 196611, 196609, 17, 262147, 196609, 17, 327683, 196609, 17, 393219, 196609, 17, 458755, 196609, 17, 4, 262145, 17, 65540, 262145, 17, 131076, 262145, 17, 196612, 262145, 17, 262148, 262145, 17, 327684, 262145, 17, 393220, 262145, 17, 458756, 262145, 17, 5, 65537, 17, 65541, 65537, 17, 131077, 65537, 17, 196613, 65537, 17, 262149, 65537, 17, 327685, 65537, 17, 393221, 65537, 17, 458757, 65537, 17, 6, 655361, 16, 65542, 655361, 16, 131078, 655361, 16, 196614, 655361, 16, 262150, 655361, 16, 327686, 655361, 16, 393222, 655361, 16, 458758, 655361, 16)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_vqaso"]
resource_name = "UrbanKit"
texture = ExtResource("1_q1pea")
@@ -29,6 +38,7 @@ separation = Vector2i(1, 1)
3:0/0 = 0
3:0/0/terrain_set = 0
3:0/0/terrain = 0
3:0/0/terrains_peering_bit/right_side = 0
3:0/0/terrains_peering_bit/bottom_side = 0
4:0/0 = 0
4:0/0/terrain_set = 0
@@ -40,33 +50,51 @@ separation = Vector2i(1, 1)
5:0/0/terrain = 0
5:0/0/terrains_peering_bit/right_side = 0
5:0/0/terrains_peering_bit/bottom_side = 0
5:0/0/terrains_peering_bit/bottom_left_corner = 0
5:0/0/terrains_peering_bit/left_side = 0
5:0/0/terrains_peering_bit/top_left_corner = 0
5:0/0/terrains_peering_bit/top_side = 0
5:0/0/terrains_peering_bit/top_right_corner = 0
6:0/0 = 0
6:0/0/terrain_set = 0
6:0/0/terrain = 0
6:0/0/terrains_peering_bit/right_side = 0
6:0/0/terrains_peering_bit/bottom_right_corner = 0
6:0/0/terrains_peering_bit/bottom_side = 0
6:0/0/terrains_peering_bit/left_side = 0
6:0/0/terrains_peering_bit/top_left_corner = 0
6:0/0/terrains_peering_bit/top_side = 0
6:0/0/terrains_peering_bit/top_right_corner = 0
7:0/0 = 0
7:0/0/terrain_set = 0
7:0/0/terrain = 0
7:0/0/terrains_peering_bit/bottom_side = 0
8:0/0 = 0
8:0/0/terrain_set = 0
8:0/0/terrain = 3
8:0/0/terrains_peering_bit/right_side = 3
8:0/0/terrains_peering_bit/bottom_side = 3
9:0/0 = 0
9:0/0/terrain_set = 0
9:0/0/terrain = 3
9:0/0/terrains_peering_bit/right_side = 3
9:0/0/terrains_peering_bit/bottom_side = 3
9:0/0/terrains_peering_bit/left_side = 3
10:0/0 = 0
10:0/0/terrain_set = 0
10:0/0/terrain = 3
10:0/0/terrains_peering_bit/bottom_side = 3
10:0/0/terrains_peering_bit/left_side = 3
11:0/0 = 0
11:0/0/terrain_set = 0
11:0/0/terrains_peering_bit/right_side = 3
11:0/0/terrains_peering_bit/bottom_side = 3
12:0/0 = 0
12:0/0/terrain_set = 0
12:0/0/terrains_peering_bit/bottom_side = 3
12:0/0/terrains_peering_bit/left_side = 3
13:0/0 = 0
13:0/0/terrain_set = 0
13:0/0/terrains_peering_bit/right_side = 3
13:0/0/terrains_peering_bit/bottom_side = 3
14:0/0 = 0
14:0/0/terrain_set = 0
14:0/0/terrains_peering_bit/bottom_side = 3
14:0/0/terrains_peering_bit/left_side = 3
15:0/0 = 0
15:0/0/terrain_set = 0
15:0/0/terrain = 3
15:0/0/terrains_peering_bit/bottom_side = 3
16:0/0 = 0
17:0/0 = 0
18:0/0 = 0
@@ -119,35 +147,57 @@ separation = Vector2i(1, 1)
5:1/0/terrain_set = 0
5:1/0/terrain = 0
5:1/0/terrains_peering_bit/right_side = 0
5:1/0/terrains_peering_bit/bottom_right_corner = 0
5:1/0/terrains_peering_bit/bottom_side = 0
5:1/0/terrains_peering_bit/bottom_left_corner = 0
5:1/0/terrains_peering_bit/left_side = 0
5:1/0/terrains_peering_bit/top_left_corner = 0
5:1/0/terrains_peering_bit/top_side = 0
6:1/0 = 0
6:1/0/terrain_set = 0
6:1/0/terrain = 0
6:1/0/terrains_peering_bit/right_side = 0
6:1/0/terrains_peering_bit/bottom_right_corner = 0
6:1/0/terrains_peering_bit/bottom_side = 0
6:1/0/terrains_peering_bit/bottom_left_corner = 0
6:1/0/terrains_peering_bit/left_side = 0
6:1/0/terrains_peering_bit/top_side = 0
6:1/0/terrains_peering_bit/top_right_corner = 0
7:1/0 = 0
7:1/0/terrain_set = 0
7:1/0/terrain = 0
7:1/0/terrains_peering_bit/bottom_side = 0
7:1/0/terrains_peering_bit/top_side = 0
8:1/0 = 0
8:1/0/terrain_set = 0
8:1/0/terrain = 3
8:1/0/terrains_peering_bit/right_side = 3
8:1/0/terrains_peering_bit/bottom_side = 3
8:1/0/terrains_peering_bit/top_side = 3
9:1/0 = 0
9:1/0/terrain_set = 0
9:1/0/terrain = 3
9:1/0/terrains_peering_bit/right_side = 3
9:1/0/terrains_peering_bit/bottom_side = 3
9:1/0/terrains_peering_bit/left_side = 3
9:1/0/terrains_peering_bit/top_side = 3
10:1/0 = 0
10:1/0/terrain_set = 0
10:1/0/terrain = 3
10:1/0/terrains_peering_bit/bottom_side = 3
10:1/0/terrains_peering_bit/left_side = 3
10:1/0/terrains_peering_bit/top_side = 3
11:1/0 = 0
11:1/0/terrain_set = 0
11:1/0/terrains_peering_bit/right_side = 3
11:1/0/terrains_peering_bit/top_side = 3
12:1/0 = 0
12:1/0/terrain_set = 0
12:1/0/terrains_peering_bit/left_side = 3
12:1/0/terrains_peering_bit/top_side = 3
13:1/0 = 0
13:1/0/terrain_set = 0
13:1/0/terrains_peering_bit/right_side = 3
13:1/0/terrains_peering_bit/top_side = 3
14:1/0 = 0
14:1/0/terrain_set = 0
14:1/0/terrains_peering_bit/left_side = 3
14:1/0/terrains_peering_bit/top_side = 3
15:1/0 = 0
15:1/0/terrain_set = 0
15:1/0/terrain = 3
15:1/0/terrains_peering_bit/bottom_side = 3
15:1/0/terrains_peering_bit/top_side = 3
16:1/0 = 0
17:1/0 = 0
18:1/0 = 0
@@ -200,13 +250,42 @@ separation = Vector2i(1, 1)
7:2/0/terrain = 0
7:2/0/terrains_peering_bit/top_side = 0
8:2/0 = 0
8:2/0/terrain_set = 0
8:2/0/terrain = 3
8:2/0/terrains_peering_bit/right_side = 3
8:2/0/terrains_peering_bit/top_side = 3
9:2/0 = 0
9:2/0/terrain_set = 0
9:2/0/terrain = 3
9:2/0/terrains_peering_bit/right_side = 3
9:2/0/terrains_peering_bit/left_side = 3
9:2/0/terrains_peering_bit/top_side = 3
10:2/0 = 0
10:2/0/terrain_set = 0
10:2/0/terrain = 3
10:2/0/terrains_peering_bit/left_side = 3
10:2/0/terrains_peering_bit/top_side = 3
11:2/0 = 0
11:2/0/terrain_set = 0
11:2/0/terrain = 3
11:2/0/terrains_peering_bit/right_side = 3
12:2/0 = 0
12:2/0/terrain_set = 0
12:2/0/terrain = 3
12:2/0/terrains_peering_bit/right_side = 3
12:2/0/terrains_peering_bit/left_side = 3
12:2/0/terrains_peering_bit/top_side = 3
13:2/0 = 0
13:2/0/terrain_set = 0
13:2/0/terrain = 3
13:2/0/terrains_peering_bit/left_side = 3
14:2/0 = 0
14:2/0/terrain_set = 0
14:2/0/terrain = 3
15:2/0 = 0
15:2/0/terrain_set = 0
15:2/0/terrain = 3
15:2/0/terrains_peering_bit/top_side = 3
16:2/0 = 0
17:2/0 = 0
18:2/0 = 0
@@ -219,21 +298,56 @@ separation = Vector2i(1, 1)
25:2/0 = 0
26:2/0 = 0
0:3/0 = 0
0:3/0/terrain_set = 0
0:3/0/terrains_peering_bit/right_side = 4
0:3/0/terrains_peering_bit/bottom_side = 4
1:3/0 = 0
1:3/0/terrain_set = 0
1:3/0/terrain = 4
1:3/0/terrains_peering_bit/right_side = 4
1:3/0/terrains_peering_bit/bottom_side = 4
1:3/0/terrains_peering_bit/left_side = 4
2:3/0 = 0
2:3/0/terrain_set = 0
2:3/0/terrain = 4
2:3/0/terrains_peering_bit/bottom_side = 4
2:3/0/terrains_peering_bit/left_side = 4
3:3/0 = 0
3:3/0/terrain_set = 0
3:3/0/terrains_peering_bit/right_side = 4
3:3/0/terrains_peering_bit/bottom_side = 4
4:3/0 = 0
4:3/0/terrain_set = 0
4:3/0/terrains_peering_bit/bottom_side = 4
4:3/0/terrains_peering_bit/left_side = 4
5:3/0 = 0
5:3/0/terrain_set = 0
5:3/0/terrains_peering_bit/right_side = 4
5:3/0/terrains_peering_bit/bottom_side = 4
6:3/0 = 0
6:3/0/terrain_set = 0
6:3/0/terrains_peering_bit/bottom_side = 4
6:3/0/terrains_peering_bit/left_side = 4
7:3/0 = 0
7:3/0/terrain_set = 0
7:3/0/terrain = 4
7:3/0/terrains_peering_bit/bottom_side = 4
8:3/0 = 0
8:3/0/terrain_set = 0
9:3/0 = 0
9:3/0/terrain_set = 0
10:3/0 = 0
10:3/0/terrain_set = 0
11:3/0 = 0
11:3/0/terrain_set = 0
12:3/0 = 0
12:3/0/terrain_set = 0
13:3/0 = 0
13:3/0/terrain_set = 0
14:3/0 = 0
14:3/0/terrain_set = 0
15:3/0 = 0
15:3/0/terrain_set = 0
16:3/0 = 0
17:3/0 = 0
18:3/0 = 0
@@ -246,21 +360,61 @@ separation = Vector2i(1, 1)
25:3/0 = 0
26:3/0 = 0
0:4/0 = 0
0:4/0/terrain_set = 0
0:4/0/terrain = 4
0:4/0/terrains_peering_bit/right_side = 4
0:4/0/terrains_peering_bit/bottom_side = 4
0:4/0/terrains_peering_bit/top_side = 4
1:4/0 = 0
1:4/0/terrain_set = 0
1:4/0/terrain = 4
1:4/0/terrains_peering_bit/right_side = 4
1:4/0/terrains_peering_bit/bottom_side = 4
1:4/0/terrains_peering_bit/left_side = 4
1:4/0/terrains_peering_bit/top_side = 4
2:4/0 = 0
2:4/0/terrain_set = 0
2:4/0/terrain = 4
2:4/0/terrains_peering_bit/bottom_side = 4
2:4/0/terrains_peering_bit/left_side = 4
2:4/0/terrains_peering_bit/top_side = 4
3:4/0 = 0
3:4/0/terrain_set = 0
3:4/0/terrains_peering_bit/right_side = 4
3:4/0/terrains_peering_bit/top_side = 4
4:4/0 = 0
4:4/0/terrain_set = 0
4:4/0/terrains_peering_bit/left_side = 4
4:4/0/terrains_peering_bit/top_side = 4
5:4/0 = 0
5:4/0/terrain_set = 0
5:4/0/terrains_peering_bit/right_side = 4
5:4/0/terrains_peering_bit/top_side = 4
6:4/0 = 0
6:4/0/terrain_set = 0
6:4/0/terrains_peering_bit/left_side = 4
6:4/0/terrains_peering_bit/top_side = 4
7:4/0 = 0
7:4/0/terrain_set = 0
7:4/0/terrain = 4
7:4/0/terrains_peering_bit/bottom_side = 4
7:4/0/terrains_peering_bit/top_side = 4
8:4/0 = 0
8:4/0/terrain_set = 0
9:4/0 = 0
9:4/0/terrain_set = 0
10:4/0 = 0
10:4/0/terrain_set = 0
11:4/0 = 0
11:4/0/terrain_set = 0
12:4/0 = 0
12:4/0/terrain_set = 0
13:4/0 = 0
13:4/0/terrain_set = 0
14:4/0 = 0
14:4/0/terrain_set = 0
15:4/0 = 0
15:4/0/terrain_set = 0
16:4/0 = 0
17:4/0 = 0
18:4/0 = 0
@@ -273,22 +427,59 @@ separation = Vector2i(1, 1)
25:4/0 = 0
26:4/0 = 0
0:5/0 = 0
0:5/0/terrain_set = 0
0:5/0/terrain = 4
0:5/0/terrains_peering_bit/right_side = 4
0:5/0/terrains_peering_bit/top_side = 4
1:5/0 = 0
1:5/0/terrain_set = 0
1:5/0/terrain = 4
1:5/0/terrains_peering_bit/right_side = 4
1:5/0/terrains_peering_bit/left_side = 4
1:5/0/terrains_peering_bit/top_side = 4
2:5/0 = 0
2:5/0/terrain_set = 0
2:5/0/terrain = 4
2:5/0/terrains_peering_bit/left_side = 4
2:5/0/terrains_peering_bit/top_side = 4
3:5/0 = 0
3:5/0/terrain_set = 0
3:5/0/terrain = 4
3:5/0/terrains_peering_bit/right_side = 4
4:5/0 = 0
4:5/0/terrain_set = 0
4:5/0/terrain = 4
4:5/0/terrains_peering_bit/right_side = 4
4:5/0/terrains_peering_bit/left_side = 4
5:5/0 = 0
5:5/0/terrain_set = 0
5:5/0/terrain = 4
5:5/0/terrains_peering_bit/left_side = 4
6:5/0 = 0
6:5/0/terrain_set = 0
6:5/0/terrain = 4
7:5/0 = 0
7:5/0/terrain_set = 0
7:5/0/terrain = 4
7:5/0/terrains_peering_bit/top_side = 4
8:5/0 = 0
8:5/0/terrain_set = 0
9:5/0 = 0
9:5/0/terrain_set = 0
10:5/0 = 0
10:5/0/terrain_set = 0
11:5/0 = 0
11:5/0/terrain_set = 0
12:5/0 = 0
12:5/0/terrain_set = 0
13:5/0 = 0
13:5/0/terrain_set = 0
14:5/0 = 0
14:5/0/terrain_set = 0
15:5/0 = 0
15:5/0/terrain_set = 0
16:5/0 = 0
16:5/0/terrain_set = 0
17:5/0 = 0
18:5/0 = 0
19:5/0 = 0
@@ -308,13 +499,42 @@ separation = Vector2i(1, 1)
6:6/0 = 0
7:6/0 = 0
8:6/0 = 0
8:6/0/terrain_set = 0
8:6/0/terrain = 2
8:6/0/terrains_peering_bit/right_side = 2
8:6/0/terrains_peering_bit/bottom_side = 2
9:6/0 = 0
9:6/0/terrain_set = 0
9:6/0/terrain = 2
9:6/0/terrains_peering_bit/right_side = 2
9:6/0/terrains_peering_bit/bottom_side = 2
9:6/0/terrains_peering_bit/left_side = 2
9:6/0/terrains_peering_bit/top_side = 2
10:6/0 = 0
10:6/0/terrain_set = 0
10:6/0/terrain = 2
10:6/0/terrains_peering_bit/bottom_side = 2
10:6/0/terrains_peering_bit/left_side = 2
11:6/0 = 0
11:6/0/terrain_set = 0
11:6/0/terrains_peering_bit/right_side = 2
11:6/0/terrains_peering_bit/bottom_side = 2
12:6/0 = 0
12:6/0/terrain_set = 0
12:6/0/terrains_peering_bit/bottom_side = 2
12:6/0/terrains_peering_bit/left_side = 2
13:6/0 = 0
13:6/0/terrain_set = 0
13:6/0/terrains_peering_bit/right_side = 2
13:6/0/terrains_peering_bit/bottom_side = 2
14:6/0 = 0
14:6/0/terrain_set = 0
14:6/0/terrains_peering_bit/bottom_side = 2
14:6/0/terrains_peering_bit/left_side = 2
15:6/0 = 0
15:6/0/terrain_set = 0
15:6/0/terrain = 2
15:6/0/terrains_peering_bit/bottom_side = 2
16:6/0 = 0
17:6/0 = 0
18:6/0 = 0
@@ -335,13 +555,45 @@ separation = Vector2i(1, 1)
6:7/0 = 0
7:7/0 = 0
8:7/0 = 0
8:7/0/terrain_set = 0
8:7/0/terrain = 2
8:7/0/terrains_peering_bit/right_side = 2
8:7/0/terrains_peering_bit/bottom_side = 2
8:7/0/terrains_peering_bit/top_side = 2
9:7/0 = 0
9:7/0/terrain_set = 0
9:7/0/terrain = 2
9:7/0/terrains_peering_bit/right_side = 2
9:7/0/terrains_peering_bit/bottom_side = 2
9:7/0/terrains_peering_bit/left_side = 2
9:7/0/terrains_peering_bit/top_side = 2
10:7/0 = 0
10:7/0/terrain_set = 0
10:7/0/terrain = 2
10:7/0/terrains_peering_bit/bottom_side = 2
10:7/0/terrains_peering_bit/left_side = 2
10:7/0/terrains_peering_bit/top_side = 2
11:7/0 = 0
11:7/0/terrain_set = 0
11:7/0/terrains_peering_bit/right_side = 2
11:7/0/terrains_peering_bit/top_side = 2
12:7/0 = 0
12:7/0/terrain_set = 0
12:7/0/terrains_peering_bit/left_side = 2
12:7/0/terrains_peering_bit/top_side = 2
13:7/0 = 0
13:7/0/terrain_set = 0
13:7/0/terrains_peering_bit/right_side = 2
13:7/0/terrains_peering_bit/top_side = 2
14:7/0 = 0
14:7/0/terrain_set = 0
14:7/0/terrains_peering_bit/left_side = 2
14:7/0/terrains_peering_bit/top_side = 2
15:7/0 = 0
15:7/0/terrain_set = 0
15:7/0/terrain = 2
15:7/0/terrains_peering_bit/bottom_side = 2
15:7/0/terrains_peering_bit/top_side = 2
16:7/0 = 0
17:7/0 = 0
18:7/0 = 0
@@ -362,13 +614,41 @@ separation = Vector2i(1, 1)
6:8/0 = 0
7:8/0 = 0
8:8/0 = 0
8:8/0/terrain_set = 0
8:8/0/terrain = 2
8:8/0/terrains_peering_bit/right_side = 2
8:8/0/terrains_peering_bit/top_side = 2
9:8/0 = 0
9:8/0/terrain_set = 0
9:8/0/terrain = 2
9:8/0/terrains_peering_bit/right_side = 2
9:8/0/terrains_peering_bit/left_side = 2
9:8/0/terrains_peering_bit/top_side = 2
10:8/0 = 0
10:8/0/terrain_set = 0
10:8/0/terrain = 2
10:8/0/terrains_peering_bit/left_side = 2
10:8/0/terrains_peering_bit/top_side = 2
11:8/0 = 0
11:8/0/terrain_set = 0
11:8/0/terrain = 2
11:8/0/terrains_peering_bit/right_side = 2
12:8/0 = 0
12:8/0/terrain_set = 0
12:8/0/terrain = 2
12:8/0/terrains_peering_bit/right_side = 2
12:8/0/terrains_peering_bit/left_side = 2
13:8/0 = 0
13:8/0/terrain_set = 0
13:8/0/terrain = 2
13:8/0/terrains_peering_bit/left_side = 2
14:8/0 = 0
14:8/0/terrain_set = 0
14:8/0/terrain = 2
15:8/0 = 0
15:8/0/terrain_set = 0
15:8/0/terrain = 2
15:8/0/terrains_peering_bit/top_side = 2
16:8/0 = 0
17:8/0 = 0
18:8/0 = 0
@@ -543,23 +823,15 @@ separation = Vector2i(1, 1)
25:14/0 = 0
26:14/0 = 0
0:15/0 = 0
0:15/0/terrain_set = 0
0:15/0/terrain = 1
0:15/0/z_index = 1
1:15/0 = 0
1:15/0/z_index = 1
1:15/0/terrain_set = 0
1:15/0/terrain = 1
1:15/0/terrains_peering_bit/right_side = 1
1:15/0/terrains_peering_bit/bottom_right_corner = 1
1:15/0/terrains_peering_bit/bottom_side = 1
1:15/0/terrains_peering_bit/bottom_left_corner = 1
1:15/0/terrains_peering_bit/left_side = 1
2:15/0 = 0
2:15/0/terrain_set = 0
2:15/0/terrains_peering_bit/right_side = 1
2:15/0/terrains_peering_bit/bottom_right_corner = 1
2:15/0/terrains_peering_bit/bottom_left_corner = 1
2:15/0/terrains_peering_bit/top_left_corner = 1
2:15/0/terrains_peering_bit/top_right_corner = 1
2:15/0/z_index = 1
3:15/0 = 0
4:15/0 = 0
5:15/0 = 0
@@ -585,70 +857,33 @@ separation = Vector2i(1, 1)
25:15/0 = 0
26:15/0 = 0
0:16/0 = 0
0:16/0/terrain_set = 0
0:16/0/terrain = 1
0:16/0/z_index = 1
1:16/0 = 0
1:16/0/z_index = 1
1:16/0/y_sort_origin = 1
1:16/0/terrain_set = 0
1:16/0/terrains_peering_bit/bottom_right_corner = 1
1:16/0/terrains_peering_bit/right_side = 1
1:16/0/terrains_peering_bit/bottom_side = 1
1:16/0/terrains_peering_bit/bottom_left_corner = 1
1:16/0/terrains_peering_bit/top_left_corner = 1
1:16/0/terrains_peering_bit/left_side = 1
1:16/0/terrains_peering_bit/top_side = 1
1:16/0/terrains_peering_bit/top_right_corner = 1
2:16/0 = 0
2:16/0/terrain_set = 0
2:16/0/terrain = 1
2:16/0/z_index = 1
3:16/0 = 0
3:16/0/terrain_set = 0
3:16/0/terrain = 1
3:16/0/z_index = 1
4:16/0 = 0
4:16/0/terrain_set = 0
4:16/0/terrain = 1
4:16/0/z_index = 1
5:16/0 = 0
5:16/0/terrain_set = 0
5:16/0/terrain = 1
5:16/0/terrains_peering_bit/right_side = 1
5:16/0/terrains_peering_bit/bottom_right_corner = 1
5:16/0/terrains_peering_bit/bottom_side = 1
5:16/0/z_index = 1
6:16/0 = 0
6:16/0/terrain_set = 0
6:16/0/terrain = 1
6:16/0/terrains_peering_bit/bottom_side = 1
6:16/0/terrains_peering_bit/bottom_left_corner = 1
6:16/0/terrains_peering_bit/left_side = 1
6:16/0/z_index = 1
7:16/0 = 0
7:16/0/terrain_set = 0
7:16/0/terrain = 1
7:16/0/terrains_peering_bit/right_side = 1
7:16/0/terrains_peering_bit/bottom_side = 1
7:16/0/terrains_peering_bit/bottom_left_corner = 1
7:16/0/terrains_peering_bit/left_side = 1
7:16/0/terrains_peering_bit/top_left_corner = 1
7:16/0/terrains_peering_bit/top_side = 1
7:16/0/terrains_peering_bit/top_right_corner = 1
7:16/0/z_index = 1
8:16/0 = 0
8:16/0/terrain_set = 0
8:16/0/terrain = 1
8:16/0/terrains_peering_bit/right_side = 1
8:16/0/terrains_peering_bit/bottom_right_corner = 1
8:16/0/terrains_peering_bit/bottom_side = 1
8:16/0/terrains_peering_bit/left_side = 1
8:16/0/terrains_peering_bit/top_left_corner = 1
8:16/0/terrains_peering_bit/top_side = 1
8:16/0/terrains_peering_bit/top_right_corner = 1
8:16/0/z_index = 1
9:16/0 = 0
9:16/0/terrain_set = 0
9:16/0/terrain = 1
9:16/0/terrains_peering_bit/right_side = 1
9:16/0/terrains_peering_bit/bottom_right_corner = 1
9:16/0/terrains_peering_bit/bottom_side = 1
9:16/0/terrains_peering_bit/bottom_left_corner = 1
9:16/0/terrains_peering_bit/left_side = 1
9:16/0/terrains_peering_bit/top_left_corner = 1
9:16/0/terrains_peering_bit/top_side = 1
9:16/0/terrains_peering_bit/top_right_corner = 1
9:16/0/z_index = 1
10:16/0 = 0
10:16/0/terrain_set = 0
10:16/0/z_index = 1
11:16/0 = 0
12:16/0 = 0
13:16/0 = 0
@@ -666,85 +901,44 @@ separation = Vector2i(1, 1)
25:16/0 = 0
26:16/0 = 0
0:17/0 = 0
0:17/0/terrain_set = 0
0:17/0/terrain = 1
0:17/0/z_index = 1
1:17/0 = 0
1:17/0/z_index = 1
1:17/0/terrain_set = 0
1:17/0/terrain = 1
1:17/0/terrains_peering_bit/right_side = 1
1:17/0/terrains_peering_bit/left_side = 1
1:17/0/terrains_peering_bit/top_left_corner = 1
1:17/0/terrains_peering_bit/top_side = 1
1:17/0/terrains_peering_bit/top_right_corner = 1
2:17/0 = 0
2:17/0/z_index = 1
2:17/0/terrain_set = 0
2:17/0/terrain = 1
2:17/0/terrains_peering_bit/right_side = 1
2:17/0/terrains_peering_bit/bottom_right_corner = 1
2:17/0/terrains_peering_bit/bottom_side = 1
2:17/0/terrains_peering_bit/top_side = 1
2:17/0/terrains_peering_bit/top_right_corner = 1
3:17/0 = 0
3:17/0/z_index = 1
3:17/0/terrain_set = 0
3:17/0/terrains_peering_bit/right_side = 1
3:17/0/terrains_peering_bit/bottom_right_corner = 1
3:17/0/terrains_peering_bit/bottom_left_corner = 1
3:17/0/terrains_peering_bit/bottom_side = 1
3:17/0/terrains_peering_bit/left_side = 1
3:17/0/terrains_peering_bit/top_left_corner = 1
3:17/0/terrains_peering_bit/top_right_corner = 1
3:17/0/terrains_peering_bit/top_side = 1
4:17/0 = 0
4:17/0/z_index = 1
4:17/0/terrain_set = 0
4:17/0/terrain = 1
4:17/0/terrains_peering_bit/bottom_side = 1
4:17/0/terrains_peering_bit/bottom_left_corner = 1
4:17/0/terrains_peering_bit/left_side = 1
4:17/0/terrains_peering_bit/top_left_corner = 1
4:17/0/terrains_peering_bit/top_side = 1
5:17/0 = 0
5:17/0/terrain_set = 0
5:17/0/terrain = 1
5:17/0/terrains_peering_bit/right_side = 1
5:17/0/terrains_peering_bit/top_side = 1
5:17/0/terrains_peering_bit/top_right_corner = 1
5:17/0/z_index = 1
6:17/0 = 0
6:17/0/terrain_set = 0
6:17/0/terrain = 1
6:17/0/terrains_peering_bit/left_side = 1
6:17/0/terrains_peering_bit/top_left_corner = 1
6:17/0/terrains_peering_bit/top_side = 1
6:17/0/z_index = 1
7:17/0 = 0
7:17/0/terrain_set = 0
7:17/0/terrain = 1
7:17/0/terrains_peering_bit/right_side = 1
7:17/0/terrains_peering_bit/bottom_right_corner = 1
7:17/0/terrains_peering_bit/bottom_side = 1
7:17/0/terrains_peering_bit/bottom_left_corner = 1
7:17/0/terrains_peering_bit/left_side = 1
7:17/0/terrains_peering_bit/top_left_corner = 1
7:17/0/terrains_peering_bit/top_side = 1
7:17/0/z_index = 1
8:17/0 = 0
8:17/0/terrain_set = 0
8:17/0/terrain = 1
8:17/0/terrains_peering_bit/right_side = 1
8:17/0/terrains_peering_bit/bottom_right_corner = 1
8:17/0/terrains_peering_bit/bottom_side = 1
8:17/0/terrains_peering_bit/bottom_left_corner = 1
8:17/0/terrains_peering_bit/left_side = 1
8:17/0/terrains_peering_bit/top_side = 1
8:17/0/terrains_peering_bit/top_right_corner = 1
8:17/0/z_index = 1
9:17/0 = 0
9:17/0/terrain_set = 0
9:17/0/terrain = 1
9:17/0/terrains_peering_bit/right_side = 1
9:17/0/terrains_peering_bit/bottom_right_corner = 1
9:17/0/terrains_peering_bit/bottom_side = 1
9:17/0/terrains_peering_bit/bottom_left_corner = 1
9:17/0/terrains_peering_bit/left_side = 1
9:17/0/terrains_peering_bit/top_left_corner = 1
9:17/0/terrains_peering_bit/top_side = 1
9:17/0/terrains_peering_bit/top_right_corner = 1
9:17/0/z_index = 1
10:17/0 = 0
10:17/0/terrain_set = 0
10:17/0/z_index = 1
11:17/0 = 0
12:17/0 = 0
13:17/0 = 0
@@ -768,4 +962,13 @@ terrain_set_0/terrain_0/name = "Gras"
terrain_set_0/terrain_0/color = Color(0.545098, 0.658824, 0.635294, 1)
terrain_set_0/terrain_1/name = "Asphalt"
terrain_set_0/terrain_1/color = Color(0.678431, 0.690196, 0.733333, 1)
terrain_set_0/terrain_2/name = "Water"
terrain_set_0/terrain_2/color = Color(0.67451, 0.858824, 0.921569, 1)
terrain_set_0/terrain_3/name = "Pavement"
terrain_set_0/terrain_3/color = Color(0.835294, 0.831373, 0.870588, 1)
terrain_set_0/terrain_4/name = "Roof_1"
terrain_set_0/terrain_4/color = Color(0.886275, 0.870588, 0.811765, 1)
sources/1 = SubResource("TileSetAtlasSource_vqaso")
pattern_0 = SubResource("TileMapPattern_vrbvq")
pattern_1 = SubResource("TileMapPattern_07llt")
pattern_2 = SubResource("TileMapPattern_cfbhl")

View File

@@ -0,0 +1,17 @@
extends Node2D
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if Input.is_action_pressed("MoveUp"):
global_position += Vector2.UP * 2
if Input.is_action_pressed("MoveDown"):
global_position += Vector2.DOWN * 2
if Input.is_action_pressed("MoveLeft"):
global_position += Vector2.LEFT * 2
if Input.is_action_pressed("MoveRight"):
global_position += Vector2.RIGHT * 2

View File

@@ -0,0 +1 @@
uid://brublmhrsdc7l

View File

@@ -1,13 +1,17 @@
extends Node
@onready var _Map = $Map
@onready var _Player = $Player
@onready var _Camera = $WorldCamera
@onready var _Map: Node = $Map
#@onready var _Player = $Player
#@onready var _Camera = $WorldCamera
@export var mapSize: int = 15
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
_Map.populate_terrain(_Camera.global_position)
var thread: Thread = Thread.new()
thread.start(func(): _Map.generate_map(mapSize))
thread.wait_to_finish()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:

View File

@@ -1,18 +1,27 @@
[gd_scene load_steps=5 format=3 uid="uid://d05j5yuhlsxp0"]
[gd_scene load_steps=6 format=3 uid="uid://d05j5yuhlsxp0"]
[ext_resource type="PackedScene" uid="uid://cywuuce71rmgb" path="res://Scenes/Map/map.tscn" id="1_1r6ip"]
[ext_resource type="Script" uid="uid://btdvxp8ckmeb3" path="res://Scenes/Main/main.gd" id="1_qw60k"]
[ext_resource type="PackedScene" uid="uid://dh8pjs2s1kud3" path="res://Scenes/Player/player.tscn" id="2_lixft"]
[ext_resource type="Script" uid="uid://cpp4vte6rs37q" path="res://Scenes/Main/world_camera.gd" id="4_5yls4"]
[ext_resource type="Script" uid="uid://brublmhrsdc7l" path="res://Scenes/Main/camera_controller.gd" id="3_p6jpk"]
[ext_resource type="Script" uid="uid://xrddv2epi3ty" path="res://addons/smartcamera2D/SmartCamera2D.gd" id="3_qw60k"]
[ext_resource type="Texture2D" uid="uid://bq6ud1dmn8fds" path="res://addons/smartcamera2D/Camera2D.svg" id="5_2a143"]
[node name="Main" type="Node"]
script = ExtResource("1_qw60k")
mapSize = 100
[node name="Map" parent="." instance=ExtResource("1_1r6ip")]
[node name="Player" parent="." instance=ExtResource("2_lixft")]
[node name="CameraController" type="Node2D" parent="."]
script = ExtResource("3_p6jpk")
metadata/_edit_group_ = true
[node name="WorldCamera" type="Camera2D" parent="."]
script = ExtResource("4_5yls4")
[node name="SmartCamera2D" type="Camera2D" parent="CameraController"]
script = ExtResource("3_qw60k")
target = NodePath("..")
metadata/_custom_type_script = "uid://xrddv2epi3ty"
[editable path="Player"]
[node name="Sprite2D" type="Sprite2D" parent="CameraController"]
texture = ExtResource("5_2a143")
[editable path="Map"]

View File

@@ -0,0 +1,13 @@
[gd_scene load_steps=3 format=3 uid="uid://byecwjojbqcsf"]
[ext_resource type="Script" uid="uid://ch84gxwetfvk3" path="res://procedural_map.gd" id="1_2fyk6"]
[ext_resource type="TileSet" uid="uid://duodt2t14xjc8" path="res://Resource/UrbanKitTileMap.tres" id="2_2qyxa"]
[node name="ProceduralMap" type="Node"]
script = ExtResource("1_2fyk6")
[node name="Ground" type="TileMapLayer" parent="."]
tile_set = ExtResource("2_2qyxa")
[node name="Roads" type="TileMapLayer" parent="."]
tile_set = ExtResource("2_2qyxa")

View File

@@ -20,7 +20,6 @@ const GREEN_TILE: Vector2i = Vector2i(1, 1)
var tilemap: TileMap;
@onready var Player = $Player/AnimatedSprite2D
@onready var GroundLayer: TileMapLayer = $Ground
func _get_player_position() -> Vector2i:
@@ -43,21 +42,20 @@ func _ready() -> void:
func _process(delta: float) -> void:
pass
func _on_exited_chunk():
print("Chunk exited...")
$VisibleOnScreenNotifier2D.global_position = Player.global_position
var thread: Thread = Thread.new()
thread.start(func(): _populate_terrain())
thread.wait_to_finish()
func populate_terrain(startPos: Vector2i):
for i in range(-CHUNK_DOUBLE, CHUNK_DOUBLE):
for j in range(-CHUNK_DOUBLE, CHUNK_DOUBLE):
var pos: Vector2i = startPos + Vector2i(i, j)
if _is_empty(pos):
_populate_cell(pos, 1, _pick_random_tile())
func generate_map(mapSize: int):
print_debug("Generating map")
for x in range(-mapSize, mapSize):
for y in range(-mapSize, mapSize):
var pos: Vector2i = Vector2i(x, y)
_populate_cell(pos, 1, _pick_random_tile())
func _populate_terrain():
var player_position: Vector2i = _get_player_position()
@@ -78,11 +76,15 @@ func _populate_cell(coords: Vector2i, source_id: int, atlas_coords: Vector2i) ->
# set_cell(coords: Vector2i, source_id: int = -1, atlas_coords: Vector2i = Vector2i(-1, -1), alternative_tile: int = 0)
GroundLayer.set_cell.call_deferred(coords, source_id, atlas_coords, alternativeTileId)
# full random (absolute nonsense)
func _pick_random_tile() -> Vector2i:
# Make all Tiles green
return Vector2i(1, 1)
var atlasSize: Vector2i = _source.get_atlas_grid_size()
var rndX: int = randi_range(0, atlasSize.x)
var rndY: int = randi_range(0, atlasSize.y)
return Vector2i(rndX, rndY)
func _is_empty(pos: Vector2i) -> bool:
# Check if the cell is empty (source_id is -1)
return true if GroundLayer.get_cell_source_id(pos) == -1 else false;
return true if GroundLayer.get_cell_source_id(pos) == -1 else false;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#8da5f3" d="M9 2a3 3 0 0 0-3 2.777 3 3 0 1 0-3 5.047V12a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-1l3 2V7l-3 2V7.23A3 3 0 0 0 9 2z"/></svg>

After

Width:  |  Height:  |  Size: 203 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bq6ud1dmn8fds"
path="res://.godot/imported/Camera2D.svg-e2316bbab95f65a3786cbb6cb8741380.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/smartcamera2D/Camera2D.svg"
dest_files=["res://.godot/imported/Camera2D.svg-e2316bbab95f65a3786cbb6cb8741380.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,14 @@
extends Node
signal apply_flash
signal apply_shake
var active = true
func apply_camera_flash(color: Color, duration = 0.3):
if not active: return
apply_flash.emit(color, duration)
func apply_camera_shake(force: float = 2.0, duration = 0.4):
if not active: return
apply_shake.emit(force, duration)

View File

@@ -0,0 +1 @@
uid://cl0y12rxbo7ub

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 AndreMicheletti
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,205 @@
@tool
extends Camera2D
class_name SmartCamera2D
enum TARGET_MODE {
PARENT,
SINGLE,
MULTIPLE,
GROUP
}
@export_category("GENERAL CONFIG")
@export var default_zoom: Vector2 = Vector2.ONE
@export_category("TARGET CONFIG")
@export var target_mode: TARGET_MODE:
set(value):
target_mode = value
notify_property_list_changed()
@export var target: NodePath
@export var targets: Array[NodePath]
@export var group_name: String
@export var adjust_zoom: bool = true
@export_range(1.0, 999.9) var adjust_zoom_margin: float
@export_range(0.001, 999.9) var adjust_zoom_min: float = 0.1
@export_range(0.001, 999.9) var adjust_zoom_max: float = 1.0
@export_range(-1, 999, 1) var adjust_zoom_priority_node_index: int = -1
@export_category("EFFECTS CONFIG")
@export var effects_layer: int = 2
var target_node: Node2D
var target_nodes: Array[Node]
var extra_position = Vector2.ZERO
@onready var refresh_target_timer = Timer.new()
@onready var canvas_layer = CanvasLayer.new()
@onready var camera_flash: ColorRect
func _ready():
if Engine.is_editor_hint():
return
CameraControl.apply_flash.connect(apply_camera_flash)
CameraControl.apply_shake.connect(apply_camera_shake)
zoom = default_zoom
_make_refresh_timer()
_make_effects_layers()
if target_mode == TARGET_MODE.SINGLE:
ensure_target_node()
elif target_mode == TARGET_MODE.MULTIPLE:
ensure_target_nodes()
call_deferred("_refresh_targets")
func _make_refresh_timer():
refresh_target_timer.connect("timeout", _refresh_targets)
refresh_target_timer.wait_time = 0.3
add_child(refresh_target_timer)
refresh_target_timer.start()
func _make_effects_layers():
canvas_layer.layer = effects_layer
add_child(canvas_layer)
camera_flash = create_color_rect()
func apply_camera_shake(force: float = 2.0, duration = 0.8):
var tween = create_tween()
var step_dur = duration / 5.0
tween.tween_property(self, "extra_position", Vector2(-force, force), step_dur)
tween.tween_property(self, "extra_position", Vector2(force, force), step_dur)
tween.tween_property(self, "extra_position", Vector2(force, -force), step_dur)
tween.tween_property(self, "extra_position", Vector2(-force, -force), step_dur)
tween.tween_property(self, "extra_position", Vector2.ZERO, step_dur)
func apply_camera_flash(color: Color, duration = 0.3):
var screen_size = get_viewport_rect().size
camera_flash.size = screen_size
var tween = create_tween()
var final_color = Color(color, 0.0)
var initial_color = Color(color, 0.2)
camera_flash.visible = true
tween.tween_property(camera_flash, "color", final_color, duration) \
.from(initial_color)
await tween.finished
camera_flash.visible = false
func _process(delta):
if not Engine.is_editor_hint():
_sanitize_targets()
if target_mode == TARGET_MODE.PARENT:
position = Vector2.ZERO
elif target_mode == TARGET_MODE.SINGLE:
_process_target_single(delta)
elif target_mode == TARGET_MODE.MULTIPLE:
_process_target_multiple(delta)
elif target_mode == TARGET_MODE.GROUP:
_process_target_group(delta)
position = position + extra_position
func _process_target_single(delta):
if not target_node:
printerr("[SmartCamera2D] TARGET NODE IS NULL")
return
global_position = target_node.global_position
func _process_target_multiple(delta):
if target_nodes.size() < 0:
printerr("[SmartCamera2D] NOT ENOUGH TARGET NODES")
return
adjust_camera_zoom()
func _process_target_group(delta):
if target_nodes.size() < 0:
printerr("[SmartCamera2D] NOT ENOUGH TARGET NODES")
return
adjust_camera_zoom()
func ensure_target_node():
if target_node: return
target_node = get_node(target)
func ensure_target_nodes():
target_nodes.clear()
for path in targets:
target_nodes.append(get_node(path))
func adjust_camera_zoom():
if target_nodes.is_empty():
return
if target_nodes.size() == 1:
zoom = default_zoom
global_position = target_nodes[0].global_position
return
var screen_size = get_viewport_rect().size
var min_pos = target_nodes[0].global_position
var max_pos = target_nodes[0].global_position
for node in target_nodes:
min_pos = min_pos.min(node.global_position)
max_pos = max_pos.max(node.global_position)
var size = max_pos - min_pos
var zoom_x = screen_size.x / size.x if size.x != 0 else 1.0
var zoom_y = screen_size.y / size.y if size.y != 0 else 1.0
var zoom_safe = clamp(min(zoom_x, zoom_y) / adjust_zoom_margin, adjust_zoom_min, adjust_zoom_max)
zoom = Vector2(zoom_safe, zoom_safe)
var center_position = (min_pos + max_pos) / 2.0
global_position = center_position
var priority_i = adjust_zoom_priority_node_index
if priority_i > -1:
if not is_point_visible(target_nodes[priority_i].global_position, screen_size):
center_position = target_nodes[priority_i].global_position
func is_point_visible(point: Vector2, screen_size: Vector2) -> bool:
var half_screen = (screen_size / 2.0) / zoom
var camera_min = global_position - half_screen
var camera_max = global_position + half_screen
return point.x >= camera_min.x and point.x <= camera_max.x and point.y >= camera_min.y and point.y <= camera_max.y
func create_color_rect():
var color_rect = ColorRect.new()
color_rect.visible = false
color_rect.color = Color.TRANSPARENT
color_rect.size_flags_horizontal = Control.SIZE_EXPAND_FILL
color_rect.size_flags_vertical = Control.SIZE_EXPAND_FILL
color_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE
canvas_layer.add_child(color_rect)
return color_rect
func _refresh_targets():
if target_mode == TARGET_MODE.SINGLE:
if not target_node:
target_node = get_node(target)
elif target_mode == TARGET_MODE.GROUP:
target_nodes = get_tree().get_nodes_in_group(group_name)
func _sanitize_targets():
if target_node and target_node.is_queued_for_deletion():
target_node = null
if not target_nodes.is_empty():
target_nodes = target_nodes.filter(_filter_existing_node)
func _filter_existing_node(variant) -> bool:
if variant == null:
return false
if not variant is Node2D:
return false
if variant is Node2D and variant.is_queued_for_deletion():
return false
return true
func _validate_property(property: Dictionary):
var multiple_properties = [
"adjust_zoom", "zoom_margin", "adjust_zoom_margin",
"adjust_zoom_min", "adjust_zoom_max", "adjust_zoom_priority_node_index"
]
if property.name == "target" and target_mode != TARGET_MODE.SINGLE:
property.usage = PROPERTY_USAGE_NO_EDITOR
if property.name == "group_name" and target_mode != TARGET_MODE.GROUP:
property.usage = PROPERTY_USAGE_NO_EDITOR
if property.name == "targets" and target_mode != TARGET_MODE.MULTIPLE:
property.usage = PROPERTY_USAGE_NO_EDITOR
if property.name in multiple_properties and target_mode not in [TARGET_MODE.MULTIPLE, TARGET_MODE.GROUP]:
property.usage = PROPERTY_USAGE_NO_EDITOR

View File

@@ -0,0 +1 @@
uid://xrddv2epi3ty

View File

@@ -0,0 +1,7 @@
[plugin]
name="smartcamera2D"
description="A plug-and-play camera controller with smooth follow, screen shake, zoom"
author="Async Studio"
version="1.0"
script="plugin.gd"

View File

@@ -0,0 +1,14 @@
@tool
extends EditorPlugin
func _enter_tree():
# Initialization of the plugin goes here.
# Add the new type with a name, a parent type, a script and an icon.
add_custom_type("SmartCamera2D", "Camera2D", preload("SmartCamera2D.gd"), preload("Camera2D.svg"))
add_autoload_singleton("CameraControl", "CameraControl.gd")
func _exit_tree():
# Clean-up of the plugin goes here.
# Always remember to remove it from the engine when deactivated.
remove_custom_type("SmartCamera2D")
remove_autoload_singleton("CameraControl")

View File

@@ -0,0 +1 @@
uid://b6pcau1vjhp20

49
procedural_map.gd Normal file
View File

@@ -0,0 +1,49 @@
extends Node
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
var width: int = 100
var height: int = 100
var terrainMap: Array[Variant] = generateTerrainMap(width, height)
paintTerrainMap($Ground, terrainMap, "grass", 0)
func generateTerrainMap(width: int, heigth: int) -> Array[Variant]:
var terrainMap: Array[Variant] = []
for y in range(heigth):
terrainMap.append([])
for x in range(width):
if randf() < 0.1: # 10% chance for asphalt
terrainMap[y].append("asphalt")
else:
terrainMap[y].append("grass")
return terrainMap
func paintTerrainMap(layer, terrain_map, default_terrain, terrain_set_index):
var tile_set = layer.tile_set
#var terrain_set = tile_set.get_terrain_set(terrain_set_index)
#var grass_id = terrain_set.find_terrain_by_name("Gras")
#var asphalt_id = terrain_set.find_terrain_by_name("Asphalt")
# Collect coordinates for each terrain type
var grass_cells = []
var asphalt_cells = []
for y in range(terrain_map.size()):
for x in range(terrain_map[y].size()):
var terrain_name = terrain_map[y][x]
if terrain_name == "grass":
grass_cells.append(Vector2i(x, y))
elif terrain_name == "asphalt":
asphalt_cells.append(Vector2i(x, y))
# Paint grass
if grass_cells.size() > 0:
$Ground.set_cells_terrain_connect(grass_cells, terrain_set_index, 0)
# Paint asphalt
if asphalt_cells.size() > 0:
for x in range(asphalt_cells.size()):
for y in range(asphalt_cells.size()):
if terrain_map[x][y] == "asphalt":
$Roads.set_cell(Vector2i(x, y), 1, Vector2i(9, 16))

1
procedural_map.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://ch84gxwetfvk3

View File

@@ -15,17 +15,25 @@ run/main_scene="uid://d05j5yuhlsxp0"
config/features=PackedStringArray("4.4", "GL Compatibility")
config/icon="res://icon.svg"
[autoload]
CameraControl="*res://addons/smartcamera2D/CameraControl.gd"
[display]
window/size/viewport_width=800
window/size/viewport_height=450
window/size/initial_position_type=3
window/size/initial_screen=1
window/size/no_focus=true
[dotnet]
project/assembly_name="TurnBasedStrategyGame"
[editor_plugins]
enabled=PackedStringArray("res://addons/smartcamera2D/plugin.cfg")
[input]
MoveUp={