|
7 | 7 | #from sc2reader.data.build19595 import Data_19595
|
8 | 8 |
|
9 | 9 |
|
| 10 | +class Build(object): |
| 11 | + def __init__(self, build_id, units, abilities): |
| 12 | + self.id=build_id |
| 13 | + self.units = units |
| 14 | + self.abilities = abilities |
| 15 | + |
10 | 16 | from collections import namedtuple
|
11 |
| -Build = namedtuple('Build',['id','units','abilities']) |
12 | 17 | UnitRow = namedtuple('UnitRow',['id','type','title'])
|
13 | 18 | AbilRow = namedtuple('AbilRow',['id','type','title'])
|
14 | 19 |
|
|
121 | 126 | 'ultraliskcavern':[200,200,0],
|
122 | 127 | }}
|
123 | 128 |
|
| 129 | +# There are known to be duplicate ability names now. Hrm |
| 130 | +train_commands = { |
| 131 | + 'RavenBuildPointDefenseDrone': 'PointDefenseDrone', |
| 132 | + 'CalldownMULE': 'MULE', |
| 133 | + 'BuildCommandCenter': 'CommandCenter', |
| 134 | + 'BuildSupplyDepot': 'SupplyDepot', |
| 135 | + 'BuildRefinery': 'Refinery', |
| 136 | + 'BuildBarracks': 'Barracks', |
| 137 | + 'BuildEngineeringBay': 'EngineeringBay', |
| 138 | + 'BuildMissileTurret': 'MissileTurret', |
| 139 | + 'BuildBunker': 'Bunker', |
| 140 | + 'BuildSensorTower': 'SensorTower', |
| 141 | + 'BuildGhostAcademy': 'GhostAcademy', |
| 142 | + 'BuildFactory': 'Factory', |
| 143 | + 'BuildStarport': 'Starport', |
| 144 | + 'BuildArmory': 'Armory', |
| 145 | + 'BuildFusionCore': 'FusionCore', |
| 146 | + 'RavenBuildAutoTurret': 'AutoTurret', |
| 147 | + 'TrainSCV': 'SCV', |
| 148 | + 'TrainMarine': 'Marine', |
| 149 | + 'TrainReaper': 'Reaper', |
| 150 | + 'TrainGhost': 'Ghost', |
| 151 | + 'TrainMarauder': 'Marauder', |
| 152 | + 'TrainSiegeTank': 'SiegeTank', |
| 153 | + 'TrainThor': 'Thor', |
| 154 | + 'TrainHellion': 'Hellion', |
| 155 | + 'TrainMedivac': 'Medivac', |
| 156 | + 'TrainBanshee': 'Banshee', |
| 157 | + 'TrainRaven': 'Raven', |
| 158 | + 'TrainBattlecruiser': 'Battlecruiser', |
| 159 | + 'TrainViking': 'VikingFighter', |
| 160 | + 'MorphToPlanetaryFortress': 'PlanetaryFortress', |
| 161 | + 'MorphToOrbitalCommand': 'OrbitalCommand', |
| 162 | + |
| 163 | + 'TrainMothership': 'Mothership', |
| 164 | + 'BuildNexus': 'Nexus', |
| 165 | + 'BuildPylon': 'Pylon', |
| 166 | + 'BuildAssimilator': 'Assimilator', |
| 167 | + 'BuildGateway': 'Gateway', |
| 168 | + 'BuildForge': 'Forge', |
| 169 | + 'BuildFleetBeacon': 'FleetBeacon', |
| 170 | + 'BuildTwilightCouncil': 'TwilightCouncil', |
| 171 | + 'BuildPhotonCannon': 'PhotonCannon', |
| 172 | + 'BuildStargate': 'Stargate', |
| 173 | + 'BuildTemplarArchive': 'TemplarArchive', |
| 174 | + 'BuildDarkShrine': 'DarkShrine', |
| 175 | + 'BuildRoboticsBay': 'RoboticsBay', |
| 176 | + 'BuildRoboticsFacility': 'RoboticsFacility', |
| 177 | + 'BuildCyberneticsCore': 'CyberneticsCore', |
| 178 | + 'TrainZealot': 'Zealot', |
| 179 | + 'TrainStalker': 'Stalker', |
| 180 | + 'TrainHighTemplar': 'HighTemplar', |
| 181 | + 'TrainDarkTemplar': 'DarkTemplar', |
| 182 | + 'TrainSentry': 'Sentry', |
| 183 | + 'TrainPhoenix': 'Phoenix', |
| 184 | + 'TrainCarrier': 'Carrier', |
| 185 | + 'TrainVoidRay': 'VoidRay', |
| 186 | + 'TrainWarpPrism': 'WarpPrism', |
| 187 | + 'TrainObserver': 'Observer', |
| 188 | + 'TrainColossus': 'Colossus', |
| 189 | + 'TrainImmortal': 'Immortal', |
| 190 | + 'TrainProbe': 'Probe', |
| 191 | + 'ArmInterceptor': 'Interceptor', |
| 192 | + 'WarpInZealot': 'Zealot', |
| 193 | + 'WarpInStalker': 'Stalker', |
| 194 | + 'WarpInHighTemplar': 'HighTemplar', |
| 195 | + 'WarpInDarkTemplar': 'DarkTemplar', |
| 196 | + 'WarpInSentry': 'Sentry', |
| 197 | + 'MorphToWarpGate': 'WarpGate', |
| 198 | + 'MergeArchon': 'Archon', |
| 199 | + 'SentryHallucinationArchon': 'HallucinatedArchon', |
| 200 | + 'SentryHallucinationColossus': 'HallucinatedColossus', |
| 201 | + 'SentryHallucinationHighTemplar': 'HallucinatedHighTemplar', |
| 202 | + 'SentryHallucinationImmortal': 'HallucinatedImmortal', |
| 203 | + 'SentryHallucinationPhoenix': 'HallucinatedPhoenix', |
| 204 | + 'SentryHallucinationProbe': 'HallucinatedProbe', |
| 205 | + 'SentryHallucinationStalker': 'HallucinatedStalker', |
| 206 | + 'SentryHallucinationVoidRay': 'HallucinatedVoidRay', |
| 207 | + 'SentryHallucinationWarpPrism': 'HallucinatedWarpPrism', |
| 208 | + 'SentryHallucinationZealot': 'HallucinatedZealot', |
| 209 | + #'MorphToGateway': 'Gateway' #not safe for now, double counting |
| 210 | + |
| 211 | + 'MorphToBaneling': 'Baneling', |
| 212 | + 'BuildHatchery': 'Hatchery', |
| 213 | + 'BuildExtractor': 'Extractor', |
| 214 | + 'BuildSpawningPool': 'SpawningPool', |
| 215 | + 'BuildEvolutionChamber': 'EvolutionChamber', |
| 216 | + 'BuildHydraliskDen': 'HydraliskDen', |
| 217 | + 'BuildSpire': 'Spire', |
| 218 | + 'BuildUltraliskCavern': 'UltraliskCavern', |
| 219 | + 'BuildInfestationPit': 'InfestationPit', |
| 220 | + 'BuildNydusNetwork': 'NydusNetwork', |
| 221 | + 'BuildBanelingNest': 'BanelingNest', |
| 222 | + 'BuildRoachWarren': 'RoachWarren', |
| 223 | + 'BuildSpineCrawler': 'SpineCrawler', |
| 224 | + 'BuildSporeCrawler': 'SporeCrawler', |
| 225 | + 'MorphToLair': 'Lair', |
| 226 | + 'MorphToHive': 'Hive', |
| 227 | + 'MorphToGreaterSpire': 'GreaterSpire', |
| 228 | + 'TrainDrone': 'Drone', |
| 229 | + 'TrainZergling': 'Zergling', |
| 230 | + 'TrainOverlord': 'Overlord', |
| 231 | + 'TrainHydralisk': 'Hydralisk', |
| 232 | + 'TrainMutalisk': 'Mutalisk', |
| 233 | + 'TrainUltralisk': 'Ultralisk', |
| 234 | + 'TrainRoach': 'Roach', |
| 235 | + 'TrainInfestor': 'Infestor', |
| 236 | + 'TrainCorruptor': 'Corruptor', |
| 237 | + 'MorphToBroodLord': 'BroodLord', |
| 238 | + 'MorphToOverseer': 'Overseer', |
| 239 | + 'TrainQueen': 'Queen', |
| 240 | + 'QueenBuildCreepTumor': 'CreepTumor', |
| 241 | + 'BuildNydusCanal': 'NydusCanal', |
| 242 | + 'OverseerSpawnChangeling': 'Changeling', |
| 243 | + 'InfestorSpawnInfestedTerran': 'InfestorTerran', |
| 244 | +} |
| 245 | + |
124 | 246 | class Unit(object):
|
125 |
| - def __init__(self, unit_id): |
126 |
| - self.id = unit_id |
| 247 | + def __init__(self, unit_id): |
| 248 | + self.id = unit_id |
127 | 249 |
|
128 | 250 | class Ability(object):
|
129 |
| - pass |
| 251 | + pass |
130 | 252 |
|
131 | 253 | def create_build(build):
|
132 |
| - units_file = path.join(BASE_PATH, "{}_{}.csv".format(build,"units")) |
133 |
| - abils_file = path.join(BASE_PATH, "{}_{}.csv".format(build,"abilities")) |
134 |
| - with open(units_file, 'r') as data_file: |
135 |
| - units = dict() |
136 |
| - for row in [UnitRow(*line.strip().split('|')[1:]) for line in data_file]: |
137 |
| - unit_id = int(row.id, 10) << 8 | 1 |
138 |
| - race, minerals, vespene, supply = "Neutral", 0, 0, 0 |
139 |
| - for race in ('Protoss','Terran','Zerg'): |
140 |
| - if row.type.lower() in unit_lookup[race]: |
141 |
| - minerals, vespene, supply = unit_lookup[race][row.type.lower()] |
142 |
| - break |
143 |
| - |
144 |
| - units[unit_id] = type(row.title,(Unit,), dict( |
145 |
| - type=unit_id, |
146 |
| - name=row.title, |
147 |
| - title=row.title, |
148 |
| - race=race, |
149 |
| - minerals=minerals, |
150 |
| - vespene=vespene, |
151 |
| - supply=supply, |
152 |
| - )) |
153 |
| - |
154 |
| - |
155 |
| - with open(abils_file, 'r') as data_file: |
156 |
| - abilities = {0:type('RightClick',(Ability,), dict(type=0, name='RightClick', title='Right Click'))} |
157 |
| - for row in [line.strip().split('|') for line in data_file]: |
158 |
| - base = int(row[1],10) << 5 |
159 |
| - real_abils = [(base|i,t) for i,t in enumerate(row[3:]) if t!=''] |
160 |
| - for abil_id, title in real_abils: |
161 |
| - abilities[abil_id] = type(title,(Ability,), dict( |
162 |
| - type=abil_id, |
163 |
| - name=title, |
164 |
| - title=title, |
165 |
| - )) |
166 |
| - |
167 |
| - # Some abilities have missing entries.. |
168 |
| - if len(real_abils) == 0: |
169 |
| - abilities[base] = type(row[2],(Ability,), dict( |
170 |
| - type=base, |
171 |
| - name=row[2], |
172 |
| - title=row[2], |
173 |
| - )) |
174 |
| - |
175 |
| - return Build(build, units, abilities) |
| 254 | + units_file = path.join(BASE_PATH, "{}_{}.csv".format(build,"units")) |
| 255 | + abils_file = path.join(BASE_PATH, "{}_{}.csv".format(build,"abilities")) |
| 256 | + with open(units_file, 'r') as data_file: |
| 257 | + units = dict() |
| 258 | + for row in [UnitRow(*line.strip().split('|')[1:]) for line in data_file]: |
| 259 | + unit_id = int(row.id, 10) << 8 | 1 |
| 260 | + race, minerals, vespene, supply = "Neutral", 0, 0, 0 |
| 261 | + for race in ('Protoss','Terran','Zerg'): |
| 262 | + if row.type.lower() in unit_lookup[race]: |
| 263 | + minerals, vespene, supply = unit_lookup[race][row.type.lower()] |
| 264 | + break |
| 265 | + |
| 266 | + units[unit_id] = type(row.title,(Unit,), dict( |
| 267 | + type=unit_id, |
| 268 | + name=row.title, |
| 269 | + title=row.title, |
| 270 | + race=race, |
| 271 | + minerals=minerals, |
| 272 | + vespene=vespene, |
| 273 | + supply=supply, |
| 274 | + )) |
| 275 | + |
| 276 | + if row.title.lower() in ('probe','zealot','stalker','immortal','phoenix','hightemplar','warpprism','archon','colossus','voidray'): |
| 277 | + units[unit_id+1] = type("Hallucinated"+row.title,(Unit,), dict( |
| 278 | + type=unit_id+1, |
| 279 | + name="Hallucinated"+row.title, |
| 280 | + title="Hallucinated"+row.title, |
| 281 | + race=race, |
| 282 | + minerals=0, |
| 283 | + vespene=0, |
| 284 | + supply=0, |
| 285 | + )) |
| 286 | + |
| 287 | + |
| 288 | + with open(abils_file, 'r') as data_file: |
| 289 | + abilities = {0:type('RightClick',(Ability,), dict(type=0, name='RightClick', title='Right Click'))} |
| 290 | + for row in [line.strip().split('|') for line in data_file]: |
| 291 | + base = int(row[1],10) << 5 |
| 292 | + if base == 0: continue |
| 293 | + |
| 294 | + # Temporary Hack here. |
| 295 | + if base == 0xe80: |
| 296 | + real_abils = [(0xe80,"QueueCancel0"), (0xe81,"QueueCancel1")] |
| 297 | + else: |
| 298 | + real_abils = [(base|i,t) for i,t in enumerate(row[3:]) if t.strip()!=''] |
| 299 | + |
| 300 | + for abil_id, title in real_abils: |
| 301 | + abilities[abil_id] = type(title,(Ability,), dict( |
| 302 | + type=abil_id, |
| 303 | + name=title, |
| 304 | + title=title, |
| 305 | + )) |
| 306 | + |
| 307 | + |
| 308 | + # Some abilities have missing entries.. |
| 309 | + if len(real_abils) == 0: |
| 310 | + abilities[base] = type(row[2],(Ability,), dict( |
| 311 | + type=base, |
| 312 | + name=row[2], |
| 313 | + title=row[2], |
| 314 | + )) |
| 315 | + |
| 316 | + if int(row[1],10) == 249 and build==22612: |
| 317 | + pass |
| 318 | + #print row |
| 319 | + #print abilities[0x1f20], abilities[0x1f21], abilities[0x1f22], abilities[0x1f23] |
| 320 | + |
| 321 | + data = Build(build, units, abilities) |
| 322 | + for unit in units.values(): |
| 323 | + setattr(data, unit.name, unit) |
| 324 | + for ability in abilities.values(): |
| 325 | + if ability.name in train_commands: |
| 326 | + ability.is_build = True |
| 327 | + ability.build_unit = getattr(data,train_commands[ability.name]) |
| 328 | + setattr(data, ability.name, ability) |
| 329 | + |
| 330 | + return data |
| 331 | + |
176 | 332 |
|
177 | 333 | build16117 = create_build(16117)
|
178 | 334 | build17811 = create_build(17811)
|
|
0 commit comments