public static MissionRaw Create(string xmlpath) { XmlDocument doc = new XmlDocument(); doc.Load(xmlpath); XmlElement elem = doc.DocumentElement; int cnt = elem.Attributes.Count; MissionRaw raw = new MissionRaw(); raw.properties = new ParamRaw(cnt - 2); for (int i = 0; i < cnt; ++i) { if (i == 0) { raw.id = XmlConvert.ToInt32(elem.Attributes[i].Value); } else if (i == 1) { raw.name = System.Uri.UnescapeDataString(elem.Attributes[i].Value); } else { raw.properties.Set(i - 2, elem.Attributes[i].Name, System.Uri.UnescapeDataString(elem.Attributes[i].Value)); } } int tcnt = elem.ChildNodes.Count; raw.triggers = new TriggerRaw[tcnt]; for (int i = 0; i < tcnt; ++i) { raw.triggers[i] = TriggerRaw.Create(elem.ChildNodes[i] as XmlElement); } return(raw); }
/// <summary>Restore the scenario data from a opening stream</summary> public void Import(BinaryReader r) { int version = r.ReadInt32(); switch (version) { case 0x00000001: { m_Pause = true; int count = r.ReadInt32(); m_MaxMissionId = 0; for (int i = 0; i < count; i++) { int instId = r.ReadInt32(); int dataId = r.ReadInt32(); bool enabled = r.ReadBoolean(); if (!m_MissionRaws.ContainsKey(dataId)) { throw new System.Exception("Mission raw data of id [" + dataId.ToString() + "] is missing"); } Mission mis = new Mission(instId, m_MissionRaws[dataId], this); mis.Init(); int trg_cnt = r.ReadInt32(); if (trg_cnt != mis.triggers.Length) { throw new System.Exception("Trigger count is not correct"); } for (int j = 0; j < trg_cnt; j++) { mis.triggers[j].Import(r); } VarScope vs = Variables.CreateChild(); vs.Import(r); MissionVariables[mis] = vs; m_MissionInsts.Add(instId, mis); if (enabled) { //mis.Resume(); m_RunningMissions.Add(dataId, mis); } if (instId > m_MaxMissionId) { m_MaxMissionId = instId; } } Variables.Import(r); // restore action thread count = r.ReadInt32(); for (int i = 0; i < count; i++) { int instId = r.ReadInt32(); int dataId = r.ReadInt32(); int trigger_idx = r.ReadInt32(); int group = r.ReadInt32(); int cur_idx = r.ReadInt32(); if (!m_MissionRaws.ContainsKey(dataId)) { throw new System.Exception("Mission raw data of id [" + dataId.ToString() + "] is missing"); } if (!m_MissionInsts.ContainsKey(instId)) { throw new System.Exception("Mission instance of instId [" + dataId.ToString() + "] is missing"); } MissionRaw mis_raw = m_MissionRaws[dataId]; ActionThread thread = null; Mission mis = m_MissionInsts[instId]; mis.triggers[trigger_idx].FillActionCache(group); thread = new ActionThread(mis.triggers[trigger_idx], trigger_idx, group, mis_raw.triggers[trigger_idx].actions[group], mis.triggers[trigger_idx].GetActionCache(group), cur_idx); mis.triggers[trigger_idx].RegisterActionThreadEvent(thread); AddActionThread(thread); thread.CreateCurrAction(); if (thread.currAction != null) { thread.currAction.RestoreState(r); } } } break; } }
public Mission(int instid, MissionRaw raw, Scenario scene) { instId = instid; m_Raw = raw; scenario = scene; }
/// <summary>Load a single xml file, and restore it as a mission raw data.</summary> /// <param name="xmlpath">Specify the path of xml file.</param> public void LoadFile(string xmlpath) { MissionRaw raw = MissionRaw.Create(xmlpath); m_MissionRaws[raw.id] = raw; }
void OnGUI() { BeginContent(); if (Scenario.debugTarget != null) { EditorGUILayout.BeginHorizontal(); mission_sc = EditorGUILayout.BeginScrollView(mission_sc); EditorGUILayout.BeginVertical(); TreeNode("Mission Instances", true); EditorGUI.indentLevel++; foreach (var kvp in Scenario.debugTarget.missionInsts) { MissionRaw raw = null; if (Scenario.debugTarget.missionRaws.ContainsKey(kvp.Value.dataId)) { raw = Scenario.debugTarget.missionRaws[kvp.Value.dataId]; } if (raw != null) { TreeNode(raw.name, true); } else { GUI.contentColor = Color.red; GUILayout.Label(" <No data>"); GUI.contentColor = Color.white; } } EditorGUI.indentLevel--; TreeNode("Scenario Variables", true); EditorGUI.indentLevel++; string[] names = Scenario.debugTarget.scenarioVars.declaredVars; foreach (var varname in names) { GUILayout.Label(" " + varname + " = " + Scenario.debugTarget.scenarioVars[varname].data); } EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); EditorGUILayout.EndScrollView(); threads_sc = EditorGUILayout.BeginScrollView(threads_sc); EditorGUILayout.BeginVertical(); TreeNode("Action Threads", true); EditorGUI.indentLevel++; for (int i = 0; i < Scenario.debugTarget.actionThreads.Count; ++i) { TreeNode("Thread[" + i + "]", true); } EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); EditorGUILayout.EndScrollView(); EditorGUILayout.EndHorizontal(); } else { GUILayout.Label("No debug target."); } EndContent(); }