Skip to content

Commit

Permalink
Created FlashPaletteEffectWarhead and removed the hardcoded flashing …
Browse files Browse the repository at this point in the history
…from NukeLaunch

Not actually hardcoded, but there was a hard dependency in NukeLaunch on FlashPaletteEffect and explicit flashing checks.
  • Loading branch information
penev92 authored and abcdefg30 committed Jul 10, 2020
1 parent 2e7bd4d commit 8c394a4
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 12 deletions.
8 changes: 1 addition & 7 deletions OpenRA.Mods.Common/Projectiles/NukeLaunch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ public class NukeLaunch : IProjectile, ISpatiallyPartitionable
readonly string weaponPalette;
readonly string upSequence;
readonly string downSequence;
readonly string flashType;

readonly WPos ascendSource;
readonly WPos ascendTarget;
Expand All @@ -51,7 +50,7 @@ public class NukeLaunch : IProjectile, ISpatiallyPartitionable

public NukeLaunch(Player firedBy, string name, WeaponInfo weapon, string weaponPalette, string upSequence, string downSequence,
WPos launchPos, WPos targetPos, WDist detonationAltitude, bool removeOnDetonation, WDist velocity, int launchDelay, int impactDelay,
bool skipAscent, string flashType,
bool skipAscent,
string trailImage, string[] trailSequences, string trailPalette, bool trailUsePlayerPalette, int trailDelay, int trailInterval)
{
this.firedBy = firedBy;
Expand All @@ -62,7 +61,6 @@ public NukeLaunch(Player firedBy, string name, WeaponInfo weapon, string weaponP
this.launchDelay = launchDelay;
this.impactDelay = impactDelay;
turn = skipAscent ? 0 : impactDelay / 2;
this.flashType = flashType;
this.trailImage = trailImage;
this.trailSequences = trailSequences;
this.trailPalette = trailPalette;
Expand Down Expand Up @@ -151,10 +149,6 @@ void Explode(World world, bool removeProjectile)

weapon.Impact(target, warheadArgs);

foreach (var flash in world.WorldActor.TraitsImplementing<FlashPaletteEffect>())
if (flash.Info.Type == flashType)
flash.Enable(-1);

detonated = true;
}

Expand Down
4 changes: 0 additions & 4 deletions OpenRA.Mods.Common/Traits/SupportPowers/NukePower.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,6 @@ class NukePowerInfo : SupportPowerInfo
[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.")]
public readonly string FlashType = null;

public WeaponInfo WeaponInfo { get; private set; }

public override object Create(ActorInitializer init) { return new NukePower(init.Self, this); }
Expand Down Expand Up @@ -156,7 +153,6 @@ public void Activate(Actor self, WPos targetPosition)
launchPos,
targetPosition, info.DetonationAltitude, info.RemoveMissileOnDetonation,
info.FlightVelocity, info.MissileDelay, info.FlightDelay, skipAscent,
info.FlashType,
info.TrailImage, info.TrailSequences, info.TrailPalette, info.TrailUsePlayerPalette, info.TrailDelay, info.TrailInterval);

self.World.AddFrameEndTask(w => w.Add(missile));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#region Copyright & License Information
/*
* Copyright 2007-2020 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;
using System.Collections.Generic;
using System.Linq;

namespace OpenRA.Mods.Common.UpdateRules.Rules
{
public class CreateFlashPaletteEffectWarhead : UpdateRule
{
public override string Name { get { return "Create FlashPaletteEffectWarhead to replace hardcoded nuke flashing."; } }

public override string Description
{
get
{
return "The trait NukePower (via the NukeLaunch projectile that it uses) no longer has built-in palette flashing.";
}
}

readonly List<Tuple<string, string, string>> weaponsToUpdate = new List<Tuple<string, string, string>>();

public override IEnumerable<string> UpdateActorNode(ModData modData, MiniYamlNode actorNode)
{
var nukePowerTraits = actorNode.ChildrenMatching("NukePower");
foreach (var nukePowerTrait in nukePowerTraits)
{
var traitName = nukePowerTrait.Key;
var weaponNode = nukePowerTrait.ChildrenMatching("MissileWeapon").FirstOrDefault();
if (weaponNode == null)
continue;

var weaponName = weaponNode.Value.Value;

weaponsToUpdate.Add(new Tuple<string, string, string>(weaponName, traitName, "{0} ({1})".F(actorNode.Key, actorNode.Location.Filename)));

nukePowerTrait.RemoveNodes("FlashType");
}

yield break;
}

public override IEnumerable<string> AfterUpdate(ModData modData)
{
if (weaponsToUpdate.Any())
yield return "Add a FlashPaletteEffectWarhead to the following weapons:\n" +
UpdateUtils.FormatMessageList(weaponsToUpdate.Select(x => "Weapon `{0}`, used by trait `{1}` on actor {2}".F(x.Item1, x.Item2, x.Item3)));

weaponsToUpdate.Clear();
}
}
}
1 change: 1 addition & 0 deletions OpenRA.Mods.Common/UpdateRules/UpdatePath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ public class UpdatePath
new ConvertSupportPowerRangesToFootprint(),
new UpdateTilesetColors(),
new UpdateMapInits(),
new CreateFlashPaletteEffectWarhead(),
})
};

Expand Down
35 changes: 35 additions & 0 deletions OpenRA.Mods.Common/Warheads/FlashPaletteEffectWarhead.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#region Copyright & License Information
/*
* Copyright 2007-2020 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 OpenRA.GameRules;
using OpenRA.Mods.Common.Traits;
using OpenRA.Traits;

namespace OpenRA.Mods.Common.Warheads
{
[Desc("Used to trigger a FlashPaletteEffect trait on the world actor.")]
public class FlashPaletteEffectWarhead : Warhead
{
[Desc("Corresponds to `Type` from `FlashPaletteEffect` on the world actor.")]
public readonly string FlashType = null;

[FieldLoader.Require]
[Desc("Duration of the flashing, measured in ticks. Set to -1 to default to the `Length` of the `FlashPaletteEffect`.")]
public readonly int Duration = 0;

public override void DoImpact(Target target, WarheadArgs args)
{
foreach (var flash in args.SourceActor.World.WorldActor.TraitsImplementing<FlashPaletteEffect>())
if (flash.Info.Type == FlashType)
flash.Enable(Duration);
}
}
}
2 changes: 2 additions & 0 deletions mods/cnc/weapons/superweapons.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ Atomic:
Duration: 20
Intensity: 5
Multiplier: 1,1
Warhead@14FlashEffect: FlashPaletteEffect
Duration: 20

IonCannon:
ValidTargets: Ground, Water, Air, Trees
Expand Down
2 changes: 2 additions & 0 deletions mods/d2k/weapons/other.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ DeathHand:
Duration: 20
Intensity: 5
Multiplier: 1,1
Warhead@FlashEffect: FlashPaletteEffect
Duration: 20

DeathHandCluster:
Inherits: Debris2
Expand Down
1 change: 0 additions & 1 deletion mods/ra/rules/structures.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ MSLO:
DisplayBeacon: True
DisplayRadarPing: True
BeaconPoster: atomicon
FlashType: Nuke
CameraRange: 10c0
ArrowSequence: arrow
ClockSequence: clock
Expand Down
3 changes: 3 additions & 0 deletions mods/ra/weapons/superweapons.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -134,3 +134,6 @@ Atomic:
Duration: 20
Intensity: 5
Multiplier: 1,1
Warhead@22FlashEffect: FlashPaletteEffect
Duration: 20
FlashType: Nuke

0 comments on commit 8c394a4

Please sign in to comment.