extends Area 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 var cardID := "" var playerID := 0 var inHand := false var inZone := false var zoneName = "" 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") # Disable input for now input_ray_pickable = false 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 elif inZone: translation = Vector3.ZERO 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") input_ray_pickable = true 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()