Esempio n. 1
0
        public Viewport(WorldRenderer wr, Map map)
        {
            worldRenderer = wr;
            var grid = Game.ModData.Manifest.Get<MapGrid>();

            // Calculate map bounds in world-px
            if (wr.World.Type == WorldType.Editor)
            {
                // The full map is visible in the editor
                var width = map.MapSize.X * grid.TileSize.Width;
                var height = map.MapSize.Y * grid.TileSize.Height;
                if (wr.World.Map.Grid.Type == MapGridType.RectangularIsometric)
                    height /= 2;

                mapBounds = new Rectangle(0, 0, width, height);
                CenterLocation = new int2(width / 2, height / 2);
            }
            else
            {
                var tl = wr.ScreenPxPosition(map.ProjectedTopLeft);
                var br = wr.ScreenPxPosition(map.ProjectedBottomRight);
                mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y);
                CenterLocation = (tl + br) / 2;
            }

            Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1;
            tileSize = grid.TileSize;
        }
Esempio n. 2
0
        public Viewport(WorldRenderer wr, Map map)
        {
            worldRenderer = wr;
            var grid = Game.ModData.Manifest.Get <MapGrid>();

            // Calculate map bounds in world-px
            if (wr.World.Type == WorldType.Editor)
            {
                // The full map is visible in the editor
                var width  = map.MapSize.X * grid.TileSize.Width;
                var height = map.MapSize.Y * grid.TileSize.Height;
                if (wr.World.Map.Grid.Type == MapGridType.RectangularIsometric)
                {
                    height /= 2;
                }

                mapBounds      = new Rectangle(0, 0, width, height);
                CenterLocation = new int2(width / 2, height / 2);
            }
            else
            {
                var tl = wr.ScreenPxPosition(map.ProjectedTopLeft);
                var br = wr.ScreenPxPosition(map.ProjectedBottomRight);
                mapBounds      = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y);
                CenterLocation = (tl + br) / 2;
            }

            Zoom     = Game.Settings.Graphics.PixelDouble ? 2 : 1;
            tileSize = grid.TileSize;
        }
Esempio n. 3
0
        public CPos ViewToWorld(int2 view)
        {
            var world      = worldRenderer.Viewport.ViewToWorldPx(view);
            var map        = worldRenderer.World.Map;
            var ts         = Game.ModData.Manifest.TileSize;
            var candidates = CandidateMouseoverCells(world);
            var tileSet    = worldRenderer.World.TileSet;

            foreach (var uv in candidates)
            {
                // Coarse filter to nearby cells
                var p = map.CenterOfCell(uv.ToCPos(map.TileShape));
                var s = worldRenderer.ScreenPxPosition(p);
                if (Math.Abs(s.X - world.X) <= ts.Width && Math.Abs(s.Y - world.Y) <= ts.Height)
                {
                    var ramp = 0;
                    if (map.Contains(uv))
                    {
                        var tile = map.MapTiles.Value[uv];
                        var ti   = tileSet.GetTileInfo(tile);
                        if (ti != null)
                        {
                            ramp = ti.RampType;
                        }
                    }

                    var corners = map.CellCorners[ramp];
                    var pos     = map.CenterOfCell(uv.ToCPos(map));
                    var screen  = corners.Select(c => worldRenderer.ScreenPxPosition(pos + c)).ToArray();

                    if (screen.PolygonContains(world))
                    {
                        return(uv.ToCPos(map));
                    }
                }
            }

            // Mouse is not directly over a cell (perhaps on a cliff)
            // Try and find the closest cell
            if (candidates.Any())
            {
                return(candidates.OrderBy(uv =>
                {
                    var p = map.CenterOfCell(uv.ToCPos(map.TileShape));
                    var s = worldRenderer.ScreenPxPosition(p);
                    var dx = Math.Abs(s.X - world.X);
                    var dy = Math.Abs(s.Y - world.Y);

                    return dx * dx + dy * dy;
                }).First().ToCPos(map));
            }

            // Something is very wrong, but lets return something that isn't completely bogus and hope the caller can recover
            return(worldRenderer.World.Map.CellContaining(worldRenderer.Position(ViewToWorldPx(view))));
        }
Esempio n. 4
0
        public Viewport(WorldRenderer wr, Map map)
        {
            worldRenderer = wr;

            // Calculate map bounds in world-px
            var b = map.Bounds;
            var tl = wr.ScreenPxPosition(new CPos(b.Left, b.Top).TopLeft);
            var br = wr.ScreenPxPosition(new CPos(b.Right, b.Bottom).BottomRight);
            mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y);

            CenterLocation = (tl + br) / 2;
            Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1;
        }
