2024-03-06 04:00:54 +01:00
|
|
|
extends Area3D
|
|
|
|
|
class_name InsectTile
|
2024-03-04 16:04:40 +01:00
|
|
|
|
2024-03-14 19:30:18 +01:00
|
|
|
var map_reference: HexGrid
|
2024-03-06 04:00:54 +01:00
|
|
|
|
2024-03-14 19:30:18 +01:00
|
|
|
|
|
|
|
|
var coordinates: Vector4i
|
2024-03-06 19:55:13 +01:00
|
|
|
var layer: int = 0
|
|
|
|
|
|
2024-03-05 15:47:11 +01:00
|
|
|
@export var is_black: bool = false
|
2024-03-04 16:04:40 +01:00
|
|
|
@export var resource: TileResource
|
2024-03-05 15:47:11 +01:00
|
|
|
|
|
|
|
|
@onready var hexagon_small = $HexagonSmall
|
|
|
|
|
|
2024-03-14 19:30:18 +01:00
|
|
|
var hat: InsectTile = null
|
|
|
|
|
|
2024-03-06 19:55:13 +01:00
|
|
|
var build_in_progress: bool = false
|
|
|
|
|
var move_in_progress: bool = false
|
|
|
|
|
|
2024-03-14 19:30:18 +01:00
|
|
|
|
|
|
|
|
var deactivated: bool = false
|
|
|
|
|
|
2024-03-06 04:00:54 +01:00
|
|
|
var hovered: bool = false
|
|
|
|
|
|
2024-03-06 19:55:13 +01:00
|
|
|
var selected: bool = false
|
|
|
|
|
|
2024-03-06 04:00:54 +01:00
|
|
|
var hover_shader: ShaderMaterial = preload("res://InsectTiles/HoverShader.tres")
|
|
|
|
|
|
2024-03-06 19:55:13 +01:00
|
|
|
const SELECTION_FAILED_MAT: ShaderMaterial = preload("res://InsectTiles/SelectionFailedMat.tres")
|
|
|
|
|
|
2024-03-06 04:00:54 +01:00
|
|
|
var mat: StandardMaterial3D
|
|
|
|
|
|
2024-03-06 19:55:13 +01:00
|
|
|
var tween: Tween
|
|
|
|
|
|
|
|
|
|
var tweening: bool = false
|
|
|
|
|
|
|
|
|
|
func _ready() -> void:
|
2024-03-05 15:47:11 +01:00
|
|
|
if is_black:
|
2024-03-06 04:00:54 +01:00
|
|
|
hexagon_small.set_surface_override_material(0, resource.material_black.duplicate())
|
2024-03-05 15:47:11 +01:00
|
|
|
else:
|
2024-03-06 04:00:54 +01:00
|
|
|
hexagon_small.set_surface_override_material(0, resource.material_white.duplicate())
|
|
|
|
|
|
|
|
|
|
mat = hexagon_small.get_surface_override_material(0)
|
2024-03-06 19:55:13 +01:00
|
|
|
|
2024-03-14 19:30:18 +01:00
|
|
|
mat.next_pass = hover_shader.duplicate()
|
|
|
|
|
|
2024-03-06 19:55:13 +01:00
|
|
|
GameEvents.insect_selected.connect(_on_insect_selected)
|
|
|
|
|
GameEvents.insect_placed.connect(_on_insect_placed)
|
2024-03-14 19:30:18 +01:00
|
|
|
GameEvents.insect_placement_cancelled.connect(_on_insect_placement_cancelled, CONNECT_DEFERRED)
|
2024-03-06 19:55:13 +01:00
|
|
|
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)
|
|
|
|
|
|
2024-03-14 19:30:18 +01:00
|
|
|
|
|
|
|
|
func _on_insect_tile_moved(tile: InsectTile, to: Vector4i) -> void:
|
2024-03-06 19:55:13 +01:00
|
|
|
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
|
|
|
|
|
|
2024-03-14 19:30:18 +01:00
|
|
|
func _on_insect_placed(resource: TileResource, is_black: bool, pos: Vector4i) -> void:
|
2024-03-06 19:55:13 +01:00
|
|
|
build_in_progress = false
|
|
|
|
|
|
|
|
|
|
func _on_insect_placement_cancelled() -> void:
|
|
|
|
|
build_in_progress = false
|
|
|
|
|
|
2024-03-14 19:30:18 +01:00
|
|
|
func _on_insect_selected(button: InsectButton, is_black: bool) -> void:
|
2024-03-06 19:55:13 +01:00
|
|
|
build_in_progress = true
|
|
|
|
|
|
2024-03-06 04:00:54 +01:00
|
|
|
func _process(delta):
|
|
|
|
|
if Input.is_action_just_pressed("place_tile"):
|
2024-03-14 19:30:18 +01:00
|
|
|
if deactivated:
|
|
|
|
|
return
|
2024-03-06 19:55:13 +01:00
|
|
|
|
2024-03-14 19:30:18 +01:00
|
|
|
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
|
2024-03-06 19:55:13 +01:00
|
|
|
|
|
|
|
|
if tween != null:
|
|
|
|
|
tween.kill()
|
2024-03-14 19:30:18 +01:00
|
|
|
|
2024-03-06 19:55:13 +01:00
|
|
|
tween = get_tree().create_tween()
|
2024-03-14 19:30:18 +01:00
|
|
|
#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)
|
2024-03-06 19:55:13 +01:00
|
|
|
|
2024-03-14 19:30:18 +01:00
|
|
|
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)
|
|
|
|
|
|
2024-03-06 04:00:54 +01:00
|
|
|
|
|
|
|
|
func _on_mouse_entered():
|
2024-03-14 19:30:18 +01:00
|
|
|
hovered = true
|
|
|
|
|
|
|
|
|
|
if not deactivated:
|
|
|
|
|
hover()
|
2024-03-06 19:55:13 +01:00
|
|
|
|
2024-03-06 04:00:54 +01:00
|
|
|
func _on_mouse_exited():
|
|
|
|
|
hovered = false
|
|
|
|
|
|
2024-03-14 19:30:18 +01:00
|
|
|
if not selected:
|
|
|
|
|
unhover()
|