Rectangle FrozenActorBounds(FrozenActor fa) { var pos = worldRenderer.ScreenPxPosition(fa.CenterPosition); var bounds = fa.Bounds; bounds.Offset(pos.X, pos.Y); return bounds; }
Rectangle FrozenActorBounds(FrozenActor fa) { var pos = worldRenderer.ScreenPxPosition(fa.CenterPosition); var bounds = fa.Bounds; bounds.Offset(pos.X, pos.Y); return(bounds); }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { var c = target.Info.Traits.GetOrDefault<CapturableInfo>(); var canTargetActor = c != null && c.CanBeTargetedBy(self, target.Owner); cursor = canTargetActor ? "ability" : "move-blocked"; return canTargetActor; }
public void AddOrUpdate(Player viewer, FrozenActor fa) { if (removeFrozenActors[viewer].Contains(fa)) { removeFrozenActors[viewer].Remove(fa); } addOrUpdateFrozenActors[viewer].Add(fa); }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { var c = target.Info.TraitInfoOrDefault<ExternalCapturableInfo>(); var canTargetActor = c != null && c.CanBeTargetedBy(self, target.Owner); var capturesInfo = self.Trait<ExternalCaptures>().Info; cursor = canTargetActor ? capturesInfo.CaptureCursor : capturesInfo.CaptureBlockedCursor; return canTargetActor; }
Target(Actor a) { type = TargetType.Actor; actor = a; generation = a.Generation; terrainCenterPosition = WPos.Zero; terrainPositions = null; frozen = null; cell = null; subCell = null; }
Target(FrozenActor fa) { type = TargetType.FrozenActor; frozen = fa; terrainCenterPosition = WPos.Zero; terrainPositions = null; actor = null; cell = null; subCell = null; generation = 0; }
Target(World w, CPos c, SubCell subCell) { type = TargetType.Terrain; terrainCenterPosition = w.Map.CenterOfSubCell(c, subCell); terrainPositions = new[] { terrainCenterPosition }; cell = c; this.subCell = subCell; actor = null; frozen = null; generation = 0; }
Target(WPos terrainCenterPosition, WPos[] terrainPositions = null) { type = TargetType.Terrain; this.terrainCenterPosition = terrainCenterPosition; this.terrainPositions = terrainPositions ?? new[] { terrainCenterPosition }; actor = null; frozen = null; cell = null; subCell = null; generation = 0; }
/// <summary>Checks if the warhead is valid against (can do something to) the frozen actor.</summary> public bool IsValidAgainst(FrozenActor victim, Actor firedBy) { // AffectsParent checks do not make sense for FrozenActors, so skip to stance checks var stance = firedBy.Owner.Stances[victim.Owner]; if (!ValidStances.HasStance(stance)) return false; // A target type is valid if it is in the valid targets list, and not in the invalid targets list. if (!IsValidTarget(victim.TargetTypes)) return false; return true; }
public void Add(Player viewer, FrozenActor fa) { var pos = worldRenderer.ScreenPxPosition(fa.CenterPosition); var bounds = fa.Bounds; bounds.Offset(pos.X, pos.Y); var top = Math.Max(0, bounds.Top / info.BinSize); var left = Math.Max(0, bounds.Left / info.BinSize); var bottom = Math.Min(rows - 1, bounds.Bottom / info.BinSize); var right = Math.Min(cols - 1, bounds.Right / info.BinSize); for (var j = top; j <= bottom; j++) for (var i = left; i <= right; i++) frozen[viewer][j*cols + i].Add(fa, bounds); }
/// <summary>Checks if the warhead is valid against (can do something to) the frozen actor.</summary> public bool IsValidAgainst(FrozenActor victim, Actor firedBy) { if (!CanTargetActor(victim.Info, firedBy)) return false; // AffectsParent checks do not make sense for FrozenActors, so skip to stance checks var stance = firedBy.Owner.Stances[victim.Owner]; if (!ValidStances.HasStance(stance)) return false; // A target type is valid if it is in the valid targets list, and not in the invalid targets list. var targetable = victim.Info.Traits.GetOrDefault<ITargetableInfo>(); if (targetable == null || !IsValidTarget(targetable.GetTargetTypes())) return false; return true; }
public void Add(FrozenActor fa) { frozen.Add(fa.ID, fa); var top = (int)Math.Max(0, fa.Bounds.Top / info.BinSize); var left = (int)Math.Max(0, fa.Bounds.Left / info.BinSize); var bottom = (int)Math.Min(bins.GetUpperBound(1), fa.Bounds.Bottom / info.BinSize); var right = (int)Math.Min(bins.GetUpperBound(0), fa.Bounds.Right / info.BinSize); for (var j = top; j <= bottom; j++) { for (var i = left; i <= right; i++) { bins[i, j].Add(fa); } } }
public void Add(Player viewer, FrozenActor fa) { var pos = worldRenderer.ScreenPxPosition(fa.CenterPosition); var bounds = fa.Bounds; bounds.Offset(pos.X, pos.Y); var top = Math.Max(0, bounds.Top / info.BinSize); var left = Math.Max(0, bounds.Left / info.BinSize); var bottom = Math.Min(rows - 1, bounds.Bottom / info.BinSize); var right = Math.Min(cols - 1, bounds.Right / info.BinSize); for (var j = top; j <= bottom; j++) { for (var i = left; i <= right; i++) { frozen[viewer][j * cols + i].Add(fa, bounds); } } }
public static void SetTargetLine(this Actor self, FrozenActor target, Color color, bool display) { if (self.Owner != self.World.LocalPlayer) { return; } self.World.AddFrameEndTask(w => { if (self.Destroyed) { return; } target.Flash(); var line = self.TraitOrDefault <DrawLineToTarget>(); if (line != null) { line.SetTarget(self, Target.FromPos(target.CenterPosition), color, display); } }); }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { var capturesInfo = self.Trait<Captures>().Info; var c = target.Info.TraitInfoOrDefault<CapturableInfo>(); if (c == null || !c.CanBeTargetedBy(self, target.Owner)) { cursor = capturesInfo.EnterCursor; return false; } var health = target.Info.TraitInfoOrDefault<HealthInfo>(); var lowEnoughHealth = target.HP <= c.CaptureThreshold * health.HP / 100; cursor = !sabotage || lowEnoughHealth || target.Owner.NonCombatant ? capturesInfo.EnterCursor : capturesInfo.SabotageCursor; return true; }
public void Add(FrozenActor fa) { frozenActorsById.Add(fa.ID, fa); world.ScreenMap.Add(owner, fa); partitionedFrozenActorIds.Add(fa.ID, FootprintBounds(fa)); }
public static Target FromFrozenActor(FrozenActor a) { return(new Target { frozen = a, type = TargetType.FrozenActor }); }
public void Add(FrozenActor fa) { frozen.Add(fa.ID, fa); var top = (int)Math.Max(0, fa.Bounds.Top / info.BinSize); var left = (int)Math.Max(0, fa.Bounds.Left / info.BinSize); var bottom = (int)Math.Min(bins.GetUpperBound(1), fa.Bounds.Bottom / info.BinSize); var right = (int)Math.Min(bins.GetUpperBound(0), fa.Bounds.Right / info.BinSize); for (var j = top; j <= bottom; j++) for (var i = left; i <= right; i++) bins[i, j].Add(fa); }
public void Add(Player viewer, FrozenActor fa) { partitionedFrozenActors[viewer].Add(fa, FrozenActorBounds(fa)); }
public static Target FromFrozenActor(FrozenActor a) { return new Target { frozen = a, type = TargetType.FrozenActor }; }
public void Remove(Player viewer, FrozenActor fa) { removeFrozenActors[viewer].Add(fa); }
public void Remove(Player viewer, FrozenActor fa) { partitionedFrozenActors[viewer].Remove(fa); }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { return target.TargetTypes.Overlaps(targetTypes); }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { return target.Info.Traits.Contains<AcceptsSuppliesInfo>(); }
public abstract bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor);
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { return target.Info.Traits.WithInterface<IDemolishableInfo>().Any(i => i.IsValidTarget(target.Info, self)); }
public bool IsValidAgainst(FrozenActor a) { var targetable = a.Info.Traits.GetOrDefault<ITargetableInfo>(); if (targetable == null || !ValidTargets.Intersect(targetable.GetTargetTypes()).Any() || InvalidTargets.Intersect(targetable.GetTargetTypes()).Any()) return false; if (Warheads.All(w => w.EffectivenessAgainst(a.Info) <= 0)) return false; return true; }
public void Remove(FrozenActor fa) { partitionedFrozenActorIds.Remove(fa.ID); world.ScreenMap.Remove(owner, fa); frozenActorsById.Remove(fa.ID); }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { // TODO: Bridges don't yet support FrozenUnderFog. if (target.Actor != null && target.Actor.HasTrait<BridgeHut>()) return false; return true; }
public void UpdateMouseover() { TooltipType = WorldTooltipType.None; var cell = worldRenderer.Viewport.ViewToWorld(Viewport.LastMousePos); if (!world.Map.Contains(cell)) return; if (world.ShroudObscures(cell)) { TooltipType = WorldTooltipType.Unexplored; return; } var underCursor = world.ScreenMap.ActorsAt(worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos)) .Where(a => !world.FogObscures(a) && a.HasTrait<IToolTip>()) .WithHighestSelectionPriority(); if (underCursor != null) { ActorTooltip = underCursor.TraitsImplementing<IToolTip>().First(); TooltipType = WorldTooltipType.Actor; return; } var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos)) .Where(a => a.TooltipName != null && a.IsValid) .WithHighestSelectionPriority(); if (frozen != null) { FrozenActorTooltip = frozen; TooltipType = WorldTooltipType.FrozenActor; } }
/// <summary>Checks if the weapon is valid against (can target) the frozen actor.</summary> public bool IsValidAgainst(FrozenActor victim, Actor firedBy) { var targetable = victim.Info.Traits.GetOrDefault<ITargetableInfo>(); if (targetable == null || !IsValidTarget(targetable.GetTargetTypes())) return false; if (!Warheads.Any(w => w.IsValidAgainst(victim, firedBy))) return false; return true; }
public void Remove(Player viewer, FrozenActor fa) { foreach (var bin in frozen[viewer]) bin.Remove(fa); }
/// <summary>Checks if the weapon is valid against (can target) the frozen actor.</summary> public bool IsValidAgainst(FrozenActor victim, Actor firedBy) { if (!IsValidTarget(victim.TargetTypes)) return false; if (!Warheads.Any(w => w.IsValidAgainst(victim, firedBy))) return false; return true; }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { var c = target.Info.Traits.GetOrDefault<CapturableInfo>(); if (c == null || !c.CanBeTargetedBy(self, target.Owner)) { cursor = "enter-blocked"; return false; } var health = target.Info.Traits.GetOrDefault<HealthInfo>(); var lowEnoughHealth = target.HP <= c.CaptureThreshold * health.HP; cursor = !sabotage || lowEnoughHealth || target.Owner.NonCombatant ? "enter" : "capture"; return true; }
public static void SetTargetLine(this Actor self, FrozenActor target, Color color, bool display) { if (self.Owner != self.World.LocalPlayer) return; self.World.AddFrameEndTask(w => { if (self.Disposed) return; target.Flash(); var line = self.TraitOrDefault<DrawLineToTarget>(); if (line != null) line.SetTarget(self, Target.FromPos(target.CenterPosition), color, display); }); }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { var stance = self.Owner.Stances[target.Owner]; if (!info.ValidStances.HasStance(stance)) return false; return target.Info.Traits.WithInterface<ITargetableInfo>().Any(t => t.GetTargetTypes().Intersect(info.Types).Any()); }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { return target.Info.Traits.WithInterface<ITargetableInfo>().Any(t => t.GetTargetTypes().Contains(targetType)); }
public void Add(FrozenActor fa) { frozen.Add(fa.ID, fa); world.ScreenMap.Add(owner, fa); }
public void UpdateMouseover() { TooltipType = WorldTooltipType.None; ActorTooltipExtra = null; var cell = worldRenderer.Viewport.ViewToWorld(Viewport.LastMousePos); if (!world.Map.Contains(cell)) return; if (world.ShroudObscures(cell)) { TooltipType = WorldTooltipType.Unexplored; return; } var underCursor = world.ScreenMap.ActorsAt(worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos)) .Where(a => !world.FogObscures(a) && a.Info.HasTraitInfo<ITooltipInfo>()) .WithHighestSelectionPriority(); if (underCursor != null) { ActorTooltip = underCursor.TraitsImplementing<ITooltip>().First(); ActorTooltipExtra = underCursor.TraitsImplementing<IProvideTooltipInfo>().ToArray(); TooltipType = WorldTooltipType.Actor; return; } var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos)) .Where(a => a.TooltipInfo != null && a.IsValid) .WithHighestSelectionPriority(); if (frozen != null) { var actor = frozen.Actor; if (actor != null && actor.TraitsImplementing<IVisibilityModifier>().Any(t => !t.IsVisible(actor, world.RenderPlayer))) return; FrozenActorTooltip = frozen; if (frozen.Actor != null) ActorTooltipExtra = frozen.Actor.TraitsImplementing<IProvideTooltipInfo>().ToArray(); TooltipType = WorldTooltipType.FrozenActor; } }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { var stance = self.Owner.Stances[target.Owner]; if (!info.ValidStances.HasStance(stance)) return false; return info.Types.Overlaps(target.Info.TraitInfos<ITargetableInfo>().SelectMany(ti => ti.GetTargetTypes())); }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { // TODO: Bridges don't yet support FrozenUnderFog. return false; }
public static Target FromFrozenActor(FrozenActor fa) { return(new Target(fa)); }