public TraitorMissionPrefab(XElement missionRoot)
        {
            Identifier = missionRoot.GetAttributeString("identifier", null);
            foreach (var element in missionRoot.Elements())
            {
                using (var checker = new AttributeChecker(element))
                {
                    switch (element.Name.ToString().ToLowerInvariant())
                    {
                    case "role":
                        checker.Required("id");
                        checker.Optional("jobs");
                        Roles.Add(element.GetAttributeString("id", null), LoadRole(element));
                        break;

                        /*                            traitorSettings settings = new traitorSettings();
                         *                          DebugConsole.NewMessage(settings.traitorSelectMode);
                         *                          if (settings.traitorSelectMode.Equals("ratio"))
                         *                          {
                         *                              DebugConsole.NewMessage("NOT IMPLEMENTED: using set traitor number: " + settings.traitorStaticNumber);
                         *                              Roles.Add(element.GetAttributeString("id", null), LoadRole(element));
                         *                              int count = settings.traitorStaticNumber - 1;
                         *                              while (count > 0)
                         *                              {
                         *                                  DebugConsole.NewMessage("Added additional traitor");
                         *                                  Roles.Add(element.GetAttributeString("id", null) + count, LoadRole(element));
                         *                                  count--;
                         *                              }
                         *                          }
                         *                          else if (settings.traitorSelectMode.Equals("static"))
                         *                          {
                         *                              DebugConsole.NewMessage("using set traitor number: " + settings.traitorStaticNumber);
                         *                              Roles.Add(element.GetAttributeString("id", null), LoadRole(element));
                         *                              int count = settings.traitorStaticNumber - 1;
                         *                              while (count>0)
                         *                              {
                         *                                  DebugConsole.NewMessage("Added additional traitor");
                         *                                  Roles.Add(element.GetAttributeString("id", null)+count, LoadRole(element));
                         *                                  count--;
                         *                              }
                         *                          }
                         *                          else if (settings.traitorSelectMode.Equals("random"))
                         *                          {
                         *                              DebugConsole.NewMessage("using set traitor number: " + settings.traitorRandomMin);
                         *                              Roles.Add(element.GetAttributeString("id", null), LoadRole(element));
                         *                              int count = settings.traitorRandomMin - 1;
                         *                              while (count > 0)
                         *                              {
                         *                                  DebugConsole.NewMessage("Added additional traitor");
                         *                                  Roles.Add(element.GetAttributeString("id", null) + count, LoadRole(element));
                         *                                  count--;
                         *                              }
                         *                              if(randGen.NextDouble() < settings.traitorRandomFactor)
                         *                              {
                         *                                  Roles.Add(element.GetAttributeString("id", null) + settings.traitorRandomMin, LoadRole(element));
                         *                              }
                         *                          }
                         * break;
                         */
                    }
                }
            }
            if (!Roles.Any())
            {
                Roles.Add("traitor", new Role());
            }
            foreach (var element in missionRoot.Elements())
            {
                using (var checker = new AttributeChecker(element))
                {
                    switch (element.Name.ToString().ToLowerInvariant())
                    {
                    case "role":
                        // handled above
                        break;

                    case "startinfotext":
                        checker.Required("id");
                        StartText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccess":
                        checker.Required("id");
                        EndMessageSuccessText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccessdead":
                        checker.Required("id");
                        EndMessageSuccessDeadText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccessdetained":
                        checker.Required("id");
                        EndMessageSuccessDetainedText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailure":
                        checker.Required("id");
                        EndMessageFailureText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailuredead":
                        checker.Required("id");
                        EndMessageFailureDeadText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailuredetained":
                        checker.Required("id");
                        EndMessageFailureDetainedText = element.GetAttributeString("id", null);
                        break;

                    case "objective":
                    {
                        var objective = LoadObjective(element, Roles.Keys.ToArray());
                        if (objective != null)
                        {
                            Objectives.Add(objective);
                        }
                        break;
                    }

                    default:
                        GameServer.Log($"Unrecognized element \"{element.Name}\"under TraitorMission.", ServerLog.MessageType.Error);
                        break;
                    }
                }
            }
        }
        protected Objective LoadObjective(XElement objectiveRoot, string[] allRoles)
        {
            var allRolesSet = new HashSet <string>(allRoles);
            var result      = new Objective
            {
                ShuffleGoalsCount = objectiveRoot.GetAttributeInt("shuffleGoalsCount", -1)
            };
            var objectiveRoles = objectiveRoot.GetAttributeStringArray("roles", allRoles);

            if (!allRolesSet.IsSupersetOf(objectiveRoles))
            {
                var unrecognized = new HashSet <string>(objectiveRoles);
                unrecognized.ExceptWith(allRoles);
                GameServer.Log($"Undefined role(s) \"{string.Join(", ", unrecognized)}\" set for Objective.", ServerLog.MessageType.Error);
            }
            result.Roles.UnionWith(allRolesSet.Intersect(objectiveRoles));

            foreach (var element in objectiveRoot.Elements())
            {
                using (var checker = new AttributeChecker(element))
                {
                    switch (element.Name.ToString().ToLowerInvariant())
                    {
                    case "infotext":
                        checker.Required("id");
                        result.InfoText = element.GetAttributeString("id", null);
                        break;

                    case "startmessage":
                        checker.Required("id");
                        result.StartMessageTextId = element.GetAttributeString("id", null);
                        break;

                    case "startmessageserver":
                        checker.Required("id");
                        result.StartMessageServerTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccess":
                        checker.Required("id");
                        result.EndMessageSuccessTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccessdead":
                        checker.Required("id");
                        result.EndMessageSuccessDeadTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccessdetained":
                        checker.Required("id");
                        result.EndMessageSuccessDetainedTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailure":
                        checker.Required("id");
                        result.EndMessageFailureTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailuredead":
                        checker.Required("id");
                        result.EndMessageFailureDeadTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailuredetained":
                        checker.Required("id");
                        result.EndMessageFailureDetainedTextId = element.GetAttributeString("id", null);
                        break;

                    case "goal":
                    {
                        var goal = LoadGoal(element);
                        if (goal != null)
                        {
                            result.Goals.Add(goal);
                        }
                        break;
                    }

                    default:
                        GameServer.Log($"Unrecognized element \"{element.Name}\" under Objective.", ServerLog.MessageType.Error);
                        break;
                    }
                }
            }
            return(result);
        }
