Add support for additional cloak styles and use native alpha in RA,D2k,TS.

This commit is contained in:
Paul Chote
2023-12-03 11:16:37 +00:00
committed by Gustas
parent 9f196f2693
commit ad833a6fbb
20 changed files with 102 additions and 51 deletions

View File

@@ -39,6 +39,8 @@ namespace OpenRA.Mods.Common.Traits
// Type tag for DetectionTypes // Type tag for DetectionTypes
public class DetectionType { } public class DetectionType { }
public enum CloakStyle { None, Alpha, Color, Palette }
[Desc("This unit can cloak and uncloak in specific situations.")] [Desc("This unit can cloak and uncloak in specific situations.")]
public class CloakInfo : PausableConditionalTraitInfo public class CloakInfo : PausableConditionalTraitInfo
{ {
@@ -57,10 +59,6 @@ namespace OpenRA.Mods.Common.Traits
public readonly string CloakSound = null; public readonly string CloakSound = null;
public readonly string UncloakSound = 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"); public readonly BitSet<DetectionType> DetectionTypes = new("Cloak");
[GrantedConditionReference] [GrantedConditionReference]
@@ -70,6 +68,22 @@ namespace OpenRA.Mods.Common.Traits
[Desc("The type of cloak. Same type of cloaks won't trigger cloaking and uncloaking sound and effect.")] [Desc("The type of cloak. Same type of cloaks won't trigger cloaking and uncloaking sound and effect.")]
public readonly string CloakType = null; 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.")] [Desc("Which image to use for the effect played when cloaking or uncloaking.")]
public readonly string EffectImage = null; public readonly string EffectImage = null;
@@ -95,8 +109,11 @@ namespace OpenRA.Mods.Common.Traits
} }
public class Cloak : PausableConditionalTrait<CloakInfo>, IRenderModifier, INotifyDamage, INotifyUnloadCargo, INotifyLoadCargo, INotifyDemolition, INotifyInfiltration, 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] [Sync]
int remainingTime; int remainingTime;
@@ -112,6 +129,8 @@ namespace OpenRA.Mods.Common.Traits
: base(info) : base(info)
{ {
remainingTime = info.InitialDelay; 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) protected override void Created(Actor self)
@@ -162,15 +181,28 @@ namespace OpenRA.Mods.Common.Traits
if (Cloaked && IsVisible(self, self.World.RenderPlayer)) 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) case CloakStyle.Color:
return r; return r.Select(a => !a.IsDecoration && a is IModifyableRenderable mr ?
else mr.WithTint(cloakedColor, mr.TintModifiers | TintModifiers.ReplaceColor).WithAlpha(cloakedColorAlpha) :
return r.Select(a => !a.IsDecoration && a is IPalettedRenderable pr ? pr.WithPalette(palette) : a); 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) IEnumerable<Rectangle> IRenderModifier.ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable<Rectangle> bounds)

View File

@@ -0,0 +1,49 @@
#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;
namespace OpenRA.Mods.Common.UpdateRules.Rules
{
public class ReplaceCloakPalette : UpdateRule
{
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> locations = new();
public override IEnumerable<string> AfterUpdate(ModData modData)
{
if (locations.Count > 0)
yield return "Cloak no longer defaults to replacing the actor's palette.\n" +
"If you wish to keep the previous behavior you wish to change the\n" +
"Cloak definitions on the following actor definitions:\n" +
UpdateUtils.FormatMessageList(locations);
locations.Clear();
}
public override IEnumerable<string> UpdateActorNode(ModData modData, MiniYamlNodeBuilder actorNode)
{
foreach (var cloak in actorNode.ChildrenMatching("Cloak"))
{
cloak.RemoveNodes("Palette");
cloak.RemoveNodes("IsPlayerPalette");
locations.Add($"{actorNode.Key} ({actorNode.Location.Filename})");
}
yield break;
}
}
}

View File

