diff --git a/OpenRA.Mods.Cnc/CncMenuPaletteEffect.cs b/OpenRA.Mods.Cnc/CncMenuPaletteEffect.cs new file mode 100644 index 0000000000..6f2f99b739 --- /dev/null +++ b/OpenRA.Mods.Cnc/CncMenuPaletteEffect.cs @@ -0,0 +1,85 @@ +#region Copyright & License Information +/* + * Copyright 2007-2011 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. For more information, + * see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Drawing; +using OpenRA.FileFormats; +using OpenRA.Traits; + +namespace OpenRA.Mods.Cnc +{ + class CncMenuPaletteEffectInfo : TraitInfo { } + + public class CncMenuPaletteEffect : IPaletteModifier, ITick + { + public enum EffectType { None, Black, Desaturated } + + const int effectLength = 10; + int remainingFrames; + + EffectType from = EffectType.Black; + EffectType to = EffectType.Black; + + public void Fade(EffectType type) + { + remainingFrames = effectLength; + from = to; + to = type; + } + + public void Tick(Actor self) + { + if (remainingFrames > 0) + remainingFrames--; + } + + Color ColorForEffect(EffectType t, Color orig) + { + switch(t) + { + case EffectType.Black: + return Color.FromArgb(orig.A, Color.Black); + case EffectType.Desaturated: + var lum = (int)(255 * orig.GetBrightness()); + return Color.FromArgb(orig.A, lum, lum, lum); + default: + case EffectType.None: + return orig; + } + } + + public void AdjustPalette(Dictionary palettes) + { + if (to == EffectType.None && remainingFrames == 0) + return; + + var excludePalettes = new List(){"cursor", "chrome", "colorpicker", "shroud", "fog"}; + foreach (var pal in palettes) + { + if (excludePalettes.Contains(pal.Key)) + continue; + + for (var x = 0; x < 256; x++) + { + var orig = pal.Value.GetColor(x); + var t = ColorForEffect(to, orig); + + if (remainingFrames == 0) + pal.Value.SetColor(x, t); + else + { + var f = ColorForEffect(from, orig); + pal.Value.SetColor(x, OpenRA.Graphics.Util.Lerp((float)remainingFrames / effectLength, t, f)); + } + } + } + } + } +} diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj index 6a8ae680d5..d884380292 100644 --- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj +++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj @@ -87,6 +87,7 @@ + diff --git a/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs index 39110fb7f5..92ef75308c 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncIngameChromeLogic.cs @@ -43,6 +43,9 @@ namespace OpenRA.Mods.Cnc.Widgets public CncIngameChromeLogic([ObjectCreator.Param] Widget widget, [ObjectCreator.Param] World world ) { + world.WorldActor.Trait() + .Fade(CncMenuPaletteEffect.EffectType.None); + ingameRoot = widget.GetWidget("INGAME_ROOT"); if (!staticSetup) { @@ -92,7 +95,7 @@ namespace OpenRA.Mods.Cnc.Widgets [ObjectCreator.Param] Action onExit) { menu = widget.GetWidget("INGAME_MENU"); - world.WorldActor.Trait().Active = true; + world.WorldActor.Trait().Fade(CncMenuPaletteEffect.EffectType.Desaturated); bool hideButtons = false; menu.GetWidget("MENU_BUTTONS").IsVisible = () => !hideButtons; @@ -137,7 +140,7 @@ namespace OpenRA.Mods.Cnc.Widgets menu.GetWidget("RESUME_BUTTON").OnClick = () => { Widget.RootWidget.RemoveChild(menu); - world.WorldActor.Trait().Active = false; + world.WorldActor.Trait().Fade(CncMenuPaletteEffect.EffectType.None); onExit(); }; } diff --git a/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs index 2fb5847f03..83a8f293be 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncMenuLogic.cs @@ -30,8 +30,9 @@ namespace OpenRA.Mods.Cnc.Widgets public CncMenuLogic([ObjectCreator.Param] Widget widget, [ObjectCreator.Param] World world) { - world.WorldActor.Trait().Active = true; - + world.WorldActor.Trait() + .Fade(CncMenuPaletteEffect.EffectType.Desaturated); + // Root level menu var mainMenu = widget.GetWidget("MAIN_MENU"); mainMenu.IsVisible = () => Menu == MenuType.Main; diff --git a/OpenRA.Mods.RA/DesaturatedPaletteEffect.cs b/OpenRA.Mods.RA/DesaturatedPaletteEffect.cs deleted file mode 100644 index eecc501211..0000000000 --- a/OpenRA.Mods.RA/DesaturatedPaletteEffect.cs +++ /dev/null @@ -1,43 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 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. For more information, - * see COPYING. - */ -#endregion - -using System.Collections.Generic; -using System.Drawing; -using OpenRA.FileFormats; -using OpenRA.Traits; - -namespace OpenRA.Mods.RA -{ - class DesaturatedPaletteEffectInfo : TraitInfo { } - - public class DesaturatedPaletteEffect : IPaletteModifier - { - public bool Active; - - // TODO: Doing this every frame is stupid - public void AdjustPalette(Dictionary palettes) - { - if (!Active) return; - var excludePalettes = new List(){"cursor", "chrome", "colorpicker", "shroud", "fog"}; - foreach (var pal in palettes) - { - if (excludePalettes.Contains(pal.Key)) - continue; - - for (var x = 0; x < 256; x++) - { - var orig = pal.Value.GetColor(x); - var lum = (int)(255 * orig.GetBrightness()); - pal.Value.SetColor(x, Color.FromArgb(orig.A, lum, lum, lum)); - } - } - } - } -} diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 7609213864..8e60a55100 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -347,7 +347,6 @@ - diff --git a/mods/cnc/rules/system.yaml b/mods/cnc/rules/system.yaml index 257edfaf29..c4a55ae4f6 100644 --- a/mods/cnc/rules/system.yaml +++ b/mods/cnc/rules/system.yaml @@ -46,7 +46,7 @@ Player: World: LoadWidgetAtGameStart: Widget: INGAME_ROOT - DesaturatedPaletteEffect: + CncMenuPaletteEffect: ScreenShaker: NukePaletteEffect: CncWaterPaletteRotation: