private static bool FinishItemGuildQuestCompleted(ref object?item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, List <string> knownFieldList, List <string> usedFieldList, string parsedFile, string parsedKey) { PgQuestRequirementGuildQuestCompleted NewItem = new PgQuestRequirementGuildQuestCompleted(); bool Result = true; foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; if (!knownFieldList.Contains(Key)) { Result = Program.ReportFailure($"Unknown field {Key}"); } else { usedFieldList.Add(Key); switch (Key) { case "T": break; case "Quest": Result = Inserter <PgQuest> .SetItemByInternalName((PgQuest valueQuest) => NewItem.Quest_Key = valueQuest.Key, Value); break; default: Result = Program.ReportFailure("Unexpected failure"); break; } } if (!Result) { break; } } if (Result) { item = NewItem; return(true); } else { return(false); } }
private bool ParseCategoryGateId(PgDirectedGoal item, object value, Dictionary <string, object> contentTable, string parsedFile, string parsedKey) { if (contentTable.ContainsKey("IsCategoryGate")) { return(Program.ReportFailure(parsedFile, parsedKey, "Directed Goal is a Category Gate when it points to another")); } if (!(value is int AsInt)) { return(Program.ReportFailure(parsedFile, parsedKey, "Int value expected for a Category Gate ID")); } return(Inserter <PgDirectedGoal> .SetItemById((PgDirectedGoal valueDirectedGoal) => item.CategoryGate_Key = valueDirectedGoal.Key, AsInt)); }
private bool FinishItem(PgReward item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "Ability": Result = Inserter <PgAbility> .SetItemByInternalName((PgAbility valueAbility) => item.Ability_Key = valueAbility.Key, Value); break; case "BonusToSkill": Result = ParserSkill.Parse((PgSkill valueSkill) => item.BonusLevelSkill_Key = valueSkill.Key, Value, parsedFile, parsedKey); break; case "Recipe": Result = Inserter <PgRecipe> .SetItemByInternalName((PgRecipe valueRecipe) => item.Recipe_Key = valueRecipe.Key, Value); break; case "Notes": Result = SetStringProperty((string valueString) => item.Notes = Tools.CleanedUpString(valueString), Value); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } if (Result) { if (item.Ability_Key == null && item.BonusLevelSkill_Key == null && item.Recipe_Key == null && item.Notes.Length == 0) { Result = Program.ReportFailure(parsedFile, parsedKey, "Not enough rewards"); } } return(Result); }
private bool FinishItem(PgAdvancement item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; PgAttribute ParsedAttribute = null !; float ParsedValue = 0; if (Key == "MENTAL_DEFENSE_RATING") { continue; } Result = Inserter <PgAttribute> .SetItemByKey((PgAttribute valueAttribute) => ParsedAttribute = valueAttribute, Key); if (Result) { if (Value is float FloatValue) { ParsedValue = FloatValue; } else if (Value is int IntValue) { ParsedValue = IntValue; } else { Result = Program.ReportFailure(parsedFile, parsedKey, $"Unknown attribute value '{Value}'"); } } if (Result) { PgAdvancementEffectAttribute NewAdvancementEffectAttribute = new PgAdvancementEffectAttribute() { Attribute_Key = ParsedAttribute.Key, RawValue = ParsedValue }; ParsingContext.AddSuplementaryObject(NewAdvancementEffectAttribute); item.EffectAttributeList.Add(NewAdvancementEffectAttribute); } } return(Result); }
private bool ParseReports(PgSkill item, object value, string parsedFile, string parsedKey) { PgReportList ParsedPeportList = null !; if (!Inserter <PgReportList> .SetItemProperty((PgReportList valueReportList) => ParsedPeportList = valueReportList, value)) { return(false); } foreach (PgReport Report in ParsedPeportList.List) { item.ReportList.Add(Report); } return(true); }
private static bool ParseTiers(PgPower item, object value, string parsedFile, string parsedKey) { PgPowerTierList PowerTierList = null !; if (!Inserter <PgPowerTierList> .SetItemProperty((PgPowerTierList valuePowerTierList) => PowerTierList = valuePowerTierList, value)) { return(false); } if (PowerTierList.TierList.Count == 0) { return(Program.ReportFailure(parsedFile, parsedKey, $"Power with no tiers")); } item.TierList = PowerTierList.TierList; return(true); }
private bool ParseTargetTypeTagReq(PgAbility item, object value, string parsedFile, string parsedKey) { if (value is not string AsString || !AsString.StartsWith("AnatomyType_")) { return(false); } string AnatomySkillName = AsString.Substring(12); AnatomySkillName = $"Anatomy_{AnatomySkillName}"; if (!Inserter <PgSkill> .SetItemByKey((PgSkill valueSkill) => item.TargetTypeTagReq_Key = valueSkill.Key, AnatomySkillName)) { return(false); } return(true); }
private static bool IsBuggedDescription(string description, List <int> iconIdList, string startPattern, string endPattern, string attributeKey, out PgPowerEffect fixedEffect) { int StartIndex = description.IndexOf(startPattern); int EndIndex = description.LastIndexOf(endPattern); PgAttribute ParsedAttribute = null !; if (StartIndex == 0 && EndIndex > startPattern.Length && Tools.TryParseFloat(description.Substring(startPattern.Length, EndIndex - startPattern.Length), out float ParsedEffect, out FloatFormat ParsedEffectFormat) && Inserter <PgAttribute> .SetItemByKey((PgAttribute valueAttribute) => ParsedAttribute = valueAttribute, attributeKey)) { PgPowerEffectAttribute NewPowerEffectAttribute = new PgPowerEffectAttribute() { Description = description, IconIdList = iconIdList, AttributeEffect = ParsedEffect, AttributeEffectFormat = ParsedEffectFormat }; NewPowerEffectAttribute.SetAttribute(ParsedAttribute); fixedEffect = NewPowerEffectAttribute; return(true); }
private bool ParseCosts(PgAbility item, object value, string parsedFile, string parsedKey) { PgRecipeCostCollection CostList = new PgRecipeCostCollection(); if (!Inserter <PgRecipeCost> .AddKeylessArray(CostList, value)) { return(false); } if (CostList.Count > 1) { return(Program.ReportFailure(parsedFile, parsedKey, $"Only one cost expected")); } else if (CostList.Count == 1) { item.Cost = CostList[0]; } return(true); }
private bool ParseSourceHangOut(ref object?item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; PgSourceHangOut NewSource = new PgSourceHangOut(); foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "Type": break; case "Npc": Result = Inserter <PgSource> .SetNpc((PgNpcLocation location) => NewSource.Npc = location, Value, parsedFile, parsedKey); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } if (Result) { item = NewSource; return(true); } else { return(false); } }
private bool ParseSourceItem(ref object?item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; PgSourceItem NewSource = new PgSourceItem(); foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "Type": break; case "ItemTypeId": Result = Inserter <PgItem> .SetItemByKey((PgItem valueItem) => NewSource.Item_Key = valueItem.Key, $"item_{Value}"); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } if (Result) { item = NewSource; return(true); } else { return(false); } }
private bool FinishItem(PgAI item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "Abilities": Result = Inserter <PgAIAbilitySet> .SetItemProperty((PgAIAbilitySet valueAIAbilitySet) => item.Abilities = valueAIAbilitySet, Value); break; case "Melee": Result = SetBoolProperty((bool valueBool) => item.SetIsMelee(valueBool), Value); break; case "Comment": Result = SetStringProperty((string valueString) => item.Comment = valueString, Value); break; case "UncontrolledPet": Result = SetBoolProperty((bool valueBool) => item.SetIsUncontrolledPet(valueBool), Value); break; case "ServerDriven": Result = SetBoolProperty((bool valueBool) => item.SetIsServerDriven(valueBool), Value); break; case "MinDelayBetweenAbilities": Result = SetFloatProperty((float valueFloat) => item.RawMinDelayBetweenAbilities = valueFloat, Value); break; case "UseAbilitiesWithoutEnemyTarget": Result = SetBoolProperty((bool valueBool) => item.SetUseAbilitiesWithoutEnemyTarget(valueBool), Value); break; case "Swimming": Result = SetBoolProperty((bool valueBool) => item.SetIsSwimming(valueBool), Value); break; case "MobilityType": Result = StringToEnumConversion <MobilityType> .SetEnum((MobilityType valueEnum) => item.MobilityType = valueEnum, Value); break; case "Flying": Result = SetBoolProperty((bool valueBool) => item.SetIsFlying(valueBool), Value); break; case "Description": Result = SetStringProperty((string valueString) => item.Description = valueString, Value); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } return(Result); }
private bool FinishItem(PgStorageVault item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "ID": Result = SetIntProperty((int valueInt) => item.RawId = valueInt, Value); break; case "NpcFriendlyName": Result = SetStringProperty((string valueString) => item.NpcFriendlyName = valueString, Value); break; case "Area": Result = ParseArea((MapAreaName valueEnum) => item.Area = valueEnum, Value, parsedFile, parsedKey); break; case "NumSlots": Result = SetIntProperty((int valueInt) => item.RawNumSlots = valueInt, Value); break; case "HasAssociatedNpc": Result = SetBoolProperty((bool valueBool) => item.RawHasAssociatedNpc = valueBool, Value); break; case "Levels": Result = Inserter <PgStorageFavorLevel> .SetItemProperty((PgStorageFavorLevel valueStorageFavorLevel) => item.Levels = valueStorageFavorLevel, Value); break; case "Requirements": Result = Inserter <PgStorageRequirement> .SetItemProperty((PgStorageRequirement valueStorageRequirement) => item.Requirement = valueStorageRequirement, Value); break; case "RequirementDescription": Result = SetStringProperty((string valueString) => item.RequirementDescription = valueString, Value); break; case "Grouping": Result = ParseArea((MapAreaName valueEnum) => item.Grouping = valueEnum, Value, parsedFile, parsedKey); break; case "RequiredItemKeywords": Result = StringToEnumConversion <ItemKeyword> .TryParseList(Value, item.RequiredItemKeywordList); break; case "SlotAttribute": Result = Inserter <PgAttribute> .SetItemByKey((PgAttribute valueAttribute) => item.SlotAttribute_Key = valueAttribute.Key, Value); break; case "EventLevels": Result = Inserter <PgStorageEventList> .SetItemProperty((PgStorageEventList valueStorageEventLevel) => item.EventLevels = valueStorageEventLevel, Value); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } if (Result) { if (!item.RawHasAssociatedNpc.HasValue || item.HasAssociatedNpc) { Inserter <PgQuest> .SetNpc((PgNpcLocation npcLocation) => item.AssociatedNpc = npcLocation, item.Key, parsedFile, parsedKey, ErrorControl.IgnoreIfNotFound); } } return(Result); }
private bool ParseSourceEffect(ref object?item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { if (!contentTable.ContainsKey("EffectName")) { return(Program.ReportFailure(parsedFile, parsedKey, "Source has no effect name")); } if (!(contentTable["EffectName"] is string EffectNameString)) { return(Program.ReportFailure("Source effect name was expected to be a string")); } if (EffectNameString == "Learn Ability") { item = new PgSourceLearnAbility(); return(true); } PgRecipe ParsedRecipe = null !; if (Inserter <PgRecipe> .SetItemByInternalName((PgRecipe valueRecipe) => ParsedRecipe = valueRecipe, EffectNameString, ErrorControl.IgnoreIfNotFound)) { item = new PgSourceRecipe() { Recipe_Key = ParsedRecipe.Key }; return(true); } if (Inserter <PgRecipe> .SetItemByName((PgRecipe valueRecipe) => ParsedRecipe = valueRecipe, EffectNameString, ErrorControl.IgnoreIfNotFound)) { item = new PgSourceRecipe() { Recipe_Key = ParsedRecipe.Key }; return(true); } PgEffect ParsedEffect = null !; if (Inserter <PgEffect> .SetItemByName((PgEffect valueEffect) => ParsedEffect = valueEffect, EffectNameString, ErrorControl.IgnoreIfNotFound)) { item = new PgSourceEffect() { Effect_Key = ParsedEffect.Key }; return(true); } if (!contentTable.ContainsKey("EffectTypeId")) { return(Program.ReportFailure($"Unknown effect name {EffectNameString}")); } if (!(contentTable["EffectTypeId"] is string ValueString)) { return(Program.ReportFailure($"Effect type id was expected to be a string")); } string EffectKey = $"effect_{ValueString}"; if (Inserter <PgEffect> .SetItemByKey((PgEffect valueEffect) => ParsedEffect = valueEffect, EffectKey, ErrorControl.IgnoreIfNotFound)) { item = new PgSourceEffect() { Effect_Key = ParsedEffect.Key }; return(true); } return(Program.ReportFailure($"Unknown effect name {EffectNameString}")); }
private bool FinishItem(PgDoT item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "DamagePerTick": Result = SetIntProperty((int valueInt) => item.RawDamagePerTick = valueInt, Value); break; case "NumTicks": Result = SetIntProperty((int valueInt) => item.RawNumTicks = valueInt, Value); break; case "Duration": Result = SetIntProperty((int valueInt) => item.RawDuration = valueInt, Value); break; case "DamageType": Result = StringToEnumConversion <DamageType> .SetEnum((DamageType valueEnum) => item.DamageType = valueEnum, Value); break; case "SpecialRules": Result = StringToEnumConversion <DoTSpecialRule> .TryParseList(Value, item.SpecialRuleList); break; case "AttributesThatDelta": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatDeltaList, Value); break; case "AttributesThatMod": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatModList, Value); break; case "Preface": Result = SetStringProperty((string valueString) => item.Preface = valueString, Value); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } if (!Result) { return(false); } if (item.RawDamagePerTick == null) { return(Program.ReportFailure(parsedFile, parsedKey, $"Unexpected empty damage per tick")); } if (item.DamageType == DamageType.Internal_None || item.DamageType == DamageType.Internal_Empty) { return(Program.ReportFailure(parsedFile, parsedKey, $"Unexpected empty damage type")); } if (item.RawNumTicks == null) { return(Program.ReportFailure(parsedFile, parsedKey, $"Unexpected empty num tick")); } if (item.RawDuration == null) { return(Program.ReportFailure(parsedFile, parsedKey, $"Unexpected empty duration")); } return(true); }
private bool FinishItem(PgItem item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; Dictionary <ItemKeyword, List <float> > KeywordTable = new Dictionary <ItemKeyword, List <float> >(); List <string> KeywordValueList = new List <string>(); Dictionary <string, int> SkillRequirementTable = new Dictionary <string, int>(); foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "BestowRecipes": Result = ParseBestowRecipeList(item, Value, parsedFile, parsedKey); break; case "BestowAbility": Result = Inserter <PgAbility> .SetItemByInternalName((PgAbility valueAbility) => item.BestowAbility_Key = valueAbility.Key, Value); break; case "BestowQuest": Result = Inserter <PgQuest> .SetItemByInternalName((PgQuest valueQuest) => item.BestowQuest_Key = valueQuest.Key, Value); break; case "AllowPrefix": Result = SetBoolProperty((bool valueBool) => item.SetAllowPrefix(valueBool), Value); break; case "AllowSuffix": Result = SetBoolProperty((bool valueBool) => item.SetAllowSuffix(valueBool), Value); break; case "CraftPoints": Result = SetIntProperty((int valueInt) => item.RawCraftPoints = valueInt, Value); break; case "CraftingTargetLevel": Result = SetIntProperty((int valueInt) => item.RawCraftingTargetLevel = valueInt, Value); break; case "Description": Result = SetStringProperty((string valueString) => item.Description = valueString, Value); break; case "DroppedAppearance": Result = ParseDroppedAppearance(item, Value, parsedFile, parsedKey); break; case "EffectDescs": Result = ParseEffectDescriptionList(item.EffectDescriptionList, Value, parsedFile, parsedKey); break; case "DyeColor": Result = ParseDyeColor(item, Value, parsedFile, parsedKey); break; case "EquipAppearance": Result = SetStringProperty((string valueString) => item.EquipAppearance = valueString, Value); // TODO: parse break; case "EquipSlot": Result = StringToEnumConversion <ItemSlot> .SetEnum((ItemSlot valueEnum) => item.EquipSlot = valueEnum, Value); break; case "FoodDesc": Result = SetStringProperty((string valueString) => item.FoodDesc = valueString, Value); // TODO: parse break; case "IconId": Result = SetIconIdProperty((int valueInt) => item.RawIconId = valueInt, Value); break; case "InternalName": Result = SetStringProperty((string valueString) => item.InternalName = valueString, Value); break; case "IsTemporary": Result = SetBoolProperty((bool valueBool) => item.SetIsTemporary(valueBool), Value); break; case "IsCrafted": Result = SetBoolProperty((bool valueBool) => item.SetIsCrafted(valueBool), Value); break; case "Keywords": Result = ParseKeywordList(item, Value, KeywordTable, KeywordValueList, parsedFile, parsedKey); break; case "MacGuffinQuestName": Result = Inserter <PgQuest> .SetItemByInternalName((PgQuest valueQuest) => item.MacGuffinQuest_Key = valueQuest.Key, Value); break; case "MaxCarryable": Result = SetIntProperty((int valueInt) => item.RawMaxCarryable = valueInt, Value); break; case "MaxOnVendor": Result = SetIntProperty((int valueInt) => item.RawMaxOnVendor = valueInt, Value); break; case "MaxStackSize": Result = SetIntProperty((int valueInt) => item.RawMaxStackSize = valueInt, Value); break; case "Name": Result = SetStringProperty((string valueString) => item.Name = valueString, Value); break; case "RequiredAppearance": Result = StringToEnumConversion <Appearance> .SetEnum((Appearance valueEnum) => item.RequiredAppearance = valueEnum, Value); break; case "SkillReqs": Result = ParseSkillRequirements(item, Value, SkillRequirementTable, parsedFile, parsedKey); break; case "StockDye": Result = ParseStockDye(item, Value, parsedFile, parsedKey); break; case "TSysProfile": Result = StringToEnumConversion <Profile> .SetEnum((Profile valueEnum) => item.TSysProfile = valueEnum, Value); break; case "Value": Result = SetFloatProperty((float valueFloat) => item.RawValue = valueFloat, Value); break; case "NumUses": Result = SetIntProperty((int valueInt) => item.RawNumUses = valueInt, Value); break; case "DestroyWhenUsedUp": Result = SetBoolProperty((bool valueBool) => item.SetDestroyWhenUsedUp(valueBool), Value); break; case "Behaviors": Result = Inserter <PgItemBehavior> .AddKeylessArray(item.BehaviorList, Value); break; case "DynamicCraftingSummary": Result = SetStringProperty((string valueString) => item.DynamicCraftingSummary = valueString, Value); break; case "IsSkillReqsDefaults": Result = SetBoolProperty((bool valueBool) => item.SetIsSkillReqsDefaults(valueBool), Value); break; case "BestowTitle": Result = Inserter <PgPlayerTitle> .SetItemByKey((PgPlayerTitle valuePlayerTitle) => item.BestowTitle_Key = valuePlayerTitle.Key, $"Title_{Value}"); break; case "BestowLoreBook": Result = Inserter <PgLoreBook> .SetItemByKey((PgLoreBook valueLoreBook) => item.BestowLoreBook_Key = valueLoreBook.Key, $"Book_{Value}"); break; case "Lint_VendorNpc": Result = StringToEnumConversion <WorkOrderSign> .SetEnum((WorkOrderSign valueEnum) => item.LintVendorNpc = valueEnum, Value); break; case "MountedAppearance": Result = SetStringProperty((string valueString) => item.MountedAppearance = valueString, Value); break; case "AttuneOnPickup": Result = SetBoolProperty((bool valueBool) => item.SetAttuneOnPickup(valueBool), Value); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } if (Result) { item.KeywordTable = KeywordTable; item.SkillRequirementTable = SkillRequirementTable; } return(Result); }
private static bool ParseItemEffectAttribute(string effectString, string parsedFile, string parsedKey, out PgPowerEffect powerEffect) { powerEffect = null !; string[] Split = effectString.Split('{'); if (Split.Length != 2 && Split.Length != 3) { return(false); } string AttributeName = Split[0]; string AttributeEffect = Split[1]; if (!AttributeName.EndsWith("}")) { return(false); } AttributeName = AttributeName.Substring(0, AttributeName.Length - 1); if (AttributeName.Contains("{") || AttributeName.Contains("}")) { return(false); } if (AttributeName.Length == 0 || AttributeEffect.Length == 0) { return(false); } PgAttribute ParsedAttribute = null !; if (!Inserter <PgAttribute> .SetItemByKey((PgAttribute valueAttribute) => ParsedAttribute = valueAttribute, AttributeName)) { return(false); } if (Split.Length == 3) { if (!AttributeEffect.EndsWith("}")) { return(false); } AttributeEffect = AttributeEffect.Substring(0, AttributeEffect.Length - 1); } if (!Tools.TryParseFloat(AttributeEffect, out float ParsedEffect, out FloatFormat ParsedEffectFormat)) { return(false); } if (ParsedEffectFormat != FloatFormat.Standard) { return(false); } PgPowerEffectAttribute NewPowerEffectAttribute; if (Split.Length == 3) { string AttributeSkill = Split[2]; PgSkill ParsedSkill = null !; if (AttributeSkill == "AnySkill") { ParsedSkill = PgSkill.AnySkill; } else if (!Inserter <PgSkill> .SetItemByKey((PgSkill valueSkill) => ParsedSkill = valueSkill, AttributeSkill)) { return(false); } NewPowerEffectAttribute = new PgPowerEffectAttribute() { AttributeEffect = ParsedEffect, AttributeEffectFormat = ParsedEffectFormat, Skill_Key = ParsedSkill.Key }; } else { NewPowerEffectAttribute = new PgPowerEffectAttribute() { AttributeEffect = ParsedEffect, AttributeEffectFormat = ParsedEffectFormat } }; NewPowerEffectAttribute.SetAttribute(ParsedAttribute); powerEffect = NewPowerEffectAttribute; return(true); }
private bool ParseKeywordAsSkillRequirement(PgNpcPreference item, string value, string parsedFile, string parsedKey) { return(Inserter <PgSkill> .SetItemByKey((PgSkill valueSkill) => item.SetSkillRequirement(valueSkill), value)); }
private bool ParseHints(string hint, string parsedFile, string parsedKey, out PgNpcLocationCollection npcList) { npcList = new PgNpcLocationCollection(); if (hint.EndsWith("learn a new dance move.")) { return(true); } hint = hint.Replace(" during a Full Moon,", string.Empty); string Pattern; int StartIndex; Pattern = "gain favor with "; StartIndex = hint.IndexOf(Pattern); if (StartIndex < 0) { Pattern = "speak with "; StartIndex = hint.IndexOf(Pattern); } if (StartIndex < 0) { Pattern = "seek out "; StartIndex = hint.IndexOf(Pattern); } if (StartIndex < 0) { if (hint.Contains(" equip ")) { return(true); } return(Program.ReportFailure($"Advancement trigger not found in: {hint}")); } StartIndex += Pattern.Length; int EndIndex; EndIndex = hint.IndexOf(" in ", StartIndex); if (EndIndex < 0) { EndIndex = hint.IndexOf(" outside of ", StartIndex); } if (EndIndex <= StartIndex) { return(Program.ReportFailure($"Bad advancement hint: {hint}")); } string NpcNameString = hint.Substring(StartIndex, EndIndex - StartIndex); string[] NpcNames = NpcNameString.Split(new string[] { " or " }, StringSplitOptions.None); foreach (string NpcName in NpcNames) { PgNpcLocation ParsedNpc = null !; if (!Inserter <PgSkill> .SetNpc((PgNpcLocation npcLocation) => ParsedNpc = npcLocation, $"NPC_{NpcName}", parsedFile, parsedKey)) { return(false); } npcList.Add(ParsedNpc); } if (npcList.Count == 0) { return(Program.ReportFailure($"No NPC name in advancement hint: {hint}")); } return(true); }
private bool FinishItem(PgAbilityPvX item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "Damage": Result = SetIntProperty((int valueInt) => item.RawDamage = valueInt, Value); break; case "HealthSpecificDamage": Result = SetIntProperty((int valueInt) => item.RawHealthSpecificDamage = valueInt, Value); break; case "ExtraDamageIfTargetVulnerable": Result = SetIntProperty((int valueInt) => item.RawExtraDamageIfTargetVulnerable = valueInt, Value); break; case "ArmorSpecificDamage": Result = SetIntProperty((int valueInt) => item.RawArmorSpecificDamage = valueInt, Value); break; case "Range": Result = SetIntProperty((int valueInt) => item.RawRange = valueInt, Value); break; case "PowerCost": Result = SetIntProperty((int valueInt) => item.RawPowerCost = valueInt, Value); break; case "MetabolismCost": Result = SetIntProperty((int valueInt) => item.RawMetabolismCost = valueInt, Value); break; case "ArmorMitigationRatio": Result = SetIntProperty((int valueInt) => item.RawArmorMitigationRatio = valueInt, Value); break; case "AoE": Result = SetIntProperty((int valueInt) => item.RawAoE = valueInt, Value); break; case "SelfPreEffects": Result = ParseSelfPreEffects(item, Value); break; case "RageBoost": Result = SetIntProperty((int valueInt) => item.RawRageBoost = valueInt, Value); break; case "RageMultiplier": Result = SetFloatProperty((float valueFloat) => item.RawRageMultiplier = valueFloat, Value); break; case "Accuracy": Result = SetFloatProperty((float valueFloat) => item.RawAccuracy = valueFloat, Value); break; case "AttributesThatDeltaDamage": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatDeltaDamageList, Value); break; case "AttributesThatModDamage": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatModDamageList, Value); break; case "AttributesThatModBaseDamage": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatModBaseDamageList, Value); break; case "AttributesThatDeltaTaunt": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatDeltaTauntList, Value); break; case "AttributesThatModTaunt": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatModTauntList, Value); break; case "AttributesThatDeltaRage": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatDeltaRageList, Value); break; case "AttributesThatModRage": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatModRageList, Value); break; case "AttributesThatDeltaRange": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatDeltaRangeList, Value); break; case "AttributesThatDeltaAccuracy": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatDeltaAccuracyList, Value); break; case "AttributesThatModCritDamage": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatModCritDamageList, Value); break; case "AttributesThatDeltaTempTaunt": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatDeltaTempTauntList, Value); break; case "SpecialValues": Result = Inserter <PgSpecialValue> .AddKeylessArray(item.SpecialValueList, Value); break; case "TauntDelta": Result = SetIntProperty((int valueInt) => item.RawTauntDelta = valueInt, Value); break; case "TempTauntDelta": Result = SetIntProperty((int valueInt) => item.RawTempTauntDelta = valueInt, Value); break; case "RageCost": Result = SetIntProperty((int valueInt) => item.RawRageCost = valueInt, Value); break; case "RageCostMod": Result = SetFloatProperty((float valueFloat) => item.RawRageCostMod = valueFloat, Value); break; case "DoTs": Result = Inserter <PgDoT> .AddKeylessArray(item.DoTList, Value); break; case "CritDamageMod": Result = SetFloatProperty((float valueFloat) => item.RawCritDamageMod = valueFloat, Value); break; case "SelfEffectsOnCrit": Result = StringToEnumConversion <SelfEffect> .TryParseList(Value, item.SelfEffectOnCritList); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } return(Result); }
private bool ParseRewards(PgSkill item, object value, string parsedFile, string parsedKey) { PgRewardList ParsedRewardList = null !; if (!Inserter <PgRewardList> .SetItemProperty((PgRewardList valueRewardList) => ParsedRewardList = valueRewardList, value)) { return(false); } foreach (PgReward Reward in ParsedRewardList.List) { int Level = Reward.RewardLevel; List <Race> RaceRestrictionList = Reward.RaceRestrictionList; string? AbilityKey = Reward.Ability_Key; string? BonusLevelSkillKey = Reward.BonusLevelSkill_Key; string? RecipeKey = Reward.Recipe_Key; string Notes = Reward.Notes; if (AbilityKey != null) { PgSkillAdvancement NewSkillAdvancement = new PgSkillAdvancementRewardAbility() { RawLevel = Level, RaceRestrictionList = RaceRestrictionList, Ability_Key = AbilityKey }; ParsingContext.AddSuplementaryObject(NewSkillAdvancement); item.SkillAdvancementList.Add(NewSkillAdvancement); } if (BonusLevelSkillKey != null) { PgSkillAdvancement NewSkillAdvancement = new PgSkillAdvancementRewardBonusLevel() { RawLevel = Level, RaceRestrictionList = RaceRestrictionList, BonusLevelSkill_Key = BonusLevelSkillKey }; ParsingContext.AddSuplementaryObject(NewSkillAdvancement); item.SkillAdvancementList.Add(NewSkillAdvancement); } if (RecipeKey != null) { PgSkillAdvancement NewSkillAdvancement = new PgSkillAdvancementRewardRecipe() { RawLevel = Level, RaceRestrictionList = RaceRestrictionList, Recipe_Key = RecipeKey }; ParsingContext.AddSuplementaryObject(NewSkillAdvancement); item.SkillAdvancementList.Add(NewSkillAdvancement); } if (Notes.Length > 0) { PgSkillAdvancement NewSkillAdvancement = new PgSkillAdvancementNotes() { RawLevel = Level, RaceRestrictionList = RaceRestrictionList, Text = Notes }; ParsingContext.AddSuplementaryObject(NewSkillAdvancement); item.SkillAdvancementList.Add(NewSkillAdvancement); } } return(true); }
private bool FinishItem(PgSkill item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "Id": Result = SetIntProperty((int valueInt) => item.RawId = valueInt, Value); break; case "Description": Result = SetStringProperty((string valueString) => item.Description = Tools.CleanedUpString(valueString), Value); break; case "HideWhenZero": Result = SetBoolProperty((bool valueBool) => item.SetHideWhenZero(valueBool), Value); break; case "XpTable": Result = Inserter <PgXpTable> .SetItemByInternalName((PgXpTable valueXpTable) => item.XpTable = valueXpTable, Value); break; case "AdvancementTable": Result = ParseAdvancementTable(item, Value, parsedFile, parsedKey); break; case "Combat": Result = SetBoolProperty((bool valueBool) => item.SetIsCombatSkill(valueBool), Value); break; case "TSysCompatibleCombatSkills": Result = ParseCompatibleCombatSkills(item, Value, parsedFile, parsedKey); break; case "MaxBonusLevels": Result = SetIntProperty((int valueInt) => item.RawMaxBonusLevels = valueInt, Value); break; case "InteractionFlagLevelCaps": Result = ParseInteractionFlagLevelCaps(item, Value, parsedFile, parsedKey); break; case "AdvancementHints": Result = ParseAdvancementHints(item, Value, parsedFile, parsedKey); break; case "Rewards": Result = ParseRewards(item, Value, parsedFile, parsedKey); break; case "Reports": Result = ParseReports(item, Value, parsedFile, parsedKey); break; case "Name": Result = SetStringProperty((string valueString) => item.Name = valueString, Value); break; case "Parents": Result = Inserter <PgSkill> .AddPgObjectArrayByKey <PgSkill>(item.ParentSkillList, Value); break; case "SkipBonusLevelsIfSkillUnlearned": Result = SetBoolProperty((bool valueBool) => item.SetSkipBonusLevelsIfSkillUnlearned(valueBool), Value); break; case "AuxCombat": Result = SetBoolProperty((bool valueBool) => item.SetAuxCombat(valueBool), Value); break; case "RecipeIngredientKeywords": Result = StringToEnumConversion <ItemKeyword> .TryParseList(Value, item.RecipeIngredientKeywordList); break; case "_RecipeIngredientKeywords": Result = StringToEnumConversion <ItemKeyword> .TryParseList(Value, item.RecipeIngredientKeywordList); break; case "GuestLevelCap": Result = SetIntProperty((int valueInt) => item.RawGuestLevelCap = valueInt, Value); break; case "IsFakeCombatSkill": Result = SetBoolProperty((bool valueBool) => item.SetIsFakeCombatSkill(valueBool), Value); break; case "IsUmbrellaSkill": Result = SetBoolProperty((bool valueBool) => item.SetIsUmbrellaSkill(valueBool), Value); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } if (Result) { item.SkillAdvancementList.Sort(SortSkillAdvancementByLevel); } return(Result); }
private bool FinishItem(PgAbility item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "AbilityGroup": Result = Inserter <PgAbility> .SetItemByInternalName((PgAbility valueAbility) => item.AbilityGroup_Key = valueAbility.Key, Value); break; case "Animation": Result = StringToEnumConversion <AbilityAnimation> .SetEnum((AbilityAnimation valueEnum) => item.Animation = valueEnum, Value); break; case "AttributesThatModAmmoConsumeChance": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatModAmmoConsumeChanceList, Value); break; case "AttributesThatDeltaDelayLoopTime": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatDeltaDelayLoopTimeList, Value); break; case "AttributesThatDeltaPowerCost": Result = ParseCostDeltaAttribute(item, Value, parsedFile, parsedKey); break; case "AttributesThatDeltaResetTime": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatDeltaResetTimeList, Value); break; case "AttributesThatDeltaWorksWhileStunned": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatDeltaWorksWhileStunnedList, Value); break; case "AttributesThatModPowerCost": Result = Inserter <PgAttribute> .AddPgObjectArrayByKey <PgAttribute>(item.AttributesThatModPowerCostList, Value); break; case "CanBeOnSidebar": Result = SetBoolProperty((bool valueBool) => item.SetCanBeOnSidebar(valueBool), Value); break; case "CanSuppressMonsterShout": Result = SetBoolProperty((bool valueBool) => item.SetCanSuppressMonsterShout(valueBool), Value); break; case "CanTargetUntargetableEnemies": Result = SetBoolProperty((bool valueBool) => item.SetCanTargetUntargetableEnemies(valueBool), Value); break; case "CausesOfDeath": Result = StringToEnumConversion <Deaths> .TryParseList(Value, item.CausesOfDeathList); break; case "Costs": Result = ParseCosts(item, Value, parsedFile, parsedKey); break; case "CombatRefreshBaseAmount": Result = SetIntProperty((int valueInt) => item.RawCombatRefreshBaseAmount = valueInt, Value); break; case "DamageType": Result = StringToEnumConversion <DamageType> .SetEnum((DamageType valueEnum) => item.DamageType = valueEnum, DamageType.Internal_None, DamageType.Internal_Empty, Value); break; case "DelayLoopIsAbortedIfAttacked": Result = SetBoolProperty((bool valueBool) => item.SetDelayLoopIsAbortedIfAttacked(valueBool), Value); break; case "DelayLoopMessage": Result = SetStringProperty((string valueString) => item.DelayLoopMessage = valueString, Value); break; case "DelayLoopTime": Result = SetFloatProperty((float valueFloat) => item.RawDelayLoopTime = valueFloat, Value); break; case "Description": Result = SetStringProperty((string valueString) => item.Description = valueString, Value); break; case "EffectKeywordsIndicatingEnabled": Result = StringToEnumConversion <AbilityIndicatingEnabled> .SetEnum((AbilityIndicatingEnabled valueEnum) => item.EffectKeywordsIndicatingEnabled = valueEnum, Value); break; case "ExtraKeywordsForTooltips": Result = StringToEnumConversion <TooltipsExtraKeywords> .SetEnum((TooltipsExtraKeywords valueEnum) => item.ExtraKeywordsForTooltips = valueEnum, Value); break; case "IconID": Result = SetIconIdProperty((int valueInt) => item.RawIconId = valueInt, Value); break; case "IgnoreEffectErrors": Result = SetBoolProperty((bool valueBool) => item.SetIgnoreEffectErrors(valueBool), Value); break; case "InternalAbility": Result = SetBoolProperty((bool valueBool) => item.SetInternalAbility(valueBool), Value); break; case "InternalName": Result = SetStringProperty((string valueString) => item.InternalName = valueString, Value); break; case "IsHarmless": Result = SetBoolProperty((bool valueBool) => item.SetIsHarmless(valueBool), Value); break; case "ItemKeywordReqErrorMessage": Result = SetStringProperty((string valueString) => item.ItemKeywordReqErrorMessage = valueString, Value); break; case "ItemKeywordReqs": Result = StringToEnumConversion <AbilityItemKeyword> .TryParseList(Value, item.ItemKeywordReqList); break; case "Keywords": Result = StringToEnumConversion <AbilityKeyword> .TryParseList(Value, item.KeywordList); break; case "Level": Result = SetIntProperty((int valueInt) => item.RawLevel = valueInt, Value); break; case "Name": Result = SetStringProperty((string valueString) => item.Name = valueString, Value); break; case "PetTypeTagReq": Result = StringToEnumConversion <AbilityPetType> .SetEnum((AbilityPetType valueEnum) => item.PetTypeTagReq = valueEnum, Value); break; case "PetTypeTagReqMax": Result = SetIntProperty((int valueInt) => item.RawPetTypeTagReqMax = valueInt, Value); break; case "Prerequisite": Result = Inserter <PgAbility> .SetItemByInternalName((PgAbility valueAbility) => item.Prerequisite_Key = valueAbility.Key, Value); break; case "Projectile": Result = StringToEnumConversion <AbilityProjectile> .SetEnum((AbilityProjectile valueEnum) => item.Projectile = valueEnum, Value); break; case "PvE": Result = Inserter <PgAbilityPvX> .SetItemProperty((PgAbilityPvX valueAbilityPvX) => item.PvE = valueAbilityPvX, Value); break; case "PvP": Result = Inserter <PgAbilityPvX> .SetItemProperty((PgAbilityPvX valueAbilityPvX) => item.PvP = valueAbilityPvX, Value); break; case "ResetTime": Result = SetFloatProperty((float valueFloat) => item.RawResetTime = valueFloat, Value); break; case "SelfParticle": Result = StringToEnumConversion <SelfParticle> .SetEnum((SelfParticle valueEnum) => item.SelfParticle = valueEnum, Value); break; case "AmmoDescription": Result = SetStringProperty((string valueString) => item.AmmoDescription = valueString, Value); break; case "SharesResetTimerWith": Result = Inserter <PgAbility> .SetItemByInternalName((PgAbility valueAbility) => item.SharesResetTimerWith_Key = valueAbility.Key, Value); break; case "Skill": Result = ParserSkill.Parse((PgSkill valueSkill) => item.Skill_Key = valueSkill.Key, Value, parsedFile, parsedKey); break; case "SpecialCasterRequirements": Result = Inserter <PgAbilityRequirement> .AddKeylessArray(item.SpecialCasterRequirementList, Value); break; case "SpecialCasterRequirementsErrorMessage": Result = SetStringProperty((string valueString) => item.SpecialCasterRequirementsErrorMessage = valueString, Value); break; case "SpecialInfo": Result = SetStringProperty((string valueString) => item.SpecialInfo = valueString, Value); break; case "SpecialTargetingTypeReq": Result = SetIntProperty((int valueInt) => item.RawSpecialTargetingTypeReq = valueInt, Value); break; case "Target": Result = StringToEnumConversion <AbilityTarget> .SetEnum((AbilityTarget valueEnum) => item.Target = valueEnum, Value); break; case "TargetEffectKeywordReq": Result = StringToEnumConversion <TargetEffectKeyword> .SetEnum((TargetEffectKeyword valueEnum) => item.TargetEffectKeywordReq = valueEnum, Value); break; case "TargetParticle": Result = StringToEnumConversion <AbilityTargetParticle> .SetEnum((AbilityTargetParticle valueEnum) => item.TargetParticle = valueEnum, Value); break; case "UpgradeOf": Result = Inserter <PgAbility> .SetItemByInternalName((PgAbility valueAbility) => item.UpgradeOf_Key = valueAbility.Key, Value); break; case "WorksInCombat": Result = SetBoolProperty((bool valueBool) => item.SetWorksInCombat(valueBool), Value); break; case "WorksUnderwater": Result = SetBoolProperty((bool valueBool) => item.SetWorksUnderwater(valueBool), Value); break; case "WorksWhileFalling": Result = SetBoolProperty((bool valueBool) => item.SetWorksWhileFalling(valueBool), Value); break; case "DelayLoopIsOnlyUsedInCombat": Result = SetBoolProperty((bool valueBool) => item.SetDelayLoopIsOnlyUsedInCombat(valueBool), Value); break; case "AmmoKeywords": Result = Inserter <PgAbilityAmmo> .AddKeylessArray(item.AmmoKeywordList, Value); break; case "AmmoConsumeChance": Result = SetFloatProperty((float valueFloat) => item.RawAmmoConsumeChance = valueFloat, Value); break; case "AmmoStickChance": Result = SetFloatProperty((float valueFloat) => item.RawAmmoStickChance = valueFloat, Value); break; case "TargetTypeTagReq": Result = ParseTargetTypeTagReq(item, Value, parsedFile, parsedKey); break; case "WorksWhileMounted": Result = SetBoolProperty((bool valueBool) => item.SetWorksWhileMounted(valueBool), Value); break; case "SelfPreParticle": Result = StringToEnumConversion <SelfPreParticle> .SetEnum((SelfPreParticle valueEnum) => item.SelfPreParticle = valueEnum, Value); break; case "IsCosmeticPet": Result = SetBoolProperty((bool valueBool) => item.SetIsCosmeticPet(valueBool), Value); break; case "WorksWhileStunned": Result = SetBoolProperty((bool valueBool) => item.SetWorksWhileStunned(valueBool), Value); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } if (Result) { if (item.PvE == null) { return(Program.ReportFailure(parsedFile, parsedKey, $"PvE info missing")); } item.DigitStrippedName = CuteDigitStrippedName(item); } return(Result); }
private bool FinishItem(PgQuest item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; int? RawTSysLevel = null; foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "InternalName": Result = SetStringProperty((string valueString) => item.InternalName = valueString, Value); break; case "Name": Result = SetStringProperty((string valueString) => item.Name = valueString, Value); break; case "Description": Result = SetStringProperty((string valueString) => item.Description = Tools.CleanedUpString(valueString), Value); break; case "Version": Result = SetIntProperty((int valueInt) => item.RawVersion = valueInt, Value); break; case "RequirementsToSustain": Result = Inserter <PgQuestRequirement> .AddKeylessArray(item.QuestRequirementToSustainList, Value); break; case "ReuseTime_Minutes": Result = SetTimeProperty(() => item.RawReuseTime, (TimeSpan valueTime) => item.RawReuseTime = valueTime, 1, Value); break; case "ReuseTime_Hours": Result = SetTimeProperty(() => item.RawReuseTime, (TimeSpan valueTime) => item.RawReuseTime = valueTime, 60, Value); break; case "ReuseTime_Days": Result = SetTimeProperty(() => item.RawReuseTime, (TimeSpan valueTime) => item.RawReuseTime = valueTime, 60 * 24, Value); break; case "IsCancellable": Result = SetBoolProperty((bool valueBool) => item.SetIsCancellable(valueBool), Value); break; case "Objectives": Result = Inserter <PgQuestObjective> .AddKeylessArray(item.QuestObjectiveList, Value); break; /* case "Rewards_XP": * Result = Inserter<PgQuestReward>.AddKeylessArray(item.QuestRewardList, Value); * break;*/ /* case "Rewards_Currency": * Result = Inserter<PgQuestReward>.AddKeylessArray(item.QuestRewardList, Value); * break;*/ case "Rewards_Items": Result = Inserter <PgQuestReward> .AddKeylessArray(item.QuestRewardList, Value); break; case "Reward_CombatXP": Result = ParseRewardCombatXp(item, Value, parsedFile, parsedKey); break; case "QuestNpc": Result = Inserter <PgQuest> .SetNpc((PgNpcLocation npcLocation) => item.QuestNpc = npcLocation, Value, parsedFile, parsedKey); break; case "FavorNpc": Result = Inserter <PgQuest> .SetNpc((PgNpcLocation npcLocation) => item.FavorNpc = npcLocation, Value, parsedFile, parsedKey); break; case "PrefaceText": Result = SetStringProperty((string valueString) => item.PrefaceText = Tools.CleanedUpString(valueString), Value); break; case "SuccessText": Result = SetStringProperty((string valueString) => item.SuccessText = Tools.CleanedUpString(valueString), Value); break; case "MidwayText": Result = SetStringProperty((string valueString) => item.MidwayText = Tools.CleanedUpString(valueString), Value); break; case "PrerequisiteFavorLevel": Result = StringToEnumConversion <Favor> .SetEnum((Favor valueEnum) => item.PrerequisiteFavorLevel = valueEnum, Value); break; case "Rewards_Favor": Result = ParseRewardFavor(item, Value, parsedFile, parsedKey); break; /* case "Rewards_Recipes": * Result = ParseRewardRecipes(item, Value, parsedFile, parsedKey); * break;*/ /* case "Rewards_Ability": * Result = ParseRewardAbility(item, Value, parsedFile, parsedKey); * break;*/ case "Requirements": Result = Inserter <PgQuestRequirement> .AddKeylessArray(item.QuestRequirementList, Value); break; case "Reward_Favor": Result = ParseRewardFavor(item, Value, parsedFile, parsedKey); break; case "Rewards": Result = Inserter <PgQuestReward> .AddKeylessArray(item.QuestRewardList, Value); break; case "PreGiveItems": Result = Inserter <PgQuestReward> .AddKeylessArray(item.PreGiveItemList, Value); break; case "TSysLevel": Result = SetIntProperty((int valueInt) => RawTSysLevel = valueInt, Value); break; /*case "Reward_Gold": * Result = ParseRewardCurrency(item, Value, parsedFile, parsedKey); * break;*/ case "Rewards_NamedLootProfile": Result = ParseRewardNamedLootProfile(item, Value, parsedFile, parsedKey); break; case "PreGiveRecipes": Result = Inserter <PgRecipe> .AddPgObjectArrayByInternalName <PgRecipe>(item.PreGiveRecipeList, Value); break; case "Keywords": Result = StringToEnumConversion <QuestKeyword> .TryParseList(Value, item.KeywordList); break; case "Rewards_Effects": Result = ParseRewardEffects(item, Value, parsedFile, parsedKey); break; case "IsAutoPreface": Result = SetBoolProperty((bool valueBool) => item.SetIsAutoPreface(valueBool), Value); break; case "IsAutoWrapUp": Result = SetBoolProperty((bool valueBool) => item.SetIsAutoWrapUp(valueBool), Value); break; case "GroupingName": Result = StringToEnumConversion <QuestGroupingName> .SetEnum((QuestGroupingName valueEnum) => item.GroupingName = valueEnum, Value); break; case "IsGuildQuest": Result = SetBoolProperty((bool valueBool) => item.SetIsGuildQuest(valueBool), Value); break; case "NumExpectedParticipants": Result = SetIntProperty((int valueInt) => item.RawNumExpectedParticipants = valueInt, Value); break; case "Level": Result = SetIntProperty((int valueInt) => item.RawLevel = valueInt, Value); break; case "WorkOrderSkill": Result = ParserSkill.Parse((PgSkill valueSkill) => item.WorkOrderSkill_Key = valueSkill.Key, Value, parsedFile, parsedKey); break; case "DisplayedLocation": Result = StringToEnumConversion <MapAreaName> .SetEnum((MapAreaName valueEnum) => item.DisplayedLocation = valueEnum, Value); break; case "FollowUpQuests": Result = ParseFollowUpQuests(item, Value, parsedFile, parsedKey); break; case "PreGiveEffects": Result = ParsePreGiveEffects(item, Value, parsedFile, parsedKey); break; case "MidwayGiveItems": Result = Inserter <PgQuestReward> .AddKeylessArray(item.QuestMidwayGiveItemList, Value); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } if (Result) { if (item.RawLevel.HasValue && RawTSysLevel.HasValue) { return(Program.ReportFailure(parsedFile, parsedKey, "Both levels set")); } if (RawTSysLevel.HasValue) { Debug.Assert(!item.RawLevel.HasValue); item.RawLevel = RawTSysLevel; } } return(Result); }
private bool FinishItem(PgRecipeItem item, Dictionary <string, object> contentTable, Dictionary <string, Json.Token> contentTypeTable, List <object> itemCollection, Json.Token lastItemType, string parsedFile, string parsedKey) { bool Result = true; foreach (KeyValuePair <string, object> Entry in contentTable) { string Key = Entry.Key; object Value = Entry.Value; switch (Key) { case "ItemCode": Result = Inserter <PgItem> .SetItemByKey((PgItem valueItem) => item.Item_Key = valueItem.Key, $"item_{Value}"); break; case "StackSize": Result = SetIntProperty((int valueInt) => item.RawStackSize = valueInt, Value); break; case "PercentChance": Result = SetFloatProperty((float valueFloat) => item.RawPercentChance = valueFloat, Value); break; case "ItemKeys": Result = StringToEnumConversion <RecipeItemKey> .TryParseList(Value, item.ItemKeyList); break; case "Desc": Result = SetStringProperty((string valueString) => item.Description = valueString, Value); break; case "ChanceToConsume": Result = SetFloatProperty((float valueFloat) => item.RawChanceToConsume = valueFloat, Value); break; case "DurabilityConsumed": Result = SetFloatProperty((float valueFloat) => item.RawDurabilityConsumed = valueFloat, Value); break; case "AttuneToCrafter": Result = SetBoolProperty((bool valueBool) => item.RawAttuneToCrafter = valueBool, Value); break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; } if (!Result) { break; } } if (Result) { if (item.Item_Key == null && item.ItemKeyList.Count == 0) { return(Program.ReportFailure(parsedFile, parsedKey, "Missing item or item keys")); } if (item.Item_Key != null && item.ItemKeyList.Count > 0) { return(Program.ReportFailure(parsedFile, parsedKey, "Inconsistent item or item keys")); } if (item.ItemKeyList.Count > 0 && item.Description.Length == 0) { return(Program.ReportFailure(parsedFile, parsedKey, "Empty Description")); } if (item.ItemKeyList.Count == 0 && item.Description.Length > 0) { return(Program.ReportFailure(parsedFile, parsedKey, "Unexpected Description")); } if ((item.RawPercentChance.HasValue && item.RawChanceToConsume.HasValue) || (item.RawPercentChance.HasValue && item.RawDurabilityConsumed.HasValue) || (item.RawChanceToConsume.HasValue && item.RawDurabilityConsumed.HasValue)) { return(Program.ReportFailure(parsedFile, parsedKey, "Inconsistent percentage")); } if (item.RawPercentChance.HasValue) { item.RawPercentChance = item.RawPercentChance.Value * 100; } if (item.RawChanceToConsume.HasValue) { item.RawChanceToConsume = item.RawChanceToConsume.Value * 100; } if (item.RawDurabilityConsumed.HasValue) { item.RawDurabilityConsumed = item.RawDurabilityConsumed.Value * 100; } } return(Result); }