using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TcgEngine.Client;
using TcgEngine;
namespace TcgEngine.UI
{
///
/// The UI for card selector, appears when an ability with CardSelector target is triggered
///
public class CardSelector : SelectorPanel
{
public GameObject card_prefab;
public RectTransform content;
public Text title;
public Text subtitle;
public Button select_button;
public Text select_button_text;
public float card_spacing = 100f;
private AbilityData iability;
private List card_list = new List();
private List selector_list = new List();
private Vector2 mouse_start;
private int mouse_start_index;
private int selection_index = 0;
private bool drag = false;
private bool force_show = false;
private float mouse_scroll = 0f;
private float timer = 0f;
private static CardSelector instance;
protected override void Awake()
{
base.Awake();
instance = this;
Hide();
}
protected override void Update()
{
base.Update();
timer += Time.deltaTime;
//Drag cards
Vector2 mouse_pos = GetMouseRectPosition();
Vector2 move = mouse_pos - mouse_start;
if (drag && move.magnitude > 0.1f)
{
selection_index = mouse_start_index - Mathf.RoundToInt(move.x / card_spacing);
selection_index = Mathf.Clamp(selection_index, 0, selector_list.Count - 1);
}
//Mouse scroll
mouse_scroll += -Input.mouseScrollDelta.y;
if (mouse_scroll > 0.5f)
{
OnClickNext();
mouse_scroll -= 1f;
}
else if (mouse_scroll < -0.5f)
{
OnClickPrev();
mouse_scroll += 1f;
}
//Refresh cards
foreach (CardSelectorCard card in selector_list)
{
bool is_selected = card.GetIndex() == selection_index;
Vector3 pos = GetCardPosition(card);
Vector3 scale = is_selected ? Vector3.one : Vector3.one / 2f;
card.SetTargetPos(pos);
card.SetTargetScale(scale);
}
//Close on right click if not a selection
if (iability == null && Input.GetMouseButtonDown(1) && timer > 1f)
Hide();
Game game = GameClient.Get().GetGameData();
if (game != null && iability != null && game.selector == SelectorType.None)
Hide(); //Ability was selected already, close panel
}
public void RefreshPanel()
{
foreach (CardSelectorCard card in selector_list)
Destroy(card.gameObject);
selector_list.Clear();
drag = false;
mouse_scroll = 0f;
select_button_text.text = (iability != null) ? "Select" : "OK";
select_button.gameObject.SetActive(iability != null);
int index = 0;
foreach (Card card in card_list)
{
CardData icard = CardData.Get(card.card_id);
if (icard != null)
{
GameObject obj = Instantiate(card_prefab, content.transform);
RectTransform rect = obj.GetComponent();
CardSelectorCard selector_card = obj.GetComponent();
selector_card.SetCard(card);
selector_card.SetIndex(index);
Vector3 pos = GetCardPosition(selector_card);
Vector3 scale = (index == selection_index ? 1 : 0.5f) * Vector3.one;
selector_card.SetTargetPos(pos);
selector_card.SetTargetScale(scale);
rect.anchoredPosition = pos;
selector_list.Add(selector_card);
index++;
}
}
}
//Show ability
public override void Show(AbilityData iability, Card caster)
{
Game data = GameClient.Get().GetGameData();
this.card_list = iability.GetCardTargets(data, caster);
this.iability = iability;
force_show = false;
title.text = iability.title;
subtitle.text = iability.desc;
selection_index = 0;
timer = 0f;
Show();
}
//Show deck/discard
public void Show(List card_list, string title)
{
this.card_list.Clear();
this.card_list.AddRange(card_list);
this.card_list.Sort((Card a, Card b) => { return a.CardData.title.CompareTo(b.CardData.title); }); //Reorder to not show the deck order
this.iability = null;
force_show = true;
this.title.text = title;
subtitle.text = "";
selection_index = 0;
timer = 0f;
Show();
}
public void OnClickOK()
{
Game data = GameClient.Get().GetGameData();
if (iability != null && data.selector == SelectorType.SelectorCard)
{
CardSelectorCard selector_card = null;
if (selection_index >= 0 && selection_index < selector_list.Count)
selector_card = selector_list[selection_index];
if (selector_card != null)
{
Card selected_card = selector_card.GetCard();
Card caster = data.GetCard(data.selector_caster_uid);
if (selected_card != null && iability.AreTargetConditionsMet(data, caster, selected_card))
{
GameClient.Get().SelectCard(selected_card);
Hide();
}
}
}
else
{
Hide();
}
}
public void OnClickMouseDown()
{
mouse_start = GetMouseRectPosition();
mouse_start_index = selection_index;
drag = true;
}
public void OnClickMouseUp()
{
drag = false;
}
public void OnClickCancel()
{
GameClient.Get().CancelSelection();
Hide();
}
public void OnClickNext()
{
selection_index += 1;
selection_index = Mathf.Clamp(selection_index, 0, selector_list.Count - 1);
}
public void OnClickPrev()
{
selection_index -= 1;
selection_index = Mathf.Clamp(selection_index, 0, selector_list.Count - 1);
}
private Vector2 GetCardPosition(CardSelectorCard card)
{
int index_offset = card.GetIndex() - selection_index;
Vector2 pos = new Vector2(index_offset * card_spacing, (index_offset != 0) ? 50f : 0f);
float center_offset = (index_offset != 0) ? (Mathf.Sign(index_offset) * 140f) : 0;
pos += Vector2.right * center_offset;
return pos;
}
private Vector2 GetMouseRectPosition()
{
Vector2 localpoint;
RectTransformUtility.ScreenPointToLocalPointInRectangle(content, Input.mousePosition, GetComponentInParent