Esempio n. 5
0
        public Viewport(WorldRenderer wr, Map map)
        {
            worldRenderer = wr;

            // Calculate map bounds in world-px
            var b  = map.Bounds;
            var tl = wr.ScreenPxPosition(new CPos(b.Left, b.Top).TopLeft);
            var br = wr.ScreenPxPosition(new CPos(b.Right, b.Bottom).BottomRight);

            mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y);

            CenterLocation = (tl + br) / 2;
            Zoom           = Game.Settings.Graphics.PixelDouble ? 2 : 1;
        }
Esempio n. 6
0
        public Viewport(WorldRenderer wr, Map map)
        {
            worldRenderer = wr;

            // Calculate map bounds in world-px
            var b = map.Bounds;

            // Expand to corners of cells
            var tl = wr.ScreenPxPosition(map.CenterOfCell(Map.MapToCell(map.TileShape, new CPos(b.Left, b.Top))) - new WVec(512, 512, 0));
            var br = wr.ScreenPxPosition(map.CenterOfCell(Map.MapToCell(map.TileShape, new CPos(b.Right, b.Bottom))) + new WVec(511, 511, 0));
            mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y);

            CenterLocation = (tl + br) / 2;
            Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1;
        }
Esempio n. 7
0
        public Viewport(WorldRenderer wr, Map map)
        {
            worldRenderer = wr;

            var cells = wr.World.Type == WorldType.Editor ?
                map.AllCells : map.CellsInsideBounds;

            // Calculate map bounds in world-px
            var tl = wr.ScreenPxPosition(map.CenterOfCell(cells.TopLeft) - new WVec(512, 512, 0));
            var br = wr.ScreenPxPosition(map.CenterOfCell(cells.BottomRight) + new WVec(511, 511, 0));
            mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y);

            CenterLocation = (tl + br) / 2;
            Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1;
            tileSize = Game.ModData.Manifest.TileSize;
        }
Esempio n. 8
0
        public float3 ScreenPosition(WorldRenderer wr)
        {
            var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.Size.XY).ToInt2();

            // HACK: The z offset needs to be applied somewhere, but this probably is the wrong place.
            return(new float3(xy, sprite.Offset.Z + wr.ScreenZPosition(pos, 0) - 0.5f * scale * sprite.Size.Z));
        }
        public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
        {
            if (!self.Owner.IsAlliedWith(self.World.RenderPlayer) || self.World.FogObscures(self))
                yield break;

            if (Info.RenderSelectionBox)
                yield return new SelectionBoxRenderable(self, Info.SelectionBoxColor);

            if (Info.RenderSelectionBars)
                yield return new SelectionBarsRenderable(self);

            if (self.World.LocalPlayer != null && self.World.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug)
                yield return new TargetLineRenderable(ActivityTargetPath(), Color.Green);

            var b = self.VisualBounds;
            var pos = wr.ScreenPxPosition(self.CenterPosition);
            var tl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Top));
            var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom));
            var tm = wr.Viewport.WorldToViewPx(pos + new int2((b.Left + b.Right) / 2, b.Top));

            foreach (var r in DrawControlGroup(wr, self, tl))
                yield return r;

            foreach (var r in DrawPips(wr, self, bl))
                yield return r;

            foreach (var r in DrawTags(wr, self, tm))
                yield return r;
        }
Esempio n. 10
0
        public void Render(WorldRenderer wr)
        {
            if (!actor.IsInWorld || actor.IsDead)
            {
                return;
            }

            var health = actor.TraitOrDefault <IHealth>();

            var screenPos = wr.ScreenPxPosition(pos);
            var bounds    = actor.VisualBounds;

            bounds.Offset(screenPos.X, screenPos.Y);

            var start = new float2(bounds.Left + 1, bounds.Top);
            var end   = new float2(bounds.Right - 1, bounds.Top);

            if (DisplayHealth)
            {
                DrawHealthBar(wr, health, start, end);
            }

            if (DisplayExtra)
            {
                DrawExtraBars(wr, start, end);
            }
        }