@@ -85,6 +85,7 @@ namespace OpenRA.Mods.Common.UpdateRules
new ExtractResourceStorageFromHarvester(), new ExtractResourceStorageFromHarvester(),
new ReplacePaletteModifiers(), new ReplacePaletteModifiers(),
new RemoveConyardChronoReturnAnimation(), new RemoveConyardChronoReturnAnimation(),
new ReplaceCloakPalette(),
// Execute these rules last to avoid premature yaml merge crashes. // Execute these rules last to avoid premature yaml merge crashes.
new AbstractDocking(), new AbstractDocking(),

View File

@@ -208,6 +208,8 @@ C17:
Cloak: Cloak:
InitialDelay: 0 InitialDelay: 0
CloakDelay: 0 CloakDelay: 0
CloakStyle: Palette
CloakedPalette: cloak
DetectionTypes: C17 DetectionTypes: C17
RequiresCondition: global-C17-stealth RequiresCondition: global-C17-stealth
Contrail@1: Contrail@1:

View File

@@ -199,6 +199,8 @@
CloakDelay: 90 CloakDelay: 90
CloakSound: trans1.aud CloakSound: trans1.aud
UncloakSound: trans1.aud UncloakSound: trans1.aud
CloakStyle: Palette
CloakedPalette: cloak
PauseOnCondition: cloak-force-disabled PauseOnCondition: cloak-force-disabled
RequiresCondition: cloak-crate-collected RequiresCondition: cloak-crate-collected
ExternalCondition@CLOAK: ExternalCondition@CLOAK:

View File

@@ -708,6 +708,8 @@ STNK:
CloakDelay: 85 CloakDelay: 85
CloakSound: trans1.aud CloakSound: trans1.aud
UncloakSound: trans1.aud UncloakSound: trans1.aud
CloakStyle: Palette
CloakedPalette: cloak
UncloakOn: Attack, Unload, Dock, Damage, Heal UncloakOn: Attack, Unload, Dock, Damage, Heal
PauseOnCondition: cloak-force-disabled PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK: GrantConditionOnDamageState@UNCLOAK:

View File

@@ -1,6 +1,5 @@
^Palettes: ^Palettes:
-PlayerColorPalette: -PlayerColorPalette:
-PaletteFromPlayerPaletteWithAlpha@cloak:
IndexedPlayerPalette: IndexedPlayerPalette:
BasePalette: d2k BasePalette: d2k
BaseName: player BaseName: player
@@ -15,7 +14,3 @@
Mercenaries: 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224 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 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 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

View File

@@ -186,7 +186,6 @@ fremen:
InitialDelay: 85 InitialDelay: 85
CloakDelay: 85 CloakDelay: 85
UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK: GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled Condition: cloak-force-disabled
@@ -328,7 +327,6 @@ saboteur:
CloakDelay: 25 CloakDelay: 25
CloakSound: STEALTH1.WAV CloakSound: STEALTH1.WAV
UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK: GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled Condition: cloak-force-disabled

View File

@@ -44,7 +44,3 @@
RemapIndex: 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240 RemapIndex: 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240
MenuPostProcessEffect: MenuPostProcessEffect:
FlashPostProcessEffect: FlashPostProcessEffect:
PaletteFromPlayerPaletteWithAlpha@cloak:
BaseName: cloak
BasePalette: player
Alpha: 0.55

View File

@@ -498,7 +498,6 @@ stealth_raider:
InitialDelay: 45 InitialDelay: 45
CloakDelay: 90 CloakDelay: 90
UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK: GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled Condition: cloak-force-disabled

View File

@@ -316,7 +316,6 @@ SNIPER:
CloakSound: CloakSound:
UncloakSound: UncloakSound:
UncloakOn: Attack, Unload, Infiltrate, Demolish, Move UncloakOn: Attack, Unload, Infiltrate, Demolish, Move
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK: GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled Condition: cloak-force-disabled

View File

@@ -1,7 +1,6 @@
^Palettes: ^Palettes:
-PlayerColorPalette: -PlayerColorPalette:
-PlayerColorPalette@NOSHADOW: -PlayerColorPalette@NOSHADOW:
-PaletteFromPlayerPaletteWithAlpha@cloak:
IndexedPlayerPalette: IndexedPlayerPalette:
BasePalette: player BasePalette: player
BaseName: player BaseName: player
@@ -40,7 +39,3 @@
Creeps: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 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 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 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

