Merge pull request #12355 from reaperrr/rem-nuke-DelAct

Remove DelayedAction from NukePower
This commit is contained in:
Oliver Brakmann
2016-12-28 18:56:33 +01:00
committed by GitHub
13 changed files with 154 additions and 40 deletions

View File

@@ -32,18 +32,21 @@ namespace OpenRA.Mods.Common.Effects
readonly Animation clock;
readonly int duration;
int delay;
int arrowHeight = MaxArrowHeight;
int arrowSpeed = 50;
int tick;
// Player-placed beacons are removed after a delay
public Beacon(Player owner, WPos position, int duration, string beaconPalette, bool isPlayerPalette, string beaconCollection, string arrowSprite, string circleSprite)
public Beacon(Player owner, WPos position, int duration, string beaconPalette, bool isPlayerPalette,
string beaconCollection, string arrowSprite, string circleSprite, int delay = 0)
{
this.owner = owner;
this.position = position;
this.beaconPalette = beaconPalette;
this.isPlayerPalette = isPlayerPalette;
this.duration = duration;
this.delay = delay;
if (!string.IsNullOrEmpty(arrowSprite))
{
@@ -58,10 +61,10 @@ namespace OpenRA.Mods.Common.Effects
}
}
// Support power beacons are expected to clean themselves up
// By default, support power beacons are expected to clean themselves up
public Beacon(Player owner, WPos position, bool isPlayerPalette, string palette, string posterCollection, string posterType, string posterPalette,
string arrowSequence, string circleSequence, string clockSequence, Func<float> clockFraction)
: this(owner, position, -1, palette, isPlayerPalette, posterCollection, arrowSequence, circleSequence)
string arrowSequence, string circleSequence, string clockSequence, Func<float> clockFraction, int delay = 0, int duration = -1)
: this(owner, position, duration, palette, isPlayerPalette, posterCollection, arrowSequence, circleSequence, delay)
{
this.posterPalette = posterPalette;
@@ -80,6 +83,9 @@ namespace OpenRA.Mods.Common.Effects
void IEffect.Tick(World world)
{
if (delay-- > 0)
return;
arrowHeight += arrowSpeed;
var clamped = arrowHeight.Clamp(0, MaxArrowHeight);
if (arrowHeight != clamped)
@@ -105,6 +111,9 @@ namespace OpenRA.Mods.Common.Effects
IEnumerable<IRenderable> IEffectAboveShroud.RenderAboveShroud(WorldRenderer r)
{
if (delay > 0)
yield break;
if (!owner.IsAlliedWith(owner.World.RenderPlayer))
yield break;

View File

@@ -0,0 +1,81 @@
#region Copyright & License Information
/*
* Copyright 2007-2016 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using System.Collections.Generic;
using System.Linq;
using OpenRA.Effects;
using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Effects
{
public class RevealShroudEffect : IEffect
{
static readonly PPos[] NoCells = { };
readonly WPos pos;
readonly Player player;
readonly Shroud.SourceType sourceType;
readonly WDist revealRadius;
readonly Stance validStances;
readonly int duration;
int ticks;
public RevealShroudEffect(WPos pos, WDist radius, Shroud.SourceType type, Player forPlayer, Stance stances, int delay = 0, int duration = 50)
{
this.pos = pos;
player = forPlayer;
revealRadius = radius;
validStances = stances;
sourceType = type;
this.duration = duration;
ticks = -delay;
}
void AddCellsToPlayerShroud(Player p, PPos[] uv) { if (!validStances.HasStance(p.Stances[player])) return; p.Shroud.AddSource(this, sourceType, uv); }
void RemoveCellsFromPlayerShroud(Player p) { p.Shroud.RemoveSource(this); }
PPos[] ProjectedCells(World world)
{
var map = world.Map;
var range = revealRadius;
if (range == WDist.Zero)
return NoCells;
return Shroud.ProjectedCellsInRange(map, pos, range)
.ToArray();
}
public void Tick(World world)
{
if (ticks == 0)
{
var cells = ProjectedCells(world);
foreach (var p in world.Players)
AddCellsToPlayerShroud(p, cells);
}
if (ticks == duration)
{
foreach (var p in world.Players)
RemoveCellsFromPlayerShroud(p);
world.AddFrameEndTask(w => w.Remove(this));
}
ticks++;
}
public IEnumerable<IRenderable> Render(WorldRenderer wr) { return SpriteRenderable.None; }
}
}

View File

@@ -138,6 +138,7 @@
<Compile Include="Effects\Contrail.cs" />
<Compile Include="Effects\ContrailFader.cs" />
<Compile Include="Effects\CrateEffect.cs" />
<Compile Include="Effects\RevealShroudEffect.cs" />
<Compile Include="Effects\FlashTarget.cs" />
<Compile Include="Effects\FloatingText.cs" />
<Compile Include="Effects\PowerdownIndicator.cs" />

View File

@@ -176,7 +176,8 @@ namespace OpenRA.Mods.Common.Traits
Info.ArrowSequence,
Info.CircleSequence,
Info.ClockSequence,
() => 1 - ((distanceTestActor.CenterPosition - target).HorizontalLength - info.BeaconDistanceOffset.Length) * 1f / distance);
() => 1 - ((distanceTestActor.CenterPosition - target).HorizontalLength - info.BeaconDistanceOffset.Length) * 1f / distance,
Info.BeaconDelay);
w.Add(beacon);
}

View File

@@ -39,29 +39,34 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Palette to use for the missile weapon image.")]
[PaletteReference("IsPlayerPalette")] public readonly string MissilePalette = "effect";
[Desc("Custom palette is a player palette BaseName")]
[Desc("Custom palette is a player palette BaseName.")]
public readonly bool IsPlayerPalette = false;
[Desc("Travel time - split equally between ascent and descent")]
[Desc("Travel time - split equally between ascent and descent.")]
public readonly int FlightDelay = 400;
[Desc("Visual ascent velocity in WDist / tick")]
[Desc("Visual ascent velocity in WDist / tick.")]
public readonly WDist FlightVelocity = new WDist(512);
[Desc("Descend immediately on the target, with half the FlightDelay")]
[Desc("Descend immediately on the target, with half the FlightDelay.")]
public readonly bool SkipAscent = false;
[Desc("Amount of time before detonation to remove the beacon")]
[Desc("Amount of time before detonation to remove the beacon.")]
public readonly int BeaconRemoveAdvance = 25;
[ActorReference]
[Desc("Actor to spawn before detonation")]
public readonly string CameraActor = null;
[Desc("Range of cells the camera should reveal around target cell.")]
public readonly WDist CameraRange = WDist.Zero;
[Desc("Amount of time before detonation to spawn the camera")]
[Desc("Can the camera reveal shroud generated by the GeneratesShroud trait?")]
public readonly bool RevealGeneratedShroud = true;
[Desc("Reveal cells to players with these stances only.")]
public readonly Stance CameraStances = Stance.Ally;
[Desc("Amount of time before detonation to spawn the camera.")]
public readonly int CameraSpawnAdvance = 25;
[Desc("Amount of time after detonation to remove the camera")]
[Desc("Amount of time after detonation to remove the camera.")]
public readonly int CameraRemoveDelay = 25;
[Desc("Corresponds to `Type` from `FlashPaletteEffect` on the world actor.")]
@@ -114,19 +119,13 @@ namespace OpenRA.Mods.Common.Traits
self.World.AddFrameEndTask(w => w.Add(missile));
if (info.CameraActor != null)
if (info.CameraRange != WDist.Zero)
{
var camera = self.World.CreateActor(false, info.CameraActor, new TypeDictionary
{
new LocationInit(order.TargetLocation),
new OwnerInit(self.Owner),
});
var type = info.RevealGeneratedShroud ? Shroud.SourceType.Visibility
: Shroud.SourceType.PassiveVisibility;
camera.QueueActivity(new Wait(info.CameraSpawnAdvance + info.CameraRemoveDelay));
camera.QueueActivity(new RemoveSelf());
Action addCamera = () => self.World.AddFrameEndTask(w => w.Add(camera));
self.World.AddFrameEndTask(w => w.Add(new DelayedAction(info.FlightDelay - info.CameraSpawnAdvance, addCamera)));
self.World.AddFrameEndTask(w => w.Add(new RevealShroudEffect(targetPosition, info.CameraRange, type, self.Owner, info.CameraStances,
info.FlightDelay - info.CameraSpawnAdvance, info.CameraSpawnAdvance + info.CameraRemoveDelay)));
}
if (Info.DisplayBeacon)
@@ -142,18 +141,13 @@ namespace OpenRA.Mods.Common.Traits
Info.ArrowSequence,
Info.CircleSequence,
Info.ClockSequence,
() => missile.FractionComplete);
Action removeBeacon = () => self.World.AddFrameEndTask(w =>
{
w.Remove(beacon);
beacon = null;
});
() => missile.FractionComplete,
Info.BeaconDelay,
info.FlightDelay - info.BeaconRemoveAdvance);
self.World.AddFrameEndTask(w =>
{
w.Add(beacon);
w.Add(new DelayedAction(info.FlightDelay - info.BeaconRemoveAdvance, removeBeacon));
});
}
}

View File

@@ -64,6 +64,9 @@ namespace OpenRA.Mods.Common.Traits
[SequenceReference("BeaconImage")] public readonly string ArrowSequence = "arrow";
[SequenceReference("BeaconImage")] public readonly string CircleSequence = "circles";
[Desc("Delay after launch, measured in ticks.")]
public readonly int BeaconDelay = 0;
public readonly bool DisplayRadarPing = false;
[Desc("Measured in ticks.")]

View File

@@ -704,6 +704,22 @@ namespace OpenRA.Mods.Common.UtilityCommands
RenameNodeKey(node, "-ConditionManager");
}
// Replaced NukePower CameraActor with CameraRange (effect-based reveal)
if (engineVersion < 20161227)
{
var nukePower = node.Value.Nodes.FirstOrDefault(n => n.Key.StartsWith("NukePower"));
if (nukePower != null)
{
var cameraActor = nukePower.Value.Nodes.FirstOrDefault(n => n.Key == "CameraActor");
if (cameraActor != null)
{
nukePower.Value.Nodes.Remove(cameraActor);
nukePower.Value.Nodes.Add(new MiniYamlNode("CameraRange", "10"));
Console.WriteLine("If your camera actor had a different reveal range than 10, you'll need to correct that manually");
}
}
}
UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1);
}

View File

@@ -212,7 +212,8 @@ namespace OpenRA.Mods.RA.Traits
Info.ArrowSequence,
Info.CircleSequence,
Info.ClockSequence,
() => 1 - ((distanceTestActor.CenterPosition - target).HorizontalLength - info.BeaconDistanceOffset.Length) * 1f / distance);
() => 1 - ((distanceTestActor.CenterPosition - target).HorizontalLength - info.BeaconDistanceOffset.Length) * 1f / distance,
Info.BeaconDelay);
w.Add(beacon);
}

View File

@@ -27,15 +27,17 @@ namespace OpenRA.Mods.TS.Effects
readonly Animation beacon;
readonly int duration;
int delay;
int tick;
public AnimatedBeacon(Player owner, WPos position, int duration, string beaconPalette, bool isPlayerPalette, string beaconImage, string beaconSequence)
public AnimatedBeacon(Player owner, WPos position, int duration, string beaconPalette, bool isPlayerPalette, string beaconImage, string beaconSequence, int delay = 0)
{
this.owner = owner;
this.position = position;
this.beaconPalette = beaconPalette;
this.isPlayerPalette = isPlayerPalette;
this.duration = duration;
this.delay = delay;
if (!string.IsNullOrEmpty(beaconSequence))
{
@@ -49,6 +51,9 @@ namespace OpenRA.Mods.TS.Effects
void IEffect.Tick(World world)
{
if (delay-- > 0)
return;
if (beacon != null)
beacon.Tick();
@@ -60,6 +65,9 @@ namespace OpenRA.Mods.TS.Effects
IEnumerable<IRenderable> IEffectAboveShroud.RenderAboveShroud(WorldRenderer r)
{
if (delay > 0)
return SpriteRenderable.None;
if (beacon == null)
return SpriteRenderable.None;

View File

@@ -633,7 +633,7 @@ TMPL:
BeaconPoster: atomic
BeaconPosterPalette: beaconposter
DisplayRadarPing: True
CameraActor: camera
CameraRange: 10c0
SupportPowerChargeBar:
Power:
Amount: -150

View File

@@ -951,7 +951,7 @@ palace:
SpawnOffset: -512,1c171,0
DisplayBeacon: True
DisplayRadarPing: True
CameraActor: camera
CameraRange: 10c0
ActivationSequence:
ProduceActorPower@fremen:
Description: Recruit Fremen

View File

@@ -36,8 +36,8 @@ MSLO:
DisplayBeacon: True
DisplayRadarPing: True
BeaconPoster: atomicon
CameraActor: camera
FlashType: Nuke
CameraRange: 10c0
CanPowerDown:
PowerupSound: EnablePower
PowerdownSound: DisablePower

View File

@@ -272,6 +272,6 @@ NAMISL:
DisplayBeacon: False
DisplayRadarPing: True
BeaconPoster:
CameraActor: camera
CameraRange: 10c0
SelectionDecorations:
VisualBounds: 75,48