예제 #1
0
        public override void Draw()
        {
            if (world == null)
            {
                return;
            }

            radarSheet.CommitBufferedData();

            var o = new float2(mapRect.Location.X, mapRect.Location.Y + world.Map.Bounds.Height * previewScale * (1 - radarMinimapHeight) / 2);
            var s = new float2(mapRect.Size.Width, mapRect.Size.Height * radarMinimapHeight);

            WidgetUtils.DrawSprite(terrainSprite, o, s);
            WidgetUtils.DrawSprite(actorSprite, o, s);

            if (shroud != null)
            {
                WidgetUtils.DrawSprite(shroudSprite, o, s);
            }

            // Draw viewport rect
            if (hasRadar)
            {
                var tl = CellToMinimapPixel(world.Map.CellContaining(worldRenderer.ProjectedPosition(worldRenderer.Viewport.TopLeft)));
                var br = CellToMinimapPixel(world.Map.CellContaining(worldRenderer.ProjectedPosition(worldRenderer.Viewport.BottomRight)));

                Game.Renderer.EnableScissor(mapRect);
                DrawRadarPings();
                Game.Renderer.RgbaColorRenderer.DrawRect(tl, br, 1, Color.White);
                Game.Renderer.DisableScissor();
            }
        }
예제 #2
0
        protected override IEnumerable <IRenderable> RenderAnnotations(WorldRenderer wr, World world)
        {
            var lastMousePos = wr.Viewport.ViewToWorldPx(Viewport.LastMousePos);

            if (isDragging && (lastMousePos - dragStartMousePos).Length > Game.Settings.Game.SelectionDeadzone)
            {
                var diag1     = wr.ProjectedPosition(lastMousePos);
                var diag2     = wr.ProjectedPosition(dragStartMousePos);
                var modifiers = Game.GetModifierKeys();
                var font      = Game.Renderer.Fonts["Bold"];

                // Draw the rectangle box dragged by mouse.
                yield return(new RectangleAnnotationRenderable(diag1, diag2, diag1, 1, Color.FromArgb(0xff009a00)));

                if (modifiers == Modifiers.Ctrl)
                {
                    yield return(new TextAnnotationRenderable(font, wr.ProjectedPosition(lastMousePos + new int2(0, 20)), 0, Color.GreenYellow, "all"));
                }
                else if (modifiers == Modifiers.Alt)
                {
                    yield return(new TextAnnotationRenderable(font, wr.ProjectedPosition(lastMousePos + new int2(-10, 20)), 0, Color.GreenYellow, "prior units (combat)"));
                }
                else
                {
                    yield return(new TextAnnotationRenderable(font, wr.ProjectedPosition(lastMousePos + new int2(-6, 20)), 0, Color.GreenYellow, "prior building"));
                }

                /* Following codes do two things:
                 * // 1. Draw health bar for every repairable units/buildings that can be repaired inside the box under modifier.
                 * // 2. Draw highlight box for each unit/building that can be repaired inside the box under modifier.
                 */
                var actors = SelectRepairableActorsInBoxWithDeadzone(world, dragStartMousePos, lastMousePos, modifiers, true);
                foreach (var actor in actors)
                {
                    var interactable        = actor.TraitsImplementing <Interactable>();
                    var isometricSelectable = actor.TraitsImplementing <IsometricSelectable>();

                    if (interactable.Any())
                    {
                        var bounds = interactable.First().DecorationBounds(actor, wr);
                        yield return(new SelectionBarsAnnotationRenderable(actor, bounds, true, false));

                        yield return(new GlobalButtonOrderSelectionBoxAnnotationRenderable(actor, bounds, Color.FromArgb(0xff00ea00)));
                    }
                    else if (isometricSelectable.Any())
                    {
                        var bounds = isometricSelectable.First().DecorationBounds(actor, wr);
                        yield return(new IsometricSelectionBoxAnnotationRenderable(actor, bounds, Color.FromArgb(0xff00ea00)));

                        yield return(new IsometricSelectionBarsAnnotationRenderable(actor, bounds, true, false));
                    }
                }
            }

            yield break;
        }
