コード例 #1
0
        private void EventPublisherOnTargetUpdated(object sender, AttackUpdateEventArgs e)
        {
            foreach (AttackPlanFrom attacker in e.AttackFrom.ToArray())
            {
                Debug.Assert(_plans.Contains(attacker.Plan));
                AttackPlan plan = _plans.Single(x => x == attacker.Plan);
                switch (e.Action)
                {
                case AttackUpdateEventArgs.ActionKind.Add:
                    AddAttacker(plan, attacker);
                    break;

                case AttackUpdateEventArgs.ActionKind.Delete:
                    RemoveAttacker(plan, attacker);
                    break;

                case AttackUpdateEventArgs.ActionKind.Update:
                    break;

                default:
                    Debug.Assert(false);
                    break;
                }
            }
            _map.Invalidate(false);
        }
コード例 #2
0
        public static string GetSinglePlanBbCodeExport(AttackPlan plan)
        {
            var exporter = new AttackPlanExporter(plan.Attacks);

            exporter.AddHeader(plan.Target.BbCode(), plan.ArrivalTime, plan.Comments);
            return(exporter.GetBbCodeExport(true));
        }
コード例 #3
0
ファイル: AttackPlanFrom.cs プロジェクト: kindam/TWTactics
        public AttackPlanFrom(AttackPlan plan, Village attacker, Unit slowestUnit)
        {
            Debug.Assert(slowestUnit != null);

            Plan = plan;
            Attacker = attacker;
            SlowestUnit = slowestUnit;
        }
コード例 #4
0
        public AttackPlanFrom(AttackPlan plan, Village attacker, Unit slowestUnit)
        {
            Debug.Assert(slowestUnit != null);

            Plan        = plan;
            Attacker    = attacker;
            SlowestUnit = slowestUnit;
        }
コード例 #5
0
        public IEnumerable <Travelfun> GetAttackersFromPool(AttackPlan plan, Unit slowestUnit, VillageType?villageType, out bool depleted)
        {
            var attackers = GetAttackers(_attackersPool, plan, slowestUnit, villageType).ToArray();

            _attackersPool.RemoveAll(attackers.Select(x => x.Village).Contains);

            depleted = !_attackersPool.Any();
            return(attackers);
        }
コード例 #6
0
        public override void ReadXml(XDocument doc)
        {
            XElement attackManipulator =
                doc.Descendants("Manipulator")
                .SingleOrDefault(manipulator => manipulator.Attribute("Type").Value == "Attack");

            if (attackManipulator != null)
            {
                // Settings
                var settingsNode = attackManipulator.Element("Plans");
                Debug.Assert(settingsNode != null);

                Func <string, bool, bool> readSetting = (settingName, defaultValue) =>
                {
                    XAttribute value = settingsNode.Attribute(settingName);
                    return(value != null?Convert.ToBoolean(value.Value) : defaultValue);
                };

                Settings.ShowOtherTargets           = readSetting("ShowOtherTargets", true);
                Settings.ShowOtherAttackers         = readSetting("ShowOtherAttackers", true);
                Settings.ShowIfNotActiveManipulator = readSetting("ShowIfNotActiveManipulator", true);
                Settings.ShowArrivalTimeWhenSentNow = readSetting("ShowArrivalTimeWhenSentNow", false);

                // AttackPlans
                var plans = attackManipulator.Descendants("Plan");
                foreach (XElement xmlPlan in plans)
                {
                    var plan = new AttackPlan(
                        World.Default.GetVillage(xmlPlan.Attribute("Target").Value),
                        DateTime.FromFileTimeUtc(long.Parse(xmlPlan.Attribute("ArrivalTime").Value)));

                    if (xmlPlan.Attribute("Comments") != null)
                    {
                        plan.Comments = xmlPlan.Attribute("Comments").Value;
                    }

                    if (plan.Target != null)
                    {
                        foreach (var attackerXml in xmlPlan.Descendants("Attacker"))
                        {
                            var slowestUnit = (UnitTypes)Enum.Parse(typeof(UnitTypes), attackerXml.Attribute("SlowestUnit").Value);
                            var attacker    = new AttackPlanFrom(
                                plan,
                                World.Default.GetVillage(attackerXml.Attribute("Attacker").Value),
                                WorldUnits.Default[slowestUnit]);

                            plan.AddAttacker(attacker);
                        }

                        _plans.Add(plan);
                    }
                }
            }
        }
