326 lines
8.6 KiB
C#
326 lines
8.6 KiB
C#
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using Module.Log;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
|
||
public class BuffersSelectCtr : MonoBehaviour {
|
||
|
||
#region Single
|
||
|
||
private static BuffersSelectCtr _instance;
|
||
public static BuffersSelectCtr Instance
|
||
{
|
||
get
|
||
{
|
||
if (_instance != null)
|
||
{
|
||
return _instance;
|
||
}
|
||
|
||
return null;
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
public List<BufferItem> ownBuffers; // 拥有的Buffer
|
||
public List<BufferItem> newBuffers; // 可替换的新Buffer
|
||
public Button closeBtn; // 关闭按钮
|
||
public Text replaceTips; // 替换提示
|
||
public Text remainTimeObj; // 当前剩余时间(仅时间)
|
||
public Text remainTimeDesc; // 当前剩余时间描述
|
||
public UIBackRayBehind behindMask; // 空白点击面板
|
||
|
||
private BufferItem curSelectItem; // 当前选择的BufferItem;
|
||
private int selOwnIndex = -1; // 选中自身buff的槽位索引,用于替换
|
||
private int selNewIndex = -1; // 选中新buff的槽位索引
|
||
private const float PreparaTime = 15.0f; // 剩余时间
|
||
private float remainTime;
|
||
|
||
private void Awake()
|
||
{
|
||
if(_instance == null)
|
||
{
|
||
_instance = this;
|
||
}
|
||
|
||
if (ownBuffers.Count != newBuffers.Count)
|
||
{
|
||
LogModule.ErrorLog("ownBuffers.Count != newBuffers.Count, please check !!!");
|
||
}
|
||
|
||
for(int i = 0; i < ownBuffers.Count; ++i)
|
||
{
|
||
ownBuffers[i]._PanelClickEvent += OnOwnBufferClick;
|
||
newBuffers[i]._PanelClickEvent += OnNewBufferClick;
|
||
}
|
||
|
||
closeBtn.onClick.AddListener(Close);
|
||
behindMask._BackClick.AddListener(CancelSelect);
|
||
}
|
||
|
||
// 仅在替换是可用
|
||
private void CancelSelect()
|
||
{
|
||
if(EmptyIndexOfOwn() == -1 && selNewIndex != -1 && selOwnIndex == -1)
|
||
{
|
||
selNewIndex = -1;
|
||
curSelectItem = null;
|
||
replaceTips.gameObject.SetActive(false);
|
||
SetMask();
|
||
}
|
||
}
|
||
|
||
private void OnEnable()
|
||
{
|
||
remainTime = PreparaTime;
|
||
curSelectItem = null;
|
||
selOwnIndex = -1;
|
||
selNewIndex = -1;
|
||
replaceTips.gameObject.SetActive(false);
|
||
remainTimeObj.gameObject.SetActive(false);
|
||
}
|
||
|
||
private void OnDestroy()
|
||
{
|
||
_instance = null;
|
||
}
|
||
|
||
// Use this for initialization
|
||
void Start () {
|
||
if(ownBuffers.Count != newBuffers.Count)
|
||
{
|
||
LogModule.ErrorLog("ownBuffers.Count != newBuffers.Count, please check !!!");
|
||
}
|
||
|
||
for(int i = 0; i < ownBuffers.Count; ++i)
|
||
{
|
||
ownBuffers[i].Show(null);
|
||
newBuffers[i].Show(null);
|
||
}
|
||
}
|
||
|
||
// 自身Buffer点击后的回调
|
||
private void OnOwnBufferClick(UIBase item)
|
||
{
|
||
// 仅当需要替换时,对拥有的Buffer做出反应
|
||
if (curSelectItem != null && EmptyIndexOfOwn() == -1)
|
||
{
|
||
BufferItem replaceItem = item as BufferItem;
|
||
if(replaceItem == null)
|
||
{
|
||
LogModule.ErrorLog("Replace buffer is null, please check !!!");
|
||
return;
|
||
}
|
||
|
||
selOwnIndex = ownBuffers.IndexOf(replaceItem);
|
||
|
||
if (selOwnIndex == -1)
|
||
{
|
||
LogModule.ErrorLog("Can't find replace buffer Index, please check !!!");
|
||
return;
|
||
}
|
||
|
||
Hashtable info_newBuffer = new Hashtable();
|
||
info_newBuffer["Info"] = curSelectItem.BuffInfo.ImpactID;
|
||
|
||
ownBuffers[selOwnIndex].Show(info_newBuffer);
|
||
|
||
remainTime = 3.0f;
|
||
replaceTips.gameObject.SetActive(false);
|
||
|
||
SetMask();
|
||
}
|
||
}
|
||
|
||
// 新的可调换Buffer点击回调
|
||
private void OnNewBufferClick(UIBase item)
|
||
{
|
||
BufferItem tempSelect = item as BufferItem;
|
||
if(tempSelect == null)
|
||
{
|
||
return;
|
||
}
|
||
|
||
if(curSelectItem != null)
|
||
{
|
||
return;
|
||
}
|
||
|
||
selNewIndex = newBuffers.IndexOf(tempSelect);
|
||
|
||
curSelectItem = tempSelect;
|
||
int emptyIndex = EmptyIndexOfOwn();
|
||
if(emptyIndex != -1)
|
||
{
|
||
Hashtable hash = new Hashtable();
|
||
hash["Info"] = curSelectItem.BuffInfo.ImpactID;
|
||
ownBuffers[emptyIndex].Show(hash);
|
||
selOwnIndex = emptyIndex;
|
||
remainTime = 3.0f;
|
||
}
|
||
else
|
||
{
|
||
replaceTips.gameObject.SetActive(true);
|
||
}
|
||
|
||
SetMask();
|
||
}
|
||
|
||
#region 消息接收与发送
|
||
|
||
public void ReceiveNewBuffers(object packet)
|
||
{
|
||
ReqTestingOptionBuff info = packet as ReqTestingOptionBuff;
|
||
if(info == null)
|
||
{
|
||
return;
|
||
}
|
||
|
||
this.gameObject.SetActive(true);
|
||
for (int i = 0; i < ownBuffers.Count; ++i)
|
||
{
|
||
if (i < info._OwnBuffId.Count)
|
||
{
|
||
Hashtable hash = new Hashtable() { { "Info", info._OwnBuffId[i] } };
|
||
ownBuffers[i].Show(hash);
|
||
}
|
||
else
|
||
{
|
||
ownBuffers[i].Show(null);
|
||
}
|
||
}
|
||
|
||
for(int i = 0; i < info._OptionBuffId.Count; ++i)
|
||
{
|
||
Hashtable hash = new Hashtable() { { "Info", info._OptionBuffId[i] } };
|
||
newBuffers[i].Show(hash);
|
||
}
|
||
|
||
StartCoroutine("CountDown");
|
||
SetMask();
|
||
}
|
||
|
||
private IEnumerator CountDown()
|
||
{
|
||
remainTimeObj.gameObject.SetActive(true);
|
||
for(; remainTime > 0.0f; remainTime -= Time.deltaTime)
|
||
{
|
||
remainTimeDesc.text = ((int)remainTime).ToString();
|
||
yield return 0;
|
||
}
|
||
|
||
Close();
|
||
}
|
||
|
||
|
||
// 确认所选的Buff
|
||
public void ConfimBuffers()
|
||
{
|
||
if(curSelectItem == null)
|
||
{
|
||
// 拥有空槽位时,随机选取一个Buff
|
||
if(EmptyIndexOfOwn() != -1)
|
||
{
|
||
int r = Random.Range(0, newBuffers.Count - 1);
|
||
Hashtable hash = new Hashtable() { { "Info", newBuffers[r].BuffInfo.ImpactID } };
|
||
ownBuffers[EmptyIndexOfOwn()].Show(hash);
|
||
TestingCopyBuffInfoCtr.Instance.SetBuffer(newBuffers[r].BuffInfo.ImpactID);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(EmptyIndexOfOwn() != -1)
|
||
{
|
||
TestingCopyBuffInfoCtr.Instance.SetBuffer(curSelectItem.BuffInfo.ImpactID);
|
||
}
|
||
else if(selOwnIndex != -1)
|
||
{
|
||
TestingCopyBuffInfoCtr.Instance.SetBuffer(curSelectItem.BuffInfo.ImpactID, selOwnIndex);
|
||
}
|
||
}
|
||
|
||
// 发送信息确认新buff
|
||
List<int> curBuffs = new List<int>();
|
||
for(int i = 0; i < ownBuffers.Count; ++i)
|
||
{
|
||
if(ownBuffers[i].BuffInfo != null)
|
||
{
|
||
curBuffs.Add(ownBuffers[i].BuffInfo.ImpactID);
|
||
}
|
||
}
|
||
|
||
RetTestingOptionBuff packet = new RetTestingOptionBuff();
|
||
packet._BuffId = curBuffs;
|
||
packet.SendMsg();
|
||
}
|
||
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// 获得自身Buffer槽中的空槽位索引
|
||
/// </summary>
|
||
/// <returns>空位索引,当为 -1 表示已满</returns>
|
||
private int EmptyIndexOfOwn()
|
||
{
|
||
for(int i = 0; i < ownBuffers.Count; ++i)
|
||
{
|
||
if(ownBuffers[i].BuffInfo == null)
|
||
{
|
||
return i;
|
||
}
|
||
}
|
||
|
||
return -1;
|
||
}
|
||
|
||
public void Close()
|
||
{
|
||
ConfimBuffers();
|
||
this.gameObject.SetActive(false);
|
||
}
|
||
|
||
private void SetMask()
|
||
{
|
||
|
||
//for(int i = 0; i < ownBuffers.Count; ++i)
|
||
//{
|
||
// ownBuffers[i].SetMask(ownBuffers[i].BuffInfo == null);
|
||
//}
|
||
|
||
if(selOwnIndex == -1)
|
||
{
|
||
if(selNewIndex == -1)
|
||
{
|
||
for (int i = 0; i < newBuffers.Count; ++i)
|
||
{
|
||
newBuffers[i].SetMask(false);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for (int i = 0; i < newBuffers.Count; ++i)
|
||
{
|
||
if(selNewIndex == i)
|
||
{
|
||
newBuffers[i].SetMask(false);
|
||
newBuffers[i].Selected();
|
||
}
|
||
else
|
||
{
|
||
newBuffers[i].SetMask(true);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for (int i = 0; i < newBuffers.Count; ++i)
|
||
{
|
||
newBuffers[i].SetMask(true);
|
||
}
|
||
}
|
||
}
|
||
}
|