public MapMenuOption(MapMenu parent, Object itemObject = null) { Parent = parent; OptionObject = itemObject; if (OptionObject != null) { if (OptionObject.GetType() == typeof(string)) Text = (OptionObject as string); if (OptionObject.GetType() == typeof(Entity)) Text = (OptionObject as Entity).Name + " (" + (OptionObject as Entity).Race + ")"; if (OptionObject.GetType() == typeof(List<Battle>)) { List<Battle> battles = OptionObject as List<Battle>; Text = "Battles: " + battles.Count; SubMenu = new MapMenu(Parent.Map); SubMenu.AddOption("Total Deaths: " + battles.Sum(battle => battle.AttackerDeathCount + battle.DefenderDeathCount)); SubMenu.Options.Last().Selectable = false; SubMenu.AddOption("Notable: " + battles.Count(battle => battle.Notable)); SubMenu.Options.Last().Selectable = false; if (battles.Count <= 10) foreach (Battle battle in battles) SubMenu.AddOption(battle); else { SubMenu.AddOption("Load Battles"); SubMenu.Options.Last().OptionObject = battles; } } if (OptionObject.GetType() == typeof(Battle)) { Battle battle = OptionObject as Battle; Text = battle.Name + " (Battle)"; SubMenu = new MapMenu(Parent.Map); SubMenu.AddOption("Year: " + battle.StartYear); SubMenu.AddOption(battle.Attacker.Name + " (A)"); SubMenu.Options.Last().OptionObject = battle.Attacker; SubMenu.AddOption(battle.Defender.Name + " (D)"); SubMenu.Options.Last().OptionObject = battle.Defender; SubMenu.AddOption("Combatants: " + (battle.NotableAttackers.Count + battle.AttackerSquads.Sum(squad => squad.Numbers)) + " / " + (battle.NotableDefenders.Count + battle.DefenderSquads.Sum(squad => squad.Numbers)) + " Kills: " + battle.DefenderDeathCount + " / " + battle.AttackerDeathCount); SubMenu.Options.ForEach(option => option.Selectable = false); if (battle.ParentCollection != null) SubMenu.AddOption(battle.ParentCollection); //SubMenu.AddOption("Deaths: " + (battle.AttackerDeathCount + battle.DefenderDeathCount)); } if (OptionObject.GetType() == typeof(War)) { War war = OptionObject as War; Text = war.Name + " (War)"; SubMenu = new MapMenu(Parent.Map); string warYear = war.StartYear + " to "; if (war.EndYear == -1) warYear += "Present"; else warYear += war.EndYear; SubMenu.AddOption(warYear + " | Total Deaths: " + war.Collections.OfType<Battle>().Sum(battle => battle.AttackerDeathCount + battle.DefenderDeathCount)); SubMenu.AddOption(war.Attacker + " (A)"); SubMenu.AddOption(war.Defender + " (D)"); SubMenu.AddOption("Victories: " + war.AttackerVictories.OfType<Battle>().Count() + " / " + war.DefenderVictories.OfType<Battle>().Count() + " Kills: " + war.DefenderDeathCount + " / " + war.AttackerDeathCount); SubMenu.Options.ForEach(option => option.Selectable = false); } if (OptionObject.GetType() == typeof(Site)) { Site site = OptionObject as Site; Text = site.Name + " (" + site.Type + ")"; List<object> details = new List<object>(); details.Add(site.UntranslatedName); if (site.Populations.Count > 0) { details.Add("Populations: "); foreach (Population population in site.Populations) details.Add(" " + population.Count + " " + population.Race); } SubMenu = new MapMenu(Parent.Map); SubMenu.AddOptions(details); foreach (MapMenuOption option in SubMenu.Options) option.Selectable = false; } } SizeF stringSize; using (Bitmap temp = new Bitmap(1, 1)) using (Graphics measure = Graphics.FromImage(temp)) using (Font font = new Font(Parent.FontName, Parent.FontSize)) stringSize = measure.MeasureString(Text, font); Width = Convert.ToInt32(stringSize.Width) + 5; }
public MapPanel(Bitmap map, World world, DwarfTabControl dwarfTabControl, Object focusObject) { TabControl = dwarfTabControl; Map = map; World = world; FocusObject = focusObject; if (FocusObject != null && FocusObject.GetType() == typeof(World)) FocusObject = null; DisplayObjects = new List<Object>(); DoubleBuffered = true; Dock = DockStyle.Fill; //Anchor = AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; Source = new Rectangle(new Point(Center.X - (this.Width / 2), Center.Y - (this.Height / 2)), new Size(this.Width, this.Height)); HoverMenu = new MapMenu(this); ControlMenu = new MapMenu(this); ControlMenu.AddOptions(new List<object>() { "Zoom In", "Zoom Out", "Toggle Civs", "Toggle Sites", "Toggle Wars", "Toggle Battles", "Toggle Overlay", "Toggle Alt Map" }); ControlMenu.Open = true; YearMenu = new MapMenu(this); YearMenu.AddOptions(new List<object>() { "+1000", "+100", "+10", "+1", "-1", "-10", "-100", "-1000" }); YearMenu.Open = true; OptionsMenu = new MapMenuHorizontal(this); OptionsMenu.Open = true; OptionsMenu.AddOptions(new List<object>() { "Load Alternate Map...", "Overlays" }); MapMenu overlayOptions = new MapMenu(this); overlayOptions.AddOptions(new List<object>() { "Battles", "Battles (Notable)", "Battle Deaths", "Beast Attacks", "Site Population...", "Site Events", "Site Events (Filtered)" }); overlayOptions.Options.ForEach(option => option.OptionObject = "Overlay"); OptionsMenu.Options.Last().SubMenu = overlayOptions; AltMapTransparency.Minimum = 0; AltMapTransparency.Maximum = 100; AltMapTransparency.AutoSize = false; AltMapTransparency.Size = new System.Drawing.Size(150, 25); AltMapTransparency.TickFrequency = 1; AltMapTransparency.TickStyle = TickStyle.None; AltMapTransparency.BackColor = YearMenu.MenuColor; AltMapTransparency.Visible = false; AltMapTransparency.Scroll += ChangeAltMapTransparency; AltMapTransparency.Value = 100; Controls.Add(AltMapTransparency); //AltMapTransparency.Anchor = AnchorStyles.Bottom; AltMapTransparency.Location = new Point(MiniMapAreaSideLength + YearMenu.MenuBox.Width, this.Height - AltMapTransparency.Height); MinYear = World.Eras.First().StartYear; if (MinYear == -1) MinYear = 0; MaxYear = CurrentYear = World.Eras.Last().EndYear; //Set Map Year if Entity has no active sites so they show on map if (FocusObject != null && FocusObject.GetType() == typeof(Entity) && (FocusObject as Entity).SiteHistory.Count(sitePeriod => sitePeriod.EndYear == -1) == 0) CurrentYear = (FocusObject as Entity).SiteHistory.Max(sitePeriod => sitePeriod.EndYear) - 1; else if (FocusObject != null && FocusObject.GetType() == typeof(Battle)) CurrentYear = MinYear = MaxYear = (focusObject as Battle).StartYear; else if (FocusObject != null && FocusObject.GetType() == typeof(SiteConquered)) CurrentYear = MinYear = MaxYear = (FocusObject as SiteConquered).StartYear; if (focusObject != null && focusObject.GetType() == typeof(List<object>)) { FocusObjects = (focusObject as List<object>).GroupBy(item => item).Select(item => item.Key).ToList(); if (FocusObjects.First().GetType() == typeof(Battle)) Battles.AddRange(FocusObjects.Cast<Battle>()); else DisplayObjects.AddRange(FocusObjects); } else FocusObjects = new List<object>(); if (focusObject != null && focusObject.GetType() != typeof(Battle)) DisplayObjects.Add(focusObject); if (focusObject != null && focusObject.GetType() == typeof(Battle)) Battles.Add(focusObject as Battle); if (FocusObject != null && FocusObject.GetType() == typeof(War)) { War war = FocusObject as War; MinYear = CurrentYear = war.StartYear; if (war.EndYear != -1) MaxYear = war.EndYear; UpdateWarDisplay(); foreach (Battle battle in war.Collections.OfType<Battle>()) Battles.Add(battle); //DisplayObjects.Insert(battle); } //Center and zoom map on focusObject of the map if (FocusObject == null || FocusObjects.Count > 0) Center = new Point(Map.Width / 2, Map.Height / 2); else if (FocusObject.GetType() == typeof(Site)) { Site site = (focusObject as Site); Center = new Point(site.Coordinates.X * TileSize + TileSize / 2, site.Coordinates.Y * TileSize + TileSize / 2); ZoomCurrent = 0.85; } else if (FocusObject.GetType() == typeof(Entity) || FocusObject.GetType() == typeof(War) || FocusObject.GetType() == typeof(Battle) || FocusObject.GetType() == typeof(SiteConquered)) //Calculate zoom rectangle for civs / wars / battles { List<Entity> entities = new List<Entity>(); if (FocusObject.GetType() == typeof(Entity)) entities.Add(FocusObject as Entity); else if (FocusObject.GetType() == typeof(War)) { entities.Add((FocusObject as War).Attacker); entities.Add((FocusObject as War).Defender); } ZoomBounds = new Rectangle(-1, -1, -1, -1); foreach (Entity displayEntity in entities) foreach (OwnerPeriod sitePeriod in displayEntity.SiteHistory.Where(site => ((site.StartYear == CurrentYear && site.StartCause != "took over") || site.StartYear < CurrentYear) && (((site.EndYear >= CurrentYear) || site.EndYear == -1)))) { if (ZoomBounds.Top == -1) { ZoomBounds.Y = ZoomBounds.Height = sitePeriod.Site.Coordinates.Y; ZoomBounds.X = ZoomBounds.Width = sitePeriod.Site.Coordinates.X; } if (sitePeriod.Site.Coordinates.Y < ZoomBounds.Y) ZoomBounds.Y = sitePeriod.Site.Coordinates.Y; if (sitePeriod.Site.Coordinates.X < ZoomBounds.X) ZoomBounds.X = sitePeriod.Site.Coordinates.X; if (sitePeriod.Site.Coordinates.Y > ZoomBounds.Height) ZoomBounds.Height = sitePeriod.Site.Coordinates.Y; if (sitePeriod.Site.Coordinates.X > ZoomBounds.Width) ZoomBounds.Width = sitePeriod.Site.Coordinates.X; } if (FocusObject.GetType() == typeof(War)) { War war = FocusObject as War; foreach (Battle battle in war.Collections.OfType<Battle>()) { if (ZoomBounds.Top == -1) { ZoomBounds.Y = ZoomBounds.Height = battle.Coordinates.Y; ZoomBounds.X = ZoomBounds.Width = battle.Coordinates.X; } if (battle.Coordinates.Y < ZoomBounds.Y) ZoomBounds.Y = battle.Coordinates.Y; if (battle.Coordinates.X < ZoomBounds.X) ZoomBounds.X = battle.Coordinates.X; if (battle.Coordinates.Y > ZoomBounds.Height) ZoomBounds.Height = battle.Coordinates.Y; if (battle.Coordinates.X > ZoomBounds.Width) ZoomBounds.Width = battle.Coordinates.X; } } if (FocusObject.GetType() == typeof(Battle) || FocusObject.GetType() == typeof(SiteConquered)) { Battle battle; if (FocusObject.GetType() == typeof(Battle)) battle = FocusObject as Battle; else battle = (FocusObject as SiteConquered).Battle; Center = new Point(battle.Coordinates.X * TileSize + TileSize / 2, battle.Coordinates.Y * TileSize + TileSize / 2); ZoomBounds.Y = ZoomBounds.Height = battle.Coordinates.Y; ZoomBounds.X = ZoomBounds.Width = battle.Coordinates.X; Site attackerSite = GetClosestSite(battle.Attacker, battle.Coordinates); if (attackerSite.Coordinates.Y < ZoomBounds.Y) ZoomBounds.Y = attackerSite.Coordinates.Y; if (attackerSite.Coordinates.X < ZoomBounds.X) ZoomBounds.X = attackerSite.Coordinates.X; if (attackerSite.Coordinates.Y > ZoomBounds.Height) ZoomBounds.Height = attackerSite.Coordinates.Y; if (attackerSite.Coordinates.X > ZoomBounds.Width) ZoomBounds.Width = attackerSite.Coordinates.X; Site defenderSite = GetClosestSite(battle.Defender, battle.Coordinates); if (defenderSite.Coordinates.Y < ZoomBounds.Y) ZoomBounds.Y = defenderSite.Coordinates.Y; if (defenderSite.Coordinates.X < ZoomBounds.X) ZoomBounds.X = defenderSite.Coordinates.X; if (defenderSite.Coordinates.Y > ZoomBounds.Height) ZoomBounds.Height = defenderSite.Coordinates.Y; if (defenderSite.Coordinates.X > ZoomBounds.Width) ZoomBounds.Width = defenderSite.Coordinates.X; } ZoomBounds.X = ZoomBounds.X * TileSize - TileSize / 2 - TileSize; ZoomBounds.Width = ZoomBounds.Width * TileSize + TileSize / 2 + TileSize; ZoomBounds.Y = ZoomBounds.Y * TileSize - TileSize / 2 - TileSize; ZoomBounds.Height = ZoomBounds.Height * TileSize + TileSize / 2 + TileSize; Center.X = (ZoomBounds.Left + ZoomBounds.Width) / 2; Center.Y = (ZoomBounds.Top + ZoomBounds.Height) / 2; ZoomToBoundsOnFirstPaint = true; } else Center = new Point(0, 0); BattleLocations = Battles.GroupBy(battle => battle.Coordinates).Select(battle => battle.Key).ToList(); GenerateCivPaths(); Minimap = world.MiniMap; UpdateWarDisplay(); Invalidate(); if (MapUtil.AlternateMap != null) { AlternateMap = MapUtil.AlternateMap; AltMapAlpha = MapUtil.AltMapAlpha; AltMapTransparency.Value = (int)(AltMapAlpha * 100); AlternateMapToggled = false; ToggleAlternateMap(); } }
public MapMenuOption(MapMenu parent, Object itemObject = null) { Parent = parent; OptionObject = itemObject; if (OptionObject != null) { if (OptionObject.GetType() == typeof(string)) { Text = (OptionObject as string); } if (OptionObject.GetType() == typeof(Entity)) { Text = (OptionObject as Entity).Name + " (" + (OptionObject as Entity).Race + ")"; } if (OptionObject.GetType() == typeof(List <Battle>)) { List <Battle> battles = OptionObject as List <Battle>; Text = "Battles: " + battles.Count; SubMenu = new MapMenu(Parent.Map); SubMenu.AddOption("Total Deaths: " + battles.Sum(battle => battle.AttackerDeathCount + battle.DefenderDeathCount)); SubMenu.Options.Last().Selectable = false; SubMenu.AddOption("Notable: " + battles.Count(battle => battle.Notable)); SubMenu.Options.Last().Selectable = false; if (battles.Count <= 10) { foreach (Battle battle in battles) { SubMenu.AddOption(battle); } } else { SubMenu.AddOption("Load Battles"); SubMenu.Options.Last().OptionObject = battles; } } if (OptionObject.GetType() == typeof(Battle)) { Battle battle = OptionObject as Battle; Text = battle.Name + " (Battle)"; SubMenu = new MapMenu(Parent.Map); SubMenu.AddOption("Year: " + battle.StartYear); SubMenu.AddOption(battle.Attacker.Name + " (A)"); SubMenu.Options.Last().OptionObject = battle.Attacker; SubMenu.AddOption(battle.Defender.Name + " (D)"); SubMenu.Options.Last().OptionObject = battle.Defender; SubMenu.AddOption("Combatants: " + (battle.NotableAttackers.Count + battle.AttackerSquads.Sum(squad => squad.Numbers)) + " / " + (battle.NotableDefenders.Count + battle.DefenderSquads.Sum(squad => squad.Numbers)) + " Kills: " + battle.DefenderDeathCount + " / " + battle.AttackerDeathCount); SubMenu.Options.ForEach(option => option.Selectable = false); if (battle.ParentCollection != null) { SubMenu.AddOption(battle.ParentCollection); } //SubMenu.AddOption("Deaths: " + (battle.AttackerDeathCount + battle.DefenderDeathCount)); } if (OptionObject.GetType() == typeof(War)) { War war = OptionObject as War; Text = war.Name + " (War)"; SubMenu = new MapMenu(Parent.Map); string warYear = war.StartYear + " to "; if (war.EndYear == -1) { warYear += "Present"; } else { warYear += war.EndYear; } SubMenu.AddOption(warYear + " | Total Deaths: " + war.Collections.OfType <Battle>().Sum(battle => battle.AttackerDeathCount + battle.DefenderDeathCount)); SubMenu.AddOption(war.Attacker + " (A)"); SubMenu.AddOption(war.Defender + " (D)"); SubMenu.AddOption("Victories: " + war.AttackerVictories.OfType <Battle>().Count() + " / " + war.DefenderVictories.OfType <Battle>().Count() + " Kills: " + war.DefenderDeathCount + " / " + war.AttackerDeathCount); SubMenu.Options.ForEach(option => option.Selectable = false); } if (OptionObject.GetType() == typeof(Site)) { Site site = OptionObject as Site; Text = site.Name + " (" + site.Type + ")"; List <object> details = new List <object>(); details.Add(site.UntranslatedName); if (site.Populations.Count > 0) { details.Add("Populations: "); foreach (Population population in site.Populations) { details.Add(" " + population.Count + " " + population.Race); } } SubMenu = new MapMenu(Parent.Map); SubMenu.AddOptions(details); foreach (MapMenuOption option in SubMenu.Options) { option.Selectable = false; } } } SizeF stringSize; using (Bitmap temp = new Bitmap(1, 1)) using (Graphics measure = Graphics.FromImage(temp)) using (Font font = new Font(Parent.FontName, Parent.FontSize)) stringSize = measure.MeasureString(Text, font); Width = Convert.ToInt32(stringSize.Width) + 5; }