Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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();
            }
        }
Esempio n. 3
0
        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;
        }