mlpcardgame/Scenes/Components/Card.gd

95 lines
2.5 KiB
GDScript

extends Spatial
class_name Card
signal card_selected()
signal card_unselected()
signal card_picked()
signal card_dropped()
signal card_dropped_anim()
signal card_menu()
var clicked := false
var exhausted := false
var lifted := false
var flipped := false
export var cardID := ""
export var playerID := 0
export var inHand := false
onready var animation := $Border/AnimationPlayer
func _mouse_hover():
emit_signal("card_selected")
func _mouse_blur():
emit_signal("card_unselected")
func _input_event(camera, event, click_position, click_normal, shape_idx):
# Mouse motion
if clicked and event is InputEventMouseMotion:
if not lifted:
emit_signal("card_picked")
lifted = true
var origin: Vector3 = camera.project_ray_origin(event.position)
var direction: Vector3 = camera.project_ray_normal(event.position)
if inHand:
translation = Vector3(direction.x * 3.0, 0.25, -0.25)
# Fix rotation if coming from hand
rotation = Vector3.ZERO
else:
var denom := Vector3.UP.dot(direction)
var t: float = (-camera.transform.origin).dot(Vector3.UP) / denom;
translation = origin + direction * t
# Right click
if event is InputEventMouseButton and event.pressed and event.button_index == BUTTON_RIGHT:
# Show menu
emit_signal("card_menu")
# Left click
if event is InputEventMouseButton and event.button_index == BUTTON_LEFT:
# Update click status
clicked = event.pressed
# Check for card dropped
if not clicked and lifted:
emit_signal("card_dropped")
lifted = false
# Check double click
if event.doubleclick and not inHand and not lifted and not animation.is_playing():
if exhausted:
animation.play_backwards("tap")
exhausted = false
else:
animation.play("tap")
exhausted = true
func reset_transform():
$Border.translation = Vector3.ZERO
func _menu_action(id: int):
match id:
0: # Flip
if flipped:
animation.play_backwards("flip")
flipped = false
else:
animation.play("flip")
flipped = true
func _check_drop_anim(anim_name):
if anim_name == "drop":
emit_signal("card_dropped_anim")
func tween_move_to(targetPos: Vector3, duration: float = 0.1):
$Tween.interpolate_property(self, "translation",
translation, targetPos, duration,
Tween.TRANS_CUBIC, Tween.EASE_IN_OUT)
func tween_rotate(targetRot: Vector3, duration: float = 0.1):
$Tween.interpolate_property(self, "rotation",
rotation, targetRot, duration,
Tween.TRANS_CUBIC, Tween.EASE_IN_OUT)
func tween():
$Tween.start()