From 88d24e18da7bc62a4a15771b9966a01edfd41461 Mon Sep 17 00:00:00 2001 From: chrisf Date: Tue, 10 Jul 2007 07:52:42 +0000 Subject: [PATCH] weird unit rules haxed git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1162 993157c7-ee19-0410-b2c4-bb4e9862e678 --- OpenRa.TechTreeTest/Item.cs | 72 ++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/OpenRa.TechTreeTest/Item.cs b/OpenRa.TechTreeTest/Item.cs index f50b6e1099..dee583439c 100644 --- a/OpenRa.TechTreeTest/Item.cs +++ b/OpenRa.TechTreeTest/Item.cs @@ -16,7 +16,9 @@ namespace OpenRa.TechTreeTest owner = ParseOwner(section); techLevel = ParseTechLevel(section); - prerequisites = ParsePrerequisites(section); + Tuple pre = ParsePrerequisites(section, tag); + alliedPrerequisites = pre.a; + sovietPrerequisites = pre.b; } static int ParseTechLevel(IniSection section) @@ -24,12 +26,6 @@ namespace OpenRa.TechTreeTest return int.Parse(section.GetValue("TechLevel", "-1")); } - static string[] ParsePrerequisites(IniSection section) - { - return section.GetValue("Prerequisite", "").ToUpper().Split( - new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - } - static Race ParseOwner(IniSection section) { if (section.GetValue("DoubleOwned", "No") == "Yes") @@ -44,43 +40,85 @@ namespace OpenRa.TechTreeTest return race; } + static Tuple ParsePrerequisites(IniSection section, string tag) + { + List allied = new List(section.GetValue("Prerequisite", "").ToUpper().Split( + new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)); + + List soviet = new List(allied); + + if (allied.Remove("STEK")) + allied.Add("ATEK"); + + if (soviet.Remove("ATEK")) + soviet.Add("STEK"); + + if (soviet.Remove("TENT")) + soviet.Add("BARR"); + + if (allied.Remove("BARR")) + allied.Add("TENT"); + + if ((tag.Length == 2 && tag[0] == 'E') || tag == "MEDI" || tag == "THF" || tag == "SPY") + { + if (!allied.Contains("TENT")) + allied.Add("TENT"); + if (!soviet.Contains("BARR")) + soviet.Add("BARR"); + } + + if (tag == "LST") + { + if (!soviet.Contains("SPEN")) + soviet.Add("SPEN"); + + if (!allied.Contains("SYRD")) + allied.Add("SYRD"); + } + + return new Tuple( + allied.ToArray(), soviet.ToArray()); + } + public readonly string tag, friendlyName; readonly int techLevel; readonly Race owner; - readonly string[] prerequisites; + readonly string[] alliedPrerequisites, sovietPrerequisites; - bool ShouldMakeBuildable(IEnumerable buildings) + bool ShouldMakeBuildable(IEnumerable buildings, string[] racePrerequisites) { if (techLevel < 0) return false; - if (prerequisites.Length == 0) + if (racePrerequisites.Length == 0) return true; - List p = new List(prerequisites); + List p = new List(racePrerequisites); foreach (string b in buildings) p.Remove(b); return p.Count == 0; } - bool ShouldMakeUnbuildable(IEnumerable buildings) + bool ShouldMakeUnbuildable(IEnumerable buildings, string[] racePrerequisites) { - if (prerequisites.Length == 0) + if (racePrerequisites.Length == 0) return false; - List p = new List(prerequisites); + List p = new List(racePrerequisites); foreach (string b in buildings) p.Remove(b); - return p.Count == prerequisites.Length; + return p.Count == racePrerequisites.Length; } public void CheckPrerequisites(IEnumerable buildings, Race currentRace) { - if ((canBuild && ShouldMakeUnbuildable(buildings)) || !((owner & currentRace) == currentRace)) + string[] racePrerequisites = (currentRace == Race.Allies) ? alliedPrerequisites : sovietPrerequisites; + + if ((canBuild && ShouldMakeUnbuildable(buildings, racePrerequisites)) || !((owner & currentRace) == currentRace)) canBuild = false; - else if (!canBuild && ShouldMakeBuildable(buildings)) + else if (!canBuild && ShouldMakeBuildable(buildings, racePrerequisites)) canBuild = true; }