Building hotkeys

This commit is contained in:
Boomer
2010-05-09 15:37:10 +02:00
committed by Chris Forbes
parent ac75259efd
commit bd72146548
7 changed files with 1909 additions and 1818 deletions

View File

@@ -107,7 +107,7 @@ namespace OpenRA
public float2 CenterLocation; public float2 CenterLocation;
Lazy<float2> Size; OpenRA.FileFormats.Lazy<float2> Size;
public IEnumerable<Renderable> Render() public IEnumerable<Renderable> Render()
{ {

View File

@@ -33,6 +33,8 @@ using OpenRA.Network;
using OpenRA.Server; using OpenRA.Server;
using OpenRA.Support; using OpenRA.Support;
using OpenRA.Traits; using OpenRA.Traits;
using OpenRA.Widgets;
using Timer = OpenRA.Support.Timer; using Timer = OpenRA.Support.Timer;
using XRandom = OpenRA.Thirdparty.Random; using XRandom = OpenRA.Thirdparty.Random;
@@ -103,7 +105,7 @@ namespace OpenRA
throw new InvalidOperationException("Cannot locate type: {0}".F(classname)); throw new InvalidOperationException("Cannot locate type: {0}".F(classname));
} }
public static Dictionary<string,MapStub> AvailableMaps; public static Dictionary<string, MapStub> AvailableMaps;
// TODO: Do this nicer // TODO: Do this nicer
static Dictionary<string, MapStub> FindMaps(string[] mods) static Dictionary<string, MapStub> FindMaps(string[] mods)
@@ -121,42 +123,42 @@ namespace OpenRA
static void ChangeMods() static void ChangeMods()
{ {
Timer.Time( "----ChangeMods" ); Timer.Time("----ChangeMods");
var manifest = new Manifest(LobbyInfo.GlobalSettings.Mods); var manifest = new Manifest(LobbyInfo.GlobalSettings.Mods);
Timer.Time( "manifest: {0}" ); Timer.Time("manifest: {0}");
LoadModAssemblies(manifest); LoadModAssemblies(manifest);
SheetBuilder.Initialize(renderer); SheetBuilder.Initialize(renderer);
LoadModPackages(manifest); LoadModPackages(manifest);
Timer.Time( "load assemblies, packages: {0}" ); Timer.Time("load assemblies, packages: {0}");
packageChangePending = false; packageChangePending = false;
} }
static void LoadMap(string mapName) static void LoadMap(string mapName)
{ {
Timer.Time( "----LoadMap" ); Timer.Time("----LoadMap");
SheetBuilder.Initialize(renderer); SheetBuilder.Initialize(renderer);
var manifest = new Manifest(LobbyInfo.GlobalSettings.Mods); var manifest = new Manifest(LobbyInfo.GlobalSettings.Mods);
Timer.Time( "manifest: {0}" ); Timer.Time("manifest: {0}");
if (!Game.AvailableMaps.ContainsKey(mapName)) if (!Game.AvailableMaps.ContainsKey(mapName))
throw new InvalidDataException("Cannot find map with Uid {0}".F(mapName)); throw new InvalidDataException("Cannot find map with Uid {0}".F(mapName));
var map = new Map( Game.AvailableMaps[mapName].Package ); var map = new Map(Game.AvailableMaps[mapName].Package);
viewport = new Viewport(clientSize, map.TopLeft, map.BottomRight, renderer); viewport = new Viewport(clientSize, map.TopLeft, map.BottomRight, renderer);
world = null; // trying to access the old world will NRE, rather than silently doing it wrong. world = null; // trying to access the old world will NRE, rather than silently doing it wrong.
ChromeProvider.Initialize(manifest.Chrome); ChromeProvider.Initialize(manifest.Chrome);
Timer.Time( "viewport, ChromeProvider: {0}" ); Timer.Time("viewport, ChromeProvider: {0}");
world = new World(manifest,map); world = new World(manifest, map);
Timer.Time( "world: {0}" ); Timer.Time("world: {0}");
SequenceProvider.Initialize(manifest.Sequences); SequenceProvider.Initialize(manifest.Sequences);
Timer.Time( "ChromeProv, SeqProv: {0}" ); Timer.Time("ChromeProv, SeqProv: {0}");
chrome = new Chrome(renderer, manifest); chrome = new Chrome(renderer, manifest);
Timer.Time( "chrome: {0}" ); Timer.Time("chrome: {0}");
Timer.Time( "----end LoadMap" ); Timer.Time("----end LoadMap");
Debug("Map change {0} -> {1}".F(Game.mapName, mapName)); Debug("Map change {0} -> {1}".F(Game.mapName, mapName));
} }
@@ -175,7 +177,7 @@ namespace OpenRA
CurrentHost = host; CurrentHost = host;
CurrentPort = port; CurrentPort = port;
orderManager = new OrderManager(new NetworkConnection( host, port ), ChooseReplayFilename()); orderManager = new OrderManager(new NetworkConnection(host, port), ChooseReplayFilename());
} }
static string ChooseReplayFilename() static string ChooseReplayFilename()
@@ -242,7 +244,7 @@ namespace OpenRA
return sb.ToString(); return sb.ToString();
} }
internal static void DumpSyncReport( int frame ) internal static void DumpSyncReport(int frame)
{ {
var f = syncReports.FirstOrDefault(a => a.First == frame); var f = syncReports.FirstOrDefault(a => a.First == frame);
if (f == null) if (f == null)
@@ -262,7 +264,7 @@ namespace OpenRA
// TODO: Only do this on mod change // TODO: Only do this on mod change
Timer.Time("----begin maplist"); Timer.Time("----begin maplist");
AvailableMaps = FindMaps(LobbyInfo.GlobalSettings.Mods); AvailableMaps = FindMaps(LobbyInfo.GlobalSettings.Mods);
Timer.Time( "maplist: {0}" ); Timer.Time("maplist: {0}");
ChangeMods(); ChangeMods();
return; return;
} }
@@ -281,9 +283,9 @@ namespace OpenRA
using (new PerfSample("tick_time")) using (new PerfSample("tick_time"))
{ {
lastTime += Settings.Timestep; lastTime += Settings.Timestep;
chrome.Tick( world ); chrome.Tick(world);
orderManager.TickImmediate( world ); orderManager.TickImmediate(world);
var isNetTick = LocalTick % NetTickScale == 0; var isNetTick = LocalTick % NetTickScale == 0;
@@ -309,7 +311,7 @@ namespace OpenRA
using (new PerfSample("render")) using (new PerfSample("render"))
{ {
++RenderFrame; ++RenderFrame;
viewport.DrawRegions( world ); viewport.DrawRegions(world);
} }
PerfHistory.items["render"].Tick(); PerfHistory.items["render"].Tick();
@@ -411,7 +413,7 @@ namespace OpenRA
foreach (var gs in world.WorldActor.traits.WithInterface<IGameStarted>()) foreach (var gs in world.WorldActor.traits.WithInterface<IGameStarted>())
gs.GameStarted(world); gs.GameStarted(world);
viewport.GoToStartLocation( world.LocalPlayer ); viewport.GoToStartLocation(world.LocalPlayer);
orderManager.StartGame(); orderManager.StartGame();
} }
@@ -450,7 +452,7 @@ namespace OpenRA
lastPos = p; lastPos = p;
} }
viewport.DispatchMouseInput( world, viewport.DispatchMouseInput(world,
new MouseInput new MouseInput
{ {
Button = (MouseButton)(int)e.Button, Button = (MouseButton)(int)e.Button,
@@ -459,8 +461,8 @@ namespace OpenRA
Modifiers = modifierKeys, Modifiers = modifierKeys,
}); });
if( sync != world.SyncHash() && world == initialWorld ) if (sync != world.SyncHash() && world == initialWorld)
throw new InvalidOperationException( "Desync in DispatchMouseInput" ); throw new InvalidOperationException("Desync in DispatchMouseInput");
} }
internal static bool IsHost internal static bool IsHost
@@ -487,11 +489,11 @@ namespace OpenRA
{ ')', '0' }, { ')', '0' },
}; };
public static void HandleKeyPress( KeyPressEventArgs e, Modifiers modifiers ) public static void HandleKeyPress(KeyPressEventArgs e, Modifiers modifiers)
{ {
int sync = world.SyncHash(); int sync = world.SyncHash();
if( e.KeyChar == '\r' ) if (e.KeyChar == '\r')
chat.Toggle(); chat.Toggle();
else if (Game.chat.isChatting) else if (Game.chat.isChatting)
chat.TypeChar(e.KeyChar); chat.TypeChar(e.KeyChar);
@@ -503,12 +505,17 @@ namespace OpenRA
Game.controller.selection.DoControlGroup(world, Game.controller.selection.DoControlGroup(world,
c - '0', modifiers); c - '0', modifiers);
if (c == 'h') if (c == 08)
Game.controller.GotoNextBase(); Game.controller.GotoNextBase();
if (c == 09)
BuildPaletteWidget.TabChange((Control.ModifierKeys & Keys.Shift) == Keys.Shift ? true : false);
BuildPaletteWidget.DoBuildingHotkey(c, world);
} }
if( sync != Game.world.SyncHash() ) if (sync != Game.world.SyncHash())
throw new InvalidOperationException( "Desync in OnKeyPress" ); throw new InvalidOperationException("Desync in OnKeyPress");
} }
public static void HandleModifierKeys(Modifiers mods) public static void HandleModifierKeys(Modifiers mods)
@@ -565,8 +572,8 @@ namespace OpenRA
ChangeMods(); ChangeMods();
if( Settings.Replay != "" ) if (Settings.Replay != "")
orderManager = new OrderManager( new ReplayConnection( Settings.Replay ) ); orderManager = new OrderManager(new ReplayConnection(Settings.Replay));
else else
JoinLocal(); JoinLocal();

