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); }
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); }
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); }