11package bwapi .types ;
22
3+ import java .util .ArrayList ;
4+ import java .util .Arrays ;
5+ import java .util .HashSet ;
6+ import java .util .Set ;
7+ import java .util .stream .Collectors ;
8+
9+ import static bwapi .types .Order .*;
10+ import static bwapi .types .Race .*;
11+ import static bwapi .types .UnitType .*;
12+
13+
314public enum TechType {
415 Stim_Packs (0 ),
516 Lockdown (1 ),
@@ -41,58 +52,58 @@ public enum TechType {
4152 Nuclear_Strike (45 ),
4253 Unknown (46 );
4354
44- private int value ;
55+ private int id ;
4556
46- public int getValue (){
47- return value ;
48- }
49-
50- TechType (int value ) {
51- this .value = value ;
57+ TechType (int id ) {
58+ this .id = id ;
5259 }
5360
5461 public Race getRace () {
55- return null ;
62+ return techRaces [ id ] ;
5663 }
5764
5865 public int mineralPrice () {
59- return - 1 ;
66+ return defaultOreCost [ id ] ;
6067 }
6168
6269 public int gasPrice () {
63- return - 1 ;
70+ return mineralPrice () ;
6471 }
6572
6673 public int researchTime () {
67- return - 1 ;
74+ return defaultTimeCost [ id ] ;
6875 }
6976
7077 public int energyCost () {
71- return - 1 ;
78+ return defaultEnergyCost [ id ] ;
7279 }
7380
7481 public UnitType whatResearches () {
75- return null ;
82+ return whatResearches [ id ] ;
7683 }
7784
7885 public WeaponType getWeapon () {
79- return null ;
86+ return techWeapons [ id ] ;
8087 }
8188
8289 public boolean targetsUnit () {
83- return false ;
90+ return techTypeFlags [ id ] == 1 || techTypeFlags [ id ] == 3 ;
8491 }
8592
8693 public boolean targetsPosition () {
87- return false ;
94+ return techTypeFlags [id ] == 2 || techTypeFlags [id ] == 3 ;
95+ }
96+
97+ public Set <UnitType > whatsUses () {
98+ return Arrays .stream (techWhatUses [id ]).collect (Collectors .toSet ());
8899 }
89100
90101 public Order getOrder () {
91- return null ;
102+ return techOrders [ id ] ;
92103 }
93104
94105 public UnitType requiredUnit () {
95- return null ;
106+ return this == Lurker_Aspect ? Zerg_Lair : UnitType . None ;
96107 }
97108
98109 /// IMPLEMENTATION
@@ -103,15 +114,125 @@ public UnitType requiredUnit() {
103114 private static int defaultEnergyCost [] =
104115 { 0 , 100 , 100 , 0 , 50 , 0 , 100 , 75 , 150 , 25 , 25 , 0 , 0 , 150 , 100 , 150 , 0 , 75 , 75 , 75 , 100 , 150 , 100 , 0 , 50 , 125 , 0 , 150 , 0 , 50 , 75 , 100 , 0 , 0 , 1 };
105116
106- // static const int whatResearches[] =
107- // { Terran_Academy, Terran_Covert_Ops, Terran_Science_Facility, Terran_Machine_Shop,
108- // None, Terran_Machine_Shop, None, Terran_Science_Facility, Terran_Physics_Lab,
109- // Terran_Control_Tower, Terran_Covert_Ops, Zerg_Hatchery, None, Zerg_Queens_Nest,
110- // None, Zerg_Defiler_Mound, Zerg_Defiler_Mound, Zerg_Queens_Nest, None,
111- // Protoss_Templar_Archives, Protoss_Templar_Archives, Protoss_Arbiter_Tribunal,
112- // Protoss_Arbiter_Tribunal, None, Terran_Academy, Protoss_Fleet_Beacon, None,
113- // Protoss_Templar_Archives, None, None, Terran_Academy, Protoss_Templar_Archives,
114- // Zerg_Hydralisk_Den, None, None, None, None, None, None, None, None, None, None, None,
115- // None, None, Unknown
116- // };
117+ private static UnitType whatResearches [] = {
118+ Terran_Academy , Terran_Covert_Ops , Terran_Science_Facility , Terran_Machine_Shop ,
119+ UnitType .None , Terran_Machine_Shop , UnitType .None , Terran_Science_Facility , Terran_Physics_Lab ,
120+ Terran_Control_Tower , Terran_Covert_Ops , Zerg_Hatchery , UnitType .None , Zerg_Queens_Nest ,
121+ UnitType .None , Zerg_Defiler_Mound , Zerg_Defiler_Mound , Zerg_Queens_Nest , UnitType .None ,
122+ Protoss_Templar_Archives , Protoss_Templar_Archives , Protoss_Arbiter_Tribunal ,
123+ Protoss_Arbiter_Tribunal , UnitType .None , Terran_Academy , Protoss_Fleet_Beacon , UnitType .None ,
124+ Protoss_Templar_Archives , UnitType .None , UnitType .None , Terran_Academy , Protoss_Templar_Archives ,
125+ Zerg_Hydralisk_Den , UnitType .None , UnitType .None , UnitType .None , UnitType .None , UnitType .None , UnitType .None , UnitType .None , UnitType .None , UnitType .None , UnitType .None , UnitType .None ,
126+ UnitType .None , UnitType .None , UnitType .Unknown
127+ };
128+
129+ private static Race techRaces [] = {
130+ Terran , Terran , Terran , Terran , Terran , Terran , Terran , Terran , Terran , Terran , Terran ,
131+ Zerg , Zerg , Zerg , Zerg , Zerg , Zerg , Zerg , Zerg ,
132+ Protoss , Protoss , Protoss , Protoss , Protoss ,
133+ Terran , Protoss , Race .None , Protoss , Protoss , Protoss , Terran , Protoss , Zerg , Race .None , Terran ,
134+ Race .None , Race .None , Race .None , Race .None , Race .None , Race .None , Race .None , Race .None , Race .None , Race .None , Terran , Race .Unknown
135+ };
136+
137+ private static WeaponType techWeapons [] = {
138+ WeaponType .None , WeaponType .Lockdown , WeaponType .EMP_Shockwave , WeaponType .Spider_Mines , WeaponType .None , WeaponType .None , WeaponType .None , WeaponType .Irradiate , WeaponType .Yamato_Gun ,
139+ WeaponType .None , WeaponType .None , WeaponType .None , WeaponType .None , WeaponType .Spawn_Broodlings , WeaponType .Dark_Swarm , WeaponType .Plague , WeaponType .Consume , WeaponType .Ensnare , WeaponType .Parasite ,
140+ WeaponType .Psionic_Storm , WeaponType .None , WeaponType .None , WeaponType .Stasis_Field , WeaponType .None , WeaponType .Restoration , WeaponType .Disruption_Web , WeaponType .None , WeaponType .Mind_Control ,
141+ WeaponType .None , WeaponType .Feedback , WeaponType .Optical_Flare , WeaponType .Maelstrom , WeaponType .None , WeaponType .None , WeaponType .None , WeaponType .None , WeaponType .None , WeaponType .None , WeaponType .None , WeaponType .None , WeaponType .None ,
142+ WeaponType .None , WeaponType .None , WeaponType .None , WeaponType .None , WeaponType .Nuclear_Strike , WeaponType .Unknown
143+ };
144+
145+ private static int techTypeFlags [] = {
146+ 0 , 1 , 3 , 2 , 3 , 0 , 1 , 1 , 1 , 0 , 0 , 0 ,
147+ 1 , 1 , 3 , 3 , 1 , 3 , 1 , 3 , 1 ,
148+ 3 , 3 , 1 , 1 , 3 , 0 , 1 , 1 , 1 , 1 ,
149+ 3 , 0 , 0 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 3
150+ };
151+
152+ private static Order techOrders [] = {
153+ Order .None , CastLockdown , CastEMPShockwave , PlaceMine , CastScannerSweep , Order .None , CastDefensiveMatrix ,
154+ CastIrradiate , FireYamatoGun , Order .None , Order .None , Order .None , CastInfestation , CastSpawnBroodlings ,
155+ CastDarkSwarm , CastPlague , CastConsume , CastEnsnare , CastParasite , CastPsionicStorm ,
156+ CastHallucination , CastRecall , CastStasisField , Order .None , CastRestoration , CastDisruptionWeb ,
157+ Order .None , CastMindControl , Order .None , CastFeedback , CastOpticalFlare , CastMaelstrom , Order .None , Order .None , MedicHeal ,
158+ Order .None , Order .None , Order .None , Order .None , Order .None , Order .None , Order .None , Order .None , Order .None , Order .None , NukePaint , Order .Unknown
159+ };
160+
161+ private static UnitType techWhatUses [][] = {
162+ // Stimpacks
163+ {Terran_Marine , Terran_Firebat , Hero_Jim_Raynor_Marine , Hero_Gui_Montag },
164+ // Lockdown
165+ { Terran_Ghost , Hero_Alexei_Stukov , Hero_Infested_Duran , Hero_Samir_Duran , Hero_Sarah_Kerrigan },
166+ // EMP
167+ { Terran_Science_Vessel , Hero_Magellan },
168+ // Spider Mine
169+ { Terran_Vulture , Hero_Jim_Raynor_Vulture },
170+ // Scanner Sweep
171+ { Terran_Comsat_Station },
172+ // Siege Mode
173+ { Terran_Siege_Tank_Tank_Mode , Terran_Siege_Tank_Siege_Mode , Hero_Edmund_Duke_Tank_Mode , Hero_Edmund_Duke_Siege_Mode },
174+ // Defensive Matrix
175+ { Terran_Science_Vessel , Hero_Magellan },
176+ // Irradiate
177+ { Terran_Science_Vessel , Hero_Magellan },
178+ // Yamato Cannon
179+ { Terran_Battlecruiser , Hero_Gerard_DuGalle , Hero_Hyperion , Hero_Norad_II },
180+ // Cloaking Field
181+ { Terran_Wraith , Hero_Tom_Kazansky },
182+ // Personnel Cloaking
183+ { Terran_Ghost , Hero_Alexei_Stukov , Hero_Infested_Duran , Hero_Samir_Duran , Hero_Sarah_Kerrigan , Hero_Infested_Kerrigan },
184+ // Burrow
185+ { Zerg_Zergling , Zerg_Hydralisk , Zerg_Drone , Zerg_Defiler , Zerg_Infested_Terran , Hero_Unclean_One , Hero_Hunter_Killer , Hero_Devouring_One , Zerg_Lurker },
186+ // Infestation
187+ { Zerg_Queen , Hero_Matriarch },
188+ // Spawn Broodlings
189+ { Zerg_Queen , Hero_Matriarch },
190+ // Dark Swarm
191+ { Zerg_Defiler , Hero_Unclean_One },
192+ // Plague
193+ { Zerg_Defiler , Hero_Unclean_One },
194+ // Consume
195+ { Zerg_Defiler , Hero_Unclean_One , Hero_Infested_Kerrigan , Hero_Infested_Duran },
196+ // Ensnare
197+ { Zerg_Queen , Hero_Matriarch , Hero_Infested_Kerrigan },
198+ // Parasite
199+ { Zerg_Queen , Hero_Matriarch },
200+ // Psi Storm
201+ { Protoss_High_Templar , Hero_Tassadar , Hero_Infested_Kerrigan },
202+ // Hallucination
203+ { Protoss_High_Templar , Hero_Tassadar },
204+ // Recall
205+ { Protoss_Arbiter , Hero_Danimoth },
206+ // Stasis Field
207+ { Protoss_Arbiter , Hero_Danimoth },
208+ // Archon Warp
209+ { Protoss_High_Templar },
210+ // Restoration
211+ { Terran_Medic },
212+ // Disruption Web
213+ { Protoss_Corsair , Hero_Raszagal },
214+ // Unused
215+ {},
216+ // Mind Control
217+ { Protoss_Dark_Archon },
218+ // Dark Archon Meld
219+ { Protoss_Dark_Templar },
220+ // Feedback
221+ { Protoss_Dark_Archon },
222+ // Optical Flare
223+ { Terran_Medic },
224+ // Maelstrom
225+ { Protoss_Dark_Archon },
226+ // Lurker Aspect
227+ { Zerg_Hydralisk },
228+ // Unused
229+ {},
230+ // Healing
231+ { Terran_Medic },
232+ // Unused
233+ {}, {}, {}, {}, {}, {}, {}, {}, {}, {},
234+ // Extra (Nuke)
235+ { Terran_Ghost },
236+ {}
237+ };
117238}
0 commit comments