View File

@@ -53,11 +53,11 @@ namespace OpenRA
public ShroudRenderer Shroud; public ShroudRenderer Shroud;
public World World { get; private set; } public World World { get; private set; }
public static List<Tuple<string, string, Color>> PlayerColors( World world ) public static List<OpenRA.FileFormats.Tuple<string, string, Color>> PlayerColors(World world)
{ {
return world.WorldActor.Info.Traits.WithInterface<PlayerColorPaletteInfo>() return world.WorldActor.Info.Traits.WithInterface<PlayerColorPaletteInfo>()
.Where(p => p.Playable) .Where(p => p.Playable)
.Select(p => Tuple.New(p.Name, p.DisplayName, p.Color)) .Select(p => OpenRA.FileFormats.Tuple.New(p.Name, p.DisplayName, p.Color))
.ToList(); .ToList();
} }

View File

@@ -39,6 +39,7 @@ namespace OpenRA.Traits
public readonly string Icon = null; public readonly string Icon = null;
public readonly string[] AlternateName = { }; public readonly string[] AlternateName = { };
public readonly int BuildPaletteOrder = 50; public readonly int BuildPaletteOrder = 50;
public readonly string Hotkey = null;
public override object Create(Actor self) { return new Buildable(); } public override object Create(Actor self) { return new Buildable(); }
} }

