From 6f56fffb5997335f5e8ad63efb4c9a5c6cb4a3c5 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sat, 11 Oct 2025 12:58:36 +0500 Subject: [PATCH 1/3] Dimensions for constructibles --- generic/constructibles/dbg_assembler.tres | 15 +++++++ project.godot | 4 +- scenes/2d_world.tscn | 21 +++++++++- scenes/debug_assembler.tscn | 16 ++++++++ scenes/other_platform.tscn | 11 ++++- scenes/player_platform.tscn | 3 +- scripts/{ => autoloads}/registry.gd | 0 scripts/{ => autoloads}/registry.gd.uid | 0 .../{ => autoloads}/runtime_player_data.gd | 0 .../runtime_player_data.gd.uid | 0 scripts/build_zone.gd | 12 +++--- scripts/construction.gd | 38 ++++++++++++++++++ scripts/construction_placer.gd | 17 ++++---- scripts/entity_holder.gd | 14 +++++-- scripts/globals.gd | 6 +++ scripts/globals.gd.uid | 1 + sprites/atlasses/Popekko.png | Bin 948 -> 1172 bytes sprites/atlasses/Popekko.png.import | 2 +- 18 files changed, 135 insertions(+), 25 deletions(-) create mode 100644 generic/constructibles/dbg_assembler.tres create mode 100644 scenes/debug_assembler.tscn rename scripts/{ => autoloads}/registry.gd (100%) rename scripts/{ => autoloads}/registry.gd.uid (100%) rename scripts/{ => autoloads}/runtime_player_data.gd (100%) rename scripts/{ => autoloads}/runtime_player_data.gd.uid (100%) create mode 100644 scripts/globals.gd create mode 100644 scripts/globals.gd.uid diff --git a/generic/constructibles/dbg_assembler.tres b/generic/constructibles/dbg_assembler.tres new file mode 100644 index 0000000..0dfedeb --- /dev/null +++ b/generic/constructibles/dbg_assembler.tres @@ -0,0 +1,15 @@ +[gd_resource type="Resource" script_class="Constructible" load_steps=5 format=3 uid="uid://yn1iesx30nfu"] + +[ext_resource type="Script" uid="uid://c80sp6f77l5ha" path="res://scripts/constructible.gd" id="1_mqcr0"] +[ext_resource type="Texture2D" uid="uid://dinyjq8853usn" path="res://sprites/atlasses/Popekko.png" id="1_sh8t1"] +[ext_resource type="PackedScene" uid="uid://dfatkxv6n55dw" path="res://scenes/debug_assembler.tscn" id="2_kf3x0"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_kf3x0"] +atlas = ExtResource("1_sh8t1") +region = Rect2(32, 0, 32, 32) + +[resource] +script = ExtResource("1_mqcr0") +scene = ExtResource("2_kf3x0") +preview = SubResource("AtlasTexture_kf3x0") +metadata/_custom_type_script = "uid://c80sp6f77l5ha" diff --git a/project.godot b/project.godot index b6648e2..352b36b 100644 --- a/project.godot +++ b/project.godot @@ -18,8 +18,8 @@ config/icon="res://icon.svg" [autoload] GuiEventBus="*res://scripts/gui/gui_event_bus.gd" -RuntimePlayerData="*res://scripts/runtime_player_data.gd" -Registry="*res://scripts/registry.gd" +RuntimePlayerData="*res://scripts/autoloads/runtime_player_data.gd" +Registry="*res://scripts/autoloads/registry.gd" [display] diff --git a/scenes/2d_world.tscn b/scenes/2d_world.tscn index 5e93434..254927d 100644 --- a/scenes/2d_world.tscn +++ b/scenes/2d_world.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=9 format=3 uid="uid://u7thalwj5742"] +[gd_scene load_steps=10 format=3 uid="uid://u7thalwj5742"] [ext_resource type="PackedScene" uid="uid://b7du4vul4bmpq" path="res://scenes/player_platform.tscn" id="1_4ia00"] [ext_resource type="Script" uid="uid://db37xmo8ygwhg" path="res://scripts/gui/construction_button.gd" id="2_27lod"] [ext_resource type="Resource" uid="uid://dj524jjal1f0n" path="res://generic/constructibles/conveyor.tres" id="3_2crwe"] [ext_resource type="Script" uid="uid://b4nkk0ndqcto" path="res://scripts/construction_placer.gd" id="4_i7yte"] [ext_resource type="PackedScene" uid="uid://bac552xgua68e" path="res://scenes/other_platform.tscn" id="5_mnxrb"] +[ext_resource type="Resource" uid="uid://yn1iesx30nfu" path="res://generic/constructibles/dbg_assembler.tres" id="5_ymyc2"] [sub_resource type="Animation" id="Animation_bq5r8"] length = 0.001 @@ -81,6 +82,24 @@ expand_icon = true script = ExtResource("2_27lod") constructible = ExtResource("3_2crwe") +[node name="AssemblerButton" type="Button" parent="GUI/Panel"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.008 +anchor_top = 0.086 +anchor_right = 0.1 +anchor_bottom = 0.88600004 +offset_left = 50.904 +offset_top = -0.01999998 +offset_right = 50.8 +offset_bottom = -0.020004272 +size_flags_horizontal = 3 +theme_type_variation = &"CRT" +icon_alignment = 1 +expand_icon = true +script = ExtResource("2_27lod") +constructible = ExtResource("5_ymyc2") + [node name="Placer" type="Node2D" parent="."] script = ExtResource("4_i7yte") diff --git a/scenes/debug_assembler.tscn b/scenes/debug_assembler.tscn new file mode 100644 index 0000000..88bad0c --- /dev/null +++ b/scenes/debug_assembler.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=3 uid="uid://dfatkxv6n55dw"] + +[ext_resource type="Script" uid="uid://bbd7o2st8kmgl" path="res://scripts/construction.gd" id="1_k5y3y"] +[ext_resource type="Texture2D" uid="uid://dinyjq8853usn" path="res://sprites/atlasses/Popekko.png" id="2_4befw"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_xh4eg"] +atlas = ExtResource("2_4befw") +region = Rect2(32, 0, 32, 32) + +[node name="DebugAssembler" type="Node2D"] +script = ExtResource("1_k5y3y") +dimensions = Rect2i(0, 0, 2, 2) + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = SubResource("AtlasTexture_xh4eg") +offset = Vector2(8, 8) diff --git a/scenes/other_platform.tscn b/scenes/other_platform.tscn index 125ccab..9bc4169 100644 --- a/scenes/other_platform.tscn +++ b/scenes/other_platform.tscn @@ -1,13 +1,20 @@ -[gd_scene load_steps=3 format=4 uid="uid://bac552xgua68e"] +[gd_scene load_steps=4 format=4 uid="uid://bac552xgua68e"] [ext_resource type="TileSet" uid="uid://bv75bu0af04vs" path="res://generic/platform.tres" id="1_fs1oy"] [ext_resource type="Script" uid="uid://lw1ya3iu14uf" path="res://scripts/build_zone.gd" id="2_bwire"] +[ext_resource type="Script" uid="uid://x5edy155eg0s" path="res://scripts/entity_holder.gd" id="3_qaudu"] [node name="OtherPlatform" type="TileMapLayer"] tile_map_data = PackedByteArray("AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAAAAAAIAAAAAAAEAAAAAAAMAAAAAAAEAAAAAAAQAAAAAAAEAAAABAAAAAAAAAAEAAAABAAEAAAAAAAEAAAABAAIAAAAAAAEAAAABAAMAAAAAAAAAAAABAAQAAAAAAAEAAAACAAAAAAAAAAAAAAACAAEAAAAAAAEAAAACAAIAAAAAAAEAAAACAAMAAAAAAAAAAAACAAQAAAAAAAAAAAD/////AAACAAEAAAD//wAAAAAEAAIAAAD//wEAAAAEAAIAAAD//wIAAAAEAAIAAAD//wMAAAAEAAIAAAD//wQAAAAEAAIAAAAAAP//AAABAAIAAAABAP//AAABAAIAAAACAP//AAABAAIAAAADAP//AAADAAEAAAD//wUAAAAEAAEAAAADAAUAAAAFAAEAAAAAAAUAAAAGAAEAAAABAAUAAAAGAAEAAAACAAUAAAAGAAEAAAADAAAAAAAFAAIAAAADAAEAAAAFAAIAAAADAAIAAAAFAAIAAAADAAMAAAAFAAIAAAADAAQAAAAFAAIAAAA=") tile_set = ExtResource("1_fs1oy") -[node name="BuildZone" type="Marker2D" parent="."] +[node name="BuildZone" type="Marker2D" parent="." node_paths=PackedStringArray("entity_holder")] script = ExtResource("2_bwire") building_rect = Rect2(0, 0, 48, 80) +entity_holder = NodePath("../EntityHolder") metadata/_custom_type_script = "uid://lw1ya3iu14uf" + +[node name="EntityHolder" type="Node2D" parent="." node_paths=PackedStringArray("building_zone")] +script = ExtResource("3_qaudu") +building_zone = NodePath("../BuildZone") +metadata/_custom_type_script = "uid://x5edy155eg0s" diff --git a/scenes/player_platform.tscn b/scenes/player_platform.tscn index c23ecc3..28b19a1 100644 --- a/scenes/player_platform.tscn +++ b/scenes/player_platform.tscn @@ -10,9 +10,10 @@ tile_map_data = PackedByteArray("AAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAEAAAADAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAGAAAAAAAAAAEAAAAHAAAAAAAAAAAAAAAIAAAAAAAAAAEAAAAJAAAAAAAAAAEAAAAKAAAAAAAAAAEAAAALAAAAAAAAAAAAAAAMAAAAAAAAAAEAAAANAAAAAAAAAAEAAAAOAAAAAAAAAAEAAAAPAAAAAAAAAAAAAAAQAAAAAAAAAAEAAAAQAAEAAAAAAAAAAAAPAAEAAAAAAAAAAAAOAAEAAAAAAAEAAAANAAEAAAAAAAAAAAAMAAEAAAAAAAAAAAALAAEAAAAAAAEAAAAKAAEAAAAAAAEAAAAJAAEAAAAAAAEAAAAIAAEAAAAAAAEAAAAHAAEAAAAAAAAAAAAGAAEAAAAAAAEAAAAFAAEAAAAAAAEAAAAEAAEAAAAAAAAAAAADAAEAAAAAAAAAAAACAAEAAAAAAAEAAAABAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAAAAABAAIAAAAAAAEAAAACAAIAAAAAAAEAAAACAAMAAAAAAAEAAAADAAMAAAAAAAAAAAADAAIAAAAAAAAAAAAEAAIAAAAAAAAAAAAFAAIAAAAAAAEAAAAGAAIAAAAAAAEAAAAHAAIAAAAAAAEAAAAIAAIAAAAAAAEAAAAJAAIAAAAAAAEAAAAKAAIAAAAAAAEAAAALAAIAAAAAAAAAAAAMAAIAAAAAAAEAAAANAAIAAAAAAAEAAAAOAAIAAAAAAAAAAAAPAAIAAAAAAAEAAAAQAAIAAAAAAAEAAAAQAAMAAAAAAAEAAAAPAAMAAAAAAAEAAAAOAAMAAAAAAAEAAAANAAMAAAAAAAAAAAANAAQAAAAAAAAAAAAMAAQAAAAAAAEAAAALAAQAAAAAAAEAAAAKAAQAAAAAAAEAAAAJAAQAAAAAAAAAAAAJAAMAAAAAAAAAAAAIAAMAAAAAAAAAAAAHAAMAAAAAAAEAAAAGAAMAAAAAAAAAAAAFAAMAAAAAAAEAAAAEAAMAAAAAAAEAAAABAAMAAAAAAAEAAAAAAAMAAAAAAAEAAAAAAAQAAAAAAAAAAAABAAQAAAAAAAEAAAACAAQAAAAAAAAAAAADAAQAAAAAAAAAAAAEAAQAAAAAAAEAAAAFAAQAAAAAAAAAAAAGAAQAAAAAAAAAAAAHAAQAAAAAAAAAAAAIAAQAAAAAAAEAAAAOAAQAAAAAAAEAAAAPAAQAAAAAAAEAAAAQAAQAAAAAAAEAAAAMAAMAAAAAAAAAAAALAAMAAAAAAAEAAAAKAAMAAAAAAAEAAAABAAUAAAAAAAEAAAAAAAUAAAAAAAAAAAACAAUAAAAAAAEAAAADAAUAAAAAAAEAAAAEAAUAAAAAAAEAAAAFAAUAAAAAAAEAAAAGAAUAAAAAAAEAAAAHAAUAAAAAAAEAAAAIAAUAAAAAAAEAAAAJAAUAAAAAAAEAAAAKAAUAAAAAAAAAAAALAAUAAAAAAAAAAAAMAAUAAAAAAAAAAAANAAUAAAAAAAAAAAAOAAUAAAAAAAEAAAAPAAUAAAAAAAAAAAAQAAUAAAAAAAAAAAAQAAYAAAAAAAEAAAAPAAYAAAAAAAAAAAAPAAcAAAAAAAAAAAAOAAcAAAAAAAAAAAAOAAYAAAAAAAAAAAANAAYAAAAAAAAAAAAMAAYAAAAAAAAAAAALAAYAAAAAAAEAAAAKAAYAAAAAAAEAAAAJAAYAAAAAAAEAAAAIAAYAAAAAAAEAAAAHAAYAAAAAAAAAAAAGAAYAAAAAAAEAAAAFAAYAAAAAAAAAAAAEAAYAAAAAAAEAAAADAAYAAAAAAAEAAAACAAYAAAAAAAEAAAABAAYAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAcAAAAAAAAAAAABAAcAAAAAAAAAAAACAAcAAAAAAAAAAAADAAcAAAAAAAAAAAAEAAcAAAAAAAEAAAAFAAcAAAAAAAAAAAAGAAcAAAAAAAAAAAAHAAcAAAAAAAAAAAAIAAcAAAAAAAEAAAAJAAcAAAAAAAAAAAAKAAcAAAAAAAEAAAALAAcAAAAAAAAAAAAMAAcAAAAAAAAAAAANAAcAAAAAAAEAAAAQAAcAAAAAAAAAAAARAAAAAAABAAEAAAARAAEAAAABAAEAAAARAAIAAAABAAEAAAARAAMAAAABAAEAAAARAAQAAAABAAEAAAARAAUAAAABAAEAAAARAAYAAAABAAEAAAARAAcAAAABAAEAAAD//wAAAAABAAAAAAD//wEAAAABAAAAAAD//wIAAAABAAAAAAD//wMAAAABAAAAAAD//wQAAAABAAAAAAD//wUAAAABAAAAAAD//wYAAAABAAAAAAD//wcAAAABAAAAAAAAAP//AAAAAAIAAAABAP//AAAAAAIAAAACAP//AAAAAAIAAAADAP//AAAAAAIAAAAEAP//AAAAAAIAAAAFAP//AAAAAAIAAAAGAP//AAAAAAIAAAAHAP//AAAAAAIAAAAIAP//AAAAAAIAAAAJAP//AAAAAAIAAAAKAP//AAAAAAIAAAALAP//AAAAAAIAAAAMAP//AAAAAAIAAAANAP//AAAAAAIAAAAOAP//AAAAAAIAAAAPAP//AAAAAAIAAAAQAP//AAAAAAIAAAD/////AAACAAIAAAARAP//AAADAAIAAAD//wgAAAADAAAAAAARAAgAAAAEAAAAAAAQAAgAAAACAAAAAAAPAAgAAAACAAAAAAAOAAgAAAACAAAAAAANAAgAAAACAAAAAAAMAAgAAAACAAAAAAALAAgAAAACAAAAAAAKAAgAAAACAAAAAAAJAAgAAAACAAAAAAAIAAgAAAACAAAAAAAHAAgAAAACAAAAAAAGAAgAAAACAAAAAAAFAAgAAAACAAAAAAAEAAgAAAACAAAAAAADAAgAAAACAAAAAAACAAgAAAACAAAAAAABAAgAAAACAAAAAAAAAAgAAAACAAAAAAA=") tile_set = ExtResource("1_khkq2") -[node name="BuildRect" type="Marker2D" parent="."] +[node name="BuildRect" type="Marker2D" parent="." node_paths=PackedStringArray("entity_holder")] script = ExtResource("2_wpmwa") building_rect = Rect2(0, 0, 272, 128) +entity_holder = NodePath("../EntityHolder") [node name="EntityHolder" type="Node2D" parent="." node_paths=PackedStringArray("building_zone")] script = ExtResource("3_6hjoe") diff --git a/scripts/registry.gd b/scripts/autoloads/registry.gd similarity index 100% rename from scripts/registry.gd rename to scripts/autoloads/registry.gd diff --git a/scripts/registry.gd.uid b/scripts/autoloads/registry.gd.uid similarity index 100% rename from scripts/registry.gd.uid rename to scripts/autoloads/registry.gd.uid diff --git a/scripts/runtime_player_data.gd b/scripts/autoloads/runtime_player_data.gd similarity index 100% rename from scripts/runtime_player_data.gd rename to scripts/autoloads/runtime_player_data.gd diff --git a/scripts/runtime_player_data.gd.uid b/scripts/autoloads/runtime_player_data.gd.uid similarity index 100% rename from scripts/runtime_player_data.gd.uid rename to scripts/autoloads/runtime_player_data.gd.uid diff --git a/scripts/build_zone.gd b/scripts/build_zone.gd index 23a16f8..bc3a720 100644 --- a/scripts/build_zone.gd +++ b/scripts/build_zone.gd @@ -6,8 +6,6 @@ extends Marker2D class_name BuildZone -const GRID_SIZE : Vector2 = Vector2(16,16) - ## Rect that used for bounds check and conversions @export var building_rect : Rect2: set(value): @@ -17,6 +15,8 @@ const GRID_SIZE : Vector2 = Vector2(16,16) get: return building_rect +@export var entity_holder : EntityHolder + func _ready() -> void: if not Engine.is_editor_hint(): Registry.build_zones.append(self) @@ -37,7 +37,7 @@ func is_global_point_in_zone(point: Vector2) -> bool: func indexify_point(point : Vector2) -> int: if is_point_in_zone(point) == false: return -1 - return int(point.x) / int(GRID_SIZE.x) + int(building_rect.size.x/GRID_SIZE.x)*(int(point.y) / int(GRID_SIZE.y)) + return int(point.x) / int(Globals.GRID_SIZE.x) + int(building_rect.size.x/Globals.GRID_SIZE.x)*(int(point.y) / int(Globals.GRID_SIZE.y)) ## Returns index of point (global coordinates) to be used in array func indexify_global_point(point : Vector2) -> int: @@ -45,7 +45,7 @@ func indexify_global_point(point : Vector2) -> int: ## Inverses indexification of point, returning snapped position func inverse_index(index: int) -> Vector2: - return to_global(Vector2(index%int(building_rect.size.x/GRID_SIZE.x)*GRID_SIZE.x,index / int(building_rect.size.x/GRID_SIZE.x) * GRID_SIZE.y)) + return to_global(Vector2(index%int(building_rect.size.x/Globals.GRID_SIZE.x)*Globals.GRID_SIZE.x,index / int(building_rect.size.x/Globals.GRID_SIZE.x) * Globals.GRID_SIZE.y)) ## Returns snapped position of point (global coordinates). ## Equivalent of [code] @@ -54,8 +54,8 @@ func inverse_index(index: int) -> Vector2: func get_placement_position(point : Vector2) -> Vector2: if is_global_point_in_zone(point) == false: return Vector2.ZERO - return to_global((to_local(point) / GRID_SIZE).floor()*GRID_SIZE + GRID_SIZE/2.0) + return to_global((to_local(point) / Globals.GRID_SIZE).floor()*Globals.GRID_SIZE + Globals.GRID_SIZE/2.0) ## Returns capacity of building zone to be used in the array func get_capacity() -> int: - return int(building_rect.size.x/GRID_SIZE.x)*int(building_rect.size.y/GRID_SIZE.y) + return int(building_rect.size.x/Globals.GRID_SIZE.x)*int(building_rect.size.y/Globals.GRID_SIZE.y) diff --git a/scripts/construction.gd b/scripts/construction.gd index 7d86f32..facfa7a 100644 --- a/scripts/construction.gd +++ b/scripts/construction.gd @@ -1,6 +1,44 @@ +@tool extends Node2D class_name Construction +@export var dimensions : Rect2i = Rect2i(0,0,1,1): + set(value): + dimensions = value + if Engine.is_editor_hint(): + queue_redraw() + get: + return dimensions + +func _draw() -> void: + if Engine.is_editor_hint(): + for x in range(dimensions.size.x): + for y in range(dimensions.size.y): + draw_circle((dimensions.position+Vector2i(x,y)) * Vector2i(Globals.GRID_SIZE),2,Color.AQUA) + func get_relative(dv : Vector2) -> Construction: return get_parent().get_at(global_position+dv) + +func can_be_placed(zone : BuildZone) -> bool: + for dp in get_dimension_points(): + var point = global_position + dp + if zone.is_global_point_in_zone(point) == false: + return false + if zone.entity_holder.is_point_occupied(point): + return false + return true + +func try_place(zone : BuildZone) -> bool: + if can_be_placed(zone) == false: + return false + + return zone.entity_holder.add_construction(self) + +func get_dimension_points() -> Array[Vector2]: + var result : Array[Vector2] = [] + result.resize(dimensions.size.x*dimensions.size.y) + for x in range(dimensions.size.x): + for y in range(dimensions.size.y): + result[x + y * dimensions.size.x] = (Vector2(x,y)*Globals.GRID_SIZE + Vector2(dimensions.position)) + return result diff --git a/scripts/construction_placer.gd b/scripts/construction_placer.gd index bbbdb82..009466d 100644 --- a/scripts/construction_placer.gd +++ b/scripts/construction_placer.gd @@ -13,7 +13,7 @@ func _input(event: InputEvent) -> void: if zone == null: held_construction.queue_free() else: - if zone.get_parent().get_node("EntityHolder").add_construction(held_construction): + if held_construction.try_place(zone): held_construction = null if event.is_action_pressed("plc_cancel"): @@ -27,13 +27,14 @@ func on_construction_selected(constructible : Constructible): func _process(_delta: float) -> void: - if held_construction != null: - var mouse_pos = get_global_mouse_position() - var zone = try_get_zone(mouse_pos) - if zone: - global_position = zone.get_placement_position(mouse_pos) - else: - global_position = mouse_pos + if held_construction == null: + return + var mouse_pos = get_global_mouse_position() + var zone = try_get_zone(mouse_pos) + if zone and held_construction.can_be_placed(zone): + global_position = zone.get_placement_position(mouse_pos) + else: + global_position = mouse_pos func try_get_zone(point : Vector2) -> BuildZone: for zone in Registry.build_zones: diff --git a/scripts/entity_holder.gd b/scripts/entity_holder.gd index 6b6b129..12a7d8b 100644 --- a/scripts/entity_holder.gd +++ b/scripts/entity_holder.gd @@ -11,12 +11,18 @@ func _ready() -> void: constructions.resize(building_zone.get_capacity()) func add_construction(construction : Construction) -> bool: - if constructions[building_zone.indexify_global_point(construction.global_position)]: - return false + var construction_dp = construction.get_dimension_points() + for point in construction_dp: + if constructions[building_zone.indexify_global_point(construction.global_position + point)]: + return false construction.reparent(self) construction.global_position = building_zone.get_placement_position(construction.global_position) - constructions[building_zone.indexify_global_point(construction.global_position)] = construction + for point in construction_dp: + constructions[building_zone.indexify_global_point(construction.global_position + point)] = construction return true -func get_at(point : Vector2): +func get_at(point : Vector2) -> Construction: return constructions[building_zone.indexify_global_point(point)] + +func is_point_occupied(point : Vector2) -> bool: + return get_at(point) != null diff --git a/scripts/globals.gd b/scripts/globals.gd new file mode 100644 index 0000000..d7ff107 --- /dev/null +++ b/scripts/globals.gd @@ -0,0 +1,6 @@ +@abstract +extends Object + +class_name Globals + +const GRID_SIZE : Vector2 = Vector2(16,16) diff --git a/scripts/globals.gd.uid b/scripts/globals.gd.uid new file mode 100644 index 0000000..4bb6907 --- /dev/null +++ b/scripts/globals.gd.uid @@ -0,0 +1 @@ +uid://bnmjkc8vfd7mo diff --git a/sprites/atlasses/Popekko.png b/sprites/atlasses/Popekko.png index 48fd6af3658da21a9fee571959b02691f7d4c6fe..8ff06cb4c3036ff2bc196dc7b1d4b6f2fc533fcd 100644 GIT binary patch delta 645 zcmV;00($+l2b2krBYy;2Nkl4cH7y#fmp&&RULwg{_PVG{tZh;PN{Rtw9 zzraO*g5u^T=;ALBMf?fb90J)i;L=Pfr4Sw3p-?ECi&vVoq0wA(*WB|gxjVkgU9!CI z_kQ2USBt;4w|3H}4}f3;q!i>uas__u(+s*IHKw_l>)EVt@E6R+E*pYyWb-yLS+`Z!P8gv!-)= za$3l90ibC0?X8`3cz6^q-@ZA!*dKIj%grSEgKjM%Vt9B|TzNkW z{t*#Lvk@T?0DpjmQSbEHwWQgIq}do5+s|}*?OGQ2C$#|pZkDAOo78uiq}ho6Km`B* z7DfH@`%hO+^t)_WpsY;n1Awd5BO>0t`cSH+eE$=~vsDGzih}d24gi2r^@xZUub-8o zXFp32-yi-OxhFeU5deUT>W`m4DMj#)oPzlHcc=&ez<)*cDca0k9zlFkG64XTGy%wZ z{CNa%fgb=aDpdk7smCvf13=lT(`k0Z>V$ssLp4_yOR0 zl`;VU0It`}`|!?MLcjmuURu-=J(UIks;V>k|N~tndkNMOOg6fBRARe*ggU zR+5&hvS*Zet9y ffdTyi7c8zn$rtQ+{r5%+00000NkvXXu0mjf?w}>i delta 390 zcmV;10eSwE3A6{0BYy*XNkl6b9gbhOINj?tqA?vW<{7kUozfqWAyzubf4RP#UTpc50DyJMVSm&tS66xS{_J{kzL*xr zRh{`_S|rJGb@e}=5dhe-vK<^(b@E4hzfJy0QdgZsApih-qnymfMO}4LSDhPc`>n}r zT(pV*Z!rMCZeBUctxbJ*sjE)r3mpIe*cauO^UrHH`rWlG008W+GD$wX{kYMud;q|1 zDU;;&yO+M~0pNg?&t5&3`~l#=l=p}M0QQUm000h<0ssIG(8lZk4g&&!-J=5l00&3` kvw;Hq0h5pdA{VUn3l>^yU;SZF$^ZZW07*qoM6N<$f;zpwwEzGB diff --git a/sprites/atlasses/Popekko.png.import b/sprites/atlasses/Popekko.png.import index e1cba67..f2b9199 100644 --- a/sprites/atlasses/Popekko.png.import +++ b/sprites/atlasses/Popekko.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://cbtre16ilxte0" +uid="uid://dinyjq8853usn" path="res://.godot/imported/Popekko.png-5c34a5f2a8c85fcf59453310fa6553d9.ctex" metadata={ "vram_texture": false From e1cdf38dfb36b0a3653a8f0279dab47204a2c435 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sat, 11 Oct 2025 13:29:41 +0500 Subject: [PATCH 2/3] Name refactor --- generic/constructibles/conveyor.tres | 6 +++--- generic/constructibles/dbg_assembler.tres | 2 +- scenes/2d_world.tscn | 2 +- scenes/conveyor.tscn | 4 ++-- scenes/debug_assembler.tscn | 2 +- scenes/other_platform.tscn | 4 ++-- scenes/player_platform.tscn | 4 ++-- scripts/autoloads/registry.gd | 9 +-------- scripts/autoloads/runtime_player_data.gd | 11 +++++++++++ scripts/{entity_holder.gd => grid_controller.gd} | 10 +++++----- .../{entity_holder.gd.uid => grid_controller.gd.uid} | 0 scripts/gui/construction_button.gd | 2 +- scripts/gui/gui_event_bus.gd | 4 ++-- .../{construction_placer.gd => placement_manager.gd} | 8 ++++---- ...ruction_placer.gd.uid => placement_manager.gd.uid} | 0 scripts/{build_zone.gd => placement_zone.gd} | 6 +++--- scripts/{build_zone.gd.uid => placement_zone.gd.uid} | 0 scripts/{constructible.gd => prototype.gd} | 2 +- scripts/{constructible.gd.uid => prototype.gd.uid} | 0 scripts/{construction.gd => structure.gd} | 8 ++++---- scripts/{construction.gd.uid => structure.gd.uid} | 0 21 files changed, 44 insertions(+), 40 deletions(-) rename scripts/{entity_holder.gd => grid_controller.gd} (78%) rename scripts/{entity_holder.gd.uid => grid_controller.gd.uid} (100%) rename scripts/{construction_placer.gd => placement_manager.gd} (84%) rename scripts/{construction_placer.gd.uid => placement_manager.gd.uid} (100%) rename scripts/{build_zone.gd => placement_zone.gd} (95%) rename scripts/{build_zone.gd.uid => placement_zone.gd.uid} (100%) rename scripts/{constructible.gd => prototype.gd} (76%) rename scripts/{constructible.gd.uid => prototype.gd.uid} (100%) rename scripts/{construction.gd => structure.gd} (87%) rename scripts/{construction.gd.uid => structure.gd.uid} (100%) diff --git a/generic/constructibles/conveyor.tres b/generic/constructibles/conveyor.tres index cf8b491..04d8ee9 100644 --- a/generic/constructibles/conveyor.tres +++ b/generic/constructibles/conveyor.tres @@ -1,7 +1,7 @@ -[gd_resource type="Resource" script_class="Constructible" load_steps=5 format=3 uid="uid://dj524jjal1f0n"] +[gd_resource type="Resource" script_class="Prototype" load_steps=5 format=3 uid="uid://dj524jjal1f0n"] -[ext_resource type="Script" uid="uid://c80sp6f77l5ha" path="res://scripts/constructible.gd" id="1_53h7j"] -[ext_resource type="Texture2D" uid="uid://cbtre16ilxte0" path="res://sprites/atlasses/Popekko.png" id="1_x27pp"] +[ext_resource type="Script" uid="uid://c80sp6f77l5ha" path="res://scripts/prototype.gd" id="1_53h7j"] +[ext_resource type="Texture2D" uid="uid://dinyjq8853usn" path="res://sprites/atlasses/Popekko.png" id="1_x27pp"] [ext_resource type="PackedScene" uid="uid://b0h8dd82b3ox5" path="res://scenes/conveyor.tscn" id="2_hinjf"] [sub_resource type="AtlasTexture" id="AtlasTexture_uvy8r"] diff --git a/generic/constructibles/dbg_assembler.tres b/generic/constructibles/dbg_assembler.tres index 0dfedeb..857a443 100644 --- a/generic/constructibles/dbg_assembler.tres +++ b/generic/constructibles/dbg_assembler.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="Constructible" load_steps=5 format=3 uid="uid://yn1iesx30nfu"] -[ext_resource type="Script" uid="uid://c80sp6f77l5ha" path="res://scripts/constructible.gd" id="1_mqcr0"] +[ext_resource type="Script" uid="uid://c80sp6f77l5ha" path="res://scripts/prototype.gd" id="1_mqcr0"] [ext_resource type="Texture2D" uid="uid://dinyjq8853usn" path="res://sprites/atlasses/Popekko.png" id="1_sh8t1"] [ext_resource type="PackedScene" uid="uid://dfatkxv6n55dw" path="res://scenes/debug_assembler.tscn" id="2_kf3x0"] diff --git a/scenes/2d_world.tscn b/scenes/2d_world.tscn index 254927d..4e0d946 100644 --- a/scenes/2d_world.tscn +++ b/scenes/2d_world.tscn @@ -3,7 +3,7 @@ [ext_resource type="PackedScene" uid="uid://b7du4vul4bmpq" path="res://scenes/player_platform.tscn" id="1_4ia00"] [ext_resource type="Script" uid="uid://db37xmo8ygwhg" path="res://scripts/gui/construction_button.gd" id="2_27lod"] [ext_resource type="Resource" uid="uid://dj524jjal1f0n" path="res://generic/constructibles/conveyor.tres" id="3_2crwe"] -[ext_resource type="Script" uid="uid://b4nkk0ndqcto" path="res://scripts/construction_placer.gd" id="4_i7yte"] +[ext_resource type="Script" uid="uid://b4nkk0ndqcto" path="res://scripts/placement_manager.gd" id="4_i7yte"] [ext_resource type="PackedScene" uid="uid://bac552xgua68e" path="res://scenes/other_platform.tscn" id="5_mnxrb"] [ext_resource type="Resource" uid="uid://yn1iesx30nfu" path="res://generic/constructibles/dbg_assembler.tres" id="5_ymyc2"] diff --git a/scenes/conveyor.tscn b/scenes/conveyor.tscn index dbf0273..4f9ddf3 100644 --- a/scenes/conveyor.tscn +++ b/scenes/conveyor.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=4 format=3 uid="uid://b0h8dd82b3ox5"] -[ext_resource type="Texture2D" uid="uid://cbtre16ilxte0" path="res://sprites/atlasses/Popekko.png" id="1_kqxj7"] -[ext_resource type="Script" uid="uid://bbd7o2st8kmgl" path="res://scripts/construction.gd" id="1_y326v"] +[ext_resource type="Texture2D" uid="uid://dinyjq8853usn" path="res://sprites/atlasses/Popekko.png" id="1_kqxj7"] +[ext_resource type="Script" uid="uid://bbd7o2st8kmgl" path="res://scripts/structure.gd" id="1_y326v"] [sub_resource type="AtlasTexture" id="AtlasTexture_uvy8r"] atlas = ExtResource("1_kqxj7") diff --git a/scenes/debug_assembler.tscn b/scenes/debug_assembler.tscn index 88bad0c..1b8d172 100644 --- a/scenes/debug_assembler.tscn +++ b/scenes/debug_assembler.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=4 format=3 uid="uid://dfatkxv6n55dw"] -[ext_resource type="Script" uid="uid://bbd7o2st8kmgl" path="res://scripts/construction.gd" id="1_k5y3y"] +[ext_resource type="Script" uid="uid://bbd7o2st8kmgl" path="res://scripts/structure.gd" id="1_k5y3y"] [ext_resource type="Texture2D" uid="uid://dinyjq8853usn" path="res://sprites/atlasses/Popekko.png" id="2_4befw"] [sub_resource type="AtlasTexture" id="AtlasTexture_xh4eg"] diff --git a/scenes/other_platform.tscn b/scenes/other_platform.tscn index 9bc4169..81dd25e 100644 --- a/scenes/other_platform.tscn +++ b/scenes/other_platform.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=4 format=4 uid="uid://bac552xgua68e"] [ext_resource type="TileSet" uid="uid://bv75bu0af04vs" path="res://generic/platform.tres" id="1_fs1oy"] -[ext_resource type="Script" uid="uid://lw1ya3iu14uf" path="res://scripts/build_zone.gd" id="2_bwire"] -[ext_resource type="Script" uid="uid://x5edy155eg0s" path="res://scripts/entity_holder.gd" id="3_qaudu"] +[ext_resource type="Script" uid="uid://lw1ya3iu14uf" path="res://scripts/placement_zone.gd" id="2_bwire"] +[ext_resource type="Script" uid="uid://x5edy155eg0s" path="res://scripts/grid_controller.gd" id="3_qaudu"] [node name="OtherPlatform" type="TileMapLayer"] tile_map_data = PackedByteArray("AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAAAAAAIAAAAAAAEAAAAAAAMAAAAAAAEAAAAAAAQAAAAAAAEAAAABAAAAAAAAAAEAAAABAAEAAAAAAAEAAAABAAIAAAAAAAEAAAABAAMAAAAAAAAAAAABAAQAAAAAAAEAAAACAAAAAAAAAAAAAAACAAEAAAAAAAEAAAACAAIAAAAAAAEAAAACAAMAAAAAAAAAAAACAAQAAAAAAAAAAAD/////AAACAAEAAAD//wAAAAAEAAIAAAD//wEAAAAEAAIAAAD//wIAAAAEAAIAAAD//wMAAAAEAAIAAAD//wQAAAAEAAIAAAAAAP//AAABAAIAAAABAP//AAABAAIAAAACAP//AAABAAIAAAADAP//AAADAAEAAAD//wUAAAAEAAEAAAADAAUAAAAFAAEAAAAAAAUAAAAGAAEAAAABAAUAAAAGAAEAAAACAAUAAAAGAAEAAAADAAAAAAAFAAIAAAADAAEAAAAFAAIAAAADAAIAAAAFAAIAAAADAAMAAAAFAAIAAAADAAQAAAAFAAIAAAA=") diff --git a/scenes/player_platform.tscn b/scenes/player_platform.tscn index 28b19a1..05fb033 100644 --- a/scenes/player_platform.tscn +++ b/scenes/player_platform.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=4 format=4 uid="uid://b7du4vul4bmpq"] [ext_resource type="TileSet" uid="uid://bv75bu0af04vs" path="res://generic/platform.tres" id="1_khkq2"] -[ext_resource type="Script" uid="uid://lw1ya3iu14uf" path="res://scripts/build_zone.gd" id="2_wpmwa"] -[ext_resource type="Script" uid="uid://x5edy155eg0s" path="res://scripts/entity_holder.gd" id="3_6hjoe"] +[ext_resource type="Script" uid="uid://lw1ya3iu14uf" path="res://scripts/placement_zone.gd" id="2_wpmwa"] +[ext_resource type="Script" uid="uid://x5edy155eg0s" path="res://scripts/grid_controller.gd" id="3_6hjoe"] [node name="PlayerPlatform" type="Node2D"] diff --git a/scripts/autoloads/registry.gd b/scripts/autoloads/registry.gd index e408bfa..76dbf46 100644 --- a/scripts/autoloads/registry.gd +++ b/scripts/autoloads/registry.gd @@ -1,9 +1,2 @@ +## Global class for runtime extends Node - -func _ready() -> void: - get_tree().scene_changed.connect(cleanup_runtime_cache) - -func cleanup_runtime_cache(): - build_zones.clear() - -var build_zones : Array[BuildZone] diff --git a/scripts/autoloads/runtime_player_data.gd b/scripts/autoloads/runtime_player_data.gd index 61510e1..4f199b3 100644 --- a/scripts/autoloads/runtime_player_data.gd +++ b/scripts/autoloads/runtime_player_data.gd @@ -1 +1,12 @@ +## Global class for player in-game data + extends Node + +func _ready() -> void: + get_tree().scene_changed.connect(cleanup_runtime_cache) + +## Method to cleanup all data that will be nulled +func cleanup_runtime_cache(): + build_zones.clear() + +var build_zones : Array[PlacementZone] diff --git a/scripts/entity_holder.gd b/scripts/grid_controller.gd similarity index 78% rename from scripts/entity_holder.gd rename to scripts/grid_controller.gd index 12a7d8b..f83ac92 100644 --- a/scripts/entity_holder.gd +++ b/scripts/grid_controller.gd @@ -1,16 +1,16 @@ extends Node2D -class_name EntityHolder +class_name GridController const GRID_SIZE : Vector2 = Vector2(16,16) -@export var building_zone : BuildZone -var constructions : Array[Construction] +@export var building_zone : PlacementZone +var constructions : Array[Structure] func _ready() -> void: constructions.resize(building_zone.get_capacity()) -func add_construction(construction : Construction) -> bool: +func add_construction(construction : Structure) -> bool: var construction_dp = construction.get_dimension_points() for point in construction_dp: if constructions[building_zone.indexify_global_point(construction.global_position + point)]: @@ -21,7 +21,7 @@ func add_construction(construction : Construction) -> bool: constructions[building_zone.indexify_global_point(construction.global_position + point)] = construction return true -func get_at(point : Vector2) -> Construction: +func get_at(point : Vector2) -> Structure: return constructions[building_zone.indexify_global_point(point)] func is_point_occupied(point : Vector2) -> bool: diff --git a/scripts/entity_holder.gd.uid b/scripts/grid_controller.gd.uid similarity index 100% rename from scripts/entity_holder.gd.uid rename to scripts/grid_controller.gd.uid diff --git a/scripts/gui/construction_button.gd b/scripts/gui/construction_button.gd index b56e8c8..a38d23e 100644 --- a/scripts/gui/construction_button.gd +++ b/scripts/gui/construction_button.gd @@ -1,6 +1,6 @@ extends Button -@export var constructible : Constructible +@export var constructible : Prototype func _ready() -> void: icon = constructible.preview diff --git a/scripts/gui/gui_event_bus.gd b/scripts/gui/gui_event_bus.gd index a5ab2b0..57b7d3b 100644 --- a/scripts/gui/gui_event_bus.gd +++ b/scripts/gui/gui_event_bus.gd @@ -2,5 +2,5 @@ extends Node @warning_ignore_start("unused_signal") -signal construction_selected(constructible : Constructible) -signal construction_placed(constructible : Constructible) +signal construction_selected(constructible : Prototype) +signal construction_placed(constructible : Prototype) diff --git a/scripts/construction_placer.gd b/scripts/placement_manager.gd similarity index 84% rename from scripts/construction_placer.gd rename to scripts/placement_manager.gd index 009466d..65f54ea 100644 --- a/scripts/construction_placer.gd +++ b/scripts/placement_manager.gd @@ -1,6 +1,6 @@ extends Node2D -var held_construction : Construction +var held_construction : Structure func _ready() -> void: GuiEventBus.construction_selected.connect(on_construction_selected) @@ -19,7 +19,7 @@ func _input(event: InputEvent) -> void: if event.is_action_pressed("plc_cancel"): held_construction.queue_free() -func on_construction_selected(constructible : Constructible): +func on_construction_selected(constructible : Prototype): if held_construction: held_construction.queue_free() held_construction = constructible.scene.instantiate() @@ -36,8 +36,8 @@ func _process(_delta: float) -> void: else: global_position = mouse_pos -func try_get_zone(point : Vector2) -> BuildZone: - for zone in Registry.build_zones: +func try_get_zone(point : Vector2) -> PlacementZone: + for zone in RuntimePlayerData.build_zones: if zone.is_global_point_in_zone(point): return zone return null diff --git a/scripts/construction_placer.gd.uid b/scripts/placement_manager.gd.uid similarity index 100% rename from scripts/construction_placer.gd.uid rename to scripts/placement_manager.gd.uid diff --git a/scripts/build_zone.gd b/scripts/placement_zone.gd similarity index 95% rename from scripts/build_zone.gd rename to scripts/placement_zone.gd index bc3a720..78d279e 100644 --- a/scripts/build_zone.gd +++ b/scripts/placement_zone.gd @@ -4,7 +4,7 @@ ## Class that helps to manage construction sites extends Marker2D -class_name BuildZone +class_name PlacementZone ## Rect that used for bounds check and conversions @export var building_rect : Rect2: @@ -15,11 +15,11 @@ class_name BuildZone get: return building_rect -@export var entity_holder : EntityHolder +@export var entity_holder : GridController func _ready() -> void: if not Engine.is_editor_hint(): - Registry.build_zones.append(self) + RuntimePlayerData.build_zones.append(self) func _draw() -> void: if Engine.is_editor_hint() and EditorInterface.get_inspector().get_edited_object() == self: diff --git a/scripts/build_zone.gd.uid b/scripts/placement_zone.gd.uid similarity index 100% rename from scripts/build_zone.gd.uid rename to scripts/placement_zone.gd.uid diff --git a/scripts/constructible.gd b/scripts/prototype.gd similarity index 76% rename from scripts/constructible.gd rename to scripts/prototype.gd index 5fbd326..94c1bb0 100644 --- a/scripts/constructible.gd +++ b/scripts/prototype.gd @@ -1,6 +1,6 @@ extends Resource -class_name Constructible +class_name Prototype @export var scene : PackedScene @export var preview : Texture2D diff --git a/scripts/constructible.gd.uid b/scripts/prototype.gd.uid similarity index 100% rename from scripts/constructible.gd.uid rename to scripts/prototype.gd.uid diff --git a/scripts/construction.gd b/scripts/structure.gd similarity index 87% rename from scripts/construction.gd rename to scripts/structure.gd index facfa7a..fd55466 100644 --- a/scripts/construction.gd +++ b/scripts/structure.gd @@ -1,7 +1,7 @@ @tool extends Node2D -class_name Construction +class_name Structure @export var dimensions : Rect2i = Rect2i(0,0,1,1): set(value): @@ -17,10 +17,10 @@ func _draw() -> void: for y in range(dimensions.size.y): draw_circle((dimensions.position+Vector2i(x,y)) * Vector2i(Globals.GRID_SIZE),2,Color.AQUA) -func get_relative(dv : Vector2) -> Construction: +func get_relative(dv : Vector2) -> Structure: return get_parent().get_at(global_position+dv) -func can_be_placed(zone : BuildZone) -> bool: +func can_be_placed(zone : PlacementZone) -> bool: for dp in get_dimension_points(): var point = global_position + dp if zone.is_global_point_in_zone(point) == false: @@ -29,7 +29,7 @@ func can_be_placed(zone : BuildZone) -> bool: return false return true -func try_place(zone : BuildZone) -> bool: +func try_place(zone : PlacementZone) -> bool: if can_be_placed(zone) == false: return false diff --git a/scripts/construction.gd.uid b/scripts/structure.gd.uid similarity index 100% rename from scripts/construction.gd.uid rename to scripts/structure.gd.uid From b0b659acd4ff32f04fdb1bfb62a9712f83152461 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sat, 11 Oct 2025 14:09:40 +0500 Subject: [PATCH 3/3] Documentation --- scenes/other_platform.tscn | 4 ++-- scenes/player_platform.tscn | 4 ++-- scripts/grid_controller.gd | 38 ++++++++++++++++++++++++------------ scripts/placement_manager.gd | 1 + scripts/placement_zone.gd | 2 +- scripts/prototype.gd | 5 +++++ scripts/structure.gd | 17 +++++++++++++--- 7 files changed, 51 insertions(+), 20 deletions(-) diff --git a/scenes/other_platform.tscn b/scenes/other_platform.tscn index 81dd25e..47d0b84 100644 --- a/scenes/other_platform.tscn +++ b/scenes/other_platform.tscn @@ -8,10 +8,10 @@ tile_map_data = PackedByteArray("AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAAAAAAIAAAAAAAEAAAAAAAMAAAAAAAEAAAAAAAQAAAAAAAEAAAABAAAAAAAAAAEAAAABAAEAAAAAAAEAAAABAAIAAAAAAAEAAAABAAMAAAAAAAAAAAABAAQAAAAAAAEAAAACAAAAAAAAAAAAAAACAAEAAAAAAAEAAAACAAIAAAAAAAEAAAACAAMAAAAAAAAAAAACAAQAAAAAAAAAAAD/////AAACAAEAAAD//wAAAAAEAAIAAAD//wEAAAAEAAIAAAD//wIAAAAEAAIAAAD//wMAAAAEAAIAAAD//wQAAAAEAAIAAAAAAP//AAABAAIAAAABAP//AAABAAIAAAACAP//AAABAAIAAAADAP//AAADAAEAAAD//wUAAAAEAAEAAAADAAUAAAAFAAEAAAAAAAUAAAAGAAEAAAABAAUAAAAGAAEAAAACAAUAAAAGAAEAAAADAAAAAAAFAAIAAAADAAEAAAAFAAIAAAADAAIAAAAFAAIAAAADAAMAAAAFAAIAAAADAAQAAAAFAAIAAAA=") tile_set = ExtResource("1_fs1oy") -[node name="BuildZone" type="Marker2D" parent="." node_paths=PackedStringArray("entity_holder")] +[node name="BuildZone" type="Marker2D" parent="." node_paths=PackedStringArray("grid_controller")] script = ExtResource("2_bwire") building_rect = Rect2(0, 0, 48, 80) -entity_holder = NodePath("../EntityHolder") +grid_controller = NodePath("../EntityHolder") metadata/_custom_type_script = "uid://lw1ya3iu14uf" [node name="EntityHolder" type="Node2D" parent="." node_paths=PackedStringArray("building_zone")] diff --git a/scenes/player_platform.tscn b/scenes/player_platform.tscn index 05fb033..ca73456 100644 --- a/scenes/player_platform.tscn +++ b/scenes/player_platform.tscn @@ -10,10 +10,10 @@ tile_map_data = PackedByteArray("AAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAEAAAADAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAGAAAAAAAAAAEAAAAHAAAAAAAAAAAAAAAIAAAAAAAAAAEAAAAJAAAAAAAAAAEAAAAKAAAAAAAAAAEAAAALAAAAAAAAAAAAAAAMAAAAAAAAAAEAAAANAAAAAAAAAAEAAAAOAAAAAAAAAAEAAAAPAAAAAAAAAAAAAAAQAAAAAAAAAAEAAAAQAAEAAAAAAAAAAAAPAAEAAAAAAAAAAAAOAAEAAAAAAAEAAAANAAEAAAAAAAAAAAAMAAEAAAAAAAAAAAALAAEAAAAAAAEAAAAKAAEAAAAAAAEAAAAJAAEAAAAAAAEAAAAIAAEAAAAAAAEAAAAHAAEAAAAAAAAAAAAGAAEAAAAAAAEAAAAFAAEAAAAAAAEAAAAEAAEAAAAAAAAAAAADAAEAAAAAAAAAAAACAAEAAAAAAAEAAAABAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAAAAABAAIAAAAAAAEAAAACAAIAAAAAAAEAAAACAAMAAAAAAAEAAAADAAMAAAAAAAAAAAADAAIAAAAAAAAAAAAEAAIAAAAAAAAAAAAFAAIAAAAAAAEAAAAGAAIAAAAAAAEAAAAHAAIAAAAAAAEAAAAIAAIAAAAAAAEAAAAJAAIAAAAAAAEAAAAKAAIAAAAAAAEAAAALAAIAAAAAAAAAAAAMAAIAAAAAAAEAAAANAAIAAAAAAAEAAAAOAAIAAAAAAAAAAAAPAAIAAAAAAAEAAAAQAAIAAAAAAAEAAAAQAAMAAAAAAAEAAAAPAAMAAAAAAAEAAAAOAAMAAAAAAAEAAAANAAMAAAAAAAAAAAANAAQAAAAAAAAAAAAMAAQAAAAAAAEAAAALAAQAAAAAAAEAAAAKAAQAAAAAAAEAAAAJAAQAAAAAAAAAAAAJAAMAAAAAAAAAAAAIAAMAAAAAAAAAAAAHAAMAAAAAAAEAAAAGAAMAAAAAAAAAAAAFAAMAAAAAAAEAAAAEAAMAAAAAAAEAAAABAAMAAAAAAAEAAAAAAAMAAAAAAAEAAAAAAAQAAAAAAAAAAAABAAQAAAAAAAEAAAACAAQAAAAAAAAAAAADAAQAAAAAAAAAAAAEAAQAAAAAAAEAAAAFAAQAAAAAAAAAAAAGAAQAAAAAAAAAAAAHAAQAAAAAAAAAAAAIAAQAAAAAAAEAAAAOAAQAAAAAAAEAAAAPAAQAAAAAAAEAAAAQAAQAAAAAAAEAAAAMAAMAAAAAAAAAAAALAAMAAAAAAAEAAAAKAAMAAAAAAAEAAAABAAUAAAAAAAEAAAAAAAUAAAAAAAAAAAACAAUAAAAAAAEAAAADAAUAAAAAAAEAAAAEAAUAAAAAAAEAAAAFAAUAAAAAAAEAAAAGAAUAAAAAAAEAAAAHAAUAAAAAAAEAAAAIAAUAAAAAAAEAAAAJAAUAAAAAAAEAAAAKAAUAAAAAAAAAAAALAAUAAAAAAAAAAAAMAAUAAAAAAAAAAAANAAUAAAAAAAAAAAAOAAUAAAAAAAEAAAAPAAUAAAAAAAAAAAAQAAUAAAAAAAAAAAAQAAYAAAAAAAEAAAAPAAYAAAAAAAAAAAAPAAcAAAAAAAAAAAAOAAcAAAAAAAAAAAAOAAYAAAAAAAAAAAANAAYAAAAAAAAAAAAMAAYAAAAAAAAAAAALAAYAAAAAAAEAAAAKAAYAAAAAAAEAAAAJAAYAAAAAAAEAAAAIAAYAAAAAAAEAAAAHAAYAAAAAAAAAAAAGAAYAAAAAAAEAAAAFAAYAAAAAAAAAAAAEAAYAAAAAAAEAAAADAAYAAAAAAAEAAAACAAYAAAAAAAEAAAABAAYAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAcAAAAAAAAAAAABAAcAAAAAAAAAAAACAAcAAAAAAAAAAAADAAcAAAAAAAAAAAAEAAcAAAAAAAEAAAAFAAcAAAAAAAAAAAAGAAcAAAAAAAAAAAAHAAcAAAAAAAAAAAAIAAcAAAAAAAEAAAAJAAcAAAAAAAAAAAAKAAcAAAAAAAEAAAALAAcAAAAAAAAAAAAMAAcAAAAAAAAAAAANAAcAAAAAAAEAAAAQAAcAAAAAAAAAAAARAAAAAAABAAEAAAARAAEAAAABAAEAAAARAAIAAAABAAEAAAARAAMAAAABAAEAAAARAAQAAAABAAEAAAARAAUAAAABAAEAAAARAAYAAAABAAEAAAARAAcAAAABAAEAAAD//wAAAAABAAAAAAD//wEAAAABAAAAAAD//wIAAAABAAAAAAD//wMAAAABAAAAAAD//wQAAAABAAAAAAD//wUAAAABAAAAAAD//wYAAAABAAAAAAD//wcAAAABAAAAAAAAAP//AAAAAAIAAAABAP//AAAAAAIAAAACAP//AAAAAAIAAAADAP//AAAAAAIAAAAEAP//AAAAAAIAAAAFAP//AAAAAAIAAAAGAP//AAAAAAIAAAAHAP//AAAAAAIAAAAIAP//AAAAAAIAAAAJAP//AAAAAAIAAAAKAP//AAAAAAIAAAALAP//AAAAAAIAAAAMAP//AAAAAAIAAAANAP//AAAAAAIAAAAOAP//AAAAAAIAAAAPAP//AAAAAAIAAAAQAP//AAAAAAIAAAD/////AAACAAIAAAARAP//AAADAAIAAAD//wgAAAADAAAAAAARAAgAAAAEAAAAAAAQAAgAAAACAAAAAAAPAAgAAAACAAAAAAAOAAgAAAACAAAAAAANAAgAAAACAAAAAAAMAAgAAAACAAAAAAALAAgAAAACAAAAAAAKAAgAAAACAAAAAAAJAAgAAAACAAAAAAAIAAgAAAACAAAAAAAHAAgAAAACAAAAAAAGAAgAAAACAAAAAAAFAAgAAAACAAAAAAAEAAgAAAACAAAAAAADAAgAAAACAAAAAAACAAgAAAACAAAAAAABAAgAAAACAAAAAAAAAAgAAAACAAAAAAA=") tile_set = ExtResource("1_khkq2") -[node name="BuildRect" type="Marker2D" parent="." node_paths=PackedStringArray("entity_holder")] +[node name="BuildRect" type="Marker2D" parent="." node_paths=PackedStringArray("grid_controller")] script = ExtResource("2_wpmwa") building_rect = Rect2(0, 0, 272, 128) -entity_holder = NodePath("../EntityHolder") +grid_controller = NodePath("../EntityHolder") [node name="EntityHolder" type="Node2D" parent="." node_paths=PackedStringArray("building_zone")] script = ExtResource("3_6hjoe") diff --git a/scripts/grid_controller.gd b/scripts/grid_controller.gd index f83ac92..15cb8b4 100644 --- a/scripts/grid_controller.gd +++ b/scripts/grid_controller.gd @@ -1,28 +1,42 @@ extends Node2D +# TODO: Make able to hold multiple placement zones, supporting uniform forms + +## Class that contains all structures of platform + class_name GridController -const GRID_SIZE : Vector2 = Vector2(16,16) +## Building zone controller uses for checks and capacity @export var building_zone : PlacementZone -var constructions : Array[Structure] + +## Internal structure storage +var structures : Array[Structure] func _ready() -> void: - constructions.resize(building_zone.get_capacity()) + structures.resize(building_zone.get_capacity()) -func add_construction(construction : Structure) -> bool: - var construction_dp = construction.get_dimension_points() - for point in construction_dp: - if constructions[building_zone.indexify_global_point(construction.global_position + point)]: +## Tries to add structure to its internal storage [br] +## Returns false if has colliding structures +func add_structure(structure : Structure) -> bool: + var structure_dp = structure.get_dimension_points() + for point in structure_dp: + if structures[building_zone.indexify_global_point(structure.global_position + point)]: return false - construction.reparent(self) - construction.global_position = building_zone.get_placement_position(construction.global_position) - for point in construction_dp: - constructions[building_zone.indexify_global_point(construction.global_position + point)] = construction + structure.reparent(self) + structure.global_position = building_zone.get_placement_position(structure.global_position) + + for point in structure_dp: + structures[building_zone.indexify_global_point(structure.global_position + point)] = structure return true +## Returns structure at point. [br] +## Returns null if no structure is at point func get_at(point : Vector2) -> Structure: - return constructions[building_zone.indexify_global_point(point)] + var index = building_zone.indexify_global_point(point) + if index == -1: + return null + return structures[index] func is_point_occupied(point : Vector2) -> bool: return get_at(point) != null diff --git a/scripts/placement_manager.gd b/scripts/placement_manager.gd index 65f54ea..d58e676 100644 --- a/scripts/placement_manager.gd +++ b/scripts/placement_manager.gd @@ -1,5 +1,6 @@ extends Node2D +## Currently held structure var held_construction : Structure func _ready() -> void: diff --git a/scripts/placement_zone.gd b/scripts/placement_zone.gd index 78d279e..84d1efa 100644 --- a/scripts/placement_zone.gd +++ b/scripts/placement_zone.gd @@ -15,7 +15,7 @@ class_name PlacementZone get: return building_rect -@export var entity_holder : GridController +@export var grid_controller : GridController func _ready() -> void: if not Engine.is_editor_hint(): diff --git a/scripts/prototype.gd b/scripts/prototype.gd index 94c1bb0..83f60a9 100644 --- a/scripts/prototype.gd +++ b/scripts/prototype.gd @@ -1,6 +1,11 @@ extends Resource +## Player instantiatable resource + class_name Prototype +## Scene to instantiate @export var scene : PackedScene + +## UI Preview @export var preview : Texture2D diff --git a/scripts/structure.gd b/scripts/structure.gd index fd55466..16792e4 100644 --- a/scripts/structure.gd +++ b/scripts/structure.gd @@ -1,8 +1,10 @@ @tool extends Node2D +## Game object that interact with other structures in its grid space class_name Structure +## Dimensions of structure in grid tiles @export var dimensions : Rect2i = Rect2i(0,0,1,1): set(value): dimensions = value @@ -11,30 +13,39 @@ class_name Structure get: return dimensions +## Debug draw of points func _draw() -> void: if Engine.is_editor_hint(): for x in range(dimensions.size.x): for y in range(dimensions.size.y): draw_circle((dimensions.position+Vector2i(x,y)) * Vector2i(Globals.GRID_SIZE),2,Color.AQUA) +## Get structure at tile coordinates relative to this structure [br] +## dv : Vector2 - get position in tiles [br] func get_relative(dv : Vector2) -> Structure: - return get_parent().get_at(global_position+dv) + return get_parent().get_at(global_position+dv*Globals.GRID_SIZE) +## Check structure is in zone and does not collide with any other structures [br] +## Returns true if structure is in zone and does not collide with any other structure [br] +## Returns false if structure is not in zone or does not collide with any other structure func can_be_placed(zone : PlacementZone) -> bool: for dp in get_dimension_points(): var point = global_position + dp if zone.is_global_point_in_zone(point) == false: return false - if zone.entity_holder.is_point_occupied(point): + if zone.grid_controller.is_point_occupied(point): return false return true +## Tries to place structure in zone's grid controller +## Returns false if structure is not in zone or collides with any structure func try_place(zone : PlacementZone) -> bool: if can_be_placed(zone) == false: return false - return zone.entity_holder.add_construction(self) + return zone.grid_controller.add_structure(self) +## Returns array of integer points in dimensions func get_dimension_points() -> Array[Vector2]: var result : Array[Vector2] = [] result.resize(dimensions.size.x*dimensions.size.y)