public void RefreshIcons() { icons = new Dictionary <Rectangle, ProductionIcon>(); var producer = CurrentQueue != null?CurrentQueue.MostLikelyProducer() : default(TraitPair <Production>); if (CurrentQueue == null || producer.Trait == null) { if (DisplayedIconCount != 0) { OnIconCountChanged(DisplayedIconCount, 0); DisplayedIconCount = 0; } return; } var oldIconCount = DisplayedIconCount; DisplayedIconCount = 0; var ks = Game.Settings.Keys; var rb = RenderBounds; var faction = producer.Trait.Faction; foreach (var item in AllBuildables.Skip(IconRowOffset * Columns).Take(MaxIconRowOffset * Columns)) { var x = DisplayedIconCount % Columns; var y = DisplayedIconCount / Columns; var rect = new Rectangle(rb.X + x * (IconSize.X + IconMargin.X), rb.Y + y * (IconSize.Y + IconMargin.Y), IconSize.X, IconSize.Y); var rsi = item.TraitInfo <RenderSpritesInfo>(); var icon = new Animation(World, rsi.GetImage(item, World.Map.Rules.Sequences, faction)); icon.Play(item.TraitInfo <TooltipInfo>().Icon); var bi = item.TraitInfo <BuildableInfo>(); var pi = new ProductionIcon() { Actor = item, Name = item.Name, Hotkey = ks.GetProductionHotkey(DisplayedIconCount), Sprite = icon.Image, Palette = worldRenderer.Palette(bi.IconPalette), IconClockPalette = worldRenderer.Palette(ClockPalette), IconDarkenPalette = worldRenderer.Palette(NotBuildablePalette), Pos = new float2(rect.Location), Queued = CurrentQueue.AllQueued().Where(a => a.Item == item.Name).ToList() }; icons.Add(rect, pi); DisplayedIconCount++; } eventBounds = icons.Any() ? icons.Keys.Aggregate(Rectangle.Union) : Rectangle.Empty; if (oldIconCount != DisplayedIconCount) { OnIconCountChanged(oldIconCount, DisplayedIconCount); } }
public void RefreshIcons() { icons = new Dictionary <Rectangle, ProductionIcon>(); if (CurrentQueue == null) { return; } var allBuildables = CurrentQueue.AllItems().OrderBy(a => a.Traits.Get <BuildableInfo>().BuildPaletteOrder); var i = 0; var rb = RenderBounds; foreach (var item in allBuildables) { var x = i % Columns; var y = i / Columns; var rect = new Rectangle(rb.X + x * 64 + 1, rb.Y + y * 48 + 1, 64, 48); var icon = new Animation(RenderSimple.GetImage(item)); icon.Play(item.Traits.Get <TooltipInfo>().Icon); var pi = new ProductionIcon() { Name = item.Name, Sprite = icon.Image, Pos = new float2(rect.Location), Queued = CurrentQueue.AllQueued().Where(a => a.Item == item.Name).ToList(), }; icons.Add(rect, pi); i++; } eventBounds = icons.Keys.Aggregate(Rectangle.Union); }
public void RefreshIcons() { icons = new Dictionary <Rectangle, ProductionIcon>(); if (CurrentQueue == null) { if (IconCount != 0) { OnIconCountChanged(IconCount, 0); IconCount = 0; } return; } var allBuildables = CurrentQueue.AllItems().OrderBy(a => a.Traits.Get <BuildableInfo>().BuildPaletteOrder); var oldIconCount = IconCount; IconCount = 0; var ks = Game.Settings.Keys; var rb = RenderBounds; foreach (var item in allBuildables) { var x = IconCount % Columns; var y = IconCount / Columns; var rect = new Rectangle(rb.X + x * (IconSize.X + IconMargin.X), rb.Y + y * (IconSize.Y + IconMargin.Y), IconSize.X, IconSize.Y); var icon = new Animation(World, RenderSimple.GetImage(item)); icon.Play(item.Traits.Get <TooltipInfo>().Icon); var pi = new ProductionIcon() { Actor = item, Name = item.Name, Hotkey = ks.GetProductionHotkey(IconCount), Sprite = icon.Image, Pos = new float2(rect.Location), Queued = CurrentQueue.AllQueued().Where(a => a.Item == item.Name).ToList(), }; icons.Add(rect, pi); IconCount++; } eventBounds = icons.Any() ? icons.Keys.Aggregate(Rectangle.Union) : Rectangle.Empty; if (oldIconCount != IconCount) { OnIconCountChanged(oldIconCount, IconCount); } }
bool HandleLeftClick(ProductionItem item, ProductionIcon icon, int handleCount, Modifiers modifiers) { if (PickUpCompletedBuildingIcon(icon, item)) { Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Sounds", ClickSound, null); return(true); } if (item != null && item.Paused) { // Resume a paused item Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Sounds", ClickSound, null); Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Speech", CurrentQueue.Info.QueuedAudio, World.LocalPlayer.Faction.InternalName); World.IssueOrder(Order.PauseProduction(CurrentQueue.Actor, icon.Name, false)); return(true); } var buildable = CurrentQueue.BuildableItems().FirstOrDefault(a => a.Name == icon.Name); if (buildable != null) { // Queue a new item Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Sounds", ClickSound, null); string notification; var canQueue = CurrentQueue.CanQueue(buildable, out notification); if (!CurrentQueue.AllQueued().Any()) { Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Speech", notification, World.LocalPlayer.Faction.InternalName); } if (canQueue) { var queued = !modifiers.HasModifier(Modifiers.Ctrl); World.IssueOrder(Order.StartProduction(CurrentQueue.Actor, icon.Name, handleCount, queued)); return(true); } } return(false); }
bool HandleEvent(ProductionIcon icon, MouseButton btn, Modifiers modifiers) { var startCount = modifiers.HasModifier(Modifiers.Shift) ? 5 : 1; // PERF: avoid an unnecessary enumeration by casting back to its known type var cancelCount = modifiers.HasModifier(Modifiers.Ctrl) ? ((List <ProductionItem>)CurrentQueue.AllQueued()).Count : startCount; var item = icon.Queued.FirstOrDefault(); var handled = btn == MouseButton.Left ? HandleLeftClick(item, icon, startCount, modifiers) : btn == MouseButton.Right ? HandleRightClick(item, icon, cancelCount) : btn == MouseButton.Middle ? HandleMiddleClick(item, icon, cancelCount) : false; if (!handled) { Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Sounds", ClickDisabledSound, null); } return(true); }