View File

@@ -559,10 +559,10 @@
DetectionTypes: Underwater DetectionTypes: Underwater
InitialDelay: 0 InitialDelay: 0
CloakDelay: 50 CloakDelay: 50
CloakStyle: Color
CloakSound: subshow1.aud CloakSound: subshow1.aud
UncloakSound: subshow1.aud UncloakSound: subshow1.aud
CloakedCondition: underwater CloakedCondition: underwater
Palette: submerged
PauseOnCondition: cloak-force-disabled PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK: GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled Condition: cloak-force-disabled
@@ -1230,7 +1230,7 @@
Cloak: Cloak:
CloakSound: CloakSound:
UncloakSound: UncloakSound:
Palette: CloakStyle: None
DetectionTypes: Mine DetectionTypes: Mine
InitialDelay: 0 InitialDelay: 0
Tooltip: Tooltip:

View File

@@ -664,7 +664,6 @@ THF:
CloakDelay: 120 CloakDelay: 120
UncloakOn: Attack, Unload, Infiltrate, Demolish, Move UncloakOn: Attack, Unload, Infiltrate, Demolish, Move
DetectionTypes: Cloak DetectionTypes: Cloak
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK: GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled Condition: cloak-force-disabled

View File

@@ -56,12 +56,6 @@
G: 0 G: 0
B: 0 B: 0
A: 140 A: 140
PaletteFromRGBA@submerged:
Name: submerged
R: 0
G: 0
B: 0
A: 140
PaletteFromRGBA@moveflash: PaletteFromRGBA@moveflash:
Name: moveflash Name: moveflash
R: 255 R: 255
@@ -80,10 +74,6 @@
BaseName: player-noshadow BaseName: player-noshadow
BasePalette: player-noshadow BasePalette: player-noshadow
RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 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: MenuPostProcessEffect:
RotationPaletteEffect@defaultwater: RotationPaletteEffect@defaultwater:
Palettes: terrain Palettes: terrain

View File

@@ -795,7 +795,6 @@ HBOX:
Cloak: Cloak:
InitialDelay: 125 InitialDelay: 125
CloakDelay: 60 CloakDelay: 60
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK: GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled Condition: cloak-force-disabled

View File

@@ -919,7 +919,6 @@ STNK:
CloakDelay: 175 CloakDelay: 175
CloakSound: appear1.aud CloakSound: appear1.aud
UncloakSound: appear1.aud UncloakSound: appear1.aud
IsPlayerPalette: true
PauseOnCondition: cloak-force-disabled PauseOnCondition: cloak-force-disabled
UncloakOn: Attack, Load, Unload, Heal, Dock UncloakOn: Attack, Load, Unload, Heal, Dock
GrantConditionOnDamageState@UNCLOAK: GrantConditionOnDamageState@UNCLOAK:

View File

@@ -129,7 +129,6 @@
RequiresCondition: cloakgenerator || crate-cloak RequiresCondition: cloakgenerator || crate-cloak
InitialDelay: 0 InitialDelay: 0
CloakDelay: 90 CloakDelay: 90
IsPlayerPalette: true
CloakSound: cloak5.aud CloakSound: cloak5.aud
UncloakSound: cloak5.aud UncloakSound: cloak5.aud
UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal, SupportPower UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal, SupportPower

View File

@@ -526,7 +526,6 @@ STNK:
CloakDelay: 90 CloakDelay: 90
CloakSound: cloak5.aud CloakSound: cloak5.aud
UncloakSound: cloak5.aud UncloakSound: cloak5.aud
IsPlayerPalette: true
UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal
PauseOnCondition: cloak-force-disabled || empdisable PauseOnCondition: cloak-force-disabled || empdisable
CloakType: nod-stealth CloakType: nod-stealth

View File

@@ -152,10 +152,6 @@
BaseName: player-nobright BaseName: player-nobright
BasePalette: player-nobright BasePalette: player-nobright
RemapIndex: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 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: PaletteFromPaletteWithAlpha@terrainalpha:
BasePalette: terraindecoration BasePalette: terraindecoration
Name: terrainalpha Name: terrainalpha