Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace Cloak palette effects with vertex effects #21215

Merged
merged 3 commits into from
Dec 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
58 changes: 45 additions & 13 deletions OpenRA.Mods.Common/Traits/Cloak.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ public enum UncloakType
// Type tag for DetectionTypes
public class DetectionType { }

public enum CloakStyle { None, Alpha, Color, Palette }

[Desc("This unit can cloak and uncloak in specific situations.")]
public class CloakInfo : PausableConditionalTraitInfo
{
Expand All @@ -57,10 +59,6 @@ public class CloakInfo : PausableConditionalTraitInfo
public readonly string CloakSound = null;
public readonly string UncloakSound = null;

[PaletteReference(nameof(IsPlayerPalette))]
public readonly string Palette = "cloak";
public readonly bool IsPlayerPalette = false;

public readonly BitSet<DetectionType> DetectionTypes = new("Cloak");

[GrantedConditionReference]
Expand All @@ -70,6 +68,22 @@ public class CloakInfo : PausableConditionalTraitInfo
[Desc("The type of cloak. Same type of cloaks won't trigger cloaking and uncloaking sound and effect.")]
public readonly string CloakType = null;

[Desc("Render effect to use when cloaked.")]
public readonly CloakStyle CloakStyle = CloakStyle.Alpha;

[Desc("The alpha level to use when cloaked when using Alpha CloakStyle.")]
public readonly float CloakedAlpha = 0.55f;

[Desc("The color to use when cloaked when using Color CloakStyle.")]
public readonly Color CloakedColor = Color.FromArgb(140, 0, 0, 0);

[PaletteReference(nameof(IsPlayerPalette))]
[Desc("The palette to use when cloaked when using Palette CloakStyle.")]
public readonly string CloakedPalette = null;

[Desc("Indicates that CloakedPalette is a player palette when using Palette CloakStyle.")]
public readonly bool IsPlayerPalette = false;

[Desc("Which image to use for the effect played when cloaking or uncloaking.")]
public readonly string EffectImage = null;

Expand All @@ -95,8 +109,11 @@ public class CloakInfo : PausableConditionalTraitInfo
}

