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 00000000..adb149ce Binary files /dev/null and b/Daybreak/Resources/Snow1.png differ diff --git a/Daybreak/Resources/Snow2.png b/Daybreak/Resources/Snow2.png new file mode 100644 index 00000000..e2eac81a Binary files /dev/null and b/Daybreak/Resources/Snow2.png differ diff --git a/Daybreak/Resources/Snow3.png b/Daybreak/Resources/Snow3.png new file mode 100644 index 00000000..d3785f8e Binary files /dev/null and b/Daybreak/Resources/Snow3.png differ diff --git a/Daybreak/Resources/Snow4.png b/Daybreak/Resources/Snow4.png new file mode 100644 index 00000000..2b12d94e Binary files /dev/null and b/Daybreak/Resources/Snow4.png differ diff --git a/Daybreak/Services/Bloogum/IBloogumClient.cs b/Daybreak/Services/Bloogum/IBloogumClient.cs deleted file mode 100644 index 50084f36..00000000 --- a/Daybreak/Services/Bloogum/IBloogumClient.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; -using System.Windows.Media; - -namespace Daybreak.Services.Bloogum; - -public interface IBloogumClient -{ - Task 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)