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; } } }