Esempio n. 3
0
        public TraitorMissionPrefab(XElement missionRoot)
        {
            Identifier = missionRoot.GetAttributeString("identifier", null);
            foreach (var element in missionRoot.Elements())
            {
                using (var checker = new AttributeChecker(element))
                {
                    switch (element.Name.ToString().ToLowerInvariant())
                    {
                    case "role":
                        checker.Required("id");
                        checker.Optional("jobs");
                        Roles.Add(element.GetAttributeString("id", null), LoadRole(element));
                        break;
                    }
                }
            }
            if (!Roles.Any())
            {
                Roles.Add("traitor", new Role());
            }
            foreach (var element in missionRoot.Elements())
            {
                using (var checker = new AttributeChecker(element))
                {
                    switch (element.Name.ToString().ToLowerInvariant())
                    {
                    case "role":
                        // handled above
                        break;

                    case "startinfotext":
                        checker.Required("id");
                        StartText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccess":
                        checker.Required("id");
                        EndMessageSuccessText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccessdead":
                        checker.Required("id");
                        EndMessageSuccessDeadText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccessdetained":
                        checker.Required("id");
                        EndMessageSuccessDetainedText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailure":
                        checker.Required("id");
                        EndMessageFailureText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailuredead":
                        checker.Required("id");
                        EndMessageFailureDeadText = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailuredetained":
                        checker.Required("id");
                        EndMessageFailureDetainedText = element.GetAttributeString("id", null);
                        break;

                    case "objective":
                    {
                        var objective = LoadObjective(element, Roles.Keys.ToArray());
                        if (objective != null)
                        {
                            Objectives.Add(objective);
                        }
                        break;
                    }

                    default:
                        GameServer.Log($"Unrecognized element \"{element.Name}\"under TraitorMission.", ServerLog.MessageType.Error);
                        break;
                    }
                }
            }
        }
            public Traitor.Goal Instantiate()
            {
                Traitor.Goal goal = null;
                using (var checker = new AttributeChecker(Config))
                {
                    checker.Required("type");
                    var goalType = Config.GetAttributeString("type", "");
                    switch (goalType.ToLowerInvariant())
                    {
                    case "killtarget":
                    {
                        checker.Optional(targetFilters.Keys.ToArray());
                        checker.Optional("causeofdeath");
                        checker.Optional("affliction");
                        checker.Optional("roomname");
                        checker.Optional("targetcount");
                        checker.Optional("targetpercentage");
                        List <Traitor.TraitorMission.CharacterFilter> killFilters = new List <Traitor.TraitorMission.CharacterFilter>();
                        foreach (var attribute in Config.Attributes())
                        {
                            if (targetFilters.TryGetValue(attribute.Name.ToString().ToLower(System.Globalization.CultureInfo.InvariantCulture), out var filter))
                            {
                                killFilters.Add((character) => filter(attribute.Value, character));
                            }
                        }
                        goal = new Traitor.GoalKillTarget((character) => killFilters.All(f => f(character)),
                                                          (CauseOfDeathType)Enum.Parse(typeof(CauseOfDeathType), Config.GetAttributeString("causeofdeath", "Unknown"), true),
                                                          Config.GetAttributeString("affliction", null), Config.GetAttributeString("targethull", null), Config.GetAttributeInt("targetcount", -1),
                                                          Config.GetAttributeFloat("targetpercentage", -1f));
                        break;
                    }

                    case "destroyitems":
                    {
                        checker.Required("tag");
                        checker.Optional("percentage", "matchIdentifier", "matchTag", "matchInventory");
                        var tag = Config.GetAttributeString("tag", null);
                        if (tag != null)
                        {
                            goal = new Traitor.GoalDestroyItemsWithTag(
                                tag,
                                Config.GetAttributeFloat("percentage", 100.0f) / 100.0f,
                                Config.GetAttributeBool("matchIdentifier", true),
                                Config.GetAttributeBool("matchTag", true),
                                Config.GetAttributeBool("matchInventory", false));
                        }
                        break;
                    }

                    case "sabotage":
                    {
                        checker.Required("tag");
                        checker.Optional("threshold");
                        var tag = Config.GetAttributeString("tag", null);
                        if (tag != null)
                        {
                            goal = new Traitor.GoalSabotageItems(tag, Config.GetAttributeFloat("threshold", 20.0f));
                        }
                        break;
                    }

                    case "floodsub":
                        checker.Optional("percentage");
                        goal = new Traitor.GoalFloodPercentOfSub(Config.GetAttributeFloat("percentage", 100.0f) / 100.0f);
                        break;

                    case "finditem":
                        checker.Required("identifier");
                        checker.Optional("preferNew", "allowNew", "allowExisting", "allowedContainers", "percentage");
                        List <Traitor.TraitorMission.CharacterFilter> itemCountFilters = new List <Traitor.TraitorMission.CharacterFilter>();
                        foreach (var attribute in Config.Attributes())
                        {
                            if (targetFilters.TryGetValue(attribute.Name.ToString().ToLower(System.Globalization.CultureInfo.InvariantCulture), out var filter))
                            {
                                itemCountFilters.Add((character) => filter(attribute.Value, character));
                            }
                        }
                        goal = new Traitor.GoalFindItem((character) => itemCountFilters.All(f => f(character)), Config.GetAttributeString("identifier", null), Config.GetAttributeBool("preferNew", true), Config.GetAttributeBool("allowNew", true), Config.GetAttributeBool("allowExisting", true), Config.GetAttributeFloat("percentage", -1f), Config.GetAttributeStringArray("allowedContainers", new string[] { "steelcabinet", "mediumsteelcabinet", "suppliescabinet" }));
                        break;

                    case "replaceinventory":
                        checker.Required("containers", "replacements");
                        checker.Optional("percentage");
                        goal = new Traitor.GoalReplaceInventory(Config.GetAttributeStringArray("containers", new string[] { }), Config.GetAttributeStringArray("replacements", new string[] { }), Config.GetAttributeFloat("percentage", 100.0f) / 100.0f);
                        break;

                    case "reachdistancefromsub":
                        checker.Optional("distance");
                        goal = new Traitor.GoalReachDistanceFromSub(Config.GetAttributeFloat("distance", 125f));
                        break;

                    case "injectpoison":
                        checker.Optional(targetFilters.Keys.ToArray());
                        checker.Required("poison");
                        checker.Required("affliction");
                        checker.Optional("targetcount");
                        checker.Optional("targetpercentage");
                        List <Traitor.TraitorMission.CharacterFilter> poisonFilters = new List <Traitor.TraitorMission.CharacterFilter>();
                        foreach (var attribute in Config.Attributes())
                        {
                            if (targetFilters.TryGetValue(attribute.Name.ToString().ToLower(System.Globalization.CultureInfo.InvariantCulture), out var filter))
                            {
                                poisonFilters.Add((character) => filter(attribute.Value, character));
                            }
                        }
                        goal = new Traitor.GoalInjectTarget((character) => poisonFilters.All(f => f(character)), Config.GetAttributeString("poison", null),
                                                            Config.GetAttributeString("affliction", null), Config.GetAttributeInt("targetcount", -1), Config.GetAttributeFloat("targetpercentage", -1f));
                        break;

                    case "unwire":
                        checker.Required("tag");
                        checker.Optional("connectionname");
                        checker.Optional("connectiondisplayname");
                        goal = new Traitor.GoalUnwiring(Config.GetAttributeString("tag", null), Config.GetAttributeString("connectionname", null), Config.GetAttributeString("connectiondisplayname)", null));
                        break;

                    case "transformentity":
                        checker.Required("entities", "entitytypes");
                        checker.Optional("catalystid");
                        goal = new Traitor.GoalEntityTransformation(Config.GetAttributeStringArray("entities", null), Config.GetAttributeStringArray("entitytypes", null), Config.GetAttributeString("catalystid", null));
                        break;

                    case "keeptransformedalive":
                        checker.Required("speciesname");
                        goal = new Traitor.GoalKeepTransformedAlive(Config.GetAttributeString("speciesname", null));
                        break;

                    default:
                        GameServer.Log($"Unrecognized goal type \"{goalType}\".", ServerLog.MessageType.Error);
                        break;
                    }
                }
                if (goal == null)
                {
                    return(null);
                }
                foreach (var element in Config.Elements())
                {
                    switch (element.Name.ToString().ToLowerInvariant())
                    {
                    case "modifier":
                    {
                        using (var checker = new AttributeChecker(element))
                        {
                            checker.Required("type");
                            var modifierType = element.GetAttributeString("type", "");
                            switch (modifierType)
                            {
                            case "duration":
                            {
                                checker.Optional("cumulative", "duration", "infotext");
                                var isCumulative = element.GetAttributeBool("cumulative", false);
                                goal = new Traitor.GoalHasDuration(goal, element.GetAttributeFloat("duration", 5.0f), isCumulative, element.GetAttributeString("infotext", isCumulative ? "TraitorGoalWithCumulativeDurationInfoText" : "TraitorGoalWithDurationInfoText"));
                                break;
                            }

                            case "timelimit":
                                checker.Optional("timelimit", "infotext");
                                goal = new Traitor.GoalHasTimeLimit(goal, element.GetAttributeFloat("timelimit", 180.0f), element.GetAttributeString("infotext", "TraitorGoalWithTimeLimitInfoText"));
                                break;

                            case "optional":
                                checker.Optional("infotext");
                                goal = new Traitor.GoalIsOptional(goal, element.GetAttributeString("infotext", "TraitorGoalIsOptionalInfoText"));
                                break;

                            default:
                                GameServer.Log($"Unrecognized modifier type \"{modifierType}\".", ServerLog.MessageType.Error);
                                break;
                            }
                        }
                        break;
                    }
                    }
                }
                foreach (var element in Config.Elements())
                {
                    var elementName = element.Name.ToString().ToLowerInvariant();
                    switch (elementName)
                    {
                    case "modifier":
                        // loaded above
                        break;

                    case "infotext":
                    {
                        using (var checker = new AttributeChecker(element))
                        {
                            checker.Required("id");
                            var id = element.GetAttributeString("id", null);
                            if (id != null)
                            {
                                goal.InfoTextId = id;
                            }
                        }
                        break;
                    }

                    case "completedtext":
                    {
                        using (var checker = new AttributeChecker(element))
                        {
                            checker.Required("id");
                            var id = element.GetAttributeString("id", null);
                            if (id != null)
                            {
                                goal.CompletedTextId = id;
                            }
                        }
                        break;
                    }

                    default:
                        GameServer.Log($"Unrecognized element \"{element.Name}\" in goal.", ServerLog.MessageType.Error);
                        break;
                    }
                }
                return(goal);
            }
