// Returns whether the encounter was found (and therefore removed). public bool RemoveEncounter(EncounterNodeData encounter) { GameMasterNode encounterNodeFile = encounter.NodeFile; var filePath = GetEncounterFilePath(encounter); string key = null; foreach (var pair in mEncounters) { if (pair.Value == filePath) { key = pair.Key; break; } } if (key != null) { mEncounters.Remove(key); mEncounterFiles.Remove(encounterNodeFile); (NodeFile.Json["encounters"] as JObject).Property(key).Remove(); NodeFile.IsModified = true; NodeFile.SaveIfNecessary(); return(true); } else { return(false); } }
private string GetEncounterFilePath(EncounterNodeData encounter) { GameMasterNode encounterNodeFile = encounter.NodeFile; string filePath = encounterNodeFile.Path; string selfPath = NodeFile.Directory + '/'; // TODO: if selfPath isn't in filePath, make path relative to mod folder. return("file(" + filePath.Replace(selfPath, "") + ")"); }
public void AddEncounter(EncounterNodeData encounter) { GameMasterNode encounterNodeFile = encounter.NodeFile; var filePath = GetEncounterFilePath(encounter); mEncounters.Add(encounterNodeFile.Name, filePath); mEncounterFiles.Add(encounterNodeFile); NodeFile.Json["encounters"][encounterNodeFile.Name] = filePath; NodeFile.IsModified = true; NodeFile.SaveIfNecessary(); }
public void AddEncounter(EncounterNodeData encounter) { // TODO, get relative path GameMasterNode encounterNodeFile = encounter.NodeFile; string filePath = encounterNodeFile.Path; string selfPath = NodeFile.Directory + '/'; filePath = "file(" + filePath.Replace(selfPath, "") + ")"; mEncounters.Add(encounterNodeFile.Name, filePath); mEncounterFiles.Add(encounterNodeFile); NodeFile.Json["encounters"][encounterNodeFile.Name] = filePath; NodeFile.IsModified = true; NodeFile.SaveIfNecessary(); }
protected override void UpdateOutEdges(Graph graph) { foreach (GameMasterNode file in mEncounterFiles) { if (file.NodeType == GameMasterNodeType.ENCOUNTER) { EncounterNodeData nodeData = file.NodeData as EncounterNodeData; if (nodeData.IsStartNode) { graph.AddEdge(NodeFile.Id, file.Id); } } } }
public override bool AddOutEdge(GameMasterNode nodeFile) { if (nodeFile.NodeType == GameMasterNodeType.ENCOUNTER) { EncounterNodeData encounterData = nodeFile.NodeData as EncounterNodeData; if (encounterData.IsStartNode && !mEncounterFiles.Contains(nodeFile)) { // can only add an edge between this and the encounter if the encounter is a start node AddEncounter(encounterData); return(true); } } return(false); }
public List <GameMasterNode> GetEncountersWithInEdge(string inEdgeName) { List <GameMasterNode> inEdges = new List <GameMasterNode>(); foreach (GameMasterNode file in mEncounterFiles) { if (file.NodeType == GameMasterNodeType.ENCOUNTER) { EncounterNodeData nodeData = file.NodeData as EncounterNodeData; if (nodeData.InEdge.Equals(inEdgeName)) { inEdges.Add(file); } } } return(inEdges); }
public override NodeData Clone(GameMasterNode nodeFile) { EncounterNodeData newNodeData = new EncounterNodeData(); newNodeData.NodeFile = nodeFile; newNodeData.mEncounterType = mEncounterType; newNodeData.mInEdge = mInEdge; newNodeData.mOutEdgeStrings = new List <string>(); newNodeData.mIsStartNode = mIsStartNode; if (NodeFile.Owner != null && NodeFile.Owner.NodeType == GameMasterNodeType.ARC) { ArcNodeData ownerArcData = NodeFile.Owner.NodeData as ArcNodeData; ownerArcData.AddEncounter(newNodeData); nodeFile.Owner = NodeFile.Owner; } return(newNodeData); }
public override bool AddOutEdge(GameMasterNode nodeFile) { if (nodeFile.NodeType != GameMasterNodeType.ENCOUNTER) { return(false); } EncounterNodeData encounterData = nodeFile.NodeData as EncounterNodeData; string inEdge = encounterData.InEdge; if (encounterData.IsStartNode) { // Cannot add start nodes to an encounter. they should be added to arc return(false); } List <string> outEdges = GetOutEdges(); if (outEdges.Contains(nodeFile.Id)) { // This item is already part of the out edges return(false); } if (!mOutEdgeStrings.Contains(inEdge)) { // This out edge isn't already in the list of possible out edges, see if we can add it. switch (mEncounterType) { case "generator": // Cannot add more than one edge to generator return(false); case "random_out_edge": JObject randomOutEdgesDictionary = (JObject)NodeFile.Json["random_out_edge_info"]["out_edges"]; randomOutEdgesDictionary.Add(inEdge, JObject.Parse(@"{""weight"":1 }")); mOutEdgeStrings.Add(inEdge); break; case "collection_quest": return(false); case "dialog_tree": // We can't add to a dialog tree, you have to specify a node. return(false); case "counter": // Cannot add to a counter because it either does fail or success return(false); default: NodeFile.Json.Remove("out_edge"); mOutEdgeStrings.Add(inEdge); NodeFile.Json.Add("out_edge", JsonConvert.SerializeObject(mOutEdgeStrings)); break; } } if (nodeFile.Owner != NodeFile.Owner) { // make sure encounter is added to this tree ArcNodeData ownerArcData = NodeFile.Owner.NodeData as ArcNodeData; ownerArcData.AddEncounter(encounterData); nodeFile.Owner = NodeFile.Owner; } NodeFile.IsModified = true; return(true); }
private void PopulateFileDetails(GameMasterNode node) { fileDetailsListBox.Items.Clear(); if (node == null) { return; } Dictionary <string, float> stats = new Dictionary <string, float>(); if (node.NodeType == GameMasterNodeType.ENCOUNTER) { EncounterNodeData encounterData = node.NodeData as EncounterNodeData; if (encounterData.EncounterType == "create_mission" || encounterData.EncounterType == "city_raid") { JToken members = node.Json.SelectToken("create_mission_info.mission.members"); if (members == null) { JToken missions = node.Json.SelectToken("city_raid_info.missions"); foreach (JProperty content in missions.Children()) { // Only gets stats for the first mission of city raids members = content.Value["members"]; } } int maxEnemies = 0; float totalWeaponBaseDamage = 0; Dictionary <string, float> allStats = new Dictionary <string, float>(); foreach (string attribute in kAttributesOfInterest) { allStats[attribute] = 0; } if (members != null) { foreach (JToken member in members.Children()) { // grab name, max number of members, and tuning JProperty memberProperty = member as JProperty; if (memberProperty != null) { JValue jMax = memberProperty.Value.SelectToken("from_population.max") as JValue; int max = 0; if (jMax != null) { max = jMax.Value <int>(); maxEnemies = maxEnemies + max; } JValue tuning = memberProperty.Value.SelectToken("tuning") as JValue; if (tuning != null) { string alias = tuning.ToString(); ModuleFile tuningFile = ModuleDataManager.GetInstance().GetModuleFile(alias); if (tuningFile != null) { JsonFileData jsonFileData = tuningFile.FileData as JsonFileData; if (jsonFileData != null) { foreach (string attribute in kAttributesOfInterest) { JValue jAttribute = jsonFileData.Json.SelectToken("attributes." + attribute) as JValue; if (jAttribute != null) { allStats[attribute] = allStats[attribute] + (max * jAttribute.Value <int>()); } } JArray weapon = jsonFileData.Json.SelectToken("equipment.weapon") as JArray; if (weapon != null) { foreach (JValue weaponAlias in weapon.Children()) { ModuleFile weaponModuleFile = ModuleDataManager.GetInstance().GetModuleFile(weaponAlias.ToString()); if (weaponModuleFile != null) { JToken baseDamage = (weaponModuleFile.FileData as JsonFileData).Json.SelectToken("entity_data.stonehearth:combat:weapon_data.base_damage"); if (baseDamage != null) { totalWeaponBaseDamage = totalWeaponBaseDamage + (max * baseDamage.Value <int>()); } } } } } } } } } } fileDetailsListBox.Items.Add("max enemies : " + maxEnemies); fileDetailsListBox.Items.Add("total weapon damage : " + totalWeaponBaseDamage); foreach (string attribute in kAttributesOfInterest) { fileDetailsListBox.Items.Add("total " + attribute + " : " + allStats[attribute]); } fileDetailsListBox.Items.Add("average weapon damage : " + totalWeaponBaseDamage / maxEnemies); foreach (string attribute in kAttributesOfInterest) { fileDetailsListBox.Items.Add("average " + attribute + " : " + allStats[attribute] / maxEnemies); } } } }
public override NodeData Clone(GameMasterNode nodeFile) { EncounterNodeData newNodeData = new EncounterNodeData(); newNodeData.NodeFile = nodeFile; newNodeData.mEncounterType = mEncounterType; newNodeData.mInEdge = mInEdge; newNodeData.mOutEdgeStrings = new List<string>(); newNodeData.mIsStartNode = mIsStartNode; if (NodeFile.Owner != null && NodeFile.Owner.NodeType == GameMasterNodeType.ARC) { ArcNodeData ownerArcData = NodeFile.Owner.NodeData as ArcNodeData; ownerArcData.AddEncounter(newNodeData); nodeFile.Owner = NodeFile.Owner; } return newNodeData; }