// 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();
 }
Beispiel #5
0
        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();
        }
Beispiel #6
0
 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);
             }
         }
     }
 }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
        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;
        }