コード例 #7
0
        public VillageContextMenu(Map map, Village village, Action onVillageTypeChangeDelegate = null)
        {
            _village = village;
            _map = map;
            _onVillageTypeChangeDelegate = onVillageTypeChangeDelegate;
            _attackPlan = World.Default.Map.Manipulators.AttackManipulator.GetPlan(_village, out _isActiveAttackPlan, out _attacker, false);

            _menu = JanusContextMenu.Create();

            AddAttackPlanItems();

            _menu.AddSeparator();

            if (map.Display.IsVisible(village))
            {
                _menu.AddCommand("Quick Details", OnPinPoint, Properties.Resources.LeftNavigation_QuickFind);
            }
            _menu.AddCommand("Pinpoint && Center", OnPinpointAndCenter, Properties.Resources.TeleportIcon);

            _menu.AddSeparator();
            _menu.AddSetVillageTypeCommand(OnVillageTypeChange, village);

            if (World.Default.Settings.Church)
            {
                var church = _map.Manipulators.ChurchManipulator.GetChurch(_village);
                AddChurchCommands(_menu, church, ChurchChange_Click);
            }

            if (village.HasPlayer)
            {
                _menu.AddSeparator();

                _menu.AddPlayerContextCommands(map, village.Player, false);

                if (village.HasTribe)
                {
                    _menu.AddTribeContextCommands(map, village.Player.Tribe);
                }

                if (village.PreviousVillageDetails != null && village.PreviousVillageDetails.Player != village.Player && village.PreviousVillageDetails.Player != null)
                {
                    var oldPlayer = World.Default.GetPlayer(village.PreviousVillageDetails.Player.Name);
                    _menu.AddPlayerNobledContextCommands(map, oldPlayer ?? village.PreviousVillageDetails.Player, true);
                }
            }

            _menu.AddSeparator();
            _menu.AddCommand("TWStats", OnTwStats);
            _menu.AddCommand("To clipboard", OnToClipboard, Properties.Resources.clipboard);
            _menu.AddCommand("BBCode", OnBbCode, Properties.Resources.clipboard);
        }
コード例 #8
0
        private IEnumerable <Travelfun> GetAttackers(IEnumerable <Village> searchIn, AttackPlan plan, Unit slowestUnit, VillageType?villageType)
        {
            Unit[]    acceptableSpeeds    = GetAcceptableSpeeds(slowestUnit);
            Village[] villagesAlreadyUsed =
                GetPlans().SelectMany(x => x.Attacks)
                .Select(x => x.Attacker)
                .ToArray();

            var matchingVillages =
                (from village in searchIn
                 where !villagesAlreadyUsed.Contains(village)
                 select village);

            if (villageType != null)
            {
                matchingVillages = matchingVillages.Where(x => x.Type.HasFlag(villageType));
            }

            var villagesWithAllSpeeds =
                from village in matchingVillages
                from speed in acceptableSpeeds
                let travelTime = Village.TravelTime(plan.Target, village, speed)
                                 select new Travelfun
            {
                Village              = village,
                Speed                = speed,
                TravelTime           = travelTime,
                TimeBeforeNeedToSend = plan.ArrivalTime - World.Default.Settings.ServerTime.Add(travelTime)
            };

            var villagesWithBestSpeed =
                villagesWithAllSpeeds
                .GroupBy(x => x.Village)
                .Select(x => GetBestSpeedMatch(x.ToList()));

            var villages =
                villagesWithBestSpeed
                .OrderBy(x => x.TimeBeforeNeedToSend)
                .ToArray();

            if (!villages.Any(x => x.TimeBeforeNeedToSend.TotalSeconds > AutoFindMinimumAmountOfSecondsLeft))
            {
                return(villages.OrderByDescending(x => x.TimeBeforeNeedToSend).Take(AutoFindAmountOfAttackersWhenNone));
            }
            else
            {
                return(villages.Where(x => x.TimeBeforeNeedToSend.TotalSeconds > AutoFindMinimumAmountOfSecondsLeft).Take(AutoFindAmountOfAttackers));
            }
        }
コード例 #9
0
        public AttackPlan GetPlan(Village village, out AttackPlanFrom attacker, bool cycleVillage)
        {
            AttackPlan asTarget = GetExistingPlan(village, cycleVillage);

            if (asTarget != null)
            {
                attacker = null;
                return(asTarget);
            }

            AttackPlanFrom asAttacker = GetAttacker(village);

            if (asAttacker != null)
            {
                attacker = asAttacker;
                return(asAttacker.Plan);
            }

            attacker = null;
            return(null);
        }
コード例 #10
0
 public static string GetSinglePlanTextExport(AttackPlan plan)
 {
     var exporter = new AttackPlanExporter(plan.Attacks);
     exporter.AddHeader(plan.Target.ToString(), plan.ArrivalTime, plan.Comments);
     return exporter.GetTextExport(true);
 }
