TODO: Fix UI Button reaching 0 not greying out, fix state behaviour for selected tiles
This commit is contained in:
parent
b9df0b4361
commit
5b79dc9822
9 changed files with 325 additions and 95 deletions
117
Tile/Tile.gd
117
Tile/Tile.gd
|
|
@ -2,37 +2,142 @@ extends Area3D
|
|||
class_name InsectTile
|
||||
|
||||
|
||||
@export var coordinates: Vector2i
|
||||
var coordinates: HexGrid.CubeCoordinates
|
||||
var layer: int = 0
|
||||
|
||||
@export var is_black: bool = false
|
||||
@export var resource: TileResource
|
||||
|
||||
@onready var hexagon_small = $HexagonSmall
|
||||
|
||||
var build_in_progress: bool = false
|
||||
var move_in_progress: 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
|
||||
|
||||
func _ready() -> void:
|
||||
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)
|
||||
|
||||
GameEvents.insect_tile_selection_request_failed.connect(_on_insect_tile_request_failed)
|
||||
GameEvents.insect_tile_selection_request_successful.connect(_on_insect_tile_selection_request_sucessful)
|
||||
GameEvents.insect_selected.connect(_on_insect_selected)
|
||||
GameEvents.insect_placed.connect(_on_insect_placed)
|
||||
GameEvents.insect_placement_cancelled.connect(_on_insect_placement_cancelled)
|
||||
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: HexGrid.CubeCoordinates) -> 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: HexGrid.CubeCoordinates) -> void:
|
||||
build_in_progress = false
|
||||
|
||||
func _on_insect_placement_cancelled() -> void:
|
||||
build_in_progress = false
|
||||
|
||||
func _on_insect_selected(resource: TileResource, is_black: bool) -> void:
|
||||
build_in_progress = true
|
||||
|
||||
func _on_insect_tile_selection_request_sucessful(tile: InsectTile) -> void:
|
||||
if tile != self:
|
||||
return
|
||||
|
||||
GameEvents.insect_tile_selected.emit(self)
|
||||
|
||||
func _tween_shader(value: Color) -> void:
|
||||
var shader: ShaderMaterial = mat.next_pass
|
||||
shader.set_shader_parameter("albedo", value)
|
||||
pass
|
||||
|
||||
func _shader_done() -> void:
|
||||
tweening = false
|
||||
|
||||
if hovered:
|
||||
mat.next_pass = hover_shader
|
||||
else:
|
||||
mat.next_pass = null
|
||||
|
||||
func _process(delta):
|
||||
if Input.is_action_just_pressed("place_tile"):
|
||||
if hovered:
|
||||
GameEvents.insect_tile_selected.emit(self)
|
||||
if hovered and not (build_in_progress or move_in_progress):
|
||||
# check if is movable, either with direct reference to the map, or by ping-ponging a signal
|
||||
# request_selection
|
||||
# selection_reguest_successfull
|
||||
# selection_request_failed
|
||||
|
||||
GameEvents.insect_tile_request_selection.emit(self)
|
||||
|
||||
func _on_insect_tile_request_failed(tile) -> void:
|
||||
move_in_progress = false
|
||||
selected = false
|
||||
|
||||
if tile != self:
|
||||
return
|
||||
|
||||
hovered = false
|
||||
|
||||
# siomulate a failed selection request
|
||||
mat.next_pass = SELECTION_FAILED_MAT
|
||||
|
||||
tweening = true
|
||||
|
||||
if tween != null:
|
||||
tween.kill()
|
||||
|
||||
tween = get_tree().create_tween()
|
||||
tween.tween_method(_tween_shader, Color.BLACK, Color.DARK_RED, 0.1).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_EXPO)
|
||||
tween.tween_method(_tween_shader, Color.DARK_RED, Color.BLACK, 0.35).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_EXPO)
|
||||
tween.tween_callback(_shader_done)
|
||||
|
||||
GameEvents.insect_tile_deselected.emit(self)
|
||||
|
||||
func _on_mouse_entered():
|
||||
if build_in_progress or move_in_progress:
|
||||
return
|
||||
|
||||
if GameData.is_player_black == is_black:
|
||||
mat.next_pass = hover_shader
|
||||
if tween == null:
|
||||
mat.next_pass = hover_shader
|
||||
hovered = true
|
||||
|
||||
func _on_mouse_exited():
|
||||
if selected:
|
||||
return
|
||||
|
||||
hovered = false
|
||||
mat.next_pass = null
|
||||
if tween == null:
|
||||
mat.next_pass = null
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue