using ChivaXR;
using ChivaXR.Op;
using QFramework;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using UnityEngine;
///
/// 自由版流程控制
///
public class FreeProcessManagement : MonoSingleton
{
//自由操作清单
public List freeProcessElements = new List();
//当前场景中激活的操作
public List activeProcessElements = new List();
private List tmpStepFreeConditionss = new List();
public Dictionary dic_NoOperationData = new Dictionary();
public void InitFreeProcess(string courseName)
{
FreeStepListProxy m_FreeStepListProxy = DAL.Instance.Get();
tmpStepFreeConditionss = m_FreeStepListProxy.ReadStepMsgInfoFromTable(courseName);
for (int i = 0; i < tmpStepFreeConditionss.Count; i++)
{
FreeProcessElement tmpProcessElement = new FreeProcessElement();
tmpProcessElement.freeProcessElement = ProcessManagement.Instance.processes[i];
foreach (var item in tmpStepFreeConditionss[i].preStepCondition.Split('/'))
{
if (string.IsNullOrEmpty(item)) { continue; }
int id = int.Parse(item);
if (id == 0) continue;
tmpProcessElement.preconditions.Add(ProcessManagement.Instance.processes[id - 1]);
};
freeProcessElements.Add(tmpProcessElement);
}
}
public void ActiveProcess()
{
foreach (var item in freeProcessElements)
{
item.Init();
}
}
public void RecordProcessElementActiveState(ProcessElement processElement)
{
if (!activeProcessElements.Contains(processElement))
{
activeProcessElements.Add(processElement);
UIKit.GetPanel().AddProcessElement(processElement, tmpStepFreeConditionss[processElement.stepID - 1].stepName);
//检测非交互操作点如:语音播放等
PB_OpData pbOpData = processElement.GetComponent();
if (OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName) == null)
{
return;
}
OperationDataBase tmpOperationData = OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName);
if ((tmpOperationData as OpTrigger_ToolPack == null) && !dic_NoOperationData.Keys.Contains(tmpOperationData))
{
dic_NoOperationData.Add(tmpOperationData, tmpStepFreeConditionss[processElement.stepID - 1].stepName);
}
}
}
public void RemoveProcessElementActiveState(ProcessElement processElement)
{
if (activeProcessElements.Contains(processElement))
{
activeProcessElements.Remove(processElement);
UIKit.GetPanel().RemoveProcessElement(processElement);
//检测非交互操作点如:语音播放等
PB_OpData pbOpData = processElement.GetComponent();
if (OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName) == null)
{
return;
}
OperationDataBase tmpOperationData = OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName);
if ((tmpOperationData as OpTrigger_ToolPack == null) && dic_NoOperationData.Keys.Contains(tmpOperationData))
{
dic_NoOperationData.Remove(tmpOperationData);
}
}
}
}
public class FreeProcessElement
{
///
/// 前置流程条件
///
public List preconditions = new List();
public ProcessElement freeProcessElement;
public void Init()
{
foreach (ProcessElement element in preconditions)
{
element.processElementExitHandle += PreConditionProcessFinished;
}
freeProcessElement.processElementExitHandle += FreeProcessElementFinished;
if (preconditions.Count == 0)
{
FreeProcessManagement.Instance.RecordProcessElementActiveState(freeProcessElement);
freeProcessElement.Enter();
}
}
///
/// 前置流程完成检测
///
///
public void PreConditionProcessFinished(ProcessElement element)
{
bool allPreConditionFinished = true;
foreach (var item in preconditions)
{
if (!item.finished)
{
allPreConditionFinished = false;
}
}
if (allPreConditionFinished && !freeProcessElement.active && !freeProcessElement.finished)
{
freeProcessElement.Enter();
FreeProcessManagement.Instance.RecordProcessElementActiveState(freeProcessElement);
}
}
///
/// 当前自由流程完成
///
///
public void FreeProcessElementFinished(ProcessElement element)
{
if (freeProcessElement == element)
{
FreeProcessManagement.Instance.RemoveProcessElementActiveState(freeProcessElement);
ToolLibraryForm.RefrushAllChoseTool();
}
}
}