Documentation

This commit is contained in:
Rendo 2025-10-11 14:09:40 +05:00
commit b0b659acd4
7 changed files with 51 additions and 20 deletions

View file

@ -8,10 +8,10 @@
tile_map_data = PackedByteArray("AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAAAAAAIAAAAAAAEAAAAAAAMAAAAAAAEAAAAAAAQAAAAAAAEAAAABAAAAAAAAAAEAAAABAAEAAAAAAAEAAAABAAIAAAAAAAEAAAABAAMAAAAAAAAAAAABAAQAAAAAAAEAAAACAAAAAAAAAAAAAAACAAEAAAAAAAEAAAACAAIAAAAAAAEAAAACAAMAAAAAAAAAAAACAAQAAAAAAAAAAAD/////AAACAAEAAAD//wAAAAAEAAIAAAD//wEAAAAEAAIAAAD//wIAAAAEAAIAAAD//wMAAAAEAAIAAAD//wQAAAAEAAIAAAAAAP//AAABAAIAAAABAP//AAABAAIAAAACAP//AAABAAIAAAADAP//AAADAAEAAAD//wUAAAAEAAEAAAADAAUAAAAFAAEAAAAAAAUAAAAGAAEAAAABAAUAAAAGAAEAAAACAAUAAAAGAAEAAAADAAAAAAAFAAIAAAADAAEAAAAFAAIAAAADAAIAAAAFAAIAAAADAAMAAAAFAAIAAAADAAQAAAAFAAIAAAA=") tile_map_data = PackedByteArray("AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAAAAAAIAAAAAAAEAAAAAAAMAAAAAAAEAAAAAAAQAAAAAAAEAAAABAAAAAAAAAAEAAAABAAEAAAAAAAEAAAABAAIAAAAAAAEAAAABAAMAAAAAAAAAAAABAAQAAAAAAAEAAAACAAAAAAAAAAAAAAACAAEAAAAAAAEAAAACAAIAAAAAAAEAAAACAAMAAAAAAAAAAAACAAQAAAAAAAAAAAD/////AAACAAEAAAD//wAAAAAEAAIAAAD//wEAAAAEAAIAAAD//wIAAAAEAAIAAAD//wMAAAAEAAIAAAD//wQAAAAEAAIAAAAAAP//AAABAAIAAAABAP//AAABAAIAAAACAP//AAABAAIAAAADAP//AAADAAEAAAD//wUAAAAEAAEAAAADAAUAAAAFAAEAAAAAAAUAAAAGAAEAAAABAAUAAAAGAAEAAAACAAUAAAAGAAEAAAADAAAAAAAFAAIAAAADAAEAAAAFAAIAAAADAAIAAAAFAAIAAAADAAMAAAAFAAIAAAADAAQAAAAFAAIAAAA=")
tile_set = ExtResource("1_fs1oy") 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") script = ExtResource("2_bwire")
building_rect = Rect2(0, 0, 48, 80) building_rect = Rect2(0, 0, 48, 80)
entity_holder = NodePath("../EntityHolder") grid_controller = NodePath("../EntityHolder")
metadata/_custom_type_script = "uid://lw1ya3iu14uf" metadata/_custom_type_script = "uid://lw1ya3iu14uf"
[node name="EntityHolder" type="Node2D" parent="." node_paths=PackedStringArray("building_zone")] [node name="EntityHolder" type="Node2D" parent="." node_paths=PackedStringArray("building_zone")]

View file

@ -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_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") 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") script = ExtResource("2_wpmwa")
building_rect = Rect2(0, 0, 272, 128) 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")] [node name="EntityHolder" type="Node2D" parent="." node_paths=PackedStringArray("building_zone")]
script = ExtResource("3_6hjoe") script = ExtResource("3_6hjoe")

View file

