From b0b659acd4ff32f04fdb1bfb62a9712f83152461 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sat, 11 Oct 2025 14:09:40 +0500 Subject: [PATCH] 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)