using System;
using System.Collections.Generic;
using System.Linq;
using IwbZero.Expr;
using IwbZero.IwbBase;
using IwbZero.ToolCommon.StringModel;
using WeEngine.CommonDto;
using WeEngine.Enum;
using WeEngine.Message;
using WeEngine.Strategy.Eval;
using WeEngine.Strategy.Runner;
namespace WeEngine.Packages
{
///
/// 方案包
///
public class PackageNode : NodeBase
{
public PackageNode()
{
EventSwitch = true;
NodeType = NodeType.ScenePackage;
WaitForRunNode= new Dictionary>();
Variables = DefaultVariable.Variables;
}
public bool EventSwitch { get; set; }
///
/// 目标客户端
///
public string TargetClientId { get; set; }
///
/// 模型类型
///
public string EngineType { get; set; }
///
/// 评估模块
///
public IEvalManager EvalManager { get; set; }
///
/// 运行模块
///
public IRunnerManager RunnerManager { get; set; }
///
/// 消息发送模块
///
public IMessageSender MessageSender { get; set; }
///
/// 运行ID
///
public string RunningId { get; set; }
///
/// 考核角色
///
public List AssessRoles { get; set; }
///
/// 未考核分数自动运行(满分)
///
public bool AssessAuto { get; set; }
///
/// 自动下一轮
///
public bool AutoNextRound { get; set; }
///
/// 每轮总分
///
public decimal RoundScore { get; set; }
///
/// 等待运行的节点
///
public Dictionary> WaitForRunNode { get; set; }
///
/// 模块已加载
///
public bool ModuleHasLoad => EvalManager != null && RunnerManager != null && MessageSender != null;
///
/// 从运行数据恢复到运行态
///
///
public void ConvertFromRun(RunningInfo running)
{
EventSwitch = false;
RunningId = running.Id;
NodeState = GetNodeState(running);
AssessAuto = running.AssessAuto;
AssessRoles = running.AssessRoles;
RoundScore = running.RoundScore;
AutoNextRound = running.AutoNextRound;
Variables = running.VariableTable;
WaitPath = running.WaitPath;
if (HasChild)
{
foreach (var nodeBase in Children)
{
var child = (SceneRoundNode)nodeBase;
var runChild = running.RoundInfo.FirstOrDefault(a => a.Path == child.NodePath);
if (runChild != null)
{
child.ConvertFromRun(runChild);
}
}
}
EventSwitch = true;
}
#region CurrentInfo
public RunningInfo RunningInfo => GetRunningInfo();
///
/// 当前轮次
///
public int CurrentRound => CurRoundInfo?.RoundIndex ?? 0;
///
/// 当前轮次信息
///
public SceneRoundNode CurRoundInfo => GetCurrentRoundInfo();
///
/// 当前情景流块
///
public List CurSceneFlowBlocks => GetCurrentFlowBlocks();
///
/// 当前情景流
///
public List CurSceneFlows => GetCurrentFlows();
///
/// 当前流节点
///
public List CurFlowNodes => GetCurrentFlowNodes();
///
/// 当前情景
///
public List CurSceneInfos => GetCurrentSceneInfos();
///
/// 当前行为
///
public List CurBehaviorInfos => GetCurrentBehaviors();
///
/// 已运行的行为
///
public List AllRunnedBehaviorInfos => GetAllRunnedBehaviors();
///
/// 当前轮次各标签总得分
///
public Dictionary BehaviorTagScoreDic => GetBehaviorTagScoreDic();
///
/// 当前轮次所运行的行为各标签总分
///
public Dictionary BehaviorTagFullScoreDic => GetBehaviorTagScoreDic(true);
///
/// 当前关键字
///
public List CurKeyWords => GetCurrentKeyWords();
///
/// 未匹配的关键字
///
public List NotMatchKeyWords => GetNotMatchKeyWords();
///
/// 获取当前轮次
///
///
private SceneRoundNode GetCurrentRoundInfo()
{
var round = (SceneRoundNode) Children.FirstOrDefault(a => a.NodeState == NodeState.Running) ?? Children
.Select(a => (SceneRoundNode) a).OrderByDescending(a => a.RoundIndex)
.FirstOrDefault(a => a.NodeState == NodeState.Complete || a.NodeState == NodeState.RunEnd);
return round;
}
///
/// 获取当前情景流块
///
///
private List GetCurrentFlowBlocks()
{
var list = new List();
var children = CurRoundInfo?.HasChild == true ? CurRoundInfo.Children.Where(a => a.NodeState == NodeState.Running).Select(a => (SceneFlowBlockNode)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 => (SceneFlowNode)a).ToList() : new List();
list.AddRange(children);
}
return list;
}
///
/// 获取当前流节点
///
///
private List GetCurrentFlowNodes()
{
var list = new List();
foreach (var cur in CurSceneFlows)
{
var flowNode = cur.RunningNode?.NodeState == NodeState.Running ? cur.RunningNode : null;
if (flowNode != null)
{
list.Add(flowNode);
}
}
return list;
}
///
/// 获取当前情景信息
///
///
private List GetCurrentSceneInfos()
{
var list = new List();
foreach (var cur in CurFlowNodes)
{
var children = cur?.SceneInfos.Count >0
? cur.SceneInfos.Where(a => a.NodeState == NodeState.Running).Select(a => 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 => (BehaviorNode)a).ToList() : new List();
list.AddRange(children);
}
return list;
}
///
/// 获取已运行的行为信息
///
///
private List GetAllRunnedBehaviors()
{
var list = new List();
var rounds = HasChild ? Children.Where(a => a.NodeState != NodeState.New).ToList() : null;
if (rounds==null || !rounds.Any())
{
return list;
}
List blocks = new List();
foreach (var node in rounds)
{
blocks.AddRange(node.HasChild ? node.Children.Where(a => a.NodeState != NodeState.New).ToList() : new List());
}
if (!blocks.Any())
{
return list;
}
List flows = new List();
foreach (var node in blocks)
{
flows.AddRange(node.HasChild ? node.Children.Where(a => a.NodeState != NodeState.New).ToList() : new List());
}
if (!flows.Any())
{
return list;
}
List flowNodes = new List();
foreach (var node in flows)
{
flowNodes.AddRange(node.HasChild ? GetAllRunFlowNodes(node.Children.FirstOrDefault(a => a.NodeState != NodeState.New)) : new List());
}
if (!flowNodes.Any())
{
return list;
}
List scenes = new List();
foreach (var nodeBase in flowNodes)
{
var node = (FlowNode) nodeBase;
scenes.AddRange(node.HasChild ? node.SceneInfos.Where(a => a.NodeState != NodeState.New).ToList() : new List());
}
if (!scenes.Any())
{
return list;
}
foreach (var node in scenes)
{
list.AddRange(node.HasChild ? node.Children.Where(a => a.NodeState != NodeState.New).Select(a=>(BehaviorNode)a).ToList() : new List());
}
return list;
}
///
/// 递归获取已运行的流节点
///
///
///
private List GetAllRunFlowNodes(NodeBase node)
{
List flowNodes = new List();
if (node == null)
{
return flowNodes;
}
if (node.NodeType == NodeType.FlowNode)
{
flowNodes.Add(node);
}
if (node.HasChild)
{
flowNodes.AddRange(GetAllRunFlowNodes(node.Children.FirstOrDefault(a => a.NodeState != NodeState.New)));
}
return flowNodes;
}
///
/// 计算标签的总分
///
///
///
private Dictionary GetBehaviorTagScoreDic(bool isAll = false)
{
var dic= new Dictionary();
var behaviorInfos = AllRunnedBehaviorInfos?.Where(a => a.BehaviorScoreType != BehaviorScoreType.ImportantNegative).ToList();
if (behaviorInfos != null&& behaviorInfos.Any())
{
foreach(var be in behaviorInfos)
{
if(be.BehaviorTagArray!=null&& be.BehaviorTagArray.Any())
{
foreach (var tag in be.BehaviorTagArray)
{
var score = isAll
? be.BehaviorScoreType == BehaviorScoreType.Normal ? be.NodeFullScore : 0
: be.ActualScore;
if (dic.ContainsKey(tag))
{
var temp = dic[tag];
dic[tag] = temp + score;
}
else
{
dic.Add(tag, score);
}
}
}
}
}
return dic;
}
///
/// 获取当前关键字
///
///
private List GetCurrentKeyWords()
{
var list = new List();
foreach (var cur in CurBehaviorInfos)
{
var children = cur.HasChild
? cur.Children.Select(a => (KeyWord)a).ToList()
: new List();
list.AddRange(children);
}
return list;
}
///
/// 获取未匹配的当前关键字
///
///
private List GetNotMatchKeyWords()
{
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
#region RUNNING
public RunningInfo GetRunningInfo()
{
var running = new RunningInfo(this)
{
Id = RunningId,
CurrentRoundIndex = CurrentRound,
PackageNo = Id,
AssessAuto = AssessAuto,
AssessRoles = AssessRoles,
RoundScore = RoundScore,
AutoNextRound= AutoNextRound,
RoundInfo = new List()
};
if (Children != null && Children.Any())
{
foreach (var child in Children)
{
GetRoundRunningInfo((SceneRoundNode)child, running);
}
}
return running;
}
public RoundRunningInfo GetRoundRunningInfo(SceneRoundNode node, RunningInfo parent)
{
var running = new RoundRunningInfo(node)
{
RoundIndex = node.RoundIndex,
BlockInfo = new List()
};
if (running.IsStart)
{
parent.CurrentRoundIndex = running.RoundIndex;
}
if (node.Children != null && node.Children.Any())
{
foreach (var child in node.Children)
{
GetBlockRunningInfo((SceneFlowBlockNode)child, running);
}
}
parent.RoundInfo.Add(running);
return running;
}
public BlockRunningInfo GetBlockRunningInfo(SceneFlowBlockNode node, RoundRunningInfo parent)
{
var running = new BlockRunningInfo(node)
{
FlowInfo = new List()
};
if (node.Children != null && node.Children.Any())
{
foreach (var child in node.Children)
{
GetFlowRunningInfo((SceneFlowNode)child, running);
}
}
parent.BlockInfo.Add(running);
return running;
}
public FlowRunningInfo GetFlowRunningInfo(SceneFlowNode node, BlockRunningInfo parent)
{
var running = new FlowRunningInfo(node)
{
NodeInfo = new List()
};
if (node.Children != null && node.Children.Any())
{
foreach (var child in node.Children)
{
GetFlowNodeRunningInfo((FlowNode)child, running);
}
}
parent.FlowInfo.Add(running);
return running;
}
public FlowNodeRunningInfo GetFlowNodeRunningInfo(FlowNode node, FlowRunningInfo parent)
{
var running = new FlowNodeRunningInfo(node)
{
NodeInfo = new List(),
SceneInfo = new List()
};
if (node.Children != null && node.Children.Any())
{
foreach (var child in node.Children)
{
GetFlowNodeRunningInfo((FlowNode)child, running);
}
}
if (node.SceneInfos != null && node.SceneInfos.Any())
{
foreach (var sceneInfo in node.SceneInfos)
{
GetSceneRunningInfo(sceneInfo, running);
}
}
parent.NodeInfo.Add(running);
return running;
}
public FlowNodeRunningInfo GetFlowNodeRunningInfo(FlowNode node, FlowNodeRunningInfo parent)
{
var running = new FlowNodeRunningInfo(node)
{
NodeInfo = new List(),
SceneInfo = new List()
};
if (node.Children != null && node.Children.Any())
{
foreach (var child in node.Children)
{
GetFlowNodeRunningInfo((FlowNode)child, running);
}
}
if (node.SceneInfos != null && node.SceneInfos.Any())
{
foreach (var sceneInfo in node.SceneInfos)
{
GetSceneRunningInfo(sceneInfo, running);
}
}
parent.NodeInfo.Add(running);
return running;
}
public SceneRunningInfo GetSceneRunningInfo(SceneNode node, FlowNodeRunningInfo parent)
{
var running = new SceneRunningInfo(node)
{
BehaviorInfo = new List()
};
if (node.Children != null && node.Children.Any())
{
foreach (var child in node.Children)
{
GetBehaviorRunningInfo((BehaviorNode)child, running);
}
}
parent.SceneInfo.Add(running);
return running;
}
public BehaviorRunningInfo GetBehaviorRunningInfo(BehaviorNode node, SceneRunningInfo parent)
{
var running = new BehaviorRunningInfo(node) {KeyWords = node.GetKeyWords()};
parent.BehaviorInfo.Add(running);
return running;
}
#endregion
#region override
public override void SetPreVariables()
{
SetVariable(DefaultVariable.RunningId, RunningId);
base.SetPreVariables();
}
protected override void CreateSelfNode(IwbXmlNode xmlNode)
{
EventSwitch = true;
if (xmlNode != null)
{
RunningId = xmlNode.GetChildValue("RunningId");
EngineType = xmlNode.GetChildValue("EngineType");
AutoNextRound = xmlNode.GetChildValue("AutoNextRound").ValB();
AssessRoles = xmlNode.GetChildValue("AssessRoles")?.StrToArray()?.ToList() ?? new List();
AssessAuto = xmlNode.GetChildValue("AssessAuto").ValB();
RoundScore = xmlNode.GetChildValue("RoundScore").ValD();
var childNodes = xmlNode.GetChildNode("RoundInfos")?.Nodes;
if (childNodes != null && childNodes.Count > 0)
{
foreach (IwbXmlNode childNode in childNodes)
{
var node = (SceneRoundNode)new SceneRoundNode() { Parent = this }.CreateNodeByXmlNode(childNode);
Children.Add(node);
}
}
}
}
public override string ToXmlString()
{
return ToXmlStringSelf();
}
public string ToXmlStringSelf(bool withHeader = true)
{
string str = withHeader ? "" : "";
str += $"\r\n";
str += RunningId.IsEmpty() ? "" : $"{RunningId}";
str += base.ToXmlString();
str += $"{CurrentRound}\r\n";
str += $"{AutoNextRound}\r\n";
str += EngineType.IsEmpty() ? "" : $"{EngineType}\r\n";
str += AssessRoles == null ? "" : $"{AssessRoles?.ToArray().ArrayToStr()}\r\n";
str += $"{AssessAuto.ToString().UAndT()}\r\n";
if (Children?.Count > 0)
{
str += "\r\n";
foreach (var sceneRound in Children)
{
str += sceneRound.ToXmlString();
}
str += "\r\n";
}
str += "\r\n";
return str;
}
#endregion override
}
///
/// 演练轮次
///
public class SceneRoundNode : NodeBase
{
public SceneRoundNode()
{
NodeType = NodeType.SceneRound;
}
///
/// 轮次
///
public int RoundIndex { get; set; }
private decimal _roundFullScore;
///
/// 轮次总分
///
public decimal RoundFullScore
{
get => (HasParent && ((PackageNode) Parent).RoundScore > 0)
? ((PackageNode) Parent).RoundScore
: _roundFullScore;
set => _roundFullScore = value;
}
///
/// 最大情景流数量
///
public int SceneCount { get; set; }
private int _controlRate;
///
/// 随机几率
///
public int ControlRate
{
get => _controlRate;
set => _controlRate = value > 100 ? 100 : value < 0 ? 0 : value;
}
///
/// 获取当前所在的轮次
///
///
public SceneRoundNode GetSelfRound()
{
return this;
}
///
/// 是否已选中演化情景流块(一个轮次只能选一个演化情景流块)
///
public bool EvolutionBlockHasSelected { get; set; }
///
/// 从运行数据恢复到运行态
///
///
public void ConvertFromRun(RoundRunningInfo running)
{
Variables = running.VariableTable;
WaitPath = running.WaitPath;
NodeState = GetNodeState(running);
if (HasChild)
{
foreach (var nodeBase in Children)
{
var child = (SceneFlowBlockNode)nodeBase;
var runChild = running.BlockInfo.FirstOrDefault(a => a.Path == child.NodePath);
if (runChild != null)
{
child.ConvertFromRun(runChild);
}
}
}
}
#region override
public override void SetPreVariables()
{
SetVariable(DefaultVariable.FullRoundScore, RoundFullScore);
var score = RoundIndex == 1
? new Random(0).Next(0, Convert.ToInt32(NodeFullScore))
: Parent.Children.Select(a => (SceneRoundNode) a).FirstOrDefault(a => a.RoundIndex == RoundIndex - 1)?
.ActualScore ?? 0;
SetVariable(DefaultVariable.PrevNodeScore, score);
SetVariable(DefaultVariable.RoundScore, score);
base.SetPreVariables();
}
public override void SetRunnedVariables()
{
SetVariable(DefaultVariable.RoundScore,ActualScore);
base.SetRunnedVariables();
}
protected override void CreateSelfNode(IwbXmlNode xmlNode)
{
if (xmlNode != null)
{
RoundIndex = xmlNode.GetChildValue("RoundIndex").ValI();
SceneCount = xmlNode.GetChildValue("SceneCount").ValI();
RoundFullScore = xmlNode.GetChildValue("RoundFullScore").ValD();
ControlRate = xmlNode.GetChildValue("ControlRate").ValI();
var childNodes = xmlNode.GetChildNode("BlockInfos")?.Nodes;
if (childNodes != null && childNodes.Count > 0)
{
foreach (IwbXmlNode childNode in childNodes)
{
var node = (SceneFlowBlockNode)new SceneFlowBlockNode() { Parent = this }.CreateNodeByXmlNode(childNode);
Children.Add(node);
}
}
}
}
public override string ToXmlString()
{
string str = "";
str += $"\r\n";
str += base.ToXmlString();
str += $"{RoundIndex}\r\n";
str += $"{RoundFullScore}\r\n";
str += $"{SceneCount}\r\n";
str += $"{ControlRate}\r\n";
if (Children?.Count > 0)
{
str += "\r\n";
foreach (var flowBlock in Children)
{
str += flowBlock.ToXmlString();
}
str += "\r\n";
}
str += "\r\n";
return str;
}
#endregion override
}
///
/// 情景流块
///
public class SceneFlowBlockNode : NodeBase
{
public SceneFlowBlockNode()
{
NodeType = NodeType.SceneFlowBlock;
}
///
/// 情景流块类型(客观|演化)
///
public SceneFlowBlockType BlockType { get; set; }
///
/// 当前轮次
///
public SceneRoundNode SelfRound => GetSelfRound();
///
/// 获取当前所在的轮次
///
///
public SceneRoundNode GetSelfRound()
{
return HasParent ? ((SceneRoundNode)Parent).GetSelfRound() : null;
}
///
/// 从运行数据恢复到运行态
///
///
public void ConvertFromRun(BlockRunningInfo running)
{
Variables = running.VariableTable;
WaitPath = running.WaitPath;
NodeState = GetNodeState(running);
if (HasChild)
{
foreach (var nodeBase in Children)
{
var child = (SceneFlowNode)nodeBase;
var runChild = running.FlowInfo.FirstOrDefault(a => a.Path == child.NodePath);
if (runChild != null)
{
child.ConvertFromRun(runChild);
}
}
}
}
#region override
protected override void CreateSelfNode(IwbXmlNode xmlNode)
{
if (xmlNode != null)
{
BlockType = xmlNode.GetChildValue("FlowBlockType").GetEnumByName();
var flowNos = xmlNode.GetChildValue("SceneFlowNos")?.StrToArray();
if (flowNos != null && flowNos.Length > 0)
{
foreach (var no in flowNos)
{
var id = no;
var child = new SceneFlowNode() { Parent = this }.CreateFlowById(id);
child.InternalNo = no;
Children.Add(child);
}
}
}
}
public override string ToXmlString()
{
string str = "";
str += $"\r\n";
str += base.ToXmlString();
str += $"{BlockType}\r\n";
if (Children?.Count > 0)
{
//str += "\r\n";
//foreach (var sceneFlow in Children)
//{
// str += sceneFlow.ToXmlString();
//}
//str += "\r\n";
str += $"{Children.Select(a => $"{a.Id}|{a.InternalNo}").ToArray().ArrayToStr()}";
}
str += "\r\n";
return str;
}
#endregion override
}
///
/// 情景流
///
public class SceneFlowNode : NodeBase
{
public SceneFlowNode()
{
NodeType = NodeType.SceneFlow;
}
public FlowNode RunningNode { get; set; }
///
/// 当前轮次
///
public SceneRoundNode SelfRound => GetSelfRound();
///
/// 获取当前所在的轮次
///
///
public SceneRoundNode GetSelfRound()
{
return HasParent ? ((SceneFlowBlockNode)Parent).GetSelfRound() : null;
}
///
/// 根据flowId创建情景流
///
///
///
public SceneFlowNode CreateFlowById(string flowId)
{
var xmlNode= PackageHelper.GetSceneFlowXmlFromFile(CurPackageInfo?.Id ?? "", flowId);
if (xmlNode != null)
{
return (SceneFlowNode)CreateNodeByXmlNode(xmlNode);
}
return null;
}
///
/// 从运行数据恢复到运行态
///
///
public void ConvertFromRun(FlowRunningInfo running)
{
Variables = running.VariableTable;
NodeState = GetNodeState(running);
WaitPath = running.WaitPath;
if (HasChild)
{
foreach (var nodeBase in Children)
{
var child = (FlowNode)nodeBase;
var runChild = running.NodeInfo.FirstOrDefault(a => a.Path == child.NodePath);
if (runChild != null)
{
child.ConvertFromRun(runChild);
}
}
}
}
#region override
public override void SetPreVariables()
{
SetVariable(DefaultVariable.FullFlowScore, NodeFullScore);
SetVariable(DefaultVariable.FlowScore, ActualScore);
base.SetPreVariables();
}
protected override void CreateSelfNode(IwbXmlNode xmlNode)
{
var childNodes = xmlNode?.GetChildNode("FlowNodes")?.Nodes;
if (childNodes != null && childNodes.Count > 0)
{
foreach (IwbXmlNode childNode in childNodes)
{
var node = (FlowNode)new FlowNode() { Parent = this }.CreateNodeByXmlNode(childNode);
Children.Add(node);
}
}
}
public override string ToXmlString()
{
string str = "";
str += $"\r\n";
str += base.ToXmlString();
if (Children?.Count > 0)
{
str += "\r\n";
foreach (var node in Children)
{
str += node.ToXmlString();
}
str += "\r\n";
}
str += "\r\n";
return str;
}
#endregion override
}
///
/// 情景流节点
///
public class FlowNode:NodeBase
{
public FlowNode()
{
NodeType = NodeType.FlowNode;
SceneInfos= new List();
}
///
/// 节点深度
///
public int FlowDepth { get; set; }
///
/// 是否是留根节点
///
public bool IsFlowRoot { get; set; }
public string SceneNos { get; set; }
public string SceneNames { get; set; }
///
/// 当前轮次
///
public SceneRoundNode SelfRound => SelfFlow?.SelfRound;
///
/// 当前情景流
///
public SceneFlowNode SelfFlow => GetSelfFlow();
///
/// 情景集合
///
public List SceneInfos { get; set; }
///
/// 情景总权重
///
public decimal SceneFullWeights => SceneInfos?.Where(a=>a.ChildFullWeights>0).Sum(a => a.Weights) ?? 0;
///
/// 获取当前所在的情景流
///
///
public SceneFlowNode GetSelfFlow()
{
return Parent.NodeType != NodeType.SceneFlow ? ((FlowNode) Parent).GetSelfFlow() : (SceneFlowNode) Parent;
}
///
/// 从运行数据恢复到运行态
///
///
public void ConvertFromRun(FlowNodeRunningInfo running)
{
Variables = running.VariableTable;
NodeState = GetNodeState(running);
WaitPath = running.WaitPath;
if (SceneInfos != null && SceneInfos.Any())
{
foreach (var sceneInfo in SceneInfos)
{
var runChild = running.SceneInfo.FirstOrDefault(a => a.Path == sceneInfo.NodePath);
if (runChild != null)
{
sceneInfo.ConvertFromRun(runChild);
}
}
}
if (NodeState == NodeState.Running)
{
SelfFlow.RunningNode = this;
}
else if (HasChild)
{
foreach (var nodeBase in Children)
{
var child = (FlowNode)nodeBase;
var runChild = running.NodeInfo.FirstOrDefault(a => a.Path == child.NodePath);
if (runChild != null)
{
child.ConvertFromRun(runChild);
}
}
}
}
#region override
public override void SetPreVariables()
{
SetVariable(DefaultVariable.FlowNodeScore, ActualScore);
SetVariable(DefaultVariable.FullFlowScore, SelfFlow.NodeFullScore);
SetVariable(DefaultVariable.PrevNodeScore, SelfFlow.ActualScore);
base.SetPreVariables();
}
public override void SetRunnedVariables()
{
SetVariable(DefaultVariable.FlowNodeScore, ActualScore);
Parent.SetVariable(DefaultVariable.FlowScore, SelfFlow.ActualScore);
Parent.SetVariable($"{DefaultVariable.FlowScore}{FlowDepth}", SelfFlow.ActualScore);
}
protected override void CreateSelfNode(IwbXmlNode xmlNode)
{
IsFlowRoot = Parent.NodeType == NodeType.FlowNode;
if (xmlNode != null)
{
FlowDepth = xmlNode.GetChildValue("").ValI();
SceneNos = xmlNode.GetChildValue("SceneInfoNos");
var sceneNos = SceneNos?.StrToArray();
if (sceneNos != null && sceneNos.Length > 0)
{
foreach (var no in sceneNos)
{
var nos = no.StrToArray("|");
var id = nos[0];
var child = new SceneNode() { Parent = this }.CreateSceneById(id);
if (nos.Length >1)
{
child.InternalNo = nos[1];
}
SceneNames = (SceneNames.IsEmpty() ? "" : ",") + child.Name;
SceneInfos.Add(child);
}
}
var childNodes = xmlNode.GetChildNode("ChildNodes")?.Nodes;
if (childNodes != null && childNodes.Count > 0)
{
foreach (IwbXmlNode childNode in childNodes)
{
var node = (FlowNode)new FlowNode() { Parent = this }.CreateNodeByXmlNode(childNode);
Children.Add(node);
}
}
}
}
public override string ToXmlString()
{
string str = "";
str += $"\r\n";
str += base.ToXmlString();
str += $"{FlowDepth}\r\n";
if (Children?.Count > 0)
{
str += "";
foreach (var node in Children)
{
str += node.ToXmlString();
}
str += "\r\n";
}
if (SceneInfos?.Count > 0)
{
str += $"{SceneInfos.Select(a => $"{a.Id}|{a.InternalNo}").ToArray().ArrayToStr()}";
str += $"{SceneInfos.Select(a => $"{a.Name}").ToArray().ArrayToStr()}";
}
else
{
str += $"{SceneNos}";
str += $"{SceneNames}";
}
str += "\r\n";
return str;
}
#endregion override
}
///
/// 情景信息
///
public class SceneNode : NodeBase
{
public SceneNode()
{
NodeType = NodeType.SceneInfo;
}
public SceneType SceneType { get; set; }
///
/// 当前轮次
///
public SceneRoundNode SelfRound => SelfFlow?.SelfRound;
///
/// 情景标签
///
public string SceneTag { get; set; }
private string _desc;
///
/// 情景信息
///
public string Description
{
get => _desc?.IndexOf(IwbVariableType.Local, StringComparison.Ordinal) >= 0 ? EvalExpr.TransVariable(_desc, GetVariables()) : _desc;
set => _desc = value;
}
///
/// 当前情景流
///
public SceneFlowNode SelfFlow => GetSelfFlow();
///
/// 环境渲染码
///
public List EnvironResources { get; set; }
///
/// 触发关键负向行为(true 为0分)
///
public bool ImportantNegative => CheckImportantNegative();
///
/// 获取当前所在的情景流
///
///
public SceneFlowNode GetSelfFlow()
{
return HasParent ? ((FlowNode)Parent).GetSelfFlow() : null;
}
///
/// 检查是否触发关键性负向行为
///
///
private bool CheckImportantNegative()
{
return HasChild && Children.Select(a=>(BehaviorNode)a).Any(a=>a.ImportantNegative);
}
///
/// 从运行数据恢复到运行态
///
///
public void ConvertFromRun(SceneRunningInfo running)
{
Variables = running.VariableTable;
NodeState = GetNodeState(running);
WaitPath = running.WaitPath;
if (HasChild)
{
foreach (var nodeBase in Children)
{
var child = (BehaviorNode)nodeBase;
var runChild = running.BehaviorInfo.FirstOrDefault(a => a.Path == child.NodePath);
if (runChild != null)
{
child.ConvertFromRun(runChild);
}
}
}
}
#region override
public override void SetRunnedVariables()
{
SetVariable(DefaultVariable.SceneScore, ActualScore);
base.SetRunnedVariables();
}
protected override bool CheckChildIsRunning()
{
return NodeState == NodeState.Running;
}
protected override void CreateSelfNode(IwbXmlNode xmlNode)
{
if (xmlNode != null)
{
SceneType = xmlNode.GetChildValue("SceneType").GetEnumByName();
SceneTag = xmlNode.GetChildValue("SceneTag");
Description = xmlNode.GetChildValue("Description");
var behaviorNos = xmlNode.GetChildValue("BehaviorNos")?.StrToArray();
if (behaviorNos != null && behaviorNos.Length > 0)
{
foreach (var no in behaviorNos)
{
var nos = no.StrToArray("|");
var id = nos[0];
var child = new BehaviorNode() { Parent = this }.CreateBehaviorById(id);
if (nos.Length >= 2)
{
child.InternalNo = nos[1];
}
Children.Add(child);
}
}
var resourceNos = xmlNode.GetChildValue("EnvironResourceNos")?.StrToArray();
if (resourceNos != null && resourceNos.Length > 0)
{
foreach (var no in resourceNos)
{
var nos = no.StrToArray("|");
var id = nos[0];
var child = new EnvironmentRender().CreateEnvironmentById(CurPackageInfo?.Id ?? "", id);
EnvironResources = EnvironResources ?? new List();
EnvironResources.Add(child);
}
}
}
}
public SceneNode CreateSceneById( string id)
{
var xmlNode = PackageHelper.GetSceneXmlFromFile(CurPackageInfo?.Id ?? "", id);
return (SceneNode) CreateNodeByXmlNode(xmlNode);
}
public override string ToXmlString()
{
string str = "";
str += $"\r\n";
str += base.ToXmlString();
str += $"{SceneType}\r\n";
str += SceneTag.IsEmpty() ? "" : $"{SceneTag}\r\n";
str += $"{ImportantNegative}\r\n";
str += $"{Description}\r\n";
if (EnvironResources?.Count > 0)
{
str += "";
str += string.Join(",", EnvironResources.Select(a => Id).ToArray());
//foreach (var render in EnvironResources)
//{
// str += render.ToXmlString();
//}
str += "\r\n";
}
if (Children?.Count > 0)
{
//str += "";
//foreach (var behaviorNode in Children)
//{
// str += behaviorNode.ToXmlString();
//}
//str += "\r\n";
str += $"{Children.Select(a => $"{a.Id}|{a.InternalNo}").ToArray().ArrayToStr()}";
}
str += "\r\n";
return str;
}
#endregion override
}
///
/// 行为节点
///
public class BehaviorNode : NodeBase
{
public BehaviorNode()
{
NodeType = NodeType.Behavior;
}
public BehaviorNode(string word):this()
{
KeyWords = word;
CreateKeyWord();
}
/////
///// 行为类型
/////
//public BehaviorType BehaviorType { get; set; }
///
/// 行为得分类型
///
public BehaviorScoreType BehaviorScoreType { get; set; }
///
/// 关键字字符串
///
public string KeyWords { get; set; }
///
/// 行为规则
///
public string Description { get; set; }
///
/// 行为标签
///
public string BehaviorTag { get; set; }
///
/// 行为标签
///
public string[] BehaviorTagArray => BehaviorTag.StrToArray();
///
/// 行为角色
///
public string[] BehaviorRole { get; set; }
///
/// 行为角色关系
///
public BehaviorRoleLogicType BehaviorRoleLogic { get; set; }
///
/// 触发关键负向行为(true 情景为0分)
///
public bool ImportantNegative => CheckImportantNegative();
///
/// 环境渲染码
///
public List EnvironResources { get; set; }
///
/// 检查是否触发关键性负向行为
///
///
private bool CheckImportantNegative()
{
return HasChild && BehaviorScoreType==BehaviorScoreType.ImportantNegative && Children.Select(a=>(KeyWord)a).Any(a=>a.HasMatched);
}
///
/// 从运行数据恢复到运行态
///
///
public void ConvertFromRun(BehaviorRunningInfo running)
{
NodeState = GetNodeState(running);
WaitPath = running.WaitPath;
KeyWords = running.KeyWords;
CreateKeyWord();
}
#region override
protected override bool CheckChildIsRunning()
{
return false;
}
protected override void CreateSelfNode(IwbXmlNode xmlNode)
{
if (xmlNode != null)
{
BehaviorScoreType = xmlNode.GetChildValue("ScoreType").GetEnumByName();
BehaviorRoleLogic = xmlNode.GetChildValue("RoleLogic").GetEnumByName();
BehaviorTag = xmlNode.GetChildValue("BehaviorTag");
Description = xmlNode.GetChildValue("Description");
KeyWords = xmlNode.GetChildValue("KeyWord");
CreateKeyWord();
BehaviorRole = xmlNode.GetChildValue("Role")?.StrToArray() ?? new string[0];
var resourceNos = xmlNode.GetChildValue("EnvironResourceNos")?.StrToArray();
if (resourceNos != null && resourceNos.Length > 0)
{
foreach (var no in resourceNos)
{
var nos = no.StrToArray("|");
var id = nos[0];
var child = new EnvironmentRender().CreateEnvironmentById(CurPackageInfo?.Id ?? "", id);
EnvironResources = EnvironResources ?? new List();
EnvironResources.Add(child);
}
}
}
}
public BehaviorNode CreateBehaviorById(string id)
{
var xmlNode = PackageHelper.GetBehaviorXmlFromFile(CurPackageInfo?.Id ?? "", id);
return (BehaviorNode)CreateNodeByXmlNode(xmlNode);
}
private void CreateKeyWord()
{
string wordStr = KeyWords;
if (KeyWords.StartsWith("[") && KeyWords.EndsWith("]"))
{
wordStr = KeyWords.StrToArray()[0];
}
var wordArray = wordStr?.StrToArray();
if (wordArray != null && wordArray.Length > 0)
{
Children= new List();
foreach (string word in wordArray)
{
var kc = new KeyWord(word, this);
Children.Add(kc);
}
}
}
public string GetKeyWords()
{
var str = "";
if (HasChild)
{
foreach (var keyWord in Children)
{
str += (str == "" ? "" : ",") + keyWord.ToXmlString();
}
}
return str;
}
public override string ToXmlString()
{
string str = "";
str += $"\r\n";
str += base.ToXmlString();
//str += $"{BehaviorType}\r\n";
str += $"{BehaviorScoreType}\r\n";
str += BehaviorRole?.Length > 0 ? $"{BehaviorRole.ArrayToStr()}\r\n" : "";
str += $"{BehaviorRoleLogic}\r\n";
str += $"{BehaviorTag}\r\n";
str += $"{Description}\r\n";
if (Children?.Count > 0)
{
string str1 = "",str2="";
foreach (var keyWord in Children)
{
str1 += (str1 == "" ? "" : ",") + keyWord.ToXmlString();
str2 += ((KeyWord)keyWord).MatchWordXmlString();
}
str += $"[{str1}]\r\n";
if (str2.IsNotEmpty())
{
str += "";
str += str2;
str += "";
}
}
else
{
str += $"{KeyWords}\r\n";
}
str += "\r\n";
return str;
}
#endregion override
}
///
/// 关键字分组
///
public sealed class KeyWord : NodeBase
{
public KeyWord()
{
NodeType = NodeType.KeyWord;
}
///
/// [aa,bb,ccc]:8:0【关键字:比重:是否匹配】
///
///
public KeyWord(string words) : this()
{
Word = words;
string w = words;
if (words.StartsWith("[") && words.EndsWith("]"))
{
w = words.StrToArray()[0];
}
var arr = w.StrToArray(":");
if (arr.Length == 2)
{
Words = arr[0].StrToArray();
Weights = arr[1].ValD();
HasMatched = false;
}
else if (arr.Length == 3)
{
Words = arr[0].StrToArray();
Weights = arr[1].ValD();
HasMatched = arr[2].ValB();
}
}
public KeyWord(string words, BehaviorNode parent) : this(words)
{
Parent = parent;
}
///
/// 行为角色
///
public string[] Roles => HasParent ? ((BehaviorNode) Parent).BehaviorRole : "".StrToArray();
///
/// 匹配此关键字的内容
///
public string MatchWord { get; set; }
///
/// 是否匹配
///
public bool HasMatched { get; set; }
///
/// 关键字信息
///
public string Word { get; set; }
///
/// 关键字数组
///
public string[] Words { get; set; }
#region override
protected override bool CheckChildIsRunning()
{
return false;
}
public override string ToString()
{
return $"[{GetType().Name}]【{Word}】";
}
public override string ToXmlString()
{
string str = Words?.Length > 0 ? $"[{Words.ArrayToStr()}]:{Weights}:{(HasMatched ? "1" : "0")}" : "";
return str;
}
public string MatchWordXmlString()
{
string str = MatchWord.IsEmpty()? "":$"{ToXmlString()}|{MatchWord}\r\n";
return str;
}
#endregion override
}
///
/// 环境渲染
///
public class EnvironmentRender
{
public string Id { get; set; }
public string NodePath { get; set; }
public string ResourceName { get; set; }
public int ResourceType { get; set; }
public string ResourcePath { get; set; }
public string Description { get; set; }
public string MessageCode { get; set; }
public EnvironmentRender CreateEnvironmentById(string packageId,string id)
{
var xmlNode = PackageHelper.GetEnvironResourceXmlFromFile(packageId, id);
return CreateNodeByXmlNode(xmlNode);
}
public EnvironmentRender CreateNodeByXmlNode(IwbXmlNode xmlNode)
{
if (xmlNode != null )
{
Id = xmlNode.GetChildValue("Id");
ResourceName = xmlNode.GetChildValue("ResourceName");
ResourceType = xmlNode.GetChildValue("ResourceType").ValI();
ResourcePath = xmlNode.GetChildValue("ResourcePath");
MessageCode = xmlNode.GetChildValue("MessageCode");
Description = xmlNode.GetChildValue("Description");
}
return this;
}
public string ToXmlString()
{
string str = "";
str += $"\r\n";
str += $"{ResourceName}\r\n";
str += $"{ResourceType}\r\n";
str += ResourcePath.IsEmpty() ? "" : $"{ResourcePath}\r\n";
str += MessageCode.IsEmpty() ? "" : $"{MessageCode}\r\n";
str += Description.IsEmpty() ? "" : $"{Description}\r\n";
str += $"\r\n";
return str;
}
}
///
/// 引导信息
///
public class GuideNode
{
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool IsPush { get; set; }
public int GuideType { get; set; }
public GuideNode CreateNodeByXmlNode(IwbXmlNode xmlNode)
{
if (xmlNode != null)
{
Id = xmlNode.GetChildValue("Id");
Name = xmlNode.GetChildValue("Name");
Description = xmlNode.GetChildValue("Description");
GuideType = xmlNode.GetChildValue("GuideType").ValI();
IsPush = xmlNode.GetChildValue("IsPush").ValB();
}
return this;
}
public string ToXmlString()
{
string str = "";
str += $"\r\n";
str += $"{Name}\r\n";
str += $"{Description}\r\n";
str += $"{IsPush}\r\n";
str += "\r\n";
return str;
}
}
}