modularize the remaining legacy ingame interface widgets
and consolidate chrome root initialization
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
#endregion
|
||||
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Mods.Common.Widgets;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Widgets;
|
||||
|
||||
@@ -16,14 +17,22 @@ namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
public class LoadWidgetAtGameStartInfo : ITraitInfo
|
||||
{
|
||||
public readonly string Widget = null;
|
||||
[Desc("The widget tree to open when a shellmap is loaded (i.e. the main menu).")]
|
||||
public readonly string ShellmapRoot = "MAINMENU";
|
||||
|
||||
[Desc("The widget tree to open when a regular map is loaded (i.e. the ingame UI).")]
|
||||
public readonly string IngameRoot = "INGAME_ROOT";
|
||||
|
||||
[Desc("Remove any existing UI when a map is loaded.")]
|
||||
public readonly bool ClearRoot = true;
|
||||
|
||||
public object Create(ActorInitializer init) { return new LoadWidgetAtGameStart(this); }
|
||||
}
|
||||
|
||||
public class LoadWidgetAtGameStart : IWorldLoaded
|
||||
{
|
||||
readonly LoadWidgetAtGameStartInfo info;
|
||||
|
||||
public LoadWidgetAtGameStart(LoadWidgetAtGameStartInfo info)
|
||||
{
|
||||
this.info = info;
|
||||
@@ -35,7 +44,8 @@ namespace OpenRA.Mods.Common.Traits
|
||||
if (info.ClearRoot)
|
||||
Ui.ResetAll();
|
||||
|
||||
Game.LoadWidget(world, info.Widget, Ui.Root, new WidgetArgs());
|
||||
var widget = world.Type == WorldType.Shellmap ? info.ShellmapRoot : info.IngameRoot;
|
||||
Game.LoadWidget(world, widget, Ui.Root, new WidgetArgs());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,6 @@
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using OpenRA.Widgets;
|
||||
|
||||
namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
@@ -92,11 +92,11 @@
|
||||
<Compile Include="Traits\World\WormManager.cs" />
|
||||
<Compile Include="Warheads\ChangeOwnerWarhead.cs" />
|
||||
<Compile Include="Widgets\BuildPaletteWidget.cs" />
|
||||
<Compile Include="Widgets\Logic\IngameChromeLogic.cs" />
|
||||
<Compile Include="Widgets\MoneyBinWidget.cs" />
|
||||
<Compile Include="Widgets\SupportPowerBinWidget.cs" />
|
||||
<Compile Include="Widgets\SlidingContainerWidget.cs" />
|
||||
<Compile Include="Traits\Render\WithAttackOverlay.cs" />
|
||||
<Compile Include="Widgets\Logic\SlidingRadarBinLogic.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
|
||||
@@ -1,122 +0,0 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2014 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;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using OpenRA.Mods.Common.Traits;
|
||||
using OpenRA.Mods.Common.Widgets;
|
||||
using OpenRA.Mods.D2k.Widgets;
|
||||
using OpenRA.Mods.RA;
|
||||
using OpenRA.Mods.RA.Widgets;
|
||||
using OpenRA.Mods.RA.Widgets.Logic;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Widgets;
|
||||
|
||||
namespace OpenRA.Mods.D2k.Widgets.Logic
|
||||
{
|
||||
public class IngameChromeLogic
|
||||
{
|
||||
readonly Widget ingameRoot;
|
||||
readonly Widget worldRoot;
|
||||
readonly Widget menuRoot;
|
||||
readonly Widget playerRoot;
|
||||
readonly World world;
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
public IngameChromeLogic(World world)
|
||||
{
|
||||
this.world = world;
|
||||
ingameRoot = Ui.Root.Get("INGAME_ROOT");
|
||||
worldRoot = ingameRoot.Get("WORLD_ROOT");
|
||||
menuRoot = ingameRoot.Get("MENU_ROOT");
|
||||
playerRoot = worldRoot.Get("PLAYER_ROOT");
|
||||
|
||||
InitRootWidgets();
|
||||
if (world.LocalPlayer == null)
|
||||
InitObserverWidgets();
|
||||
else
|
||||
InitPlayerWidgets();
|
||||
}
|
||||
|
||||
void InitRootWidgets()
|
||||
{
|
||||
Game.LoadWidget(world, "CHAT_PANEL", worldRoot, new WidgetArgs());
|
||||
|
||||
world.GameOver += () =>
|
||||
{
|
||||
worldRoot.RemoveChildren();
|
||||
menuRoot.RemoveChildren();
|
||||
Game.LoadWidget(world, "LEAVE_MAP_WIDGET", menuRoot, new WidgetArgs());
|
||||
};
|
||||
}
|
||||
|
||||
void InitObserverWidgets()
|
||||
{
|
||||
Game.LoadWidget(world, "OBSERVER_WIDGETS", playerRoot, new WidgetArgs());
|
||||
}
|
||||
|
||||
enum RadarBinState { Closed, BinAnimating, RadarAnimating, Open }
|
||||
void InitPlayerWidgets()
|
||||
{
|
||||
var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs());
|
||||
|
||||
var radarActive = false;
|
||||
var binState = RadarBinState.Closed;
|
||||
var radarBin = playerWidgets.Get<SlidingContainerWidget>("INGAME_RADAR_BIN");
|
||||
radarBin.IsOpen = () => radarActive || binState > RadarBinState.BinAnimating;
|
||||
radarBin.AfterOpen = () => binState = RadarBinState.RadarAnimating;
|
||||
radarBin.AfterClose = () => binState = RadarBinState.Closed;
|
||||
|
||||
var radarMap = radarBin.Get<RadarWidget>("RADAR_MINIMAP");
|
||||
radarMap.IsEnabled = () => radarActive && binState >= RadarBinState.RadarAnimating;
|
||||
radarMap.AfterOpen = () => binState = RadarBinState.Open;
|
||||
radarMap.AfterClose = () => binState = RadarBinState.BinAnimating;
|
||||
|
||||
radarBin.Get<ImageWidget>("RADAR_BIN_BG").GetImageCollection = () => "chrome-" + world.LocalPlayer.Country.Race;
|
||||
|
||||
var powerManager = world.LocalPlayer.PlayerActor.Trait<PowerManager>();
|
||||
var powerBar = radarBin.Get<ResourceBarWidget>("POWERBAR");
|
||||
powerBar.IndicatorCollection = "power-" + world.LocalPlayer.Country.Race;
|
||||
powerBar.GetProvided = () => powerManager.PowerProvided;
|
||||
powerBar.GetUsed = () => powerManager.PowerDrained;
|
||||
powerBar.TooltipFormat = "Power Usage: {0}/{1}";
|
||||
powerBar.GetBarColor = () =>
|
||||
{
|
||||
if (powerManager.PowerState == PowerState.Critical)
|
||||
return Color.Red;
|
||||
if (powerManager.PowerState == PowerState.Low)
|
||||
return Color.Orange;
|
||||
return Color.LimeGreen;
|
||||
};
|
||||
|
||||
var cachedRadarActive = false;
|
||||
var sidebarTicker = playerWidgets.Get<LogicTickerWidget>("SIDEBAR_TICKER");
|
||||
sidebarTicker.OnTick = () =>
|
||||
{
|
||||
// Update radar bin
|
||||
radarActive = world.ActorsWithTrait<ProvidesRadar>()
|
||||
.Any(a => a.Actor.Owner == world.LocalPlayer && a.Trait.IsActive);
|
||||
|
||||
if (radarActive != cachedRadarActive)
|
||||
Sound.PlayNotification(world.Map.Rules, null, "Sounds", radarActive ? "RadarUp" : "RadarDown", null);
|
||||
cachedRadarActive = radarActive;
|
||||
|
||||
// Switch to observer mode after win/loss
|
||||
if (world.ObserveAfterWinOrLose && world.LocalPlayer.WinState != WinState.Undefined)
|
||||
Game.RunAfterTick(() =>
|
||||
{
|
||||
playerRoot.RemoveChildren();
|
||||
InitObserverWidgets();
|
||||
});
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
60
OpenRA.Mods.D2k/Widgets/Logic/SlidingRadarBinLogic.cs
Normal file
60
OpenRA.Mods.D2k/Widgets/Logic/SlidingRadarBinLogic.cs
Normal file
@@ -0,0 +1,60 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2014 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;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using OpenRA.Mods.Common.Traits;
|
||||
using OpenRA.Mods.Common.Widgets;
|
||||
using OpenRA.Mods.D2k.Widgets;
|
||||
using OpenRA.Mods.RA;
|
||||
using OpenRA.Mods.RA.Widgets;
|
||||
using OpenRA.Mods.RA.Widgets.Logic;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Widgets;
|
||||
|
||||
namespace OpenRA.Mods.D2k.Widgets.Logic
|
||||
{
|
||||
public class SlidingRadarBinLogic
|
||||
{
|
||||
enum RadarBinState { Closed, BinAnimating, RadarAnimating, Open }
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
public SlidingRadarBinLogic(Widget widget, World world)
|
||||
{
|
||||
var radarActive = false;
|
||||
var binState = RadarBinState.Closed;
|
||||
var radarBin = widget.Get<SlidingContainerWidget>("INGAME_RADAR_BIN");
|
||||
radarBin.IsOpen = () => radarActive || binState > RadarBinState.BinAnimating;
|
||||
radarBin.AfterOpen = () => binState = RadarBinState.RadarAnimating;
|
||||
radarBin.AfterClose = () => binState = RadarBinState.Closed;
|
||||
|
||||
var radarMap = radarBin.Get<RadarWidget>("RADAR_MINIMAP");
|
||||
radarMap.IsEnabled = () => radarActive && binState >= RadarBinState.RadarAnimating;
|
||||
radarMap.AfterOpen = () => binState = RadarBinState.Open;
|
||||
radarMap.AfterClose = () => binState = RadarBinState.BinAnimating;
|
||||
|
||||
radarBin.Get<ImageWidget>("RADAR_BIN_BG").GetImageCollection = () => "chrome-" + world.LocalPlayer.Country.Race;
|
||||
|
||||
var cachedRadarActive = false;
|
||||
var radarTicker = widget.Get<LogicTickerWidget>("RADAR_TICKER");
|
||||
radarTicker.OnTick = () =>
|
||||
{
|
||||
// Update radar bin
|
||||
radarActive = world.ActorsWithTrait<ProvidesRadar>()
|
||||
.Any(a => a.Actor.Owner == world.LocalPlayer && a.Trait.IsActive);
|
||||
|
||||
if (radarActive != cachedRadarActive)
|
||||
Sound.PlayNotification(world.Map.Rules, null, "Sounds", radarActive ? "RadarUp" : "RadarDown", null);
|
||||
cachedRadarActive = radarActive;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -997,8 +997,6 @@ Rules:
|
||||
Loop: true
|
||||
LuaScript:
|
||||
Scripts: shellmap.lua
|
||||
LoadWidgetAtGameStart:
|
||||
Widget: MENU_BACKGROUND
|
||||
LST:
|
||||
Mobile:
|
||||
Speed: 42
|
||||
|
||||
@@ -6,7 +6,7 @@ World:
|
||||
ScreenMap:
|
||||
ActorMap:
|
||||
LoadWidgetAtGameStart:
|
||||
Widget: INGAME_ROOT
|
||||
ShellmapRoot: MENU_BACKGROUND
|
||||
MenuPaletteEffect:
|
||||
MenuEffect: Desaturated
|
||||
CloakPaletteEffect:
|
||||
|
||||
@@ -6,7 +6,7 @@ chrome-atreides: chrome-atreides.png
|
||||
radar: 297,31,210,222
|
||||
tooltip-bg: 0,288,272,136
|
||||
|
||||
power-atreides: chrome-atreides.png
|
||||
sidebar-bits: chrome-atreides.png
|
||||
power-indicator: 187,4,4,7
|
||||
|
||||
palette-atreides: chrome-atreides.png
|
||||
@@ -43,9 +43,6 @@ chrome-harkonnen: chrome-harkonnen.png
|
||||
radar: 297,31,210,222
|
||||
tooltip-bg: 0,288,272,136
|
||||
|
||||
power-harkonnen: chrome-harkonnen.png
|
||||
power-indicator: 187,4,4,7
|
||||
|
||||
palette-harkonnen: chrome-harkonnen.png
|
||||
top: 297,288,201,9
|
||||
dock-top: 498,274,14,23
|
||||
@@ -80,9 +77,6 @@ chrome-ordos: chrome-ordos.png
|
||||
radar: 297,31,210,222
|
||||
tooltip-bg: 0,288,272,136
|
||||
|
||||
power-ordos: chrome-ordos.png
|
||||
power-indicator: 187,4,4,7
|
||||
|
||||
palette-ordos: chrome-ordos.png
|
||||
top: 297,288,201,9
|
||||
dock-top: 498,274,14,23
|
||||
|
||||
@@ -34,12 +34,14 @@ Container@PLAYER_WIDGETS:
|
||||
Font: Bold
|
||||
Key: escape Shift
|
||||
SlidingContainer@INGAME_RADAR_BIN:
|
||||
Logic: SlidingRadarBinLogic
|
||||
X: WINDOW_RIGHT-215
|
||||
Y: 0
|
||||
OpenOffset: 0,29
|
||||
ClosedOffset: 0,-166
|
||||
AnimationLength: 15
|
||||
Children:
|
||||
LogicTicker@RADAR_TICKER:
|
||||
Image@RADAR_BIN_BG:
|
||||
ImageName: radar
|
||||
Radar@RADAR_MINIMAP:
|
||||
@@ -48,6 +50,7 @@ Container@PLAYER_WIDGETS:
|
||||
Width: 192
|
||||
Height: 192
|
||||
ResourceBar@POWERBAR:
|
||||
Logic: IngamePowerBarLogic
|
||||
X: 42
|
||||
Y: 205
|
||||
Width: 138
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Container@INGAME_ROOT:
|
||||
Logic: IngameChromeLogic
|
||||
Logic: LoadIngamePlayerOrObserverUILogic
|
||||
Children:
|
||||
Container@WORLD_ROOT:
|
||||
Children:
|
||||
|
||||
@@ -116,8 +116,6 @@ Smudges:
|
||||
|
||||
Rules:
|
||||
World:
|
||||
LoadWidgetAtGameStart:
|
||||
Widget: MAINMENU
|
||||
-CrateSpawner:
|
||||
-SpawnMPUnits:
|
||||
-MPStartLocations:
|
||||
|
||||
@@ -6,7 +6,6 @@ World:
|
||||
ScreenMap:
|
||||
ActorMap:
|
||||
LoadWidgetAtGameStart:
|
||||
Widget: INGAME_ROOT
|
||||
ScreenShaker:
|
||||
BuildingInfluence:
|
||||
ChooseBuildTabOnSelect:
|
||||
|
||||
@@ -1274,8 +1274,6 @@ Rules:
|
||||
ValuePerUnit: 0
|
||||
LuaScript:
|
||||
Scripts: desert-shellmap.lua
|
||||
LoadWidgetAtGameStart:
|
||||
Widget: MAINMENU
|
||||
-StartGameNotification:
|
||||
OILB:
|
||||
CashTrickler:
|
||||
|
||||
@@ -6,7 +6,6 @@ World:
|
||||
ScreenMap:
|
||||
ActorMap:
|
||||
LoadWidgetAtGameStart:
|
||||
Widget: INGAME_ROOT
|
||||
ScreenShaker:
|
||||
MenuPaletteEffect:
|
||||
WaterPaletteRotation:
|
||||
|
||||
@@ -6,7 +6,7 @@ chrome-gdi: chrome-gdi.png
|
||||
tooltip-bg: 0,288,272,136
|
||||
radar: 297,31,210,222
|
||||
|
||||
power-gdi: chrome-gdi.png
|
||||
sidebar-bits: chrome-gdi.png
|
||||
power-indicator: 187,4,4,7
|
||||
|
||||
palette-gdi: chrome-gdi.png
|
||||
@@ -43,9 +43,6 @@ chrome-nod: chrome-nod.png
|
||||
tooltip-bg: 0,288,272,136
|
||||
radar: 297,31,210,222
|
||||
|
||||
power-nod: chrome-nod.png
|
||||
power-indicator: 187,4,4,7
|
||||
|
||||
palette-nod: chrome-nod.png
|
||||
top: 297,288,201,9
|
||||
dock-top: 498,274,14,23
|
||||
|
||||
@@ -36,12 +36,14 @@ Container@PLAYER_WIDGETS:
|
||||
Font: Bold
|
||||
Key: escape Shift
|
||||
SlidingContainer@INGAME_RADAR_BIN:
|
||||
Logic: SlidingRadarBinLogic
|
||||
X: WINDOW_RIGHT-215
|
||||
Y: 0
|
||||
OpenOffset: 0,29
|
||||
ClosedOffset: 0,-166
|
||||
AnimationLength: 15
|
||||
Children:
|
||||
LogicTicker@RADAR_TICKER:
|
||||
Image@RADAR_BIN_BG:
|
||||
ImageName: radar
|
||||
Radar@RADAR_MINIMAP:
|
||||
@@ -50,6 +52,7 @@ Container@PLAYER_WIDGETS:
|
||||
Width: 192
|
||||
Height: 192
|
||||
ResourceBar@POWERBAR:
|
||||
Logic: IngamePowerBarLogic
|
||||
X: 42
|
||||
Y: 205
|
||||
Width: 138
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Container@INGAME_ROOT:
|
||||
Logic: IngameChromeLogic
|
||||
Logic: LoadIngamePlayerOrObserverUILogic
|
||||
Children:
|
||||
Container@WORLD_ROOT:
|
||||
Children:
|
||||
|
||||
@@ -41,7 +41,6 @@ Rules:
|
||||
-SpawnMPUnits:
|
||||
-MPStartLocations:
|
||||
LoadWidgetAtGameStart:
|
||||
Widget: MAINMENU
|
||||
|
||||
Sequences:
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ World:
|
||||
ScreenMap:
|
||||
ActorMap:
|
||||
LoadWidgetAtGameStart:
|
||||
Widget: INGAME_ROOT
|
||||
MenuPaletteEffect:
|
||||
BuildingInfluence:
|
||||
ChooseBuildTabOnSelect:
|
||||
|
||||
Reference in New Issue
Block a user