コード例 #11
0
 private void RemoveAttacker(AttackPlan plan, AttackPlanFrom attacker)
 {
     Debug.Assert(plan.Attacks.Contains(attacker));
     ActiveAttacker = null;
     plan.RemoveAttack(attacker);
 }
コード例 #12
0
 public IEnumerable <Travelfun> GetAttackersFromYou(AttackPlan plan, Unit slowestUnit, VillageType?villageType)
 {
     return(GetAttackers(World.Default.You, plan, slowestUnit, villageType));
 }
コード例 #13
0
        protected override SuperTipSettings BuildTooltip(Village village)
        {
            AttackPlanFrom attacker;
            AttackPlan     plan = _attacker.GetPlan(village, out attacker, false);

            if (plan == null)
            {
                return(base.BuildTooltip(village));
            }

            var settings = new SuperTipSettings();

            settings.ToolTipStyle = ToolTipStyle.Standard;
            settings.HeaderImage  = Properties.Resources.FlagGreen;

            var str = new System.Text.StringBuilder();

            if (attacker == null)
            {
                settings.HeaderText = plan.Target.Tooltip.Title;
            }
            else
            {
                settings.HeaderText = attacker.Attacker.Tooltip.Title;

                str.AppendFormat(ControlsRes.AttackManipulatorManager_Tooltip_Target, plan.Target.Tooltip.Title);
                str.Append(Environment.NewLine);
            }
            str.AppendFormat(ControlsRes.AttackManipulatorManager_Tooltip_Points, Common.GetPrettyNumber(plan.Target.Points));
            str.Append(Environment.NewLine);
            str.AppendFormat(ControlsRes.AttackManipulatorManager_Tooltip_ArrivalDate, plan.ArrivalTime.GetPrettyDate());

            if (attacker != null)
            {
                settings.Image = attacker.SlowestUnit.Image;

                str.Append(Environment.NewLine);
                str.Append(Environment.NewLine);
                str.AppendFormat(ControlsRes.AttackManipulatorManager_Tooltip_TravelTime, attacker.TravelTime);
                str.Append(Environment.NewLine);
                str.AppendFormat(ControlsRes.AttackManipulatorManager_Tooltip_SendOn, attacker.FormattedSendDate());
            }
            else
            {
                str.Append(Environment.NewLine);
                str.Append(Environment.NewLine);
                if (!plan.Attacks.Any())
                {
                    str.AppendFormat("");
                    str.AppendLine();
                    str.AppendFormat("");

                    if (World.Default.You.Empty)
                    {
                        str.AppendLine();
                        str.AppendLine();
                        str.Append(ControlsRes.AttackManipulatorManager_Tooltip_Help_NoYou);
                    }
                }
                else
                {
                    IOrderedEnumerable <AttackPlanFrom> attacks = plan.Attacks.OrderByDescending(x => x.TravelTime);

                    IEnumerable <IGrouping <Unit, AttackPlanFrom> > unitsSent;
                    if (plan.Attacks.Any(x => x.SlowestUnit.Type == UnitTypes.Snob))
                    {
                        settings.Image = WorldUnits.Default[UnitTypes.Snob].Image;
                        unitsSent      = attacks.GroupBy(x => x.SlowestUnit);
                    }
                    else
                    {
                        unitsSent = attacks.GroupBy(x => x.SlowestUnit);
                    }

                    foreach (var unitSent in unitsSent)
                    {
                        str.AppendFormat("{0}: {1}", unitSent.Key.Name, unitSent.Count());
                        str.AppendLine();
                    }

                    if (!string.IsNullOrWhiteSpace(plan.Comments))
                    {
                        settings.FooterText  = plan.Comments;
                        settings.FooterImage = Other.Note;
                    }
                }
            }

            settings.Text = str.ToString();

            if (!string.IsNullOrEmpty(village.Tooltip.Footer))
            {
                if (!string.IsNullOrWhiteSpace(settings.FooterText))
                {
                    settings.FooterText += "\n\n";
                    settings.FooterText += village.Tooltip.Footer;
                }
                else
                {
                    settings.FooterText = village.Tooltip.Footer;
                }

                settings.FooterImage = village.Tooltip.FooterImage;
            }
            return(settings);
        }
コード例 #14
0
ファイル: AttackManipulator.cs プロジェクト: kindam/TWTactics
 private void RemoveAttacker(AttackPlan plan, AttackPlanFrom attacker)
 {
     Debug.Assert(plan.Attacks.Contains(attacker));
     ActiveAttacker = null;
     plan.RemoveAttack(attacker);
 }