Esempio n. 11
0
        public Viewport(WorldRenderer wr, Map map)
        {
            worldRenderer = wr;

            // Calculate map bounds in world-px
            var b = map.Bounds;

            // Expand to corners of cells
            var tl = wr.ScreenPxPosition(map.CenterOfCell(Map.MapToCell(map.TileShape, new CPos(b.Left, b.Top))) - new WVec(512, 512, 0));
            var br = wr.ScreenPxPosition(map.CenterOfCell(Map.MapToCell(map.TileShape, new CPos(b.Right, b.Bottom))) + new WVec(511, 511, 0));

            mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y);

            CenterLocation = (tl + br) / 2;
            Zoom           = Game.Settings.Graphics.PixelDouble ? 2 : 1;
        }
Esempio n. 12
0
        public void RenderAfterWorld(WorldRenderer wr, Actor self)
        {
            if (devMode == null || !devMode.ShowMuzzles)
                return;

            if (health.Value != null)
                wr.DrawRangeCircle(Color.Red, wr.ScreenPxPosition(self.CenterPosition), health.Value.Info.Radius / Game.CellSize);

            var wlr = Game.Renderer.WorldLineRenderer;
            var c = Color.White;

            foreach (var a in armaments.Value)
            {
                foreach (var b in a.Barrels)
                {
                    var muzzle = self.CenterPosition + a.MuzzleOffset(self, b);
                    var dirOffset = new WVec(0, -224, 0).Rotate(a.MuzzleOrientation(self, b));

                    var sm = wr.ScreenPosition(muzzle);
                    var sd = wr.ScreenPosition(muzzle + dirOffset);
                    wlr.DrawLine(sm, sd, c, c);
                    wr.DrawTargetMarker(c, sm);
                }
            }
        }
Esempio n. 13
0
        public void RenderDebugGeometry(WorldRenderer wr)
        {
            var size   = font.Measure(text).ToFloat2();
            var offset = wr.ScreenPxPosition(pos) - 0.5f * size;

            Game.Renderer.WorldLineRenderer.DrawRect(offset, offset + size, Color.Red);
        }
Esempio n. 14
0
        public Viewport(WorldRenderer wr, Map map)
        {
            worldRenderer = wr;

            var cells = wr.World.Type == WorldType.Editor ?
                        map.AllCells : map.CellsInsideBounds;

            // Calculate map bounds in world-px
            var tl = wr.ScreenPxPosition(map.CenterOfCell(cells.TopLeft) - new WVec(512, 512, 0));
            var br = wr.ScreenPxPosition(map.CenterOfCell(cells.BottomRight) + new WVec(511, 511, 0));

            mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y);

            CenterLocation = (tl + br) / 2;
            Zoom           = Game.Settings.Graphics.PixelDouble ? 2 : 1;
            tileSize       = Game.ModData.Manifest.TileSize;
        }
Esempio n. 15
0
 public static void DrawRangeCircle(WorldRenderer wr, WPos pos, int range, Color color)
 {
     wr.DrawRangeCircleWithContrast(
         Color.FromArgb(128, color),
         wr.ScreenPxPosition(pos),
         range,
         Color.FromArgb(96, Color.Black));
 }
Esempio n. 16
0
        public void Render(WorldRenderer wr)
        {
            if (!waypoints.Any())
            {
                return;
            }

            var first = wr.ScreenPxPosition(waypoints.First());
            var a     = first;

            foreach (var b in waypoints.Skip(1).Select(pos => wr.ScreenPxPosition(pos)))
            {
                Game.Renderer.WorldLineRenderer.DrawLine(a, b, color, color);
                wr.DrawTargetMarker(color, b);
                a = b;
            }

            wr.DrawTargetMarker(color, first);
        }
Esempio n. 17
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));

			yield return new TextRenderable(font, effectPos, 0, color, name);
		}
Esempio n. 18
0
        public void RenderAfterWorld(WorldRenderer wr)
        {
            if (self.Owner != self.World.LocalPlayer)
                return;

            wr.DrawRangeCircleWithContrast(
                Color.FromArgb(128, Color.LimeGreen),
                wr.ScreenPxPosition(self.CenterPosition), self.Info.Traits.Get<DetectCloakedInfo>().Range,
                Color.FromArgb(96, Color.Black));
        }
Esempio n. 19
0
        // Range circle
        public void RenderAfterWorld(WorldRenderer wr)
        {
            // Visible to player and allies
            if (!ValidRenderPlayer())
                return;

            wr.DrawRangeCircleWithContrast(
                Color.FromArgb(128, Ready() ? Color.White : Color.Red),
                wr.ScreenPxPosition(self.CenterPosition), Info.Range,
                Color.FromArgb(96, Color.Black));
        }
