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(); } }
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; }
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); }
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); }
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) }); }
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(); } }
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 + "%") }); }
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) }); }
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) }); }
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)); }
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)); }
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; }