コード例 #15
0
ファイル: AttackManipulator.cs プロジェクト: kindam/TWTactics
 private void AddAttacker(AttackPlan plan, AttackPlanFrom attacker)
 {
     Debug.Assert(!plan.Attacks.Contains(attacker));
     ActiveAttacker = attacker;
     plan.AddAttacker(attacker);
 }
コード例 #16
0
ファイル: AttackManipulator.cs プロジェクト: kindam/TWTactics
        public override void ReadXml(XDocument doc)
        {
            XElement attackManipulator =
                doc.Descendants("Manipulator")
                   .SingleOrDefault(manipulator => manipulator.Attribute("Type").Value == "Attack");

            if (attackManipulator != null)
            {
                // Settings
                var settingsNode = attackManipulator.Element("Plans");
                Debug.Assert(settingsNode != null);

                Func<string, bool, bool> readSetting = (settingName, defaultValue) =>
                {
                    XAttribute value = settingsNode.Attribute(settingName);
                    return value != null ? Convert.ToBoolean(value.Value) : defaultValue;
                };

                Settings.ShowOtherTargets = readSetting("ShowOtherTargets", true);
                Settings.ShowOtherAttackers = readSetting("ShowOtherAttackers", true);
                Settings.ShowIfNotActiveManipulator = readSetting("ShowIfNotActiveManipulator", true);
                Settings.ShowArrivalTimeWhenSentNow = readSetting("ShowArrivalTimeWhenSentNow", false);

                // AttackPlans
                var plans = attackManipulator.Descendants("Plan");
                foreach (XElement xmlPlan in plans)
                {
                    var plan = new AttackPlan(
                        World.Default.GetVillage(xmlPlan.Attribute("Target").Value),
                        DateTime.FromFileTimeUtc(long.Parse(xmlPlan.Attribute("ArrivalTime").Value)));

                    if (xmlPlan.Attribute("Comments") != null)
                    {
                        plan.Comments = xmlPlan.Attribute("Comments").Value;
                    }

                    if (plan.Target != null)
                    {
                        foreach (var attackerXml in xmlPlan.Descendants("Attacker"))
                        {
                            var slowestUnit = (UnitTypes)Enum.Parse(typeof(UnitTypes), attackerXml.Attribute("SlowestUnit").Value);
                            var attacker = new AttackPlanFrom(
                                plan,
                                World.Default.GetVillage(attackerXml.Attribute("Attacker").Value),
                                WorldUnits.Default[slowestUnit]);

                            plan.AddAttacker(attacker);
                        }

                        _plans.Add(plan);
                    }
                }
            }
        }
コード例 #17
0
 private void AddAttacker(AttackPlan plan, AttackPlanFrom attacker)
 {
     Debug.Assert(!plan.Attacks.Contains(attacker));
     ActiveAttacker = attacker;
     plan.AddAttacker(attacker);
 }
コード例 #18
0
        private IEnumerable<Travelfun> GetAttackers(IEnumerable<Village> searchIn, AttackPlan plan, Unit slowestUnit, VillageType? villageType)
        {
            Unit[] acceptableSpeeds = GetAcceptableSpeeds(slowestUnit);
            Village[] villagesAlreadyUsed =
                GetPlans().SelectMany(x => x.Attacks)
                    .Select(x => x.Attacker)
                    .ToArray();

            var matchingVillages =
                (from village in searchIn
                 where !villagesAlreadyUsed.Contains(village)
                 select village);

            if (villageType != null)
            {
                matchingVillages = matchingVillages.Where(x => x.Type.HasFlag(villageType));
            }

            var villagesWithAllSpeeds =
                from village in matchingVillages
                from speed in acceptableSpeeds
                let travelTime = Village.TravelTime(plan.Target, village, speed)
                select new Travelfun
                {
                    Village = village,
                    Speed = speed,
                    TravelTime = travelTime,
                    TimeBeforeNeedToSend = plan.ArrivalTime - World.Default.Settings.ServerTime.Add(travelTime)
                };

            var villagesWithBestSpeed =
                villagesWithAllSpeeds
                    .GroupBy(x => x.Village)
                    .Select(x => GetBestSpeedMatch(x.ToList()));

            var villages =
                villagesWithBestSpeed
                    .OrderBy(x => x.TimeBeforeNeedToSend)
                    .ToArray();

            if (!villages.Any(x => x.TimeBeforeNeedToSend.TotalSeconds > AutoFindMinimumAmountOfSecondsLeft))
            {
                return villages.OrderByDescending(x => x.TimeBeforeNeedToSend).Take(AutoFindAmountOfAttackersWhenNone);
            }
            else
            {
                return villages.Where(x => x.TimeBeforeNeedToSend.TotalSeconds > AutoFindMinimumAmountOfSecondsLeft).Take(AutoFindAmountOfAttackers);
            }
        }