Esempio n. 20
0
        public Rectangle ScreenBounds(WorldRenderer wr, WPos pos, WVec offset, float scale)
        {
            var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset);
            var cb = CurrentSequence.Bounds;

            return(Rectangle.FromLTRB(
                       xy.X + (int)(cb.Left * scale),
                       xy.Y + (int)(cb.Top * scale),
                       xy.X + (int)(cb.Right * scale),
                       xy.Y + (int)(cb.Bottom * scale)));
        }
Esempio n. 21
0
        public void Render(WorldRenderer wr)
        {
            if (!waypoints.Any())
            {
                return;
            }

            var iz    = 1 / wr.Viewport.Zoom;
            var first = wr.ScreenPxPosition(waypoints.First());
            var a     = first;

            foreach (var b in waypoints.Skip(1).Select(pos => wr.ScreenPxPosition(pos)))
            {
                Game.Renderer.WorldRgbaColorRenderer.DrawLine(a, b, iz, color);
                DrawTargetMarker(wr, color, b);
                a = b;
            }

            DrawTargetMarker(wr, color, first);
        }
Esempio n. 22
0
        public CPos ViewToWorld(int2 view)
        {
            var world      = worldRenderer.Viewport.ViewToWorldPx(view);
            var map        = worldRenderer.World.Map;
            var candidates = CandidateMouseoverCells(world).ToList();

            foreach (var uv in candidates)
            {
                // Coarse filter to nearby cells
                var p = map.CenterOfCell(uv.ToCPos(map.Grid.Type));
                var s = worldRenderer.ScreenPxPosition(p);
                if (Math.Abs(s.X - world.X) <= tileSize.Width && Math.Abs(s.Y - world.Y) <= tileSize.Height)
                {
                    var ramp   = map.Grid.Ramps[map.Ramp.Contains(uv) ? map.Ramp[uv] : 0];
                    var pos    = map.CenterOfCell(uv.ToCPos(map)) - new WVec(0, 0, ramp.CenterHeightOffset);
                    var screen = ramp.Corners.Select(c => worldRenderer.ScreenPxPosition(pos + c)).ToArray();
                    if (screen.PolygonContains(world))
                    {
                        return(uv.ToCPos(map));
                    }
                }
            }

            // Mouse is not directly over a cell (perhaps on a cliff)
            // Try and find the closest cell
            if (candidates.Count > 0)
            {
                return(candidates.MinBy(uv =>
                {
                    var p = map.CenterOfCell(uv.ToCPos(map.Grid.Type));
                    var s = worldRenderer.ScreenPxPosition(p);
                    var dx = Math.Abs(s.X - world.X);
                    var dy = Math.Abs(s.Y - world.Y);

                    return dx * dx + dy * dy;
                }).ToCPos(map));
            }

            // Something is very wrong, but lets return something that isn't completely bogus and hope the caller can recover
            return(worldRenderer.World.Map.CellContaining(worldRenderer.ProjectedPosition(ViewToWorldPx(view))));
        }
Esempio n. 23
0
        public void RenderAfterWorld(WorldRenderer wr)
        {
            if (self.Owner != self.World.LocalPlayer)
                return;

            // Hack: Convert world coords to cells
            var pxRange = self.Trait<AttackBase>().GetMaximumRange().Range / 1024f;
            wr.DrawRangeCircleWithContrast(
                Color.FromArgb(128, Color.Yellow),
                wr.ScreenPxPosition(self.CenterPosition), pxRange,
                Color.FromArgb(96, Color.Black));
        }
Esempio n. 24
0
        public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
        {
            wr.DrawRangeCircleWithContrast(
                Color.FromArgb(128, Color.Cyan),
                wr.ScreenPxPosition(centerPosition),
                ai.Traits.Get<CreatesShroudInfo>().Range,
                Color.FromArgb(96, Color.Black));

            foreach (var a in w.ActorsWithTrait<RenderShroudCircle>())
                if (a.Actor.Owner == a.Actor.World.LocalPlayer)
                    a.Trait.RenderAfterWorld(wr);
        }
Esempio n. 25
0
        public void RenderAfterWorld(WorldRenderer wr)
        {
            var force = Game.GetModifierKeys().HasModifier(Modifiers.Alt);
            if ((lifetime <= 0 || --lifetime <= 0) && !force)
                return;

            if (targets == null || targets.Count == 0)
                return;

            var from = wr.ScreenPxPosition(self.CenterPosition);
            foreach (var target in targets)
            {
                if (target.Type == TargetType.Invalid)
                    continue;

                var to = wr.ScreenPxPosition(target.CenterPosition);
                Game.Renderer.WorldLineRenderer.DrawLine(from, to, c, c);
                wr.DrawTargetMarker(c, from);
                wr.DrawTargetMarker(c, to);
            }
        }
