using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TcgEngine.Client;
using TcgEngine;
namespace TcgEngine.UI
{
///
/// Main player UI inside the GameUI, inside the game scene
/// there is one for each player
///
public class PlayerUI : MonoBehaviour
{
public bool is_opponent;
public Text pname;
public AvatarUI avatar;
public IconBar mana_bar; // 保留原有mana条,作为通用mana显示
public Text hp_txt;
public Text hp_max_txt;
public Animator[] secrets;
public GameObject dead_fx;
public AudioClip dead_audio;
public Sprite avatar_dead;
private bool killed = false;
private float timer = 0f;
private int prev_hp = 0;
private float delayed_damage_timer = 0f;
private static List ui_list = new List();
private void Awake()
{
ui_list.Add(this);
}
private void OnDestroy()
{
ui_list.Remove(this);
}
void Start()
{
pname.text = "";
hp_txt.text = "";
hp_max_txt.text = "";
for (int i = 0; i < secrets.Length; i++)
secrets[i].gameObject.SetActive(false);
avatar.onClick += OnClickAvatar;
GameClient.Get().onSecretTrigger += OnSecretTrigger;
}
void Update()
{
if (!GameClient.Get().IsReady())
return;
Player player = GetPlayer();
if (player != null)
{
pname.text = player.username;
// 更新通用mana条
mana_bar.value = player.mana;
mana_bar.max_value = player.mana_max;
hp_txt.text = prev_hp.ToString();
hp_max_txt.text = "/" + player.hp_max.ToString();
AvatarData adata = AvatarData.Get(player.avatar);
if (avatar != null && adata != null && !killed)
avatar.SetAvatar(adata);
delayed_damage_timer -= Time.deltaTime;
if (!IsDamagedDelayed())
prev_hp = player.hp;
}
timer += Time.deltaTime;
if (timer > 0.4f)
{
timer = 0f;
SlowUpdate();
}
}
void SlowUpdate()
{
Player player = GetPlayer();
if (player == null)
return;
for (int i = 0; i < secrets.Length; i++)
{
bool active = i < player.cards_secret.Count;
bool was_active = secrets[i].gameObject.activeSelf;
if (active != was_active)
secrets[i].gameObject.SetActive(active);
if (active && !was_active)
secrets[i].SetTrigger("appear");
if (active && !was_active && !is_opponent)
secrets[i].GetComponent().SetCard(player.cards_secret[i]);
if (!active && was_active)
secrets[i].Rebind();
}
}
public void Kill()
{
killed = true;
avatar.SetImage(avatar_dead);
AudioTool.Get().PlaySFX("fx", dead_audio);
FXTool.DoFX(dead_fx, avatar.transform.position);
}
public void DelayDamage(int damage, float duration = 1f)
{
if (damage != 0)
{
delayed_damage_timer = duration;
}
}
public bool IsDamagedDelayed()
{
return delayed_damage_timer > 0f;
}
private void OnClickAvatar(AvatarData avatar)
{
Game gdata = GameClient.Get().GetGameData();
int player_id = GameClient.Get().GetPlayerID();
if (gdata.selector == SelectorType.SelectTarget && player_id == gdata.selector_player_id)
{
GameClient.Get().SelectPlayer(GetPlayer());
}
}
private void OnSecretTrigger(Card secret, Card triggerer)
{
Player player = GetPlayer();
int index = player.cards_secret.Count - 1;
if (player.player_id == secret.player_id && index >= 0 && index < secrets.Length)
{
secrets[index].SetTrigger("reveal");
}
}
public Player GetPlayer()
{
int player_id = is_opponent ? GameClient.Get().GetOpponentPlayerID() : GameClient.Get().GetPlayerID();
Game data = GameClient.Get().GetGameData();
return data.GetPlayer(player_id);
}
public static PlayerUI Get(bool opponent)
{
foreach (PlayerUI ui in ui_list)
{
if (ui.is_opponent == opponent)
return ui;
}
return null;
}
}
}