Files
tcg-client/Assets/TcgEngine/Scripts/Menu/CardZoomPanel.cs
2025-09-29 17:34:44 +08:00

236 lines
6.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace TcgEngine.UI
{
/// <summary>
/// When clicking on a card in menu, a box will appear with additional game info
/// You can also buy cards in this panel
/// </summary>
public class CardZoomPanel : UIPanel
{
public CardUI card_ui;
public Text desc;
public Image quantity_bar;
public Text quantity_txt;
public GameObject trade_area;
public InputField trade_quantity;
public Text buy_cost;
public Text sell_cost;
public Text trade_error;
private CardData card;
private VariantData variant;
private static CardZoomPanel instance;
protected override void Awake()
{
base.Awake();
instance = this;
TabButton.onClickAny += OnClickTab;
}
private void OnDestroy()
{
TabButton.onClickAny -= OnClickTab;
}
protected override void Update()
{
base.Update();
if (card != null)
{
int quantity = GetBuyQuantity();
int cost = quantity * card.cost * variant.cost_factor;
buy_cost.text = cost.ToString();
sell_cost.text = Mathf.RoundToInt(cost * GameplayData.Get().sell_ratio).ToString();
}
}
public void ShowCard(CardData card, VariantData variant)
{
this.card = card;
this.variant = variant;
UserData udata = Authenticator.Get().UserData;
int quantity = udata.GetCardQuantity(card, variant);
quantity_txt.text = quantity.ToString();
quantity_txt.enabled = quantity > 0;
quantity_bar.enabled = quantity > 0;
trade_quantity.text = "1";
trade_error.text = "";
trade_area?.SetActive(card.deckbuilding && card.cost > 0);
card_ui.SetCard(card, variant);
string desc = card.GetDesc();
string adesc = card.GetAbilitiesDesc();
if(!string.IsNullOrWhiteSpace(desc))
this.desc.text = desc + "\n\n" + adesc;
else
this.desc.text = adesc;
Show();
}
public void RefreshCard()
{
ShowCard(card, variant);
}
private async void BuyCardTest()
{
int quantity = GetBuyQuantity();
int cost = (quantity * card.cost * variant.cost_factor);
if (quantity <= 0)
return;
UserData udata = Authenticator.Get().UserData;
if (udata.coins < cost)
return;
udata.AddCard(card.id, variant.id, quantity);
udata.coins -= cost;
await Authenticator.Get().SaveUserData();
CollectionPanel.Get().ReloadUser();
Hide();
}
private async void BuyCardApi()
{
BuyCardRequest req = new BuyCardRequest();
req.card = card.id;
req.variant = variant.id;
req.quantity = GetBuyQuantity();
if (req.quantity <= 0)
return;
string url = ApiClient.ServerURL + "/users/cards/buy/";
string jdata = ApiTool.ToJson(req);
Debug.Log(jdata);
trade_error.text = "";
WebResponse res = await ApiClient.Get().SendPostRequest(url, jdata);
if (res.success)
{
CollectionPanel.Get().ReloadUser();
Hide();
}
else
{
trade_error.text = res.error;
}
}
private async void SellCardTest()
{
int quantity = GetBuyQuantity();
int cost = Mathf.RoundToInt(quantity * card.cost * variant.cost_factor * GameplayData.Get().sell_ratio);
if (quantity <= 0)
return;
UserData udata = Authenticator.Get().UserData;
if (!udata.HasCard(card.id, variant.id, quantity))
return;
udata.AddCard(card.id, variant.id, -quantity);
udata.coins += cost;
await Authenticator.Get().SaveUserData();
CollectionPanel.Get().ReloadUser();
MainMenu.Get().RefreshDeckList();
Hide();
}
private async void SellCardApi()
{
BuyCardRequest req = new BuyCardRequest();
req.card = card.id;
req.variant = variant.id;
req.quantity = GetBuyQuantity();
if (req.quantity <= 0)
return;
string url = ApiClient.ServerURL + "/users/cards/sell/";
string jdata = ApiTool.ToJson(req);
trade_error.text = "";
WebResponse res = await ApiClient.Get().SendPostRequest(url, jdata);
if (res.success)
{
CollectionPanel.Get().ReloadUser();
Hide();
}
else
{
trade_error.text = res.error;
}
}
public void OnClickBuy()
{
if (Authenticator.Get().IsTest())
{
BuyCardTest();
}
if (Authenticator.Get().IsApi())
{
BuyCardApi();
}
}
public void OnClickSell()
{
if (Authenticator.Get().IsTest())
{
SellCardTest();
}
if (Authenticator.Get().IsApi())
{
SellCardApi();
}
}
private void OnClickTab(TabButton btn)
{
if (btn.group == "menu")
Hide();
}
public int GetBuyQuantity()
{
bool success = int.TryParse(trade_quantity.text, out int quantity);
if (success)
return quantity;
return 0;
}
public CardData GetCard()
{
return card;
}
public string GetCardId()
{
return card.id;
}
public string GetCardVariant()
{
return variant.id;
}
public static CardZoomPanel Get()
{
return instance;
}
}
}