예제 #3
0
        static IEnumerable <IFinalizedRenderable> DrawZap(WorldRenderer wr, float2 from, float2 to, ISpriteSequence s, out float2 p, string palette)
        {
            var dist = to - from;
            var q    = new float2(-dist.Y, dist.X);
            var c    = -float2.Dot(from, q);
            var rs   = new List <IFinalizedRenderable>();
            var z    = from;
            var pal  = wr.Palette(palette);

            while ((to - z).X > 5 || (to - z).X < -5 || (to - z).Y > 5 || (to - z).Y < -5)
            {
                var step = steps.Where(t => (to - (z + new float2(t[0], t[1]))).LengthSquared < (to - z).LengthSquared)
                           .MinBy(t => Math.Abs(float2.Dot(z + new float2(t[0], t[1]), q) + c));

                var pos = wr.ProjectedPosition((z + new float2(step[2], step[3])).ToInt2());
                rs.Add(new SpriteRenderable(null, s.GetSprite(step[4]), pos, WVec.Zero, 0, pal, 1f, true).PrepareRender(wr));

                z += new float2(step[0], step[1]);
                if (rs.Count >= 1000)
                {
                    break;
                }
            }

            p = z;

            return(rs);
        }
예제 #4
0
        IEnumerable <IRenderable> RenderText(Actor self, WorldRenderer wr)
        {
            if (self.World.RenderPlayer != null)
            {
                if (self.Owner != self.World.RenderPlayer)
                {
                    return(Enumerable.Empty <IRenderable>());
                }
            }
            string message;

            if (self.CurrentActivity != null)
            {
                string[] g = self.CurrentActivity.ToString().Split('.');
                message = g.Last().Replace("Activity", "");
            }
            else
            {
                message = "Idle";
            }

            var font      = Game.Renderer.Fonts["Infestregular"];
            var screenPos = wr.ScreenPxPosition(self.CenterPosition);
            var rend      = new IRenderable[] { new TextRenderable(font, wr.ProjectedPosition(screenPos) + new WVec(0, 0, 1024), -1024, Color.Bisque, message) };

            return(rend);
        }
        IEnumerable <IRenderable> IOrderGenerator.RenderAboveShroud(WorldRenderer wr, World world)
        {
            if (!activated)
            {
                return(Enumerable.Empty <IRenderable>());
            }

            var targetPalette = wr.Palette(targetPlaceholderCursorPalette);

            var location    = activated ? targetLocation : Viewport.LastMousePos;
            var worldPx     = wr.Viewport.ViewToWorldPx(location);
            var worldPos    = wr.ProjectedPosition(worldPx);
            var renderables = new List <IRenderable>(targetCursor.Render(world.WorldActor.Owner.PlayerActor, worldPos, WVec.Zero, -511, targetPalette, 1 / wr.Viewport.Zoom));

            if (IsOutsideDragZone)
            {
                var directionPalette = wr.Palette(directionArrowPalette);
                renderables.Add(new SpriteRenderable(world.WorldActor.Owner.PlayerActor, currentArrow.Sprite, worldPos, WVec.Zero, -511, directionPalette, 1 / wr.Viewport.Zoom, true));
            }

            if (hideMouse)
            {
                hideMouse = false;
                Game.RunAfterTick(() => Game.HideCursor = true);
            }

            return(renderables);
        }
        IEnumerable <IRenderable> RenderInner(Actor self, WorldRenderer wr)
        {
            if (IsTraitDisabled || self.IsDead || !self.IsInWorld)
            {
                return(Enumerable.Empty <IRenderable>());
            }

            if (self.World.RenderPlayer != null)
            {
                if (self.Owner != self.World.RenderPlayer)
                {
                    return(Enumerable.Empty <IRenderable>());
                }
            }

            if (!ShouldRender(self) || self.World.FogObscures(self))
            {
                return(Enumerable.Empty <IRenderable>());
            }

            var bounds   = self.VisualBounds;
            var halfSize = font.Measure("100 %") / 2;

            var boundsOffset = new int2(bounds.Left + bounds.Right / 2, bounds.Top + bounds.Bottom) / 2;
            var sizeOffset   = new int2(halfSize.X, halfSize.Y);

            boundsOffset += new int2(Info.XOffset, -(bounds.Height / 3) + Info.YOffset);

            var screenPos = wr.ScreenPxPosition(self.CenterPosition) + boundsOffset;
            var Rend      = new IRenderable[] { new TextRenderable(font, wr.ProjectedPosition(screenPos), Info.ZOffset, color, priority + " %") };

            return(Rend);
        }
