testproject/tile_map.gd

92 lines
3.0 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends Node2D
enum StructType {
EMPTY_ROOM, # 0. Пустой модуль
RESIDENTIAL_ROOM, # 1. Жилой Модуль
LABORATORY_ROOM, # 2. Лабораторный Модуль
ENERGY_ROOM, # 3. Энергетический Модуль
FARM_ROOM, # 4. Фермерский Модуль
LIFE_SUPPORT_ROOM, # 5. Модуль Жизнеобеспечения
CONTROL_ROOM, # 6. Модуль Управления
OBSERVATORY_ROOM, # 7. Модуль Обсерватории
MEDICAL_ROOM, # 8. Медицинский Модуль
GEOLOGICAL_ROOM, # 9. Геологический Модуль
RESOURCE_EXTRACTION_ROOM, # 10. Модуль Добычи и Переработки Ресурсов
COMMUNICATIONS_ROOM # 11. Модуль Связи и Навигации_
}
enum struct_fields {
SOURCE_ID,
SIZE,
POS_ATLAS,
LAYER
}
@onready var structs = {
StructType.EMPTY_ROOM: {
struct_fields.SOURCE_ID: 1,
struct_fields.SIZE: Vector2i(5,5),
struct_fields.POS_ATLAS: Vector2i(0,0),
struct_fields.LAYER: $buildings/buildings0
}
}
var layers: Array[TileMapLayer]
var layers_dict: Dictionary
func _list_childrens(node: Node2D):
for child in node.get_children():
if child is TileMapLayer:
layers.append(child)
layers_dict.get_or_add(child.name, child)
elif child is Node2D:
_list_childrens(child)
pass
func _ready() -> void:
layers = []
_list_childrens(self)
func get_maxZ(tile_pos: Vector2i) -> int:
for layer in layers:
if layer.get_cell_source_id(tile_pos) != -1:
return layer.z_index
return -1
func remove_struct(pos: Vector2i):
for layer in layers:
var tiledata: TileData = layer.get_cell_tile_data(pos)
if tiledata != null and tiledata.get_custom_data("is_center"):
var struct_size = tiledata.get_custom_data("struct_size")
var half_size = Vector2i(struct_size.x / 2, struct_size.y / 2)
for x in range(struct_size.x):
for y in range(struct_size.y):
var offset = Vector2i(x, y)
var tile_pos = pos+offset-half_size
layer.erase_cell(tile_pos)
return
func place_struct(pos: Vector2i, type: StructType):
if not structs.has(type):
return
var struct_size = structs[type][struct_fields.SIZE]
var layer = structs[type][struct_fields.LAYER]
var source_id = structs[type][struct_fields.SOURCE_ID]
var pos_atlas = structs[type][struct_fields.POS_ATLAS]
var half_size = Vector2i(struct_size.x / 2, struct_size.y / 2)
#Is place free check
for x in range(struct_size.x):
for y in range(struct_size.y):
var offset = Vector2i(x, y)
var tile_pos = pos+offset-half_size
if get_maxZ(tile_pos) >= layer.z_index:
return
for x in range(struct_size.x):
for y in range(struct_size.y):
var offset = Vector2i(x, y)
var tile_pos = pos+offset-half_size
layer.set_cell(tile_pos, source_id, Vector2i(x,y)+pos_atlas)