Esempio n. 26
0
        public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
        {
            wr.DrawRangeCircleWithContrast(
                Color.FromArgb(128, Color.Yellow), wr.ScreenPxPosition(centerPosition),
                ai.Traits.WithInterface<ArmamentInfo>()
                    .Select(a => Rules.Weapons[a.Weapon.ToLowerInvariant()].Range).Max(),
                Color.FromArgb(96, Color.Black));

            foreach (var a in w.ActorsWithTrait<RenderRangeCircle>())
                if (a.Actor.Owner == a.Actor.World.LocalPlayer)
                    if (a.Actor.Info.Traits.Get<RenderRangeCircleInfo>().RangeCircleType == RangeCircleType)
                        a.Trait.RenderAfterWorld(wr);
        }
Esempio n. 27
0
        public Rectangle ScreenBounds(WPos pos, WorldRenderer wr, float scale)
        {
            var r      = Model.AggregateBounds;
            var offset = OffsetFunc != null?OffsetFunc() : WVec.Zero;

            var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset);

            return(Rectangle.FromLTRB(
                       xy.X + (int)(r.Left * scale),
                       xy.Y + (int)(r.Top * scale),
                       xy.X + (int)(r.Right * scale),
                       xy.Y + (int)(r.Bottom * scale)));
        }
Esempio n. 28
0
        public void DrawRollover(WorldRenderer wr)
        {
            if (!Info.Selectable)
                return;

            var pos = wr.ScreenPxPosition(self.CenterPosition);
            var bounds = self.Bounds.Value;
            bounds.Offset(pos.X, pos.Y);

            var xy = new float2(bounds.Left, bounds.Top);
            var Xy = new float2(bounds.Right, bounds.Top);

            DrawHealthBar(wr, xy, Xy);
            DrawExtraBars(wr, xy, Xy);
        }
Esempio n. 29
0
 public void Render(WorldRenderer wr)
 {
     if (this.Actor == null)
     {
     }
     else
     {
         if (this.Actor.Info.Name == "refinery")
         {
             var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.Size.XY).ToInt2();
             //Console.WriteLine("x: " + xy.X + " y: " + xy.Y + " | offX:" + sprite.Offset.X + " offY:" + sprite.Offset.Y +" |SpriteRenderable " + this.Actor.Info.Name + " owner:" + this.Actor.Owner);
         }
         // Console.WriteLine("SpriteRenderable " + this.Actor.Info.Name + " owner:" + this.Actor.Owner);
     }
     Game.Renderer.WorldSpriteRenderer.DrawSprite(sprite, ScreenPosition(wr), palette, scale * sprite.Size);
 }
Esempio n. 30
0
		public void RenderAfterWorld(WorldRenderer wr)
		{
			if (self.World.FogObscures(self))
				return;

			var pos = wr.ScreenPxPosition(self.CenterPosition);
			var bounds = self.Bounds.Value;
			bounds.Offset(pos.X, pos.Y);

			var xy = new int2(bounds.Left, bounds.Top);
			var xY = new int2(bounds.Left, bounds.Bottom);

			DrawControlGroup(wr, self, xy);
			DrawPips(wr, self, xY);
			DrawTags(wr, self, new int2((bounds.Left + bounds.Right) / 2, bounds.Top));
		}
Esempio n. 31
0
        public void RenderAfterWorld(WorldRenderer wr)
        {
            if (!Info.Selectable)
                return;

            var pos = wr.ScreenPxPosition(self.CenterPosition);
            var bounds = self.Bounds.Value;
            bounds.Offset(pos.X, pos.Y);

            var xy = new float2(bounds.Left, bounds.Top);
            var Xy = new float2(bounds.Right, bounds.Top);

            wr.DrawSelectionBox(self, Color.White);
            DrawHealthBar(wr, xy, Xy);
            DrawExtraBars(wr, xy, Xy);
            DrawUnitPath(wr);
        }