예제 #7
0
        public IEnumerable <IRenderable> Render(Actor self, WorldRenderer wr)
        {
            var bounds      = decorationBounds.FirstNonEmptyBounds(self, wr);
            var spaceBuffer = (int)(10 / wr.Viewport.Zoom);
            var effectPos   = wr.ProjectedPosition(new int2((bounds.Left + bounds.Right) / 2, bounds.Y - spaceBuffer));

            return(new IRenderable[] { new TextRenderable(font, effectPos, 0, color, name) });
        }
예제 #8
0
        public override void Draw()
        {
            if (world == null)
            {
                return;
            }

            if (renderShroud != null)
            {
                foreach (var cell in dirtyShroudCells)
                {
                    UpdateShroudCell(cell);
                }

                dirtyShroudCells.Clear();
            }

            radarSheet.CommitBufferedData();

            var o = new Vector2(mapRect.Location.X, mapRect.Location.Y + world.Map.Bounds.Height * previewScale * (1 - radarMinimapHeight) / 2);
            var s = new Vector2(mapRect.Size.Width, mapRect.Size.Height * radarMinimapHeight);

            var rsr = WarGame.Renderer.RgbaSpriteRenderer;

            rsr.DrawSprite(terrainSprite, o, s);
            rsr.DrawSprite(actorSprite, o, s);

            if (renderShroud != null)
            {
                rsr.DrawSprite(shroudSprite, o, s);
            }

            if (hasRadar)
            {
                var tl = CellToMinimapPixel(world.Map.CellContaining(worldRenderer.ProjectedPosition(worldRenderer.ViewPort.TopLeft)));
                var br = CellToMinimapPixel(world.Map.CellContaining(worldRenderer.ProjectedPosition(worldRenderer.ViewPort.BottomRight)));

                WarGame.Renderer.EnableScissor(mapRect);
                DrawRadarPings();
                WarGame.Renderer.RgbaColorRenderer.DrawRect(tl, br, 1, Color.White);
                WarGame.Renderer.DisableScissor();
            }
        }
예제 #9
0
        IEnumerable <IRenderable> RenderInner(Actor self, WorldRenderer wr)
        {
            var bounds      = decorationBounds.Select(b => b.DecorationBounds(self, wr)).FirstOrDefault(b => !b.IsEmpty);
            var spaceBuffer = (int)(10 / wr.Viewport.Zoom);
            var effectPos   = wr.ProjectedPosition(new int2((bounds.Left + bounds.Right) / 2 + Info.XOffset, (bounds.Top + bounds.Bottom) / 2 + Info.YOffset - spaceBuffer));

            return(new IRenderable[]
            {
                new TextRenderable(font, effectPos, Info.ZOffset, color, priority + "%")
            });
        }
