From 335757071d81b144960fd6b6648fcaf97e43e17a Mon Sep 17 00:00:00 2001 From: David Le Bansais Date: Sun, 23 Jun 2024 10:01:09 +0200 Subject: [PATCH] Client 406. --- ...lAdvancementHintCollectionJsonConverter.cs | 3 + Pipeline/Preprocessing/Objects/AI/AI.cs | 1 + .../Objects/Ability/PvEAbility.cs | 6 + .../Objects/Ability/RawPvEAbility.cs | 2 + .../Objects/Ability/SpecialValue.cs | 3 +- .../Preprocessing/Objects/Effect/Effect.cs | 48 ++++++- .../Preprocessing/Objects/Npc/NpcService.cs | 15 +- .../Objects/Npc/NpcServiceCapIncrease.cs | 1 + .../Objects/PlayerTitle/PlayerTitle.cs | 3 + .../Objects/PlayerTitle/RawPlayerTitle.cs | 1 + Pipeline/Preprocessing/Objects/Quest/Quest.cs | 3 + .../Preprocessing/Objects/Quest/RawQuest.cs | 1 + .../Preprocessing/Objects/Recipe/Recipe.cs | 28 ++++ .../Objects/Recipe/RecipeResultEffect.cs | 1 + .../CombatParser/CombatParser.Sentences.cs | 3 + Translator/CombatParser/CombatParser.cs | 14 +- Translator/EffectVerification.cs | 3 + Translator/Enums/AbilityAnimation.cs | 25 ++++ Translator/Enums/AbilityKeyword.cs | 9 +- Translator/Enums/AbilityProjectile.cs | 2 + Translator/Enums/AbilitySelfParticle.cs | 1 + Translator/Enums/AbilityTargetParticle.cs | 4 + Translator/Enums/CombatKeyword.cs | 3 + Translator/Enums/CraftedBoost.cs | 9 ++ Translator/Enums/Deaths.cs | 2 + Translator/Enums/EffectKeyword.cs | 6 +- Translator/Enums/EffectParticle.cs | 7 + Translator/Enums/EffectStackingType.cs | 2 +- Translator/Enums/ItemKeyword.cs | 24 ++++ Translator/Enums/ItemSlot.cs | 1 + Translator/Enums/ItemUseRequirement.cs | 1 + Translator/Enums/NamedLootProfile.cs | 8 ++ Translator/Enums/OtherRequirementType.cs | 2 + Translator/Enums/PowerWaxType.cs | 6 + Translator/Enums/QuestKeyword.cs | 2 + Translator/Enums/QuestRewardType.cs | 1 + Translator/Enums/RecipeCurrency.cs | 1 + Translator/Enums/RecipeEffect.cs | 3 + Translator/Enums/RecipeItemKey.cs | 14 ++ Translator/Enums/RecipeResultEffectType.cs | 2 + Translator/Enums/XpTableEnum.cs | 1 + Translator/FieldTables/FieldTableStore.cs | 10 +- Translator/Objects/AI/PgAI.cs | 2 + .../PgAbilityRequirementInMusicPerformance.cs | 6 + .../PgAbilityRequirementIsDancingOnPole.cs | 6 + Translator/Objects/Ability/PgAbilityPvX.cs | 16 ++- Translator/Objects/Ability/PgSpecialValue.cs | 3 +- Translator/Objects/Npc/PgNpcCapIncrease.cs | 1 + .../Objects/PlayerTitle/PgPlayerTitle.cs | 2 + Translator/Objects/Quest/PgQuest.cs | 5 + .../QuestReward/PgQuestRewardRacingXp.cs | 9 ++ .../PgRecipeResultBestowRecipeIfNotKnown.cs | 7 + .../PgRecipeResultCraftWaxItem.cs | 12 ++ Translator/Parsers/AI/ParserAI.cs | 3 + .../Parsers/Ability/ParserAbilityPvX.cs | 6 + .../Ability/ParserAbilityRequirement.cs | 124 +++++++++++++--- .../Parsers/Ability/ParserSpecialValue.cs | 9 +- .../Parsers/Npc/ParserNpcCapIncrease.cs | 3 + Translator/Parsers/Npc/ParserNpcService.cs | 2 +- .../Parsers/PlayerTitle/ParserPlayerTitle.cs | 3 + Translator/Parsers/Quest/ParserQuest.cs | 10 ++ Translator/Parsers/Quest/ParserQuestReward.cs | 51 +++++++ .../Recipe/ParserRecipeResultEffect.cs | 99 +++++++++++++ Translator/Program.cs | 2 +- Translator/TextMaps.cs | 134 +++++++++++++++++- Translator/Translator.csproj | 4 +- 66 files changed, 743 insertions(+), 58 deletions(-) create mode 100644 Translator/Objects/Ability/AbilityRequirement/PgAbilityRequirementInMusicPerformance.cs create mode 100644 Translator/Objects/Ability/AbilityRequirement/PgAbilityRequirementIsDancingOnPole.cs create mode 100644 Translator/Objects/Quest/QuestReward/PgQuestRewardRacingXp.cs create mode 100644 Translator/Objects/Recipe/RecipeResult/PgRecipeResultBestowRecipeIfNotKnown.cs create mode 100644 Translator/Objects/Recipe/RecipeResult/PgRecipeResultCraftWaxItem.cs diff --git a/Pipeline/Preprocessing/JsonConverter/SkillAdvancementHintCollectionJsonConverter.cs b/Pipeline/Preprocessing/JsonConverter/SkillAdvancementHintCollectionJsonConverter.cs index 442c2eef..c6226f27 100644 --- a/Pipeline/Preprocessing/JsonConverter/SkillAdvancementHintCollectionJsonConverter.cs +++ b/Pipeline/Preprocessing/JsonConverter/SkillAdvancementHintCollectionJsonConverter.cs @@ -46,6 +46,9 @@ private void ReadTableDictionary(SkillAdvancementHintCollection collection, ref if (hint.EndsWith("learn a new dance move.")) return null; + if (hint.EndsWith("defeat a fabled dragon of yore.")) + return null; + hint = hint.Replace(" during a Full Moon,", string.Empty); string Pattern; diff --git a/Pipeline/Preprocessing/Objects/AI/AI.cs b/Pipeline/Preprocessing/Objects/AI/AI.cs index c3ed85f3..b905891c 100644 --- a/Pipeline/Preprocessing/Objects/AI/AI.cs +++ b/Pipeline/Preprocessing/Objects/AI/AI.cs @@ -5,6 +5,7 @@ public class AI public AIAbilityDictionary? Abilities { get; set; } public string? Comment { get; set; } public string? Description { get; set; } + public int? FlyOffset { get; set; } public bool? Flying { get; set; } public decimal? MinDelayBetweenAbilities { get; set; } public string? MobilityType { get; set; } diff --git a/Pipeline/Preprocessing/Objects/Ability/PvEAbility.cs b/Pipeline/Preprocessing/Objects/Ability/PvEAbility.cs index 9b81fbdd..95fee09f 100644 --- a/Pipeline/Preprocessing/Objects/Ability/PvEAbility.cs +++ b/Pipeline/Preprocessing/Objects/Ability/PvEAbility.cs @@ -13,7 +13,9 @@ public PvEAbility(RawPvEAbility rawPvEAbility) ArmorMitigationRatio = rawPvEAbility.ArmorMitigationRatio; ArmorSpecificDamage = rawPvEAbility.ArmorSpecificDamage; AttributesThatDeltaAccuracy = rawPvEAbility.AttributesThatDeltaAccuracy; + AttributesThatDeltaAoE = rawPvEAbility.AttributesThatDeltaAoE; AttributesThatDeltaDamage = rawPvEAbility.AttributesThatDeltaDamage; + AttributesThatDeltaDamageIfTargetIsVulnerable = rawPvEAbility.AttributesThatDeltaDamageIfTargetIsVulnerable; AttributesThatDeltaRage = rawPvEAbility.AttributesThatDeltaRage; AttributesThatDeltaRange = rawPvEAbility.AttributesThatDeltaRange; AttributesThatDeltaTaunt = rawPvEAbility.AttributesThatDeltaTaunt; @@ -89,7 +91,9 @@ private static SelfPreEffect ParseSelfPreEffect(string rawSelfPreEffect) public int? ArmorMitigationRatio { get; set; } public int? ArmorSpecificDamage { get; set; } public string[]? AttributesThatDeltaAccuracy { get; set; } + public string[]? AttributesThatDeltaAoE { get; set; } public string[]? AttributesThatDeltaDamage { get; set; } + public string[]? AttributesThatDeltaDamageIfTargetIsVulnerable { get; set; } public string[]? AttributesThatDeltaRage { get; set; } public string[]? AttributesThatDeltaRange { get; set; } public string[]? AttributesThatDeltaTaunt { get; set; } @@ -125,7 +129,9 @@ public RawPvEAbility ToRawPvEAbility() Result.ArmorMitigationRatio = ArmorMitigationRatio; Result.ArmorSpecificDamage = ArmorSpecificDamage; Result.AttributesThatDeltaAccuracy = AttributesThatDeltaAccuracy; + Result.AttributesThatDeltaAoE = AttributesThatDeltaAoE; Result.AttributesThatDeltaDamage = AttributesThatDeltaDamage; + Result.AttributesThatDeltaDamageIfTargetIsVulnerable = AttributesThatDeltaDamageIfTargetIsVulnerable; Result.AttributesThatDeltaRage = AttributesThatDeltaRage; Result.AttributesThatDeltaRange = AttributesThatDeltaRange; Result.AttributesThatDeltaTaunt = AttributesThatDeltaTaunt; diff --git a/Pipeline/Preprocessing/Objects/Ability/RawPvEAbility.cs b/Pipeline/Preprocessing/Objects/Ability/RawPvEAbility.cs index fe1c44f4..c0d86c96 100644 --- a/Pipeline/Preprocessing/Objects/Ability/RawPvEAbility.cs +++ b/Pipeline/Preprocessing/Objects/Ability/RawPvEAbility.cs @@ -7,7 +7,9 @@ public class RawPvEAbility public int? ArmorMitigationRatio { get; set; } public int? ArmorSpecificDamage { get; set; } public string[]? AttributesThatDeltaAccuracy { get; set; } + public string[]? AttributesThatDeltaAoE { get; set; } public string[]? AttributesThatDeltaDamage { get; set; } + public string[]? AttributesThatDeltaDamageIfTargetIsVulnerable { get; set; } public string[]? AttributesThatDeltaRage { get; set; } public string[]? AttributesThatDeltaRange { get; set; } public string[]? AttributesThatDeltaTaunt { get; set; } diff --git a/Pipeline/Preprocessing/Objects/Ability/SpecialValue.cs b/Pipeline/Preprocessing/Objects/Ability/SpecialValue.cs index 9039cf59..0de778ad 100644 --- a/Pipeline/Preprocessing/Objects/Ability/SpecialValue.cs +++ b/Pipeline/Preprocessing/Objects/Ability/SpecialValue.cs @@ -3,10 +3,11 @@ public class SpecialValue { public string[]? AttributesThatDelta { get; set; } + public string[]? AttributesThatDeltaBase { get; set; } public string[]? AttributesThatMod { get; set; } - //public string[]? AttributesThatModBase { get; set; } public string? DisplayType { get; set; } public string? Label { get; set; } + public string? SkipIfThisAttributeIsZero { get; set; } public bool? SkipIfZero { get; set; } public string? Suffix { get; set; } public decimal? Value { get; set; } diff --git a/Pipeline/Preprocessing/Objects/Effect/Effect.cs b/Pipeline/Preprocessing/Objects/Effect/Effect.cs index d82f8923..ac406132 100644 --- a/Pipeline/Preprocessing/Objects/Effect/Effect.cs +++ b/Pipeline/Preprocessing/Objects/Effect/Effect.cs @@ -1,4 +1,6 @@ -namespace Preprocessor; +using System.Collections.Generic; + +namespace Preprocessor; public class Effect { @@ -9,7 +11,7 @@ public Effect(RawEffect rawEffect) DisplayMode = rawEffect.DisplayMode; Duration = Preprocessor.ToNumberOrString(rawEffect.Duration, out IsDurationNumber); IconId = rawEffect.IconId; - Keywords = rawEffect.Keywords; + Keywords = ParseKeywords(rawEffect.Keywords); Name = rawEffect.Name; Particle = EffectParticle.Parse(rawEffect.Particle); SpewText = rawEffect.SpewText; @@ -17,6 +19,26 @@ public Effect(RawEffect rawEffect) StackingType = ParseStackingType(rawEffect.StackingType); } + private static string[]? ParseKeywords(string[]? rawKeywords) + { + if (rawKeywords is null) + return null; + + List Result = new(); + foreach (var Keyword in rawKeywords) + Result.Add(ParseKeyword(Keyword)); + + return Result.ToArray(); + } + + private static string ParseKeyword(string rawKeyword) + { + if (rawKeyword == "-") + return "Hyphen"; + else + return rawKeyword; + } + private static string? ParseDescription(string? rawDescription, string[]? rawAbilityKeywords, string? rawName, out EffectDescriptionFix effectDescriptionFix) { effectDescriptionFix = EffectDescriptionFix.None; @@ -88,7 +110,7 @@ public RawEffect ToRawEffect() Result.DisplayMode = DisplayMode; Result.Duration = Preprocessor.FromNumberOrString(Duration, IsDurationNumber); Result.IconId = IconId; - Result.Keywords = Keywords; + Result.Keywords = ToRawKeywords(Keywords); Result.Name = Name; Result.Particle = EffectParticle.ToString(Particle); Result.SpewText = SpewText; @@ -98,6 +120,26 @@ public RawEffect ToRawEffect() return Result; } + private static string[]? ToRawKeywords(string[]? keywords) + { + if (keywords is null) + return null; + + List Result = new(); + foreach (var Keyword in keywords) + Result.Add(ToRawKeyword(Keyword)); + + return Result.ToArray(); + } + + private static string ToRawKeyword(string keyword) + { + if (keyword == "Hyphen") + return "-"; + else + return keyword; + } + private static string? ToRawDescription(string? description, EffectDescriptionFix effectDescriptionFix) { string? Result; diff --git a/Pipeline/Preprocessing/Objects/Npc/NpcService.cs b/Pipeline/Preprocessing/Objects/Npc/NpcService.cs index 99c91642..cce7fafd 100644 --- a/Pipeline/Preprocessing/Objects/Npc/NpcService.cs +++ b/Pipeline/Preprocessing/Objects/Npc/NpcService.cs @@ -33,13 +33,16 @@ public NpcService(RawNpcService rawNpcService) private static NpcServiceCapIncrease ParseCapIncrease(string rawCapIncrease) { string[] Splitted = rawCapIncrease.Split(':'); - if (Splitted.Length != 2) + if (Splitted.Length < 2 || Splitted.Length > 3 ) throw new PreprocessorException(); if (!int.TryParse(Splitted[1], out int Value)) throw new PreprocessorException(); - NpcServiceCapIncrease Result = new() { Favor = Splitted[0], Value = Value }; + string Favor = Splitted[0]; + string? Purchase = Splitted.Length > 2 ? Splitted[2] : null; + + NpcServiceCapIncrease Result = new() { Favor = Favor, Value = Value, Purchase = Purchase }; return Result; } @@ -110,7 +113,13 @@ public RawNpcService ToRawNpcService() List Result = new(); foreach (NpcServiceCapIncrease CapIncrease in npcServiceCapIncreases) - Result.Add($"{CapIncrease.Favor}:{CapIncrease.Value}"); + { + string StringValue = $"{CapIncrease.Favor}:{CapIncrease.Value}"; + if (CapIncrease.Purchase is not null) + StringValue += $":{CapIncrease.Purchase}"; + + Result.Add(StringValue); + } return Result.ToArray(); } diff --git a/Pipeline/Preprocessing/Objects/Npc/NpcServiceCapIncrease.cs b/Pipeline/Preprocessing/Objects/Npc/NpcServiceCapIncrease.cs index 025982f9..359e281a 100644 --- a/Pipeline/Preprocessing/Objects/Npc/NpcServiceCapIncrease.cs +++ b/Pipeline/Preprocessing/Objects/Npc/NpcServiceCapIncrease.cs @@ -3,5 +3,6 @@ public class NpcServiceCapIncrease { public string? Favor { get; set; } + public string? Purchase { get; set; } public int Value { get; set; } } diff --git a/Pipeline/Preprocessing/Objects/PlayerTitle/PlayerTitle.cs b/Pipeline/Preprocessing/Objects/PlayerTitle/PlayerTitle.cs index 51f39cb9..d8cbe272 100644 --- a/Pipeline/Preprocessing/Objects/PlayerTitle/PlayerTitle.cs +++ b/Pipeline/Preprocessing/Objects/PlayerTitle/PlayerTitle.cs @@ -6,6 +6,7 @@ public class PlayerTitle { public PlayerTitle(RawPlayerTitle rawPlayerTitle) { + AccountWide = rawPlayerTitle.AccountWide; Keywords = rawPlayerTitle.Keywords; (Title, Color, ColorFormat) = ParseTitle(rawPlayerTitle.Title); Tooltip = rawPlayerTitle.Tooltip; @@ -43,6 +44,7 @@ private static (string?, string?, ColorFormat?) ParseTitle(string? rawTitle) return (rawTitle, null, null); } + public bool? AccountWide { get; set; } public string? Color { get; set; } public string[]? Keywords { get; set; } public string? Title { get; set; } @@ -52,6 +54,7 @@ public RawPlayerTitle ToRawPlayerTitle() { RawPlayerTitle Result = new(); + Result.AccountWide = AccountWide; Result.Keywords = Keywords; Result.Title = ToRawTitle(Title, ColorFormat); Result.Tooltip = Tooltip; diff --git a/Pipeline/Preprocessing/Objects/PlayerTitle/RawPlayerTitle.cs b/Pipeline/Preprocessing/Objects/PlayerTitle/RawPlayerTitle.cs index c57dc3d4..a87cc595 100644 --- a/Pipeline/Preprocessing/Objects/PlayerTitle/RawPlayerTitle.cs +++ b/Pipeline/Preprocessing/Objects/PlayerTitle/RawPlayerTitle.cs @@ -2,6 +2,7 @@ public class RawPlayerTitle { + public bool? AccountWide { get; set; } public string[]? Keywords { get; set; } public string? Title { get; set; } public string? Tooltip { get; set; } diff --git a/Pipeline/Preprocessing/Objects/Quest/Quest.cs b/Pipeline/Preprocessing/Objects/Quest/Quest.cs index dbfe647c..197fb831 100644 --- a/Pipeline/Preprocessing/Objects/Quest/Quest.cs +++ b/Pipeline/Preprocessing/Objects/Quest/Quest.cs @@ -14,6 +14,7 @@ public Quest(RawQuest rawQuest) DisplayedLocation = Area.FromRawAreaName(rawQuest.DisplayedLocation, out OriginalDisplayedLocation); FavorNpc = rawQuest.FavorNpc; FollowUpQuests = rawQuest.FollowUpQuests; + ForceBookOnWrapUp = rawQuest.ForceBookOnWrapUp; GroupingName = rawQuest.GroupingName; InternalName = rawQuest.InternalName; IsAutoPreface = rawQuest.IsAutoPreface; @@ -349,6 +350,7 @@ private static QuestReward ParseRewardEffectRaiseSkillToLevel(string levelReward public string? DisplayedLocation { get; set; } public string? FavorNpc { get; set; } public string[]? FollowUpQuests { get; set; } + public bool? ForceBookOnWrapUp { get; set; } public string? GroupingName { get; set; } public string? InternalName { get; set; } public bool? IsAutoPreface { get; set; } @@ -388,6 +390,7 @@ public RawQuest ToRawQuest() Result.DisplayedLocation = Area.ToRawAreaName(DisplayedLocation, OriginalDisplayedLocation); Result.FavorNpc = FavorNpc; Result.FollowUpQuests = FollowUpQuests; + Result.ForceBookOnWrapUp = ForceBookOnWrapUp; Result.GroupingName = GroupingName; Result.InternalName = InternalName; Result.IsAutoPreface = IsAutoPreface; diff --git a/Pipeline/Preprocessing/Objects/Quest/RawQuest.cs b/Pipeline/Preprocessing/Objects/Quest/RawQuest.cs index 67c31126..eb862307 100644 --- a/Pipeline/Preprocessing/Objects/Quest/RawQuest.cs +++ b/Pipeline/Preprocessing/Objects/Quest/RawQuest.cs @@ -7,6 +7,7 @@ public class RawQuest public string? DisplayedLocation { get; set; } public string? FavorNpc { get; set; } public string[]? FollowUpQuests { get; set; } + public bool? ForceBookOnWrapUp { get; set; } public string? GroupingName { get; set; } public string? InternalName { get; set; } public bool? IsAutoPreface { get; set; } diff --git a/Pipeline/Preprocessing/Objects/Recipe/Recipe.cs b/Pipeline/Preprocessing/Objects/Recipe/Recipe.cs index 689743a2..7f50a5b7 100644 --- a/Pipeline/Preprocessing/Objects/Recipe/Recipe.cs +++ b/Pipeline/Preprocessing/Objects/Recipe/Recipe.cs @@ -107,6 +107,8 @@ private static RecipeResultEffect ParseResultEffect(string effect) { case "ExtractTSysPower": return ParseExtractTSysPower(EffectName, EffectParameter); + case "CraftWaxItem": + return ParseCraftWaxItem(EffectName, EffectParameter); case "RepairItemDurability": return ParseRepairItemDurability(EffectName, EffectParameter); case "TSysCraftedEquipment": @@ -139,6 +141,8 @@ private static RecipeResultEffect ParseResultEffect(string effect) case "SendItemToSaddlebag": case "TransmogItemAppearance": return new RecipeResultEffect() { Type = EffectName }; + case "BestowRecipeIfNotKnown": + return new RecipeResultEffect() { Type = EffectName, Recipe = EffectParameter }; default: return new RecipeResultEffect() { Type = "Special", Effect = EffectName }; } @@ -193,6 +197,21 @@ private static RecipeResultEffect ParseExtractTSysPower(string effectName, strin return new RecipeResultEffect() { Type = effectName, Augment = Augment, Skill = Skill, MinLevel = MinLevel, MaxLevel = MaxLevel }; } + private static RecipeResultEffect ParseCraftWaxItem(string effectName, string effectParameter) + { + string[] Splitted = effectParameter.Split(','); + + if (Splitted.Length != 4) + throw new PreprocessorException(); + + string Item = Splitted[0]; + string PowerWaxType = Splitted[1]; + int BoostLevel = int.Parse(Splitted[2]); + int MaxHitCount = int.Parse(Splitted[3]); + + return new RecipeResultEffect() { Type = effectName, Item = Item, PowerWaxType = PowerWaxType, BoostLevel = BoostLevel, MaxHitCount = MaxHitCount }; + } + private static RecipeResultEffect ParseRepairItemDurability(string effectName, string effectParameter) { string[] Splitted = effectParameter.Split(','); @@ -374,6 +393,11 @@ private static RecipeResultEffect ParseTeleport(string effectName, string effect return new RecipeResultEffect() { Type = effectName, AreaName = AreaName, Other = Other }; } + private static RecipeResultEffect ParseBestowRecipeIfNotKnown(string effectName, string effectParameter) + { + return new RecipeResultEffect() { Type = effectName, Recipe = effectParameter }; + } + private static RecipeResultEffect ParseCreateMiningSurvey(string effectName, string effectParameter) { return new RecipeResultEffect() { Type = CreateMiningSurvey, Effect = effectName, Item = effectParameter }; @@ -544,6 +568,8 @@ private static string ToRawResultEffect(RecipeResultEffect effect) return $"{effect.Keyword}{effect.Tier}"; case "ExtractTSysPower": return $"{effect.Type}({effect.Augment},{effect.Skill},{effect.MinLevel},{effect.MaxLevel})"; + case "CraftWaxItem": + return $"{effect.Type}({effect.Item},{effect.PowerWaxType},{effect.BoostLevel},{effect.MaxHitCount})"; case "RepairItemDurability": return ToRawRepairItemDurability(effect); case "TSysCraftedEquipment": @@ -574,6 +600,8 @@ private static string ToRawResultEffect(RecipeResultEffect effect) return $"{effect.Type}_All_{effect.DurationInSeconds}sec"; case "PermanentlyRaiseMaxTempestEnergy": return $"{effect.Type}({effect.Delta})"; + case "BestowRecipeIfNotKnown": + return $"{effect.Type}({effect.Recipe})"; case "Special": Debug.Assert(effect.Effect is not null); return effect.Effect!; diff --git a/Pipeline/Preprocessing/Objects/Recipe/RecipeResultEffect.cs b/Pipeline/Preprocessing/Objects/Recipe/RecipeResultEffect.cs index f716cd9d..f3876618 100644 --- a/Pipeline/Preprocessing/Objects/Recipe/RecipeResultEffect.cs +++ b/Pipeline/Preprocessing/Objects/Recipe/RecipeResultEffect.cs @@ -31,6 +31,7 @@ public class RecipeResultEffect public string? Other { get; set; } public int? PowerLevel { get; set; } public string? PowerWaxType { get; set; } + public string? Recipe { get; set; } public Time? RepairCooldown { get; set; } public int? RepairMaxEfficiency { get; set; } public int? RepairMinEfficiency { get; set; } diff --git a/Translator/CombatParser/CombatParser.Sentences.cs b/Translator/CombatParser/CombatParser.Sentences.cs index e4dfb5c4..f7f1bf7d 100644 --- a/Translator/CombatParser/CombatParser.Sentences.cs +++ b/Translator/CombatParser/CombatParser.Sentences.cs @@ -294,6 +294,7 @@ public partial class CombatParser new Sentence("In the next %f second", CombatKeyword.EffectDuration), new Sentence("(%f second)", CombatKeyword.EffectDuration), new Sentence("For %f minute", CombatKeyword.EffectDurationMinute), + new Sentence("That restore Armor after a 6 second delay", CombatKeyword.IfRestoreArmorAfterDelay), new Sentence("After a %f second delay", CombatKeyword.EffectDelay), new Sentence("After an %f second delay", CombatKeyword.EffectDelay), new Sentence("After %f second", CombatKeyword.EffectDelay), @@ -393,6 +394,7 @@ public partial class CombatParser new Sentence("Recover %f health", CombatKeyword.RestoreHealth), new Sentence("Recover %f power", CombatKeyword.RestorePower), new Sentence("Power Restoration %f", CombatKeyword.RestorePower), + new Sentence("Increased by %f of the Armor restored", CombatKeyword.MultiplyPowerRestauration), new Sentence("Restoration %f", CombatKeyword.RestoreHealth), new Sentence("You regain %f power", CombatKeyword.RestorePower), new Sentence("Cost no Power to cast", CombatKeyword.ZeroPowerCost), @@ -410,6 +412,7 @@ public partial class CombatParser new Sentence("Max Health by %f", CombatKeyword.AddMaxHealth), new Sentence("%f Max Health", CombatKeyword.AddMaxHealth), new Sentence("%f Max Armor", CombatKeyword.AddMaxArmor), + new Sentence("Have %f Armor restoration", CombatKeyword.MultiplyArmorRestauration), new Sentence("Have %f Armor", CombatKeyword.AddMaxArmor), new Sentence("Attack Range is %f", CombatKeyword.AddRange), new Sentence("Range is %f meter", CombatKeyword.AddRange), diff --git a/Translator/CombatParser/CombatParser.cs b/Translator/CombatParser/CombatParser.cs index e528e7ae..6c391594 100644 --- a/Translator/CombatParser/CombatParser.cs +++ b/Translator/CombatParser/CombatParser.cs @@ -114,6 +114,7 @@ public void AnalyzeCachedData(List validSlotList, List objectL "Item_46026_0", "Item_46045_0", "Item_46055_0", + "Item_46723_0", "Item_46734_0", "Item_46735_0", "Item_46736_0", @@ -174,6 +175,7 @@ public void AnalyzeCachedData(List validSlotList, List objectL "Item_54627_0", "Item_54628_0", "Item_55509_0", + "Item_55524_0", "Item_45641_0", "Item_45637_0", "Item_45533_0", @@ -364,7 +366,8 @@ private void FilterValidPowers(List validSlotList, List skill Skill_Key == PgSkill.AnySkill.Key || Skill_Key == "Endurance" || Skill_Key == "ArmorPatching" || - Skill_Key == "ShamanicInfusion")); + Skill_Key == "Bladesmithing" || + Skill_Key == "ShamanicInfusion"), $"Unexpected skill: {Skill_Key}"); if (Skill_Key != null && (Skill_Key.Length == 0 || Skill_Key == "Gourmand")) return; @@ -681,7 +684,7 @@ private bool FindPowersWithMatchingEffectAllTiers(Dictionary= 3); - if (Key == "16065") + if (Key == "13006") { } @@ -775,7 +778,7 @@ private bool FindPowersWithMatchingEffectAllTiers(Dictionary FindMatchingEffectOneTier(PgPower power) { - if (power.Key == "16065") + if (power.Key == "13006") { } @@ -2438,7 +2441,7 @@ private void AnalyzeMatchingPowersAndEffects(List abilityNameList, Dicti continue; } - if (Entry.Key.Key == "16065") + if (Entry.Key.Key == "13006") { } @@ -3402,6 +3405,7 @@ private void RemoveDecorationText(ref string text) RemoveDecorativeText(ref text, "Your golem minion's", out _, ref IndexFound); RemoveDecorativeText(ref text, "(including Toxic Irritant)", out _, ref IndexFound); ReplaceCaseInsensitive(ref text, " (or armor if health is full)", "/Armor"); + ReplaceCaseInsensitive(ref text, " (or armor, if health is full)", "/Armor"); } private void ExtractAbilityList(List abilityNameList, Dictionary> nameToKeyword, bool limitParsing, bool isGolemAbility, ref string text, out List extractedAbilityList, out int removeCount) @@ -4391,7 +4395,7 @@ private void AnalyzeRemainingPowers(List abilityNameList, Dictionary() { new EffectVerificationEntry() { Prefix = "Restore", Suffix = "Health (or Armor if Health is full) to nearby ally undead" }, + new EffectVerificationEntry() { Prefix = "Restores", Suffix = "Armor to Target" }, } }, { @@ -114,6 +116,7 @@ public static class EffectVerification new EffectVerificationEntry() { Prefix = "Target suffers", Suffix = "Psychic damage after a 4-second delay" }, new EffectVerificationEntry() { Prefix = "Attack Damage Boost", Suffix = "for 10 seconds", AllowDuration = true }, new EffectVerificationEntry() { Prefix = "For 8 seconds, boost Direct Poison Damage", Suffix = "per attack" }, + new EffectVerificationEntry() { Prefix = "Target's next attack deals +", Suffix = "damage" }, } }, { diff --git a/Translator/Enums/AbilityAnimation.cs b/Translator/Enums/AbilityAnimation.cs index 3d2514dd..445295a3 100644 --- a/Translator/Enums/AbilityAnimation.cs +++ b/Translator/Enums/AbilityAnimation.cs @@ -213,5 +213,30 @@ public enum AbilityAnimation PlayFairyChimesFast, PlayFairyChimesSlow, Drink, + DancePole1, + DancePole2, + DancePole3, + DancePole4, + DancePole5, + DancePole6, + Dance1D, + Dance2D, + Dance3D, + Dance4D, + Dance5D, + Dance6D, + Dance1E, + Dance2E, + Dance3E, + Dance4E, + Dance5E, + Dance6E, + Dance1F, + Dance2F, + Dance3F, + Dance4F, + Dance5F, + Dance6F, + Attack_SummonCosmeticPet, } } diff --git a/Translator/Enums/AbilityKeyword.cs b/Translator/Enums/AbilityKeyword.cs index 6ec7c1eb..0320e32b 100644 --- a/Translator/Enums/AbilityKeyword.cs +++ b/Translator/Enums/AbilityKeyword.cs @@ -473,7 +473,7 @@ public enum AbilityKeyword SummonDeer, SummonedSpider, MoltenVeins, - Projectile, + //Projectile, ViperAttack, SpiderPuntEnabled, CombatRefreshTrigger, @@ -557,8 +557,13 @@ public enum AbilityKeyword ThrownKnife, HymnOfResurrection3Enabled, Lint_MonsterAbility, - MinorHealSelf, KnifeSlashing, StaffCrushing, + Lint_ForceMelee, + Lint_ForceRanged, + AcidSigil, + TrueRotskin, + Rotflesh, + AccountWidePet, } } diff --git a/Translator/Enums/AbilityProjectile.cs b/Translator/Enums/AbilityProjectile.cs index 6adc6b9f..02714360 100644 --- a/Translator/Enums/AbilityProjectile.cs +++ b/Translator/Enums/AbilityProjectile.cs @@ -34,5 +34,7 @@ public enum AbilityProjectile Projectile_Dagger, Projectile_PlasmaBlastRed, Projectile_PlasmaBlastBlue, + Projectile_Blood, + Projectile_Nature, } } diff --git a/Translator/Enums/AbilitySelfParticle.cs b/Translator/Enums/AbilitySelfParticle.cs index 7a869a63..503fe2eb 100644 --- a/Translator/Enums/AbilitySelfParticle.cs +++ b/Translator/Enums/AbilitySelfParticle.cs @@ -34,5 +34,6 @@ public enum AbilitySelfParticle HasteExplosion, HealingMist, AcidSpew, + GreenDragonBreath, } } diff --git a/Translator/Enums/AbilityTargetParticle.cs b/Translator/Enums/AbilityTargetParticle.cs index 26df1d4c..689960f6 100644 --- a/Translator/Enums/AbilityTargetParticle.cs +++ b/Translator/Enums/AbilityTargetParticle.cs @@ -58,5 +58,9 @@ public enum AbilityTargetParticle AcidHit, EnergyBombHit, HeadBubble, + BloodSplatSmall, + BloodSplatBurst, + NatureCloudHit, + fdfd, } } diff --git a/Translator/Enums/CombatKeyword.cs b/Translator/Enums/CombatKeyword.cs index fe115a78..84fcc45b 100644 --- a/Translator/Enums/CombatKeyword.cs +++ b/Translator/Enums/CombatKeyword.cs @@ -228,5 +228,8 @@ public enum CombatKeyword AbsorbDamage, CancelSlowdown, DoNotIgnoreKnockback, + IfRestoreArmorAfterDelay, + MultiplyArmorRestauration, + MultiplyPowerRestauration, } } diff --git a/Translator/Enums/CraftedBoost.cs b/Translator/Enums/CraftedBoost.cs index df5c6827..0d055d3d 100644 --- a/Translator/Enums/CraftedBoost.cs +++ b/Translator/Enums/CraftedBoost.cs @@ -88,5 +88,14 @@ public enum CraftedBoost CraftedChemistryStaff, PorcineBlastDisperser, CraftedAlchemistsClaw, + CraftedLinenShoes, + CraftedLinenPants, + CraftedLinenShirt, + CraftedLinenGloves, + CraftedLinenHelm, + CraftedMilitarySword, + CraftedMilitaryDirk, + CraftedMilitaryDagger, + CraftedFightingClaw, } } diff --git a/Translator/Enums/Deaths.cs b/Translator/Enums/Deaths.cs index daf977d3..9efc2aa1 100644 --- a/Translator/Enums/Deaths.cs +++ b/Translator/Enums/Deaths.cs @@ -160,5 +160,7 @@ public enum Deaths Tsunami, Hail, DemonicDamage, + ToxicBlood, + MinotaurHorn, } } diff --git a/Translator/Enums/EffectKeyword.cs b/Translator/Enums/EffectKeyword.cs index f4b7aa20..52417833 100644 --- a/Translator/Enums/EffectKeyword.cs +++ b/Translator/Enums/EffectKeyword.cs @@ -3,7 +3,7 @@ public enum EffectKeyword { Internal_None, - //Hyphen, + Hyphen, Debuff, MusicPerformance, Dispel, @@ -381,5 +381,9 @@ public enum EffectKeyword MeleeKnifeAnatomyCriticals, ThrownKnifeAnatomyCriticals, DuelistsSlashAoE, + ShriveledArmsCurse, + KunaxCurse, + KunaxPoison, + RacingBoost, } } diff --git a/Translator/Enums/EffectParticle.cs b/Translator/Enums/EffectParticle.cs index 332ae88f..9e6214e0 100644 --- a/Translator/Enums/EffectParticle.cs +++ b/Translator/Enums/EffectParticle.cs @@ -187,5 +187,12 @@ public enum EffectParticle FireworkGreen, HeadConfettiFountain, HeadConfettiBurst, + SpecialBuffDamage, + SpecialBuffShield, + SpecialBuffApplied1, + SpecialBuffHollowed, + SparkHitGreen, + SpecialBuffReflect, + MountSuperSpeed, } } diff --git a/Translator/Enums/EffectStackingType.cs b/Translator/Enums/EffectStackingType.cs index 2ae36fe7..1c942da2 100644 --- a/Translator/Enums/EffectStackingType.cs +++ b/Translator/Enums/EffectStackingType.cs @@ -225,7 +225,6 @@ public enum EffectStackingType AnthemOfAvoidanceProjectile, MomentOfBravery, DisharmonyDebuff, - DisharmonyDebuffB, DrugWithdrawal_Alcohol, Soberize, RabbitsFoot, @@ -369,5 +368,6 @@ public enum EffectStackingType SerenePrecisionTea, ToxicIrritantAcidBuff, PoisonersCutBuffDirect, + DragonDisableEpic, } } diff --git a/Translator/Enums/ItemKeyword.cs b/Translator/Enums/ItemKeyword.cs index 8b462114..702c8dfa 100644 --- a/Translator/Enums/ItemKeyword.cs +++ b/Translator/Enums/ItemKeyword.cs @@ -1317,5 +1317,29 @@ public enum ItemKeyword BirdFeed, TrashCan, HardcoreEquipment, + VolatileInk5, + HolisticInk5, + CausticInk5, + Sand, + UnrettedFlax, + Linen, + RacingRibbon, + RacingRibbonParticipation, + BladesmithingRecipe, + SwordTuneupKit, + TuneupKit, + DaggerTuneupKit, + DirkTuneupKit, + ClawTuneupKit, + SigilScriptingRecipe, + TextilesRecipe, + SharpenableWeapon, + WeaponWhetstone, + ReweightingKit, + WeaponsGradeSandpaper, + JewelersMaintenanceKit, + StaffLikeForCraftingPurposes, + ReinsOrSaddle, + MountCosmetic, } } diff --git a/Translator/Enums/ItemSlot.cs b/Translator/Enums/ItemSlot.cs index 85a4ec96..3a769470 100644 --- a/Translator/Enums/ItemSlot.cs +++ b/Translator/Enums/ItemSlot.cs @@ -20,5 +20,6 @@ public enum ItemSlot Saddlebag, Reins, Horseshoes, + MountCosmetic, } } diff --git a/Translator/Enums/ItemUseRequirement.cs b/Translator/Enums/ItemUseRequirement.cs index f312d233..10c37ea4 100644 --- a/Translator/Enums/ItemUseRequirement.cs +++ b/Translator/Enums/ItemUseRequirement.cs @@ -9,5 +9,6 @@ public enum ItemUseRequirement HardcoreDeathPenalty, NotInAir, NotInWater, + Underwater, } } diff --git a/Translator/Enums/NamedLootProfile.cs b/Translator/Enums/NamedLootProfile.cs index 85466eed..2015e52f 100644 --- a/Translator/Enums/NamedLootProfile.cs +++ b/Translator/Enums/NamedLootProfile.cs @@ -15,5 +15,13 @@ public enum NamedLootProfile ForthragarianCaveLootChest, L90RareRecipes, PovusCaves2WantedPosterLoot, + Racing_Eltibule, + Racing_EltibuleExcellent, + Racing_Ilmari, + Racing_IlmariExcellent, + Racing_Kur, + Racing_KurExcellent, + L35Equipment, + L50Equipment, } } diff --git a/Translator/Enums/OtherRequirementType.cs b/Translator/Enums/OtherRequirementType.cs index 2b532a38..25723ebe 100644 --- a/Translator/Enums/OtherRequirementType.cs +++ b/Translator/Enums/OtherRequirementType.cs @@ -31,5 +31,7 @@ public enum OtherRequirementType MoonPhase, EntityPhysicalState, EntitiesNear, + InMusicPerformance, + IsDancingOnPole, } } diff --git a/Translator/Enums/PowerWaxType.cs b/Translator/Enums/PowerWaxType.cs index af9fc764..7dd9c360 100644 --- a/Translator/Enums/PowerWaxType.cs +++ b/Translator/Enums/PowerWaxType.cs @@ -6,5 +6,11 @@ public enum PowerWaxType WaxArmor, WaxArmorNoShieldReq, WaxAcid, + SharpenedSwordAccuracy, + SharpenedSwordVulnDamage, + SharpenedDaggerAccuracy, + SharpenedDaggerCritDamage, + SharpenedDirkAccuracy, + SharpenedClawAccuracy, } } diff --git a/Translator/Enums/QuestKeyword.cs b/Translator/Enums/QuestKeyword.cs index b7f6a192..075c6f3c 100644 --- a/Translator/Enums/QuestKeyword.cs +++ b/Translator/Enums/QuestKeyword.cs @@ -27,5 +27,7 @@ public enum QuestKeyword WantedPoster, PovusCaves2WantedPoster, Lint_NoTsys, + ActivityQuest, + Lint_RewardOnly, } } diff --git a/Translator/Enums/QuestRewardType.cs b/Translator/Enums/QuestRewardType.cs index e84b1166..dd1fc60b 100644 --- a/Translator/Enums/QuestRewardType.cs +++ b/Translator/Enums/QuestRewardType.cs @@ -21,4 +21,5 @@ public enum QuestRewardType DispelFaeBombSporeBuff, Effect, Item, + RacingXp, } diff --git a/Translator/Enums/RecipeCurrency.cs b/Translator/Enums/RecipeCurrency.cs index 19cb2b6a..515349ae 100644 --- a/Translator/Enums/RecipeCurrency.cs +++ b/Translator/Enums/RecipeCurrency.cs @@ -6,5 +6,6 @@ public enum RecipeCurrency GuildCredits, FaeEnergy, GlamourCredits, + CombatWisdom, } } diff --git a/Translator/Enums/RecipeEffect.cs b/Translator/Enums/RecipeEffect.cs index a4ba05ca..cfd72816 100644 --- a/Translator/Enums/RecipeEffect.cs +++ b/Translator/Enums/RecipeEffect.cs @@ -289,5 +289,8 @@ public enum RecipeEffect ResearchFireMagic90, ResearchIceMagic85, ResearchIceMagic90, + ApplyRacingRibbonToReins, + CraftingEnhanceForetoldItemDamage, + ApplyAddItemTSysPowerWaxFromSourceItem, } } diff --git a/Translator/Enums/RecipeItemKey.cs b/Translator/Enums/RecipeItemKey.cs index 8ab8b9e2..f0f08961 100644 --- a/Translator/Enums/RecipeItemKey.cs +++ b/Translator/Enums/RecipeItemKey.cs @@ -149,5 +149,19 @@ public enum RecipeItemKey FishLarge, MinTSysPrereq_91, MaxTSysPrereq_120, + ReinsOrSaddle, + RacingRibbon, + Special_MastercraftedOrForetold, + Status_Augmented, + StaffLikeForCraftingPurposes, + EquipmentSlot_OffHandShield, + Amulet, + Ring, + Special_Foretold, + Eye, + SwordTuneupKit, + DaggerTuneupKit, + DirkTuneupKit, + ClawTuneupKit, } } diff --git a/Translator/Enums/RecipeResultEffectType.cs b/Translator/Enums/RecipeResultEffectType.cs index b80e0b1a..3a841ccb 100644 --- a/Translator/Enums/RecipeResultEffectType.cs +++ b/Translator/Enums/RecipeResultEffectType.cs @@ -26,5 +26,7 @@ public enum RecipeResultEffectType CraftingResetItem, SendItemToSaddlebag, TransmogItemAppearance, + CraftWaxItem, + BestowRecipeIfNotKnown, } } diff --git a/Translator/Enums/XpTableEnum.cs b/Translator/Enums/XpTableEnum.cs index a5547f05..c467b21a 100644 --- a/Translator/Enums/XpTableEnum.cs +++ b/Translator/Enums/XpTableEnum.cs @@ -52,5 +52,6 @@ public enum XpTableEnum Riding, TempestEnergyByLevel, Endurance, + Hardcore, } } diff --git a/Translator/FieldTables/FieldTableStore.cs b/Translator/FieldTables/FieldTableStore.cs index 5854375a..63ad3f9d 100644 --- a/Translator/FieldTables/FieldTableStore.cs +++ b/Translator/FieldTables/FieldTableStore.cs @@ -142,6 +142,8 @@ public class FieldTableStore { "AttributesThatDeltaAccuracy", typeof(string[]) }, { "AttributesThatModCritDamage", typeof(string[]) }, { "AttributesThatDeltaTempTaunt", typeof(string[]) }, + { "AttributesThatDeltaAoE", typeof(string[]) }, + { "AttributesThatDeltaDamageIfTargetIsVulnerable", typeof(string[]) }, { "SpecialValues", typeof(PgSpecialValue[]) }, { "TauntDelta", typeof(int) }, { "TempTauntDelta", typeof(int) }, @@ -201,9 +203,10 @@ public class FieldTableStore { "Suffix", typeof(string) }, { "Value", typeof(float) }, { "AttributesThatDelta", typeof(string[]) }, + { "AttributesThatDeltaBase", typeof(string[]) }, { "AttributesThatMod", typeof(string[]) }, - //{ "AttributesThatModBase", typeof(string[]) }, { "DisplayType", typeof(string) }, + { "SkipIfThisAttributeIsZero", typeof(string) }, { "SkipIfZero", typeof(bool) }, }; @@ -238,6 +241,7 @@ public class FieldTableStore { "Flying", typeof(bool) }, { "Description", typeof(string) }, { "Strategy", typeof(string) }, + { "FlyOffset", typeof(int) }, }; public static Dictionary TableAIAbility { get; } = new Dictionary() @@ -458,6 +462,7 @@ public class FieldTableStore { { "Favor", typeof(string) }, { "Value", typeof(int) }, + { "Purchase", typeof(string) }, }; public static Dictionary TableNpcLevelRange { get; } = new Dictionary() @@ -468,6 +473,7 @@ public class FieldTableStore public static Dictionary TablePlayerTitle { get; } = new Dictionary() { + { "AccountWide", typeof(bool) }, { "Color", typeof(string) }, { "Title", typeof(string) }, { "Tooltip", typeof(string) }, @@ -545,6 +551,7 @@ public class FieldTableStore { "RewardsDescription", typeof(string) }, { "CheckRequirementsToSustainOnBestow", typeof(bool) }, { "QuestFailEffects", typeof(PgQuestFailEffect[]) }, + { "ForceBookOnWrapUp", typeof(bool) }, }; public static Dictionary TableQuestRequirement { get; } = new Dictionary() @@ -785,6 +792,7 @@ public class FieldTableStore { "Slot", typeof(string) }, { "Tier", typeof(int) }, { "Type", typeof(string) }, + { "Recipe", typeof(string) }, }; public static Dictionary TableSkill { get; } = new Dictionary() diff --git a/Translator/Objects/AI/PgAI.cs b/Translator/Objects/AI/PgAI.cs index a8f41002..28697655 100644 --- a/Translator/Objects/AI/PgAI.cs +++ b/Translator/Objects/AI/PgAI.cs @@ -36,5 +36,7 @@ public class PgAI public bool? RawIsFlying { get { return ((BoolValues & IsFlyingNotNull) != 0) ? (BoolValues & IsFlyingIsTrue) != 0 : null; } } public void SetIsFlying(bool value) { BoolValues |= (BoolValues & ~(IsFlyingNotNull + IsFlyingIsTrue)) | ((value ? IsFlyingIsTrue : 0) + IsFlyingNotNull); } public string Description { get; set; } = string.Empty; + public int FlyOffset { get { return RawFlyOffset.HasValue ? RawFlyOffset.Value : 0; } } + public int? RawFlyOffset { get; set; } } } diff --git a/Translator/Objects/Ability/AbilityRequirement/PgAbilityRequirementInMusicPerformance.cs b/Translator/Objects/Ability/AbilityRequirement/PgAbilityRequirementInMusicPerformance.cs new file mode 100644 index 00000000..8b6ccc05 --- /dev/null +++ b/Translator/Objects/Ability/AbilityRequirement/PgAbilityRequirementInMusicPerformance.cs @@ -0,0 +1,6 @@ +namespace PgObjects +{ + public class PgAbilityRequirementInMusicPerformance : PgAbilityRequirement + { + } +} diff --git a/Translator/Objects/Ability/AbilityRequirement/PgAbilityRequirementIsDancingOnPole.cs b/Translator/Objects/Ability/AbilityRequirement/PgAbilityRequirementIsDancingOnPole.cs new file mode 100644 index 00000000..2f88dd2f --- /dev/null +++ b/Translator/Objects/Ability/AbilityRequirement/PgAbilityRequirementIsDancingOnPole.cs @@ -0,0 +1,6 @@ +namespace PgObjects +{ + public class PgAbilityRequirementIsDancingOnPole : PgAbilityRequirement + { + } +} diff --git a/Translator/Objects/Ability/PgAbilityPvX.cs b/Translator/Objects/Ability/PgAbilityPvX.cs index 5686babb..4d5db555 100644 --- a/Translator/Objects/Ability/PgAbilityPvX.cs +++ b/Translator/Objects/Ability/PgAbilityPvX.cs @@ -27,17 +27,19 @@ public class PgAbilityPvX public float? RawRageMultiplier { get; set; } public float Accuracy { get { return RawAccuracy.HasValue ? RawAccuracy.Value : 0; } } public float? RawAccuracy { get; set; } + public PgAttributeCollection AttributesThatDeltaAccuracyList { get; set; } = new PgAttributeCollection(); + public PgAttributeCollection AttributesThatDeltaAoEList { get; set; } = new PgAttributeCollection(); + public PgAttributeCollection AttributesThatDeltaDamageIfTargetIsVulnerableList { get; set; } = new PgAttributeCollection(); public PgAttributeCollection AttributesThatDeltaDamageList { get; set; } = new PgAttributeCollection(); - public PgAttributeCollection AttributesThatModDamageList { get; set; } = new PgAttributeCollection(); - public PgAttributeCollection AttributesThatModBaseDamageList { get; set; } = new PgAttributeCollection(); - public PgAttributeCollection AttributesThatDeltaTauntList { get; set; } = new PgAttributeCollection(); - public PgAttributeCollection AttributesThatModTauntList { get; set; } = new PgAttributeCollection(); public PgAttributeCollection AttributesThatDeltaRageList { get; set; } = new PgAttributeCollection(); - public PgAttributeCollection AttributesThatModRageList { get; set; } = new PgAttributeCollection(); public PgAttributeCollection AttributesThatDeltaRangeList { get; set; } = new PgAttributeCollection(); - public PgAttributeCollection AttributesThatDeltaAccuracyList { get; set; } = new PgAttributeCollection(); - public PgAttributeCollection AttributesThatModCritDamageList { get; set; } = new PgAttributeCollection(); + public PgAttributeCollection AttributesThatDeltaTauntList { get; set; } = new PgAttributeCollection(); public PgAttributeCollection AttributesThatDeltaTempTauntList { get; set; } = new PgAttributeCollection(); + public PgAttributeCollection AttributesThatModBaseDamageList { get; set; } = new PgAttributeCollection(); + public PgAttributeCollection AttributesThatModCritDamageList { get; set; } = new PgAttributeCollection(); + public PgAttributeCollection AttributesThatModDamageList { get; set; } = new PgAttributeCollection(); + public PgAttributeCollection AttributesThatModRageList { get; set; } = new PgAttributeCollection(); + public PgAttributeCollection AttributesThatModTauntList { get; set; } = new PgAttributeCollection(); public PgSpecialValueCollection SpecialValueList { get; set; } = new PgSpecialValueCollection(); public int TauntDelta { get { return RawTauntDelta.HasValue ? RawTauntDelta.Value : 0; } } public int? RawTauntDelta { get; set; } diff --git a/Translator/Objects/Ability/PgSpecialValue.cs b/Translator/Objects/Ability/PgSpecialValue.cs index b48ddc80..1790e08d 100644 --- a/Translator/Objects/Ability/PgSpecialValue.cs +++ b/Translator/Objects/Ability/PgSpecialValue.cs @@ -6,10 +6,11 @@ public class PgSpecialValue public string Suffix { get; set; } = string.Empty; public float Value { get { return RawValue.HasValue ? RawValue.Value : 0; } } public float? RawValue { get; set; } + public PgAttributeCollection AttributesThatDeltaBaseList { get; set; } = new PgAttributeCollection(); public PgAttributeCollection AttributesThatDeltaList { get; set; } = new PgAttributeCollection(); public PgAttributeCollection AttributesThatModList { get; set; } = new PgAttributeCollection(); - //public PgAttributeCollection AttributesThatModBaseList { get; set; } = new PgAttributeCollection(); public DisplayType DisplayType { get; set; } + public string SkipIfThisAttributeIsZero { get; set; } = string.Empty; public bool SkipIfZero { get { return RawSkipIfZero.HasValue && RawSkipIfZero.Value; } } public bool? RawSkipIfZero { get; set; } } diff --git a/Translator/Objects/Npc/PgNpcCapIncrease.cs b/Translator/Objects/Npc/PgNpcCapIncrease.cs index 236f1c58..a1391d21 100644 --- a/Translator/Objects/Npc/PgNpcCapIncrease.cs +++ b/Translator/Objects/Npc/PgNpcCapIncrease.cs @@ -5,5 +5,6 @@ public class PgNpcCapIncrease public Favor CapIncreaseFavor { get; set; } public int Value { get { return RawValue.HasValue ? RawValue.Value : 0; } } public int? RawValue { get; set; } + public string Purchase { get; set; } = string.Empty; } } diff --git a/Translator/Objects/PlayerTitle/PgPlayerTitle.cs b/Translator/Objects/PlayerTitle/PgPlayerTitle.cs index 134d5392..8c9981f9 100644 --- a/Translator/Objects/PlayerTitle/PgPlayerTitle.cs +++ b/Translator/Objects/PlayerTitle/PgPlayerTitle.cs @@ -9,6 +9,8 @@ public class PgPlayerTitle : PgObject public List KeywordList { get; set; } = new List(); public uint Color { get { return RawColor.HasValue ? RawColor.Value : 0; } } public uint? RawColor { get; set; } + public bool IsAccountWide { get { return RawIsAccountWide.HasValue && RawIsAccountWide.Value; } } + public bool? RawIsAccountWide { get; set; } public override int ObjectIconId { get { return PlayerTitleIconId; } } public override string ObjectName { get { return Title; } } diff --git a/Translator/Objects/Quest/PgQuest.cs b/Translator/Objects/Quest/PgQuest.cs index 3c3e8175..73525b30 100644 --- a/Translator/Objects/Quest/PgQuest.cs +++ b/Translator/Objects/Quest/PgQuest.cs @@ -64,6 +64,11 @@ public class PgQuest : PgObject public bool? RawCheckRequirementsToSustainOnBestow { get { return ((BoolValues & CheckRequirementsToSustainOnBestowNotNull) != 0) ? (BoolValues & CheckRequirementsToSustainOnBestowIsTrue) != 0 : null; } } public void SetCheckRequirementsToSustainOnBestow(bool value) { BoolValues |= (BoolValues & ~(CheckRequirementsToSustainOnBestowNotNull + CheckRequirementsToSustainOnBestowIsTrue)) | ((value ? CheckRequirementsToSustainOnBestowIsTrue : 0) + CheckRequirementsToSustainOnBestowNotNull); } public PgQuestFailEffectCollection QuestFailEffectList { get; set; } = new PgQuestFailEffectCollection(); + public const int ForceBookOnWrapUpNotNull = 1 << 10; + public const int ForceBookOnWrapUpIsTrue = 1 << 11; + public bool ForceBookOnWrapUp { get { return (BoolValues & (ForceBookOnWrapUpNotNull + ForceBookOnWrapUpIsTrue)) == (ForceBookOnWrapUpNotNull + ForceBookOnWrapUpIsTrue); } } + public bool? RawForceBookOnWrapUp { get { return ((BoolValues & ForceBookOnWrapUpNotNull) != 0) ? (BoolValues & ForceBookOnWrapUpIsTrue) != 0 : null; } } + public void SetForceBookOnWrapUp(bool value) { BoolValues |= (BoolValues & ~(ForceBookOnWrapUpNotNull + ForceBookOnWrapUpIsTrue)) | ((value ? ForceBookOnWrapUpIsTrue : 0) + ForceBookOnWrapUpNotNull); } public int IconId { get; set; } diff --git a/Translator/Objects/Quest/QuestReward/PgQuestRewardRacingXp.cs b/Translator/Objects/Quest/QuestReward/PgQuestRewardRacingXp.cs new file mode 100644 index 00000000..5c3fc50e --- /dev/null +++ b/Translator/Objects/Quest/QuestReward/PgQuestRewardRacingXp.cs @@ -0,0 +1,9 @@ +namespace PgObjects +{ + public class PgQuestRewardRacingXp : PgQuestReward + { + public string? Skill_Key { get; set; } + public int Xp { get { return RawXp.HasValue ? RawXp.Value : 0; } } + public int? RawXp { get; set; } + } +} diff --git a/Translator/Objects/Recipe/RecipeResult/PgRecipeResultBestowRecipeIfNotKnown.cs b/Translator/Objects/Recipe/RecipeResult/PgRecipeResultBestowRecipeIfNotKnown.cs new file mode 100644 index 00000000..ac941a4d --- /dev/null +++ b/Translator/Objects/Recipe/RecipeResult/PgRecipeResultBestowRecipeIfNotKnown.cs @@ -0,0 +1,7 @@ +namespace PgObjects +{ + public class PgRecipeResultBestowRecipeIfNotKnown : PgRecipeResultEffect + { + public string? Recipe_Key { get; set; } + } +} diff --git a/Translator/Objects/Recipe/RecipeResult/PgRecipeResultCraftWaxItem.cs b/Translator/Objects/Recipe/RecipeResult/PgRecipeResultCraftWaxItem.cs new file mode 100644 index 00000000..2d8921dd --- /dev/null +++ b/Translator/Objects/Recipe/RecipeResult/PgRecipeResultCraftWaxItem.cs @@ -0,0 +1,12 @@ +namespace PgObjects +{ + public class PgRecipeResultCraftWaxItem : PgRecipeResultEffect + { + public string? Item_Key { get; set; } + public PowerWaxType PowerWaxType { get; set; } + public int BoostLevel { get { return RawBoostLevel.HasValue ? RawBoostLevel.Value : 0; } } + public int? RawBoostLevel { get; set; } + public int MaxHitCount { get { return RawMaxHitCount.HasValue ? RawMaxHitCount.Value : 0; } } + public int? RawMaxHitCount { get; set; } + } +} diff --git a/Translator/Parsers/AI/ParserAI.cs b/Translator/Parsers/AI/ParserAI.cs index c2505fab..8e8c4137 100644 --- a/Translator/Parsers/AI/ParserAI.cs +++ b/Translator/Parsers/AI/ParserAI.cs @@ -57,6 +57,9 @@ private bool FinishItem(PgAI item, Dictionary contentTable, Dict case "Strategy": Result = StringToEnumConversion.SetEnum((Strategy valueEnum) => item.Strategy = valueEnum, Value); break; + case "FlyOffset": + Result = SetIntProperty((int valueInt) => item.RawFlyOffset = valueInt, Value); + break; case "Flying": Result = SetBoolProperty((bool valueBool) => item.SetIsFlying(valueBool), Value); break; diff --git a/Translator/Parsers/Ability/ParserAbilityPvX.cs b/Translator/Parsers/Ability/ParserAbilityPvX.cs index ce8dc520..44487b42 100644 --- a/Translator/Parsers/Ability/ParserAbilityPvX.cs +++ b/Translator/Parsers/Ability/ParserAbilityPvX.cs @@ -99,6 +99,12 @@ private bool FinishItem(PgAbilityPvX item, Dictionary contentTab case "AttributesThatDeltaTempTaunt": Result = Inserter.AddPgObjectArrayByKey(item.AttributesThatDeltaTempTauntList, Value); break; + case "AttributesThatDeltaAoE": + Result = Inserter.AddPgObjectArrayByKey(item.AttributesThatDeltaAoEList, Value); + break; + case "AttributesThatDeltaDamageIfTargetIsVulnerable": + Result = Inserter.AddPgObjectArrayByKey(item.AttributesThatDeltaDamageIfTargetIsVulnerableList, Value); + break; case "SpecialValues": Result = Inserter.AddKeylessArray(item.SpecialValueList, Value); break; diff --git a/Translator/Parsers/Ability/ParserAbilityRequirement.cs b/Translator/Parsers/Ability/ParserAbilityRequirement.cs index ec2964b8..cd2ce2e4 100644 --- a/Translator/Parsers/Ability/ParserAbilityRequirement.cs +++ b/Translator/Parsers/Ability/ParserAbilityRequirement.cs @@ -32,16 +32,18 @@ public override object CreateItem() { OtherRequirementType.IsVolunteerGuide, FinishItemIsVolunteerGuide }, { OtherRequirementType.IsNotGuest, FinishItemIsNotGuest }, { OtherRequirementType.IsNotInHotspot, FinishItemNotInHotspot }, - { OtherRequirementType.EffectKeywordUnset, FinishEffectKeywordUnset }, - { OtherRequirementType.InventoryItemKeyword, FinishInventoryItemKeyword }, - { OtherRequirementType.Appearance, FinishAppearance }, - { OtherRequirementType.HasHands, FinishHasHands }, - { OtherRequirementType.TimeOfDay, FinishTimeOfDay }, - { OtherRequirementType.RecipeUsed, FinishRecipeUsed }, - { OtherRequirementType.Weather, FinishWeather }, - { OtherRequirementType.MoonPhase, FinishMoonPhase }, - { OtherRequirementType.EntityPhysicalState, FinishEntityPhysicalState }, - { OtherRequirementType.EntitiesNear, FinishEntitiesNear }, + { OtherRequirementType.EffectKeywordUnset, FinishItemEffectKeywordUnset }, + { OtherRequirementType.InventoryItemKeyword, FinishItemInventoryItemKeyword }, + { OtherRequirementType.Appearance, FinishItemAppearance }, + { OtherRequirementType.HasHands, FinishItemHasHands }, + { OtherRequirementType.TimeOfDay, FinishItemTimeOfDay }, + { OtherRequirementType.RecipeUsed, FinishItemRecipeUsed }, + { OtherRequirementType.Weather, FinishItemWeather }, + { OtherRequirementType.MoonPhase, FinishItemMoonPhase }, + { OtherRequirementType.EntityPhysicalState, FinishItemEntityPhysicalState }, + { OtherRequirementType.EntitiesNear, FinishItemEntitiesNear }, + { OtherRequirementType.InMusicPerformance, FinishItemInMusicPerformance }, + { OtherRequirementType.IsDancingOnPole, FinishItemIsDancingOnPole }, }; private static Dictionary> KnownFieldTable = new Dictionary>() @@ -74,6 +76,8 @@ public override object CreateItem() { OtherRequirementType.MoonPhase, new List() { "T", "MoonPhase" } }, { OtherRequirementType.EntityPhysicalState, new List() { "T", "AllowedStates" } }, { OtherRequirementType.EntitiesNear, new List() { "T", "Distance", "EntityTypeTag", "ErrorMessage", "MinCount" } }, + { OtherRequirementType.InMusicPerformance, new List() { "T" } }, + { OtherRequirementType.IsDancingOnPole, new List() { "T" } }, }; private static Dictionary> HandledTable = new Dictionary>(); @@ -957,7 +961,7 @@ private static bool FinishItemNotInHotspot(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + private static bool FinishItemEffectKeywordUnset(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) { PgAbilityRequirementEffectKeywordUnset NewItem = new PgAbilityRequirementEffectKeywordUnset(); @@ -1000,7 +1004,7 @@ private static bool FinishEffectKeywordUnset(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + private static bool FinishItemInventoryItemKeyword(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) { PgAbilityRequirementInventoryItemKeyword NewItem = new PgAbilityRequirementInventoryItemKeyword(); @@ -1043,7 +1047,7 @@ private static bool FinishInventoryItemKeyword(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + private static bool FinishItemAppearance(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) { PgAbilityRequirementAppearance NewItem = new PgAbilityRequirementAppearance(); @@ -1086,7 +1090,7 @@ private static bool FinishAppearance(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + private static bool FinishItemHasHands(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) { PgAbilityRequirementHasHands NewItem = new PgAbilityRequirementHasHands(); @@ -1126,7 +1130,7 @@ private static bool FinishHasHands(ref object? item, Dictionary return false; } - private static bool FinishTimeOfDay(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + private static bool FinishItemTimeOfDay(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) { PgAbilityRequirementTimeOfDay NewItem = new PgAbilityRequirementTimeOfDay(); @@ -1172,7 +1176,7 @@ private static bool FinishTimeOfDay(ref object? item, Dictionary return false; } - private static bool FinishRecipeUsed(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + private static bool FinishItemRecipeUsed(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) { PgAbilityRequirementRecipeUsed NewItem = new PgAbilityRequirementRecipeUsed(); @@ -1218,7 +1222,7 @@ private static bool FinishRecipeUsed(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + private static bool FinishItemWeather(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) { PgAbilityRequirementWeather NewItem = new PgAbilityRequirementWeather(); @@ -1261,7 +1265,7 @@ private static bool FinishWeather(ref object? item, Dictionary c return false; } - private static bool FinishMoonPhase(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + private static bool FinishItemMoonPhase(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) { PgAbilityRequirementMoonPhase NewItem = new PgAbilityRequirementMoonPhase(); @@ -1304,7 +1308,7 @@ private static bool FinishMoonPhase(ref object? item, Dictionary return false; } - private static bool FinishEntityPhysicalState(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + private static bool FinishItemEntityPhysicalState(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) { PgAbilityRequirementEntityPhysicalState NewItem = new PgAbilityRequirementEntityPhysicalState(); @@ -1347,7 +1351,7 @@ private static bool FinishEntityPhysicalState(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + private static bool FinishItemEntitiesNear(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) { PgAbilityRequirementEntitiesNear NewItem = new PgAbilityRequirementEntitiesNear(); @@ -1398,4 +1402,84 @@ private static bool FinishEntitiesNear(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + { + PgAbilityRequirementInMusicPerformance NewItem = new PgAbilityRequirementInMusicPerformance(); + + bool Result = true; + + foreach (KeyValuePair 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; + default: + Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); + break; + } + } + + if (!Result) + break; + } + + if (Result) + { + item = NewItem; + return true; + } + else + return false; + } + + private static bool FinishItemIsDancingOnPole(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + { + PgAbilityRequirementIsDancingOnPole NewItem = new PgAbilityRequirementIsDancingOnPole(); + + bool Result = true; + + foreach (KeyValuePair 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; + default: + Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); + break; + } + } + + if (!Result) + break; + } + + if (Result) + { + item = NewItem; + return true; + } + else + return false; + } } diff --git a/Translator/Parsers/Ability/ParserSpecialValue.cs b/Translator/Parsers/Ability/ParserSpecialValue.cs index 7cde27cb..6a54e487 100644 --- a/Translator/Parsers/Ability/ParserSpecialValue.cs +++ b/Translator/Parsers/Ability/ParserSpecialValue.cs @@ -42,15 +42,18 @@ private bool FinishItem(PgSpecialValue item, Dictionary contentT case "AttributesThatDelta": Result = Inserter.AddPgObjectArrayByKey(item.AttributesThatDeltaList, Value); break; + case "AttributesThatDeltaBase": + Result = Inserter.AddPgObjectArrayByKey(item.AttributesThatDeltaBaseList, Value); + break; case "AttributesThatMod": Result = Inserter.AddPgObjectArrayByKey(item.AttributesThatModList, Value); break; - /*case "AttributesThatModBase": - Result = Inserter.AddPgObjectArrayByKey(item.AttributesThatModBaseList, Value); - break;*/ case "DisplayType": Result = StringToEnumConversion.SetEnum((DisplayType valueEnum) => item.DisplayType = valueEnum, Value); break; + case "SkipIfThisAttributeIsZero": + Result = SetStringProperty((string valueString) => item.SkipIfThisAttributeIsZero = valueString, Value); + break; case "SkipIfZero": Result = SetBoolProperty((bool valueBool) => item.RawSkipIfZero = valueBool, Value); break; diff --git a/Translator/Parsers/Npc/ParserNpcCapIncrease.cs b/Translator/Parsers/Npc/ParserNpcCapIncrease.cs index 6ea972a5..3c9c9a8b 100644 --- a/Translator/Parsers/Npc/ParserNpcCapIncrease.cs +++ b/Translator/Parsers/Npc/ParserNpcCapIncrease.cs @@ -36,6 +36,9 @@ private bool FinishItem(PgNpcCapIncrease item, Dictionary conten case "Value": Result = SetIntProperty((int valueInt) => item.RawValue = valueInt, Value); break; + case "Purchase": + Result = SetStringProperty((string valueString) => item.Purchase = valueString, Value); + break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; diff --git a/Translator/Parsers/Npc/ParserNpcService.cs b/Translator/Parsers/Npc/ParserNpcService.cs index 7e9fae86..1f7b8f08 100644 --- a/Translator/Parsers/Npc/ParserNpcService.cs +++ b/Translator/Parsers/Npc/ParserNpcService.cs @@ -416,7 +416,7 @@ private static bool FinishItemStore(ref object? item, Dictionary private static int SortByFavor(PgNpcCapIncrease l1, PgNpcCapIncrease l2) { - return (int)l2.CapIncreaseFavor - (int)l1.CapIncreaseFavor; + return (int)l1.CapIncreaseFavor - (int)l2.CapIncreaseFavor; } private static bool FinishItemStorage(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) diff --git a/Translator/Parsers/PlayerTitle/ParserPlayerTitle.cs b/Translator/Parsers/PlayerTitle/ParserPlayerTitle.cs index 7239ebe2..b21abeb2 100644 --- a/Translator/Parsers/PlayerTitle/ParserPlayerTitle.cs +++ b/Translator/Parsers/PlayerTitle/ParserPlayerTitle.cs @@ -43,6 +43,9 @@ private bool FinishItem(PgPlayerTitle item, Dictionary contentTa case "Keywords": Result = StringToEnumConversion.TryParseList(Value, item.KeywordList); break; + case "AccountWide": + Result = SetBoolProperty((bool valueBool) => item.RawIsAccountWide = valueBool, Value); + break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; diff --git a/Translator/Parsers/Quest/ParserQuest.cs b/Translator/Parsers/Quest/ParserQuest.cs index 9e75e3fc..ff6a943e 100644 --- a/Translator/Parsers/Quest/ParserQuest.cs +++ b/Translator/Parsers/Quest/ParserQuest.cs @@ -138,6 +138,9 @@ private bool FinishItem(PgQuest item, Dictionary contentTable, D case "QuestFailEffects": Result = Inserter.AddKeylessArray(item.QuestFailEffectList, Value); break; + case "ForceBookOnWrapUp": + Result = SetBoolProperty((bool valueBool) => item.SetForceBookOnWrapUp(valueBool), Value); + break; default: Result = Program.ReportFailure(parsedFile, parsedKey, $"Key '{Key}' not handled"); break; @@ -232,6 +235,13 @@ private static void UpdateIconIdFromRewards(PgQuest quest, ref int iconId) iconId = ParserSkill.SkillToIcon(Skill); } break; + case PgQuestRewardRacingXp AsRewardRacingXp: + if (iconId == 0) + { + Skill = ParsingContext.GetParsedSkillByKey(AsRewardRacingXp.Skill_Key); + iconId = ParserSkill.SkillToIcon(Skill); + } + break; } } } diff --git a/Translator/Parsers/Quest/ParserQuestReward.cs b/Translator/Parsers/Quest/ParserQuestReward.cs index 4c510cc0..20c1f018 100644 --- a/Translator/Parsers/Quest/ParserQuestReward.cs +++ b/Translator/Parsers/Quest/ParserQuestReward.cs @@ -32,6 +32,7 @@ public override object CreateItem() { QuestRewardType.DispelFaeBombSporeBuff, FinishItemDispelFaeBombSporeBuff }, { QuestRewardType.Effect, FinishItemEffect }, { QuestRewardType.Item, FinishItemItem }, + { QuestRewardType.RacingXp, FinishItemRacingXp }, }; private static Dictionary> KnownFieldTable = new Dictionary>() @@ -54,6 +55,7 @@ public override object CreateItem() { QuestRewardType.DispelFaeBombSporeBuff, new List() { "T" } }, { QuestRewardType.Effect, new List() { "T", "Effect" } }, { QuestRewardType.Item, new List() { "T", "Item", "StackSize" } }, + { QuestRewardType.RacingXp, new List() { "T", "Skill", "Xp" } }, }; private static Dictionary> HandledTable = new Dictionary>(); @@ -932,4 +934,53 @@ private static bool FinishItemItem(ref object? item, Dictionary else return false; } + + private static bool FinishItemRacingXp(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + { + PgQuestRewardRacingXp NewItem = new PgQuestRewardRacingXp(); + + bool Result = true; + + if (contentTable.Count < 3) + Result = Program.ReportFailure(parsedFile, parsedKey, "Missing fields in Racing Xp reward"); + + foreach (KeyValuePair 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 "Skill": + Result = Inserter.SetItemByKey((PgSkill valueSkill) => NewItem.Skill_Key = PgObject.GetItemKey(valueSkill), Value); + break; + case "Xp": + Result = SetIntProperty((int valueInt) => NewItem.RawXp = valueInt, Value); + break; + default: + Result = Program.ReportFailure("Unexpected failure"); + break; + } + } + + if (!Result) + break; + } + + if (Result) + { + item = NewItem; + return true; + } + else + return false; + } } diff --git a/Translator/Parsers/Recipe/ParserRecipeResultEffect.cs b/Translator/Parsers/Recipe/ParserRecipeResultEffect.cs index 7bcaebe6..1be46d1d 100644 --- a/Translator/Parsers/Recipe/ParserRecipeResultEffect.cs +++ b/Translator/Parsers/Recipe/ParserRecipeResultEffect.cs @@ -38,6 +38,8 @@ public override object CreateItem() { RecipeResultEffectType.CraftingResetItem, FinishItemCraftingResetItem }, { RecipeResultEffectType.SendItemToSaddlebag, FinishItemSendItemToSaddlebag }, { RecipeResultEffectType.TransmogItemAppearance, FinishItemTransmogItemAppearance }, + { RecipeResultEffectType.CraftWaxItem, FinishItemCraftWaxItem }, + { RecipeResultEffectType.BestowRecipeIfNotKnown, FinishBestowRecipeIfNotKnown }, }; private static Dictionary> KnownFieldTable = new Dictionary>() @@ -65,6 +67,8 @@ public override object CreateItem() { RecipeResultEffectType.CraftingResetItem, new List() { "Type" } }, { RecipeResultEffectType.SendItemToSaddlebag, new List() { "Type" } }, { RecipeResultEffectType.TransmogItemAppearance, new List() { "Type" } }, + { RecipeResultEffectType.CraftWaxItem, new List() { "Type", "Item", "PowerWaxType", "BoostLevel", "MaxHitCount" } }, + { RecipeResultEffectType.BestowRecipeIfNotKnown, new List() { "Type", "Recipe" } }, }; private static Dictionary> HandledTable = new Dictionary>(); @@ -1165,4 +1169,99 @@ private static bool FinishItemTransmogItemAppearance(ref object? item, Dictionar else return false; } + + private static bool FinishItemCraftWaxItem(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + { + PgRecipeResultCraftWaxItem NewItem = new PgRecipeResultCraftWaxItem(); + + bool Result = true; + + foreach (KeyValuePair 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 "Type": + break; + case "Item": + Result = Inserter.SetItemByInternalName((PgItem valueItem) => NewItem.Item_Key = PgObject.GetItemKey(valueItem), Value); + break; + case "PowerWaxType": + Result = StringToEnumConversion.SetEnum((PowerWaxType valueEnum) => NewItem.PowerWaxType = valueEnum, Value); + break; + case "BoostLevel": + Result = SetIntProperty((int valueInt) => NewItem.RawBoostLevel = valueInt, Value); + break; + case "MaxHitCount": + Result = SetIntProperty((int valueInt) => NewItem.RawMaxHitCount = valueInt, Value); + break; + default: + Result = Program.ReportFailure("Unexpected failure"); + break; + } + } + + if (!Result) + break; + } + + if (Result) + { + item = NewItem; + return true; + } + else + return false; + } + + private static bool FinishBestowRecipeIfNotKnown(ref object? item, Dictionary contentTable, Dictionary contentTypeTable, List itemCollection, Json.Token lastItemType, List knownFieldList, List usedFieldList, string parsedFile, string parsedKey) + { + PgRecipeResultBestowRecipeIfNotKnown NewItem = new PgRecipeResultBestowRecipeIfNotKnown(); + + bool Result = true; + + foreach (KeyValuePair 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 "Type": + break; + case "Recipe": + Result = Inserter.SetItemByInternalName((PgRecipe valueItem) => NewItem.Recipe_Key = PgObject.GetItemKey(valueItem), Value); + break; + default: + Result = Program.ReportFailure("Unexpected failure"); + break; + } + } + + if (!Result) + break; + } + + if (Result) + { + item = NewItem; + return true; + } + else + return false; + } } diff --git a/Translator/Program.cs b/Translator/Program.cs index a067d8dc..dec26c17 100644 --- a/Translator/Program.cs +++ b/Translator/Program.cs @@ -16,7 +16,7 @@ public class Program { public static int Main(string[] args) { - return ParseCurated(404); + return ParseCurated(406); } private static int ParseCurated(int Version) diff --git a/Translator/TextMaps.cs b/Translator/TextMaps.cs index 784e14eb..c726ec53 100644 --- a/Translator/TextMaps.cs +++ b/Translator/TextMaps.cs @@ -224,6 +224,31 @@ static TextMaps() { AbilityAnimation.PlayFairyChimesFast, "Play Fairy Chimes Fast" }, { AbilityAnimation.PlayFairyChimesSlow, "Play Fairy Chimes Slow" }, { AbilityAnimation.Drink, "Drink" }, + { AbilityAnimation.DancePole1, "Dance Pole #1" }, + { AbilityAnimation.DancePole2, "Dance Pole #2" }, + { AbilityAnimation.DancePole3, "Dance Pole #3" }, + { AbilityAnimation.DancePole4, "Dance Pole #4" }, + { AbilityAnimation.DancePole5, "Dance Pole #5" }, + { AbilityAnimation.DancePole6, "Dance Pole #6" }, + { AbilityAnimation.Dance1D, "Dance1D" }, + { AbilityAnimation.Dance2D, "Dance2D" }, + { AbilityAnimation.Dance3D, "Dance3D" }, + { AbilityAnimation.Dance4D, "Dance4D" }, + { AbilityAnimation.Dance5D, "Dance5D" }, + { AbilityAnimation.Dance6D, "Dance6D" }, + { AbilityAnimation.Dance1E, "Dance1E" }, + { AbilityAnimation.Dance2E, "Dance2E" }, + { AbilityAnimation.Dance3E, "Dance3E" }, + { AbilityAnimation.Dance4E, "Dance4E" }, + { AbilityAnimation.Dance5E, "Dance5E" }, + { AbilityAnimation.Dance6E, "Dance6E" }, + { AbilityAnimation.Dance1F, "Dance1F" }, + { AbilityAnimation.Dance2F, "Dance2F" }, + { AbilityAnimation.Dance3F, "Dance3F" }, + { AbilityAnimation.Dance4F, "Dance4F" }, + { AbilityAnimation.Dance5F, "Dance5F" }, + { AbilityAnimation.Dance6F, "Dance6F" }, + { AbilityAnimation.Attack_SummonCosmeticPet, "Attack (Summon Cosmetic Pet)" }, }; public static Dictionary AbilityCueTextMap { get; } = new Dictionary() @@ -777,7 +802,7 @@ static TextMaps() { AbilityKeyword.SummonDeer, "Summon Deer" }, { AbilityKeyword.SummonedSpider, "Summoned Spider" }, { AbilityKeyword.MoltenVeins, "Molten Veins" }, - { AbilityKeyword.Projectile, "Projectile" }, + //{ AbilityKeyword.Projectile, "Projectile" }, { AbilityKeyword.ViperAttack, "Viper Attack" }, { AbilityKeyword.SpiderPuntEnabled, "Spider Punt Enabled" }, { AbilityKeyword.CombatRefreshTrigger, "Combat Refresh Trigger" }, @@ -861,9 +886,14 @@ static TextMaps() { AbilityKeyword.ThrownKnife, "Thrown Knife" }, { AbilityKeyword.HymnOfResurrection3Enabled, "Hymn Of Resurrection #3 Enabled" }, { AbilityKeyword.Lint_MonsterAbility, "Monster Ability" }, - { AbilityKeyword.MinorHealSelf, "Minor Heal Self" }, - { AbilityKeyword.KnifeSlashing, "" }, - { AbilityKeyword.StaffCrushing, "" }, + { AbilityKeyword.KnifeSlashing, "" }, // Empty on purpose + { AbilityKeyword.StaffCrushing, "" }, // Empty on purpose + { AbilityKeyword.Lint_ForceMelee, "(Force Melee)" }, + { AbilityKeyword.Lint_ForceRanged, "(Force Ranged)" }, + { AbilityKeyword.AcidSigil, "Acid Sigil" }, + { AbilityKeyword.TrueRotskin, "True Rotskin" }, + { AbilityKeyword.Rotflesh, "Rotflesh" }, + { AbilityKeyword.AccountWidePet, "Account Wide Pet" }, }; public static Dictionary AbilityPetTypeTextMap { get; } = new Dictionary() @@ -921,6 +951,8 @@ static TextMaps() { AbilityProjectile.Projectile_Dagger, "Projectile (Dagger)" }, { AbilityProjectile.Projectile_PlasmaBlastRed, "Projectile (Plasma Blast Red)" }, { AbilityProjectile.Projectile_PlasmaBlastBlue, "Projectile (Plasma Blast Blue)" }, + { AbilityProjectile.Projectile_Blood, "Projectile (Blood)" }, + { AbilityProjectile.Projectile_Nature, "Projectile (Nature)" }, }; public static Dictionary AbilitySelfPreParticleTextMap { get; } = new Dictionary() @@ -981,6 +1013,7 @@ static TextMaps() { AbilitySelfParticle.HasteExplosion, "Haste Explosion" }, { AbilitySelfParticle.HealingMist, "Healing Mist" }, { AbilitySelfParticle.AcidSpew, "Acid Spew" }, + { AbilitySelfParticle.GreenDragonBreath, "Green Dragon Breath" }, }; public static Dictionary AbilityTargetTextMap { get; } = new Dictionary() @@ -1055,6 +1088,10 @@ static TextMaps() { AbilityTargetParticle.AcidHit, "Acid Hit" }, { AbilityTargetParticle.EnergyBombHit, "Energy Bomb Hit" }, { AbilityTargetParticle.HeadBubble, "Head Bubble" }, + { AbilityTargetParticle.BloodSplatSmall, "Blood Splat Small" }, + { AbilityTargetParticle.BloodSplatBurst, "Blood Splat Burst" }, + { AbilityTargetParticle.NatureCloudHit, "Nature Cloud Hit" }, + { AbilityTargetParticle.fdfd, "@bugged@" }, }; public static Dictionary AllowedFishingZoneTextMap { get; } = new Dictionary() @@ -1215,6 +1252,15 @@ static TextMaps() { CraftedBoost.CraftedChemistryStaff, "Crafted Chemistry Staff" }, { CraftedBoost.PorcineBlastDisperser, "Porcine Blast Disperser" }, { CraftedBoost.CraftedAlchemistsClaw, "Crafted Alchemist's Claw" }, + { CraftedBoost.CraftedLinenShoes, "Crafted Linen Shoes" }, + { CraftedBoost.CraftedLinenPants, "Crafted Linen Pants" }, + { CraftedBoost.CraftedLinenShirt, "Crafted Linen Shirt" }, + { CraftedBoost.CraftedLinenGloves, "Crafted Linen Gloves" }, + { CraftedBoost.CraftedLinenHelm, "Crafted Linen Helm" }, + { CraftedBoost.CraftedMilitarySword, "Crafted Military Sword" }, + { CraftedBoost.CraftedMilitaryDirk, "Crafted Military Dirk" }, + { CraftedBoost.CraftedMilitaryDagger, "Crafted Military Dagger" }, + { CraftedBoost.CraftedFightingClaw, "Crafted Fighting Claw" }, }; public static Dictionary CurrencyTextMap { get; } = new Dictionary() @@ -1408,6 +1454,8 @@ static TextMaps() { Deaths.Tsunami, "Tsunami" }, { Deaths.Hail, "Hail" }, { Deaths.DemonicDamage, "Demonic Damage" }, + { Deaths.ToxicBlood, "Toxic Blood" }, + { Deaths.MinotaurHorn, "Minotaur Horn" }, }; public static Dictionary DesireTextMap { get; } = new Dictionary() @@ -1470,7 +1518,7 @@ static TextMaps() public static Dictionary EffectKeywordTextMap { get; } = new Dictionary() { { EffectKeyword.Internal_None, string.Empty }, - //{ EffectKeyword.Hyphen, "Hyphen" }, + { EffectKeyword.Hyphen, "-" }, { EffectKeyword.Debuff, "Debuff" }, { EffectKeyword.MusicPerformance, "Music Performance" }, { EffectKeyword.Dispel, "Dispel" }, @@ -1848,6 +1896,10 @@ static TextMaps() { EffectKeyword.MeleeKnifeAnatomyCriticals, "Melee Knife Anatomy Criticals" }, { EffectKeyword.ThrownKnifeAnatomyCriticals, "Thrown Knife Anatomy Criticals" }, { EffectKeyword.DuelistsSlashAoE, "Duelist's Slash AoE" }, + { EffectKeyword.ShriveledArmsCurse, "Shriveled Arms Curse" }, + { EffectKeyword.KunaxCurse, "Kunax Curse" }, + { EffectKeyword.KunaxPoison, "Kunax Poison" }, + { EffectKeyword.RacingBoost, "Racing Boost" }, }; public static Dictionary EffectParticleTextMap { get; } = new Dictionary() @@ -2037,6 +2089,13 @@ static TextMaps() { EffectParticle.FireworkGreen, "Firework Green" }, { EffectParticle.HeadConfettiFountain, "Head Confetti Fountain" }, { EffectParticle.HeadConfettiBurst, "Head Confetti Burst" }, + { EffectParticle.SpecialBuffDamage, "Special Buff Damage" }, + { EffectParticle.SpecialBuffShield, "Special Buff Shield" }, + { EffectParticle.SpecialBuffApplied1, "Special Buff Applied #1" }, + { EffectParticle.SpecialBuffHollowed, "Special Buff Hollowed" }, + { EffectParticle.SparkHitGreen, "Spark Hit Green" }, + { EffectParticle.SpecialBuffReflect, "Special Buff Reflect" }, + { EffectParticle.MountSuperSpeed, "Mount Super Speed" }, }; public static Dictionary EffectStackingTypeTextMap { get; } = new Dictionary() @@ -2264,7 +2323,6 @@ static TextMaps() { EffectStackingType.AnthemOfAvoidanceProjectile, "Anthem Of Avoidance Projectile" }, { EffectStackingType.MomentOfBravery, "Moment Of Bravery" }, { EffectStackingType.DisharmonyDebuff, "Disharmony Debuff (A)" }, - { EffectStackingType.DisharmonyDebuffB, "Disharmony Debuff (B)" }, { EffectStackingType.DrugWithdrawal_Alcohol, "Alcohol Drug Withdrawal" }, { EffectStackingType.Soberize, "Soberize" }, { EffectStackingType.RabbitsFoot, "Rabbit's Foot" }, @@ -2408,6 +2466,7 @@ static TextMaps() { EffectStackingType.SerenePrecisionTea, "Serene Precision Tea" }, { EffectStackingType.ToxicIrritantAcidBuff, "Toxic Irritant Acid Buff" }, { EffectStackingType.PoisonersCutBuffDirect, "Poisoner's Cut Buff Direct" }, + { EffectStackingType.DragonDisableEpic, "Dragon Disable Epic" }, }; public static Dictionary EnhancementEffectTextMap { get; } = new Dictionary() @@ -4087,6 +4146,30 @@ static TextMaps() { ItemKeyword.BirdFeed, "Bird Feed" }, { ItemKeyword.TrashCan, "Trash Can" }, { ItemKeyword.HardcoreEquipment, "Hardcore Equipment" }, + { ItemKeyword.VolatileInk5, "Volatile Ink #5" }, + { ItemKeyword.HolisticInk5, "Holistic Ink #5" }, + { ItemKeyword.CausticInk5, "Caustic Ink #5" }, + { ItemKeyword.Sand, "Sand" }, + { ItemKeyword.UnrettedFlax, "Unretted Flax" }, + { ItemKeyword.Linen, "Linen" }, + { ItemKeyword.RacingRibbon, "Racing Ribbon" }, + { ItemKeyword.RacingRibbonParticipation, "Racing Ribbon Participation" }, + { ItemKeyword.BladesmithingRecipe, "Bladesmithing Recipe" }, + { ItemKeyword.SwordTuneupKit, "Sword Tuneup Kit" }, + { ItemKeyword.TuneupKit, "Tuneup Kit" }, + { ItemKeyword.DaggerTuneupKit, "Dagger Tuneup Kit" }, + { ItemKeyword.DirkTuneupKit, "Dirk Tuneup Kit" }, + { ItemKeyword.ClawTuneupKit, "Claw Tuneup Kit" }, + { ItemKeyword.SigilScriptingRecipe, "Sigil Scripting Recipe" }, + { ItemKeyword.TextilesRecipe, "Textiles Recipe" }, + { ItemKeyword.SharpenableWeapon, "Sharpenable Weapon" }, + { ItemKeyword.WeaponWhetstone, "Weapon Whetstone" }, + { ItemKeyword.ReweightingKit, "Reweighting Kit" }, + { ItemKeyword.WeaponsGradeSandpaper, "Weapons Grade Sandpaper" }, + { ItemKeyword.JewelersMaintenanceKit, "Jewelers Maintenance Kit" }, + { ItemKeyword.StaffLikeForCraftingPurposes, "Staff Like For Crafting Purposes" }, + { ItemKeyword.ReinsOrSaddle, "Reins Or Saddle" }, + { ItemKeyword.MountCosmetic, "Mount Cosmetic" }, }; public static Dictionary ItemSlotTextMap { get; } = new Dictionary() @@ -4109,6 +4192,7 @@ static TextMaps() { ItemSlot.Saddlebag, "Saddlebag" }, { ItemSlot.Reins, "Reins" }, { ItemSlot.Horseshoes, "Horseshoes" }, + { ItemSlot.MountCosmetic, "Mount Cosmetic" }, }; public static Dictionary ItemUseAnimationTextMap { get; } = new Dictionary() @@ -4131,6 +4215,7 @@ static TextMaps() { ItemUseRequirement.HardcoreDeathPenalty, "Hardcore Death Penalty" }, { ItemUseRequirement.NotInAir, "Not In Air" }, { ItemUseRequirement.NotInWater, "Not In Water" }, + { ItemUseRequirement.Underwater, "Underwater" }, }; public static Dictionary LoreBookKeywordTextMap { get; } = new Dictionary() @@ -4248,6 +4333,14 @@ static TextMaps() { NamedLootProfile.ForthragarianCaveLootChest, "Forthragarian Cave Loot Chest" }, { NamedLootProfile.L90RareRecipes, "Level 90 Rare Recipes" }, { NamedLootProfile.PovusCaves2WantedPosterLoot, "Povus Caves #2 Wanted Poster Loot" }, + { NamedLootProfile.Racing_Eltibule, "Racing (Eltibule)" }, + { NamedLootProfile.Racing_EltibuleExcellent, "Racing (Eltibule, Excellent)" }, + { NamedLootProfile.Racing_Ilmari, "Racing (Ilmari)" }, + { NamedLootProfile.Racing_IlmariExcellent, "Racing (Ilmari, Excellent)" }, + { NamedLootProfile.Racing_Kur, "Racing (Kur)" }, + { NamedLootProfile.Racing_KurExcellent, "Racing (Kur, Excellent)" }, + { NamedLootProfile.L35Equipment, "L35 Equipment" }, + { NamedLootProfile.L50Equipment, "L50 Equipment" }, }; public static Dictionary PowerWaxTypeTextMap { get; } = new Dictionary() @@ -4256,6 +4349,12 @@ static TextMaps() { PowerWaxType.WaxArmor, "Wax Armor" }, { PowerWaxType.WaxArmorNoShieldReq, "Wax Armor, No Shield Requirement" }, { PowerWaxType.WaxAcid, "Wax Acid" }, + { PowerWaxType.SharpenedSwordAccuracy, "Sharpened Sword Accuracy" }, + { PowerWaxType.SharpenedSwordVulnDamage, "Sharpened Sword Vulnerable Damage" }, + { PowerWaxType.SharpenedDaggerAccuracy, "Sharpened Dagger Accuracy" }, + { PowerWaxType.SharpenedDaggerCritDamage, "Sharpened Dagger Crit Damage" }, + { PowerWaxType.SharpenedDirkAccuracy, "Sharpened Dirk Accuracy" }, + { PowerWaxType.SharpenedClawAccuracy, "Sharpened Claw Accuracy" }, }; public static Dictionary PreEffectTextMap { get; } = new Dictionary() @@ -4351,6 +4450,8 @@ static TextMaps() { QuestKeyword.WantedPoster, "Wanted Poster" }, { QuestKeyword.PovusCaves2WantedPoster, "Povus Caves #2 Wanted Poster" }, { QuestKeyword.Lint_NoTsys, "No Tsys" }, + { QuestKeyword.ActivityQuest, "Activity Quest" }, + { QuestKeyword.Lint_RewardOnly, "Reward Only" }, }; public static Dictionary QuestObjectiveKillTargetTextMap { get; } = new Dictionary() @@ -4718,6 +4819,7 @@ static TextMaps() { RecipeCurrency.GuildCredits, "Guild Credit(s)" }, { RecipeCurrency.FaeEnergy, "Fae Energy" }, { RecipeCurrency.GlamourCredits, "Glamour Credits" }, + { RecipeCurrency.CombatWisdom, "Combat Wisdom" }, }; public static Dictionary RecipeEffectTextMap { get; } = new Dictionary() @@ -5009,6 +5111,9 @@ static TextMaps() { RecipeEffect.ResearchFireMagic90, "Fire Magic Research, Level 90" }, { RecipeEffect.ResearchIceMagic85, "Ice Magic Research, Level 85" }, { RecipeEffect.ResearchIceMagic90, "Ice Magic Research, Level 90" }, + { RecipeEffect.ApplyRacingRibbonToReins, "Apply Racing Ribbon To Reins" }, + { RecipeEffect.CraftingEnhanceForetoldItemDamage, "Crafting Enhance Foretold Item Damage" }, + { RecipeEffect.ApplyAddItemTSysPowerWaxFromSourceItem, "Apply Add Item TSys Power Wax From Source Item" }, }; public static Dictionary RecipeItemKeyTextMap { get; } = new Dictionary() @@ -5160,6 +5265,20 @@ static TextMaps() { RecipeItemKey.FishLarge, "Fish Large" }, { RecipeItemKey.MinTSysPrereq_91, "Prerequisite: Min Level 91" }, { RecipeItemKey.MaxTSysPrereq_120, "Prerequisite: Min Level 120" }, + { RecipeItemKey.ReinsOrSaddle, "Reins Or Saddle" }, + { RecipeItemKey.RacingRibbon, "Racing Ribbon" }, + { RecipeItemKey.Special_MastercraftedOrForetold, "Special (Mastercrafted Or Foretold)" }, + { RecipeItemKey.Status_Augmented, "Status (Augmented)" }, + { RecipeItemKey.StaffLikeForCraftingPurposes, "Staff Like For Crafting Purposes" }, + { RecipeItemKey.EquipmentSlot_OffHandShield, "Equipment Slot (OffHand Shield)" }, + { RecipeItemKey.Amulet, "Amulet" }, + { RecipeItemKey.Ring, "Ring" }, + { RecipeItemKey.Special_Foretold, "Special (Foretold)" }, + { RecipeItemKey.Eye, "Eye" }, + { RecipeItemKey.SwordTuneupKit, "Sword Tuneup Kit" }, + { RecipeItemKey.DaggerTuneupKit, "Dagger Tuneup Kit" }, + { RecipeItemKey.DirkTuneupKit, "Dirk Tuneup Kit" }, + { RecipeItemKey.ClawTuneupKit, "Claw Tuneup Kit" }, }; public static Dictionary RecipeKeywordTextMap { get; } = new Dictionary() @@ -5462,6 +5581,7 @@ static TextMaps() { XpTableEnum.Riding, "Riding" }, { XpTableEnum.TempestEnergyByLevel, "Tempest Energy By Level" }, { XpTableEnum.Endurance, "Endurance" }, + { XpTableEnum.Hardcore, "Hardcore" }, }; public static Dictionary DeathCauseTextTable { get; } = new Dictionary() @@ -5624,6 +5744,8 @@ static TextMaps() { Deaths.Tsunami, "" }, { Deaths.Hail, "Battered by Hail" }, { Deaths.DemonicDamage, "Demonic Damage" }, + { Deaths.ToxicBlood, "Toxic Blood" }, + { Deaths.MinotaurHorn, "Minotaur Horn" }, // Many Cuts dots: "Discomfort" }; diff --git a/Translator/Translator.csproj b/Translator/Translator.csproj index 7c2efe82..2068c57f 100644 --- a/Translator/Translator.csproj +++ b/Translator/Translator.csproj @@ -13,8 +13,8 @@ PG json translator Copyright © 2019 David Le Bansais - 1.1.0.4869 - 1.1.0.4853 + 1.1.0.4870 + 1.1.0.4854 https://github.com/dlebansais/PgJsonParse en-US Translator