Esempio n. 32
0
        IEnumerable<IRenderable> IRenderAboveShroud.RenderAboveShroud(Actor self, WorldRenderer wr)
        {
            if (self.World.FogObscures(self))
                yield break;

            var selected = self.World.Selection.Contains(self);
            var regularWorld = self.World.Type == WorldType.Regular;
            var statusBars = Game.Settings.Game.StatusBars;

            // Health bars are shown when:
            //  * actor is selected
            //  * status bar preference is set to "always show"
            //  * status bar preference is set to "when damaged" and actor is damaged
            var displayHealth = selected || (regularWorld && statusBars == StatusBarsType.AlwaysShow)
                || (regularWorld && statusBars == StatusBarsType.DamageShow && self.GetDamageState() != DamageState.Undamaged);

            // Extra bars are shown when:
            //  * actor is selected
            //  * status bar preference is set to "always show"
            //  * status bar preference is set to "when damaged"
            var displayExtra = selected || (regularWorld && statusBars != StatusBarsType.Standard);

            if (Info.RenderSelectionBox && selected)
                yield return new SelectionBoxRenderable(self, Info.SelectionBoxColor);

            if (Info.RenderSelectionBars && (displayHealth || displayExtra))
                yield return new SelectionBarsRenderable(self, displayHealth, displayExtra);

            // Target lines and pips are always only displayed for selected allied actors
            if (!selected || !self.Owner.IsAlliedWith(wr.World.RenderPlayer))
                yield break;

            if (self.World.LocalPlayer != null && self.World.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug)
                yield return new TargetLineRenderable(ActivityTargetPath(self), Color.Green);

            var b = self.VisualBounds;
            var pos = wr.ScreenPxPosition(self.CenterPosition);
            var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom));
            var pal = wr.Palette(Info.Palette);

            foreach (var r in DrawPips(self, wr, bl, pal))
                yield return r;
        }
Esempio n. 33
0
        public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
        {
            if (!self.Owner.IsAlliedWith(self.World.RenderPlayer) || self.World.FogObscures(self))
                yield break;

            var b = self.Bounds;
            var pos = wr.ScreenPxPosition(self.CenterPosition);
            var tl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Top));
            var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom));
            var tm = wr.Viewport.WorldToViewPx(pos + new int2((b.Left + b.Right) / 2, b.Top));

            foreach (var r in DrawControlGroup(wr, self, tl))
                yield return r;

            foreach (var r in DrawPips(wr, self, bl))
                yield return r;

            foreach (var r in DrawTags(wr, self, tm))
                yield return r;
        }
Esempio n. 34
0
        public void Render(WorldRenderer wr)
        {
            if (!actor.IsInWorld || actor.IsDead())
            {
                return;
            }

            var health = actor.TraitOrDefault <Health>();

            var screenPos = wr.ScreenPxPosition(pos);
            var bounds    = actor.Bounds.Value;

            bounds.Offset(screenPos.X, screenPos.Y);

            var xy = new float2(bounds.Left, bounds.Top);
            var Xy = new float2(bounds.Right, bounds.Top);

            DrawHealthBar(wr, health, xy, Xy);
            DrawExtraBars(wr, xy, Xy);
        }
Esempio n. 35
0
		public void Render(WorldRenderer wr)
		{
			var screenPos = wr.ScreenPxPosition(pos);
			var tl = screenPos + scale * new float2(visualBounds.Left, visualBounds.Top);
			var br = screenPos + scale * new float2(visualBounds.Right, visualBounds.Bottom);
			var tr = new float2(br.X, tl.Y);
			var bl = new float2(tl.X, br.Y);
			var u = new float2(4f / wr.Viewport.Zoom, 0);
			var v = new float2(0, 4f / wr.Viewport.Zoom);

			var wlr = Game.Renderer.WorldLineRenderer;
			wlr.DrawLine(tl + u, tl, color);
			wlr.DrawLine(tl, tl + v, color);
			wlr.DrawLine(tr, tr - u, color);
			wlr.DrawLine(tr, tr + v, color);

			wlr.DrawLine(bl, bl + u, color);
			wlr.DrawLine(bl, bl - v, color);
			wlr.DrawLine(br, br - u, color);
			wlr.DrawLine(br, br - v, color);
		}
