project-villain/tiles/base_tile/base_tile.gd

156 lines
3.5 KiB
GDScript

extends Node3D
class_name Tile
var place_id: int = 0
#This tile's current construction and selection modes.
@export var construction_mode = 0: set = update_construction
@export var selection_mode = 0: set = update_selection
const orange = preload("res://tiles/base_tile/orange.tres")
const gray = preload("res://tiles/base_tile/gray.tres")
const red = preload("res://tiles/base_tile/red.tres")
const blue = preload("res://tiles/base_tile/blue.tres")
const lightblue = preload("res://tiles/base_tile/lightblue.tres")
#Lists of possible states for various modes.
enum SEL_MODE {NONE, ROOM, BUILD, INVALID}
enum CON_MODE {NONE, NON_INTERACTABLE, CLOSED, OPEN, BUILT, REINFORCED, CONSTRUCTION}
#enum FACE_MODE {NONE, FULL, PARTIAL, DOOR}
const direction_vector_dict = {
"North": Vector3i(0, 0, -1),
"East": Vector3i(1, 0, 0),
"South": Vector3i(0, 0, 1),
"West": Vector3i(-1, 0, 0),
}
const wall_position_dict = {
"North": Vector3i(0, 0, 0),
"East": Vector3i(1, 0, 0),
"South": Vector3i(1, 0, 1),
"West": Vector3i(0, 0, 1),
}
const load_wall = preload("res://tiles/base_tile/base_wall.tscn")
var grid_pos = null
var face_dict = {}: set = update_faces
var lookup_tile_to_room = []
var neighbor_dict = {}
signal neighbor_request
func save():
var room_ids: Array
for i in lookup_tile_to_room:
room_ids.append(i.get_instance_id())
var save_data = {
# Basics
"id": self.get_instance_id(),
"type": "Tile",
"scene_file_path": scene_file_path,
"parent": get_parent().get_path(),
# Connections
"place_id": place_id,
"room_ids": room_ids,
# Data
"position": position,
"grid_pos": grid_pos,
"face_dict": face_dict.keys(),
"construction_mode": construction_mode,
}
return save_data
func update_faces(new_dict):
for i in new_dict.keys():
if face_dict.has(i):
if face_dict[i] == new_dict[i]:
continue
face_dict[i].queue_free()
face_dict[i] = null
if new_dict[i] is Door:
face_dict[i] = new_dict[i]
continue
var direction: String = direction_vector_dict.find_key(i)
var wall = load_wall.instantiate()
wall.position = wall_position_dict[direction]
wall.name = str(direction, "Wall")
match direction:
"East":
wall.rotation_degrees = Vector3(0, -90, 0)
"South":
wall.rotation_degrees = Vector3(0, -180, 0)
"West":
wall.rotation_degrees = Vector3(0, -270, 0)
$Walls.add_child(wall)
face_dict[i] = wall
func update_neighbors():
neighbor_dict = {}
emit_signal("neighbor_request", self, grid_pos, direction_vector_dict)
pass
func update_construction(mode):
construction_mode = mode
match mode:
CON_MODE.NON_INTERACTABLE:
face_dict = {}
CON_MODE.CLOSED:
face_dict = {}
$Floor/FloorMesh.set_material_override(gray)
CON_MODE.OPEN:
face_dict = {}
CON_MODE.BUILT:
$Floor/FloorMesh.set_material_override(null)
if not face_dict:
update_neighbors()
var temp_face_dict = {}
for i in neighbor_dict.keys():
if not neighbor_dict[i].lookup_tile_to_room == lookup_tile_to_room:
temp_face_dict[i] = null
face_dict = temp_face_dict.duplicate()
CON_MODE.REINFORCED:
face_dict = {}
CON_MODE.CONSTRUCTION:
face_dict = {}
func update_selection(mode):
selection_mode = mode
match mode:
SEL_MODE.NONE:
$Floor/FloorMesh.set_material_overlay(null)
SEL_MODE.ROOM:
for i in $Walls.get_children():
i.Mesh.set_material_override(orange)
SEL_MODE.BUILD:
$Floor/FloorMesh.set_material_overlay(lightblue)
SEL_MODE.INVALID:
$Floor/FloorMesh.set_material_overlay(orange)