extends Area3D class_name InsectTile var map_reference: HexGrid var coordinates: Vector4i var layer: int = 0 @export var is_black: bool = false @export var resource: TileResource @onready var hexagon_small = $HexagonSmall var hat: InsectTile = null var build_in_progress: bool = false var move_in_progress: bool = false var deactivated: bool = false var hovered: bool = false var selected: bool = false var hover_shader: ShaderMaterial = preload("res://InsectTiles/HoverShader.tres") const SELECTION_FAILED_MAT: ShaderMaterial = preload("res://InsectTiles/SelectionFailedMat.tres") var mat: StandardMaterial3D var tween: Tween var tweening: bool = false func _ready() -> void: if is_black: hexagon_small.set_surface_override_material(0, resource.material_black.duplicate()) else: hexagon_small.set_surface_override_material(0, resource.material_white.duplicate()) mat = hexagon_small.get_surface_override_material(0) mat.next_pass = hover_shader.duplicate() GameEvents.insect_selected.connect(_on_insect_selected) GameEvents.insect_placed.connect(_on_insect_placed) GameEvents.insect_placement_cancelled.connect(_on_insect_placement_cancelled, CONNECT_DEFERRED) GameEvents.insect_tile_selected.connect(_on_insect_tile_selected) GameEvents.insect_tile_deselected.connect(_on_insect_tile_deselected) GameEvents.insect_tile_moved.connect(_on_insect_tile_moved) func _on_insect_tile_moved(tile: InsectTile, to: Vector4i) -> void: move_in_progress = false selected = false if tile == self: hovered = false if not tweening: mat.next_pass = null func _on_insect_tile_deselected(tile: InsectTile) -> void: move_in_progress = false selected = false func _on_insect_tile_selected(tile: InsectTile) -> void: move_in_progress = true if tile == self: selected = true func _on_insect_placed(resource: TileResource, is_black: bool, pos: Vector4i) -> void: build_in_progress = false func _on_insect_placement_cancelled() -> void: build_in_progress = false func _on_insect_selected(button: InsectButton, is_black: bool) -> void: build_in_progress = true func _process(delta): if Input.is_action_just_pressed("place_tile"): if deactivated: return if not hovered: return ## Check with map if we can be placed #if not map_reference.can_move(self): #return # # #if resource.movement_behaviour == null: ## TODO: Play fail animation/tween #return # #var spaces = resource.movement_behaviour.get_available_spaces(coordinates, map_reference) # #if spaces.is_empty(): ##GameEvents.insect_tile_selection_request_failed.emit(tile) #return GameEvents.insect_tile_selected.emit(self) func hover() -> void: #if GameData.is_player_black != is_black: #return if tween != null: tween.kill() tween = get_tree().create_tween() #tween.tween_property(self, "position", Vector3(0, 0, 5), 0.5).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_SPRING) tween.tween_method(tween_hover_shader, Color(0, 0, 0, 0), Color(0, 0, 0, 1), 0.1).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_EXPO) func tween_hover_shader(color: Color) -> void: if mat.next_pass != null: mat.next_pass.set_shader_parameter("albedo", color) mat.next_pass.set_shader_parameter("emission_color", color) func unhover() -> void: #if GameData.is_player_black != is_black: #return if tween != null: tween.kill() tween = get_tree().create_tween() #tween.tween_property(hex, "position", Vector2(0, -16), 0.1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_SPRING) tween.tween_method(tween_hover_shader, Color(0, 0, 0, 1), Color(0, 0, 0, 0), 0.25).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_EXPO) func _on_mouse_entered(): hovered = true if not deactivated: hover() func _on_mouse_exited(): hovered = false if not selected: unhover()