예제 #10
0
        public IEnumerable <IRenderable> Render(Actor self, WorldRenderer wr)
        {
            var pos    = wr.ScreenPxPosition(self.CenterPosition);
            var bounds = self.Bounds;

            bounds.Offset(pos.X, pos.Y);
            var spaceBuffer = (int)(10 / wr.Viewport.Zoom);
            var effectPos   = wr.ProjectedPosition(new int2(pos.X, bounds.Y - spaceBuffer));

            return(new IRenderable[] { new TextRenderable(font, effectPos, 0, color, name) });
        }
예제 #11
0
        IEnumerable <IRenderable> RenderInner(Actor self, WorldRenderer wr)
        {
            if (IsTraitDisabled || self.IsDead || !self.IsInWorld)
            {
                return(Enumerable.Empty <IRenderable>());
            }

            if (self.World.RenderPlayer != null)
            {
                var stance = self.Owner.Stances[self.World.RenderPlayer];
                if (!Info.ValidStances.HasStance(stance))
                {
                    return(Enumerable.Empty <IRenderable>());
                }
            }

            if (!ShouldRender(self) || self.World.FogObscures(self))
            {
                return(Enumerable.Empty <IRenderable>());
            }

            var bounds   = self.VisualBounds;
            var halfSize = font.Measure(Info.Text) / 2;

            var boundsOffset = new int2(bounds.Left + bounds.Right, bounds.Top + bounds.Bottom) / 2;
            var sizeOffset   = new int2();

            if (Info.ReferencePoint.HasFlag(ReferencePoints.Top))
            {
                boundsOffset -= new int2(0, bounds.Height / 2);
                sizeOffset   += new int2(0, halfSize.Y);
            }
            else if (Info.ReferencePoint.HasFlag(ReferencePoints.Bottom))
            {
                boundsOffset += new int2(0, bounds.Height / 2);
                sizeOffset   -= new int2(0, halfSize.Y);
            }

            if (Info.ReferencePoint.HasFlag(ReferencePoints.Left))
            {
                boundsOffset -= new int2(bounds.Width / 2, 0);
                sizeOffset   += new int2(halfSize.X, 0);
            }
            else if (Info.ReferencePoint.HasFlag(ReferencePoints.Right))
            {
                boundsOffset += new int2(bounds.Width / 2, 0);
                sizeOffset   -= new int2(halfSize.X, 0);
            }

            var screenPos = wr.ScreenPxPosition(self.CenterPosition) + boundsOffset + sizeOffset;

            return(new IRenderable[] { new TextRenderable(font, wr.ProjectedPosition(screenPos), Info.ZOffset, color, Info.Text) });
        }
예제 #12
0
        IEnumerable <IRenderable> IRenderAnnotations.RenderAnnotations(Actor self, WorldRenderer wr)
        {
            if (self.World.FogObscures(self))
            {
                yield break;
            }

            var bounds      = decorationBounds.FirstNonEmptyBounds(self, wr);
            var spaceBuffer = (int)(10 / wr.Viewport.Zoom);
            var effectPos   = wr.ProjectedPosition(new int2((bounds.Left + bounds.Right) / 2, bounds.Y - spaceBuffer));

            yield return(new TextAnnotationRenderable(font, effectPos, 0, color, name));
        }