View File

@@ -33,7 +33,7 @@ namespace OpenRA.Traits
public class ScreenShaker : ITick public class ScreenShaker : ITick
{ {
int ticks = 0; int ticks = 0;
List<Tuple<int, float2, int>> shakeEffects = new List<Tuple<int, float2, int>>(); List<OpenRA.FileFormats.Tuple<int, float2, int>> shakeEffects = new List<OpenRA.FileFormats.Tuple<int, float2, int>>();
public void Tick (Actor self) public void Tick (Actor self)
{ {
@@ -44,7 +44,7 @@ namespace OpenRA.Traits
public void AddEffect(int time, float2 position, int intensity) public void AddEffect(int time, float2 position, int intensity)
{ {
shakeEffects.Add(Tuple.New(ticks + time, position, intensity)); shakeEffects.Add(OpenRA.FileFormats.Tuple.New(ticks + time, position, intensity));
} }
public float2 getScrollOffset() public float2 getScrollOffset()

View File

@@ -320,6 +320,15 @@ namespace OpenRA.Widgets
}; };
} }
static void Hotkey(World world, String name)
{
var eva = world.WorldActor.Info.Traits.Get<EvaAlertsInfo>();
Sound.Play(eva.TabClick);
if (name != null)
HandleBuildPalette(world, name, true);
}
Action<MouseInput> HandleTabClick(string button, World world) Action<MouseInput> HandleTabClick(string button, World world)
{ {
return mi => { return mi => {
@@ -344,7 +353,7 @@ namespace OpenRA.Widgets
return Rules.Info[ a.ToLowerInvariant() ].Traits.Get<BuildableInfo>().Description; return Rules.Info[ a.ToLowerInvariant() ].Traits.Get<BuildableInfo>().Description;
} }
void HandleBuildPalette( World world, string item, bool isLmb ) static void HandleBuildPalette( World world, string item, bool isLmb )
{ {
var player = world.LocalPlayer; var player = world.LocalPlayer;
var unit = Rules.Info[item]; var unit = Rules.Info[item];
@@ -391,7 +400,7 @@ namespace OpenRA.Widgets
} }
} }
void StartProduction( World world, string item ) static void StartProduction( World world, string item )
{ {
var eva = world.WorldActor.Info.Traits.Get<EvaAlertsInfo>(); var eva = world.WorldActor.Info.Traits.Get<EvaAlertsInfo>();
var unit = Rules.Info[item]; var unit = Rules.Info[item];
@@ -481,6 +490,9 @@ namespace OpenRA.Widgets
DrawRightAligned( "${0}".F(buildable.Cost), pos + new int2(-5,5), DrawRightAligned( "${0}".F(buildable.Cost), pos + new int2(-5,5),
world.LocalPlayer.Cash + world.LocalPlayer.Ore >= buildable.Cost ? Color.White : Color.Red); world.LocalPlayer.Cash + world.LocalPlayer.Ore >= buildable.Cost ? Color.White : Color.Red);
if (buildable.Hotkey != null)
DrawRightAligned("{0}".F(buildable.Hotkey.ToUpper()), pos + new int2(-5, 35),Color.White);
var bi = info.Traits.GetOrDefault<BuildingInfo>(); var bi = info.Traits.GetOrDefault<BuildingInfo>();
if (bi != null) if (bi != null)
DrawRightAligned("{1}{0}".F(bi.Power, bi.Power > 0 ? "+" : ""), pos + new int2(-5, 20), DrawRightAligned("{1}{0}".F(bi.Power, bi.Power > 0 ? "+" : ""), pos + new int2(-5, 20),
@@ -507,5 +519,42 @@ namespace OpenRA.Widgets
Game.chrome.renderer.RgbaSpriteRenderer.Flush(); Game.chrome.renderer.RgbaSpriteRenderer.Flush();
} }
public static void DoBuildingHotkey(char c, World world)
{
if (Game.world.LocalPlayer == null) return;
var buildable = Rules.TechTree.BuildableItems(Game.world.LocalPlayer, Chrome.rootWidget.GetWidget<BuildPaletteWidget>("INGAME_BUILD_PALETTE").currentTab);
var toBuild = buildable.FirstOrDefault(b => Rules.Info[b.ToLowerInvariant()].Traits.Get<BuildableInfo>().Hotkey == c.ToString());
if (toBuild != null) Hotkey(world, toBuild);
}
public static void TabChange(bool shift)
{
var p = Chrome.rootWidget.GetWidget<BuildPaletteWidget>("INGAME_BUILD_PALETTE");
int size = p.visibleTabs.Count();
if (size > 0)
{
string last = p.visibleTabs.Last();
string first = p.visibleTabs.First();
int current = p.visibleTabs.IndexOf(p.currentTab);
if (!shift)
{
if (current + 1 >= size)
p.SetCurrentTab(p.visibleTabs.FirstOrDefault());
else
p.SetCurrentTab(p.visibleTabs[current + 1]);
}
else
{
if (current - 1 < 0)
p.SetCurrentTab(p.visibleTabs.LastOrDefault());
else
p.SetCurrentTab(p.visibleTabs[current - 1]);
}
}
}
} }
} }

