2
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
6.5 KiB
C#

using System.Collections.Generic;
using FairyGUI;
using Game.Battle;
using Articy.Unity;
using Articy.Touhou;
using Articy.Unity.Interfaces;
namespace Game
{
public class PageCombo : UIPageBase<ViewCombo>
{
private Dictionary<string, List<string>> _skillCombo = new Dictionary<string, List<string>>();
private Dictionary<string, int> _skill2Index = new Dictionary<string, int>();
private Dictionary<int, string> _index2Skill = new Dictionary<int, string>();
public PageCombo()
{
}
protected override void OnCreate()
{
CreateUI(false);
InitComboTree();
InitComboList();
}
private void InitComboTree()
{
var comboTree = Util.GetConfig(GameConst.ComboTree);
var queue = new Queue<ArticyObject>();
var firstPins = (comboTree as IInputPinsOwner).GetInputPins();
foreach (var pin in firstPins)
{
var firstConns = pin.GetOutgoingConnections();
foreach (var conn in firstConns)
{
queue.Enqueue(conn.Target);
}
}
var frontNode = new Dictionary<string, string>();
var comboFrag = new Dictionary<string, List<string>>();
int countMax = 1000;
while (queue.Count > 0)
{
if (countMax-- <= 0)
{
break;
}
var nodeNow = queue.Dequeue() as DialogueFragment;
var key = nodeNow.TechnicalName;
var speaker = nodeNow.Speaker;
var comboStr = nodeNow.MenuText;
if (!comboFrag.ContainsKey(key))
{
var comboList = new List<string>(comboStr.Split(' '));
if (frontNode.ContainsKey(key))
{
var preCombo = comboFrag[frontNode[key]];
comboList.InsertRange(0, preCombo);
}
comboFrag[key] = comboList;
}
var nextPins = (nodeNow as IOutputPinsOwner).GetOutputPins();
foreach (var pin in nextPins)
{
var nextConns = pin.GetOutgoingConnections();
foreach (var conn in nextConns)
{
var nextKey = conn.Target.TechnicalName;
if (frontNode.ContainsKey(nextKey))
{
continue;
}
frontNode[nextKey] = key;
queue.Enqueue(conn.Target);
}
}
}
foreach (var combo in comboFrag)
{
var frag = Util.GetConfig(combo.Key) as DialogueFragment;
var skill = frag.Speaker as SkillMaster;
if (skill == null)
{
continue;
}
_skillCombo[skill.TechnicalName] = combo.Value;
}
}
private void InitComboList()
{
View.m_ComboList.m_ComboList.RemoveChildrenToPool();
var i = 0;
foreach (var skillItem in _skillCombo)
{
_skill2Index[skillItem.Key] = i;
_index2Skill[i] = skillItem.Key;
i++;
}
View.m_ComboList.m_ComboList.SetVirtualAndLoop();
View.m_ComboList.m_ComboList.itemRenderer = (int index, GObject obj) =>
{
var key = _index2Skill[index];
var comboItem = obj as ViewComboItem;
var skill = Util.GetSkillMasterConfig(key);
var skillName = skill.Skill.Name;
comboItem.m_SkillName.text = skillName;
comboItem.m_CastCount.text = $"{index}";
comboItem.m_ComboList.RemoveChildrenToPool();
foreach (var item in _skillCombo[key])
{
if (string.IsNullOrEmpty(item))
{
continue;
}
var comboKey = comboItem.m_ComboList.AddItemFromPool() as ViewComboKey;
if (item == "*")
{
comboKey.m_c2.selectedIndex = 1;
}
else
{
comboKey.m_c2.selectedIndex = 0;
var text = item;
if (text.StartsWith("↑"))
{
text = text.Substring(1);
comboKey.m_c1.selectedIndex = 1;
}
else if (text.StartsWith("↓"))
{
text = text.Substring(1);
comboKey.m_c1.selectedIndex = 2;
}
else
{
comboKey.m_c1.selectedIndex = 0;
}
comboKey.m_key.text = text;
}
}
};
View.m_ComboList.m_ComboList.numItems = _skillCombo.Count;
}
protected override void OnCreateBind()
{
var master = Util.GetMaster();
BindSkill(master); //绑定技能
}
private void BindSkill(GameEntity entity)
{
var skill = entity.skill;
BindData(skill.SkillId, (_, now) =>
{
if (string.IsNullOrEmpty(now))
{
return;
}
if (_skill2Index.ContainsKey(now))
{
var count = _skillCombo.Count;
var targetIndex = (_skill2Index[now] - 2 + count) % count;
View.m_ComboList.m_ComboList.ScrollToView(targetIndex, true, true);
}
});
}
protected override void OnDestroy()
{
}
protected override void OnOpen()
{
}
protected override void OnClose()
{
}
public override void Update()
{
}
}
}