예제 #13
0
        IEnumerable <IRenderable> RenderText(Actor self, WorldRenderer wr)
        {
            if (self.World.RenderPlayer != null)
            {
                if (self.Owner != self.World.RenderPlayer)
                {
                    return(Enumerable.Empty <IRenderable>());
                }
            }

            var font      = Game.Renderer.Fonts["Infestregular"];
            var screenPos = wr.ScreenPxPosition(messageposition);
            var rend      = new IRenderable[] { new TextRenderable(font, wr.ProjectedPosition(screenPos) + new WVec(0, -512, 1024), -1024, Color.Bisque, message) };

            return(rend);
        }
        IEnumerable <IRenderable> DrawControlGroup(Actor self, WorldRenderer wr)
        {
            var group = self.World.Selection.GetControlGroupForActor(self);

            if (group == null)
            {
                yield break;
            }

            var bounds   = decorationBounds.FirstNonEmptyBounds(self, wr);
            var number   = group.Value.ToString();
            var halfSize = font.Measure(number) / 2;

            var boundsOffset = new int2(bounds.Left + bounds.Right, bounds.Top + bounds.Bottom) / 2;
            var sizeOffset   = new int2();

            if (info.ReferencePoint.HasFlag(ReferencePoints.Top))
            {
                boundsOffset -= new int2(0, bounds.Height / 2);
                sizeOffset   += new int2(0, halfSize.Y);
            }
            else if (info.ReferencePoint.HasFlag(ReferencePoints.Bottom))
            {
                boundsOffset += new int2(0, bounds.Height / 2);
                sizeOffset   -= new int2(0, halfSize.Y);
            }

            if (info.ReferencePoint.HasFlag(ReferencePoints.Left))
            {
                boundsOffset -= new int2(bounds.Width / 2, 0);
                sizeOffset   += new int2(halfSize.X, 0);
            }
            else if (info.ReferencePoint.HasFlag(ReferencePoints.Right))
            {
                boundsOffset += new int2(bounds.Width / 2, 0);
                sizeOffset   -= new int2(halfSize.X, 0);
            }

            var screenPos = boundsOffset + sizeOffset + info.ScreenOffset;

            yield return(new TextRenderable(font, wr.ProjectedPosition(screenPos), info.ZOffset, color, number));
        }
