diff --git a/ArcdpsLogManager/ArcdpsLogManager.csproj b/ArcdpsLogManager/ArcdpsLogManager.csproj index 421eafda..ab70eb23 100644 --- a/ArcdpsLogManager/ArcdpsLogManager.csproj +++ b/ArcdpsLogManager/ArcdpsLogManager.csproj @@ -17,7 +17,7 @@ Each new log data update causes a revision increase. See LogDataUpdater for the updates. --> - 1.12.0.0 + 1.13.0.0 diff --git a/ArcdpsLogManager/Controls/LogEncounterFilterTree.cs b/ArcdpsLogManager/Controls/LogEncounterFilterTree.cs index fd6cfe37..84546d30 100644 --- a/ArcdpsLogManager/Controls/LogEncounterFilterTree.cs +++ b/ArcdpsLogManager/Controls/LogEncounterFilterTree.cs @@ -261,6 +261,7 @@ private Image GetCategoryIcon(EncounterCategory category) EncounterCategory.RaidWing5 => imageProvider.GetRaidWingIcon(), EncounterCategory.RaidWing6 => imageProvider.GetRaidWingIcon(), EncounterCategory.RaidWing7 => imageProvider.GetRaidWingIcon(), + EncounterCategory.RaidWing8 => imageProvider.GetRaidWingIcon(), EncounterCategory.FractalNightmare => imageProvider.GetFractalMapIcon(), EncounterCategory.FractalShatteredObservatory => imageProvider.GetFractalMapIcon(), EncounterCategory.FractalSunquaPeak => imageProvider.GetFractalMapIcon(), diff --git a/ArcdpsLogManager/ImageProvider.cs b/ArcdpsLogManager/ImageProvider.cs index 992e7dbc..bba661eb 100644 --- a/ArcdpsLogManager/ImageProvider.cs +++ b/ArcdpsLogManager/ImageProvider.cs @@ -114,6 +114,11 @@ public class ImageProvider private Lazy CardinalSabirIcon { get; } = new Lazy(Resources.GetCardinalSabirIcon); private Lazy QadimThePeerlessIcon { get; } = new Lazy(Resources.GetQadimThePeerlessIcon); + // WING 8 + private Lazy GreerIcon { get; } = new Lazy(Resources.GetGreerIcon); + private Lazy DecimaIcon { get; } = new Lazy(Resources.GetDecimaIcon); + private Lazy UraIcon { get; } = new Lazy(Resources.GetUraIcon); + // STRIKES - ICEBROOD SAGA private Lazy ShiverpeaksPassIcon { get; } = new Lazy(Resources.GetShiverpeaksPassIcon); private Lazy VoiceAndClawOfTheFallenIcon { get; } = new Lazy(Resources.GetVoiceAndClawOfTheFallenIcon); @@ -206,6 +211,7 @@ public class ImageProvider private Lazy WideRaidWing5Icon { get; } = new Lazy(Resources.GetWideRaidWing5Icon); private Lazy WideRaidWing6Icon { get; } = new Lazy(Resources.GetWideRaidWing6Icon); private Lazy WideRaidWing7Icon { get; } = new Lazy(Resources.GetWideRaidWing7Icon); + private Lazy WideRaidWing8Icon { get; } = new Lazy(Resources.GetWideRaidWing8Icon); public Image GetTinyLogIcon() => TinyIconLog.Value; public Image GetTinyFractalsIcon() => TinyIconFractals.Value; @@ -236,6 +242,7 @@ public class ImageProvider public Image GetWideRaidWing5Icon() => WideRaidWing5Icon.Value; public Image GetWideRaidWing6Icon() => WideRaidWing6Icon.Value; public Image GetWideRaidWing7Icon() => WideRaidWing7Icon.Value; + public Image GetWideRaidWing8Icon() => WideRaidWing8Icon.Value; public Image GetTinyProfessionIcon(Profession profession) { @@ -338,6 +345,10 @@ public Image GetTinyEncounterIcon(Encounter encounter) Encounter.Adina => CardinalAdinaIcon.Value, Encounter.Sabir => CardinalSabirIcon.Value, Encounter.QadimThePeerless => QadimThePeerlessIcon.Value, + // W8 + Encounter.Greer => GreerIcon.Value, + Encounter.Decima => DecimaIcon.Value, + Encounter.Ura => UraIcon.Value, // STRIKES - ICEBROOD SAGA Encounter.ShiverpeaksPass => ShiverpeaksPassIcon.Value, Encounter.VoiceAndClawOfTheFallen => VoiceAndClawOfTheFallenIcon.Value, diff --git a/ArcdpsLogManager/Images/ArenaNet/Bosses/Decima.png b/ArcdpsLogManager/Images/ArenaNet/Bosses/Decima.png new file mode 100644 index 00000000..4f52e50c Binary files /dev/null and b/ArcdpsLogManager/Images/ArenaNet/Bosses/Decima.png differ diff --git a/ArcdpsLogManager/Images/ArenaNet/Bosses/Greer.png b/ArcdpsLogManager/Images/ArenaNet/Bosses/Greer.png new file mode 100644 index 00000000..2bc38230 Binary files /dev/null and b/ArcdpsLogManager/Images/ArenaNet/Bosses/Greer.png differ diff --git a/ArcdpsLogManager/Images/ArenaNet/Bosses/Ura.png b/ArcdpsLogManager/Images/ArenaNet/Bosses/Ura.png new file mode 100644 index 00000000..b6df3805 Binary files /dev/null and b/ArcdpsLogManager/Images/ArenaNet/Bosses/Ura.png differ diff --git a/ArcdpsLogManager/Images/ArenaNet/raid_wing8_96px_64px.png b/ArcdpsLogManager/Images/ArenaNet/raid_wing8_96px_64px.png new file mode 100644 index 00000000..ecb6c27e Binary files /dev/null and b/ArcdpsLogManager/Images/ArenaNet/raid_wing8_96px_64px.png differ diff --git a/ArcdpsLogManager/Logs/Filters/Groups/CategoryLogGroup.cs b/ArcdpsLogManager/Logs/Filters/Groups/CategoryLogGroup.cs index 1de781ea..50682174 100644 --- a/ArcdpsLogManager/Logs/Filters/Groups/CategoryLogGroup.cs +++ b/ArcdpsLogManager/Logs/Filters/Groups/CategoryLogGroup.cs @@ -20,6 +20,7 @@ public class CategoryLogGroup : LogGroup {EncounterCategory.RaidWing5, "Hall of Chains (W5)"}, {EncounterCategory.RaidWing6, "Mythwright Gambit (W6)"}, {EncounterCategory.RaidWing7, "The Key of Ahdashim (W7)"}, + {EncounterCategory.RaidWing8, "Mount Balrior (W8)" }, {EncounterCategory.StrikeMissionIcebroodSaga, "Icebrood Saga"}, {EncounterCategory.StrikeMissionEndOfDragons, "End of Dragons"}, {EncounterCategory.StrikeMissionSecretsOfTheObscure, "Secrets of the Obscure"}, diff --git a/ArcdpsLogManager/Logs/Updates/LogDataUpdater.cs b/ArcdpsLogManager/Logs/Updates/LogDataUpdater.cs index f8be36d1..72a5aab6 100644 --- a/ArcdpsLogManager/Logs/Updates/LogDataUpdater.cs +++ b/ArcdpsLogManager/Logs/Updates/LogDataUpdater.cs @@ -216,6 +216,12 @@ x.Profession is Profession.Thief or Profession.Engineer or Profession.Ranger new LogUpdate(log => log.ParsingVersion < new Version(1, 11, 1, 10) && log.Encounter == Encounter.SoullessHorror, "Fix detection for Soulless Horror in case the encounter resets before all players are dead."), + new LogUpdate(log => log.ParsingVersion < new Version(1, 14, 0, 0) + && log.Encounter == Encounter.Greer + && log.Encounter == Encounter.Decima + && log.Encounter == Encounter.Ura + && log.MapId == MapIds.RaidWing8, + "Added support for Greer, Decima and Ura in Mount Balrior."), // When adding a new update, you need to increase the revision (last value) of the version in the .csproj file // unless the version changes more significantly, in that case it can be reset to 0. }; diff --git a/ArcdpsLogManager/Resources.cs b/ArcdpsLogManager/Resources.cs index 20245877..a356dfb6 100644 --- a/ArcdpsLogManager/Resources.cs +++ b/ArcdpsLogManager/Resources.cs @@ -151,6 +151,11 @@ public static Image GetInstabilityImage(string iconName) public static Image GetCardinalSabirIcon() => GetEncounterImage("Mini_Air_Djinn"); public static Image GetQadimThePeerlessIcon() => GetEncounterImage("Mini_Qadim_the_Peerless"); + // WING 8 + public static Image GetGreerIcon() => GetEncounterImage("Greer"); + public static Image GetDecimaIcon() => GetEncounterImage("Decima"); + public static Image GetUraIcon() => GetEncounterImage("Ura"); + // STRIKES - ICEBROOD SAGA public static Image GetShiverpeaksPassIcon() => GetEncounterImage("Mini_Icebrood_Construct"); public static Image GetVoiceAndClawOfTheFallenIcon() => GetEncounterImage("Mini_Cloudseeker"); @@ -226,5 +231,6 @@ private static Image GetEncounterImage(string iconName) public static Image GetWideRaidWing5Icon() => GetImage("ArenaNet.raid_wing5_96px_64px.png"); public static Image GetWideRaidWing6Icon() => GetImage("ArenaNet.raid_wing6_96px_64px.png"); public static Image GetWideRaidWing7Icon() => GetImage("ArenaNet.raid_wing7_96px_64px.png"); + public static Image GetWideRaidWing8Icon() => GetImage("ArenaNet.raid_wing8_96px_64px.png"); } } \ No newline at end of file diff --git a/ArcdpsLogManager/Sections/WeeklyClears.cs b/ArcdpsLogManager/Sections/WeeklyClears.cs index 89a50831..97a7aac4 100644 --- a/ArcdpsLogManager/Sections/WeeklyClears.cs +++ b/ArcdpsLogManager/Sections/WeeklyClears.cs @@ -28,6 +28,7 @@ public class WeeklyClears : DynamicLayout private static readonly DateOnly W5Release = new DateOnly(2017, 11, 27); private static readonly DateOnly W6Release = new DateOnly(2018, 9, 17); private static readonly DateOnly W7Release = new DateOnly(2019, 6, 10); + private static readonly DateOnly W8Release = new DateOnly(2024, 11, 18); private static readonly DateOnly EoDRelease = new DateOnly(2022, 2, 28); @@ -103,6 +104,11 @@ public class WeeklyClears : DynamicLayout new NormalEncounter(Encounter.Sabir, normalModeSince: W7Release, challengeModeSince: W7Release), new NormalEncounter(Encounter.QadimThePeerless, normalModeSince: W7Release, challengeModeSince: W7Release), ]), + new EncounterRow("Mount Balrior (W8)", [ + new NormalEncounter(Encounter.Greer, normalModeSince: W8Release, challengeModeSince: null), + new NormalEncounter(Encounter.Decima, normalModeSince: W8Release, challengeModeSince: null), + new NormalEncounter(Encounter.Ura, normalModeSince: W8Release, challengeModeSince: null), + ]) ]), new EncounterGroup(EncounterCategory.StrikeIcebroodSaga, "Icebrood Saga", [ new EncounterRow("Icebrood Saga", [ @@ -540,6 +546,7 @@ private void RecreateLayout() 5 => imageProvider.GetWideRaidWing5Icon(), 6 => imageProvider.GetWideRaidWing6Icon(), 7 => imageProvider.GetWideRaidWing7Icon(), + 8 => imageProvider.GetWideRaidWing8Icon(), _ => throw new ArgumentOutOfRangeException() }, EncounterCategory.StrikeIcebroodSaga => imageProvider.GetWideIcebroodSagaIcon(), diff --git a/EVTCAnalytics/GameData/Encounters/Encounter.cs b/EVTCAnalytics/GameData/Encounters/Encounter.cs index 3c06dc94..d6b29b57 100644 --- a/EVTCAnalytics/GameData/Encounters/Encounter.cs +++ b/EVTCAnalytics/GameData/Encounters/Encounter.cs @@ -70,6 +70,11 @@ public enum Encounter Sabir = 72, QadimThePeerless = 73, + // Raids - Wing 8 + Greer = 81, + Decima = 82, + Ura = 83, + // Fractals - Nightmare CM MAMA = 10001, SiaxTheCorrupted = 10002, diff --git a/EVTCAnalytics/GameData/Encounters/EncounterCategories.cs b/EVTCAnalytics/GameData/Encounters/EncounterCategories.cs index 17aee547..c67175b4 100644 --- a/EVTCAnalytics/GameData/Encounters/EncounterCategories.cs +++ b/EVTCAnalytics/GameData/Encounters/EncounterCategories.cs @@ -38,6 +38,9 @@ public static class EncounterCategories {Encounter.Adina, EncounterCategory.RaidWing7}, {Encounter.Sabir, EncounterCategory.RaidWing7}, {Encounter.QadimThePeerless, EncounterCategory.RaidWing7}, + {Encounter.Greer, EncounterCategory.RaidWing8}, + {Encounter.Decima, EncounterCategory.RaidWing8}, + {Encounter.Ura, EncounterCategory.RaidWing8}, {Encounter.MAMA, EncounterCategory.FractalNightmare}, {Encounter.SiaxTheCorrupted, EncounterCategory.FractalNightmare}, {Encounter.EnsolyssOfTheEndlessTorment, EncounterCategory.FractalNightmare}, @@ -85,6 +88,7 @@ public static class EncounterCategories EncounterCategory.RaidWing5, EncounterCategory.RaidWing6, EncounterCategory.RaidWing7, + EncounterCategory.RaidWing8, }; private static readonly HashSet StrikeMissionCategories = diff --git a/EVTCAnalytics/GameData/Encounters/EncounterCategory.cs b/EVTCAnalytics/GameData/Encounters/EncounterCategory.cs index f88ced98..bc168aaa 100644 --- a/EVTCAnalytics/GameData/Encounters/EncounterCategory.cs +++ b/EVTCAnalytics/GameData/Encounters/EncounterCategory.cs @@ -22,6 +22,7 @@ public enum EncounterCategory RaidWing5 = 105, RaidWing6 = 106, RaidWing7 = 107, + RaidWing8 = 108, FractalNightmare = 301, FractalShatteredObservatory = 302, FractalSunquaPeak = 303, diff --git a/EVTCAnalytics/GameData/Encounters/EncounterNames.cs b/EVTCAnalytics/GameData/Encounters/EncounterNames.cs index 6abe8b3b..616f012c 100644 --- a/EVTCAnalytics/GameData/Encounters/EncounterNames.cs +++ b/EVTCAnalytics/GameData/Encounters/EncounterNames.cs @@ -36,6 +36,9 @@ public static class EncounterNames {Encounter.Adina, "Cardinal Adina"}, {Encounter.Sabir, "Cardinal Sabir"}, {Encounter.QadimThePeerless, "Qadim the Peerless"}, + {Encounter.Greer, "Greer, the Blightbringer" }, + {Encounter.Decima, "Decima, the Stormsinger" }, + {Encounter.Ura, "Ura, the Steamshrieker" }, {Encounter.MAMA, "MAMA"}, {Encounter.SiaxTheCorrupted, "Siax the Corrupted"}, {Encounter.EnsolyssOfTheEndlessTorment, "Ensolyss of the Endless Torment"}, diff --git a/EVTCAnalytics/GameData/GameBuilds.cs b/EVTCAnalytics/GameData/GameBuilds.cs index 695f9f19..a9dd2851 100644 --- a/EVTCAnalytics/GameData/GameBuilds.cs +++ b/EVTCAnalytics/GameData/GameBuilds.cs @@ -41,5 +41,11 @@ public static class GameBuilds /// https://wiki.guildwars2.com/wiki/Game_updates/2024-06-25 /// public static int LonelyTowerHPNerf2 = 164824; + + /// + /// Wing 8 Release