コード例 #19
0
 public IEnumerable<Travelfun> GetAttackersFromYou(AttackPlan plan, Unit slowestUnit, VillageType? villageType)
 {
     return GetAttackers(World.Default.You, plan, slowestUnit, villageType);
 }
コード例 #20
0
        public IEnumerable<Travelfun> GetAttackersFromPool(AttackPlan plan, Unit slowestUnit, VillageType? villageType, out bool depleted)
        {
            var attackers = GetAttackers(_attackersPool, plan, slowestUnit, villageType).ToArray();
            _attackersPool.RemoveAll(attackers.Select(x => x.Village).Contains);

            depleted = !_attackersPool.Any();
            return attackers;
        }
コード例 #21
0
        protected internal override bool MouseDownCore(MapMouseEventArgs e)
        {
            IsAddingTarget = false;
            if (e.Village != null)
            {
                AttackPlan       existingPlan    = GetExistingPlan(e.Village, true);
                AttackPlanFrom[] existingAttacks = GetAttackers(e.Village).ToArray();

                if (e.MouseEventArgs.Button == MouseButtons.Left)
                {
                    if (existingPlan == null)
                    {
                        if (!existingAttacks.Any())
                        {
                            _map.EventPublisher.AttackAddTarget(this, e.Village);
                        }
                        else
                        {
                            if (!existingAttacks.Contains(ActiveAttacker))
                            {
                                _map.EventPublisher.AttackSelect(this, existingAttacks.First());
                            }
                            else
                            {
                                // Already selected village is perhaps used in multiple plans
                                if (existingAttacks.Length == 1)
                                {
                                    return(false);
                                }
                                else
                                {
                                    // Cycle through the attackers
                                    AttackPlanFrom selectAttacker;
                                    if (ActiveAttacker == null || !existingAttacks.Contains(ActiveAttacker) || existingAttacks.Last() == ActiveAttacker)
                                    {
                                        selectAttacker = existingAttacks.First();
                                    }
                                    else
                                    {
                                        selectAttacker = existingAttacks.SkipWhile(x => x != ActiveAttacker).Take(2).Last();
                                    }
                                    _map.EventPublisher.AttackSelect(this, selectAttacker);
                                }
                            }
                        }
                    }
                    else
                    {
                        if (existingPlan == ActivePlan && ActivePlan != null)
                        {
                            var existingAttack = existingAttacks.FirstOrDefault();
                            if (existingAttack != ActiveAttacker)
                            {
                                if (existingAttack == null)
                                {
                                    _map.EventPublisher.AttackSelect(this, ActivePlan);
                                }
                                else
                                {
                                    _map.EventPublisher.AttackSelect(this, existingAttack);
                                }
                            }
                            else
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            _map.EventPublisher.AttackSelect(this, existingPlan);
                        }
                    }
                    return(true);
                }
                else if (e.MouseEventArgs.Button == MouseButtons.Right)
                {
                    if (e.Village.Player == World.Default.You && ActivePlan != null)
                    {
                        if (e.Village == ActivePlan.Target)
                        {
                            // Can't add attacker to target
                            return(false);
                        }
                        else
                        {
                            if (existingAttacks.Any())
                            {
                                // Show contextmenu instead
                                return(false);
                            }
                            else
                            {
                                // Add new attacker
                                var attackEventArgs = AttackUpdateEventArgs.AddAttackFrom(new AttackPlanFrom(ActivePlan, e.Village, WorldUnits.Default[World.Default.Map.Manipulators.AttackManipulator.DefaultSpeed]));
                                _map.EventPublisher.AttackUpdateTarget(this, attackEventArgs);
                                IsAddingTarget = true;
                                return(true);
                            }
                        }
                    }
                }
            }
            return(false);
        }
コード例 #22
0
ファイル: Publisher.cs プロジェクト: kindam/TWTactics
 public void AttackSelect(object sender, AttackPlan plan)
 {
     var e = new AttackEventArgs(plan, null);
     AttackSelect(sender, e);
 }
コード例 #23
0
ファイル: Publisher.cs プロジェクト: kindam/TWTactics
 public void AttackRemoveTarget(object sender, AttackPlan plan)
 {
     var e = new AttackEventArgs(plan, null);
     if (TargetRemoved != null)
         TargetRemoved(sender, e);
 }