From 50b025305ed199a9439cf94e924029f400a9c0e9 Mon Sep 17 00:00:00 2001 From: Alexandru Macocian Date: Thu, 2 Nov 2023 17:52:26 +0100 Subject: [PATCH] Wintersday preparation Snowfall effect Setup OnlinePictureClient to support more online sources Contributes to #453 --- .../Configuration/Options/ThemeOptions.cs | 3 + .../Configuration/ProjectConfiguration.cs | 7 +- Daybreak/Controls/SnowfallOverlay.xaml | 109 + Daybreak/Controls/SnowfallOverlay.xaml.cs | 122 + Daybreak/Daybreak.csproj | 16 +- Daybreak/Launch/MainWindow.xaml | 31 +- Daybreak/Launch/MainWindow.xaml.cs | 5 +- Daybreak/Resources/Snow1.png | Bin 0 -> 7708 bytes Daybreak/Resources/Snow2.png | Bin 0 -> 2974 bytes Daybreak/Resources/Snow3.png | Bin 0 -> 841 bytes Daybreak/Resources/Snow4.png | Bin 0 -> 12883 bytes Daybreak/Services/Bloogum/IBloogumClient.cs | 9 - Daybreak/Services/Bloogum/Models/Category.cs | 17 - Daybreak/Services/Bloogum/Models/Location.cs | 690 --- .../Services/Screens/SplashScreenService.cs | 1 - .../Screenshots/BackgroundProvider.cs | 10 +- .../Screenshots/IOnlinePictureClient.cs | 9 + Daybreak/Services/Screenshots/Models/Entry.cs | 12 + .../Services/Screenshots/Models/Location.cs | 4676 +++++++++++++++++ .../OnlinePictureClient.cs} | 70 +- 20 files changed, 5011 insertions(+), 776 deletions(-) create mode 100644 Daybreak/Controls/SnowfallOverlay.xaml create mode 100644 Daybreak/Controls/SnowfallOverlay.xaml.cs create mode 100644 Daybreak/Resources/Snow1.png create mode 100644 Daybreak/Resources/Snow2.png create mode 100644 Daybreak/Resources/Snow3.png create mode 100644 Daybreak/Resources/Snow4.png delete mode 100644 Daybreak/Services/Bloogum/IBloogumClient.cs delete mode 100644 Daybreak/Services/Bloogum/Models/Category.cs delete mode 100644 Daybreak/Services/Bloogum/Models/Location.cs create mode 100644 Daybreak/Services/Screenshots/IOnlinePictureClient.cs create mode 100644 Daybreak/Services/Screenshots/Models/Entry.cs create mode 100644 Daybreak/Services/Screenshots/Models/Location.cs rename Daybreak/Services/{Bloogum/BloogumClient.cs => Screenshots/OnlinePictureClient.cs} (69%) diff --git a/Daybreak/Configuration/Options/ThemeOptions.cs b/Daybreak/Configuration/Options/ThemeOptions.cs index c3e2510d..de3bbfd8 100644 --- a/Daybreak/Configuration/Options/ThemeOptions.cs +++ b/Daybreak/Configuration/Options/ThemeOptions.cs @@ -20,4 +20,7 @@ public sealed class ThemeOptions [OptionName(Name = "Blur Background", Description = "If true, the background image will be blurred")] public bool BackgroundBlur { get; set; } = false; + + [OptionName(Name = "Wintersday Mode", Description = "If true, Daybreak will apply a Wintersday theme")] + public bool WintersdayMode { get; set; } = false; } diff --git a/Daybreak/Configuration/ProjectConfiguration.cs b/Daybreak/Configuration/ProjectConfiguration.cs index 74f280e3..5b078469 100644 --- a/Daybreak/Configuration/ProjectConfiguration.cs +++ b/Daybreak/Configuration/ProjectConfiguration.cs @@ -1,5 +1,4 @@ using Daybreak.Services.ApplicationLauncher; -using Daybreak.Services.Bloogum; using Daybreak.Services.BuildTemplates; using Daybreak.Services.Credentials; using Daybreak.Services.IconRetrieve; @@ -97,8 +96,8 @@ public override void RegisterResolvers(IServiceManager serviceManager) .WithMessageHandler(this.SetupLoggingAndMetrics) .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) .Build() - .RegisterHttpClient() - .WithMessageHandler(this.SetupLoggingAndMetrics) + .RegisterHttpClient() + .WithMessageHandler(this.SetupLoggingAndMetrics) .WithDefaultRequestHeadersSetup(this.SetupChromeImpersonationUserAgent) .Build() .RegisterHttpClient() @@ -213,7 +212,7 @@ public override void RegisterServices(IServiceCollection services) services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/Daybreak/Controls/SnowfallOverlay.xaml b/Daybreak/Controls/SnowfallOverlay.xaml new file mode 100644 index 00000000..4c559d16 --- /dev/null +++ b/Daybreak/Controls/SnowfallOverlay.xaml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Daybreak/Controls/SnowfallOverlay.xaml.cs b/Daybreak/Controls/SnowfallOverlay.xaml.cs new file mode 100644 index 00000000..7013be4d --- /dev/null +++ b/Daybreak/Controls/SnowfallOverlay.xaml.cs @@ -0,0 +1,122 @@ +using System; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Extensions; +using System.Windows.Media; +using System.Windows.Media.Imaging; + +namespace Daybreak.Controls; +/// +/// Interaction logic for SnowfallOverlay.xaml +/// +public partial class SnowfallOverlay : UserControl +{ + private static readonly double[] Frequencies = new double[] { 0.5, 0.1, 5, 1 }; + private static readonly double[] Amplitudes = new double[] { 1, 0.1, 0.1, 0.2 }; + private static readonly double Divisor = Amplitudes.Sum(); + + [GenerateDependencyProperty] + private double flakeSize1; + [GenerateDependencyProperty] + private double flakeSize2; + [GenerateDependencyProperty] + private double flakeSize3; + [GenerateDependencyProperty] + private double flakeSize4; + [GenerateDependencyProperty] + private double flakeSize5; + [GenerateDependencyProperty] + private double time; + + [GenerateDependencyProperty] + private double windStrength1; + [GenerateDependencyProperty] + private double windStrength2; + [GenerateDependencyProperty] + private double windStrength3; + [GenerateDependencyProperty] + private double windStrength4; + [GenerateDependencyProperty] + private double windStrength5; + + [GenerateDependencyProperty] + private double baseWind1; + [GenerateDependencyProperty] + private double baseWind2; + [GenerateDependencyProperty] + private double baseWind3; + [GenerateDependencyProperty] + private double baseWind4; + [GenerateDependencyProperty] + private double baseWind5; + + private CancellationTokenSource? tokenSource; + + public SnowfallOverlay() + { + this.InitializeComponent(); + this.InitializeImages(); + } + + private void InitializeImages() + { + using var snowTexture1 = this.GetType().Assembly.GetManifestResourceStream("Daybreak.Resources.Snow1.png"); + using var snowTexture2 = this.GetType().Assembly.GetManifestResourceStream("Daybreak.Resources.Snow2.png"); + using var snowTexture3 = this.GetType().Assembly.GetManifestResourceStream("Daybreak.Resources.Snow3.png"); + using var snowTexture4 = this.GetType().Assembly.GetManifestResourceStream("Daybreak.Resources.Snow4.png"); + var bitmap1 = BitmapFactory.FromStream(snowTexture1); + var bitmap2 = BitmapFactory.FromStream(snowTexture2); + var bitmap3 = BitmapFactory.FromStream(snowTexture3); + var bitmap4 = BitmapFactory.FromStream(snowTexture4); + this.Host1.ImageSource = bitmap4; + this.Host2.ImageSource = bitmap3; + this.Host3.ImageSource = bitmap2; + this.Host4.ImageSource = bitmap1; + this.Host5.ImageSource = bitmap1; + } + + private async void SimulateWind(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested) + { + var time = this.Time; + this.SnowfallTransform1.X += this.BaseWind1 + this.GetNoise(time) * this.WindStrength1; + this.SnowfallTransform2.X += this.BaseWind2 + this.GetNoise(time - 0.02) * this.WindStrength2; + this.SnowfallTransform3.X += this.BaseWind3 + this.GetNoise(time - 0.03) * this.WindStrength3; + this.SnowfallTransform4.X += this.BaseWind4 + this.GetNoise(time - 0.05) * this.WindStrength4; + this.SnowfallTransform5.X += this.BaseWind5 + this.GetNoise(time - 0.08) * this.WindStrength5; + await Task.Delay(16, cancellationToken).ConfigureAwait(true); + } + } + + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + this.tokenSource?.Dispose(); + this.tokenSource = new CancellationTokenSource(); + this.SimulateWind(this.tokenSource.Token); + } + + private void UserControl_Unloaded(object sender, RoutedEventArgs e) + { + this.tokenSource?.Dispose(); + this.tokenSource = default; + } + + private double GetNoise(double source) + { + var returnValue = 0d; + for(var i = 0; i < Frequencies.Length; i++) + { + var f = Frequencies[i]; + var a = Amplitudes[i]; + returnValue += a * Math.Sin(f * source * Math.PI * 2); + } + + return returnValue / Divisor; + } +} diff --git a/Daybreak/Daybreak.csproj b/Daybreak/Daybreak.csproj index b7922b7d..12eaa3c4 100644 --- a/Daybreak/Daybreak.csproj +++ b/Daybreak/Daybreak.csproj @@ -13,7 +13,7 @@ preview Daybreak.ico true - 0.9.8.134 + 0.9.8.135 true cfb2a489-db80-448d-a969-80270f314c46 True @@ -23,6 +23,10 @@ + + + + @@ -41,6 +45,10 @@ + + + + @@ -92,20 +100,20 @@ - + - + - + diff --git a/Daybreak/Launch/MainWindow.xaml b/Daybreak/Launch/MainWindow.xaml index a034f6a2..f64a9e9c 100644 --- a/Daybreak/Launch/MainWindow.xaml +++ b/Daybreak/Launch/MainWindow.xaml @@ -58,7 +58,7 @@ - + @@ -72,11 +72,32 @@ - - - + + + + + - + + + ? WindowParametersChanged; @@ -125,6 +125,7 @@ private void ThemeOptionsChanged() { this.PaintifyBackground = this.themeOptions.Value.BackgroundPaintify; this.BlurBackground = this.themeOptions.Value.BackgroundBlur; + this.WintersdayMode = this.themeOptions.Value.WintersdayMode; } private void SetupImageCycle() diff --git a/Daybreak/Resources/Snow1.png b/Daybreak/Resources/Snow1.png new file mode 100644 index 0000000000000000000000000000000000000000..adb149ceee8e39a0c1edbff874d2dc639e132572 GIT binary patch literal 7708 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 UFW$6nLStaY`e?mI9oM`616@H#(f|Me literal 0 HcmV?d00001 diff --git a/Daybreak/Resources/Snow2.png b/Daybreak/Resources/Snow2.png new file mode 100644 index 0000000000000000000000000000000000000000..e2eac81a297f288c9e3647c0ac73eb433e691fd5 GIT binary patch literal 2974 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 GetImage(bool localized); -} diff --git a/Daybreak/Services/Bloogum/Models/Category.cs b/Daybreak/Services/Bloogum/Models/Category.cs deleted file mode 100644 index d9fba55d..00000000 --- a/Daybreak/Services/Bloogum/Models/Category.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Daybreak.Models.Guildwars; - -namespace Daybreak.Services.Bloogum.Models; - -public sealed class Category -{ - public Map Map { get; } - public string CategoryName { get; } - public int ImageCount { get; } - - public Category(Map map, string categoryName, int imageCount) - { - this.Map = map; - this.CategoryName = categoryName; - this.ImageCount = imageCount; - } -} diff --git a/Daybreak/Services/Bloogum/Models/Location.cs b/Daybreak/Services/Bloogum/Models/Location.cs deleted file mode 100644 index 7d43b96a..00000000 --- a/Daybreak/Services/Bloogum/Models/Location.cs +++ /dev/null @@ -1,690 +0,0 @@ -using Daybreak.Models.Guildwars; -using System.Collections.Generic; - -namespace Daybreak.Services.Bloogum.Models; - -public sealed class Location -{ - public static readonly Location AscalonPreSearing = new( - Region.PresearingAscalon, - "pre", - new List - { - new Category(Map.AscalonCityPresearing, "openingcutscene", 5), - new Category(Map.AscalonCityPresearing, "ascaloncity", 3), - new Category(Map.LakesideCounty, "lakesidecounty", 15), - new Category(Map.AshfordAbbeyOutpost, "ashfordabbey", 1), - new Category(Map.TheCatacombs, "thecatacombs", 13), - new Category(Map.GreenHillsCounty, "greenhillscounty", 14), - new Category(Map.TheBarradinEstateOutpost, "thebarradinestate", 3), - new Category(Map.WizardsFolly, "wizardsfolly", 20), - new Category(Map.RegentValleyPreSearing, "regentvalley", 31), - new Category(Map.FortRanikPreSearingOutpost, "fortranik", 1), - new Category(Map.TheNorthlands, "thenorthlands", 18), - new Category(Map.AscalonAcademyPvPBattleMission, "ascalonacademy", 10) - }); - public static readonly Location Ascalon = new( - Region.Ascalon, - "ascalon", - new List - { - new Category(Map.AscalonCityOutpost, "ascaloncity", 16), - new Category(Map.AscalonCityWintersdayOutpost, "ascaloncity", 16), - new Category(Map.OldAscalon, "oldascalon", 13), - new Category(Map.RegentValley, "regentvalley", 9), - new Category(Map.PockmarkFlats, "pockmarkflats", 12), - new Category(Map.EasternFrontier, "easternfrontier", 6), - new Category(Map.TheBreach, "thebreach", 6), - new Category(Map.DiessaLowlands, "diessalowlands", 5), - new Category(Map.DragonsGullet, "dragonsgullet", 4), - new Category(Map.AscalonFoothills, "ascalonfoothills", 2), - new Category(Map.TheGreatNorthernWall, "thegreatnorthernwall", 6), - new Category(Map.FortRanik, "fortranik", 11), - new Category(Map.RuinsOfSurmia, "ruinsofsurmia", 8), - new Category(Map.NolaniAcademy, "nolaniacademy", 18) - }); - public static readonly Location NorthernShiverpeaks = new( - Region.ShiverpeakMountains, - "nshiverpeaks", - new List - { - new Category(Map.TravelersVale, "travelersvale", 20), - new Category(Map.YaksBendOutpost, "yaksbend", 7), - new Category(Map.BorlisPass, "borlispass", 37), - new Category(Map.IronHorseMine, "ironhorsemine", 18), - new Category(Map.TheFrostGate, "thefrostgate", 18), - new Category(Map.AnvilRock, "anvilrock", 21), - new Category(Map.IceToothCaveOutpost, "icetoothcave", 2), - new Category(Map.DeldrimorBowl, "deldrimorbowl", 26), - new Category(Map.BeaconsPerchOutpost, "beaconsperch", 8), - new Category(Map.GriffonsMouth, "griffonsmouth", 7) - }); - public static readonly Location Kryta = new( - Region.Kryta, - "kryta", - new List - { - new Category(Map.ScoundrelsRise, "scoundrelsrise", 5), - new Category(Map.GatesOfKryta, "gatesofkryta", 29), - new Category(Map.LionsGate, "lionsgate", 2), - new Category(Map.LionsArchOutpost, "lionsarch", 44), - new Category(Map.WarinKrytaLionsArchKeep, "lionsarchkeep", 9), - new Category(Map.NorthKrytaProvince, "northkrytaprovince", 42), - new Category(Map.DAlessioSeaboard, "dallesioseaboard", 39), - new Category(Map.DAlessioArenaMission, "dallesioseaboard", 39), - new Category(Map.DAlessioArenaMission2, "dallesioseaboard", 39), - new Category(Map.DAlessioArenaMission3, "dallesioseaboard", 39), - new Category(Map.NeboTerrace, "neboterrace", 15), - new Category(Map.BergenHotSpringsOutpost, "bergenhotsprings", 8), - new Category(Map.CursedLands, "cursedlands", 1), - new Category(Map.BeetletunOutpost, "beetletun", 6), - new Category(Map.WatchtowerCoast, "watchtowercoast", 14), - new Category(Map.DivinityCoast, "divinitycoast", 34), - new Category(Map.TempleOfTheAges, "templeofages", 5), - new Category(Map.TempleOfTheAgesROX, "templeofages", 5), - new Category(Map.TheBlackCurtain, "theblackcurtain", 25), - new Category(Map.KessexPeak, "kessexpeak", 11), - new Category(Map.TalmarkWilderness, "talmarkwilderness", 30), - new Category(Map.MajestysRest, "majestysrest", 14), - new Category(Map.TearsOfTheFallen, "tearsofthefallen", 14), - new Category(Map.TwinSerpentLakes, "twinserpentlakes", 16), - new Category(Map.StingrayStrand, "stingraystrand", 15), - new Category(Map.FishermensHavenOutpost, "fishermenshaven", 4), - new Category(Map.RiversideProvince, "riversideprovince", 31), - new Category(Map.WarinKrytaRiversideProvince, "riversideprovince", 31), - new Category(Map.SanctumCay, "sanctumcay", 21), - new Category(Map.MajestysRest, "majestysrest", 14) - }); - public static readonly Location MaguumaJungle = new( - Region.MaguumaJungle, - "maguuma", - new List - { - new Category(Map.DruidsOverlookOutpost, "druidsoverlook", 1), - new Category(Map.SageLands, "sagelands", 27), - new Category(Map.TheWilds, "thewilds", 19), - new Category(Map.MamnoonLagoon, "mamnoonlagoon", 17), - new Category(Map.QuarrelFallsOutpost, "quarrelfalls", 2), - new Category(Map.Silverwood, "silverwood", 29), - new Category(Map.BloodstoneFen, "bloodstonefen", 24), - new Category(Map.BloodstoneFenQuest, "bloodstonefen", 24), - new Category(Map.EttinsBack, "ettinsback", 21), - new Category(Map.VentarisRefugeOutpost, "ventarisrefuge", 1), - new Category(Map.ReedBog, "reedbog", 12), - new Category(Map.TheFalls, "thefalls", 22), - new Category(Map.DryTop, "drytop", 5), - new Category(Map.TangleRoot, "tangleroot", 20), - new Category(Map.MaguumaStadeOutpost, "maguumastade", 1), - new Category(Map.AuroraGlade, "auroraglade", 12), - new Category(Map.HengeOfDenraviOutpost, "hengeofdenravi", 12) - }); - public static readonly Location CrystalDesert = new( - Region.CrystalDesert, - "crystaldesert", - new List - { - new Category(Map.TheAmnoonOasisOutpost, "amnoonoasis", 6), - new Category(Map.ProphetsPath, "prophetspath", 24), - new Category(Map.HeroesAudienceOutpost, "heroesaudience", 3), - new Category(Map.SaltFlats, "seaflats", 22), - new Category(Map.SeekersPassageOutpost, "seekerspassage", 2), - new Category(Map.DivinersAscent, "divinersascent", 21), - new Category(Map.ElonaReach, "elonareach", 23), - new Category(Map.SkywardReach, "skywardreach", 34), - new Category(Map.DestinysGorgeOutpost, "destinysgorge", 4), - new Category(Map.TheScar, "thescar", 25), - new Category(Map.ThirstyRiver, "thirstyriver", 24), - new Category(Map.TheAridSea, "thearidsea", 40), - new Category(Map.VultureDrifts, "vulturedrifts", 40), - new Category(Map.DunesOfDespair, "dunesofdespair", 36), - new Category(Map.AuguryRockMission, "auguryrock", 25), - new Category(Map.AuguryRockOutpost, "auguryrock", 25), - new Category(Map.TombOfThePrimevalKings, "tomboftheprimevalkings", 17), - new Category(Map.TombOfThePrimevalKingsHalloweenOutpost, "tomboftheprimevalkings", 17), - new Category(Map.TheDragonsLair, "thedragonslair", 60) - }); - public static readonly Location SouthernShiverpeaks = new( - Region.ShiverpeakMountains, - "sshiverpeaks", - new List - { - new Category(Map.DroknarsForgeOutpost, "droknarsforge", 40), - new Category(Map.DroknarsForgeCinematic, "droknarsforge", 40), - new Category(Map.DroknarsForgeHalloweenOutpost, "droknarsforge", 40), - new Category(Map.DroknarsForgeWintersdayOutpost, "droknarsforge", 40), - new Category(Map.WitmansFolly, "witmansfolly", 48), - new Category(Map.PortSledgeOutpost, "portsledge", 7), - new Category(Map.TalusChute, "taluschute", 54), - new Category(Map.IceCavesofSorrow, "icecavesofsorrow", 50), - new Category(Map.CampRankorOutpost, "camprankor", 2), - new Category(Map.SnakeDance, "snakedance", 23), - new Category(Map.DreadnoughtsDrift, "dreadnoughtsdrift", 6), - new Category(Map.LornarsPass, "lornarspass", 33), - new Category(Map.DeldrimorWarCampOutpost, "deldrimorwarcamp", 3), - new Category(Map.GrenthsFootprint, "grenthsfootprint", 26), - new Category(Map.SpearheadPeak, "spearheadpeak", 37), - new Category(Map.TheGraniteCitadelOutpost, "thegranitecitadel", 11), - new Category(Map.TascasDemise, "tascasdemise", 11), - new Category(Map.MineralSprings, "mineralsprings", 41), - new Category(Map.Icedome, "icedome", 10), - new Category(Map.CopperhammerMinesOutpost, "copperhammermines", 2), - new Category(Map.FrozenForest, "frozenforest", 49), - new Category(Map.IronMinesofMoladune, "ironminesofmoladune", 46), - new Category(Map.IceFloe, "icefloe", 54), - new Category(Map.MarhansGrottoOutpost, "marhansgrotto", 3), - new Category(Map.ThunderheadKeep, "thunderheadkeep", 57) - }); - public static readonly Location RingOfFireIslandChain = new( - Region.RingOfFireIslands, - "fireisles", - new List - { - new Category(Map.EmberLightCampOutpost, "emberlightcamp", 3), - new Category(Map.PerditionRock, "perditionrock", 37), - new Category(Map.RingOfFire, "ringoffire", 36), - new Category(Map.AbaddonsMouth, "abaddonsmouth", 47), - new Category(Map.HellsPrecipice, "hellsprecipice", 38) - }); - public static readonly Location FarShiverpeaks = new( - Region.FarShiverpeaks, - "fshiverpeaks", - new List - { - new Category(Map.BorealStationOutpost, "borealstation", 2), - new Category(Map.IceCliffChasms, "icecliffchasms", 38), - new Category(Map.EyeOfTheNorthOutpost, "eyeofthenorth", 6), - new Category(Map.EyeOfTheNorthOutpostWintersdayOutpost, "eyeofthenorth", 6), - new Category(Map.HallOfMonuments, "hallofmonuments", 2), - new Category(Map.GunnarsHoldOutpost, "gunnarshold", 9), - new Category(Map.NorrhartDomains, "norrhartdomains", 48), - new Category(Map.OlafsteadCinematic, "olafstead", 3), - new Category(Map.OlafsteadOutpost, "olafstead", 3), - new Category(Map.VarajarFells, "varajarfells", 51), - new Category(Map.VarajarFellsunknown, "varajarfells", 51), - new Category(Map.SifhallaOutpost, "sifhalla", 8), - new Category(Map.DrakkarLake, "drakkarlake", 50), - new Category(Map.JagaMoraine, "jagamoraine", 47), - new Category(Map.BjoraMarches, "bjoramarches", 56), - new Category(Map.LongeyesLedgeOutpost, "longeyesledge", 4) - }); - public static readonly Location CharrHomelands = new( - Region.CharrHomelands, - "charr", - new List - { - new Category(Map.GrothmarWardowns, "grothmarwardowns", 64), - new Category(Map.DoomloreShrineOutpost, "doomloreshrine", 5), - new Category(Map.DaladaUplands, "daladauplands", 61), - new Category(Map.SacnothValley, "sacnothvalley", 60) - }); - public static readonly Location TarnishedCoast = new( - Region.TarnishedCoast, - "tarnishedcoast", - new List - { - new Category(Map.VerdantCascades, "verdantcascades", 52), - new Category(Map.UmbralGrottoOutpost, "umbralgrotto", 1), - new Category(Map.GaddsEncampmentOutpost, "gaddsencampment", 6), - new Category(Map.SparkflySwamp, "sparkflyswamp", 37), - new Category(Map.VloxsFalls, "vloxsfalls", 4), - new Category(Map.ArborBay, "arborbay", 52), - new Category(Map.AlcaziaTangle, "alcaziatangle", 41), - new Category(Map.TarnishedHavenOutpost, "tarnishedhaven", 3), - new Category(Map.RivenEarth, "rivenearth", 50), - new Category(Map.RataSumOutpost, "ratasum", 6), - new Category(Map.MagusStones, "magusstones", 37), - new Category(Map.PolymockColiseum, "polymockcoliseum", 4) - }); - public static readonly Location DepthsOfTyria = new( - Region.DepthsOfTyria, - "dungeons", - new List - { - new Category(Map.TheFissureofWoe, "fissureofwoe", 14), - new Category(Map.CatacombsofKathandraxLevel1, "catacombsofkathandrax", 47), - new Category(Map.CatacombsofKathandraxLevel2, "catacombsofkathandrax", 47), - new Category(Map.CatacombsofKathandraxLevel3, "catacombsofkathandrax", 47), - new Category(Map.RragarsMenagerieLevel1, "rragarsmenagerie", 50), - new Category(Map.RragarsMenagerieLevel2, "rragarsmenagerie", 50), - new Category(Map.RragarsMenagerieLevel3, "rragarsmenagerie", 50), - new Category(Map.CathedralofFlamesLevel1, "cathedralofflame", 56), - new Category(Map.CathedralofFlamesLevel2, "cathedralofflame", 56), - new Category(Map.CathedralofFlamesLevel3, "cathedralofflame", 56), - new Category(Map.OozePit, "oozepit", 52), - new Category(Map.OozePitMission, "oozepit", 52), - new Category(Map.DarkrimeDelvesLevel1, "darkrimedelves", 58), - new Category(Map.DarkrimeDelvesLevel2, "darkrimedelves", 58), - new Category(Map.DarkrimeDelvesLevel3, "darkrimedelves", 58), - new Category(Map.FrostmawsBurrowsLevel1, "frostmawsburrows", 54), - new Category(Map.FrostmawsBurrowsLevel2, "frostmawsburrows", 54), - new Category(Map.FrostmawsBurrowsLevel3, "frostmawsburrows", 54), - new Category(Map.FrostmawsBurrowsLevel4, "frostmawsburrows", 54), - new Category(Map.FrostmawsBurrowsLevel5, "frostmawsburrows", 54), - new Category(Map.SepulchreOfDragrimmarLevel1, "sepulchreofdragrimmar", 35), - new Category(Map.SepulchreOfDragrimmarLevel2, "sepulchreofdragrimmar", 35), - new Category(Map.RavensPointLevel1, "ravenspoint", 64), - new Category(Map.RavensPointLevel2, "ravenspoint", 64), - new Category(Map.RavensPointLevel3, "ravenspoint", 64), - new Category(Map.VloxenExcavationsLevel1, "vloxenexcavations", 52), - new Category(Map.VloxenExcavationsLevel2, "vloxenexcavations", 52), - new Category(Map.VloxenExcavationsLevel3, "vloxenexcavations", 52), - new Category(Map.BogrootGrowthsLevel1, "bogrootgrowths", 47), - new Category(Map.BogrootGrowthsLevel2, "bogrootgrowths", 47), - new Category(Map.BloodstoneCavesLevel1, "bloodstonecaves", 20), - new Category(Map.BloodstoneCavesLevel2, "bloodstonecaves", 20), - new Category(Map.BloodstoneCavesLevel3, "bloodstonecaves", 20), - new Category(Map.ShardsOfOrrLevel1, "shardsoforr", 40), - new Category(Map.ShardsOfOrrLevel2, "shardsoforr", 40), - new Category(Map.ShardsOfOrrLevel3, "shardsoforr", 40), - new Category(Map.OolasLabLevel1, "oolaslab", 46), - new Category(Map.OolasLabLevel2, "oolaslab", 46), - new Category(Map.OolasLabLevel3, "oolaslab", 46), - new Category(Map.ArachnisHauntLevel1, "arachnishaunt", 34), - new Category(Map.ArachnisHauntLevel2, "arachnishaunt", 34), - new Category(Map.SlaversExileLevel1, "slaversexile", 59), - new Category(Map.SlaversExileLevel2, "slaversexile", 59), - new Category(Map.SlaversExileLevel3, "slaversexile", 59), - new Category(Map.SlaversExileLevel4, "slaversexile", 59), - new Category(Map.SlaversExileLevel5, "slaversexile", 59), - new Category(Map.FronisIrontoesLairMission, "fronisirontoeslair", 11), - new Category(Map.SecretLairOftheSnowmen, "secretlairofthesnowmen", 16), - new Category(Map.SecretLairOftheSnowmen2, "secretlairofthesnowmen", 16), - new Category(Map.SecretLairOftheSnowmen3, "secretlairofthesnowmen", 16), - new Category(Map.HeartOftheShiverpeaksLevel1, "heartoftheshiverpeaks", 40), - new Category(Map.HeartOftheShiverpeaksLevel2, "heartoftheshiverpeaks", 40), - new Category(Map.HeartOftheShiverpeaksLevel3, "heartoftheshiverpeaks", 40) - }); - public static readonly Location ShingJeaIsland = new( - Region.ShingJeaIsland, - "shingjea", - new List - { - new Category(Map.MonasteryOverlook1, "monasteryoverlook", 12), - new Category(Map.MonasteryOverlook2, "monasteryoverlook", 12), - new Category(Map.ShingJeaMonasteryCanthanNewYearOutpost, "shingjeamonastery", 15), - new Category(Map.ShingJeaMonasteryDragonFestivalOutpost, "shingjeamonastery", 15), - new Category(Map.ShingJeaMonasteryMission, "shingjeamonastery", 15), - new Category(Map.ShingJeaMonasteryOutpost, "shingjeamonastery", 15), - new Category(Map.ShingJeaMonasteryRaidOnShingJeaMonastery, "shingjeamonastery", 15), - new Category(Map.SunquaVale, "sunquavale", 40), - new Category(Map.TsumeiVillageMission, "tsumeivillage", 3), - new Category(Map.TsumeiVillageMission2, "tsumeivillage", 3), - new Category(Map.TsumeiVillageOutpost, "tsumeivillage", 3), - new Category(Map.TsumeiVillageWindsOfChangeATreatysATreaty, "tsumeivillage", 3), - new Category(Map.PanjiangPeninsula, "panjiangpeninsula", 47), - new Category(Map.RanMusuGardensOutpost, "ranmusugardens", 4), - new Category(Map.KinyaProvince, "kinyaprovince", 29), - new Category(Map.MinisterChosEstateExplorable, "ministerchosestate", 26), - new Category(Map.MinisterChosEstateMission2, "ministerchosestate", 26), - new Category(Map.MinisterChosEstateOutpostMission, "ministerchosestate", 26), - new Category(Map.LinnokCourtyard, "linnokcourtyard", 1), - new Category(Map.SaoshangTrail, "saoshangtrail", 3), - new Category(Map.SeitungHarborAreaDeadlyCargo, "seitungharbor", 8), - new Category(Map.SeitungHarborMission, "seitungharbor", 8), - new Category(Map.SeitungHarborMission2, "seitungharbor", 8), - new Category(Map.SeitungHarborOutpost, "seitungharbor", 8), - new Category(Map.JayaBluffs, "jayabluffs", 24), - new Category(Map.JayaBluffsMission, "jayabluffs", 24), - new Category(Map.ZenDaijunExplorable, "zendaijun", 24), - new Category(Map.ZenDaijunOutpostMission, "zendaijun", 24), - new Category(Map.HaijuLagoon, "haijulagoon", 38), - new Category(Map.HaijuLagoonMission, "haijulagoon", 38), - new Category(Map.ShingJeaArena, "shingjeaarena", 2), - new Category(Map.ShingJeaArenaMission, "shingjeaarena", 2) - }); - public static readonly Location KainengCity = new( - Region.KainengCity, - "kaineng", - new List - { - new Category(Map.KainengCenterCanthanNewYearOutpost, "kainengcenter", 30), - new Category(Map.KainengCenterOutpost, "kainengcenter", 30), - new Category(Map.KainengCenterSunspearsInCantha, "kainengcenter", 30), - new Category(Map.KainengCenterWindsOfChangeAChanceEncounter, "kainengcenter", 30), - new Category(Map.KainengCenterWindsOfChangeRaidonKainengCenter, "kainengcenter", 30), - new Category(Map.BejunkanPier, "bejunkanpier", 3), - new Category(Map.BukdekByway, "bukdekbyway", 28), - new Category(Map.BukdekBywayWindsOfChangeCanthaCourierCrisis, "bukdekbyway", 28), - new Category(Map.TheMarketplaceOutpost, "themarketplace", 5), - new Category(Map.TheMarketplaceAreaTrackingtheCorruption, "themarketplace", 5), - new Category(Map.KainengDocks, "kainengdocks", 5), - new Category(Map.WajjunBazaar, "wajjunbazaar", 30), - new Category(Map.WajjunBazaarPOX, "wajjunbazaar", 30), - new Category(Map.WajjunBazaarWindsOfChangeMinistryOfOppression, "wajjunbazaar", 30), - new Category(Map.WajjunBazaarWindsOfChangeViolenceInTheStreets, "wajjunbazaar", 30), - new Category(Map.SenjisCornerOutpost, "senjiscorner", 1), - new Category(Map.XaquangSkyway, "xaquangskyway", 10), - new Category(Map.DragonsThroat, "dragonsthroat", 3), - new Category(Map.DragonsThroatAreaWhatWaitsInShadow, "dragonsthroat", 3), - new Category(Map.NahpuiQuarterExplorable, "nahpuiquarter", 22), - new Category(Map.NahpuiQuarterOutpostMission, "nahpuiquarter", 22), - new Category(Map.ShadowsPassage, "shadowspassage", 2), - new Category(Map.ShadowsPassageWindsofChangeCallingAllThugs, "shadowspassage", 2), - new Category(Map.ShenzunTunnels, "shenzuntunnels", 13), - new Category(Map.TahnnakaiTempleExplorable, "tahnnakaitemple", 13), - new Category(Map.TahnnakaiTempleOutpostMission, "tahnnakaitemple", 13), - new Category(Map.TahnnakaiTempleWindsOfChangeTheRescueAttempt, "tahnnakaitemple", 13), - new Category(Map.ZinKuCorridorOutpost, "zinkucorridor", 5), - new Category(Map.VizunahSquareForeignQuarterOutpost, "vizunahsquare", 12), - new Category(Map.VizunahSquareLocalQuarterOutpost, "vizunahsquare", 12), - new Category(Map.VizunahSquareMission, "vizunahsquare", 12), - new Category(Map.TheUndercity, "theundercity", 2), - new Category(Map.SunjiangDistrictExplorable, "sunjiangdistrict", 8), - new Category(Map.SunjiangDistrictOutpostMission, "sunjiangdistrict", 8), - new Category(Map.MaatuKeepOutpost, "maatukeep", 1), - new Category(Map.PongmeiValley, "pongmeivalley", 13), - new Category(Map.RaisuPavilion, "raisupavilion", 5), - new Category(Map.RaisuPalace, "raisupalace", 37), - new Category(Map.RaisuPalaceOutpostMission, "raisupalace", 37), - new Category(Map.ImperialSanctumOutpostMission, "imperialsanctum", 9), - new Category(Map.DivinePath, "divinepath", 5) - }); - public static readonly Location EchovaldForest = new( - Region.EchovaldForest, - "echovald", - new List - { - new Category(Map.TanglewoodCopseOutpost, "tanglewoodcopse", 2), - new Category(Map.ArborstoneExplorable, "arborstone", 37), - new Category(Map.ArborstoneOutpostMission, "arborstone", 37), - new Category(Map.AltrummRuins, "altrummruins", 9), - new Category(Map.AltrummRuinsFindingJinnai, "altrummruins", 9), - new Category(Map.HouseZuHeltzerOutpost, "housezuheltzer", 6), - new Category(Map.Ferndale, "ferndale", 25), - new Category(Map.AspenwoodGateKurzickOutpost, "aspenwoodgate", 1), - new Category(Map.FortAspenwoodKurzickOutpost, "fortaspenwood", 11), - new Category(Map.FortAspenwoodMission, "fortaspenwood", 11), - new Category(Map.SaintAnjekasShrineOutpost, "saintanjekasshrine", 1), - new Category(Map.DrazachThicket, "drazachthicket", 24), - new Category(Map.LutgardisConservatoryOutpost, "lutgardisconservatory", 2), - new Category(Map.BrauerAcademyOutpost, "braueracademy", 3), - new Category(Map.MelandrusHope, "melandrushope", 28), - new Category(Map.JadeFlatsKurzickOutpost, "jadeflats", 2), - new Category(Map.TheJadeQuarryKurzickOutpost, "thejadequarry", 2), - new Category(Map.TheEternalGrove, "theeternalgrove", 31), - new Category(Map.TheEternalGroveOutpostMission, "theeternalgrove", 31), - new Category(Map.VasburgArmoryOutpost, "vasburgarmory", 4), - new Category(Map.MorostavTrail, "morostavtrail", 17), - new Category(Map.DurheimArchivesOutpost, "durheimarchives", 3), - new Category(Map.MourningVeilFalls, "mourningveilfalls", 31), - new Category(Map.AmatzBasin, "amatzbasin", 13), - new Category(Map.UnwakingWatersKurzickOutpost, "unwakingwaters", 4), - new Category(Map.UrgozsWarren, "urgozswarren", 13) - }); - public static readonly Location JadeSea = new( - Region.TheJadeSea, - "jadesea", - new List - { - new Category(Map.BoreasSeabedExplorable, "boreasseabed", 42), - new Category(Map.BoreasSeabedOutpostMission, "boreasseabed", 42), - new Category(Map.ZosShivrosChannel, "zosshivroschannel", 9), - new Category(Map.CavalonOutpost, "cavalon", 7), - new Category(Map.Archipelagos, "archipelagos", 29), - new Category(Map.BreakerHollowOutpost, "breakerhollow", 1), - new Category(Map.MountQinkai, "mountqinkai", 24), - new Category(Map.AspenwoodGateLuxonOutpost, "aspenwoodgate", 2), - new Category(Map.FortAspenwoodLuxonOutpost, "fortaspenwood", 3), - new Category(Map.JadeFlatsLuxonOutpost, "jadeflats", 1), - new Category(Map.TheJadeQuarryLuxonOutpost, "thejadequarry", 8), - new Category(Map.TheJadeQuarryMission, "thejadequarry", 8), - new Category(Map.MaishangHills, "maishanghills", 26), - new Category(Map.BaiPaasuReachOutpost, "baipaasureach", 1), - new Category(Map.EredonTerraceOutpost, "eredonterrace", 4), - new Category(Map.GyalaHatchery, "gyalahatchery", 36), - new Category(Map.GyalaHatcheryOutpostMission, "gyalahatchery", 36), - new Category(Map.LeviathanPitsOutpost, "leviathanpits", 3), - new Category(Map.SilentSurf, "silentsurf", 27), - new Category(Map.SeafarersRestOutpost, "seafarersrest", 2), - new Category(Map.RheasCrater, "rheascrater", 28), - new Category(Map.TheAuriosMines, "theauriosmines", 10), - new Category(Map.UnwakingWatersLuxonOutpost, "unwakingwaters", 14), - new Category(Map.UnwakingWatersMission, "unwakingwaters", 14), - new Category(Map.HarvestTempleOutpost, "harvesttemple", 2), - new Category(Map.TheDeep, "thedeep", 18) - }); - public static readonly Location Istan = new( - Region.Istan, - "istan", - new List - { - new Category(Map.IslandOfShehkah, "islandofshehkah", 12), - new Category(Map.ChahbekVillage, "chahbekvillage", 1), - new Category(Map.ChurrhirFields, "churrhirfields", 6), - new Category(Map.KamadanJewelOfIstanCanthanNewYearOutpost, "kamadan", 16), - new Category(Map.KamadanJewelOfIstanExplorable, "kamadan", 16), - new Category(Map.KamadanJewelOfIstanHalloweenOutpost, "kamadan", 16), - new Category(Map.KamadanJewelOfIstanOutpost, "kamadan", 16), - new Category(Map.KamadanJewelOfIstanWintersdayOutpost, "kamadan", 16), - new Category(Map.KamadanMission, "kamadan", 16), - new Category(Map.SunDocks, "sundocks", 2), - new Category(Map.SunspearArena, "sunspeararena", 1), - new Category(Map.SunspearArenaMission, "sunspeararena", 1), - new Category(Map.PlainsOfJarin, "plainsofjarin", 27), - new Category(Map.SunspearGreatHallOutpost, "sunspeargreathall", 1), - new Category(Map.TheAstralariumOutpost, "theastralarium", 7), - new Category(Map.ChampionsDawnOutpost, "championsdawn", 2), - new Category(Map.CliffsOfDohjok, "cliffsofdohjok", 26), - new Category(Map.ZehlonReach, "zehlonreach", 46), - new Category(Map.JokanurDiggings, "jokanurdiggings", 3), - new Category(Map.FahranurMission, "fahranurthefirstcity", 29), - new Category(Map.FahranurTheFirstCity, "fahranurthefirstcity", 29), - new Category(Map.BlacktideDen, "blacktideden", 3), - new Category(Map.LahtendaBog, "lahtendabog", 24), - new Category(Map.BeknurHarbor, "beknurharbor", 3), - new Category(Map.BeknurHarborOutpost, "beknurharbor", 3), - new Category(Map.IssnurIsles, "issnurisles", 35), - new Category(Map.KodlonuHamletOutpost, "kodlonuhamlet", 9), - new Category(Map.MehtaniKeys, "mehtanikeys", 32), - new Category(Map.Consulate, "consulate", 1), - new Category(Map.ConsulateDocks, "consulatedocks", 2) - }); - public static readonly Location Kourna = new( - Region.Kourna, - "kourna", - new List - { - new Category(Map.YohlonHavenOutpost, "yohlonhaven", 4), - new Category(Map.ArkjokWard, "arkjokward", 49), - new Category(Map.SunspearSanctuaryOutpost, "sunspearsanctuary", 8), - new Category(Map.CommandPost, "commandpost", 4), - new Category(Map.SunwardMarches, "sunwardmarches", 47), - new Category(Map.VentaCemetery, "ventacemetery", 2), - new Category(Map.MargaCoast, "margacoast", 57), - new Category(Map.DajkahInlet, "dajkahinlet", 5), - new Category(Map.JahaiBluffs, "jahaibluffs", 37), - new Category(Map.KodonurCrossroads, "kodonurcrossroads", 3), - new Category(Map.DejarinEstate, "dejarinestate", 45), - new Category(Map.PogahnPassage, "pogahnpassage", 2), - new Category(Map.GandaraTheMoonFortress, "gandarathemoonfortress", 36), - new Category(Map.CampHojanuOutpost, "camphojanu", 3), - new Category(Map.BarbarousShore, "barbarousshore", 38), - new Category(Map.RilohnRefuge, "rilohnrefuge", 1), - new Category(Map.TheFloodplainOfMahnkelon, "thefloodplainofmahnkelon", 20), - new Category(Map.ModdokCrevice, "moddokcrevice", 3), - new Category(Map.BahdokCaverns, "bahdokcaverns", 3), - new Category(Map.WehhanTerracesOutpost, "wehhanterraces", 6), - new Category(Map.NunduBay, "nundubay", 37), - new Category(Map.TuraisProcession, "turaisprocession", 35) - }); - public static readonly Location Vabbi = new( - Region.Vabbi, - "vabbi", - new List - { - new Category(Map.YatendiCanyons, "yatendicanyons", 24), - new Category(Map.ChantryOfSecretsOutpost, "chantryofsecrets", 4), - new Category(Map.VehtendiValley, "vehtendivalley", 43), - new Category(Map.YahnurMarketOutpost, "yahnurmarket", 6), - new Category(Map.ForumHighlands, "forumhighlands", 52), - new Category(Map.TiharkOrchard, "tiharkorchard", 6), - new Category(Map.ResplendentMakuun, "resplendentmakuun", 46), - new Category(Map.ResplendentMakuun2, "resplendentmakuun", 46), - new Category(Map.BokkaAmphitheatre, "bokkaamphitheatre", 5), - new Category(Map.BokkaAmphitheatreNOX, "bokkaamphitheatre", 5), - new Category(Map.HonurHillOutpost, "honurhill", 3), - new Category(Map.TheKodashBazaarOutpost, "thekodashbazaar", 18), - new Category(Map.TheMirrorOfLyss, "themirroroflyss", 33), - new Category(Map.DzagonurBastion, "dzagonurbastion", 4), - new Category(Map.WildernessOfBahdza, "wildernessofbahdza", 32), - new Category(Map.DashaVestibule, "dashavestibule", 2), - new Category(Map.TheHiddenCityOfAhdashim, "thehiddencityofadashim", 36), - new Category(Map.MihanuTownshipOutpost, "mihanutownship", 3), - new Category(Map.HoldingsOfChokhin, "holdingsofchokhin", 27), - new Category(Map.GardenOfSeborhin, "gardenofseborhin", 34), - new Category(Map.GrandCourtOfSebelkeh, "grandcourtofsebelkeh", 9), - new Category(Map.JennursHorde, "jennurshorde", 4), - new Category(Map.VehjinMines, "vehjinmines", 29), - new Category(Map.BasaltGrottoOutpost, "basaltgrotto", 2) - }); - public static readonly Location TheDesolation = new( - Region.TheDesolation, - "desolation", - new List - { - new Category(Map.GateOfDesolation, "gateofdesolation", 6), - new Category(Map.TheSulfurousWastes, "thesulfurouswastes", 30), - new Category(Map.RemainsOfSahlahja, "remainsofsahlahja", 4), - new Category(Map.RemainsOfSahlahja, "dynastictombs", 4), - new Category(Map.JokosDomain, "jokosdomain", 34), - new Category(Map.TheShatteredRavines, "theshatteredravines", 31), - new Category(Map.LairOfTheForgottenOutpost, "lairoftheforgotten", 6), - new Category(Map.PoisonedOutcrops, "poisonedoutcrops", 33), - new Category(Map.BonePalaceOutpost, "bonepalace", 4), - new Category(Map.TheAlkaliPan, "thealkalipan", 24), - new Category(Map.CrystalOverlook, "crystaloverlook", 32), - new Category(Map.RuinsOfMorah, "ruinsofmorah", 2), - new Category(Map.TheRupturedHeart, "therupturedheart", 18), - new Category(Map.TheMouthOfTormentOutpost, "themouthoftorment", 5) - }); - public static readonly Location GateOfTorment = new( - Region.RealmOfTorment, - "torment", - new List - { - new Category(Map.GateOfTormentOutpost, "gateoftorment", 15), - new Category(Map.NightfallenJahai, "nightfallenjahai", 39), - new Category(Map.GateOftheNightfallenLandsOutpost, "gateofthenightfallenlands", 4), - new Category(Map.NightfallenGarden, "nightfallengarden", 31), - new Category(Map.GateOfPain, "gateofpain", 4), - new Category(Map.DomainOfPain, "domainofpain", 30), - new Category(Map.GateOfFearOutpost, "gateoffear", 3), - new Category(Map.DomainOfFear, "domainoffear", 28), - new Category(Map.GateOfSecretsOutpost, "gateofsecrets", 6), - new Category(Map.DomainOfSecrets, "domainofsecrets", 32), - new Category(Map.GateOfMadness, "gateofmadness", 2), - new Category(Map.DepthsOfMadness, "depthsofmadness", 46), - new Category(Map.HeartOfAbaddon, "heartofabaddon", 11), - new Category(Map.AbaddonsGate, "abaddonsgate", 10), - new Category(Map.ThroneOfSecrets, "throneofsecrets", 9), - new Category(Map.DomainOfAnguish, "gateofanguish", 4) - }); - public static readonly Location BattleIsles = new( - Region.TheBattleIsles, - "battleisles", - new List - { - new Category(Map.GreatTempleOfBalthazarOutpost, "greattempleofbalthazar", 6), - new Category(Map.IsleOfTheNameless, "isleofthenameless", 22), - new Category(Map.IsleOfTheNamelessPvP, "isleofthenameless", 22), - new Category(Map.ZaishenMenagerieOutpost, "zaishenmenagerie", 3), - new Category(Map.ZaishenMenagerieGrounds, "zaishenmenageriegrounds", 34), - new Category(Map.HeroesAscentOutpost, "heroesascent", 7), - new Category(Map.CodexArenaOutpost, "codexarena", 7), - new Category(Map.RandomArenasOutpost, "randomarenas", 8), - new Category(Map.ZaishenChallengeOutpost, "zaishenchallenge", 10), - new Category(Map.ZaishenEliteOutpost, "zaishenelite", 5), - new Category(Map.EmbarkBeach, "embarkbeach", 12) - }); - public static readonly Location GuildHalls = new( - Region.TheBattleIsles, - "gh", - new List - { - new Category(Map.WarriorsIsle, "warriorsisle", 20), - new Category(Map.WarriorsIsleMission, "warriorsisle", 20), - new Category(Map.WarriorsIsleOutpost, "warriorsisle", 20), - new Category(Map.WizardsIsle, "wizardsisle", 21), - new Category(Map.WizardsIsleMission, "wizardsisle", 21), - new Category(Map.WizardsIsleOutpost, "wizardsisle", 21), - new Category(Map.IsleOfTheDeadGuildHall, "isleofthedead", 10), - new Category(Map.IsleOfTheDeadGuildHallMission, "isleofthedead", 10), - new Category(Map.IsleOfTheDeadGuildHallOutpost, "isleofthedead", 10), - new Category(Map.FrozenIsle, "frozenisle", 14), - new Category(Map.FrozenIsleMission, "frozenisle", 14), - new Category(Map.FrozenIsleOutpost, "frozenisle", 14), - new Category(Map.HuntersIsle, "huntersisle", 14), - new Category(Map.HuntersIsleMission, "huntersisle", 14), - new Category(Map.HuntersIsleOutpost, "huntersisle", 14), - new Category(Map.DruidsIsle, "druidsisle", 7), - new Category(Map.DruidsIsleMission, "druidsisle", 7), - new Category(Map.DruidsIsleOutpost, "druidsisle", 7), - new Category(Map.NomadsIsle, "nomadsisle", 12), - new Category(Map.NomadsIsleMission, "nomadsisle", 12), - new Category(Map.NomadsIsleOutpost, "nomadsisle", 12), - new Category(Map.BurningIsle, "burningisle", 15), - new Category(Map.BurningIsleMission, "burningisle", 15), - new Category(Map.BurningIsleOutpost, "burningisle", 15), - new Category(Map.IsleOfMeditation, "isleofmeditation", 16), - new Category(Map.IsleOfMeditationMission, "isleofmeditation", 16), - new Category(Map.IsleOfMeditationOutpost, "isleofmeditation", 16), - new Category(Map.IsleOfJade, "isleofjade", 8), - new Category(Map.IsleOfJadeMission, "isleofjade", 8), - new Category(Map.IsleOfJadeOutpost, "isleofjade", 8), - new Category(Map.IsleOfWeepingStone, "isleofweepingstone", 17), - new Category(Map.IsleOfWeepingStoneMission, "isleofweepingstone", 17), - new Category(Map.IsleOfWeepingStoneOutpost, "isleofweepingstone", 17), - new Category(Map.ImperialIsle, "imperialisle", 13), - new Category(Map.ImperialIsleMission, "imperialisle", 13), - new Category(Map.ImperialIsleOutpost, "imperialisle", 13), - new Category(Map.UnchartedIsle, "uncharteredisle", 14), - new Category(Map.UnchartedIsleMission, "uncharteredisle", 14), - new Category(Map.UnchartedIsleOutpost, "uncharteredisle", 14), - new Category(Map.CorruptedIsle, "corruptedisle", 8), - new Category(Map.CorruptedIsleMission, "corruptedisle", 8), - new Category(Map.CorruptedIsleOutpost, "corruptedisle", 8), - new Category(Map.IsleOfSolitude, "isleofsolitude", 11), - new Category(Map.IsleOfSolitudeMission, "isleofsolitude", 11), - new Category(Map.IsleOfSolitudeOutpost, "isleofsolitude", 11), - new Category(Map.IsleOfWurms, "isleofwurms", 12), - new Category(Map.IsleOfWurmsMission, "isleofwurms", 12), - new Category(Map.IsleOfWurmsOutpost, "isleofwurms", 12) - }); - - public static List Locations { get; } = new List - { - AscalonPreSearing, - Ascalon, - NorthernShiverpeaks, - Kryta, - MaguumaJungle, - CrystalDesert, - SouthernShiverpeaks, - RingOfFireIslandChain, - FarShiverpeaks, - CharrHomelands, - TarnishedCoast, - DepthsOfTyria, - ShingJeaIsland, - KainengCity, - EchovaldForest, - JadeSea, - Istan, - Kourna, - Vabbi, - TheDesolation, - GateOfTorment, - BattleIsles, - GuildHalls - }; - - public Region Region { get; } - public string LocationName { get; } - public List Categories { get; } = new(); - private Location(Region region, string locationName, List categories) - { - this.Region = region; - this.LocationName = locationName; - this.Categories = categories; - } -} diff --git a/Daybreak/Services/Screens/SplashScreenService.cs b/Daybreak/Services/Screens/SplashScreenService.cs index d73107e2..66c3d943 100644 --- a/Daybreak/Services/Screens/SplashScreenService.cs +++ b/Daybreak/Services/Screens/SplashScreenService.cs @@ -46,7 +46,6 @@ public void ShowSplashScreen() } this.splashWindow.Show(); - this.splashWindow.Topmost = true; } private void SetupThemeResources() diff --git a/Daybreak/Services/Screenshots/BackgroundProvider.cs b/Daybreak/Services/Screenshots/BackgroundProvider.cs index d082c48f..cb2ce701 100644 --- a/Daybreak/Services/Screenshots/BackgroundProvider.cs +++ b/Daybreak/Services/Screenshots/BackgroundProvider.cs @@ -1,5 +1,4 @@ using Daybreak.Configuration.Options; -using Daybreak.Services.Bloogum; using Daybreak.Services.Screenshots.Models; using Microsoft.Extensions.Logging; using System; @@ -14,13 +13,13 @@ namespace Daybreak.Services.Screenshots; public sealed class BackgroundProvider : IBackgroundProvider { private readonly IScreenshotProvider screenshotProvider; - private readonly IBloogumClient bloogumClient; + private readonly IOnlinePictureClient bloogumClient; private readonly ILiveOptions liveOptions; private readonly ILogger logger; public BackgroundProvider( IScreenshotProvider screenshotProvider, - IBloogumClient bloogumClient, + IOnlinePictureClient bloogumClient, ILiveOptions liveOptions, ILogger logger) { @@ -43,8 +42,9 @@ public async Task GetBackground() Random.Shared.Next(this.liveOptions.Value.LocalScreenshotsEnabled ? 0 : 50, 101) >= 50) || maybeImage is null) { - maybeImage = await this.bloogumClient.GetImage(true).ConfigureAwait(true); - creditText = maybeImage is not null ? "http://bloogum.net/guildwars" : string.Empty; + (var maybeRemoteImage, var credit) = await this.bloogumClient.GetImage(true).ConfigureAwait(true); + maybeImage = maybeRemoteImage; + creditText = credit; } return new BackgroundResponse diff --git a/Daybreak/Services/Screenshots/IOnlinePictureClient.cs b/Daybreak/Services/Screenshots/IOnlinePictureClient.cs new file mode 100644 index 00000000..5aa116ca --- /dev/null +++ b/Daybreak/Services/Screenshots/IOnlinePictureClient.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; +using System.Windows.Media; + +namespace Daybreak.Services.Screenshots; + +public interface IOnlinePictureClient +{ + Task<(ImageSource? Source, string Credit)> GetImage(bool localized); +} diff --git a/Daybreak/Services/Screenshots/Models/Entry.cs b/Daybreak/Services/Screenshots/Models/Entry.cs new file mode 100644 index 00000000..0f9bdd0d --- /dev/null +++ b/Daybreak/Services/Screenshots/Models/Entry.cs @@ -0,0 +1,12 @@ +using Daybreak.Models.Guildwars; + +namespace Daybreak.Services.Screenshots.Models; +internal sealed class Entry +{ + public Map? Map { get; init; } + public string? Url { get; init; } + public string? Credit { get; init; } + public int? StartIndex { get; init; } + public int? Count { get; init; } + public string? IdFormat { get; init; } = "D2"; +} diff --git a/Daybreak/Services/Screenshots/Models/Location.cs b/Daybreak/Services/Screenshots/Models/Location.cs new file mode 100644 index 00000000..5a819de7 --- /dev/null +++ b/Daybreak/Services/Screenshots/Models/Location.cs @@ -0,0 +1,4676 @@ +using Daybreak.Models.Guildwars; +using System.Collections.Generic; + +namespace Daybreak.Services.Screenshots.Models; + +internal sealed class Location +{ + public static readonly Location AscalonPreSearing = new( + Region.PresearingAscalon, + new List + { + new Entry + { + Map = Map.AscalonCityPresearing, + Url = "http://bloogum.net/guildwars/pre/openingcutscene/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.AscalonCityPresearing, + Url = "http://bloogum.net/guildwars/pre/ascaloncity/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.LakesideCounty, + Url = "http://bloogum.net/guildwars/pre/lakesidecounty/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 15 + }, + new Entry + { + Map = Map.AshfordAbbeyOutpost, + Url = "http://bloogum.net/guildwars/pre/ashfordabbey/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.TheCatacombs, + Url = "http://bloogum.net/guildwars/pre/thecatacombs/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.GreenHillsCounty, + Url = "http://bloogum.net/guildwars/pre/greenhillscounty/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.TheBarradinEstateOutpost, + Url = "http://bloogum.net/guildwars/pre/thebarradinestate/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.WizardsFolly, + Url = "http://bloogum.net/guildwars/pre/wizardsfolly/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 20 + }, + new Entry + { + Map = Map.RegentValleyPreSearing, + Url = "http://bloogum.net/guildwars/pre/regentvalley/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 31 + }, + new Entry + { + Map = Map.FortRanikPreSearingOutpost, + Url = "http://bloogum.net/guildwars/pre/fortranik/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.TheNorthlands, + Url = "http://bloogum.net/guildwars/pre/thenorthlands/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 18 + }, + new Entry + { + Map = Map.AscalonAcademyPvPBattleMission, + Url = "http://bloogum.net/guildwars/pre/ascalonacademy/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 10 + }, + }); + public static readonly Location Ascalon = new( + Region.Ascalon, + new List + { + new Entry + { + Map = Map.AscalonCityOutpost, + Url = "http://bloogum.net/guildwars/ascalon/ascaloncity/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.AscalonCityWintersdayOutpost, + Url = "http://bloogum.net/guildwars/ascalon/ascaloncity/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 7, + Count = 10 + }, + new Entry + { + Map = Map.OldAscalon, + Url = "http://bloogum.net/guildwars/ascalon/oldascalon/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.OldAscalon, + Url = "http://bloogum.net/guildwars/ascalon/regentvalley/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 9 + }, + new Entry + { + Map = Map.PockmarkFlats, + Url = "http://bloogum.net/guildwars/ascalon/pockmarkflats/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.EasternFrontier, + Url = "http://bloogum.net/guildwars/ascalon/easternfrontier/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.EasternFrontier, + Url = "http://bloogum.net/guildwars/ascalon/thebreach/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.DiessaLowlands, + Url = "http://bloogum.net/guildwars/ascalon/diessalowlands/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.DragonsGullet, + Url = "http://bloogum.net/guildwars/ascalon/dragonsgullet/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.AscalonFoothills, + Url = "http://bloogum.net/guildwars/ascalon/ascalonfoothills/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.TheGreatNorthernWall, + Url = "http://bloogum.net/guildwars/ascalon/thegreatnorthernwall/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.FortRanik, + Url = "http://bloogum.net/guildwars/ascalon/fortranik/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 11 + }, + new Entry + { + Map = Map.RuinsOfSurmia, + Url = "http://bloogum.net/guildwars/ascalon/ruinsofsurmia/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.NolaniAcademy, + Url = "http://bloogum.net/guildwars/ascalon/nolaniacademy/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 18 + } + }); + public static readonly Location NorthernShiverpeaks = new( + Region.ShiverpeakMountains, + new List + { + new Entry + { + Map = Map.TravelersVale, + Url = "http://bloogum.net/guildwars/nshiverpeaks/travelersvale/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 20 + }, + new Entry + { + Map = Map.YaksBendOutpost, + Url = "http://bloogum.netguildwars/nshiverpeaks/yaksbend/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 7 + }, + new Entry + { + Map = Map.BorlisPass, + Url = "http://bloogum.net/guildwars/nshiverpeaks/borlispass/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 37 + }, + new Entry + { + Map = Map.IronHorseMine, + Url = "http://bloogum.net/guildwars/nshiverpeaks/ironhorsemine/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 18 + }, + new Entry + { + Map = Map.TheFrostGate, + Url = "http://bloogum.net/guildwars/nshiverpeaks/thefrostgate/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 18 + }, + new Entry + { + Map = Map.AnvilRock, + Url = "http://bloogum.net/guildwars/nshiverpeaks/anvilrock/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 21 + }, + new Entry + { + Map = Map.IceToothCaveOutpost, + Url = "http://bloogum.net/guildwars/nshiverpeaks/icetoothcave/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.DeldrimorBowl, + Url = "http://bloogum.net/guildwars/nshiverpeaks/deldrimorbowl/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 26 + }, + new Entry + { + Map = Map.BeaconsPerchOutpost, + Url = "http://bloogum.net/guildwars/nshiverpeaks/beaconsperch/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.GriffonsMouth, + Url = "http://bloogum.net/guildwars/nshiverpeaks/griffonsmouth/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 7 + }, + }); + public static readonly Location Kryta = new( + Region.Kryta, + new List + { + new Entry + { + Map = Map.ScoundrelsRise, + Url = "http://bloogum.net/guildwars/kryta/scoundrelsrise/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.GatesOfKryta, + Url = "http://bloogum.net/guildwars/kryta/gatesofkryta/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 29 + }, + new Entry + { + Map = Map.LionsGate, + Url = "http://bloogum.net/guildwars/kryta/lionsgate/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.LionsArchOutpost, + Url = "http://bloogum.net/guildwars/kryta/lionsarch/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 16 + }, + new Entry + { + Map = Map.LionsArchWintersdayOutpost, + Url = "http://bloogum.net/guildwars/kryta/lionsarch/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 17, + Count = 11 + }, + new Entry + { + Map = Map.LionsArchCanthanNewYearOutpost, + Url = "http://bloogum.net/guildwars/kryta/lionsarch/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 29, + Count = 11 + }, + new Entry + { + Map = Map.LionsArchHalloweenOutpost, + Url = "http://bloogum.net/guildwars/kryta/lionsarch/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 41, + Count = 4 + }, + new Entry + { + Map = Map.WarinKrytaLionsArchKeep, + Url = "http://bloogum.net/guildwars/kryta/lionsarchkeep/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 9 + }, + new Entry + { + Map = Map.NorthKrytaProvince, + Url = "http://bloogum.net/guildwars/kryta/northkrytaprovince/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 42 + }, + new Entry + { + Map = Map.DAlessioSeaboard, + Url = "http://bloogum.net/guildwars/kryta/dallesioseaboard/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 39 + }, + new Entry + { + Map = Map.NeboTerrace, + Url = "http://bloogum.net/guildwars/kryta/neboterrace/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 15 + }, + new Entry + { + Map = Map.BergenHotSpringsOutpost, + Url = "http://bloogum.net/guildwars/kryta/bergenhotsprings/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.CursedLands, + Url = "http://bloogum.net/guildwars/kryta/cursedlands/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.BeetletunOutpost, + Url = "http://bloogum.net/guildwars/kryta/beetletun/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.WatchtowerCoast, + Url = "http://bloogum.net/guildwars/kryta/watchtowercoast/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.DivinityCoast, + Url = "http://bloogum.net/guildwars/kryta/divinitycoast/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 34 + }, + new Entry + { + Map = Map.TempleOfTheAges, + Url = "http://bloogum.net/guildwars/kryta/templeofages/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.TheBlackCurtain, + Url = "http://bloogum.net/guildwars/kryta/theblackcurtain/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 25 + }, + new Entry + { + Map = Map.KessexPeak, + Url = "http://bloogum.net/guildwars/kryta/kessexpeak/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 11 + }, + new Entry + { + Map = Map.TalmarkWilderness, + Url = "http://bloogum.net/guildwars/kryta/talmarkwilderness/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 30 + }, + new Entry + { + Map = Map.MajestysRest, + Url = "http://bloogum.net/guildwars/kryta/majestysrest/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.TearsOfTheFallen, + Url = "http://bloogum.net/guildwars/kryta/tearsofthefallen/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.TwinSerpentLakes, + Url = "http://bloogum.net/guildwars/kryta/twinserpentlakes/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 16 + }, + new Entry + { + Map = Map.StingrayStrand, + Url = "http://bloogum.net/guildwars/kryta/stingraystrand/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 15 + }, + new Entry + { + Map = Map.FishermensHavenOutpost, + Url = "http://bloogum.net/guildwars/kryta/fishermenshaven/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.RiversideProvince, + Url = "http://bloogum.net/guildwars/kryta/riversideprovince/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 31 + }, + new Entry + { + Map = Map.SanctumCay, + Url = "http://bloogum.net/guildwars/kryta/sanctumcay/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 21 + }, + }); + public static readonly Location MaguumaJungle = new( + Region.MaguumaJungle, + new List + { + new Entry + { + Map = Map.DruidsOverlookOutpost, + Url = "http://bloogum.net/guildwars/maguuma/druidsoverlook/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.SageLands, + Url = "http://bloogum.net/guildwars/maguuma/sagelands/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 27 + }, + new Entry + { + Map = Map.TheWilds, + Url = "http://bloogum.net/guildwars/maguuma/thewilds/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 19 + }, + new Entry + { + Map = Map.MamnoonLagoon, + Url = "http://bloogum.net/guildwars/maguuma/mamnoonlagoon/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 17 + }, + new Entry + { + Map = Map.QuarrelFallsOutpost, + Url = "http://bloogum.net/guildwars/maguuma/quarrelfalls/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.Silverwood, + Url = "http://bloogum.net/guildwars/maguuma/silverwood/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 29 + }, + new Entry + { + Map = Map.BloodstoneFen, + Url = "http://bloogum.net/guildwars/maguuma/bloodstonefen/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.EttinsBack, + Url = "http://bloogum.net/guildwars/maguuma/ettinsback/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 21 + }, + new Entry + { + Map = Map.VentarisRefugeOutpost, + Url = "http://bloogum.net/guildwars/maguuma/ventarisrefuge/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.ReedBog, + Url = "http://bloogum.net/guildwars/maguuma/reedbog/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.TheFalls, + Url = "http://bloogum.net/guildwars/maguuma/thefalls/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 22 + }, + new Entry + { + Map = Map.DryTop, + Url = "http://bloogum.net/guildwars/maguuma/drytop/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.TangleRoot, + Url = "http://bloogum.net/guildwars/maguuma/tangleroot/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 20 + }, + new Entry + { + Map = Map.MaguumaStadeOutpost, + Url = "http://bloogum.net/guildwars/maguuma/maguumastade/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.AuroraGlade, + Url = "http://bloogum.net/guildwars/maguuma/auroraglade/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.HengeOfDenraviOutpost, + Url = "http://bloogum.net/guildwars/maguuma/hengeofdenravi/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + }); + public static readonly Location CrystalDesert = new( + Region.CrystalDesert, + new List + { + new Entry + { + Map = Map.TheAmnoonOasisOutpost, + Url = "http://bloogum.net/guildwars/crystaldesert/amnoonoasis/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.ProphetsPath, + Url = "http://bloogum.net/guildwars/crystaldesert/prophetspath/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.HeroesAudienceOutpost, + Url = "http://bloogum.net/guildwars/crystaldesert/heroesaudience/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.SaltFlats, + Url = "http://bloogum.net/guildwars/crystaldesert/seaflats/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 22 + }, + new Entry + { + Map = Map.SeekersPassageOutpost, + Url = "http://bloogum.net/guildwars/crystaldesert/seekerspassage/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.DivinersAscent, + Url = "http://bloogum.net/guildwars/crystaldesert/divinersascent/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 21 + }, + new Entry + { + Map = Map.ElonaReach, + Url = "http://bloogum.net/guildwars/crystaldesert/elonareach/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 23 + }, + new Entry + { + Map = Map.SkywardReach, + Url = "http://bloogum.net/guildwars/crystaldesert/skywardreach/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 34 + }, + new Entry + { + Map = Map.DestinysGorgeOutpost, + Url = "http://bloogum.net/guildwars/crystaldesert/destinysgorge/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.TheScar, + Url = "http://bloogum.net/guildwars/crystaldesert/thescar/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 25 + }, + new Entry + { + Map = Map.ThirstyRiver, + Url = "http://bloogum.net/guildwars/crystaldesert/thirstyriver/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.TheAridSea, + Url = "http://bloogum.net/guildwars/crystaldesert/thearidsea/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 40 + }, + new Entry + { + Map = Map.VultureDrifts, + Url = "http://bloogum.net/guildwars/crystaldesert/vulturedrifts/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 40 + }, + new Entry + { + Map = Map.DunesOfDespair, + Url = "http://bloogum.net/guildwars/crystaldesert/dunesofdespair/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 36 + }, + new Entry + { + Map = Map.AuguryRockOutpost, + Url = "http://bloogum.net/guildwars/crystaldesert/auguryrock/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 25 + }, + new Entry + { + Map = Map.TombOfThePrimevalKings, + Url = "http://bloogum.net/guildwars/crystaldesert/tomboftheprimevalkings/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.TombOfThePrimevalKingsHalloweenOutpost, + Url = "http://bloogum.net/guildwars/crystaldesert/tomboftheprimevalkings/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 14, + Count = 4 + }, + new Entry + { + Map = Map.TheDragonsLair, + Url = "http://bloogum.net/guildwars/crystaldesert/thedragonslair/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 60 + }, + }); + public static readonly Location SouthernShiverpeaks = new( + Region.ShiverpeakMountains, + new List + { + new Entry + { + Map = Map.DroknarsForgeOutpost, + Url = "http://bloogum.net/guildwars/sshiverpeaks/droknarsforge/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 26 + }, + new Entry + { + Map = Map.DroknarsForgeWintersdayOutpost, + Url = "http://bloogum.net/guildwars/sshiverpeaks/droknarsforge/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 27, + Count = 9 + }, + new Entry + { + Map = Map.DroknarsForgeHalloweenOutpost, + Url = "http://bloogum.net/guildwars/sshiverpeaks/droknarsforge/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 37, + Count = 4 + }, + new Entry + { + Map = Map.WitmansFolly, + Url = "http://bloogum.net/guildwars/sshiverpeaks/witmansfolly/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 48 + }, + new Entry + { + Map = Map.PortSledgeOutpost, + Url = "http://bloogum.net/guildwars/sshiverpeaks/portsledge/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 7 + }, + new Entry + { + Map = Map.TalusChute, + Url = "http://bloogum.net/guildwars/sshiverpeaks/taluschute/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 54 + }, + new Entry + { + Map = Map.IceCavesofSorrow, + Url = "http://bloogum.net/guildwars/sshiverpeaks/icecavesofsorrow/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 50 + }, + new Entry + { + Map = Map.CampRankorOutpost, + Url = "http://bloogum.net/guildwars/sshiverpeaks/camprankor/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + + new Entry + { + Map = Map.SnakeDance, + Url = "http://bloogum.net/guildwars/sshiverpeaks/snakedance/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 23 + }, + new Entry + { + Map = Map.DreadnoughtsDrift, + Url = "http://bloogum.net/guildwars/sshiverpeaks/dreadnoughtsdrift/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.LornarsPass, + Url = "http://bloogum.net/guildwars/sshiverpeaks/lornarspass/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 33 + }, + new Entry + { + Map = Map.DeldrimorWarCampOutpost, + Url = "http://bloogum.net/guildwars/sshiverpeaks/deldrimorwarcamp/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.GrenthsFootprint, + Url = "http://bloogum.net/guildwars/sshiverpeaks/grenthsfootprint/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 26 + }, + new Entry + { + Map = Map.SpearheadPeak, + Url = "http://bloogum.net/guildwars/sshiverpeaks/spearheadpeak/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 37 + }, + new Entry + { + Map = Map.TheGraniteCitadelOutpost, + Url = "http://bloogum.net/guildwars/sshiverpeaks/thegranitecitadel/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 11 + }, + new Entry + { + Map = Map.TascasDemise, + Url = "http://bloogum.net/guildwars/sshiverpeaks/tascasdemise/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 11 + }, + new Entry + { + Map = Map.MineralSprings, + Url = "http://bloogum.net/guildwars/sshiverpeaks/mineralsprings/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 41 + }, + new Entry + { + Map = Map.Icedome, + Url = "http://bloogum.net/guildwars/sshiverpeaks/icedome/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 10 + }, + new Entry + { + Map = Map.CopperhammerMinesOutpost, + Url = "http://bloogum.net/guildwars/sshiverpeaks/copperhammermines/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.FrozenForest, + Url = "http://bloogum.net/guildwars/sshiverpeaks/frozenforest/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 49 + }, + new Entry + { + Map = Map.IronMinesofMoladune, + Url = "http://bloogum.net/guildwars/sshiverpeaks/ironminesofmoladune/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 46 + }, + new Entry + { + Map = Map.IceFloe, + Url = "http://bloogum.net/guildwars/sshiverpeaks/icefloe/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 54 + }, + new Entry + { + Map = Map.MarhansGrottoOutpost, + Url = "http://bloogum.net/guildwars/sshiverpeaks/marhansgrotto/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.ThunderheadKeep, + Url = "http://bloogum.net/guildwars/sshiverpeaks/thunderheadkeep/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 57 + }, + }); + public static readonly Location RingOfFireIslandChain = new( + Region.RingOfFireIslands, + new List + { + new Entry + { + Map = Map.EmberLightCampOutpost, + Url = "http://bloogum.net/guildwars/fireisles/emberlightcamp/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.PerditionRock, + Url = "http://bloogum.net/guildwars/fireisles/perditionrock/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 37 + }, + new Entry + { + Map = Map.RingOfFire, + Url = "http://bloogum.net/guildwars/fireisles/ringoffire/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 36 + }, + new Entry + { + Map = Map.AbaddonsMouth, + Url = "http://bloogum.net/guildwars/fireisles/abaddonsmouth/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 47 + }, + new Entry + { + Map = Map.HellsPrecipice, + Url = "http://bloogum.net/guildwars/fireisles/hellsprecipice/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 38 + }, + }); + public static readonly Location FarShiverpeaks = new( + Region.FarShiverpeaks, + new List + { + new Entry + { + Map = Map.EmberLightCampOutpost, + Url = "http://bloogum.net/guildwars/fshiverpeaks/borealstation/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.IceCliffChasms, + Url = "http://bloogum.net/guildwars/fshiverpeaks/icecliffchasms/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 38 + }, + new Entry + { + Map = Map.EyeOfTheNorthOutpostWintersdayOutpost, + Url = "http://bloogum.net/guildwars/fshiverpeaks/eyeofthenorth/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.EyeOfTheNorthOutpost, + Url = "http://bloogum.net/guildwars/fshiverpeaks/eyeofthenorth/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 4, + Count = 3 + }, + new Entry + { + Map = Map.HallOfMonuments, + Url = "http://bloogum.net/guildwars/fshiverpeaks/hallofmonuments/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.GunnarsHoldOutpost, + Url = "http://bloogum.net/guildwars/fshiverpeaks/gunnarshold/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 9 + }, + new Entry + { + Map = Map.NorrhartDomains, + Url = "http://bloogum.net/guildwars/fshiverpeaks/norrhartdomains/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 48 + }, + new Entry + { + Map = Map.OlafsteadOutpost, + Url = "http://bloogum.net/guildwars/fshiverpeaks/olafstead/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.VarajarFells, + Url = "http://bloogum.net/guildwars/fshiverpeaks/varajarfells/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 51 + }, + new Entry + { + Map = Map.SifhallaOutpost, + Url = "http://bloogum.net/guildwars/fshiverpeaks/sifhalla/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.DrakkarLake, + Url = "http://bloogum.net/guildwars/fshiverpeaks/drakkarlake/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 50 + }, + new Entry + { + Map = Map.JagaMoraine, + Url = "http://bloogum.net/guildwars/fshiverpeaks/jagamoraine/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 47 + }, + new Entry + { + Map = Map.BjoraMarches, + Url = "http://bloogum.net/guildwars/fshiverpeaks/bjoramarches/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 56 + }, + new Entry + { + Map = Map.LongeyesLedgeOutpost, + Url = "http://bloogum.net/guildwars/fshiverpeaks/longeyesledge/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + }); + public static readonly Location CharrHomelands = new( + Region.CharrHomelands, + new List + { + new Entry + { + Map = Map.GrothmarWardowns, + Url = "http://bloogum.net/guildwars/charr/grothmarwardowns/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 64 + }, + new Entry + { + Map = Map.DoomloreShrineOutpost, + Url = "http://bloogum.net/guildwars/charr/doomloreshrine/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.DaladaUplands, + Url = "http://bloogum.net/guildwars/charr/daladauplands/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 61 + }, + new Entry + { + Map = Map.SacnothValley, + Url = "http://bloogum.net/guildwars/charr/sacnothvalley/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 60 + }, + }); + public static readonly Location TarnishedCoast = new( + Region.TarnishedCoast, + new List + { + new Entry + { + Map = Map.VerdantCascades, + Url = "http://bloogum.net/guildwars/tarnishedcoast/verdantcascades/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 52 + }, + new Entry + { + Map = Map.UmbralGrottoOutpost, + Url = "http://bloogum.net/guildwars/tarnishedcoast/umbralgrotto/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.GaddsEncampmentOutpost, + Url = "http://bloogum.net/guildwars/tarnishedcoast/gaddsencampment/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.SparkflySwamp, + Url = "http://bloogum.net/guildwars/tarnishedcoast/sparkflyswamp/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 37 + }, + new Entry + { + Map = Map.VloxsFalls, + Url = "http://bloogum.net/guildwars/tarnishedcoast/vloxsfalls/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.ArborBay, + Url = "http://bloogum.net/guildwars/tarnishedcoast/arborbay/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 52 + }, + new Entry + { + Map = Map.AlcaziaTangle, + Url = "http://bloogum.net/guildwars/tarnishedcoast/alcaziatangle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 41 + }, + new Entry + { + Map = Map.TarnishedHavenOutpost, + Url = "http://bloogum.net/guildwars/tarnishedcoast/tarnishedhaven/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.RivenEarth, + Url = "http://bloogum.net/guildwars/tarnishedcoast/rivenearth/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 50 + }, + new Entry + { + Map = Map.RataSumOutpost, + Url = "http://bloogum.net/guildwars/tarnishedcoast/ratasum/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.MagusStones, + Url = "http://bloogum.net/guildwars/tarnishedcoast/magusstones/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 37 + }, + new Entry + { + Map = Map.PolymockColiseum, + Url = "http://bloogum.net/guildwars/tarnishedcoast/polymockcoliseum/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + }); + public static readonly Location DepthsOfTyria = new( + Region.DepthsOfTyria, + new List + { + new Entry + { + Map = Map.TheFissureofWoe, + Url = "http://bloogum.net/guildwars/dungeons/fissureofwoe/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.CatacombsofKathandraxLevel1, + Url = "http://bloogum.net/guildwars/dungeons/catacombsofkathandrax/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 47 + }, + new Entry + { + Map = Map.CatacombsofKathandraxLevel2, + Url = "http://bloogum.net/guildwars/dungeons/catacombsofkathandrax/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 47 + }, + new Entry + { + Map = Map.CatacombsofKathandraxLevel3, + Url = "http://bloogum.net/guildwars/dungeons/catacombsofkathandrax/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 47 + }, + new Entry + { + Map = Map.RragarsMenagerieLevel1, + Url = "http://bloogum.net/guildwars/dungeons/rragarsmenagerie/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 50 + }, + new Entry + { + Map = Map.RragarsMenagerieLevel2, + Url = "http://bloogum.net/guildwars/dungeons/rragarsmenagerie/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 50 + },new Entry + { + Map = Map.RragarsMenagerieLevel3, + Url = "http://bloogum.net/guildwars/dungeons/rragarsmenagerie/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 50 + }, + new Entry + { + Map = Map.CathedralofFlamesLevel1, + Url = "http://bloogum.net/guildwars/dungeons/cathedralofflame/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 56 + }, + new Entry + { + Map = Map.CathedralofFlamesLevel2, + Url = "http://bloogum.net/guildwars/dungeons/cathedralofflame/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 56 + }, + new Entry + { + Map = Map.CathedralofFlamesLevel3, + Url = "http://bloogum.net/guildwars/dungeons/cathedralofflame/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 56 + }, + new Entry + { + Map = Map.OozePit, + Url = "http://bloogum.net/guildwars/dungeons/oozepit/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 52 + }, + new Entry + { + Map = Map.OozePitMission, + Url = "http://bloogum.net/guildwars/dungeons/oozepit/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 52 + }, + new Entry + { + Map = Map.DarkrimeDelvesLevel1, + Url = "http://bloogum.net/guildwars/dungeons/darkrimedelves/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 58 + }, + new Entry + { + Map = Map.DarkrimeDelvesLevel2, + Url = "http://bloogum.net/guildwars/dungeons/darkrimedelves/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 58 + }, + new Entry + { + Map = Map.DarkrimeDelvesLevel3, + Url = "http://bloogum.net/guildwars/dungeons/darkrimedelves/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 58 + }, + new Entry + { + Map = Map.FrostmawsBurrowsLevel1, + Url = "http://bloogum.net/guildwars/dungeons/frostmawburrows/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 54 + }, + new Entry + { + Map = Map.FrostmawsBurrowsLevel2, + Url = "http://bloogum.net/guildwars/dungeons/frostmawburrows/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 54 + }, + new Entry + { + Map = Map.FrostmawsBurrowsLevel3, + Url = "http://bloogum.net/guildwars/dungeons/frostmawburrows/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 54 + }, + new Entry + { + Map = Map.FrostmawsBurrowsLevel4, + Url = "http://bloogum.net/guildwars/dungeons/frostmawburrows/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 54 + }, + new Entry + { + Map = Map.FrostmawsBurrowsLevel5, + Url = "http://bloogum.net/guildwars/dungeons/frostmawburrows/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 54 + }, + new Entry + { + Map = Map.SepulchreOfDragrimmarLevel1, + Url = "http://bloogum.net/guildwars/dungeons/sepulchreofdragrimmar/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 35 + }, + new Entry + { + Map = Map.SepulchreOfDragrimmarLevel2, + Url = "http://bloogum.net/guildwars/dungeons/sepulchreofdragrimmar/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 35 + }, + new Entry + { + Map = Map.RavensPointLevel1, + Url = "http://bloogum.net/guildwars/dungeons/ravenspoint/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 64 + }, + new Entry + { + Map = Map.RavensPointLevel2, + Url = "http://bloogum.net/guildwars/dungeons/ravenspoint/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 64 + }, + new Entry + { + Map = Map.RavensPointLevel3, + Url = "http://bloogum.net/guildwars/dungeons/ravenspoint/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 64 + }, + new Entry + { + Map = Map.VloxenExcavationsLevel1, + Url = "http://bloogum.net/guildwars/dungeons/vloxenexcavations/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 52 + }, + new Entry + { + Map = Map.VloxenExcavationsLevel2, + Url = "http://bloogum.net/guildwars/dungeons/vloxenexcavations/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 52 + }, + new Entry + { + Map = Map.VloxenExcavationsLevel3, + Url = "http://bloogum.net/guildwars/dungeons/vloxenexcavations/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 52 + }, + new Entry + { + Map = Map.BogrootGrowthsLevel1, + Url = "http://bloogum.net/guildwars/dungeons/bogrootgrowths/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 47 + }, + new Entry + { + Map = Map.BogrootGrowthsLevel2, + Url = "http://bloogum.net/guildwars/dungeons/bogrootgrowths/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 47 + }, + new Entry + { + Map = Map.BloodstoneCavesLevel1, + Url = "http://bloogum.net/guildwars/dungeons/bloodstonecaves/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 20 + }, + new Entry + { + Map = Map.BloodstoneCavesLevel2, + Url = "http://bloogum.net/guildwars/dungeons/bloodstonecaves/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 20 + }, + new Entry + { + Map = Map.BloodstoneCavesLevel3, + Url = "http://bloogum.net/guildwars/dungeons/bloodstonecaves/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 20 + }, + new Entry + { + Map = Map.ShardsOfOrrLevel1, + Url = "http://bloogum.net/guildwars/dungeons/shardsoforr/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 40 + }, + new Entry + { + Map = Map.ShardsOfOrrLevel2, + Url = "http://bloogum.net/guildwars/dungeons/shardsoforr/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 40 + }, + new Entry + { + Map = Map.ShardsOfOrrLevel3, + Url = "http://bloogum.net/guildwars/dungeons/shardsoforr/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 40 + }, + new Entry + { + Map = Map.OolasLabLevel1, + Url = "http://bloogum.net/guildwars/dungeons/oolaslab/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 46 + }, + new Entry + { + Map = Map.OolasLabLevel2, + Url = "http://bloogum.net/guildwars/dungeons/oolaslab/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 46 + }, + new Entry + { + Map = Map.OolasLabLevel3, + Url = "http://bloogum.net/guildwars/dungeons/oolaslab/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 46 + }, + new Entry + { + Map = Map.ArachnisHauntLevel1, + Url = "http://bloogum.net/guildwars/dungeons/arachnishaunt/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 34 + }, + new Entry + { + Map = Map.ArachnisHauntLevel2, + Url = "http://bloogum.net/guildwars/dungeons/arachnishaunt/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 34 + }, + new Entry + { + Map = Map.SlaversExileLevel1, + Url = "http://bloogum.net/guildwars/dungeons/slaversexile/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 59 + }, + new Entry + { + Map = Map.SlaversExileLevel2, + Url = "http://bloogum.net/guildwars/dungeons/slaversexile/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 59 + }, + new Entry + { + Map = Map.SlaversExileLevel3, + Url = "http://bloogum.net/guildwars/dungeons/slaversexile/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 59 + }, + new Entry + { + Map = Map.SlaversExileLevel4, + Url = "http://bloogum.net/guildwars/dungeons/slaversexile/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 59 + }, + new Entry + { + Map = Map.SlaversExileLevel5, + Url = "http://bloogum.net/guildwars/dungeons/slaversexile/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 59 + }, + new Entry + { + Map = Map.FronisIrontoesLairMission, + Url = "http://bloogum.net/guildwars/dungeons/fronisirontoeslair/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 11 + }, + new Entry + { + Map = Map.SecretLairOftheSnowmen, + Url = "http://bloogum.net/guildwars/dungeons/secretlairofthesnowmen/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 16 + }, + new Entry + { + Map = Map.SecretLairOftheSnowmen2, + Url = "http://bloogum.net/guildwars/dungeons/secretlairofthesnowmen/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 16 + }, + new Entry + { + Map = Map.SecretLairOftheSnowmen3, + Url = "http://bloogum.net/guildwars/dungeons/secretlairofthesnowmen/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 16 + }, + new Entry + { + Map = Map.HeartOftheShiverpeaksLevel1, + Url = "http://bloogum.net/guildwars/dungeons/heartoftheshiverpeaks/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 40 + }, + new Entry + { + Map = Map.HeartOftheShiverpeaksLevel2, + Url = "http://bloogum.net/guildwars/dungeons/heartoftheshiverpeaks/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 40 + }, + new Entry + { + Map = Map.HeartOftheShiverpeaksLevel3, + Url = "http://bloogum.net/guildwars/dungeons/heartoftheshiverpeaks/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 40 + }, + }); + public static readonly Location ShingJeaIsland = new( + Region.ShingJeaIsland, + new List + { + new Entry + { + Map = Map.MonasteryOverlook1, + Url = "http://bloogum.net/guildwars/shingjea/monasteryoverlook/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.MonasteryOverlook2, + Url = "http://bloogum.net/guildwars/shingjea/monasteryoverlook/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.ShingJeaMonasteryOutpost, + Url = "http://bloogum.net/guildwars/shingjea/shingjeamonastery/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 9, + Count = 6 + }, + new Entry + { + Map = Map.ShingJeaMonasteryMission, + Url = "http://bloogum.net/guildwars/shingjea/shingjeamonastery/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 9, + Count = 6 + }, + new Entry + { + Map = Map.ShingJeaMonasteryRaidOnShingJeaMonastery, + Url = "http://bloogum.net/guildwars/shingjea/shingjeamonastery/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 9, + Count = 6 + }, + new Entry + { + Map = Map.ShingJeaMonasteryCanthanNewYearOutpost, + Url = "http://bloogum.net/guildwars/shingjea/shingjeamonastery/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.ShingJeaMonasteryDragonFestivalOutpost, + Url = "http://bloogum.net/guildwars/shingjea/shingjeamonastery/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 5, + Count = 4 + }, + new Entry + { + Map = Map.SunquaVale, + Url = "http://bloogum.net/guildwars/shingjea/sunquevale/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 40 + }, + new Entry + { + Map = Map.TsumeiVillageOutpost, + Url = "http://bloogum.net/guildwars/shingjea/tsumeivillage/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.TsumeiVillageMission, + Url = "http://bloogum.net/guildwars/shingjea/tsumeivillage/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.TsumeiVillageMission2, + Url = "http://bloogum.net/guildwars/shingjea/tsumeivillage/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.TsumeiVillageWindsOfChangeATreatysATreaty, + Url = "http://bloogum.net/guildwars/shingjea/tsumeivillage/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.PanjiangPeninsula, + Url = "http://bloogum.net/guildwars/shingjea/panjiangpeninsula/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 47 + }, + new Entry + { + Map = Map.RanMusuGardensOutpost, + Url = "http://bloogum.net/guildwars/shingjea/ranmusugardens/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.KinyaProvince, + Url = "http://bloogum.net/guildwars/shingjea/kinyaprovince/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 29 + }, + new Entry + { + Map = Map.MinisterChosEstateExplorable, + Url = "http://bloogum.net/guildwars/shingjea/ministerchosestate/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 26 + }, + new Entry + { + Map = Map.MinisterChosEstateMission2, + Url = "http://bloogum.net/guildwars/shingjea/ministerchosestate/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 26 + }, + new Entry + { + Map = Map.MinisterChosEstateOutpostMission, + Url = "http://bloogum.net/guildwars/shingjea/ministerchosestate/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 26 + }, + new Entry + { + Map = Map.LinnokCourtyard, + Url = "http://bloogum.net/guildwars/shingjea/linnokcourtyard/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.SaoshangTrail, + Url = "http://bloogum.net/guildwars/shingjea/saoshangtrail/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.SeitungHarborOutpost, + Url = "http://bloogum.net/guildwars/shingjea/seitungharbor/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.SeitungHarborAreaDeadlyCargo, + Url = "http://bloogum.net/guildwars/shingjea/seitungharbor/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.SeitungHarborMission, + Url = "http://bloogum.net/guildwars/shingjea/seitungharbor/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.SeitungHarborMission2, + Url = "http://bloogum.net/guildwars/shingjea/seitungharbor/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.JayaBluffs, + Url = "http://bloogum.net/guildwars/shingjea/jayabluffs/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.JayaBluffsMission, + Url = "http://bloogum.net/guildwars/shingjea/jayabluffs/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.ZenDaijunExplorable, + Url = "http://bloogum.net/guildwars/shingjea/zendaijun/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.ZenDaijunOutpostMission, + Url = "http://bloogum.net/guildwars/shingjea/zendaijun/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.HaijuLagoon, + Url = "http://bloogum.net/guildwars/shingjea/haijulagoon/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 38 + }, + new Entry + { + Map = Map.HaijuLagoonMission, + Url = "http://bloogum.net/guildwars/shingjea/haijulagoon/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 38 + }, + new Entry + { + Map = Map.ShingJeaArena, + Url = "http://bloogum.net/guildwars/shingjea/shingjeaarena/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.ShingJeaArenaMission, + Url = "http://bloogum.net/guildwars/shingjea/shingjeaarena/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + }); + public static readonly Location KainengCity = new( + Region.KainengCity, + new List + { + new Entry + { + Map = Map.KainengCenterCanthanNewYearOutpost, + Url = "http://bloogum.net/guildwars/kaineng/kainengcenter/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.KainengCenterCanthanNewYearOutpost, + Url = "http://bloogum.net/guildwars/kaineng/kainengcenter/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 7, + Count = 5 + }, + new Entry + { + Map = Map.KainengCenterOutpost, + Url = "http://bloogum.net/guildwars/kaineng/kainengcenter/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 12, + Count = 18 + }, + new Entry + { + Map = Map.KainengCenterSunspearsInCantha, + Url = "http://bloogum.net/guildwars/kaineng/kainengcenter/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 12, + Count = 18 + }, + new Entry + { + Map = Map.KainengCenterWindsOfChangeAChanceEncounter, + Url = "http://bloogum.net/guildwars/kaineng/kainengcenter/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 12, + Count = 18 + }, + new Entry + { + Map = Map.KainengCenterWindsOfChangeRaidonKainengCenter, + Url = "http://bloogum.net/guildwars/kaineng/kainengcenter/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 12, + Count = 18 + }, + new Entry + { + Map = Map.BejunkanPier, + Url = "http://bloogum.net/guildwars/kaineng/bejunkanpier/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.BukdekByway, + Url = "http://bloogum.net/guildwars/kaineng/bukdekbyway/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 28 + }, + new Entry + { + Map = Map.BukdekBywayWindsOfChangeCanthaCourierCrisis, + Url = "http://bloogum.net/guildwars/kaineng/bukdekbyway/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 28 + }, + new Entry + { + Map = Map.TheMarketplaceOutpost, + Url = "http://bloogum.net/guildwars/kaineng/themarketplace/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.TheMarketplaceAreaTrackingtheCorruption, + Url = "http://bloogum.net/guildwars/kaineng/themarketplace/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.KainengDocks, + Url = "http://bloogum.net/guildwars/kaineng/kainengdocks/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.WajjunBazaar, + Url = "http://bloogum.net/guildwars/kaineng/wajjunbazaar/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 30 + }, + new Entry + { + Map = Map.WajjunBazaarPOX, + Url = "http://bloogum.net/guildwars/kaineng/wajjunbazaar/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 30 + }, + new Entry + { + Map = Map.WajjunBazaarWindsOfChangeMinistryOfOppression, + Url = "http://bloogum.net/guildwars/kaineng/wajjunbazaar/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 30 + }, + new Entry + { + Map = Map.WajjunBazaarWindsOfChangeViolenceInTheStreets, + Url = "http://bloogum.net/guildwars/kaineng/wajjunbazaar/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 30 + }, + new Entry + { + Map = Map.SenjisCornerOutpost, + Url = "http://bloogum.net/guildwars/kaineng/senjiscorner/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.XaquangSkyway, + Url = "http://bloogum.net/guildwars/kaineng/xaquangskyway/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 10 + }, + new Entry + { + Map = Map.DragonsThroat, + Url = "http://bloogum.net/guildwars/kaineng/dragonsthroat/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.DragonsThroatAreaWhatWaitsInShadow, + Url = "http://bloogum.net/guildwars/kaineng/dragonsthroat/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.NahpuiQuarterExplorable, + Url = "http://bloogum.net/guildwars/kaineng/nahpuiquarter/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 22 + }, + new Entry + { + Map = Map.NahpuiQuarterOutpostMission, + Url = "http://bloogum.net/guildwars/kaineng/nahpuiquarter/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 22 + }, + new Entry + { + Map = Map.ShadowsPassage, + Url = "http://bloogum.net/guildwars/kaineng/shadowspassage/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.ShadowsPassageWindsofChangeCallingAllThugs, + Url = "http://bloogum.net/guildwars/kaineng/shadowspassage/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.ShenzunTunnels, + Url = "http://bloogum.net/guildwars/kaineng/shenzuntunnels/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.TahnnakaiTempleExplorable, + Url = "http://bloogum.net/guildwars/kaineng/tahnnakaitemple/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.TahnnakaiTempleOutpostMission, + Url = "http://bloogum.net/guildwars/kaineng/tahnnakaitemple/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.TahnnakaiTempleWindsOfChangeTheRescueAttempt, + Url = "http://bloogum.net/guildwars/kaineng/tahnnakaitemple/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.ZinKuCorridorOutpost, + Url = "http://bloogum.net/guildwars/kaineng/zinkucorridor/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.VizunahSquareMission, + Url = "http://bloogum.net/guildwars/kaineng/vizunahsquare/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.VizunahSquareForeignQuarterOutpost, + Url = "http://bloogum.net/guildwars/kaineng/vizunahsquare/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.VizunahSquareLocalQuarterOutpost, + Url = "http://bloogum.net/guildwars/kaineng/vizunahsquare/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.TheUndercity, + Url = "http://bloogum.net/guildwars/kaineng/theundercity/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.SunjiangDistrictExplorable, + Url = "http://bloogum.net/guildwars/kaineng/sunjiangdistrict/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.SunjiangDistrictOutpostMission, + Url = "http://bloogum.net/guildwars/kaineng/sunjiangdistrict/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.MaatuKeepOutpost, + Url = "http://bloogum.net/guildwars/kaineng/maatukeep/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.PongmeiValley, + Url = "http://bloogum.net/guildwars/kaineng/pongmeivalley/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.RaisuPavilion, + Url = "http://bloogum.net/guildwars/kaineng/raisupavilion/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.RaisuPalace, + Url = "http://bloogum.net/guildwars/kaineng/raisupalace/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 37 + }, + new Entry + { + Map = Map.RaisuPalaceOutpostMission, + Url = "http://bloogum.net/guildwars/kaineng/raisupalace/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 37 + }, + new Entry + { + Map = Map.ImperialSanctumOutpostMission, + Url = "http://bloogum.net/guildwars/kaineng/imperialsanctum/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 9 + }, + new Entry + { + Map = Map.DivinePath, + Url = "http://bloogum.net/guildwars/kaineng/divinepath/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + }); + public static readonly Location EchovaldForest = new( + Region.EchovaldForest, + new List + { + new Entry + { + Map = Map.TanglewoodCopseOutpost, + Url = "http://bloogum.net/guildwars/echovald/tanglewoodcopse/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.ArborstoneExplorable, + Url = "http://bloogum.net/guildwars/echovald/arborstone/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 37 + }, + new Entry + { + Map = Map.ArborstoneOutpostMission, + Url = "http://bloogum.net/guildwars/echovald/arborstone/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 37 + }, + new Entry + { + Map = Map.AltrummRuins, + Url = "http://bloogum.net/guildwars/echovald/altrummruins/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 9 + }, + new Entry + { + Map = Map.AltrummRuinsFindingJinnai, + Url = "http://bloogum.net/guildwars/echovald/altrummruins/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 9 + }, + new Entry + { + Map = Map.HouseZuHeltzerOutpost, + Url = "http://bloogum.net/guildwars/echovald/housezuheltzer/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.Ferndale, + Url = "http://bloogum.net/guildwars/echovald/ferndale/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 25 + }, + new Entry + { + Map = Map.AspenwoodGateKurzickOutpost, + Url = "http://bloogum.net/guildwars/echovald/aspenwoodgate/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.FortAspenwoodKurzickOutpost, + Url = "http://bloogum.net/guildwars/echovald/fortaspenwood/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 11 + }, + new Entry + { + Map = Map.FortAspenwoodMission, + Url = "http://bloogum.net/guildwars/echovald/fortaspenwood/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 11 + }, + new Entry + { + Map = Map.SaintAnjekasShrineOutpost, + Url = "http://bloogum.net/guildwars/echovald/saintanjekasshrine/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.DrazachThicket, + Url = "http://bloogum.net/guildwars/echovald/drazachthicket/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.LutgardisConservatoryOutpost, + Url = "http://bloogum.net/guildwars/echovald/lutgardisconservatory/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.BrauerAcademyOutpost, + Url = "http://bloogum.net/guildwars/echovald/braueracademy/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.MelandrusHope, + Url = "http://bloogum.net/guildwars/echovald/melandrushope/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 28 + }, + new Entry + { + Map = Map.JadeFlatsKurzickOutpost, + Url = "http://bloogum.net/guildwars/echovald/jadeflats/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.TheJadeQuarryKurzickOutpost, + Url = "http://bloogum.net/guildwars/echovald/thejadequarry/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.TheEternalGrove, + Url = "http://bloogum.net/guildwars/echovald/theeternalgrove/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 31 + }, + new Entry + { + Map = Map.TheEternalGroveOutpostMission, + Url = "http://bloogum.net/guildwars/echovald/theeternalgrove/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 31 + }, + new Entry + { + Map = Map.VasburgArmoryOutpost, + Url = "http://bloogum.net/guildwars/echovald/vasburgarmory/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.MorostavTrail, + Url = "http://bloogum.net/guildwars/echovald/morostavtrail/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 17 + }, + new Entry + { + Map = Map.DurheimArchivesOutpost, + Url = "http://bloogum.net/guildwars/echovald/durheimarchives/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.MourningVeilFalls, + Url = "http://bloogum.net/guildwars/echovald/mourningveilfalls/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 31 + }, + new Entry + { + Map = Map.AmatzBasin, + Url = "http://bloogum.net/guildwars/echovald/amatzbasin/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.UnwakingWatersKurzickOutpost, + Url = "http://bloogum.net/guildwars/echovald/unwakingwaters/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.UrgozsWarren, + Url = "http://bloogum.net/guildwars/echovald/urgozswarren/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + }); + public static readonly Location JadeSea = new( + Region.TheJadeSea, + new List + { + new Entry + { + Map = Map.BoreasSeabedExplorable, + Url = "http://bloogum.net/guildwars/jadesea/boreasseabed/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 42 + }, + new Entry + { + Map = Map.BoreasSeabedOutpostMission, + Url = "http://bloogum.net/guildwars/jadesea/boreasseabed/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 42 + }, + new Entry + { + Map = Map.ZosShivrosChannel, + Url = "http://bloogum.net/guildwars/jadesea/zosshivroschannel/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 9 + }, + new Entry + { + Map = Map.CavalonOutpost, + Url = "http://bloogum.net/guildwars/jadesea/cavalon/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 7 + }, + new Entry + { + Map = Map.Archipelagos, + Url = "http://bloogum.net/guildwars/jadesea/archipelagos/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 29 + }, + new Entry + { + Map = Map.BreakerHollowOutpost, + Url = "http://bloogum.net/guildwars/jadesea/breakerhollow/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.MountQinkai, + Url = "http://bloogum.net/guildwars/jadesea/mountqinkai/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.AspenwoodGateLuxonOutpost, + Url = "http://bloogum.net/guildwars/jadesea/aspenwoodgate/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.FortAspenwoodLuxonOutpost, + Url = "http://bloogum.net/guildwars/jadesea/fortaspenwood/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.JadeFlatsLuxonOutpost, + Url = "http://bloogum.net/guildwars/jadesea/jadeflats/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.TheJadeQuarryLuxonOutpost, + Url = "http://bloogum.net/guildwars/jadesea/thejadequarry/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.TheJadeQuarryMission, + Url = "http://bloogum.net/guildwars/jadesea/thejadequarry/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.MaishangHills, + Url = "http://bloogum.net/guildwars/jadesea/maishanghills/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 26 + }, + new Entry + { + Map = Map.BaiPaasuReachOutpost, + Url = "http://bloogum.net/guildwars/jadesea/baipaasureach/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.EredonTerraceOutpost, + Url = "http://bloogum.net/guildwars/jadesea/eredonterrace/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.GyalaHatchery, + Url = "http://bloogum.net/guildwars/jadesea/gyalahatchery/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 36 + }, + new Entry + { + Map = Map.GyalaHatcheryOutpostMission, + Url = "http://bloogum.net/guildwars/jadesea/gyalahatchery/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 36 + }, + new Entry + { + Map = Map.LeviathanPitsOutpost, + Url = "http://bloogum.net/guildwars/jadesea/leviathanpits/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.SilentSurf, + Url = "http://bloogum.net/guildwars/jadesea/silentsurf/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 27 + }, + new Entry + { + Map = Map.SeafarersRestOutpost, + Url = "http://bloogum.net/guildwars/jadesea/seafarersrest/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.RheasCrater, + Url = "http://bloogum.net/guildwars/jadesea/rheascrater/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 28 + }, + new Entry + { + Map = Map.TheAuriosMines, + Url = "http://bloogum.net/guildwars/jadesea/theauriosmines/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 10 + }, + new Entry + { + Map = Map.UnwakingWaters, + Url = "http://bloogum.net/guildwars/jadesea/unwakingwaters/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.UnwakingWatersLuxonOutpost, + Url = "http://bloogum.net/guildwars/jadesea/gyalahatchery/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 36 + }, + new Entry + { + Map = Map.UnwakingWatersMission, + Url = "http://bloogum.net/guildwars/jadesea/gyalahatchery/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 36 + }, + new Entry + { + Map = Map.HarvestTempleOutpost, + Url = "http://bloogum.net/guildwars/jadesea/harvesttemple/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.TheDeep, + Url = "http://bloogum.net/guildwars/jadesea/thedeep/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 18 + }, + }); + public static readonly Location Istan = new( + Region.Istan, + new List + { + new Entry + { + Map = Map.IslandOfShehkah, + Url = "http://bloogum.net/guildwars/istan/islandofshehkah/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.ChahbekVillage, + Url = "http://bloogum.net/guildwars/istan/chahbekvillage/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.ChurrhirFields, + Url = "http://bloogum.net/guildwars/istan/churrhirfields/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.KamadanJewelOfIstanWintersdayOutpost, + Url = "http://bloogum.net/guildwars/istan/kamadan/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.KamadanJewelOfIstanHalloweenOutpost, + Url = "http://bloogum.net/guildwars/istan/kamadan/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 6, + Count = 5 + }, + new Entry + { + Map = Map.KamadanJewelOfIstanOutpost, + Url = "http://bloogum.net/guildwars/istan/kamadan/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 11, + Count = 6 + }, + new Entry + { + Map = Map.KamadanJewelOfIstanExplorable, + Url = "http://bloogum.net/guildwars/istan/kamadan/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 11, + Count = 6 + }, + new Entry + { + Map = Map.KamadanJewelOfIstanCanthanNewYearOutpost, + Url = "http://bloogum.net/guildwars/istan/kamadan/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 11, + Count = 6 + }, + new Entry + { + Map = Map.KamadanMission, + Url = "http://bloogum.net/guildwars/istan/kamadan/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 11, + Count = 6 + }, + new Entry + { + Map = Map.SunDocks, + Url = "http://bloogum.net/guildwars/istan/sundocks/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.SunspearArena, + Url = "http://bloogum.net/guildwars/istan/sunspeararena/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.SunspearArenaMission, + Url = "http://bloogum.net/guildwars/istan/sunspeararena/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.PlainsOfJarin, + Url = "http://bloogum.net/guildwars/istan/plainsofjarin/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 27 + }, + new Entry + { + Map = Map.SunspearGreatHallOutpost, + Url = "http://bloogum.net/guildwars/istan/sunspeargreathall/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.TheAstralariumOutpost, + Url = "http://bloogum.net/guildwars/istan/theastralarium/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 7 + }, + new Entry + { + Map = Map.ChampionsDawnOutpost, + Url = "http://bloogum.net/guildwars/istan/championsdawn/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.CliffsOfDohjok, + Url = "http://bloogum.net/guildwars/istan/cliffsofdohjol/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 26 + }, + new Entry + { + Map = Map.ZehlonReach, + Url = "http://bloogum.net/guildwars/istan/zehlonreach/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 46 + }, + new Entry + { + Map = Map.JokanurDiggings, + Url = "http://bloogum.net/guildwars/istan/jokanurdiggings/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.FahranurTheFirstCity, + Url = "http://bloogum.net/guildwars/istan/fahranurthefirstcity/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 29 + }, + new Entry + { + Map = Map.FahranurMission, + Url = "http://bloogum.net/guildwars/istan/fahranurthefirstcity/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 29 + }, + new Entry + { + Map = Map.BlacktideDen, + Url = "http://bloogum.net/guildwars/istan/blacktideden/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.LahtendaBog, + Url = "http://bloogum.net/guildwars/istan/lahtendabog/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.BeknurHarbor, + Url = "http://bloogum.net/guildwars/istan/beknurharbor/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.BeknurHarborOutpost, + Url = "http://bloogum.net/guildwars/istan/beknurharbor/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.IssnurIsles, + Url = "http://bloogum.net/guildwars/istan/issnurisles/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 35 + }, + new Entry + { + Map = Map.KodlonuHamletOutpost, + Url = "http://bloogum.net/guildwars/istan/kodlonuhamlet/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 9 + }, + new Entry + { + Map = Map.MehtaniKeys, + Url = "http://bloogum.net/guildwars/istan/mehtanikeys/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 32 + }, + new Entry + { + Map = Map.Consulate, + Url = "http://bloogum.net/guildwars/istan/consulate/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.ConsulateDocks, + Url = "http://bloogum.net/guildwars/istan/consulatedocks/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + }); + public static readonly Location Kourna = new( + Region.Kourna, + new List + { + new Entry + { + Map = Map.YohlonHavenOutpost, + Url = "http://bloogum.net/guildwars/kourna/yohlonhaven/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.ArkjokWard, + Url = "http://bloogum.net/guildwars/kourna/arkjokward/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 49 + }, + new Entry + { + Map = Map.SunspearSanctuaryOutpost, + Url = "http://bloogum.net/guildwars/kourna/sunspearsanctuary/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.CommandPost, + Url = "http://bloogum.net/guildwars/kourna/commandpost/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.SunwardMarches, + Url = "http://bloogum.net/guildwars/kourna/sunwardmarches/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 47 + }, + new Entry + { + Map = Map.VentaCemetery, + Url = "http://bloogum.net/guildwars/kourna/ventacemetery/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.MargaCoast, + Url = "http://bloogum.net/guildwars/kourna/margacoast/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 57 + }, + new Entry + { + Map = Map.DajkahInlet, + Url = "http://bloogum.net/guildwars/kourna/dajkahinlet/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.JahaiBluffs, + Url = "http://bloogum.net/guildwars/kourna/jahaibluffs/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 37 + }, + new Entry + { + Map = Map.KodonurCrossroads, + Url = "http://bloogum.net/guildwars/kourna/kodonurcrossroads/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.DejarinEstate, + Url = "http://bloogum.net/guildwars/kourna/dejarinestate/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 45 + }, + new Entry + { + Map = Map.PogahnPassage, + Url = "http://bloogum.net/guildwars/kourna/pogahnpassage/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.GandaraTheMoonFortress, + Url = "http://bloogum.net/guildwars/kourna/gandarathemoonfortress/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 36 + }, + new Entry + { + Map = Map.CampHojanuOutpost, + Url = "http://bloogum.net/guildwars/kourna/camphojanu/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.BarbarousShore, + Url = "http://bloogum.net/guildwars/kourna/barbarousshore/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 38 + }, + new Entry + { + Map = Map.RilohnRefuge, + Url = "http://bloogum.net/guildwars/kourna/rilohnrefuge/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 1 + }, + new Entry + { + Map = Map.TheFloodplainOfMahnkelon, + Url = "http://bloogum.net/guildwars/kourna/thefloodplainofmahnkelon/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 20 + }, + new Entry + { + Map = Map.ModdokCrevice, + Url = "http://bloogum.net/guildwars/kourna/moddokcrevice/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.BahdokCaverns, + Url = "http://bloogum.net/guildwars/kourna/bahdokcaverns/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.WehhanTerracesOutpost, + Url = "http://bloogum.net/guildwars/kourna/wehhanterraces/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.NunduBay, + Url = "http://bloogum.net/guildwars/kourna/nundubay/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 37 + }, + new Entry + { + Map = Map.TuraisProcession, + Url = "http://bloogum.net/guildwars/kourna/turaisprocession/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 35 + }, + }); + public static readonly Location Vabbi = new( + Region.Vabbi, + new List + { + new Entry + { + Map = Map.YatendiCanyons, + Url = "http://bloogum.net/guildwars/vabbi/yatendicanyons/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.ChantryOfSecretsOutpost, + Url = "http://bloogum.net/guildwars/vabbi/chantryofsecrets/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.VehtendiValley, + Url = "http://bloogum.net/guildwars/vabbi/vehtendivalley/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 43 + }, + new Entry + { + Map = Map.YahnurMarketOutpost, + Url = "http://bloogum.net/guildwars/vabbi/yahnurmarket/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.ForumHighlands, + Url = "http://bloogum.net/guildwars/vabbi/forumhighlands/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 52 + }, + new Entry + { + Map = Map.TiharkOrchard, + Url = "http://bloogum.net/guildwars/vabbi/tiharkorchard/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.ResplendentMakuun, + Url = "http://bloogum.net/guildwars/vabbi/resplendentmakuun/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 46 + }, + new Entry + { + Map = Map.ResplendentMakuun2, + Url = "http://bloogum.net/guildwars/vabbi/resplendentmakuun/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 46 + }, + new Entry + { + Map = Map.BokkaAmphitheatre, + Url = "http://bloogum.net/guildwars/vabbi/bokkaamphitheatre/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.BokkaAmphitheatreNOX, + Url = "http://bloogum.net/guildwars/vabbi/bokkaamphitheatre/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.HonurHillOutpost, + Url = "http://bloogum.net/guildwars/vabbi/honurhill/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.TheKodashBazaarOutpost, + Url = "http://bloogum.net/guildwars/vabbi/thekodashbazaar/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 18 + }, + new Entry + { + Map = Map.TheMirrorOfLyss, + Url = "http://bloogum.net/guildwars/vabbi/themirroroflyss/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 33 + }, + new Entry + { + Map = Map.TheMirrorOfLyss2, + Url = "http://bloogum.net/guildwars/vabbi/themirroroflyss/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 33 + }, + new Entry + { + Map = Map.DzagonurBastion, + Url = "http://bloogum.net/guildwars/vabbi/dzagonurbastion/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.WildernessOfBahdza, + Url = "http://bloogum.net/guildwars/vabbi/wildernessofbahdza/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 32 + }, + new Entry + { + Map = Map.DashaVestibule, + Url = "http://bloogum.net/guildwars/vabbi/dashavestibule/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.TheHiddenCityOfAhdashim, + Url = "http://bloogum.net/guildwars/vabbi/thehiddencityofadashim/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 36 + }, + new Entry + { + Map = Map.MihanuTownshipOutpost, + Url = "http://bloogum.net/guildwars/vabbi/mihanutownship/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.HoldingsOfChokhin, + Url = "http://bloogum.net/guildwars/vabbi/holdingsofchokhin/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 27 + }, + new Entry + { + Map = Map.GardenOfSeborhin, + Url = "http://bloogum.net/guildwars/vabbi/gardenofseborhin/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 34 + }, + new Entry + { + Map = Map.GrandCourtOfSebelkeh, + Url = "http://bloogum.net/guildwars/vabbi/grandcourtofsebelkeh/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 9 + }, + new Entry + { + Map = Map.JennursHorde, + Url = "http://bloogum.net/guildwars/vabbi/jennurshorde/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.VehjinMines, + Url = "http://bloogum.net/guildwars/vabbi/vehjinmines/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 29 + }, + new Entry + { + Map = Map.BasaltGrottoOutpost, + Url = "http://bloogum.net/guildwars/vabbi/basaltgrotto/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + }); + public static readonly Location TheDesolation = new( + Region.TheDesolation, + new List + { + new Entry + { + Map = Map.GateOfDesolation, + Url = "http://bloogum.net/guildwars/desolation/gateofdesolation/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.TheSulfurousWastes, + Url = "http://bloogum.net/guildwars/desolation/thesulfurouswastes/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 30 + }, + new Entry + { + Map = Map.RemainsOfSahlahja, + Url = "http://bloogum.net/guildwars/desolation/remainsofsahlahja/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.RemainsOfSahlahja, + Url = "http://bloogum.net/guildwars/desolation/dynastictombs/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.JokosDomain, + Url = "http://bloogum.net/guildwars/desolation/jokosdomain/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 34 + }, + new Entry + { + Map = Map.TheShatteredRavines, + Url = "http://bloogum.net/guildwars/desolation/theshatteredravines/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 31 + }, + new Entry + { + Map = Map.LairOfTheForgottenOutpost, + Url = "http://bloogum.net/guildwars/desolation/lairoftheforgotten/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.PoisonedOutcrops, + Url = "http://bloogum.net/guildwars/desolation/poisonedoutcrops/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 33 + }, + new Entry + { + Map = Map.BonePalaceOutpost, + Url = "http://bloogum.net/guildwars/desolation/bonepalace/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.TheAlkaliPan, + Url = "http://bloogum.net/guildwars/desolation/thealkalipan/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 24 + }, + new Entry + { + Map = Map.CrystalOverlook, + Url = "http://bloogum.net/guildwars/desolation/crystaloverlook/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 32 + }, + new Entry + { + Map = Map.RuinsOfMorah, + Url = "http://bloogum.net/guildwars/desolation/ruinsofmorah/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.TheRupturedHeart, + Url = "http://bloogum.net/guildwars/desolation/therupturedheart/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 18 + }, + new Entry + { + Map = Map.TheMouthOfTormentOutpost, + Url = "http://bloogum.net/guildwars/desolation/themouthoftorment/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + }); + public static readonly Location GateOfTorment = new( + Region.RealmOfTorment, + new List + { + new Entry + { + Map = Map.GateOfTormentOutpost, + Url = "http://bloogum.net/guildwars/torment/gateoftorment/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 15 + }, + new Entry + { + Map = Map.NightfallenJahai, + Url = "http://bloogum.net/guildwars/torment/nightfallenjahai/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 39 + }, + new Entry + { + Map = Map.GateOftheNightfallenLandsOutpost, + Url = "http://bloogum.net/guildwars/torment/gateofthenightfallenlands/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.NightfallenGarden, + Url = "http://bloogum.net/guildwars/torment/nightfallengarden/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 31 + }, + new Entry + { + Map = Map.GateOfPain, + Url = "http://bloogum.net/guildwars/torment/gateofpain/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + new Entry + { + Map = Map.DomainOfPain, + Url = "http://bloogum.net/guildwars/torment/domainofpain/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 30 + }, + new Entry + { + Map = Map.GateOfFearOutpost, + Url = "http://bloogum.net/guildwars/torment/gateoffear/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.DomainOfFear, + Url = "http://bloogum.net/guildwars/torment/domainoffear/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 28 + }, + new Entry + { + Map = Map.GateOfSecretsOutpost, + Url = "http://bloogum.net/guildwars/torment/gateofsecrets/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.DomainOfSecrets, + Url = "http://bloogum.net/guildwars/torment/domainofsecrets/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 32 + }, + new Entry + { + Map = Map.GateOfMadness, + Url = "http://bloogum.net/guildwars/torment/gateofmadness/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 2 + }, + new Entry + { + Map = Map.DepthsOfMadness, + Url = "http://bloogum.net/guildwars/torment/depthsofmadness/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 46 + }, + new Entry + { + Map = Map.HeartOfAbaddon, + Url = "http://bloogum.net/guildwars/torment/heartofabaddon/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 11 + }, + new Entry + { + Map = Map.AbaddonsGate, + Url = "http://bloogum.net/guildwars/torment/abaddonsgate/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 10 + }, + new Entry + { + Map = Map.ThroneOfSecrets, + Url = "http://bloogum.net/guildwars/torment/throneofsecrets/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 9 + }, + new Entry + { + Map = Map.DomainOfAnguish, + Url = "http://bloogum.net/guildwars/torment/gateofanguish/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 4 + }, + }); + public static readonly Location BattleIsles = new( + Region.TheBattleIsles, + new List + { + new Entry + { + Map = Map.GreatTempleOfBalthazarOutpost, + Url = "http://bloogum.net/guildwars/battleisles/greattempleofbalthazar/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 6 + }, + new Entry + { + Map = Map.IsleOfTheNameless, + Url = "http://bloogum.net/guildwars/battleisles/isleofthenameless/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 22 + }, + new Entry + { + Map = Map.IsleOfTheNamelessPvP, + Url = "http://bloogum.net/guildwars/battleisles/isleofthenameless/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 22 + }, + new Entry + { + Map = Map.ZaishenMenagerieGrounds, + Url = "http://bloogum.net/guildwars/battleisles/zaishenmenageriegrounds/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 34 + }, + new Entry + { + Map = Map.ZaishenMenagerieOutpost, + Url = "http://bloogum.net/guildwars/battleisles/zaishenmenagerie/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 3 + }, + new Entry + { + Map = Map.HeroesAscentOutpost, + Url = "http://bloogum.net/guildwars/battleisles/heroesascent/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 7 + }, + new Entry + { + Map = Map.CodexArenaOutpost, + Url = "http://bloogum.net/guildwars/battleisles/codexarena/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 7 + }, + new Entry + { + Map = Map.RandomArenasOutpost, + Url = "http://bloogum.net/guildwars/battleisles/randomarenas/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.ZaishenChallengeOutpost, + Url = "http://bloogum.net/guildwars/battleisles/zaishenchallenge/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 10 + }, + new Entry + { + Map = Map.ZaishenEliteOutpost, + Url = "http://bloogum.net/guildwars/battleisles/zaishenelite/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 5 + }, + new Entry + { + Map = Map.EmbarkBeach, + Url = "http://bloogum.net/guildwars/battleisles/embarkbeach/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + }); + public static readonly Location GuildHalls = new( + Region.TheBattleIsles, + new List + { + new Entry + { + Map = Map.WarriorsIsle, + Url = "http://bloogum.net/guildwars/gh/warriorsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 20 + }, + new Entry + { + Map = Map.WarriorsIsleMission, + Url = "http://bloogum.net/guildwars/gh/warriorsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 20 + }, + new Entry + { + Map = Map.WarriorsIsleOutpost, + Url = "http://bloogum.net/guildwars/gh/warriorsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 20 + }, + new Entry + { + Map = Map.WizardsIsle, + Url = "http://bloogum.net/guildwars/gh/wizardsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 21 + }, + new Entry + { + Map = Map.WizardsIsleMission, + Url = "http://bloogum.net/guildwars/gh/wizardsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 21 + }, + new Entry + { + Map = Map.WizardsIsleOutpost, + Url = "http://bloogum.net/guildwars/gh/wizardsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 21 + }, + new Entry + { + Map = Map.IsleOfTheDeadGuildHall, + Url = "http://bloogum.net/guildwars/gh/isleofthedead/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 10 + }, + new Entry + { + Map = Map.IsleOfTheDeadGuildHallMission, + Url = "http://bloogum.net/guildwars/gh/isleofthedead/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 10 + }, + new Entry + { + Map = Map.IsleOfTheDeadGuildHallOutpost, + Url = "http://bloogum.net/guildwars/gh/isleofthedead/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 10 + }, + new Entry + { + Map = Map.FrozenIsle, + Url = "http://bloogum.net/guildwars/gh/frozenisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.FrozenIsleMission, + Url = "http://bloogum.net/guildwars/gh/frozenisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.FrozenIsleOutpost, + Url = "http://bloogum.net/guildwars/gh/frozenisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.HuntersIsle, + Url = "http://bloogum.net/guildwars/gh/huntersisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.HuntersIsleMission, + Url = "http://bloogum.net/guildwars/gh/huntersisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.HuntersIsleOutpost, + Url = "http://bloogum.net/guildwars/gh/huntersisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.DruidsIsle, + Url = "http://bloogum.net/guildwars/gh/druidsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 7 + }, + new Entry + { + Map = Map.DruidsIsleMission, + Url = "http://bloogum.net/guildwars/gh/druidsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 7 + }, + new Entry + { + Map = Map.DruidsIsleOutpost, + Url = "http://bloogum.net/guildwars/gh/druidsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 7 + }, + new Entry + { + Map = Map.NomadsIsle, + Url = "http://bloogum.net/guildwars/gh/nomadsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.NomadsIsleMission, + Url = "http://bloogum.net/guildwars/gh/nomadsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.NomadsIsleOutpost, + Url = "http://bloogum.net/guildwars/gh/nomadsisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.BurningIsle, + Url = "http://bloogum.net/guildwars/gh/burningisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 15 + }, + new Entry + { + Map = Map.BurningIsleMission, + Url = "http://bloogum.net/guildwars/gh/burningisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 15 + }, + new Entry + { + Map = Map.BurningIsleOutpost, + Url = "http://bloogum.net/guildwars/gh/burningisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 15 + }, + new Entry + { + Map = Map.IsleOfMeditation, + Url = "http://bloogum.net/guildwars/gh/isleofmeditation/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 16 + }, + new Entry + { + Map = Map.IsleOfMeditationMission, + Url = "http://bloogum.net/guildwars/gh/isleofmeditation/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 16 + }, + new Entry + { + Map = Map.IsleOfMeditationOutpost, + Url = "http://bloogum.net/guildwars/gh/isleofmeditation/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 16 + }, + new Entry + { + Map = Map.IsleOfJade, + Url = "http://bloogum.net/guildwars/gh/isleofjade/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.IsleOfJadeMission, + Url = "http://bloogum.net/guildwars/gh/isleofjade/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.IsleOfJadeOutpost, + Url = "http://bloogum.net/guildwars/gh/isleofjade/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.IsleOfWeepingStone, + Url = "http://bloogum.net/guildwars/gh/isleofweepingstone/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 17 + }, + new Entry + { + Map = Map.IsleOfWeepingStoneMission, + Url = "http://bloogum.net/guildwars/gh/isleofweepingstone/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 17 + }, + new Entry + { + Map = Map.IsleOfWeepingStoneOutpost, + Url = "http://bloogum.net/guildwars/gh/isleofweepingstone/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 17 + }, + new Entry + { + Map = Map.ImperialIsle, + Url = "http://bloogum.net/guildwars/gh/imperialisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.ImperialIsleMission, + Url = "http://bloogum.net/guildwars/gh/imperialisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.ImperialIsleOutpost, + Url = "http://bloogum.net/guildwars/gh/imperialisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 13 + }, + new Entry + { + Map = Map.UnchartedIsle, + Url = "http://bloogum.net/guildwars/gh/unchartedisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.UnchartedIsleMission, + Url = "http://bloogum.net/guildwars/gh/unchartedisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.UnchartedIsleOutpost, + Url = "http://bloogum.net/guildwars/gh/unchartedisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 14 + }, + new Entry + { + Map = Map.CorruptedIsle, + Url = "http://bloogum.net/guildwars/gh/corruptedisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.CorruptedIsleMission, + Url = "http://bloogum.net/guildwars/gh/corruptedisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.CorruptedIsleOutpost, + Url = "http://bloogum.net/guildwars/gh/corruptedisle/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 8 + }, + new Entry + { + Map = Map.IsleOfSolitude, + Url = "http://bloogum.net/guildwars/gh/isleofsolitude/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 11 + }, + new Entry + { + Map = Map.IsleOfSolitudeMission, + Url = "http://bloogum.net/guildwars/gh/isleofsolitude/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 11 + }, + new Entry + { + Map = Map.IsleOfSolitudeOutpost, + Url = "http://bloogum.net/guildwars/gh/isleofsolitude/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 11 + }, + new Entry + { + Map = Map.IsleOfWurms, + Url = "http://bloogum.net/guildwars/gh/isleofwurms/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.IsleOfWurmsMission, + Url = "http://bloogum.net/guildwars/gh/isleofwurms/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + }, + new Entry + { + Map = Map.IsleOfWurmsOutpost, + Url = "http://bloogum.net/guildwars/gh/isleofwurms/{ID}.jpg", + Credit = "http://bloogum.net/guildwars/", + IdFormat = "D2", + StartIndex = 1, + Count = 12 + } + }); + + public static List Locations { get; } = new List + { + AscalonPreSearing, + Ascalon, + NorthernShiverpeaks, + Kryta, + MaguumaJungle, + CrystalDesert, + SouthernShiverpeaks, + RingOfFireIslandChain, + FarShiverpeaks, + CharrHomelands, + TarnishedCoast, + DepthsOfTyria, + ShingJeaIsland, + KainengCity, + EchovaldForest, + JadeSea, + Istan, + Kourna, + Vabbi, + TheDesolation, + GateOfTorment, + BattleIsles, + GuildHalls + }; + + public Region Region { get; } + public List Entries { get; } = new(); + internal Location(Region region, List entries) + { + this.Region = region; + this.Entries = entries; + } +} diff --git a/Daybreak/Services/Bloogum/BloogumClient.cs b/Daybreak/Services/Screenshots/OnlinePictureClient.cs similarity index 69% rename from Daybreak/Services/Bloogum/BloogumClient.cs rename to Daybreak/Services/Screenshots/OnlinePictureClient.cs index 4b4ef06e..4debb9ab 100644 --- a/Daybreak/Services/Bloogum/BloogumClient.cs +++ b/Daybreak/Services/Screenshots/OnlinePictureClient.cs @@ -1,9 +1,11 @@ -using Daybreak.Models.Guildwars; -using Daybreak.Services.Bloogum.Models; +using Daybreak.Configuration.Options; +using Daybreak.Models.Guildwars; using Daybreak.Services.Images; using Daybreak.Services.Scanner; +using Daybreak.Services.Screenshots.Models; using Microsoft.Extensions.Logging; using System; +using System.Configuration; using System.Core.Extensions; using System.Extensions; using System.IO; @@ -13,37 +15,39 @@ using System.Threading.Tasks; using System.Windows.Media; -namespace Daybreak.Services.Bloogum; +namespace Daybreak.Services.Screenshots; -public sealed class BloogumClient : IBloogumClient +public sealed class OnlinePictureClient : IOnlinePictureClient { private const string CloudFlareCookieValue = "fcfd523b2470336531e47baff3d2c2d6a0e2412a.1689426482.1"; private const string CloudFlareCookieKey = "wschkid"; private const string CacheFolder = "Bloogum"; - private const string BaseAddress = "http://bloogum.net/guildwars"; private readonly IImageCache imageCache; private readonly IGuildwarsMemoryCache guildwarsMemoryCache; - private readonly IHttpClient httpClient; + private readonly IHttpClient httpClient; + private readonly ILiveOptions themeOptions; private readonly ILogger logger; - public BloogumClient( + public OnlinePictureClient( IImageCache imageCache, IGuildwarsMemoryCache guildwarsMemoryCache, - ILogger logger, - IHttpClient httpClient) + ILogger logger, + ILiveOptions themeOptions, + IHttpClient httpClient) { this.imageCache = imageCache.ThrowIfNull(); this.guildwarsMemoryCache = guildwarsMemoryCache.ThrowIfNull(); this.logger = logger.ThrowIfNull(); + this.themeOptions = themeOptions.ThrowIfNull(); this.httpClient = httpClient.ThrowIfNull(); this.httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Cookie", $"{CloudFlareCookieKey}={CloudFlareCookieValue}"); } - public async Task GetImage(bool localized) + public async Task<(ImageSource? Source, string Credit)> GetImage(bool localized) { - var uri = await this.GetImageUri(localized); - var localUri = Path.GetFullPath(Path.Combine(CacheFolder, uri)); + (var uri, var credit) = await this.GetImageUri(localized); + var localUri = Path.GetFullPath(Path.Combine(CacheFolder, uri)).Replace("http:\\", ""); if (!File.Exists(localUri)) { var imageStream = await this.GetRemoteImage(uri); @@ -56,10 +60,10 @@ public BloogumClient( imageStream.Dispose(); } - return await this.imageCache.GetImage(localUri); + return (await this.imageCache.GetImage(localUri), credit); } - private async Task GetImageUri(bool localized) + private async Task<(string Uri, string CreditText)> GetImageUri(bool localized) { if (!localized) { @@ -82,7 +86,7 @@ private async Task GetImageUri(bool localized) } var validLocations = Location.Locations.Where(l => l.Region == worldInfo!.Region).ToList(); - var validCategories = validLocations.SelectMany(l => l.Categories).Where(c => c.Map == worldInfo!.Map).ToList(); + var validCategories = validLocations.SelectMany(l => l.Entries).Where(c => c.Map == worldInfo!.Map).ToList(); if (validCategories.None()) { if (validLocations.None()) @@ -95,7 +99,7 @@ private async Task GetImageUri(bool localized) } var selectedCategory = validCategories[Random.Shared.Next(0, validCategories.Count)]; - if (selectedCategory.ImageCount == 0) + if (selectedCategory.Count == 0) { if (validLocations.None()) { @@ -106,27 +110,15 @@ private async Task GetImageUri(bool localized) return GetRandomScreenShot(location); } - var selectedLocation = Location.Locations.FirstOrDefault(l => l.Categories.Contains(selectedCategory)); - if (selectedLocation is null) - { - if (validLocations.None()) - { - return GetRandomScreenShot(); - } - - var location = validLocations[Random.Shared.Next(0, validLocations.Count)]; - return GetRandomScreenShot(location); - } - - return GetScreenshotName(selectedLocation, selectedCategory, Random.Shared.Next(0, selectedCategory.ImageCount)); + return GetScreenshotName(selectedCategory, Random.Shared.Next(selectedCategory.StartIndex ?? 0, (selectedCategory.Count + selectedCategory.StartIndex) ?? 0)); } private async Task GetRemoteImage(string url) { - this.logger.LogInformation($"Retrieving image from {BaseAddress}/{url}"); + this.logger.LogInformation($"Retrieving image from {url}"); try { - var response = await this.httpClient.GetAsync($"{BaseAddress}/{url}").ConfigureAwait(false); + var response = await this.httpClient.GetAsync($"{url}").ConfigureAwait(false); if (response.IsSuccessStatusCode) { this.logger.LogInformation("Received success status code"); @@ -154,30 +146,30 @@ private async Task GetImageUri(bool localized) return default; } } - catch(Exception e) + catch (Exception e) { this.logger.LogError(e.ToString()); return default; } } - private static string GetRandomScreenShot() + private static (string Uri, string CreditText) GetRandomScreenShot() { var location = Location.Locations[Random.Shared.Next(0, Location.Locations.Count)]; return GetRandomScreenShot(location); } - private static string GetRandomScreenShot(Location location) + private static (string Uri, string CreditText) GetRandomScreenShot(Location location) { - var category = location.Categories[Random.Shared.Next(0, location.Categories.Count)]; - var picture = Random.Shared.Next(0, category.ImageCount) + 1; + var category = location.Entries[Random.Shared.Next(0, location.Entries.Count)]; + var picture = Random.Shared.Next(0, category.Count ?? 0) + 1; - return GetScreenshotName(location, category, picture); + return GetScreenshotName(category, picture); } - private static string GetScreenshotName(Location location, Category category, int picture) + private static (string Uri, string CreditText) GetScreenshotName(Entry category, int picture) { - return $"{location.LocationName}/{category.CategoryName}/{picture:00}.jpg"; + return (category.Url?.Replace("{ID}", picture.ToString(category.IdFormat)) ?? string.Empty, category.Credit ?? string.Empty); } private static async Task CacheImage(string uri, Stream imageStream)