Exemple #1
0
		Rectangle FrozenActorBounds(FrozenActor fa)
		{
			var pos = worldRenderer.ScreenPxPosition(fa.CenterPosition);
			var bounds = fa.Bounds;
			bounds.Offset(pos.X, pos.Y);
			return bounds;
		}
Exemple #2
0
        Rectangle FrozenActorBounds(FrozenActor fa)
        {
            var pos    = worldRenderer.ScreenPxPosition(fa.CenterPosition);
            var bounds = fa.Bounds;

            bounds.Offset(pos.X, pos.Y);
            return(bounds);
        }
Exemple #3
0
        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;
        }
Exemple #4
0
        public void AddOrUpdate(Player viewer, FrozenActor fa)
        {
            if (removeFrozenActors[viewer].Contains(fa))
            {
                removeFrozenActors[viewer].Remove(fa);
            }

            addOrUpdateFrozenActors[viewer].Add(fa);
        }
Exemple #5
0
        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;
        }
Exemple #6
0
        Target(Actor a)
        {
            type       = TargetType.Actor;
            actor      = a;
            generation = a.Generation;

            terrainCenterPosition = WPos.Zero;
            terrainPositions      = null;
            frozen  = null;
            cell    = null;
            subCell = null;
        }
Exemple #7
0
        Target(FrozenActor fa)
        {
            type   = TargetType.FrozenActor;
            frozen = fa;

            terrainCenterPosition = WPos.Zero;
            terrainPositions      = null;
            actor      = null;
            cell       = null;
            subCell    = null;
            generation = 0;
        }
Exemple #8
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;
        }
Exemple #9
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;
        }
Exemple #10
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;
		}
Exemple #11
0
		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);
		}
Exemple #12
0
        /// <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;
        }
Exemple #13
0
        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);
                }
            }
        }
Exemple #14
0
        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);
                }
            }
        }
Exemple #15
0
        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);
                }
            });
        }
Exemple #16
0
            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));
 }
Exemple #18
0
 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);
        }
Exemple #20
0
 public void Add(Player viewer, FrozenActor fa)
 {
     partitionedFrozenActors[viewer].Add(fa, FrozenActorBounds(fa));
 }
Exemple #21
0
 public static Target FromFrozenActor(FrozenActor a)
 {
     return new Target { frozen = a, type = TargetType.FrozenActor };
 }
Exemple #22
0
 public void Remove(Player viewer, FrozenActor fa)
 {
     removeFrozenActors[viewer].Add(fa);
 }
Exemple #23
0
 public void Remove(Player viewer, FrozenActor fa)
 {
     partitionedFrozenActors[viewer].Remove(fa);
 }
Exemple #24
0
 public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor)
 {
     return target.TargetTypes.Overlaps(targetTypes);
 }
Exemple #25
0
 public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor)
 {
     return target.Info.Traits.Contains<AcceptsSuppliesInfo>();
 }
Exemple #26
0
 public abstract bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor);
Exemple #27
0
 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));
 }
Exemple #28
0
		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);
 }
Exemple #30
0
            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;
            }
Exemple #31
0
 public void Add(Player viewer, FrozenActor fa)
 {
     partitionedFrozenActors[viewer].Add(fa, FrozenActorBounds(fa));
 }
Exemple #32
0
 public void Remove(Player viewer, FrozenActor fa)
 {
     partitionedFrozenActors[viewer].Remove(fa);
 }
		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;
			}
		}
Exemple #34
0
        /// <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;
        }
Exemple #35
0
		public void Remove(Player viewer, FrozenActor fa)
		{
			foreach (var bin in frozen[viewer])
				bin.Remove(fa);
		}
Exemple #36
0
        /// <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;
        }
Exemple #37
0
			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;
			}
Exemple #38
0
        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);
            });
        }
Exemple #39
0
        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));
 }
Exemple #41
0
 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;
			}
		}
Exemple #43
0
        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 void Add(FrozenActor fa)
 {
     frozen.Add(fa.ID, fa);
     world.ScreenMap.Add(owner, fa);
 }
Exemple #45
0
 public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor)
 {
     // TODO: Bridges don't yet support FrozenUnderFog.
     return false;
 }
Exemple #46
0
 public static Target FromFrozenActor(FrozenActor fa)
 {
     return(new Target(fa));
 }