Esempio n. 36
0
        public void Render(WorldRenderer wr)
        {
            var screenPos = wr.ScreenPxPosition(pos);
            var tl        = screenPos + scale * new float2(bounds.Left, bounds.Top);
            var br        = screenPos + scale * new float2(bounds.Right, bounds.Bottom);
            var tr        = new float2(br.X, tl.Y);
            var bl        = new float2(tl.X, br.Y);
            var u         = new float2(4f / wr.Viewport.Zoom, 0);
            var v         = new float2(0, 4f / wr.Viewport.Zoom);

            var wlr = Game.Renderer.WorldLineRenderer;

            wlr.DrawLine(tl + u, tl, color, color);
            wlr.DrawLine(tl, tl + v, color, color);
            wlr.DrawLine(tr, tr - u, color, color);
            wlr.DrawLine(tr, tr + v, color, color);

            wlr.DrawLine(bl, bl + u, color, color);
            wlr.DrawLine(bl, bl - v, color, color);
            wlr.DrawLine(br, br - u, color, color);
            wlr.DrawLine(br, br - v, color, color);
        }
Esempio n. 37
0
        public IEnumerable<IRenderable> Render(WorldRenderer wr)
        {
            if (!self.IsInWorld)
                yield break;

            if (self.IsDead())
                yield break;

            if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
                yield break;

            if (wr.world.FogObscures(self))
                yield break;

            var pos = wr.ScreenPxPosition(self.CenterPosition);
            var bounds = self.Bounds.Value;
            bounds.Offset(pos.X, pos.Y);

            var offset = (int)(4 / wr.Viewport.Zoom);
            var effectPos = wr.Position(new int2(bounds.Right - offset, bounds.Bottom - offset));
            yield return new SpriteRenderable(anim.Image, effectPos, WVec.Zero, 0, wr.Palette("effect"), 1f / wr.Viewport.Zoom, true);
        }
Esempio n. 38
0
        float3 ScreenPosition(WorldRenderer wr)
        {
            var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.Size.XY).ToInt2();

            return(new float3(xy, wr.ScreenZPosition(pos, 0) - 0.5f * scale * sprite.Size.Z));
        }
Esempio n. 39
0
        public void Render(WorldRenderer wr)
        {
            if (!waypoints.Any())
                return;

            var iz = 1 / wr.Viewport.Zoom;
            var first = wr.ScreenPxPosition(waypoints.First());
            var a = first;
            foreach (var b in waypoints.Skip(1).Select(pos => wr.ScreenPxPosition(pos)))
            {
                Game.Renderer.WorldRgbaColorRenderer.DrawLine(a, b, iz, color);
                DrawTargetMarker(wr, color, b);
                a = b;
            }

            DrawTargetMarker(wr, color, first);
        }
        public void RenderAfterWorld(WorldRenderer wr, World world)
        {
            var position = Game.viewport.ViewToWorld(Viewport.LastMousePos);
            var topLeft = position - FootprintUtils.AdjustForBuildingSize(BuildingInfo);

            var actorInfo = Rules.Info[Building];
            foreach (var dec in actorInfo.Traits.WithInterface<IPlaceBuildingDecoration>())
                dec.Render(wr, world, actorInfo, position.CenterPosition);	/* hack hack */

            var cells = new Dictionary<CPos, bool>();
            // Linebuild for walls.
            // Assumes a 1x1 footprint; weird things will happen for other footprints
            if (Rules.Info[Building].Traits.Contains<LineBuildInfo>())
            {
                foreach (var t in BuildingUtils.GetLineBuildCells(world, topLeft, Building, BuildingInfo))
                    cells.Add(t, BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, t));
            }
            else
            {
                if (!initialized)
                {
                    var rbi = Rules.Info[Building].Traits.Get<RenderBuildingInfo>();
                    var palette = rbi.Palette ?? (Producer.Owner != null ?
                                                  rbi.PlayerPalette + Producer.Owner.InternalName : null);

                    preview = rbi.RenderPreview(Rules.Info[Building], wr.Palette(palette));
                    initialized = true;
                }

                var offset = topLeft.CenterPosition + FootprintUtils.CenterOffset(BuildingInfo) - WPos.Zero;
                foreach (var r in preview)
                    r.OffsetBy(offset).Render(wr);

                var res = world.WorldActor.Trait<ResourceLayer>();
                var isCloseEnough = BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, topLeft);
                foreach (var t in FootprintUtils.Tiles(Building, BuildingInfo, topLeft))
                    cells.Add(t, isCloseEnough && world.IsCellBuildable(t, BuildingInfo) && res.GetResource(t) == null);
            }

            var pal = wr.Palette("terrain");
            foreach (var c in cells)
            {
                var tile = c.Value ? buildOk : buildBlocked;
                tile.DrawAt(wr.ScreenPxPosition(c.Key.CenterPosition) - 0.5f * tile.size, pal);
            }
        }
