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); }
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)); }
public AttackPlanFrom(AttackPlan plan, Village attacker, Unit slowestUnit) { Debug.Assert(slowestUnit != null); Plan = plan; Attacker = attacker; SlowestUnit = slowestUnit; }
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); }
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); } } } }
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); }
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)); } }
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); }
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); }
private void RemoveAttacker(AttackPlan plan, AttackPlanFrom attacker) { Debug.Assert(plan.Attacks.Contains(attacker)); ActiveAttacker = null; plan.RemoveAttack(attacker); }
public IEnumerable <Travelfun> GetAttackersFromYou(AttackPlan plan, Unit slowestUnit, VillageType?villageType) { return(GetAttackers(World.Default.You, plan, slowestUnit, villageType)); }
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); }
private void AddAttacker(AttackPlan plan, AttackPlanFrom attacker) { Debug.Assert(!plan.Attacks.Contains(attacker)); ActiveAttacker = attacker; plan.AddAttacker(attacker); }
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); } } } }
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); } }
public IEnumerable<Travelfun> GetAttackersFromYou(AttackPlan plan, Unit slowestUnit, VillageType? villageType) { return GetAttackers(World.Default.You, plan, slowestUnit, villageType); }
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; }
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); }
public void AttackSelect(object sender, AttackPlan plan) { var e = new AttackEventArgs(plan, null); AttackSelect(sender, e); }
public void AttackRemoveTarget(object sender, AttackPlan plan) { var e = new AttackEventArgs(plan, null); if (TargetRemoved != null) TargetRemoved(sender, e); }