예제 #15
0
        public IEnumerable <IRenderable> Render(Actor self, WorldRenderer wr)
        {
            if (IsTraitDisabled)
            {
                return(Enumerable.Empty <IRenderable>());
            }

            if (self.IsDead || !self.IsInWorld)
            {
                return(Enumerable.Empty <IRenderable>());
            }

            if (anim == null)
            {
                return(Enumerable.Empty <IRenderable>());
            }

            var allied = self.Owner.IsAlliedWith(self.World.RenderPlayer);

            if (!allied && !info.ShowToEnemies)
            {
                return(Enumerable.Empty <IRenderable>());
            }

            if (allied && !info.ShowToAllies)
            {
                return(Enumerable.Empty <IRenderable>());
            }

            if (!ShouldRender(self))
            {
                return(Enumerable.Empty <IRenderable>());
            }

            if (self.World.FogObscures(self))
            {
                return(Enumerable.Empty <IRenderable>());
            }

            var pxPos       = wr.ScreenPxPosition(self.CenterPosition);
            var actorBounds = self.Bounds;

            actorBounds.Offset(pxPos.X, pxPos.Y);

            var img     = anim.Image;
            var imgSize = img.Size.ToInt2();

            switch (info.ReferencePoint & (ReferencePoints)3)
            {
            case ReferencePoints.Top:
                pxPos = pxPos.WithY(actorBounds.Top + imgSize.Y / 2);
                break;

            case ReferencePoints.VCenter:
                pxPos = pxPos.WithY((actorBounds.Top + actorBounds.Bottom) / 2);
                break;

            case ReferencePoints.Bottom:
                pxPos = pxPos.WithY(actorBounds.Bottom - imgSize.Y / 2);
                break;
            }

            switch (info.ReferencePoint & (ReferencePoints)(3 << 2))
            {
            case ReferencePoints.Left:
                pxPos = pxPos.WithX(actorBounds.Left + imgSize.X / 2);
                break;

            case ReferencePoints.HCenter:
                pxPos = pxPos.WithX((actorBounds.Left + actorBounds.Right) / 2);
                break;

            case ReferencePoints.Right:
                pxPos = pxPos.WithX(actorBounds.Right - imgSize.X / 2);
                break;
            }

            pxPos += info.Offset;

            // HACK: Because WorldRenderer.Position() does not care about terrain height at the location
            var renderPos = wr.ProjectedPosition(pxPos);

            renderPos = new WPos(renderPos.X, renderPos.Y + self.CenterPosition.Z, self.CenterPosition.Z);

            anim.Tick();

            return(new IRenderable[] { new SpriteRenderable(img, renderPos, WVec.Zero, info.ZOffset, wr.Palette(info.Palette), info.Scale, true) });
        }
        protected override IEnumerable <IRenderable> RenderAnnotations(WorldRenderer wr, World world)
        {
            var lastMousePos = wr.Viewport.ViewToWorldPx(Viewport.LastMousePos);

            if (isDragging && (lastMousePos - dragStartMousePos).Length > Game.Settings.Game.SelectionDeadzone)
            {
                var diag1     = wr.ProjectedPosition(lastMousePos);
                var diag2     = wr.ProjectedPosition(dragStartMousePos);
                var modifiers = Game.GetModifierKeys();

                /* Following code do two things:
                 * // 1. Draw health bar for every units/buildings can be power-down inside the box.
                 * // 2. Draw highlight box for each unit/building that can be power-down inside the box.
                 * // 3. Draw text that power changed.
                 */
                var actors           = SelectToggleConditionActorsInBoxWithDeadzone(world, dragStartMousePos, lastMousePos, modifiers, true);
                int powerChanged     = 0;
                var toggleConditions = actors.Any() ? actors.First().Trait <ToggleConditionOnOrder>().IsEnabled() : modifiers == Modifiers.Ctrl;
                var font             = Game.Renderer.Fonts["Bold"];

                // Draw the rectangle box dragged by mouse.
                yield return(new RectangleAnnotationRenderable(diag1, diag2, diag1, 1, Color.OrangeRed));

                if (modifiers == Modifiers.Ctrl)
                {
                    yield return(new TextAnnotationRenderable(font, wr.ProjectedPosition(lastMousePos - new int2(20, 0)), 0, Color.Red, "off"));
                }
                else if (modifiers == Modifiers.Alt)
                {
                    yield return(new TextAnnotationRenderable(font, wr.ProjectedPosition(lastMousePos - new int2(20, 0)), 0, Color.Gold, "on"));
                }

                // Render actors
                foreach (var actor in actors)
                {
                    var interactable        = actor.TraitsImplementing <Interactable>();
                    var isometricSelectable = actor.TraitsImplementing <IsometricSelectable>();

                    if (interactable.Any())
                    {
                        var bounds = interactable.First().DecorationBounds(actor, wr);
                        yield return(new SelectionBarsAnnotationRenderable(actor, bounds, true, false));

                        yield return(new GlobalButtonOrderSelectionBoxAnnotationRenderable(actor, bounds, Color.Orange));
                    }
                    else if (isometricSelectable.Any())
                    {
                        var bounds = isometricSelectable.First().DecorationBounds(actor, wr);
                        yield return(new IsometricSelectionBoxAnnotationRenderable(actor, bounds, Color.Orange));

                        yield return(new IsometricSelectionBarsAnnotationRenderable(actor, bounds, true, false));
                    }

                    // Get abulote power cost for text rendering. Please don't use "RequiresCondition: !disabled" in YAML or
                    // it won't work correctly.
                    powerChanged += actor.TraitsImplementing <Power>().Where(t => !t.IsTraitDisabled).Sum(p => p.Info.Amount);
                }

                if (powerChanged != 0)
                {
                    if (toggleConditions)
                    {
                        yield return(new TextAnnotationRenderable(font, wr.ProjectedPosition(lastMousePos + new int2(20, 0)), 0, Color.Red, powerChanged.ToString()));
                    }
                    else
                    {
                        yield return(new TextAnnotationRenderable(font, wr.ProjectedPosition(lastMousePos + new int2(20, 0)), 0, Color.Gold, (0 - powerChanged).ToString()));
                    }
                }
            }

            yield break;
        }