Esempio n. 5
0
        protected Objective LoadObjective(XElement objectiveRoot)
        {
            var result = new Objective();

            result.ShuffleGoalsCount = objectiveRoot.GetAttributeInt("shuffleGoalsCount", -1);
            foreach (var element in objectiveRoot.Elements())
            {
                using (var checker = new AttributeChecker(element))
                {
                    switch (element.Name.ToString().ToLowerInvariant())
                    {
                    case "infotext":
                        checker.Required("id");
                        result.InfoText = element.GetAttributeString("id", null);
                        break;

                    case "startmessage":
                        checker.Required("id");
                        result.StartMessageTextId = element.GetAttributeString("id", null);
                        break;

                    case "startmessageserver":
                        checker.Required("id");
                        result.StartMessageServerTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccess":
                        checker.Required("id");
                        result.EndMessageSuccessTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccessdead":
                        checker.Required("id");
                        result.EndMessageSuccessDeadTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagesuccessdetained":
                        checker.Required("id");
                        result.EndMessageSuccessDetainedTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailure":
                        checker.Required("id");
                        result.EndMessageFailureTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailuredead":
                        checker.Required("id");
                        result.EndMessageFailureDeadTextId = element.GetAttributeString("id", null);
                        break;

                    case "endmessagefailuredetained":
                        checker.Required("id");
                        result.EndMessageFailureDetainedTextId = element.GetAttributeString("id", null);
                        break;

                    case "goal":
                    {
                        var goal = LoadGoal(element);
                        if (goal != null)
                        {
                            result.Goals.Add(goal);
                        }
                        break;
                    }

                    default:
                        GameServer.Log($"Unrecognized element \"{element.Name}\"under Objective.", ServerLog.MessageType.Error);
                        break;
                    }
                }
            }
            return(result);
        }