project-villain/tiles/base_tile/base_tile.gd

144 lines
2.9 KiB
GDScript

extends Node3D
class_name Tile
var id = null
#This tile's current construction and selection modes.
var construction_mode = 0
var selection_mode = 0
var orange = preload("res://tiles/base_tile/orange.tres")
var gray = preload("res://tiles/base_tile/gray.tres")
var red = preload("res://tiles/base_tile/red.tres")
var blue = preload("res://tiles/base_tile/blue.tres")
var 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 DIRECTION {NORTH, EAST, SOUTH, WEST}
enum FACE_MODE {NONE, FULL, PARTIAL, DOOR}
var direction_vector_array = [
# North
Vector3i(0, 0, -1),
# East
Vector3i(1, 0, 0),
# South
Vector3i(0, 0, 1),
# West
Vector3i(-1, 0, 0),
]
var wall_position_array = [
# North
Vector3i(0, 0, 0),
# East
Vector3i(1, 0, 0),
# South
Vector3i(1, 0, 1),
# West
Vector3i(0, 0, 1),
]
var load_wall = preload("res://tiles/base_tile/base_wall.tscn")
var grid_pos = null
var wall_dict = {}
var room_id = null
signal wall_built
func _ready():
$Label3D.text = str(grid_pos)
pass
func invalid_this_tile():
pass
func update_face(direction, mode, door = null):
#Updates the faces of this tile.
var face = direction_vector_array[direction]
if mode == FACE_MODE.NONE:
for i in wall_dict.keys():
wall_dict[i].queue_free()
wall_dict.erase(i)
if mode == FACE_MODE.FULL:
if not wall_dict.has(face):
var wall = load_wall.instantiate()
wall.position = wall_position_array[direction]
wall.rotation_degrees = Vector3(0, direction * -90, 0)
wall_dict[face] = wall
emit_signal("wall_built", room_id)
add_child(wall)
if mode == FACE_MODE.DOOR:
wall_dict[face].queue_free()
wall_dict.erase(face)
wall_dict[face] = door
func update(sel_mode: int = SEL_MODE.NONE, con_mode: int = CON_MODE.NONE):
#Updates the selection and construction modes of this tile.
if sel_mode != selection_mode:
selection_mode = sel_mode
if sel_mode == SEL_MODE.NONE:
$Floor/FloorMesh.set_material_overlay(null)
elif sel_mode == SEL_MODE.ROOM:
for i in $Walls.get_children():
i.Mesh.set_material_override(orange)
elif sel_mode == SEL_MODE.BUILD:
$Floor/FloorMesh.set_material_overlay(lightblue)
elif sel_mode == SEL_MODE.INVALID:
$Floor/FloorMesh.set_material_overlay(orange)
else:
pass
if con_mode:
if con_mode != construction_mode:
construction_mode = con_mode
if con_mode == CON_MODE.NON_INTERACTABLE:
pass
elif con_mode == CON_MODE.CLOSED:
$Floor/FloorMesh.set_material_override(gray)
pass
elif con_mode == CON_MODE.OPEN:
pass
elif con_mode == CON_MODE.BUILT:
$Floor/FloorMesh.set_material_override(null)
pass
elif con_mode == CON_MODE.REINFORCED:
pass
elif con_mode == CON_MODE.CONSTRUCTION:
pass
else:
pass