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: