using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using IwbZero.IwbBase;
using IwbZero.ToolCommon.StringModel;
using WeEngine.Enum;
using WeEngine.Packages;
namespace WeEngine
{
///
/// 方案包运行态
///
public class RuntimePackage:IIwbId
{
public RuntimePackage(PackageInfo packageInfoInfo)
{
PackageInfoInfo = packageInfoInfo;
Id = Guid.NewGuid().ToString();
PackageInfoInfo.RunningId = Id;
RuntimePackageCache.Instance.SetCache(this);
}
public RuntimePackage(PackageInfo packageInfoInfo, string id)
{
PackageInfoInfo = packageInfoInfo;
Id = id;
PackageInfoInfo.RunningId = Id;
RuntimePackageCache.Instance.SetCache(this);
}
public RuntimePackage(XmlNode xmlNode, string id=null)
{
PackageInfoInfo = (PackageInfo)new PackageInfo().CreateNodeByXmlNode(xmlNode);
Id = id.IsNotEmpty() ? id : PackageInfoInfo.RunningId.IsEmpty() ? Guid.NewGuid().ToString("N") : PackageInfoInfo.RunningId;
PackageInfoInfo.RunningId = Id;
RuntimePackageCache.Instance.SetCache(this);
}
public RuntimePackage()
{
}
public PackageInfo PackageInfoInfo { get; set; }
public string Id { get; set; }
#region CurrentInfo
public int CurRoundIndex => CurRoundInfo?.RoundIndex ?? 0;
public SceneRound CurRoundInfo => GetCurrentRoundInfo();
public List CurSceneFlowBlocks => GetCurrentFlowBlocks();
public List CurSceneFlows => GetCurrentFlows();
public List CurFlowNodes => GetCurrentSceneNodes();
public List CurSceneInfos => GetCurrentSceneInfos();
public List CurBehaviorInfos => GetCurrentBehaviors();
public List CurKeyWords => GetCurrentKeyWords();
private SceneRound GetCurrentRoundInfo()
{
return (SceneRound)PackageInfoInfo.Children.FirstOrDefault(a => a.NodeState == NodeState.Running);
}
private List GetCurrentFlowBlocks()
{
var list = new List();
var children = CurRoundInfo?.HasChild == true ? CurRoundInfo.Children.Where(a => a.NodeState == NodeState.Running).Select(a => (SceneFlowBlock)a).ToList() : new List();
list.AddRange(children);
return list;
}
private List GetCurrentFlows()
{
var list = new List();
foreach (var cur in CurSceneFlowBlocks)
{
var children = cur?.HasChild == true ? cur.Children.Where(a => a.NodeState == NodeState.Running).Select(a => (SceneFlow)a).ToList() : new List();
list.AddRange(children);
}
return list;
}
private List GetCurrentSceneNodes()
{
var list = new List();
foreach (var cur in CurSceneFlows)
{
var flowNode = cur.RunningNode;
list.Add(flowNode);
}
return list;
}
private List GetCurrentSceneInfos()
{
var list = new List();
foreach (var cur in CurFlowNodes)
{
var children = cur?.HasChild == true
? cur.Children.Where(a => a.NodeState == NodeState.Running).Select(a => (SceneInfo)a)
.ToList()
: new List();
list.AddRange(children);
}
return list;
}
private List GetCurrentBehaviors()
{
var list = new List();
foreach (var cur in CurSceneInfos)
{
var children = cur?.HasChild == true ? cur.Children.Select(a => (BehaviorInfo)a).ToList() : new List();
list.AddRange(children);
}
return list;
}
private List GetCurrentKeyWords()
{
var list = new List();
foreach (var cur in CurBehaviorInfos)
{
var children = cur.HasChild
? cur.Children.Select(a => (KeyWord)a).Where(a => !a.HasMatched ).ToList()
: new List();
list.AddRange(children);
}
return list;
}
#endregion
public NodeBase GetNodeById(string id)
{
return PackageInfoInfo.GetNodeById(id);
}
}
}