+ /// https://wiki.guildwars2.com/wiki/Game_updates/2024-11-19 + ///
+ public static int MountBalriorRelease = 171452; } } \ No newline at end of file diff --git a/EVTCAnalytics/GameData/MapIds.cs b/EVTCAnalytics/GameData/MapIds.cs index ce37c7eb..ddf58c38 100644 --- a/EVTCAnalytics/GameData/MapIds.cs +++ b/EVTCAnalytics/GameData/MapIds.cs @@ -16,6 +16,7 @@ public static class MapIds public const int RaidWing5 = 1264; public const int RaidWing6 = 1303; public const int RaidWing7 = 1323; + public const int RaidWing8 = 1564; public const int XunlaiJadeJunkyard = 1451; public const int OldLionsCourt = 1485; diff --git a/EVTCAnalytics/GameData/SpeciesIds.cs b/EVTCAnalytics/GameData/SpeciesIds.cs index a04d228c..57df85d7 100644 --- a/EVTCAnalytics/GameData/SpeciesIds.cs +++ b/EVTCAnalytics/GameData/SpeciesIds.cs @@ -84,6 +84,10 @@ public static class SpeciesIds // Qadim the Peerless public const int QadimThePeerless = 22000; + // Wing 8 + public const int Greer = 26725; + public const int Decima = 26774; + public const int Ura = 26712; // Special Forces Training Area public const int StandardKittyGolem = 16199; diff --git a/EVTCAnalytics/Processing/EncounterDataProvider.cs b/EVTCAnalytics/Processing/EncounterDataProvider.cs index 1fca73c8..be0536d7 100644 --- a/EVTCAnalytics/Processing/EncounterDataProvider.cs +++ b/EVTCAnalytics/Processing/EncounterDataProvider.cs @@ -77,7 +77,7 @@ private IEncounterData GetPvEEncounterData(Encounter encounter, Agent mainTarget var narella = GetTargetBySpeciesId(agents, SpeciesIds.Narella); var prisoner = GetTargetBySpeciesId(agents, SpeciesIds.TrioCagePrisoner); - var targets = new Agent[] {berg, zane, narella}.Where(x => x != null).ToArray(); + var targets = new Agent[] { berg, zane, narella }.Where(x => x != null).ToArray(); return GetDefaultBuilder(encounter, targets) .WithResult(new ConditionalResultDeterminer( @@ -123,7 +123,7 @@ private IEncounterData GetPvEEncounterData(Encounter encounter, Agent mainTarget // ensure that this will be ignored. It is also very unlikely the boss would be defeated in such a short time, // barring extreme exploits of broken game skills. // Even such exploits from the past would have trouble meeting this time requirement (Shadow Flare, Renegade Invoke Torment). - (true, new AgentCombatExitDeterminer(secondPhaseXera) {MinTimeSinceSpawn = 10000}) + (true, new AgentCombatExitDeterminer(secondPhaseXera) { MinTimeSinceSpawn = 10000 }) )) .WithHealth(new ConditionalHealthDeterminer( (secondPhaseXera == null, new MaxMinHealthDeterminer()), @@ -161,7 +161,7 @@ private IEncounterData GetPvEEncounterData(Encounter encounter, Agent mainTarget // a long period of time when logs did not contain the main gadget so we need to rely on this. bool canUseReward = gameBuild != null && gameBuild < GameBuilds.AhdashimRelease; - + // Deimos, the NPC, is replaced with a gadget for the last 10% of the fight. // There may sometimes be other gadgets with the same id. They do not, however, // have an attack target. They also have lower maximum health values. @@ -174,7 +174,7 @@ private IEncounterData GetPvEEncounterData(Encounter encounter, Agent mainTarget bool canUseTargets = mainGadget != null && attackTarget != null && prisoner != null; var targets = new List { mainTarget, mainGadget }.Where(x => x != null).ToList(); - + return GetDefaultBuilder(encounter, mainTarget) .WithModes(new AgentHealthModeDeterminer(mainTarget, 42_000_000)) .WithTargets(targets) @@ -308,6 +308,22 @@ private IEncounterData GetPvEEncounterData(Encounter encounter, Agent mainTarget .WithModes(new AgentHealthModeDeterminer(mainTarget, 50_000_000)) .Build(); } + // Raids - Wing 8 + case Encounter.Greer: + { + return GetDefaultBuilder(encounter, mainTarget).Build(); + } + case Encounter.Decima: + { + // Note for the future challenge mode release + // Decima when it first released had 83,288,232 HP and got nerfed without patch to 70,795,000. + // Some logs with the original HP exist. + return GetDefaultBuilder(encounter, mainTarget).Build(); + } + case Encounter.Ura: + { + return GetDefaultBuilder(encounter, mainTarget).Build(); + } // Challenge Mode fractals case Encounter.Skorvald: { diff --git a/EVTCAnalytics/Processing/EncounterIdentifier.cs b/EVTCAnalytics/Processing/EncounterIdentifier.cs index 90bea8b4..4d7d78af 100644 --- a/EVTCAnalytics/Processing/EncounterIdentifier.cs +++ b/EVTCAnalytics/Processing/EncounterIdentifier.cs @@ -96,6 +96,12 @@ public Encounter IdentifyEncounter(Agent mainTarget, IReadOnlyList agents return skills.Any(x => x.Id == SkillIds.AdinaChargeUp) ? Encounter.Adina : Encounter.Sabir; case SpeciesIds.QadimThePeerless: return Encounter.QadimThePeerless; + case SpeciesIds.Greer: + return Encounter.Greer; + case SpeciesIds.Decima: + return Encounter.Decima; + case SpeciesIds.Ura: + return Encounter.Ura; case SpeciesIds.StandardKittyGolem: return Encounter.StandardKittyGolem; case SpeciesIds.MediumKittyGolem: @@ -307,6 +313,12 @@ public IEnumerable IdentifyPotentialEncounters(ParsedBossData bossDat return new[] { Encounter.Sabir, Encounter.Adina }; case SpeciesIds.QadimThePeerless: return new[] { Encounter.QadimThePeerless }; + case SpeciesIds.Greer: + return new[] { Encounter.Greer }; + case SpeciesIds.Decima: + return new[] { Encounter.Decima }; + case SpeciesIds.Ura: + return new[] { Encounter.Ura }; case SpeciesIds.StandardKittyGolem: return new[] { Encounter.StandardKittyGolem }; case SpeciesIds.MediumKittyGolem: