Ejemplo n.º 1
0
        int DrawPalette(ProductionQueue queue)
        {
            buttons.Clear();

            var paletteCollection = "palette-" + world.LocalPlayer.Country.Race;
            var origin = new float2(paletteOrigin.X + 9, paletteOrigin.Y + 9);
            var iconOffset = 0.5f * new float2(IconWidth, IconHeight);
            var x = 0;
            var y = 0;

            if (queue != null)
            {
                var buildableItems = queue.BuildableItems().ToArray();
                var allBuildables = queue.AllItems().OrderBy(a => a.Traits.Get<BuildableInfo>().BuildPaletteOrder).ToArray();

                var overlayBits = new List<Pair<Sprite, float2>>();
                var textBits = new List<Pair<float2, string>>();
                numActualRows = Math.Max((allBuildables.Count() + Columns - 1) / Columns, Rows);

                // Palette Background
                WidgetUtils.DrawRGBA(ChromeProvider.GetImage(paletteCollection, "top"), new float2(origin.X - 9, origin.Y - 9));
                for (var w = 0; w < numActualRows; w++)
                    WidgetUtils.DrawRGBA(
                        ChromeProvider.GetImage(paletteCollection, "bg-" + (w % 4)),
                        new float2(origin.X - 9, origin.Y + IconHeight * w));
                WidgetUtils.DrawRGBA(ChromeProvider.GetImage(paletteCollection, "bottom"),
                    new float2(origin.X - 9, origin.Y - 1 + IconHeight * numActualRows));

                // Icons
                string tooltipItem = null;
                var tooltipHotkey = Hotkey.Invalid;
                var i = 0;
                foreach (var item in allBuildables)
                {
                    var rect = new RectangleF(origin.X + x * IconWidth, origin.Y + IconHeight * y, IconWidth, IconHeight);
                    var drawPos = new float2(rect.Location);
                    var icon = new Animation(world, RenderSimple.GetImage(item));
                    icon.Play(item.Traits.Get<TooltipInfo>().Icon);
                    WidgetUtils.DrawSHPCentered(icon.Image, drawPos + iconOffset, worldRenderer);

                    var firstOfThis = queue.AllQueued().FirstOrDefault(a => a.Item == item.Name);

                    if (rect.Contains(Viewport.LastMousePos))
                    {
                        tooltipItem = item.Name;
                        tooltipHotkey = Game.Settings.Keys.GetProductionHotkey(i);
                    }

                    var overlayPos = drawPos + new float2(32, 16);

                    if (firstOfThis != null)
                    {
                        clock.PlayFetchIndex("idle",
                            () => (firstOfThis.TotalTime - firstOfThis.RemainingTime)
                                * (clock.CurrentSequence.Length - 1) / firstOfThis.TotalTime);
                        clock.Tick();
                        WidgetUtils.DrawSHPCentered(clock.Image, drawPos + iconOffset, worldRenderer);

                        if (queue.CurrentItem() == firstOfThis)
                            textBits.Add(Pair.New(overlayPos, GetOverlayForItem(firstOfThis)));

                        var repeats = queue.AllQueued().Count(a => a.Item == item.Name);
                        if (repeats > 1 || queue.CurrentItem() != firstOfThis)
                            textBits.Add(Pair.New(overlayPos + new float2(-24, -14), repeats.ToString()));
                    }
                    else
                        if (buildableItems.All(a => a.Name != item.Name))
                            overlayBits.Add(Pair.New(cantBuild.Image, drawPos));

                    var closureName = buildableItems.Any(a => a.Name == item.Name) ? item.Name : null;
                    buttons.Add(Pair.New(new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height), HandleClick(closureName, world)));

                    if (++x == Columns) { x = 0; y++; }
                    i++;
                }
                if (x != 0) y++;

                foreach (var ob in overlayBits)
                    WidgetUtils.DrawSHPCentered(ob.First, ob.Second + iconOffset, worldRenderer);

                var font = Game.Renderer.Fonts["TinyBold"];
                foreach (var tb in textBits)
                {
                    var size = font.Measure(tb.Second);
                    if (ReadyTextStyle == ReadyTextStyleOptions.Solid || orderManager.LocalFrameNumber / 9 % 2 == 0 || tb.Second != ReadyText)
                        font.DrawTextWithContrast(tb.Second, tb.First - new float2(size.X / 2, 0),
                                                  Color.White, Color.Black, 1);
                    else if (ReadyTextStyle == ReadyTextStyleOptions.AlternatingColor)
                        font.DrawTextWithContrast(tb.Second, tb.First - new float2(size.X / 2, 0),
                                              ReadyTextAltColor, Color.Black, 1);
                }

                // Tooltip
                if (tooltipItem != null && !paletteAnimating && paletteOpen)
                    DrawProductionTooltip(world, tooltipItem, tooltipHotkey,
                        new float2(Game.Renderer.Resolution.Width, origin.Y + numActualRows * IconHeight + 9).ToInt2());
            }

            // Palette Dock
            WidgetUtils.DrawRGBA(ChromeProvider.GetImage(paletteCollection, "dock-top"),
                new float2(Game.Renderer.Resolution.Width - 14, origin.Y - 23));

            for (var i = 0; i < numActualRows; i++)
                WidgetUtils.DrawRGBA(ChromeProvider.GetImage(paletteCollection, "dock-" + (i % 4)),
                    new float2(Game.Renderer.Resolution.Width - 14, origin.Y + IconHeight * i));

            WidgetUtils.DrawRGBA(ChromeProvider.GetImage(paletteCollection, "dock-bottom"),
                new float2(Game.Renderer.Resolution.Width - 14, origin.Y - 1 + IconHeight * numActualRows));

            return IconHeight * y + 9;
        }
Ejemplo n.º 2
0
        ActorInfo ChooseDefenseToBuild(ProductionQueue queue)
        {
            if (!HasAdequatePower())
                return null;

            var buildableThings = queue.BuildableItems();

            var myBuildings = p.World.Queries.OwnedBy[p].WithTrait<Building>()
                .Select(a => a.Actor.Info.Name).ToArray();

            foreach (var frac in Info.BuildingFractions)
                if (buildableThings.Any(b => b.Name == frac.Key))
                    if (myBuildings.Count(a => a == frac.Key) < frac.Value * myBuildings.Length)
                        return Rules.Info[frac.Key];

            return null;
        }
Ejemplo n.º 3
0
 ActorInfo ChooseRandomUnitToBuild(ProductionQueue queue)
 {
     var buildableThings = queue.BuildableItems();
     if (buildableThings.Count() == 0) return null;
     return buildableThings.ElementAtOrDefault(random.Next(buildableThings.Count()));
 }
Ejemplo n.º 4
0
        ActorInfo ChooseBuildingToBuild(ProductionQueue queue)
        {
            var buildableThings = queue.BuildableItems();

            if (!HasAdequatePower())	/* try to maintain 20% excess power */
            {
                /* find the best thing we can build which produces power */
                return buildableThings.Where(a => GetPowerProvidedBy(a) > 0)
                    .OrderByDescending(a => GetPowerProvidedBy(a)).FirstOrDefault();
            }

            var myBuildings = p.World.Queries.OwnedBy[p].WithTrait<Building>()
                .Select(a => a.Actor.Info.Name).ToArray();

            foreach (var frac in Info.BuildingFractions)
                if (buildableThings.Any(b => b.Name == frac.Key))
                    if (myBuildings.Count(a => a == frac.Key) < frac.Value * myBuildings.Length)
                        return Rules.Info[frac.Key];

            return null;
        }