From ea211fcc1ce285234050bc0c424ac4f2a646cfff Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 17 Dec 2009 21:05:49 +1300 Subject: [PATCH] #109 fixed --- OpenRa.Game/Chrome.cs | 64 ++++++++++++++++++++- OpenRa.Game/GameRules/UnitInfo.cs | 1 + OpenRa.Game/Graphics/Renderer.cs | 15 ++++- OpenRa.Game/Player.cs | 24 ++++---- artsrc/bits.psd | Bin 436372 -> 473499 bytes specialbin.png | Bin 46460 -> 47739 bytes units.ini | 91 +++++++++++++++++++++++++----- 7 files changed, 166 insertions(+), 29 deletions(-) diff --git a/OpenRa.Game/Chrome.cs b/OpenRa.Game/Chrome.cs index 2199061a77..9b7f1e63bd 100644 --- a/OpenRa.Game/Chrome.cs +++ b/OpenRa.Game/Chrome.cs @@ -7,6 +7,7 @@ using IjwFramework.Collections; using IjwFramework.Types; using OpenRa.Game.Graphics; using OpenRa.Game.Support; +using OpenRa.Game.GameRules; namespace OpenRa.Game { @@ -17,6 +18,7 @@ namespace OpenRa.Game readonly SpriteRenderer chromeRenderer; readonly Sprite specialBinSprite; readonly Sprite moneyBinSprite; + readonly Sprite tooltipSprite; readonly SpriteRenderer buildPaletteRenderer; readonly Animation cantBuild; readonly Animation ready; @@ -37,6 +39,7 @@ namespace OpenRa.Game specialBinSprite = new Sprite(specialBin, new Rectangle(0, 0, 32, 192), TextureChannel.Alpha); moneyBinSprite = new Sprite(specialBin, new Rectangle(512 - 320, 0, 320, 32), TextureChannel.Alpha); + tooltipSprite = new Sprite(specialBin, new Rectangle(0, 288, 272, 136), TextureChannel.Alpha); blank = SheetBuilder.Add(new Size(64, 48), 16); @@ -90,8 +93,8 @@ namespace OpenRa.Game Game.orderManager.FrameNumber, PerfHistory.items["render"].LastValue, PerfHistory.items["tick_time"].LastValue, - Game.LocalPlayer.powerDrained, - Game.LocalPlayer.powerProvided, + Game.LocalPlayer.PowerDrained, + Game.LocalPlayer.PowerProvided, Game.LocalPlayer.IsReady ? "Yes" : "No" ), new int2(140, 5), Color.White); @@ -214,6 +217,9 @@ namespace OpenRa.Game var overlayBits = new List>(); + string tooltipItem = null; + int2 tooltipPos = int2.Zero; + foreach (var item in allItems) { var rect = new Rectangle(Game.viewport.Width - (3 - x) * 64, 40 + 48 * y, 64, 48); @@ -223,6 +229,12 @@ namespace OpenRa.Game buildPaletteRenderer.DrawSprite(sprites[item], drawPos, 0); + if (rect.Contains(lastMousePos.ToPoint())) + { + tooltipItem = item; + tooltipPos = new int2(rect.Location); + } + if (!buildableItems.Contains(item) || isBuildingSomethingElse) overlayBits.Add(Pair.New(cantBuild.Image, drawPos)); @@ -271,6 +283,9 @@ namespace OpenRa.Game chromeRenderer.DrawSprite(shimSprites[0], new float2(Game.viewport.Width - 192 - 9, 40 - 9), 0); chromeRenderer.DrawSprite(shimSprites[1], new float2(Game.viewport.Width - 192 - 9, 40 - 1 + 48 * y), 0); chromeRenderer.Flush(); + + if (tooltipItem != null) + DrawProductionTooltip(tooltipItem, tooltipPos); } void HandleBuildPalette(string item, bool isLmb) @@ -322,8 +337,12 @@ namespace OpenRa.Game } } + int2 lastMousePos; public bool HandleInput(MouseInput mi) { + if (mi.Event == MouseInputEvent.Move) + lastMousePos = mi.Location; + var action = buttons.Where(a => a.First.Contains(mi.Location.ToPoint())) .Select(a => a.Second).FirstOrDefault(); @@ -340,5 +359,46 @@ namespace OpenRa.Game { return buttons.Any(a => a.First.Contains(mousePos.ToPoint())); } + + void DrawRightAligned(string text, int2 pos, Color c) + { + renderer.DrawText2(text, pos - new int2(renderer.MeasureText2(text).X, 0), c); + } + + void DrawProductionTooltip(string unit, int2 pos) + { + var p = pos.ToFloat2() - new float2(tooltipSprite.size.X, 0); + chromeRenderer.DrawSprite(tooltipSprite, p, 0); + chromeRenderer.Flush(); + + var info = Rules.UnitInfo[unit]; + + renderer.DrawText2(info.Description, p.ToInt2() + new int2(5,5), Color.White); + + DrawRightAligned( "${0}".F(info.Cost), pos + new int2(-5,5), + Game.LocalPlayer.Cash + Game.LocalPlayer.Ore >= info.Cost ? Color.White : Color.Red); + + var bi = info as BuildingInfo; + if (bi != null) + DrawRightAligned("ϟ{0}".F(bi.Power), pos + new int2(-5, 20), + Game.LocalPlayer.PowerProvided - Game.LocalPlayer.PowerDrained + bi.Power >= 0 + ? Color.White : Color.Red); + + var buildings = Rules.TechTree.GatherBuildings( Game.LocalPlayer ); + p += new int2(5, 5); + p += new int2(0, 15); + if (!Rules.TechTree.CanBuild(info, Game.LocalPlayer, buildings)) + { + var prereqs = info.Prerequisite.Select(a => Rules.UnitInfo[a.ToLowerInvariant()].Description); + renderer.DrawText("Requires {0}".F( string.Join( ", ", prereqs.ToArray() ) ), p.ToInt2(), + Color.White); + } + + if (info.LongDesc != null) + { + p += new int2(0, 15); + renderer.DrawText(info.LongDesc.Replace( "\\n", "\n" ), p.ToInt2(), Color.White); + } + } } } diff --git a/OpenRa.Game/GameRules/UnitInfo.cs b/OpenRa.Game/GameRules/UnitInfo.cs index b464020e45..0bb6b3a78d 100755 --- a/OpenRa.Game/GameRules/UnitInfo.cs +++ b/OpenRa.Game/GameRules/UnitInfo.cs @@ -50,6 +50,7 @@ namespace OpenRa.Game.GameRules public readonly int InitialFacing = 128; public readonly bool Selectable = true; public readonly int FireDelay = 0; + public readonly string LongDesc = null; public UnitInfo(string name) { Name = name; } } diff --git a/OpenRa.Game/Graphics/Renderer.cs b/OpenRa.Game/Graphics/Renderer.cs index 7476de583d..e516a06acb 100644 --- a/OpenRa.Game/Graphics/Renderer.cs +++ b/OpenRa.Game/Graphics/Renderer.cs @@ -17,7 +17,7 @@ namespace OpenRa.Game.Graphics public Shader RgbaSpriteShader { get; private set; } readonly SpriteHelper sh; - readonly FontHelper fhDebug; + readonly FontHelper fhDebug, fhTitle; public void BuildPalette(Map map) { @@ -44,6 +44,7 @@ namespace OpenRa.Game.Graphics sh = new SpriteHelper(device); fhDebug = new FontHelper(device, "Tahoma", 10, false); + fhTitle = new FontHelper(device, "Tahoma", 10, true); } public GraphicsDevice Device { get { return device; } } @@ -107,9 +108,21 @@ namespace OpenRa.Game.Graphics sh.End(); } + public void DrawText2(string text, int2 pos, Color c) + { + sh.Begin(); + fhTitle.Draw(sh, text, pos.X, pos.Y, c.ToArgb()); + sh.End(); + } + public int2 MeasureText(string text) { return new int2(fhDebug.MeasureText(sh, text)); } + + public int2 MeasureText2(string text) + { + return new int2(fhTitle.MeasureText(sh, text)); + } } } diff --git a/OpenRa.Game/Player.cs b/OpenRa.Game/Player.cs index 8d3a560cff..abd3e1400e 100644 --- a/OpenRa.Game/Player.cs +++ b/OpenRa.Game/Player.cs @@ -19,8 +19,8 @@ namespace OpenRa.Game public int Cash; public int Ore; public int DisplayCash; - public int powerProvided; - public int powerDrained; + public int PowerProvided; + public int PowerDrained; public bool IsReady; @@ -34,15 +34,15 @@ namespace OpenRa.Game this.Cash = 10000; this.Ore = 0; this.DisplayCash = 0; - this.powerProvided = this.powerDrained = 0; + this.PowerProvided = this.PowerDrained = 0; } void UpdatePower() { - var oldBalance = powerProvided - powerDrained; + var oldBalance = PowerProvided - PowerDrained; - powerProvided = 0; - powerDrained = 0; + PowerProvided = 0; + PowerDrained = 0; var myBuildings = Game.world.Actors .Where(a => a.Owner == this && a.traits.Contains()); @@ -51,13 +51,13 @@ namespace OpenRa.Game { var bi = a.Info as BuildingInfo; if (bi.Power > 0) /* todo: is this how real-ra scales it? */ - powerProvided += (a.Health * bi.Power) / bi.Strength; + PowerProvided += (a.Health * bi.Power) / bi.Strength; else - powerDrained -= bi.Power; + PowerDrained -= bi.Power; } - if (powerProvided - powerDrained < 0) - if (powerProvided - powerDrained != oldBalance) + if (PowerProvided - PowerDrained < 0) + if (PowerProvided - PowerDrained != oldBalance) GiveAdvice("lopower1.aud"); } @@ -68,8 +68,8 @@ namespace OpenRa.Game public PowerState GetPowerState() { - if (powerProvided >= powerDrained) return PowerState.Normal; - if (powerProvided > powerDrained / 2) return PowerState.Low; + if (PowerProvided >= PowerDrained) return PowerState.Normal; + if (PowerProvided > PowerDrained / 2) return PowerState.Low; return PowerState.Critical; } diff --git a/artsrc/bits.psd b/artsrc/bits.psd index e9b91efd0fc3650ae2cb55b2c73daa85658ff558..157a1ff1dbabb811795c7ec561717d18be7137f2 100644 GIT binary patch delta 46409 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 V=X`#bnTIBHELydpqhQgn{{~VdZDIfb delta 5135 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 delta 6004 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 diff --git a/units.ini b/units.ini index 3b3af5c587..b5ec8f50af 100755 --- a/units.ini +++ b/units.ini @@ -17,68 +17,80 @@ MNLY Description=V2 Rocket Traits=Unit, Mobile, AttackBase, RenderUnitReload Voice=VehicleVoice +LongDesc=Long-range rocket artillery.\n Strong vs Infantry, Buildings\n Weak vs Tanks, Aircraft [1TNK] Description=Light Tank Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted Recoil=2 Voice=VehicleVoice +LongDesc=Light Tank, good for scouting.\n Strong vs Light Vehicles\n Weak vs Tanks, Aircraft [2TNK] Description=Medium Tank Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted Recoil=3 Voice=VehicleVoice +LongDesc=Allied Main Battle Tank.\n Strong vs Tanks, Light Vehicles\n Weak vs Infantry, Aircraft [3TNK] Description=Heavy Tank Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted Recoil=3 Voice=VehicleVoice +LongDesc=Soviet Main Battle Tank, with dual cannons\n Strong vs Tanks, Light Vehicles\n Weak vs Infantry, Aircraft [4TNK] Description=Mammoth Tank Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted Voice=VehicleVoice +LongDesc=Big and slow tank, with anti-air capability.\n Strong vs Tanks, Aircraft\n Weak vs Infantry [MRJ] Description=Radar Jammer Traits=Unit, Mobile, RenderUnitSpinner PrimaryOffset=0,4,0,-6 SelectionPriority=3 Voice=VehicleVoice +LongDesc=Hides nearby units on the enemy's minimap.\n Unarmed [MGG] Description=Mobile Gap Generator Traits=Unit, Mobile, RenderUnitSpinner PrimaryOffset=0,6,0,-3 SelectionPriority=3 Voice=VehicleVoice +LongDesc=Regenerates Fog of War in a small area \naround the unit.\n Unarmed [ARTY] Description=Artillery Traits=Unit, Mobile, AttackBase, RenderUnit Voice=VehicleVoice +LongDesc=Long-range artillery.\n Strong vs Infantry, Buildings\n Weak vs Tanks, Aircraft [HARV] Description=Ore Truck Traits=Harvester, Unit, Mobile, RenderUnit SelectionPriority=7 Voice=VehicleVoice +LongDesc=Collects Ore and Gems for processing.\n Unarmed [MCV] Description=Mobile Construction Vehicle Traits=Unit, Mobile, McvDeploy, RenderUnit SelectionPriority=3 Voice=VehicleVoice +LongDesc=Deploys into another Construction Yard.\n Unarmed [JEEP] Description=Ranger Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted PrimaryOffset=0,0,0,-2 MuzzleFlash=yes Voice=VehicleVoice +LongDesc=Fast scout & anti-infantry vehicle.\n Strong vs Infantry\n Weak vs Tanks, Aircraft [APC] Description=Armored Personnel Carrier Traits=Unit, Mobile, AttackBase, RenderUnitMuzzleFlash PrimaryOffset=0,0,0,-4 MuzzleFlash=yes Voice=VehicleVoice +LongDesc=Tough infantry transport.\n Strong vs Infantry, Light Vehicles\n Weak vs Tanks, Aircraft [MNLY] Description=Minelayer Traits=Unit, Mobile, RenderUnit Voice=VehicleVoice - +LongDesc=Lays mines to destroy unwary enemy units.\n Unarmed @@ -96,12 +108,14 @@ WaterBound=yes BuiltAt=spen Traits=Unit, Mobile, RenderUnit, Cloak, AttackBase FireDelay=2 +LongDesc=Submerged anti-ship unit armed with \ntorpedoes.\n Strong vs Ships\n Weak vs Everything\n Special Ability: Submerge [DD] Description=Destroyer WaterBound=yes BuiltAt=syrd Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted PrimaryOffset=0,-8,0,-3 +LongDesc=Fast multi-role ship. \n Strong vs Submarines, Aircraft\n Weak vs Infantry, Tanks [CA] Description=Cruiser WaterBound=yes @@ -109,17 +123,20 @@ BuiltAt=syrd Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted PrimaryOffset=0,17,0,-2 SecondaryOffset=0,-17,0,-2 +LongDesc=Very slow long-range ship. \n Strong vs Buildings\n Weak vs Ships, Submarines Recoil=3 [LST] Description=Transport WaterBound=yes Traits=Unit, Mobile, RenderUnit +LongDesc=General-purpose naval transport.\nCan carry infantry and tanks.\n Unarmed [PT] Description=Gunboat WaterBound=yes BuiltAt=syrd Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted PrimaryOffset=0,-6,0,-1 +LongDesc=Light scout & support ship. \n Strong vs Ships, Submarines\n Weak vs Aircraft @@ -140,11 +157,13 @@ Description=Mig Attack Plane BuiltAt=afld Traits=Unit, Mobile, RenderUnit InitialFacing=192 +LongDesc=Fast Ground-Attack Plane.\n Strong vs Buildings\n Weak vs Infantry, Light Vehicles [YAK] Description=Yak Attack Plane BuiltAt=afld Traits=Unit, Mobile, RenderUnit InitialFacing=192 +LongDesc=Anti-Tanks & Anti-Infantry Plane.\n Strong vs Infantry, Tanks\n Weak vs Buildings [TRAN] Description=Transport Helicopter PrimaryOffset=0,14,0,-4 @@ -153,18 +172,20 @@ BuiltAt=hpad Traits=Unit, Helicopter, RenderUnitRotor SecondaryAnim=rotor2 InitialFacing=20 +LongDesc=Fast Infantry Transport Helicopter.\n Unarmed [HELI] Description=Longbow BuiltAt=hpad Traits=Unit, Helicopter, RenderUnitRotor PrimaryOffset=0,0,0,-2 InitialFacing=20 +LongDesc=Helicopter Gunship with AG Missiles.\n Strong vs Buildings, Tanks\n Weak vs Infantry [HIND] Description=Hind BuiltAt=hpad Traits=Unit, Helicopter, RenderUnitRotor InitialFacing=20 - +LongDesc=Helicopter Gunship with Chainguns.\n Strong vs Infantry, Light Vehicles.\n Weak vs Tanks @@ -192,12 +213,14 @@ Traits=Building, Turreted, RenderBuilding, AttackTurreted, AutoTarget Dimensions=1,1 Footprint=x SelectionPriority=3 +LongDesc=Basic defensive structure.\n Strong vs Infantry, Light Vehicles\n Weak vs Tanks, Aircraft [HBOX] Description=Camo Pillbox Traits=Building, Turreted, RenderBuilding, AttackTurreted, AutoTarget Dimensions=1,1 Footprint=x SelectionPriority=3 +LongDesc=Hidden defensive structure.\n Strong vs Infantry, Light Vehicles\n Weak vs Tanks, Aircraft [TSLA] Description=Tesla Coil Traits=Building, Turreted, RenderBuildingCharge, AttackTurreted, AutoTarget @@ -205,6 +228,7 @@ Dimensions=1,2 Footprint=_ x SelectionPriority=3 FireDelay=8 +LongDesc=Advanced base defense. Requires power\nto operate.\n Strong vs Tanks, Infantry\n Weak vs Aircraft [GUN] Description=Turret Traits=Building, Turreted, RenderBuildingTurreted, AttackTurreted, AutoTarget @@ -212,6 +236,7 @@ Dimensions=1,1 Footprint=x SelectionPriority=3 InitialFacing=50 +LongDesc=Anti-Armor base defense.\n Strong vs Tanks\n Weak vs Infantry, Aircraft [AGUN] Description=AA Gun Traits=Building, Turreted, RenderBuildingTurreted @@ -219,30 +244,49 @@ Dimensions=1,2 Footprint=_ x SelectionPriority=3 InitialFacing=224 +LongDesc=Anti-Air base defense.\n Strong vs Aircraft\n Weak vs Infantry, Tanks [FTUR] Description=Flame Turret Traits=Building, RenderBuilding Dimensions=1,1 Footprint=x SelectionPriority=3 +LongDesc=Anti-Infantry base defense.\n Strong vs Infantry\n Weak vs Aircraft [GAP] Description=Gap Generator Traits=Building, RenderBuilding Dimensions=1,2 Footprint=_ x SelectionPriority=3 +LongDesc=Regenerates the Fog of War nearby, \nobscuring the area.\n Unarmed [SAM] Description=SAM Site Traits=Building, Turreted, RenderBuildingTurreted Dimensions=2,1 Footprint=xx SelectionPriority=3 +LongDesc=Anti-Air base defense.\n Strong vs Aircraft\n Weak vs Infantry, Tanks [MSLO] Description=Missile Silo Traits=Building, RenderBuilding Dimensions=2,1 Footprint=xx SelectionPriority=3 +LongDesc=Launches a devastating nuclear strike.\n Strong vs Infantry, Buildings\n Weak vs Tanks\n Special Ability: Nuclear Missile +[IRON] +Description=Iron Curtain +Traits=Building, RenderBuilding +Dimensions=2,2 +Footprint=xx xx +SelectionPriority=3 +LongDesc=Makes a group of units invulnerable for a \nshort time.\n Special Ability: Invulnerability +[PDOX] +Description=Chronosphere +Traits=Building, RenderBuilding +Dimensions=2,2 +Footprint=xx xx +SelectionPriority=3 +LongDesc=Teleports a group of units from one place \nto another, for a limited time.\n Special Ability: Chronoshift @@ -279,24 +323,13 @@ DOMF ; x : Solid. cannot be walked on or built on. ; = : Occupied by a building, but can be walked on normally. (e.g: the drop-off point on the refinery) ; `Produces` is a category of objects that this building can produce. -[IRON] -Description=Iron Curtain -Traits=Building, RenderBuilding -Dimensions=2,2 -Footprint=xx xx -SelectionPriority=3 [ATEK] Description=Allied Tech Center Traits=Building, RenderBuilding Dimensions=2,2 Footprint=xx xx SelectionPriority=3 -[PDOX] -Description=Chronosphere -Traits=Building, RenderBuilding -Dimensions=2,2 -Footprint=xx xx -SelectionPriority=3 +LongDesc=Provides Allied advanced technologies.\n Special Ability: GPS Satellite [WEAP] Description=War Factory Traits=Building, RenderWarFactory, RallyPoint, Production @@ -305,6 +338,7 @@ Footprint=xxx xxx Produces=Vehicle RallyPoint=1,3 SelectionPriority=3 +LongDesc=Produces tanks & light vehicles. [SYRD] Description=Shipyard Traits=Building, RenderBuilding, ProductionSurround @@ -312,6 +346,7 @@ Dimensions=3,3 Footprint=xxx xxx xxx Produces=Ship SelectionPriority=3 +LongDesc=Produces and repairs ships [SPEN] Description=Sub Pen Traits=Building, RenderBuilding, ProductionSurround @@ -319,6 +354,7 @@ Dimensions=3,3 Footprint=xxx xxx xxx Produces=Ship SelectionPriority=3 +LongDesc=Produces and repairs submarines and \ntransports [FACT] Description=Construction Yard Traits=Building, RenderBuilding @@ -326,18 +362,21 @@ Dimensions=3,3 Footprint=xxx xxx xxx Produces=Building,Defense SelectionPriority=3 +LongDesc=Produces other structures [PROC] Description=Ore Refinery Traits=Building, RenderBuilding, AcceptsOre Dimensions=3,3 Footprint=_x_ xxx x== SelectionPriority=3 +LongDesc=Converts Ore and Gems into money [SILO] Description=Silo Traits=Building, RenderBuildingOre Dimensions=1,1 Footprint=x SelectionPriority=3 +LongDesc=Stores excess harvested Ore [HPAD] Description=Helipad Traits=Building, RenderBuilding, Production @@ -346,12 +385,14 @@ Footprint=xx xx Produces=Plane SelectionPriority=3 SpawnOffset=0,0 ; todo: push this up a bit, but we've got a z-order issue first. +LongDesc=Produces and reloads helicopters [DOME] Description=Radar Dome Traits=Building, RenderBuilding Dimensions=2,2 Footprint=xx xx SelectionPriority=3 +LongDesc=Provides an overview of the battlefield.\n Requires power to operate. [AFLD] Description=Airstrip Traits=Building, RenderBuilding, Production @@ -359,24 +400,28 @@ Dimensions=3,2 Footprint=xxx xxx Produces=Plane SelectionPriority=3 +LongDesc=Produces and reloads planes\n Special Ability: Paratroopers\n Special Ability: Spy Plane [POWR] Description=Power Plant Traits=Building, RenderBuilding Dimensions=2,2 Footprint=xx xx SelectionPriority=3 +LongDesc=Provides power for other structures [APWR] Description=Advanced Power Plant Traits=Building, RenderBuilding Dimensions=3,3 Footprint=___ xxx xxx SelectionPriority=3 +LongDesc=Provides more power, cheaper than the \nstandard Power Plant [STEK] Description=Soviet Tech Center Traits=Building, RenderBuilding Dimensions=3,2 Footprint=xxx xxx SelectionPriority=3 +LongDesc=Provides Soviet advanced technologies [BARR] Description=Soviet Barracks Traits=Building, RenderBuilding, RallyPoint, Production @@ -385,6 +430,7 @@ Footprint=xx xx Produces=Infantry RallyPoint=1,3 SelectionPriority=3 +LongDesc=Produces infantry [TENT] Description=Allied Barracks Traits=Building, RenderBuilding, RallyPoint, Production @@ -393,6 +439,7 @@ Footprint=xx xx Produces=Infantry RallyPoint=1,3 SelectionPriority=3 +LongDesc=Produces infantry [KENN] Description=Kennel Traits=Building, RenderBuilding, RallyPoint, Production @@ -400,42 +447,49 @@ Dimensions=1,1 Footprint=x RallyPoint=1,2 SelectionPriority=3 +LongDesc=Produces attack dogs [FIX] Description=Service Depot Traits=Building, RenderBuilding Dimensions=3,3 Footprint=_x_ xxx _x_ SelectionPriority=3 +LongDesc=Repairs vehicles, reloads minelayers, and \nallows the construction of additional bases. [FACF] Description=Fake Construction Yard Traits=Building, RenderBuilding Dimensions=3,3 Footprint=xxx xxx xxx SelectionPriority=3 +LongDesc=Looks like a Construction Yard. [WEAF] Description=Fake War Factory Traits=Building, RenderWarFactory Dimensions=3,2 Footprint=xxx xxx SelectionPriority=3 +LongDesc=Looks like a War Factory. [SYRF] Description=Fake Shipyard Traits=Building, RenderBuilding Dimensions=3,3 Footprint=xxx xxx xxx SelectionPriority=3 +LongDesc=Looks like a Shipyard [SPEF] Description=Fake Sub Pen Traits=Building, RenderBuilding Dimensions=3,3 Footprint=xxx xxx xxx SelectionPriority=3 +LongDesc=Looks like a Sub Pen [DOMF] Description=Fake Radar Dome Traits=Building, RenderBuilding Dimensions=2,2 Footprint=xx xx SelectionPriority=3 +LongDesc=Looks like a Radar Dome ;[SBAG] ;Description=Sandbags ;SelectionPriority=3 @@ -467,29 +521,36 @@ Description=Attack Dog BuiltAt=KENN Voice=DogVoice Traits=Unit, Mobile, RenderInfantry +LongDesc=Anti-infantry unit. Not fooled by the \nSpy's disguise.\n Strong vs Infantry\n Weak vs Vehicles [E1] Description=Rifle Infantry Traits=Unit, Mobile, RenderInfantry, AttackBase +LongDesc=General-purpose infantry. Strong vs Infantry\n Weak vs Vehicles [E2] Description=Grenadier Traits=Unit, Mobile, RenderInfantry, AttackBase FireDelay=15 +LongDesc=Infantry armed with grenades. \n Strong vs Buildings, Infantry\n Weak vs Vehicles [E3] Description=Rocket Soldier Traits=Unit, Mobile, RenderInfantry, AttackBase PrimaryOffset=0,0,0,-13 +LongDesc=Anti-tank/Anti-aircraft infantry.\n Strong vs Tanks, Aircraft\n Weak vs Infantry [E4] Description=Flamethrower Traits=Unit, Mobile, RenderInfantry, AttackBase FireDelay=8 +LongDesc=Advanced Anti-infantry unit.\n Strong vs Infantry, Buildings\n Weak vs Vehicles [E6] Description=Engineer Traits=Unit, Mobile, RenderInfantry Voice=EngineerVoice +LongDesc=Infiltrates and captures enemy structures.\n Strong vs Nothing\n Weak vs Everything [SPY] Description=Spy Voice=SpyVoice Traits=Unit, Mobile, RenderInfantry +LongDesc=Infiltrates enemy structures to gather \nintelligence. Exact effect depends on the \nbuilding infiltrated.\n Strong vs Nothing\n Weak vs Everything\n Special Ability: Disguised [THF] Description=Thief Voice=MedicVoice @@ -497,10 +558,12 @@ Voice=MedicVoice Description=Tanya Voice=TanyaVoice Traits=Unit, Mobile, RenderInfantry, AttackBase +LongDesc=Elite commando infantry, armed with \ndual pistols and C4.\n Strong vs Infantry, Buildings\n Weak vs Vehicles\n Special Ability: Destroy Building with C4 [MEDI] Description=Medic Voice=MedicVoice Traits=Unit, Mobile, RenderInfantry, AttackBase +LongDesc=Heals nearby infantry.\n Strong vs Nothing\n Weak vs Everything