@ -1,28 +1,42 @@
extends Node2D extends Node2D
# TODO: Make able to hold multiple placement zones, supporting uniform forms
## Class that contains all structures of platform
class_name GridController class_name GridController
const GRID_SIZE : Vector2 = Vector2(16,16)
## Building zone controller uses for checks and capacity
@export var building_zone : PlacementZone @export var building_zone : PlacementZone
var constructions : Array[Structure]
## Internal structure storage
var structures : Array[Structure]
func _ready() -> void: func _ready() -> void:
constructions.resize(building_zone.get_capacity()) structures.resize(building_zone.get_capacity())
func add_construction(construction : Structure) -> bool: ## Tries to add structure to its internal storage [br]
var construction_dp = construction.get_dimension_points() ## Returns false if has colliding structures
for point in construction_dp: func add_structure(structure : Structure) -> bool:
if constructions[building_zone.indexify_global_point(construction.global_position + point)]: 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 return false
construction.reparent(self) structure.reparent(self)
construction.global_position = building_zone.get_placement_position(construction.global_position) structure.global_position = building_zone.get_placement_position(structure.global_position)
for point in construction_dp:
constructions[building_zone.indexify_global_point(construction.global_position + point)] = construction for point in structure_dp:
structures[building_zone.indexify_global_point(structure.global_position + point)] = structure
return true return true
## Returns structure at point. [br]
## Returns null if no structure is at point
func get_at(point : Vector2) -> Structure: 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: func is_point_occupied(point : Vector2) -> bool:
return get_at(point) != null return get_at(point) != null

View file

@ -1,5 +1,6 @@
extends Node2D extends Node2D
## Currently held structure
var held_construction : Structure var held_construction : Structure
func _ready() -> void: func _ready() -> void:

View file

@ -15,7 +15,7 @@ class_name PlacementZone
get: get:
return building_rect return building_rect
@export var entity_holder : GridController @export var grid_controller : GridController
func _ready() -> void: func _ready() -> void:
if not Engine.is_editor_hint(): if not Engine.is_editor_hint():

View file

@ -1,6 +1,11 @@
extends Resource extends Resource
## Player instantiatable resource
class_name Prototype class_name Prototype
## Scene to instantiate
@export var scene : PackedScene @export var scene : PackedScene
## UI Preview
@export var preview : Texture2D @export var preview : Texture2D

View file

@ -1,8 +1,10 @@
@tool @tool
extends Node2D extends Node2D
## Game object that interact with other structures in its grid space
class_name Structure class_name Structure
## Dimensions of structure in grid tiles
@export var dimensions : Rect2i = Rect2i(0,0,1,1): @export var dimensions : Rect2i = Rect2i(0,0,1,1):
set(value): set(value):
dimensions = value dimensions = value
@ -11,30 +13,39 @@ class_name Structure
get: get:
return dimensions return dimensions
## Debug draw of points
func _draw() -> void: func _draw() -> void:
if Engine.is_editor_hint(): if Engine.is_editor_hint():
for x in range(dimensions.size.x): for x in range(dimensions.size.x):
for y in range(dimensions.size.y): for y in range(dimensions.size.y):
draw_circle((dimensions.position+Vector2i(x,y)) * Vector2i(Globals.GRID_SIZE),2,Color.AQUA) 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: 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: func can_be_placed(zone : PlacementZone) -> bool:
for dp in get_dimension_points(): for dp in get_dimension_points():
var point = global_position + dp var point = global_position + dp
if zone.is_global_point_in_zone(point) == false: if zone.is_global_point_in_zone(point) == false:
return false return false
if zone.entity_holder.is_point_occupied(point): if zone.grid_controller.is_point_occupied(point):
return false return false
return true 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: func try_place(zone : PlacementZone) -> bool:
if can_be_placed(zone) == false: if can_be_placed(zone) == false:
return 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]: func get_dimension_points() -> Array[Vector2]:
var result : Array[Vector2] = [] var result : Array[Vector2] = []
result.resize(dimensions.size.x*dimensions.size.y) result.resize(dimensions.size.x*dimensions.size.y)