extends Area class_name Card signal card_selected() signal card_unselected() signal card_picked() signal card_dropped() signal card_dropped_anim() signal card_menu() signal card_moved(origin, direction, t) signal card_clicked() var clicked := false var exhausted := false var lifted := false var flipped := false var cardID := "" setget set_cardid var playerID := 0 var inHand := false var inZone := false var zoneName = "" var cardMat = preload("res://MLPAssets/Placeholders/CardMat.tres") var ready = false onready var border := $CardModel/Border onready var animation := $CardModel/Border/AnimationPlayer onready var handanim := $CardModel/Border/HandAnimPlayer # Hack to get hand animations off the main queue onready var cardImage := $CardModel/Border/CardImage onready var texture: Texture = cardImage.get_surface_material(0) func set_cardid(val: String): cardID = val if ready: Resources.get_card(val, self, "_card_fetched") func _ready(): Resources.get_card(cardID, self, "_card_fetched") ready = true func _mouse_hover(): emit_signal("card_selected") func _mouse_blur(): emit_signal("card_unselected") # warning-ignore:unused_argument 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) var denom := Vector3.UP.dot(direction) var t: float = (-camera.transform.origin).dot(Vector3.UP) / denom; emit_signal("card_moved", 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 and clickable(): # 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(): emit_signal("card_clicked") func _check_drop_anim(anim_name): if anim_name == "drop": emit_signal("card_dropped_anim") # warning-ignore:unused_argument func _card_fetched(result: int, response_code: int, headers: PoolStringArray, body: PoolByteArray): assert(result == HTTPRequest.RESULT_SUCCESS) var img = Image.new() var err = img.load_webp_from_buffer(body) assert(err == OK) # Depending if card pic is a problem or not, rotate the card image mesh if img.get_width() > img.get_height(): cardImage.scale = Vector3(0.45,1,0.319) cardImage.rotation.y = PI/2 else: cardImage.scale = Vector3(0.319,1,0.45) cardImage.rotation.y = 0 var mat = cardMat.duplicate() texture = ImageTexture.new() texture.create_from_image(img) mat.albedo_texture = texture cardImage.set_surface_material(0, mat) 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() func disableInput(): $CollisionShape.disabled = true func enableInput(): $CollisionShape.disabled = false func clickable() -> bool: #TODO Better control over if a card can be taken or not if playerID == 0: return true return false func reset_transform(): $CardModel.translation = Vector3.ZERO $CardModel.rotation = Vector3.ZERO