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