View File

@@ -9,6 +9,7 @@ MSLO:
Cost: 2500 Cost: 2500
Description: Missile Silo Description: Missile Silo
LongDesc: Launches a devastating nuclear strike.\n Strong vs Infantry, Buildings\n Weak vs Tanks\n Special Ability: Nuclear Missile LongDesc: Launches a devastating nuclear strike.\n Strong vs Infantry, Buildings\n Weak vs Tanks\n Special Ability: Nuclear Missile
Hotkey: m
Building: Building:
Power: -100 Power: -100
Footprint: xx Footprint: xx
@@ -33,6 +34,7 @@ GAP:
Cost: 500 Cost: 500
Description: Gap Generator Description: Gap Generator
LongDesc: Regenerates the Fog of War nearby, \nobscuring the area.\n Unarmed LongDesc: Regenerates the Fog of War nearby, \nobscuring the area.\n Unarmed
Hotkey: g
Building: Building:
Power: -60 Power: -60
Footprint: _ x Footprint: _ x
@@ -54,6 +56,7 @@ SPEN:
Cost: 650 Cost: 650
Description: Sub Pen Description: Sub Pen
LongDesc: Produces and repairs submarines and \ntransports LongDesc: Produces and repairs submarines and \ntransports
Hotkey: s
Building: Building:
Power: -30 Power: -30
Footprint: xxx xxx xxx Footprint: xxx xxx xxx
@@ -81,6 +84,7 @@ SYRD:
Description: Shipyard Description: Shipyard
LongDesc: Produces and repairs ships LongDesc: Produces and repairs ships
BuildPaletteOrder: 4 BuildPaletteOrder: 4
Hotkey: s
Building: Building:
Power: -30 Power: -30
Footprint: xxx xxx xxx Footprint: xxx xxx xxx
@@ -109,6 +113,7 @@ IRON:
Cost: 2800 Cost: 2800
Description: Iron Curtain Description: Iron Curtain
LongDesc: Makes a group of units invulnerable for a \nshort time.\n Special Ability: Invulnerability LongDesc: Makes a group of units invulnerable for a \nshort time.\n Special Ability: Invulnerability
Hotkey: c
Building: Building:
Power: -200 Power: -200
Footprint: xx xx Footprint: xx xx
@@ -134,6 +139,7 @@ PDOX:
Cost: 2800 Cost: 2800
Description: Chronosphere Description: Chronosphere
LongDesc: Teleports a unit from one place \nto another, for a limited time.\n Special Ability: Chronoshift LongDesc: Teleports a unit from one place \nto another, for a limited time.\n Special Ability: Chronoshift
Hotkey: o
Building: Building:
Power: -200 Power: -200
Footprint: xx xx Footprint: xx xx
@@ -159,6 +165,7 @@ TSLA:
Cost: 1500 Cost: 1500
Description: Tesla Coil Description: Tesla Coil
LongDesc: Advanced base defense. Requires power\nto operate.\n Strong vs Tanks, Infantry\n Weak vs Aircraft LongDesc: Advanced base defense. Requires power\nto operate.\n Strong vs Tanks, Infantry\n Weak vs Aircraft
Hotkey: t
Building: Building:
Power: -150 Power: -150
Footprint: _ x Footprint: _ x
@@ -188,6 +195,7 @@ AGUN:
Cost: 600 Cost: 600
Description: AA Gun Description: AA Gun
LongDesc: Anti-Air base defense.\n Strong vs Aircraft\n Weak vs Infantry, Tanks LongDesc: Anti-Air base defense.\n Strong vs Aircraft\n Weak vs Infantry, Tanks
Hotkey: a
Building: Building:
Power: -50 Power: -50
Footprint: _ x Footprint: _ x
@@ -220,6 +228,7 @@ DOME:
Description: Radar Dome Description: Radar Dome
LongDesc: Provides an overview of the battlefield.\n Requires power to operate. LongDesc: Provides an overview of the battlefield.\n Requires power to operate.
BuildPaletteOrder: 6 BuildPaletteOrder: 6
Hotkey: r
Building: Building:
Power: -40 Power: -40
Footprint: xx xx Footprint: xx xx
@@ -243,6 +252,7 @@ PBOX:
Cost: 400 Cost: 400
Description: Pillbox Description: Pillbox
LongDesc: Basic defensive structure.\n Strong vs Infantry, Light Vehicles\n Weak vs Tanks, Aircraft LongDesc: Basic defensive structure.\n Strong vs Infantry, Light Vehicles\n Weak vs Tanks, Aircraft
Hotkey: x
Building: Building:
Power: -15 Power: -15
HP: 400 HP: 400
@@ -265,6 +275,7 @@ HBOX:
Cost: 600 Cost: 600
Description: Camo Pillbox Description: Camo Pillbox
LongDesc: Hidden defensive structure.\n Strong vs Infantry, Light Vehicles\n Weak vs Tanks, Aircraft LongDesc: Hidden defensive structure.\n Strong vs Infantry, Light Vehicles\n Weak vs Tanks, Aircraft
Hotkey: c
Building: Building:
Power: -15 Power: -15
HP: 600 HP: 600
@@ -287,6 +298,7 @@ GUN:
Cost: 600 Cost: 600
Description: Turret Description: Turret
LongDesc: Anti-Armor base defense.\n Strong vs Tanks\n Weak vs Infantry, Aircraft LongDesc: Anti-Armor base defense.\n Strong vs Tanks\n Weak vs Infantry, Aircraft
Hotkey: t
Building: Building:
Power: -40 Power: -40
HP: 400 HP: 400
@@ -314,6 +326,7 @@ FTUR:
Cost: 600 Cost: 600
Description: Flame Turret Description: Flame Turret
LongDesc: Anti-Infantry base defense.\n Strong vs Infantry\n Weak vs Aircraft LongDesc: Anti-Infantry base defense.\n Strong vs Infantry\n Weak vs Aircraft
Hotkey: f
Building: Building:
Power: -20 Power: -20
HP: 400 HP: 400
@@ -337,6 +350,7 @@ SAM:
Cost: 750 Cost: 750
Description: SAM Site Description: SAM Site
LongDesc: Anti-Air base defense.\n Strong vs Aircraft\n Weak vs Infantry, Tanks LongDesc: Anti-Air base defense.\n Strong vs Aircraft\n Weak vs Infantry, Tanks
Hotkey: s
Building: Building:
Power: -20 Power: -20
Footprint: xx Footprint: xx
@@ -366,6 +380,7 @@ ATEK:
Description: Allied Tech Center Description: Allied Tech Center
LongDesc: Provides Allied advanced technologies.\n Special Ability: GPS Satellite LongDesc: Provides Allied advanced technologies.\n Special Ability: GPS Satellite
AlternateName: @Tech Center AlternateName: @Tech Center
Hotkey: t
Building: Building:
Power: -200 Power: -200
Footprint: xx xx Footprint: xx xx
@@ -389,6 +404,7 @@ WEAP:
Description: War Factory Description: War Factory
LongDesc: Produces tanks & light vehicles. LongDesc: Produces tanks & light vehicles.
BuildPaletteOrder: 5 BuildPaletteOrder: 5
Hotkey: w
Building: Building:
Power: -30 Power: -30
Footprint: xxx xxx Footprint: xxx xxx
@@ -438,6 +454,7 @@ PROC:
Description: Ore Refinery Description: Ore Refinery
LongDesc: Converts Ore and Gems into money LongDesc: Converts Ore and Gems into money
BuildPaletteOrder: 1 BuildPaletteOrder: 1
Hotkey: e
Building: Building:
Power: -30 Power: -30
Footprint: _x_ xxx x== Footprint: _x_ xxx x==
@@ -470,6 +487,7 @@ SILO:
Cost: 150 Cost: 150
Description: Silo Description: Silo
LongDesc: Stores excess harvested Ore LongDesc: Stores excess harvested Ore
Hotkey: o
Building: Building:
Power: -10 Power: -10
Capturable: true Capturable: true
@@ -492,6 +510,7 @@ HPAD:
Cost: 1500 Cost: 1500
Description: Helipad Description: Helipad
LongDesc: Produces and reloads helicopters LongDesc: Produces and reloads helicopters
Hotkey: i
Building: Building:
Power: -10 Power: -10
Footprint: xx xx Footprint: xx xx
@@ -518,6 +537,7 @@ AFLD:
Cost: 600 Cost: 600
Description: Airstrip Description: Airstrip
LongDesc: Produces and reloads planes\n Special Ability: Paratroopers\n Special Ability: Spy Plane LongDesc: Produces and reloads planes\n Special Ability: Paratroopers\n Special Ability: Spy Plane
Hotkey: a
Building: Building:
Power: -30 Power: -30
Footprint: xxx xxx Footprint: xxx xxx
@@ -543,6 +563,7 @@ POWR:
LongDesc: Provides power for other structures LongDesc: Provides power for other structures
BuildPaletteOrder: 0 BuildPaletteOrder: 0
AlternateName: @Power Plant AlternateName: @Power Plant
Hotkey: p
Building: Building:
Power: 100 Power: 100
Footprint: xx xx Footprint: xx xx
@@ -565,6 +586,7 @@ APWR:
Description: Advanced Power Plant Description: Advanced Power Plant
LongDesc: Provides more power, cheaper than the \nstandard Power Plant LongDesc: Provides more power, cheaper than the \nstandard Power Plant
BuildPaletteOrder:2 BuildPaletteOrder:2
Hotkey: l
AlternateName: @Power Plant AlternateName: @Power Plant
Building: Building:
Power: 200 Power: 200
@@ -588,6 +610,7 @@ STEK:
Description: Soviet Tech Center Description: Soviet Tech Center
LongDesc: Provides Soviet advanced technologies LongDesc: Provides Soviet advanced technologies
AlternateName: @Tech Center AlternateName: @Tech Center
Hotkey: t
Building: Building:
Power: -100 Power: -100
Footprint: xxx xxx Footprint: xxx xxx
@@ -610,6 +633,7 @@ BARR:
Description: Soviet Barracks Description: Soviet Barracks
LongDesc: Produces infantry LongDesc: Produces infantry
BuildPaletteOrder: 3 BuildPaletteOrder: 3
Hotkey: b
Building: Building:
Power: -20 Power: -20
Footprint: xx xx Footprint: xx xx
@@ -635,6 +659,7 @@ TENT:
Description: Allied Barracks Description: Allied Barracks
LongDesc: Produces infantry LongDesc: Produces infantry
BuildPaletteOrder: 3 BuildPaletteOrder: 3
Hotkey: b
Building: Building:
Power: -20 Power: -20
Footprint: xx xx Footprint: xx xx
@@ -659,6 +684,7 @@ KENN:
Cost: 200 Cost: 200
Description: Kennel Description: Kennel
LongDesc: Produces attack dogs LongDesc: Produces attack dogs
Hotkey: k
Building: Building:
Power: -10 Power: -10
HP: 400 HP: 400
@@ -677,6 +703,7 @@ FIX:
Cost: 1200 Cost: 1200
Description: Service Depot Description: Service Depot
LongDesc: Repairs vehicles, reloads minelayers, and \nallows the construction of additional bases. LongDesc: Repairs vehicles, reloads minelayers, and \nallows the construction of additional bases.
Hotkey: d
Building: Building:
Power: -30 Power: -30
Footprint: _x_ xxx _x_ Footprint: _x_ xxx _x_
@@ -700,6 +727,7 @@ FACF:
Description: Fake Construction Yard Description: Fake Construction Yard
LongDesc: Looks like a Construction Yard. LongDesc: Looks like a Construction Yard.
BuildPaletteOrder: 90 BuildPaletteOrder: 90
Hotkey: c
Building: Building:
Power: -2 Power: -2
Footprint: xxx xxx xxx Footprint: xxx xxx xxx
@@ -724,6 +752,7 @@ WEAF:
Description: Fake War Factory Description: Fake War Factory
LongDesc: Looks like a War Factory. LongDesc: Looks like a War Factory.
BuildPaletteOrder: 90 BuildPaletteOrder: 90
Hotkey: x
Building: Building:
Power: -2 Power: -2
Footprint: xxx xxx Footprint: xxx xxx
@@ -749,6 +778,7 @@ SYRF:
Description: Fake Shipyard Description: Fake Shipyard
LongDesc: Looks like a Shipyard LongDesc: Looks like a Shipyard
BuildPaletteOrder: 90 BuildPaletteOrder: 90
Hotkey: z
Building: Building:
Power: -2 Power: -2
Footprint: xxx xxx xxx Footprint: xxx xxx xxx
@@ -791,6 +821,7 @@ DOMF:
Description: Fake Radar Dome Description: Fake Radar Dome
LongDesc: Looks like a Radar Dome LongDesc: Looks like a Radar Dome
BuildPaletteOrder: 90 BuildPaletteOrder: 90
Hotkey: v
Building: Building:
Power: -2 Power: -2
Footprint: xx xx Footprint: xx xx
@@ -815,6 +846,7 @@ SBAG:
Description: Sandbag Wall Description: Sandbag Wall
LongDesc: Stops infantry and blocks enemy fire.\nCan be crushed by tanks. LongDesc: Stops infantry and blocks enemy fire.\nCan be crushed by tanks.
BuildPaletteOrder: 100 BuildPaletteOrder: 100
Hotkey: b
Building: Building:
HP: 100 HP: 100
Armor: none Armor: none
@@ -832,6 +864,7 @@ FENC:
Description: Wire Fence Description: Wire Fence
LongDesc: Stops infantry and blocks enemy fire.\nCan be crushed by tanks. LongDesc: Stops infantry and blocks enemy fire.\nCan be crushed by tanks.
BuildPaletteOrder: 100 BuildPaletteOrder: 100
Hotkey: n
Building: Building:
HP: 100 HP: 100
Armor: none Armor: none
@@ -849,6 +882,7 @@ BRIK:
Description: Concrete Wall Description: Concrete Wall
LongDesc: Stop units and blocks enemy fire. LongDesc: Stop units and blocks enemy fire.
BuildPaletteOrder: 100 BuildPaletteOrder: 100
Hotkey: w
Building: Building:
HP: 100 HP: 100
Armor: none Armor: none