diff --git a/OpenRa.FileFormats/Package.cs b/OpenRa.FileFormats/Package.cs index 92f8367306..a999961351 100644 --- a/OpenRa.FileFormats/Package.cs +++ b/OpenRa.FileFormats/Package.cs @@ -134,7 +134,14 @@ namespace OpenRa.FileFormats public Stream GetContent(string filename) { - return GetContent(PackageEntry.HashFilename(filename)); + try + { + return GetContent(PackageEntry.HashFilename(filename)); + } + catch (FileNotFoundException e) + { + throw new FileNotFoundException("File not found", filename, e); + } } } diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index 0836b016c9..be9629ad49 100644 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -7,6 +7,7 @@ using BluntDirectX.Direct3D; using OpenRa.FileFormats; using System.IO; using System.Runtime.InteropServices; +using OpenRa.TechTree; namespace OpenRa.Game { @@ -58,7 +59,7 @@ namespace OpenRa.Game world.Add(new Refinery(new PointF(24 * 5, 24 * 7), 1)); - sidebar = new Sidebar(OpenRa.TechTree.Race.None, renderer); + sidebar = new Sidebar(Race.Soviet, renderer); } internal void Run() @@ -111,7 +112,7 @@ namespace OpenRa.Game new Range(scrollPos.X, scrollPos.X + ClientSize.Width), new Range(scrollPos.Y, scrollPos.Y + ClientSize.Height)); - sidebar.Paint(scrollPos); + sidebar.Paint(ClientSize, scrollPos); renderer.EndFrame(); } diff --git a/OpenRa.Game/Sidebar.cs b/OpenRa.Game/Sidebar.cs index 128e381b9b..80f1a99a03 100644 --- a/OpenRa.Game/Sidebar.cs +++ b/OpenRa.Game/Sidebar.cs @@ -5,11 +5,12 @@ using OpenRa.TechTree; using BluntDirectX.Direct3D; using OpenRa.FileFormats; using System.Drawing; +using System.IO; + namespace OpenRa.Game { using Sprite = SheetRectangle; - class Sidebar { TechTree.TechTree techTree = new TechTree.TechTree(); @@ -20,33 +21,55 @@ namespace OpenRa.Game Dictionary sprites = new Dictionary(); - void LoadSprite(string name) - { - sprites.Add(name, SpriteSheetBuilder.LoadSprite(package, name + "icon.shp")); - } - public Sidebar(Race race, Renderer renderer) { + techTree.CurrentRace = race; + techTree.Build("FACT"); + techTree.Build("POWR"); + techTree.Build("BARR"); + techTree.Build("PROC"); + techTree.Build("WEAP"); + techTree.Build("DOME"); this.renderer = renderer; this.spriteRenderer = new SpriteRenderer(renderer); package = new Package("../../../hires.mix"); - LoadSprite("E7"); - LoadSprite("E6"); - LoadSprite("POWR"); + LoadSprites(); techTree.CurrentRace = race; } - public void Paint(PointF scrollOffset) + void LoadSprites() { - int x = 0, y = 0; + foreach (string line in File.ReadAllLines("../../../buildings.txt")) + { + string key = line.Substring(0, line.IndexOf(',')); + sprites.Add(key, SpriteSheetBuilder.LoadSprite(package, key + "icon.shp")); + } + foreach (string line in File.ReadAllLines("../../../units.txt")) + { + string key = line.Substring(0, line.IndexOf(',')); + sprites.Add(key, SpriteSheetBuilder.LoadSprite(package, key + "icon.shp")); + } + } + + public void Paint(Size clientSize, PointF scrollOffset) + { + int y1 = 0, y2 = 0; foreach (Item i in techTree.BuildableBuildings) { Sprite sprite; if (!sprites.TryGetValue(i.tag, out sprite)) continue; - PointF location = new PointF(x + scrollOffset.X, y + scrollOffset.Y); + PointF location = new PointF(clientSize.Width - 128 + scrollOffset.X, y1 + scrollOffset.Y); spriteRenderer.DrawSprite(sprite, location); - y += 48; + y1 += 48; + } + foreach (Item i in techTree.BuildableUnits) + { + Sprite sprite; + if (!sprites.TryGetValue(i.tag, out sprite)) continue; + PointF location = new PointF(clientSize.Width - 64 + scrollOffset.X, y2 + scrollOffset.Y); + spriteRenderer.DrawSprite(sprite, location); + y2 += 48; } spriteRenderer.Flush(); diff --git a/OpenRa.TechTree/Item.cs b/OpenRa.TechTree/Item.cs index e7f1241772..970f78a58c 100644 --- a/OpenRa.TechTree/Item.cs +++ b/OpenRa.TechTree/Item.cs @@ -117,14 +117,28 @@ namespace OpenRa.TechTree return p.Count == racePrerequisites.Length; } + void CheckForBoth(IEnumerable buildings) + { + if (canBuild && (ShouldMakeUnbuildable(buildings, alliedPrerequisites) && ShouldMakeUnbuildable(buildings, sovietPrerequisites))) + canBuild = false; + + else if (!canBuild && (ShouldMakeBuildable(buildings, alliedPrerequisites) || ShouldMakeBuildable(buildings, sovietPrerequisites))) + canBuild = true; + } + public void CheckPrerequisites(IEnumerable buildings, Race currentRace) { - string[] racePrerequisites = (currentRace == Race.Allies) ? alliedPrerequisites : sovietPrerequisites; + if (currentRace == Race.None || currentRace == (Race.Allies | Race.Soviet)) + CheckForBoth(buildings); + else + { + string[] racePrerequisites = (currentRace == Race.Allies) ? alliedPrerequisites : sovietPrerequisites; - if ((canBuild && ShouldMakeUnbuildable(buildings, racePrerequisites)) || !((owner & currentRace) == currentRace)) - canBuild = false; - else if (!canBuild && ShouldMakeBuildable(buildings, racePrerequisites)) - canBuild = true; + if ((canBuild && ShouldMakeUnbuildable(buildings, racePrerequisites)) || !((owner & currentRace) == currentRace)) + canBuild = false; + else if (!canBuild && ShouldMakeBuildable(buildings, racePrerequisites)) + canBuild = true; + } } bool canBuild; diff --git a/buildings.txt b/buildings.txt index 7061fe1f68..ceae49975e 100644 --- a/buildings.txt +++ b/buildings.txt @@ -1,5 +1,4 @@ IRON,Iron Curtain -FCOM,Forward Command Center ATEK,Allied Tech Center PDOX,Chronosphere WEAP,War Factory @@ -23,8 +22,6 @@ AFLD,Airstrip POWR,Power Plant APWR,Advanced Power Plant STEK,Soviet Tech Center -HOSP,Hospital -BIO,Bio-research Laboratory BARR,Soviet Barracks TENT,Allied Barracks KENN,Kennel @@ -32,7 +29,6 @@ FIX,Service Depot SBAG,Sandbags BRIK,Concrete Wall FENC,Wire Fence -CYCL,Chain Link Fence FACF,Fake Construction Yard WEAF,Fake War Factory SYRF,Fake Shipyard