Swarm/InsectButton.gd

186 lines
4.4 KiB
GDScript3
Raw Normal View History

extends TextureButton
class_name InsectButton
@onready var hex = $Hex
@onready var tile_count_label = $Hex/TileCountLabel
@onready var insect_icon = $Hex/InsectIcon
var BEE = load("res://Tile/Prefabs/Bee.tres")
@export var insect_resource: TileResource = BEE
const HEX_BLACK = preload("res://InsectTiles/Assets/UI/hex_black.svg")
const HEX_WHITE = preload("res://InsectTiles/Assets/UI/hex_white.svg")
@export var is_black: bool = false
var disable_amount_display: bool = false
var tile_count: int = 1
var selected: bool = false
var hovered: bool = false
var deactivated: bool = false
2024-03-16 19:56:22 +01:00
var is_blacks_turn: bool = false
var should_disable: bool = false
func is_players_turn() -> bool:
return is_blacks_turn == GameData.is_player_black or GameData.debug
func update_color(_is_black: bool) -> void:
is_black = _is_black
if is_black:
hex.texture = HEX_BLACK
else:
hex.texture = HEX_WHITE
update_tile_count_display()
insect_icon.texture = insect_resource.ui_texture
if is_black != GameData.is_player_black and not GameData.debug:
disabled = true
return
func is_empty() -> bool:
return tile_count <= 0
func update_tile_count_display() -> void:
tile_count_label.text = str(tile_count)
if is_empty():
disable()
func decrement_tile_count() -> void:
tile_count -= 1
update_tile_count_display()
func disable() -> void:
disabled = true
deactivated = true
var tween = get_tree().create_tween()
tween.tween_property(self, "modulate", Color.DIM_GRAY, 0.15)
func enable() -> void:
disabled = false
deactivated = false
var tween = get_tree().create_tween()
tween.tween_property(self, "modulate", Color.WHITE, 0.15)
func _on_placement_cancelled() -> void:
refresh_state()
func _on_insect_placed(resource: TileResource, _is_black: bool, pos: Vector4i) -> void:
refresh_state()
if insect_resource == resource and _is_black == is_black:
decrement_tile_count()
func refresh_state() -> void:
selected = false
2024-03-16 19:56:22 +01:00
if should_disable:
disable()
if not is_empty() and not should_disable:
enable()
if hovered and not is_empty():
hover()
else:
unhover()
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
update_color(is_black)
if disable_amount_display:
$Hex/TileCountLabel.visible = false
GameEvents.insect_selected.connect(_on_insect_selected)
GameEvents.insect_placement_cancelled.connect(_on_placement_cancelled)
GameEvents.insect_placed.connect(_on_insect_placed)
GameEvents.insect_tile_selected.connect(_on_insect_tile_selected)
GameEvents.insect_tile_moved.connect(_on_insect_tile_moved)
GameEvents.insect_tile_deselected.connect(_on_insect_tile_deselected)
2024-03-16 19:56:22 +01:00
GameEvents.turn_started.connect(_on_turn_started)
func _on_turn_started(turn_num: int, map: HexGrid, _is_blacks_turn: bool) -> void:
is_blacks_turn = _is_blacks_turn
should_disable = false
if turn_num >= 7 and not GameData.has_bee_been_placed:
if GameData.is_player_black == is_blacks_turn:
# if not bee has been placed for this player
# lock all buttons except the bee
if is_same(BEE, insect_resource):
# don't lock
should_disable = false
else:
#lock
should_disable = true
refresh_state()
func _on_insect_tile_deselected(tile: InsectTile) -> void:
refresh_state()
func _on_insect_tile_selected(tile: InsectTile) -> void:
disable()
func _on_insect_tile_moved(tile: InsectTile, to: Vector4i) -> void:
refresh_state()
func _on_insect_selected(button: InsectButton, _is_black: bool) -> void:
if button != self:
disable()
func hover() -> void:
if GameData.is_player_black != is_black and not GameData.debug:
return
var 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)
func unhover() -> void:
if GameData.is_player_black != is_black and not GameData.debug:
return
var tween = get_tree().create_tween()
tween.tween_property(hex, "position", Vector2(0, 0), 0.25).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_SPRING)
func _on_mouse_entered():
hovered = true
if not deactivated:
hover()
func _on_mouse_exited():
hovered = false
if not selected:
unhover()
func _on_pressed():
if is_empty():
return
if GameData.is_player_black != is_black and not GameData.debug:
return
2024-03-16 19:56:22 +01:00
if not is_players_turn():
return
selected = true
GameEvents.insect_selected.emit(self, is_black)
release_focus()
func _input(event):
if Input.is_action_just_pressed("ui_accept"):
release_focus()
return