144 lines
2.9 KiB
GDScript
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
|