public class Cloak : PausableConditionalTrait<CloakInfo>, IRenderModifier, INotifyDamage, INotifyUnloadCargo, INotifyLoadCargo, INotifyDemolition, INotifyInfiltration,
INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier, INotifyCreated, INotifyDockClient, INotifySupportPower
INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier, INotifyDockClient, INotifySupportPower
{
readonly float3 cloakedColor;
readonly float cloakedColorAlpha;

[Sync]
int remainingTime;

Expand All @@ -112,6 +129,8 @@ public Cloak(CloakInfo info)
: base(info)
{
remainingTime = info.InitialDelay;
cloakedColor = new float3(info.CloakedColor.R, info.CloakedColor.G, info.CloakedColor.B) / 255f;
cloakedColorAlpha = info.CloakedColor.A / 255f;
}

protected override void Created(Actor self)
Expand Down Expand Up @@ -162,15 +181,28 @@ IEnumerable<IRenderable> IRenderModifier.ModifyRender(Actor self, WorldRenderer

if (Cloaked && IsVisible(self, self.World.RenderPlayer))
{
var palette = wr.Palette(Info.IsPlayerPalette ? Info.Palette + self.Owner.InternalName : Info.Palette);
switch (Info.CloakStyle)
{
case CloakStyle.Alpha:
return r.Select(a => !a.IsDecoration && a is IModifyableRenderable mr ? mr.WithAlpha(Info.CloakedAlpha) : a);

if (palette == null)
return r;
else
return r.Select(a => !a.IsDecoration && a is IPalettedRenderable pr ? pr.WithPalette(palette) : a);
case CloakStyle.Color:
return r.Select(a => !a.IsDecoration && a is IModifyableRenderable mr ?
mr.WithTint(cloakedColor, mr.TintModifiers | TintModifiers.ReplaceColor).WithAlpha(cloakedColorAlpha) :
a);

case CloakStyle.Palette:
{
var palette = wr.Palette(Info.IsPlayerPalette ? Info.CloakedPalette + self.Owner.InternalName : Info.CloakedPalette);
return r.Select(a => !a.IsDecoration && a is IPalettedRenderable pr ? pr.WithPalette(palette) : a);
}

default:
return r;
}
}
else
return SpriteRenderable.None;

return SpriteRenderable.None;
}

IEnumerable<Rectangle> IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable<Rectangle> bounds)
Expand Down Expand Up @@ -227,7 +259,7 @@ void ITick.Tick(Actor self)
if (!(firstTick && Info.InitialDelay == 0) && (otherCloaks == null || !otherCloaks.Any(a => a.Cloaked)))
{
var pos = self.CenterPosition;
Game.Sound.Play(SoundType.World, Info.CloakSound, pos);
Game.Sound.Play(SoundType.World, Info.UncloakSound, pos);

Func<WPos> posfunc = () => self.CenterPosition + Info.EffectOffset;
if (!Info.EffectTracksActor)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#region Copyright & License Information
/*
* Copyright (c) The OpenRA Developers and Contributors
* 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;

namespace OpenRA.Mods.Common.UpdateRules.Rules
{
public class ReplaceCloakPalette : UpdateRule, IBeforeUpdateActors
{
public override string Name => "Change default Cloak style from Palette to Alpha.";

public override string Description =>
"Cloak has gained several new rendering modes\n" +
"and its default behaviour has changed from using a palette to native alpha.";

readonly List<(string, string)> actorsWithDefault = new();
IEnumerable<string> IBeforeUpdateActors.BeforeUpdateActors(ModData modData, List<MiniYamlNodeBuilder> resolvedActors)
{
foreach (var actor in resolvedActors)
foreach (var cloak in actor.ChildrenMatching("Cloak"))
if (cloak.LastChildMatching("Palette", false) == null)
actorsWithDefault.Add((actor.Key, cloak.Key));

yield break;
}

public override IEnumerable<string> UpdateActorNode(ModData modData, MiniYamlNodeBuilder actorNode)
{
foreach (var cloak in actorNode.ChildrenMatching("Cloak"))
{
if (actorsWithDefault.Any(pair => pair.Item1 == actorNode.Key && pair.Item2 == cloak.Key))
{
cloak.AddNode("CloakedPalette", "cloak");
cloak.AddNode("CloakStyle", "Palette");
yield break;
}

var palette = cloak.LastChildMatching("Palette", false);
if (palette != null)
{
if (string.IsNullOrEmpty(palette.Value.Value))
{
cloak.RemoveNode(palette);
cloak.AddNode("CloakStyle", "None");
}
else
{
palette.RenameKey("CloakedPalette");
cloak.AddNode("CloakStyle", "Palette");
}
}
}
}
}
}
1 change: 1 addition & 0 deletions OpenRA.Mods.Common/UpdateRules/UpdatePath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ public sealed class UpdatePath
new RemoveConyardChronoReturnAnimation(),

// Execute these rules last to avoid premature yaml merge crashes.
new ReplaceCloakPalette(),
new AbstractDocking(),
}),
};
Expand Down
2 changes: 2 additions & 0 deletions mods/cnc/rules/aircraft.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,8 @@ C17:
Cloak:
InitialDelay: 0
CloakDelay: 0
CloakStyle: Palette
CloakedPalette: cloak
DetectionTypes: C17
RequiresCondition: global-C17-stealth
Contrail@1:
Expand Down
2 changes: 2 additions & 0 deletions mods/cnc/rules/defaults.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,8 @@
CloakDelay: 90
CloakSound: trans1.aud
UncloakSound: trans1.aud
CloakStyle: Palette
CloakedPalette: cloak
PauseOnCondition: cloak-force-disabled
RequiresCondition: cloak-crate-collected
ExternalCondition@CLOAK:
Expand Down
2 changes: 2 additions & 0 deletions mods/cnc/rules/vehicles.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -708,6 +708,8 @@ STNK:
CloakDelay: 85
CloakSound: trans1.aud
UncloakSound: trans1.aud
CloakStyle: Palette
CloakedPalette: cloak
UncloakOn: Attack, Unload, Dock, Damage, Heal
PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK:
Expand Down
5 changes: 0 additions & 5 deletions mods/d2k/rules/campaign-palettes.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
^Palettes:
-PlayerColorPalette:
-PaletteFromPlayerPaletteWithAlpha@cloak:
IndexedPlayerPalette:
BasePalette: d2k
BaseName: player
Expand All @@ -15,7 +14,3 @@
Mercenaries: 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224
Neutral: 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240
Creeps: 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240
PaletteFromPlayerPaletteWithAlpha@Cloak:
BaseName: cloak
BasePalette: player
Alpha: 0.55
2 changes: 0 additions & 2 deletions mods/d2k/rules/infantry.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,6 @@ fremen:
InitialDelay: 85
CloakDelay: 85
UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled
Expand Down Expand Up @@ -328,7 +327,6 @@ saboteur:
CloakDelay: 25
CloakSound: STEALTH1.WAV
UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled
Expand Down
4 changes: 0 additions & 4 deletions mods/d2k/rules/palettes.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,3 @@
RemapIndex: 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240
MenuPostProcessEffect:
FlashPostProcessEffect:
PaletteFromPlayerPaletteWithAlpha@cloak:
BaseName: cloak
BasePalette: player
Alpha: 0.55
1 change: 0 additions & 1 deletion mods/d2k/rules/vehicles.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,6 @@ stealth_raider:
InitialDelay: 45
CloakDelay: 90
UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled
Expand Down
1 change: 0 additions & 1 deletion mods/ra/maps/fort-lonestar/rules.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,6 @@ SNIPER:
CloakSound:
UncloakSound:
UncloakOn: Attack, Unload, Infiltrate, Demolish, Move
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled
Expand Down
5 changes: 0 additions & 5 deletions mods/ra/rules/campaign-palettes.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
^Palettes:
-PlayerColorPalette:
-PlayerColorPalette@NOSHADOW:
-PaletteFromPlayerPaletteWithAlpha@cloak:
IndexedPlayerPalette:
BasePalette: player
BaseName: player
Expand Down Expand Up @@ -40,7 +39,3 @@
Creeps: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143
GoodGuy: 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175
BadGuy: 229, 230, 231, 232, 233, 234, 235, 8, 236, 237, 238, 239, 221, 222, 223, 223
PaletteFromPlayerPaletteWithAlpha@Cloak:
BaseName: cloak
BasePalette: player
Alpha: 0.55
4 changes: 2 additions & 2 deletions mods/ra/rules/defaults.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -559,10 +559,10 @@
DetectionTypes: Underwater
InitialDelay: 0
CloakDelay: 50
CloakStyle: Color
CloakSound: subshow1.aud
UncloakSound: subshow1.aud
CloakedCondition: underwater
Palette: submerged
PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled
Expand Down Expand Up @@ -1230,7 +1230,7 @@
Cloak:
CloakSound:
UncloakSound:
Palette:
CloakStyle: None
DetectionTypes: Mine
InitialDelay: 0
Tooltip:
Expand Down
1 change: 0 additions & 1 deletion mods/ra/rules/infantry.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -664,7 +664,6 @@ THF:
CloakDelay: 120
UncloakOn: Attack, Unload, Infiltrate, Demolish, Move
DetectionTypes: Cloak
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled
Expand Down
10 changes: 0 additions & 10 deletions mods/ra/rules/palettes.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,6 @@
G: 0
B: 0
A: 140
PaletteFromRGBA@submerged:
Name: submerged
R: 0
G: 0
B: 0
A: 140
PaletteFromRGBA@moveflash:
Name: moveflash
R: 255
Expand All @@ -80,10 +74,6 @@
BaseName: player-noshadow
BasePalette: player-noshadow
RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95
PaletteFromPlayerPaletteWithAlpha@cloak:
BaseName: cloak
BasePalette: player
Alpha: 0.55
MenuPostProcessEffect:
RotationPaletteEffect@defaultwater:
Palettes: terrain
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 @@ -795,7 +795,6 @@ HBOX:
Cloak:
InitialDelay: 125
CloakDelay: 60
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled
Expand Down
1 change: 0 additions & 1 deletion mods/ra/rules/vehicles.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -919,7 +919,6 @@ STNK:
CloakDelay: 175
CloakSound: appear1.aud
UncloakSound: appear1.aud
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled
UncloakOn: Attack, Load, Unload, Heal, Dock
GrantConditionOnDamageState@UNCLOAK:
Expand Down
1 change: 0 additions & 1 deletion mods/ts/rules/defaults.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,6 @@
RequiresCondition: cloakgenerator || crate-cloak
InitialDelay: 0
CloakDelay: 90
IsPlayerPalette: true
CloakSound: cloak5.aud
UncloakSound: cloak5.aud
UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal, SupportPower
Expand Down
1 change: 0 additions & 1 deletion mods/ts/rules/nod-vehicles.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,6 @@ STNK:
CloakDelay: 90
CloakSound: cloak5.aud
UncloakSound: cloak5.aud
IsPlayerPalette: true
UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal
PauseOnCondition: cloak-force-disabled || empdisable
CloakType: nod-stealth
Expand Down
4 changes: 0 additions & 4 deletions mods/ts/rules/palettes.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -152,10 +152,6 @@
BaseName: player-nobright
BasePalette: player-nobright
RemapIndex: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
PaletteFromPlayerPaletteWithAlpha@cloak:
BaseName: cloak
BasePalette: player
Alpha: 0.55
PaletteFromPaletteWithAlpha@terrainalpha:
BasePalette: terraindecoration
Name: terrainalpha
Expand Down