Files
tcg-client/Assets/TcgEngine/Scripts/Menu/StarterDeckPanel.cs
2025-09-11 10:47:32 +08:00

125 lines
3.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace TcgEngine.UI
{
/// <summary>
/// 初始套牌选择
/// 仅当处于 API 模式且使用新账号时,才会在主菜单中显示
/// </summary>
public class StarterDeckPanel : UIPanel
{
public DeckDisplay[] decks;
public Text error;
private static StarterDeckPanel instance;
protected override void Awake()
{
base.Awake();
instance = this;
}
private void RefreshPanel()
{
int index = 0;
foreach (DeckData deck in GameplayData.Get().starter_decks)
{
if (index < decks.Length)
{
DeckDisplay display = decks[index];
display.SetDeck(deck);
index++;
}
}
}
private void ChooseDeck(string deck_id)
{
if (Authenticator.Get().IsTest())
ChooseDeckTest(deck_id);
if (Authenticator.Get().IsApi())
ChooseDeckApi(deck_id);
}
private async void ChooseDeckTest(string deck_id)
{
UserData udata = Authenticator.Get().UserData;
DeckData deck = DeckData.Get(deck_id);
if (deck == null)
return;
UserDeckData udeck = new UserDeckData();
udeck.tid = deck_id + "_" + GameTool.GenerateRandomID(4, 7); //Add random id to differentiate from the starter deck if edited
udeck.title = deck.title;
udeck.hero = new UserCardData(deck.hero, VariantData.GetDefault());
List<UserCardData> cards = new List<UserCardData>();
foreach (CardData card in deck.cards)
{
UserCardData ucard = new UserCardData(card, VariantData.GetDefault());
cards.Add(ucard);
}
udeck.cards = cards.ToArray();
udata.AddDeck(udeck);
udata.AddReward(udeck.tid);
await Authenticator.Get().SaveUserData();
CollectionPanel.Get().ReloadUserDecks();
Hide();
}
private async void ChooseDeckApi(string deck_id)
{
RewardGainRequest req = new RewardGainRequest();
req.reward = deck_id;
if (error != null)
error.text = "";
string url = ApiClient.ServerURL + "/users/rewards/gain/" + ApiClient.Get().UserID;
string json = ApiTool.ToJson(req);
WebResponse res = await ApiClient.Get().SendPostRequest(url, json);
if (res.success)
{
CollectionPanel.Get().ReloadUserDecks();
Hide();
}
else
{
if (error != null)
error.text = res.error;
}
}
public override void Show(bool instant = false)
{
base.Show(instant);
if(error != null)
error.text = "";
RefreshPanel();
}
public void OnClickDeck(int index)
{
if (index < decks.Length)
{
DeckDisplay display = decks[index];
string deck = display.GetDeck();
ChooseDeck(deck);
}
}
public static StarterDeckPanel Get()
{
return instance;
}
}
}