Esempio n. 41
0
        public void RenderAfterWorld(WorldRenderer wr, World world)
        {
            if (!self.IsInWorld)
                return;

            if (self.Owner != self.World.LocalPlayer)
                return;

            wr.DrawRangeCircle(
                Color.FromArgb(128, Color.DeepSkyBlue),
                wr.ScreenPxPosition(self.CenterPosition), (int)self.Trait<ChronoshiftDeploy>().Info.JumpDistance);
        }
Esempio n. 42
0
        public void Render(WorldRenderer wr)
        {
            var iz = 1 / wr.Viewport.Zoom;
            var screenPos = wr.ScreenPxPosition(pos);
            var tl = screenPos + new float2(visualBounds.Left, visualBounds.Top);
            var br = screenPos + new float2(visualBounds.Right, visualBounds.Bottom);
            var tr = new float2(br.X, tl.Y);
            var bl = new float2(tl.X, br.Y);
            var u = new float2(4 * iz, 0);
            var v = new float2(0, 4 * iz);

            var wcr = Game.Renderer.WorldRgbaColorRenderer;
            wcr.DrawLine(new[] { tl + u, tl, tl + v }, iz, color, true);
            wcr.DrawLine(new[] { tr - u, tr, tr + v }, iz, color, true);
            wcr.DrawLine(new[] { br - u, br, br - v }, iz, color, true);
            wcr.DrawLine(new[] { bl + u, bl, bl - v }, iz, color, true);
        }
Esempio n. 43
0
        public void Render(WorldRenderer wr)
        {
            if (!waypoints.Any())
                return;

            var first = wr.ScreenPxPosition(waypoints.First());
            var a = first;
            foreach (var b in waypoints.Skip(1).Select(pos => wr.ScreenPxPosition(pos)))
            {
                Game.Renderer.WorldLineRenderer.DrawLine(a, b, color, color);
                wr.DrawTargetMarker(color, b);
                a = b;
            }

            wr.DrawTargetMarker(color, first);
        }
Esempio n. 44
0
 public void Center(WPos pos)
 {
     CenterLocation  = worldRenderer.ScreenPxPosition(pos).Clamp(mapBounds);
     cellBoundsDirty = true;
 }
Esempio n. 45
0
 public void RenderDebugGeometry(WorldRenderer wr)
 {
     var size = font.Measure(text).ToFloat2();
     var offset = wr.ScreenPxPosition(pos) - 0.5f*size;
     Game.Renderer.WorldLineRenderer.DrawRect(offset, offset + size, Color.Red);
 }
Esempio n. 46
0
 float2 ScreenPosition(WorldRenderer wr)
 {
     return(wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.size).ToInt2());
 }
Esempio n. 47
0
 float2 ScreenPosition(WorldRenderer wr)
 {
     return wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.Size).ToInt2();
 }
Esempio n. 48
0
        public void Render(WorldRenderer wr)
        {
            if (!actor.IsInWorld || actor.IsDead)
                return;

            var health = actor.TraitOrDefault<Health>();

            var screenPos = wr.ScreenPxPosition(pos);
            var bounds = actor.Bounds;
            bounds.Offset(screenPos.X, screenPos.Y);

            var start = new float2(bounds.Left + 1, bounds.Top);
            var end = new float2(bounds.Right - 1, bounds.Top);

            DrawHealthBar(wr, health, start, end);
            DrawExtraBars(wr, start, end);
        }
Esempio n. 49
0
        void DrawUnitPath(WorldRenderer wr, Actor self)
        {
            if (self.World.LocalPlayer == null ||!self.World.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug) return;

            var activity = self.GetCurrentActivity();
            if (activity != null)
            {
                var targets = activity.GetTargets(self);
                var start = wr.ScreenPxPosition(self.CenterPosition);

                var c = Color.Green;

                var wlr = Game.Renderer.WorldLineRenderer;
                foreach (var stp in targets.Where(t => t.Type != TargetType.Invalid).Select(p => wr.ScreenPxPosition(p.CenterPosition)))
                {
                    wlr.DrawLine(stp + new float2(-1, -1), stp + new float2(-1, 1), c, c);
                    wlr.DrawLine(stp + new float2(-1, 1), stp + new float2(1, 1), c, c);
                    wlr.DrawLine(stp + new float2(1, 1), stp + new float2(1, -1), c, c);
                    wlr.DrawLine(stp + new float2(1, -1), stp + new float2(-1, -1), c, c);
                    wlr.DrawLine(start, stp, c, c);
                    start = stp;
                }
            }
        }