ProtoBot
Loading...
Searching...
No Matches
InformationManager Class Reference

Public Member Functions

void SetCommander (ProtoBotCommander *commander)
 InformationManager (ProtoBotCommander *commanderReference)
void onStart ()
void onFrame ()
void onUnitCreate (BWAPI::Unit unit)
void onUnitComplete (BWAPI::Unit unit)
void onUnitMorph (BWAPI::Unit unit)
void onUnitDestroy (BWAPI::Unit unit)
double evaluateGameState () const
const std::set< BWAPI::Unit > & getKnownEnemies () const
const std::map< BWAPI::Unit, EnemyBuildingInfo > & getKnownEnemyBuildings () const
const std::map< int, TrackedEnemy > & getTrackedEnemies () const
FriendlyUnitCounter getFriendlyUnitCounter () const
FriendlyBuildingCounter getFriendlyBuildingCounter () const
FriendlyTechCounter getFriendlyTechCounter () const
FriendlyUpgradeCounter getFriendlyUpgradeCounter () const
std::vector< const BWEM::Base * > FindUnownedBases () const
std::vector< const BWEM::Base * > FindPlayerOwnedBases () const
std::vector< const BWEM::Base * > FindEnemyOwnedBases () const
bool enemyHasAirTech () const
bool enemyHasCloakTech () const
void printKnownEnemies () const
void printKnownEnemyBuildings () const
void printEnemyBuildingCounter () const
void updateEnemyBuildingCounter ()
void printEnemyResearch () const
void printEnemyUpgrades () const
void printTrackedEnemies () const
void printFriendlyUnit ()
void printFriendlyBuilding ()
void printFriendlyResearch ()
void printFriendlyUpgrades ()
std::vector< const BWEM::Base * > GetPlayerBases () const
std::vector< const BWEM::Base * > GetEnemyBases () const
std::vector< const BWEM::Base * > GetNearestUnownedBases (const BWAPI::Position &from, int count=3) const
std::vector< const BWEM::Base * > FindNewBases (int count=3) const
void TestPrintBaseOwnership () const
void TestDrawBaseOwnership () const
int getEnemyGroundThreatAt (BWAPI::Position p) const
int getEnemyDetectionAt (BWAPI::Position p) const
ThreatQueryResult queryThreatAt (const BWAPI::Position &pos) const
bool isEnemyEarlyPush () const

Static Public Member Functions

static InformationManagerInstance ()

Public Attributes

ProtoBotCommandercommanderReference
std::vector< BWAPI::Position > EnemyBaseLocations

Private Member Functions

void incrementFriendlyUnit (FriendlyUnitCounter &counter, BWAPI::UnitType type)
void incrementFriendlyBuilding (FriendlyBuildingCounter &counter, BWAPI::UnitType type)
void decrementFriendlyUnit (FriendlyUnitCounter &counter, BWAPI::UnitType type)
void decrementFriendlyBuilding (FriendlyBuildingCounter &counter, BWAPI::UnitType type)
void checkResearch ()
void checkUpgrades ()
void checkEnemyResearch ()
void checkEnemyUpgrades ()

Private Attributes

std::set< BWAPI::Unit > _knownEnemies
std::map< BWAPI::Unit, EnemyBuildingInfo_knownEnemyBuildings
std::map< int, TrackedEnemytrackedEnemies
InfluenceMap influenceMap
ThreatGrid threatGrid
Playstyle playstyle = Playstyle::None
double gameState
FriendlyUnitCounter friendlyUnitCounter
FriendlyBuildingCounter friendlyBuildingCounter
FriendlyTechCounter friendlyTechCounter
FriendlyUpgradeCounter friendlyUpgradeCounter
EnemyBuildingCounter enemyBuildingCounter
EnemyTechCounter enemyTechCounter
EnemyUpgradeCounter enemyUpgradeCounter

Detailed Description

Definition at line 260 of file InformationManager.h.

Constructor & Destructor Documentation

◆ InformationManager()

InformationManager::InformationManager ( )

Definition at line 7 of file InformationManager.cpp.

7 : commanderReference(nullptr)
8{
9}

Member Function Documentation

◆ checkEnemyResearch()

void InformationManager::checkEnemyResearch ( )
private

Definition at line 1347 of file InformationManager.cpp.

1348{
1349 BWAPI::Player enemy = BWAPI::Broodwar->enemy();
1350 if (!enemy) return;
1351
1352 // Terran
1353 enemyTechCounter.stimPacks = enemy->hasResearched(BWAPI::TechTypes::Stim_Packs);
1354 enemyTechCounter.lockdown = enemy->hasResearched(BWAPI::TechTypes::Lockdown);
1355 enemyTechCounter.EMPShockwave = enemy->hasResearched(BWAPI::TechTypes::EMP_Shockwave);
1356 enemyTechCounter.spiderMines = enemy->hasResearched(BWAPI::TechTypes::Spider_Mines);
1357 enemyTechCounter.scannerSweep = enemy->hasResearched(BWAPI::TechTypes::Scanner_Sweep);
1358 enemyTechCounter.tankSiegeMode = enemy->hasResearched(BWAPI::TechTypes::Tank_Siege_Mode);
1359 enemyTechCounter.defensiveMatrix = enemy->hasResearched(BWAPI::TechTypes::Defensive_Matrix);
1360 enemyTechCounter.irradiate = enemy->hasResearched(BWAPI::TechTypes::Irradiate);
1361 enemyTechCounter.yamatoGun = enemy->hasResearched(BWAPI::TechTypes::Yamato_Gun);
1362 enemyTechCounter.cloakingField = enemy->hasResearched(BWAPI::TechTypes::Cloaking_Field);
1363 enemyTechCounter.personnelCloaking = enemy->hasResearched(BWAPI::TechTypes::Personnel_Cloaking);
1364 enemyTechCounter.restoration = enemy->hasResearched(BWAPI::TechTypes::Restoration);
1365 enemyTechCounter.opticalFlare = enemy->hasResearched(BWAPI::TechTypes::Optical_Flare);
1366 enemyTechCounter.healing = enemy->hasResearched(BWAPI::TechTypes::Healing);
1367 enemyTechCounter.nuclearStrike = enemy->hasResearched(BWAPI::TechTypes::Nuclear_Strike);
1368
1369 // Zerg
1370 enemyTechCounter.burrowing = enemy->hasResearched(BWAPI::TechTypes::Burrowing);
1371 enemyTechCounter.infestation = enemy->hasResearched(BWAPI::TechTypes::Infestation);
1372 enemyTechCounter.spawnBroodlings = enemy->hasResearched(BWAPI::TechTypes::Spawn_Broodlings);
1373 enemyTechCounter.darkSwarm = enemy->hasResearched(BWAPI::TechTypes::Dark_Swarm);
1374 enemyTechCounter.plague = enemy->hasResearched(BWAPI::TechTypes::Plague);
1375 enemyTechCounter.consume = enemy->hasResearched(BWAPI::TechTypes::Consume);
1376 enemyTechCounter.ensnare = enemy->hasResearched(BWAPI::TechTypes::Ensnare);
1377 enemyTechCounter.parasite = enemy->hasResearched(BWAPI::TechTypes::Parasite);
1378 enemyTechCounter.lurkerAspect = enemy->hasResearched(BWAPI::TechTypes::Lurker_Aspect);
1379
1380 // Protoss
1381 enemyTechCounter.disruptionWeb = enemy->hasResearched(BWAPI::TechTypes::Disruption_Web);
1382 enemyTechCounter.psionicStorm = enemy->hasResearched(BWAPI::TechTypes::Psionic_Storm);
1383 enemyTechCounter.hallucination = enemy->hasResearched(BWAPI::TechTypes::Hallucination);
1384 enemyTechCounter.maelstrom = enemy->hasResearched(BWAPI::TechTypes::Maelstrom);
1385 enemyTechCounter.mindControl = enemy->hasResearched(BWAPI::TechTypes::Mind_Control);
1386 enemyTechCounter.stasisField = enemy->hasResearched(BWAPI::TechTypes::Stasis_Field);
1387 enemyTechCounter.recall = enemy->hasResearched(BWAPI::TechTypes::Recall);
1388 enemyTechCounter.feedback = enemy->hasResearched(BWAPI::TechTypes::Feedback);
1389 enemyTechCounter.archonWarp = enemy->hasResearched(BWAPI::TechTypes::Archon_Warp);
1390 enemyTechCounter.darkArchonMeld = enemy->hasResearched(BWAPI::TechTypes::Dark_Archon_Meld);
1391}

◆ checkEnemyUpgrades()

void InformationManager::checkEnemyUpgrades ( )
private

Definition at line 1393 of file InformationManager.cpp.

1394{
1395 BWAPI::Player enemy = BWAPI::Broodwar->enemy();
1396 if (!enemy) return;
1397
1398 // Terran
1399 enemyUpgradeCounter.infantryArmor = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Terran_Infantry_Armor);
1400 enemyUpgradeCounter.infantryWeapons = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Terran_Infantry_Weapons);
1401 enemyUpgradeCounter.vehicleArmor = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Terran_Vehicle_Plating);
1402 enemyUpgradeCounter.vehicleWeapons = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Terran_Vehicle_Weapons);
1403 enemyUpgradeCounter.shipArmor = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Terran_Ship_Plating);
1404 enemyUpgradeCounter.shipWeapons = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Terran_Ship_Weapons);
1405 enemyUpgradeCounter.U238Shells = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::U_238_Shells) > 0;
1406 enemyUpgradeCounter.ionThrusters = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Ion_Thrusters) > 0;
1407 enemyUpgradeCounter.titanReactor = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Titan_Reactor) > 0;
1408 enemyUpgradeCounter.ocularImplants = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Ocular_Implants) > 0;
1409 enemyUpgradeCounter.MoebiusReactor = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Moebius_Reactor) > 0;
1410 enemyUpgradeCounter.apolloReactor = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Apollo_Reactor) > 0;
1411 enemyUpgradeCounter.colossusReactor = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Colossus_Reactor) > 0;
1412 enemyUpgradeCounter.caduceusReactor = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Caduceus_Reactor) > 0;
1413 enemyUpgradeCounter.charonBoosters = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Charon_Boosters) > 0;
1414
1415 // Zerg
1416 enemyUpgradeCounter.zergCarapace = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Zerg_Carapace);
1417 enemyUpgradeCounter.zergMeleeAttacks = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Zerg_Melee_Attacks);
1418 enemyUpgradeCounter.zergMissileAttacks = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Zerg_Missile_Attacks);
1419 enemyUpgradeCounter.zergFlyerAttacks = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Zerg_Flyer_Attacks);
1420 enemyUpgradeCounter.zergFlyerCarapace = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Zerg_Flyer_Carapace);
1421 enemyUpgradeCounter.ventralSacs = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Ventral_Sacs) > 0;
1422 enemyUpgradeCounter.antennae = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Antennae) > 0;
1423 enemyUpgradeCounter.pneumatizedCarapace = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Pneumatized_Carapace) > 0;
1424 enemyUpgradeCounter.metabolicBoost = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Metabolic_Boost) > 0;
1425 enemyUpgradeCounter.adrenalGlands = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Adrenal_Glands) > 0;
1426 enemyUpgradeCounter.muscularAugments = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Muscular_Augments) > 0;
1427 enemyUpgradeCounter.grooveSpines = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Grooved_Spines) > 0;
1428 enemyUpgradeCounter.gameteMeiosis = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Gamete_Meiosis) > 0;
1429 enemyUpgradeCounter.metasynapticNodes = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Metasynaptic_Node) > 0;
1430 enemyUpgradeCounter.chitinousPlating = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Chitinous_Plating) > 0;
1431 enemyUpgradeCounter.anabolicSynthesis = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Anabolic_Synthesis) > 0;
1432
1433 // Protoss
1434 enemyUpgradeCounter.airArmor = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Air_Armor);
1435 enemyUpgradeCounter.airWeapons = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Air_Weapons);
1436 enemyUpgradeCounter.groundArmor = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Ground_Armor);
1437 enemyUpgradeCounter.groundWeapons = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Ground_Weapons);
1438 enemyUpgradeCounter.plasmaShields = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Plasma_Shields);
1439 enemyUpgradeCounter.singularityCharge = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Singularity_Charge) > 0;
1440 enemyUpgradeCounter.legEnhancements = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Leg_Enhancements) > 0;
1441 enemyUpgradeCounter.scarabDamage = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Scarab_Damage) > 0;
1442 enemyUpgradeCounter.reaverCapacity = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Reaver_Capacity) > 0;
1443 enemyUpgradeCounter.graviticDrive = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Gravitic_Drive) > 0;
1444 enemyUpgradeCounter.sensorArray = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Sensor_Array) > 0;
1445 enemyUpgradeCounter.graviticBoosters = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Gravitic_Boosters) > 0;
1446 enemyUpgradeCounter.khaydarinAmulet = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Khaydarin_Amulet) > 0;
1447 enemyUpgradeCounter.apialSensors = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Apial_Sensors) > 0;
1448 enemyUpgradeCounter.graviticThrusters = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Gravitic_Thrusters) > 0;
1449 enemyUpgradeCounter.carrierCapacity = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Carrier_Capacity) > 0;
1450 enemyUpgradeCounter.khaydarinCore = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Khaydarin_Core) > 0;
1451 enemyUpgradeCounter.argusJewel = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Argus_Jewel) > 0;
1452 enemyUpgradeCounter.argusTalisman = enemy->getUpgradeLevel(BWAPI::UpgradeTypes::Argus_Talisman) > 0;
1453}

◆ checkResearch()

void InformationManager::checkResearch ( )
private

Definition at line 452 of file InformationManager.cpp.

453{
454 if (BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Disruption_Web))
455 {
456 friendlyTechCounter.disruptionWeb = true;
457 }
458 if (BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Psionic_Storm))
459 {
460 friendlyTechCounter.psionicStorm = true;
461 }
462 if (BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Hallucination))
463 {
464 friendlyTechCounter.hallucination = true;
465 }
466 if (BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Maelstrom))
467 {
468 friendlyTechCounter.maelstrom = true;
469 }
470 if (BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Mind_Control))
471 {
472 friendlyTechCounter.mindControl = true;
473 }
474 if (BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Stasis_Field))
475 {
476 friendlyTechCounter.stasisField = true;
477 }
478 if (BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Recall))
479 {
480 friendlyTechCounter.recall = true;
481 }
482 if (BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Archon_Warp))
483 {
484 friendlyTechCounter.archonWarp = true;
485 }
486 if (BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Dark_Archon_Meld))
487 {
488 friendlyTechCounter.darkArchonMeld = true;
489 }
490 if (BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Feedback))
491 {
492 friendlyTechCounter.feedback = true;
493 }
494}

◆ checkUpgrades()

void InformationManager::checkUpgrades ( )
private

Definition at line 496 of file InformationManager.cpp.

497{
498 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Ground_Weapons) > friendlyUpgradeCounter.groundWeapons)
499 {
500 friendlyUpgradeCounter.groundWeapons = BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Ground_Weapons);
501 }
502 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Ground_Armor) > friendlyUpgradeCounter.groundArmor)
503 {
504 friendlyUpgradeCounter.groundArmor = BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Ground_Armor);
505 }
506 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Air_Weapons) > friendlyUpgradeCounter.airWeapons)
507 {
508 friendlyUpgradeCounter.airWeapons = BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Air_Weapons);
509 }
510 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Air_Armor) > friendlyUpgradeCounter.airArmor)
511 {
512 friendlyUpgradeCounter.airArmor = BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Air_Armor);
513 }
514 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Plasma_Shields) > friendlyUpgradeCounter.plasmaShields)
515 {
516 friendlyUpgradeCounter.plasmaShields = BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Protoss_Plasma_Shields);
517 }
518 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Singularity_Charge) > 0)
519 {
520 friendlyUpgradeCounter.singularityCharge = true;
521 }
522 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Leg_Enhancements) > 0)
523 {
524 friendlyUpgradeCounter.legEnhancements = true;
525 }
526 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Scarab_Damage) > 0)
527 {
528 friendlyUpgradeCounter.scarabDamage = true;
529 }
530 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Reaver_Capacity) > 0)
531 {
532 friendlyUpgradeCounter.reaverCapacity = true;
533 }
534 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Gravitic_Drive) > 0)
535 {
536 friendlyUpgradeCounter.graviticDrive = true;
537 }
538 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Sensor_Array) > 0)
539 {
540 friendlyUpgradeCounter.sensorArray = true;
541 }
542 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Gravitic_Boosters) > 0)
543 {
544 friendlyUpgradeCounter.graviticBoosters = true;
545 }
546 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Khaydarin_Amulet) > 0)
547 {
548 friendlyUpgradeCounter.khaydarinAmulet = true;
549 }
550 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Apial_Sensors) > 0)
551 {
552 friendlyUpgradeCounter.apialSensors = true;
553 }
554 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Gravitic_Thrusters) > 0)
555 {
556 friendlyUpgradeCounter.graviticThrusters = true;
557 }
558 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Carrier_Capacity) > 0)
559 {
560 friendlyUpgradeCounter.carrierCapacity = true;
561 }
562 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Khaydarin_Core) > 0)
563 {
564 friendlyUpgradeCounter.khaydarinCore = true;
565 }
566 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Argus_Jewel) > 0)
567 {
568 friendlyUpgradeCounter.argusJewel = true;
569 }
570 if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Argus_Talisman) > 0)
571 {
572 friendlyUpgradeCounter.argusTalisman = true;
573 }
574}

◆ decrementFriendlyBuilding()

void InformationManager::decrementFriendlyBuilding ( FriendlyBuildingCounter & counter,
BWAPI::UnitType type )
private

Definition at line 633 of file InformationManager.cpp.

634{
635 if (type == BWAPI::UnitTypes::Enum::Protoss_Arbiter_Tribunal) counter.arbiterTribunal--;
636 else if (type == BWAPI::UnitTypes::Enum::Protoss_Citadel_of_Adun) counter.citadelOfAdun--;
637 else if (type == BWAPI::UnitTypes::Enum::Protoss_Cybernetics_Core) counter.cyberneticsCore--;
638 else if (type == BWAPI::UnitTypes::Enum::Protoss_Fleet_Beacon) counter.fleetBeacon--;
639 else if (type == BWAPI::UnitTypes::Enum::Protoss_Forge) counter.forge--;
640 else if (type == BWAPI::UnitTypes::Enum::Protoss_Gateway) counter.gateway--;
641 else if (type == BWAPI::UnitTypes::Enum::Protoss_Nexus) counter.nexus--;
642 else if (type == BWAPI::UnitTypes::Enum::Protoss_Observatory) counter.observatory--;
643 else if (type == BWAPI::UnitTypes::Enum::Protoss_Photon_Cannon) counter.photonCannon--;
644 else if (type == BWAPI::UnitTypes::Enum::Protoss_Pylon) counter.pylon--;
645 else if (type == BWAPI::UnitTypes::Enum::Protoss_Robotics_Facility) counter.roboticsFacility--;
646 else if (type == BWAPI::UnitTypes::Enum::Protoss_Robotics_Support_Bay) counter.roboticsSupportBay--;
647 else if (type == BWAPI::UnitTypes::Enum::Protoss_Shield_Battery) counter.shieldBattery--;
648 else if (type == BWAPI::UnitTypes::Enum::Protoss_Stargate) counter.stargate--;
649 else if (type == BWAPI::UnitTypes::Enum::Protoss_Templar_Archives) counter.templarArchives--;
650}

◆ decrementFriendlyUnit()

void InformationManager::decrementFriendlyUnit ( FriendlyUnitCounter & counter,
BWAPI::UnitType type )
private

Definition at line 614 of file InformationManager.cpp.

615{
616 if (type == BWAPI::UnitTypes::Enum::Protoss_Arbiter) counter.arbiter--;
617 else if (type == BWAPI::UnitTypes::Enum::Protoss_Archon) counter.archon--;
618 else if (type == BWAPI::UnitTypes::Enum::Protoss_Carrier) counter.carrier--;
619 else if (type == BWAPI::UnitTypes::Enum::Protoss_Corsair) counter.corsair--;
620 else if (type == BWAPI::UnitTypes::Enum::Protoss_Dark_Archon) counter.darkArchon--;
621 else if (type == BWAPI::UnitTypes::Enum::Protoss_Dark_Templar) counter.darkTemplar--;
622 else if (type == BWAPI::UnitTypes::Enum::Protoss_Dragoon) counter.dragoon--;
623 else if (type == BWAPI::UnitTypes::Enum::Protoss_High_Templar) counter.highTemplar--;
624 else if (type == BWAPI::UnitTypes::Enum::Protoss_Interceptor) counter.interceptor--;
625 else if (type == BWAPI::UnitTypes::Enum::Protoss_Observer) counter.observer--;
626 else if (type == BWAPI::UnitTypes::Enum::Protoss_Probe) counter.probe--;
627 else if (type == BWAPI::UnitTypes::Enum::Protoss_Reaver) counter.reaver--;
628 else if (type == BWAPI::UnitTypes::Enum::Protoss_Scout) counter.scout--;
629 else if (type == BWAPI::UnitTypes::Enum::Protoss_Shuttle) counter.shuttle--;
630 else if (type == BWAPI::UnitTypes::Enum::Protoss_Zealot) counter.zealot--;
631}

◆ enemyHasAirTech()

bool InformationManager::enemyHasAirTech ( ) const

Definition at line 1475 of file InformationManager.cpp.

1476{
1477 // Check obvious upgrade indicators
1478 if (enemyUpgradeCounter.airWeapons > 0) return true;
1479 if (enemyUpgradeCounter.airArmor > 0) return true;
1480 if (enemyUpgradeCounter.shipWeapons > 0) return true;
1481 if (enemyUpgradeCounter.shipArmor > 0) return true;
1482 if (enemyUpgradeCounter.zergFlyerAttacks > 0) return true;
1483 if (enemyUpgradeCounter.zergFlyerCarapace > 0) return true;
1484
1485 // Check known enemy buildings that enable air tech
1486 for (const auto& kv : _knownEnemyBuildings)
1487 {
1488 const BWAPI::UnitType& t = kv.second.type;
1489 if (!t.isValid()) continue;
1490 if (t == BWAPI::UnitTypes::Protoss_Stargate
1491 || t == BWAPI::UnitTypes::Protoss_Fleet_Beacon
1492 || t == BWAPI::UnitTypes::Zerg_Spire
1493 || t == BWAPI::UnitTypes::Zerg_Greater_Spire
1494 || t == BWAPI::UnitTypes::Terran_Starport)
1495 {
1496 return true;
1497 }
1498 }
1499
1500 // Check observed enemy units that are air-capable
1501 for (auto u : _knownEnemies)
1502 {
1503 if (!u || !u->exists()) continue;
1504 BWAPI::UnitType ut = u->getType();
1505 if (ut == BWAPI::UnitTypes::Protoss_Carrier) return true;
1506 if (ut == BWAPI::UnitTypes::Protoss_Scout) return true;
1507 if (ut == BWAPI::UnitTypes::Protoss_Corsair) return true;
1508 if (ut == BWAPI::UnitTypes::Terran_Battlecruiser) return true;
1509 if (ut == BWAPI::UnitTypes::Terran_Wraith) return true;
1510 if (ut == BWAPI::UnitTypes::Terran_Valkyrie) return true;
1511 if (ut == BWAPI::UnitTypes::Zerg_Mutalisk) return true;
1512 if (ut == BWAPI::UnitTypes::Zerg_Guardian) return true;
1513 if (ut == BWAPI::UnitTypes::Zerg_Scourge) return true;
1514 }
1515
1516 return false;
1517}

◆ enemyHasCloakTech()

bool InformationManager::enemyHasCloakTech ( ) const

Definition at line 1519 of file InformationManager.cpp.

1520{
1521 // Cloak tech can be inferred from researched techs (Cloaking Field, Personnel Cloaking)
1522 if (enemyTechCounter.cloakingField || enemyTechCounter.personnelCloaking) return true;
1523
1524 // Also some units/buildings indicate cloak: Dark Archon/Observatory? Observatories enable observers
1525 for (const auto& kv : _knownEnemyBuildings)
1526 {
1527 const BWAPI::UnitType& t = kv.second.type;
1528 if (!t.isValid()) continue;
1529 if (t == BWAPI::UnitTypes::Protoss_Observatory || t == BWAPI::UnitTypes::Terran_Science_Facility)
1530 return true;
1531 }
1532
1533 // Check known enemy units for cloaking-capable types (e.g., Dark Templar, Ghost, Wraith, Lurker?)
1534 for (auto u : _knownEnemies)
1535 {
1536 if (!u || !u->exists()) continue;
1537 BWAPI::UnitType ut = u->getType();
1538 if (ut == BWAPI::UnitTypes::Protoss_Dark_Templar) return true;
1539 if (ut == BWAPI::UnitTypes::Terran_Ghost) return true;
1540 if (ut == BWAPI::UnitTypes::Terran_Wraith) return true;
1541 if (ut == BWAPI::UnitTypes::Zerg_Lurker) return true;
1542 }
1543
1544 return false;
1545}

◆ evaluateGameState()

double InformationManager::evaluateGameState ( ) const

Definition at line 870 of file InformationManager.cpp.

871{
872 // Make local snapshots to avoid iterating containers that might be mutated elsewhere.
873 std::vector<BWAPI::Unit> myUnits;
874 for (auto u : BWAPI::Broodwar->self()->getUnits())
875 if (u && u->exists()) myUnits.push_back(u);
876
877 std::vector<BWAPI::Unit> knownEnemies;
878 knownEnemies.reserve(_knownEnemies.size());
879 for (auto u : _knownEnemies) // copy pointers (safe)
880 if (u && u->exists()) knownEnemies.push_back(u);
881
882 std::vector<EnemyBuildingInfo> knownEnemyBuildings;
883 knownEnemyBuildings.reserve(_knownEnemyBuildings.size());
884 for (auto const& kv : _knownEnemyBuildings)
885 {
886 // kv.first is a BWAPI::Unit (may be invalid), kv.second is info
887 const EnemyBuildingInfo& info = kv.second;
888 if (!info.type.isValid()) continue;
889 if (info.destroyed) continue;
890 knownEnemyBuildings.push_back(info);
891 }
892
893 // helper: unit resource value
894 auto unitValue = [](const BWAPI::UnitType& t) -> int {
895 if (!t.isValid()) return 0;
896 return t.mineralPrice() + t.gasPrice() * 2;
897 };
898
899 // -------- 1) Army strength (very cheap) ----------
900 int myPower = 0;
901 for (auto u : myUnits) myPower += unitValue(u->getType());
902
903 int enemyPower = 0;
904 for (auto u : knownEnemies) enemyPower += unitValue(u->getType());
905
906 double armyScore = 0.0;
907 if (myPower + enemyPower > 0)
908 armyScore = double(myPower - enemyPower) / double(myPower + enemyPower);
909
910 // -------- 2) Worker score (safe) ----------
911 auto safeCountWorkers = [&](BWAPI::Player p) -> int {
912 if (!p) return 0;
913 return p->allUnitCount(BWAPI::UnitTypes::Protoss_Probe)
914 + p->allUnitCount(BWAPI::UnitTypes::Terran_SCV)
915 + p->allUnitCount(BWAPI::UnitTypes::Zerg_Drone);
916 };
917
918 int myWorkers = safeCountWorkers(BWAPI::Broodwar->self());
919 int enemyWorkers = 0;
920 for (auto u : knownEnemies)
921 if (u->getType().isWorker()) ++enemyWorkers;
922
923 double workerScore = 0.0;
924 if (myWorkers + enemyWorkers > 0)
925 workerScore = double(myWorkers - enemyWorkers) / double(myWorkers + enemyWorkers);
926
927 // -------- 3) Economy (bases) ----------
928 auto safeCountBases = [&](BWAPI::Player p)->int {
929 if (!p) return 0;
930 return p->allUnitCount(BWAPI::UnitTypes::Terran_Command_Center)
931 + p->allUnitCount(BWAPI::UnitTypes::Protoss_Nexus)
932 + p->allUnitCount(BWAPI::UnitTypes::Zerg_Hatchery);
933 };
934
935 int myBases = safeCountBases(BWAPI::Broodwar->self());
936 int enemyBases = 0;
937 for (auto& binfo : knownEnemyBuildings)
938 if (binfo.type.isResourceDepot()) ++enemyBases;
939
940 double econScore = 0.0;
941 if (myBases + enemyBases > 0)
942 econScore = double(myBases - enemyBases) / double(myBases + enemyBases);
943
944 // -------- 4) Tech score ----------
945 auto scorePlayerTech = [&](bool ally)->int {
946 int score = 0;
947 if (ally)
948 {
949 for (auto u : myUnits)
950 {
951 auto t = u->getType();
952 if (!t.isValid() || !t.isBuilding()) continue;
953 if (t.gasPrice() > 0) score += 5;
954 }
955 }
956 else
957 {
958 for (auto& b : knownEnemyBuildings)
959 {
960 auto t = b.type;
961 if (!t.isValid()) continue;
962 if (t.gasPrice() > 0) score += 5;
963 }
964 }
965 return score;
966 };
967
968 int myTech = scorePlayerTech(true);
969 int enemyTech = scorePlayerTech(false);
970 double techScore = 0.0;
971 if (myTech + enemyTech > 0)
972 techScore = double(myTech - enemyTech) / double(myTech + enemyTech);
973
974 // -------- 5) Map Control (Grid Sampling, extremely cheap) ----------
975 long long allyInf = 0, enemyInf = 0;
976 const int w = influenceMap.getWidth();
977 const int h = influenceMap.getHeight();
978
979 if (w > 0 && h > 0)
980 {
981 const int GRID = 12; // 12x12 grid ¨ 144 samples. Very cheap.
982
983 for (int gx = 0; gx < GRID; gx++)
984 {
985 for (int gy = 0; gy < GRID; gy++)
986 {
987 // convert grid position ¨ influence map index
988 int x = (gx * w) / GRID;
989 int y = (gy * h) / GRID;
990
991 // safety clamp (just in case of rounding)
992 if (x < 0) x = 0;
993 if (y < 0) y = 0;
994 if (x >= w) x = w - 1;
995 if (y >= h) y = h - 1;
996
997 allyInf += influenceMap.getAllyInfluence(x, y);
998 enemyInf += influenceMap.getEnemyInfluence(x, y);
999 }
1000 }
1001 }
1002
1003 double mapScore = 0.0;
1004 if (allyInf + enemyInf > 0)
1005 mapScore = double(allyInf - enemyInf) / double(allyInf + enemyInf);
1006
1007 // -------- final weighted score ----------
1008 double finalScore = 0.0;
1009 finalScore += armyScore * 0.40;
1010 finalScore += workerScore * 0.15;
1011 finalScore += econScore * 0.20;
1012 finalScore += techScore * 0.10;
1013 finalScore += mapScore * 0.15;
1014
1015 // clamp
1016 if (finalScore > 1.0) finalScore = 1.0;
1017 if (finalScore < -1.0) finalScore = -1.0;
1018 return finalScore;
1019}

◆ FindEnemyOwnedBases()

std::vector< const BWEM::Base * > InformationManager::FindEnemyOwnedBases ( ) const

Definition at line 378 of file InformationManager.cpp.

379{
380 std::vector<const BWEM::Base*> res;
381 const int checkRadius = 96;
382
383 for (const BWEM::Area& area : theMap.Areas())
384 {
385 for (const BWEM::Base& base : area.Bases())
386 {
387 BWAPI::Position baseCenter = base.Center();
388 bool found = false;
389 for (BWAPI::Unit u : BWAPI::Broodwar->getUnitsInRadius(baseCenter, checkRadius))
390 {
391 if (!u) continue;
392 if (u->getType().isResourceDepot() && u->getPlayer() == BWAPI::Broodwar->enemy())
393 {
394 if (baseCenter.getApproxDistance(u->getPosition()) <= checkRadius)
395 {
396 found = true;
397 break;
398 }
399 }
400 }
401 if (found) res.push_back(&base);
402 }
403 }
404 return res;
405}

◆ FindNewBases()

std::vector< const BWEM::Base * > InformationManager::FindNewBases ( int count = 3) const

Definition at line 407 of file InformationManager.cpp.

408{
409 std::vector<const BWEM::Base*> res;
410
411 if (count <= 0) return res;
412
413 // get all unowned bases first
414 std::vector<const BWEM::Base*> unowned = FindUnownedBases();
415 if (unowned.empty()) return res;
416
417 // clamp count to available bases
418 int want = std::min<int>(count, (int)unowned.size());
419
420 // use map center as reference point
421 BWAPI::Position ref = theMap.Center();
422
423 // pair distance -> base
424 std::vector<std::pair<int, const BWEM::Base*>> distList;
425 distList.reserve(unowned.size());
426 for (const BWEM::Base* b : unowned)
427 {
428 if (!b) continue;
429 int d = ref.getApproxDistance(b->Center());
430 distList.emplace_back(d, b);
431 }
432
433 if ((int)distList.size() <= want)
434 {
435 // sort all and return
436 std::sort(distList.begin(), distList.end(), [](auto& a, auto& b) { return a.first < b.first; });
437 }
438 else
439 {
440 // partial selection then sort the selected prefix
441 std::nth_element(distList.begin(), distList.begin() + want, distList.end(),
442 [](auto& a, auto& b) { return a.first < b.first; });
443 distList.resize(want);
444 std::sort(distList.begin(), distList.end(), [](auto& a, auto& b) { return a.first < b.first; });
445 }
446
447 res.reserve(distList.size());
448 for (const auto& p : distList) res.push_back(p.second);
449 return res;
450}

◆ FindPlayerOwnedBases()

std::vector< const BWEM::Base * > InformationManager::FindPlayerOwnedBases ( ) const

Definition at line 349 of file InformationManager.cpp.

350{
351 std::vector<const BWEM::Base*> res;
352 const int checkRadius = 96;
353
354 for (const BWEM::Area& area : theMap.Areas())
355 {
356 for (const BWEM::Base& base : area.Bases())
357 {
358 BWAPI::Position baseCenter = base.Center();
359 bool found = false;
360 for (BWAPI::Unit u : BWAPI::Broodwar->getUnitsInRadius(baseCenter, checkRadius))
361 {
362 if (!u) continue;
363 if (u->getType().isResourceDepot() && u->getPlayer() == BWAPI::Broodwar->self())
364 {
365 if (baseCenter.getApproxDistance(u->getPosition()) <= checkRadius)
366 {
367 found = true;
368 break;
369 }
370 }
371 }
372 if (found) res.push_back(&base);
373 }
374 }
375 return res;
376}

◆ FindUnownedBases()

std::vector< const BWEM::Base * > InformationManager::FindUnownedBases ( ) const

Definition at line 307 of file InformationManager.cpp.

308{
309 std::vector<const BWEM::Base*> res;
310
311 // Safety: require theMap to be initialized (your code already calls Initialize() in onStart).
312 // We consider a base "owned" if any resource-depot (CC / Nexus / Hatchery) or a depot-under-construction
313 // is close to the base center. Otherwise we treat it as unowned.
314 const int checkRadius = 96; // pixels — safe for detecting a town-hall inside/near the base
315
316 for (const BWEM::Area& area : theMap.Areas())
317 {
318 for (const BWEM::Base& base : area.Bases())
319 {
320 bool owned = false;
321 BWAPI::Position baseCenter = base.Center();
322
323 // iterate units in radius around the base center
324 for (BWAPI::Unit u : BWAPI::Broodwar->getUnitsInRadius(baseCenter, checkRadius))
325 {
326 if (!u) continue;
327 // treat any resource depot (completed or under construction) as ownership
328 if (u->getType().isResourceDepot())
329 {
330 // use Position::getApproxDistance for cheaper distance check
331 if (baseCenter.getApproxDistance(u->getPosition()) <= checkRadius)
332 {
333 owned = true;
334 break;
335 }
336 }
337 }
338
339 if (!owned)
340 {
341 res.push_back(&base);
342 }
343 }
344 }
345
346 return res;
347}

◆ GetEnemyBases()

std::vector< const BWEM::Base * > InformationManager::GetEnemyBases ( ) const

Definition at line 1211 of file InformationManager.cpp.

1212{
1213 return FindEnemyOwnedBases();
1214}

◆ getEnemyDetectionAt()

int InformationManager::getEnemyDetectionAt ( BWAPI::Position p) const

Definition at line 1462 of file InformationManager.cpp.

1463{
1464 return threatGrid.detectionAt(p);
1465}

◆ getEnemyGroundThreatAt()

int InformationManager::getEnemyGroundThreatAt ( BWAPI::Position p) const

Definition at line 1457 of file InformationManager.cpp.

1458{
1459 return threatGrid.groundThreatAt(p);
1460}

◆ getFriendlyBuildingCounter()

FriendlyBuildingCounter InformationManager::getFriendlyBuildingCounter ( ) const
inline

Definition at line 325 of file InformationManager.h.

325{ return friendlyBuildingCounter; }

◆ getFriendlyTechCounter()

FriendlyTechCounter InformationManager::getFriendlyTechCounter ( ) const
inline

Definition at line 328 of file InformationManager.h.

328{ return friendlyTechCounter; }

◆ getFriendlyUnitCounter()

FriendlyUnitCounter InformationManager::getFriendlyUnitCounter ( ) const
inline

Definition at line 322 of file InformationManager.h.

322{ return friendlyUnitCounter; }

◆ getFriendlyUpgradeCounter()

FriendlyUpgradeCounter InformationManager::getFriendlyUpgradeCounter ( ) const
inline

Definition at line 331 of file InformationManager.h.

331{ return friendlyUpgradeCounter; }

◆ getKnownEnemies()

const std::set< BWAPI::Unit > & InformationManager::getKnownEnemies ( ) const
inline

Definition at line 313 of file InformationManager.h.

313{ return _knownEnemies; }

◆ getKnownEnemyBuildings()

const std::map< BWAPI::Unit, EnemyBuildingInfo > & InformationManager::getKnownEnemyBuildings ( ) const
inline

Definition at line 316 of file InformationManager.h.

316{ return _knownEnemyBuildings; }

◆ GetNearestUnownedBases()

std::vector< const BWEM::Base * > InformationManager::GetNearestUnownedBases ( const BWAPI::Position & from,
int count = 3 ) const

Definition at line 1217 of file InformationManager.cpp.

1218{
1219 std::vector<const BWEM::Base*> unowned = FindUnownedBases();
1220 if (unowned.empty() || count <= 0) return {};
1221
1222 // Pair each base pointer with its approximate distance to 'from'
1223 std::vector<std::pair<int, const BWEM::Base*>> distList;
1224 distList.reserve(unowned.size());
1225
1226 for (const BWEM::Base* b : unowned)
1227 {
1228 if (!b) continue;
1229 int d = from.getApproxDistance(b->Center());
1230 distList.emplace_back(d, b);
1231 }
1232
1233 // partial sort for efficiency if count is much smaller than total
1234 if ((size_t)count < distList.size())
1235 {
1236 std::nth_element(distList.begin(), distList.begin() + count, distList.end(),
1237 [](auto& a, auto& b) { return a.first < b.first; });
1238 distList.resize(count);
1239 }
1240
1241 std::sort(distList.begin(), distList.end(), [](auto& a, auto& b) { return a.first < b.first; });
1242
1243 std::vector<const BWEM::Base*> res;
1244 res.reserve(distList.size());
1245 for (auto& p : distList) res.push_back(p.second);
1246 return res;
1247}

◆ GetPlayerBases()

std::vector< const BWEM::Base * > InformationManager::GetPlayerBases ( ) const

Definition at line 1205 of file InformationManager.cpp.

1206{
1207 // Reuse the existing scan implementation
1208 return FindPlayerOwnedBases();
1209}

◆ getTrackedEnemies()

const std::map< int, TrackedEnemy > & InformationManager::getTrackedEnemies ( ) const
inline

Definition at line 319 of file InformationManager.h.

319{ return trackedEnemies; }

◆ incrementFriendlyBuilding()

void InformationManager::incrementFriendlyBuilding ( FriendlyBuildingCounter & counter,
BWAPI::UnitType type )
private

Definition at line 595 of file InformationManager.cpp.

596{
597 if (type == BWAPI::UnitTypes::Enum::Protoss_Arbiter_Tribunal) counter.arbiterTribunal++;
598 else if (type == BWAPI::UnitTypes::Enum::Protoss_Citadel_of_Adun) counter.citadelOfAdun++;
599 else if (type == BWAPI::UnitTypes::Enum::Protoss_Cybernetics_Core) counter.cyberneticsCore++;
600 else if (type == BWAPI::UnitTypes::Enum::Protoss_Fleet_Beacon) counter.fleetBeacon++;
601 else if (type == BWAPI::UnitTypes::Enum::Protoss_Forge) counter.forge++;
602 else if (type == BWAPI::UnitTypes::Enum::Protoss_Gateway) counter.gateway++;
603 else if (type == BWAPI::UnitTypes::Enum::Protoss_Nexus) counter.nexus++;
604 else if (type == BWAPI::UnitTypes::Enum::Protoss_Observatory) counter.observatory++;
605 else if (type == BWAPI::UnitTypes::Enum::Protoss_Photon_Cannon) counter.photonCannon++;
606 else if (type == BWAPI::UnitTypes::Enum::Protoss_Pylon) counter.pylon++;
607 else if (type == BWAPI::UnitTypes::Enum::Protoss_Robotics_Facility) counter.roboticsFacility++;
608 else if (type == BWAPI::UnitTypes::Enum::Protoss_Robotics_Support_Bay) counter.roboticsSupportBay++;
609 else if (type == BWAPI::UnitTypes::Enum::Protoss_Shield_Battery) counter.shieldBattery++;
610 else if (type == BWAPI::UnitTypes::Enum::Protoss_Stargate) counter.stargate++;
611 else if (type == BWAPI::UnitTypes::Enum::Protoss_Templar_Archives) counter.templarArchives++;
612}

◆ incrementFriendlyUnit()

void InformationManager::incrementFriendlyUnit ( FriendlyUnitCounter & counter,
BWAPI::UnitType type )
private

Definition at line 576 of file InformationManager.cpp.

577{
578 if (type == BWAPI::UnitTypes::Enum::Protoss_Arbiter) counter.arbiter++;
579 else if (type == BWAPI::UnitTypes::Enum::Protoss_Archon) counter.archon++;
580 else if (type == BWAPI::UnitTypes::Enum::Protoss_Carrier) counter.carrier++;
581 else if (type == BWAPI::UnitTypes::Enum::Protoss_Corsair) counter.corsair++;
582 else if (type == BWAPI::UnitTypes::Enum::Protoss_Dark_Archon) counter.darkArchon++;
583 else if (type == BWAPI::UnitTypes::Enum::Protoss_Dark_Templar) counter.darkTemplar++;
584 else if (type == BWAPI::UnitTypes::Enum::Protoss_Dragoon) counter.dragoon++;
585 else if (type == BWAPI::UnitTypes::Enum::Protoss_High_Templar) counter.highTemplar++;
586 else if (type == BWAPI::UnitTypes::Enum::Protoss_Interceptor) counter.interceptor++;
587 else if (type == BWAPI::UnitTypes::Enum::Protoss_Observer) counter.observer++;
588 else if (type == BWAPI::UnitTypes::Enum::Protoss_Probe) counter.probe++;
589 else if (type == BWAPI::UnitTypes::Enum::Protoss_Reaver) counter.reaver++;
590 else if (type == BWAPI::UnitTypes::Enum::Protoss_Scout) counter.scout++;
591 else if (type == BWAPI::UnitTypes::Enum::Protoss_Shuttle) counter.shuttle++;
592 else if (type == BWAPI::UnitTypes::Enum::Protoss_Zealot) counter.zealot++;
593}

◆ Instance()

InformationManager & InformationManager::Instance ( )
static

Definition at line 11 of file InformationManager.cpp.

12{
13 static InformationManager instance;
14 return instance;
15}

◆ isEnemyEarlyPush()

bool InformationManager::isEnemyEarlyPush ( ) const

Definition at line 1547 of file InformationManager.cpp.

1548{
1549 int frame = BWAPI::Broodwar->getFrameCount();
1550
1551 int totalEnemyUnits = 0;
1552 int enemyCombatUnits = 0;
1553 int enemyZerglings = 0;
1554 int enemyMarines = 0;
1555 int enemyZealots = 0;
1556 int enemyProdBuildings = 0;
1557 int enemyBuildings = 0;
1558
1559 std::vector<BWAPI::Position> ourBases;
1560 for (const BWEM::Base* b : FindPlayerOwnedBases())
1561 {
1562 if (!b) continue;
1563 ourBases.push_back(b->Center());
1564 }
1565 const int nearBaseRadius = 96;
1566 int enemyUnitsNearBase = 0;
1567 int buildingsNearBase = 0;
1568
1569 for (const auto& kv : trackedEnemies)
1570 {
1571 const TrackedEnemy& te = kv.second;
1572 if (te.destroyed) continue;
1573
1574 ++totalEnemyUnits;
1575
1576 BWAPI::UnitType t = te.type;
1577
1578 if (t.isValid() && t.isBuilding())
1579 {
1580 ++enemyBuildings;
1581 // Check if this cannon is near any of our bases
1582 for (const auto& bp : ourBases)
1583 {
1584 if (bp.getApproxDistance(te.lastSeenPos) <= nearBaseRadius)
1585 {
1586 ++buildingsNearBase;
1587 break;
1588 }
1589 }
1590 }
1591
1592 if (t.isValid() && !t.isWorker() && !t.isBuilding()) ++enemyCombatUnits;
1593 if (t == BWAPI::UnitTypes::Zerg_Zergling) ++enemyZerglings;
1594 if (t == BWAPI::UnitTypes::Terran_Marine) ++enemyMarines;
1595 if (t == BWAPI::UnitTypes::Protoss_Zealot) ++enemyZealots;
1596
1597 // proximity check using lastSeenPos
1598 for (const auto& bp : ourBases)
1599 {
1600 if (bp.getApproxDistance(te.lastSeenPos) <= nearBaseRadius)
1601 {
1602 ++enemyUnitsNearBase;
1603 break;
1604 }
1605 }
1606 }
1607
1608 // Count known enemy production buildings using _knownEnemyBuildings
1609 for (const auto& kv : _knownEnemyBuildings)
1610 {
1611 const EnemyBuildingInfo& info = kv.second;
1612 if (info.destroyed) continue;
1613 BWAPI::UnitType t = info.type;
1614 if (!t.isValid()) continue;
1615
1616 if (t == BWAPI::UnitTypes::Terran_Barracks || t == BWAPI::UnitTypes::Terran_Factory || t == BWAPI::UnitTypes::Terran_Starport || t == BWAPI::UnitTypes::Terran_Supply_Depot
1617 || t == BWAPI::UnitTypes::Protoss_Gateway || t == BWAPI::UnitTypes::Protoss_Stargate || t == BWAPI::UnitTypes::Protoss_Robotics_Facility
1618 || t == BWAPI::UnitTypes::Zerg_Hatchery || t == BWAPI::UnitTypes::Zerg_Lair || t == BWAPI::UnitTypes::Zerg_Hive)
1619 {
1620 ++enemyProdBuildings;
1621 }
1622 if (t == BWAPI::UnitTypes::Zerg_Spawning_Pool)
1623 {
1624 enemyProdBuildings += 2;
1625 }
1626 }
1627
1628 if (frame <= 10000)
1629 {
1630 if (enemyUnitsNearBase >= 6) return true;
1631 if (enemyZerglings >= 6) return true;
1632 if (enemyMarines >= 6) return true;
1633 if (enemyZealots >= 6) return true;
1634 if (enemyProdBuildings >= 2) return true;
1635 if (enemyCombatUnits >= 8 && enemyProdBuildings >= 1) return true;
1636 if (buildingsNearBase >= 1) return true;
1637 }
1638
1639 // Fallback: if enemy is pressing bases substantially at any time
1640 if (enemyUnitsNearBase >= 8) return true;
1641
1642 return false;
1643}

◆ onFrame()

void InformationManager::onFrame ( )

Definition at line 56 of file InformationManager.cpp.

57{
58 checkResearch();
59 checkUpgrades();
60 checkEnemyResearch();
61 checkEnemyUpgrades();
62
63 threatGrid.onFrameStart(BWAPI::Broodwar->getFrameCount());
64
65 // Track visible enemies
66 for (auto enemy : BWAPI::Broodwar->enemy()->getUnits())
67 {
68 if (!enemy || !enemy->exists()) continue;
69
70 const int id = enemy->getID();
71
72 TrackedEnemy& entry = trackedEnemies[id];
73 entry.id = id;
74 entry.type = enemy->getType();
75 entry.lastSeenPos = enemy->getPosition();
76 entry.isBuilding = enemy->getType().isBuilding();
77 entry.destroyed = false;
78
79 _knownEnemies.insert(enemy);
80
81 if (enemy->getType().isBuilding())
82 {
83 EnemyBuildingInfo& info = _knownEnemyBuildings[enemy];
84 info.type = enemy->getType();
85 info.lastKnownPosition = enemy->getPosition();
86 info.destroyed = false;
87 }
88
89 const bool completed = enemy->isCompleted();
90 const bool burrowed = enemy->isBurrowed();
91 const bool immobile = enemy->getType().isBuilding();
92
93 threatGrid.addOrUpdateEnemy(id, enemy->getType(), enemy->getPosition(), completed, burrowed, immobile);
94 }
95
96 // Remove destroyed units
97 std::set<BWAPI::Unit> toRemove;
98 for (auto& unit : _knownEnemies)
99 {
100 if (!unit->exists())
101 toRemove.insert(unit);
102 }
103 for (auto& unit : toRemove)
104 _knownEnemies.erase(unit);
105
106 // Update trackedEnemies for non-visible units
107 for (auto& pair : trackedEnemies)
108 {
109 int id = pair.first;
110 TrackedEnemy& entry = pair.second;
111
112 BWAPI::Unit u = BWAPI::Broodwar->getUnit(id);
113
114 bool visible = (u && u->exists() && u->isVisible());
115
116 if (visible)
117 {
118 // Update last seen position
119 entry.lastSeenPos = u->getPosition();
120 }
121 }
122
123
124 // Update building info in fog of war
125 for (auto it = _knownEnemyBuildings.begin(); it != _knownEnemyBuildings.end();)
126 {
127 BWAPI::Unit unit = it->first;
128 EnemyBuildingInfo& info = it->second;
129
130 if (info.destroyed)
131 {
132 it = _knownEnemyBuildings.erase(it);
133 continue;
134 }
135
136 // If still exists and visible, update position
137 if (unit && unit->exists())
138 info.lastKnownPosition = unit->getPosition();
139
140 ++it;
141 }
142
143 updateEnemyBuildingCounter();
144 if (isEnemyEarlyPush())
145 {
146 //cout << "Enemy is playing aggro!" << endl;
147 }
148
149 //TestDrawBaseOwnership();
150 if (BWAPI::Broodwar->getFrameCount() % 120 == 0)
151 {
152 //printFriendlyUnit();
153 //printFriendlyBuilding();
154 //printFriendlyResearch();
155 //printFriendlyUpgrades();
156 //TestPrintBaseOwnership();
157 //printKnownEnemyBuildings();
158 //printEnemyBuildingCounter();
159 //printEnemyResearch();
160 //printEnemyUpgrades();
161 }
162}

◆ onStart()

void InformationManager::onStart ( )

Definition at line 22 of file InformationManager.cpp.

23{
24 _knownEnemies.clear();
25 _knownEnemyBuildings.clear();
26 trackedEnemies.clear();
27
28 //influenceMap.onStart();
29 threatGrid.onStart();
30
31
32 FriendlyUnitCounter newfriendlyUnitCounter;
33 friendlyUnitCounter = newfriendlyUnitCounter;
34
35 FriendlyBuildingCounter newfriendlyBuildingCounter;
36 friendlyBuildingCounter = newfriendlyBuildingCounter;
37
38 FriendlyTechCounter newfriendlyTechCounter;
39 friendlyTechCounter = newfriendlyTechCounter;
40
41 FriendlyUpgradeCounter newfriendlyUpgradeCounter;
42 friendlyUpgradeCounter = newfriendlyUpgradeCounter;
43
44 EnemyBuildingCounter newenemyBuildingCounter;
45 enemyBuildingCounter = newenemyBuildingCounter;
46
47 EnemyTechCounter newenemyTechCounter;
48 enemyTechCounter = newenemyTechCounter;
49
50 EnemyUpgradeCounter newenemyUpgradeCounter;
51 enemyUpgradeCounter = newenemyUpgradeCounter;
52
53 //std::cout << "Information Manager Initialized\n";
54}

◆ onUnitComplete()

void InformationManager::onUnitComplete ( BWAPI::Unit unit)

Definition at line 726 of file InformationManager.cpp.

727{
728 if (unit->getPlayer() != BWAPI::Broodwar->self())
729 return;
730
731 if (unit == nullptr)
732 return;
733
734 incrementFriendlyUnit(friendlyUnitCounter, unit->getType());
735 incrementFriendlyBuilding(friendlyBuildingCounter, unit->getType());
736}

◆ onUnitCreate()

void InformationManager::onUnitCreate ( BWAPI::Unit unit)

Definition at line 717 of file InformationManager.cpp.

718{
719 if (unit->getPlayer() != BWAPI::Broodwar->self())
720 return;
721 if (unit == nullptr)
722 return;
723 // Currently unused
724}

◆ onUnitDestroy()

void InformationManager::onUnitDestroy ( BWAPI::Unit unit)

Definition at line 744 of file InformationManager.cpp.

745{
746 if (!unit) return;
747
748 if (unit->getPlayer() == BWAPI::Broodwar->self())
749 {
750 decrementFriendlyUnit(friendlyUnitCounter, unit->getType());
751 decrementFriendlyBuilding(friendlyBuildingCounter, unit->getType());
752 }
753 else
754 {
755 int id = unit->getID();
756
757 // Mark in trackedEnemies
758 auto it = trackedEnemies.find(id);
759 if (it != trackedEnemies.end())
760 trackedEnemies.erase(it);
761
762 if (unit->getPlayer() == BWAPI::Broodwar->enemy())
763 {
764 // Remove threat from grid
765 threatGrid.removeEnemy(id);
766
767 // Mark destroyed building
768 if (unit->getType().isBuilding())
769 {
770 auto it = _knownEnemyBuildings.find(unit);
771 if (it != _knownEnemyBuildings.end())
772 it->second.destroyed = true;
773 }
774
775 // Remove from knownEnemies
776 _knownEnemies.erase(unit);
777 }
778 }
779}

◆ onUnitMorph()

void InformationManager::onUnitMorph ( BWAPI::Unit unit)

Definition at line 738 of file InformationManager.cpp.

739{
740 if (unit->getType() == BWAPI::UnitTypes::Protoss_Assimilator)
741 friendlyBuildingCounter.assimilator++;
742}

◆ printEnemyBuildingCounter()

void InformationManager::printEnemyBuildingCounter ( ) const

Definition at line 803 of file InformationManager.cpp.

804{
805 std::cout << "Enemy Building Count:\n";
806 std::cout << " - Arbiter Tribunal: " << enemyBuildingCounter.arbiterTribunal << "\n";
807 std::cout << " - Assimilator: " << enemyBuildingCounter.assimilator << "\n";
808 std::cout << " - Citadel Of Adun: " << enemyBuildingCounter.citadelOfAdun << "\n";
809 std::cout << " - Cybernetics Core: " << enemyBuildingCounter.cyberneticsCore << "\n";
810 std::cout << " - Fleet Beacon: " << enemyBuildingCounter.fleetBeacon << "\n";
811 std::cout << " - Forge: " << enemyBuildingCounter.forge << "\n";
812 std::cout << " - Gateway: " << enemyBuildingCounter.gateway << "\n";
813 std::cout << " - Nexus: " << enemyBuildingCounter.nexus << "\n";
814 std::cout << " - Observatory: " << enemyBuildingCounter.observatory << "\n";
815 std::cout << " - Photon Cannon: " << enemyBuildingCounter.photonCannon << "\n";
816 std::cout << " - Pylon: " << enemyBuildingCounter.pylon << "\n";
817 std::cout << " - Robotics Facility: " << enemyBuildingCounter.roboticsFacility << "\n";
818 std::cout << " - Robotics Support Bay: " << enemyBuildingCounter.roboticsSupportBay << "\n";
819 std::cout << " - Shield Battery: " << enemyBuildingCounter.shieldBattery << "\n";
820 std::cout << " - Stargate: " << enemyBuildingCounter.stargate << "\n";
821 std::cout << " - Templar Archives: " << enemyBuildingCounter.templarArchives << "\n";
822 std::cout << " - Terran Academy: " << enemyBuildingCounter.terranAcademy << "\n";
823 std::cout << " - Terran Armory: " << enemyBuildingCounter.terranArmory << "\n";
824 std::cout << " - Terran Barracks: " << enemyBuildingCounter.terranBarracks << "\n";
825 std::cout << " - Terran Bunker: " << enemyBuildingCounter.terranBunker << "\n";
826 std::cout << " - Terran Command Center: " << enemyBuildingCounter.terranCommandCenter << "\n";
827 std::cout << " - Terran Engineering Bay: " << enemyBuildingCounter.terranEngineeringBay << "\n";
828 std::cout << " - Terran Factory: " << enemyBuildingCounter.terranFactory << "\n";
829 std::cout << " - Terran Missile Turret: " << enemyBuildingCounter.terranMissileTurret << "\n";
830 std::cout << " - Terran Refinery: " << enemyBuildingCounter.terranRefinery << "\n";
831 std::cout << " - Terran Science Facility: " << enemyBuildingCounter.terranScienceFacility << "\n";
832 std::cout << " - Terran Starport: " << enemyBuildingCounter.terranStarport << "\n";
833 std::cout << " - Terran Supply Depot: " << enemyBuildingCounter.terranSupplyDepot << "\n";
834 std::cout << " - Zerg Creep Colony: " << enemyBuildingCounter.zergCreepColony << "\n";
835 std::cout << " - Zerg Defiler Mound: " << enemyBuildingCounter.zergDefilerMound << "\n";
836 std::cout << " - Zerg Evolution Chamber: " << enemyBuildingCounter.zergEvolutionChamber << "\n";
837 std::cout << " - Zerg Extractor: " << enemyBuildingCounter.zergExtractor << "\n";
838 std::cout << " - Zerg Greater Spire: " << enemyBuildingCounter.zergGreaterSpire << "\n";
839 std::cout << " - Zerg Hatchery: " << enemyBuildingCounter.zergHatchery << "\n";
840 std::cout << " - Zerg Hive: " << enemyBuildingCounter.zergHive << "\n";
841 std::cout << " - Zerg Hydralisk Den: " << enemyBuildingCounter.zergHydraliskDen << "\n";
842 std::cout << " - Zerg Infested Command Center: " << enemyBuildingCounter.zergInfestedCommandCenter << "\n";
843 std::cout << " - Zerg Lair: " << enemyBuildingCounter.zergLair << "\n";
844 std::cout << " - Zerg Nydus Canal: " << enemyBuildingCounter.zergNydusCanal << "\n";
845 std::cout << " - Zerg Queen's Nest: " << enemyBuildingCounter.zergQueensNest << "\n";
846 std::cout << " - Zerg Spawning Pool: " << enemyBuildingCounter.zergSpawningPool << "\n";
847 std::cout << " - Zerg Spire: " << enemyBuildingCounter.zergSpire << "\n";
848 std::cout << " - Zerg Spore Colony: " << enemyBuildingCounter.zergSporeColony << "\n";
849 std::cout << " - Zerg Sunken Colony: " << enemyBuildingCounter.zergSunkenColony << "\n";
850 std::cout << " - Zerg Ultralisk Cavern: " << enemyBuildingCounter.zergUltraliskCavern << "\n";
851}

◆ printEnemyResearch()

void InformationManager::printEnemyResearch ( ) const

Definition at line 1249 of file InformationManager.cpp.

1250{
1251 std::cout << "Enemy Research Status:\n";
1252 std::cout << " - Stim Packs: " << (enemyTechCounter.stimPacks ? "Researched" : "Not Researched") << "\n";
1253 std::cout << " - Lockdown: " << (enemyTechCounter.lockdown ? "Researched" : "Not Researched") << "\n";
1254 std::cout << " - EMP Shockwave: " << (enemyTechCounter.EMPShockwave ? "Researched" : "Not Researched") << "\n";
1255 std::cout << " - Spider Mines: " << (enemyTechCounter.spiderMines ? "Researched" : "Not Researched") << "\n";
1256 std::cout << " - Scanner Sweep: " << (enemyTechCounter.scannerSweep ? "Researched" : "Not Researched") << "\n";
1257 std::cout << " - Tank Siege Mode: " << (enemyTechCounter.tankSiegeMode ? "Researched" : "Not Researched") << "\n";
1258 std::cout << " - Defensive Matrix: " << (enemyTechCounter.defensiveMatrix ? "Researched" : "Not Researched") << "\n";
1259 std::cout << " - Irradiate: " << (enemyTechCounter.irradiate ? "Researched" : "Not Researched") << "\n";
1260 std::cout << " - Yamato Gun: " << (enemyTechCounter.yamatoGun ? "Researched" : "Not Researched") << "\n";
1261 std::cout << " - Cloaking Field: " << (enemyTechCounter.cloakingField ? "Researched" : "Not Researched") << "\n";
1262 std::cout << " - Personnel Cloaking: " << (enemyTechCounter.personnelCloaking ? "Researched" : "Not Researched") << "\n";
1263 std::cout << " - Restoration: " << (enemyTechCounter.restoration ? "Researched" : "Not Researched") << "\n";
1264 std::cout << " - Optical Flare: " << (enemyTechCounter.opticalFlare ? "Researched" : "Not Researched") << "\n";
1265 std::cout << " - Healing: " << (enemyTechCounter.healing ? "Researched" : "Not Researched") << "\n";
1266 std::cout << " - Nuclear Strike: " << (enemyTechCounter.nuclearStrike ? "Researched" : "Not Researched") << "\n";
1267
1268 std::cout << " - Burrowing: " << (enemyTechCounter.burrowing ? "Researched" : "Not Researched") << "\n";
1269 std::cout << " - Infestation: " << (enemyTechCounter.infestation ? "Researched" : "Not Researched") << "\n";
1270 std::cout << " - Spawn Broodlings: " << (enemyTechCounter.spawnBroodlings ? "Researched" : "Not Researched") << "\n";
1271 std::cout << " - Dark Swarm: " << (enemyTechCounter.darkSwarm ? "Researched" : "Not Researched") << "\n";
1272 std::cout << " - Plague: " << (enemyTechCounter.plague ? "Researched" : "Not Researched") << "\n";
1273 std::cout << " - Consume: " << (enemyTechCounter.consume ? "Researched" : "Not Researched") << "\n";
1274 std::cout << " - Ensnare: " << (enemyTechCounter.ensnare ? "Researched" : "Not Researched") << "\n";
1275 std::cout << " - Parasite: " << (enemyTechCounter.parasite ? "Researched" : "Not Researched") << "\n";
1276 std::cout << " - Lurker Aspect: " << (enemyTechCounter.lurkerAspect ? "Researched" : "Not Researched") << "\n";
1277
1278 std::cout << " - Disruption Web: " << (enemyTechCounter.disruptionWeb ? "Researched" : "Not Researched") << "\n";
1279 std::cout << " - Psionic Storm: " << (enemyTechCounter.psionicStorm ? "Researched" : "Not Researched") << "\n";
1280 std::cout << " - Hallucination: " << (enemyTechCounter.hallucination ? "Researched" : "Not Researched") << "\n";
1281 std::cout << " - Maelstrom: " << (enemyTechCounter.maelstrom ? "Researched" : "Not Researched") << "\n";
1282 std::cout << " - Mind Control: " << (enemyTechCounter.mindControl ? "Researched" : "Not Researched") << "\n";
1283 std::cout << " - Stasis Field: " << (enemyTechCounter.stasisField ? "Researched" : "Not Researched") << "\n";
1284 std::cout << " - Recall: " << (enemyTechCounter.recall ? "Researched" : "Not Researched") << "\n";
1285 std::cout << " - Feedback: " << (enemyTechCounter.feedback ? "Researched" : "Not Researched") << "\n";
1286 std::cout << " - Archon Warp: " << (enemyTechCounter.archonWarp ? "Researched" : "Not Researched") << "\n";
1287 std::cout << " - Dark Archon Meld: " << (enemyTechCounter.darkArchonMeld ? "Researched" : "Not Researched") << "\n";
1288}

◆ printEnemyUpgrades()

void InformationManager::printEnemyUpgrades ( ) const

Definition at line 1290 of file InformationManager.cpp.

1291{
1292 std::cout << "Enemy Upgrade Levels / Flags:\n";
1293 std::cout << " - Terran Infantry Armor: " << enemyUpgradeCounter.infantryArmor << "\n";
1294 std::cout << " - Terran Infantry Weapons: " << enemyUpgradeCounter.infantryWeapons << "\n";
1295 std::cout << " - Terran Vehicle Armor: " << enemyUpgradeCounter.vehicleArmor << "\n";
1296 std::cout << " - Terran Vehicle Weapons: " << enemyUpgradeCounter.vehicleWeapons << "\n";
1297 std::cout << " - Terran Ship Armor: " << enemyUpgradeCounter.shipArmor << "\n";
1298 std::cout << " - Terran Ship Weapons: " << enemyUpgradeCounter.shipWeapons << "\n";
1299 std::cout << " - U-238 Shells: " << (enemyUpgradeCounter.U238Shells ? "Yes" : "No") << "\n";
1300 std::cout << " - Ion Thrusters: " << (enemyUpgradeCounter.ionThrusters ? "Yes" : "No") << "\n";
1301 std::cout << " - Titan Reactor: " << (enemyUpgradeCounter.titanReactor ? "Yes" : "No") << "\n";
1302 std::cout << " - Ocular Implants: " << (enemyUpgradeCounter.ocularImplants ? "Yes" : "No") << "\n";
1303 std::cout << " - Moebius Reactor: " << (enemyUpgradeCounter.MoebiusReactor ? "Yes" : "No") << "\n";
1304 std::cout << " - Apollo Reactor: " << (enemyUpgradeCounter.apolloReactor ? "Yes" : "No") << "\n";
1305 std::cout << " - Colossus Reactor: " << (enemyUpgradeCounter.colossusReactor ? "Yes" : "No") << "\n";
1306 std::cout << " - Caduceus Reactor: " << (enemyUpgradeCounter.caduceusReactor ? "Yes" : "No") << "\n";
1307 std::cout << " - Charon Boosters: " << (enemyUpgradeCounter.charonBoosters ? "Yes" : "No") << "\n";
1308
1309 std::cout << " - Zerg Carapace: " << enemyUpgradeCounter.zergCarapace << "\n";
1310 std::cout << " - Zerg Melee Attacks: " << enemyUpgradeCounter.zergMeleeAttacks << "\n";
1311 std::cout << " - Zerg Missile Attacks: " << enemyUpgradeCounter.zergMissileAttacks << "\n";
1312 std::cout << " - Zerg Flyer Attacks: " << enemyUpgradeCounter.zergFlyerAttacks << "\n";
1313 std::cout << " - Zerg Flyer Carapace: " << enemyUpgradeCounter.zergFlyerCarapace << "\n";
1314 std::cout << " - Ventral Sacs: " << (enemyUpgradeCounter.ventralSacs ? "Yes" : "No") << "\n";
1315 std::cout << " - Antennae: " << (enemyUpgradeCounter.antennae ? "Yes" : "No") << "\n";
1316 std::cout << " - Pneumatized Carapace: " << (enemyUpgradeCounter.pneumatizedCarapace ? "Yes" : "No") << "\n";
1317 std::cout << " - Metabolic Boost: " << (enemyUpgradeCounter.metabolicBoost ? "Yes" : "No") << "\n";
1318 std::cout << " - Adrenal Glands: " << (enemyUpgradeCounter.adrenalGlands ? "Yes" : "No") << "\n";
1319 std::cout << " - Muscular Augments: " << (enemyUpgradeCounter.muscularAugments ? "Yes" : "No") << "\n";
1320 std::cout << " - Grooved Spines: " << (enemyUpgradeCounter.grooveSpines ? "Yes" : "No") << "\n";
1321 std::cout << " - Gamete Meiosis: " << (enemyUpgradeCounter.gameteMeiosis ? "Yes" : "No") << "\n";
1322 std::cout << " - Metasynaptic Nodes: " << (enemyUpgradeCounter.metasynapticNodes ? "Yes" : "No") << "\n";
1323 std::cout << " - Chitinous Plating: " << (enemyUpgradeCounter.chitinousPlating ? "Yes" : "No") << "\n";
1324 std::cout << " - Anabolic Synthesis: " << (enemyUpgradeCounter.anabolicSynthesis ? "Yes" : "No") << "\n";
1325
1326 std::cout << " - Protoss Air Armor: " << enemyUpgradeCounter.airArmor << "\n";
1327 std::cout << " - Protoss Air Weapons: " << enemyUpgradeCounter.airWeapons << "\n";
1328 std::cout << " - Protoss Ground Armor: " << enemyUpgradeCounter.groundArmor << "\n";
1329 std::cout << " - Protoss Ground Weapons: " << enemyUpgradeCounter.groundWeapons << "\n";
1330 std::cout << " - Protoss Plasma Shields: " << enemyUpgradeCounter.plasmaShields << "\n";
1331 std::cout << " - Singularity Charge: " << (enemyUpgradeCounter.singularityCharge ? "Yes" : "No") << "\n";
1332 std::cout << " - Leg Enhancements: " << (enemyUpgradeCounter.legEnhancements ? "Yes" : "No") << "\n";
1333 std::cout << " - Scarab Damage: " << (enemyUpgradeCounter.scarabDamage ? "Yes" : "No") << "\n";
1334 std::cout << " - Reaver Capacity: " << (enemyUpgradeCounter.reaverCapacity ? "Yes" : "No") << "\n";
1335 std::cout << " - Gravitic Drive: " << (enemyUpgradeCounter.graviticDrive ? "Yes" : "No") << "\n";
1336 std::cout << " - Sensor Array: " << (enemyUpgradeCounter.sensorArray ? "Yes" : "No") << "\n";
1337 std::cout << " - Gravitic Boosters: " << (enemyUpgradeCounter.graviticBoosters ? "Yes" : "No") << "\n";
1338 std::cout << " - Khaydarin Amulet: " << (enemyUpgradeCounter.khaydarinAmulet ? "Yes" : "No") << "\n";
1339 std::cout << " - Apial Sensors: " << (enemyUpgradeCounter.apialSensors ? "Yes" : "No") << "\n";
1340 std::cout << " - Gravitic Thrusters: " << (enemyUpgradeCounter.graviticThrusters ? "Yes" : "No") << "\n";
1341 std::cout << " - Carrier Capacity: " << (enemyUpgradeCounter.carrierCapacity ? "Yes" : "No") << "\n";
1342 std::cout << " - Khaydarin Core: " << (enemyUpgradeCounter.khaydarinCore ? "Yes" : "No") << "\n";
1343 std::cout << " - Argus Jewel: " << (enemyUpgradeCounter.argusJewel ? "Yes" : "No") << "\n";
1344 std::cout << " - Argus Talisman: " << (enemyUpgradeCounter.argusTalisman ? "Yes" : "No") << "\n";
1345}

◆ printFriendlyBuilding()

void InformationManager::printFriendlyBuilding ( )

Definition at line 1041 of file InformationManager.cpp.

1042{
1043 std::cout << "Friendly Building Count:\n";
1044 std::cout << " - Arbiter Tribunal: " << friendlyBuildingCounter.arbiterTribunal << "\n";
1045 std::cout << " - Assimilator: " << friendlyBuildingCounter.assimilator << "\n";
1046 std::cout << " - Citadel Of Adun: " << friendlyBuildingCounter.citadelOfAdun << "\n";
1047 std::cout << " - Cybernetics Core: " << friendlyBuildingCounter.cyberneticsCore << "\n";
1048 std::cout << " - Fleet Beacon: " << friendlyBuildingCounter.fleetBeacon << "\n";
1049 std::cout << " - Forge: " << friendlyBuildingCounter.forge << "\n";
1050 std::cout << " - Gateway: " << friendlyBuildingCounter.gateway << "\n";
1051 std::cout << " - Nexus: " << friendlyBuildingCounter.nexus << "\n";
1052 std::cout << " - Observatory: " << friendlyBuildingCounter.observatory << "\n";
1053 std::cout << " - Photon Cannon: " << friendlyBuildingCounter.photonCannon << "\n";
1054 std::cout << " - Pylon: " << friendlyBuildingCounter.pylon << "\n";
1055 std::cout << " - Robotics Facility: " << friendlyBuildingCounter.roboticsFacility << "\n";
1056 std::cout << " - Robotics Support Bay: " << friendlyBuildingCounter.roboticsSupportBay << "\n";
1057 std::cout << " - Shield Battery: " << friendlyBuildingCounter.shieldBattery << "\n";
1058 std::cout << " - Stargate: " << friendlyBuildingCounter.stargate << "\n";
1059 std::cout << " - Templar Archives: " << friendlyBuildingCounter.templarArchives << "\n";
1060}

◆ printFriendlyResearch()

void InformationManager::printFriendlyResearch ( )

Definition at line 1062 of file InformationManager.cpp.

1063{
1064 std::cout << "Friendly Research Status:\n";
1065 std::cout << " - Disruption Web: " << (friendlyTechCounter.disruptionWeb ? "Researched" : "Not Researched") << "\n";
1066 std::cout << " - Psionic Storm: " << (friendlyTechCounter.psionicStorm ? "Researched" : "Not Researched") << "\n";
1067 std::cout << " - Hallucination: " << (friendlyTechCounter.hallucination ? "Researched" : "Not Researched") << "\n";
1068 std::cout << " - Maelstrom: " << (friendlyTechCounter.maelstrom ? "Researched" : "Not Researched") << "\n";
1069 std::cout << " - Mind Control: " << (friendlyTechCounter.mindControl ? "Researched" : "Not Researched") << "\n";
1070 std::cout << " - Stasis Field: " << (friendlyTechCounter.stasisField ? "Researched" : "Not Researched") << "\n";
1071 std::cout << " - Recall: " << (friendlyTechCounter.recall ? "Researched" : "Not Researched") << "\n";
1072 std::cout << " - Archon Warp: " << (friendlyTechCounter.archonWarp ? "Researched" : "Not Researched") << "\n";
1073 std::cout << " - Dark Archon Meld: " << (friendlyTechCounter.darkArchonMeld ? "Researched" : "Not Researched") << "\n";
1074 std::cout << " - Feedback: " << (friendlyTechCounter.feedback ? "Researched" : "Not Researched") << "\n";
1075}

◆ printFriendlyUnit()

void InformationManager::printFriendlyUnit ( )

Definition at line 1021 of file InformationManager.cpp.

1022{
1023 std::cout << "Friendly Unit Count:\n";
1024 std::cout << " - Arbiter: " << friendlyUnitCounter.arbiter << "\n";
1025 std::cout << " - Archon: " << friendlyUnitCounter.archon << "\n";
1026 std::cout << " - Carrier: " << friendlyUnitCounter.carrier << "\n";
1027 std::cout << " - Corsair: " << friendlyUnitCounter.corsair << "\n";
1028 std::cout << " - Dark Archon: " << friendlyUnitCounter.darkArchon << "\n";
1029 std::cout << " - Dark Templar: " << friendlyUnitCounter.darkTemplar << "\n";
1030 std::cout << " - Dragoon: " << friendlyUnitCounter.dragoon << "\n";
1031 std::cout << " - High Templar: " << friendlyUnitCounter.highTemplar << "\n";
1032 std::cout << " - Interceptor: " << friendlyUnitCounter.interceptor << "\n";
1033 std::cout << " - Observer: " << friendlyUnitCounter.observer << "\n";
1034 std::cout << " - Probe: " << friendlyUnitCounter.probe << "\n";
1035 std::cout << " - Reaver: " << friendlyUnitCounter.reaver << "\n";
1036 std::cout << " - Scout: " << friendlyUnitCounter.scout << "\n";
1037 std::cout << " - Shuttle: " << friendlyUnitCounter.shuttle << "\n";
1038 std::cout << " - Zealot: " << friendlyUnitCounter.zealot << "\n";
1039}

◆ printFriendlyUpgrades()

void InformationManager::printFriendlyUpgrades ( )

Definition at line 1077 of file InformationManager.cpp.

1078{
1079 std::cout << "Friendly Upgrade Levels:\n";
1080 std::cout << " - Protoss Ground Weapons: " << friendlyUpgradeCounter.groundWeapons << "\n";
1081 std::cout << " - Protoss Ground Armor: " << friendlyUpgradeCounter.groundArmor << "\n";
1082 std::cout << " - Protoss Air Weapons: " << friendlyUpgradeCounter.airWeapons << "\n";
1083 std::cout << " - Protoss Air Armor: " << friendlyUpgradeCounter.airArmor << "\n";
1084 std::cout << " - Protoss Plasma Shields: " << friendlyUpgradeCounter.plasmaShields << "\n";
1085 std::cout << " - Singularity Charge: " << (friendlyUpgradeCounter.singularityCharge ? "Upgraded" : "Not Upgraded") << "\n";
1086 std::cout << " - Leg Enhancements: " << (friendlyUpgradeCounter.legEnhancements ? "Upgraded" : "Not Upgraded") << "\n";
1087 std::cout << " - Scarab Damage: " << (friendlyUpgradeCounter.scarabDamage ? "Upgraded" : "Not Upgraded") << "\n";
1088 std::cout << " - Reaver Capacity: " << (friendlyUpgradeCounter.reaverCapacity ? "Upgraded" : "Not Upgraded") << "\n";
1089 std::cout << " - Gravitic Drive: " << (friendlyUpgradeCounter.graviticDrive ? "Upgraded" : "Not Upgraded") << "\n";
1090 std::cout << " - Sensor Array: " << (friendlyUpgradeCounter.sensorArray ? "Upgraded" : "Not Upgraded") << "\n";
1091 std::cout << " - Gravitic Boosters: " << (friendlyUpgradeCounter.graviticBoosters ? "Upgraded" : "Not Upgraded") << "\n";
1092 std::cout << " - Khaydarin Amulet: " << (friendlyUpgradeCounter.khaydarinAmulet ? "Upgraded" : "Not Upgraded") << "\n";
1093 std::cout << " - Apial Sensors: " << (friendlyUpgradeCounter.apialSensors ? "Upgraded" : "Not Upgraded") << "\n";
1094 std::cout << " - Gravitic Thrusters: " << (friendlyUpgradeCounter.graviticThrusters ? "Upgraded" : "Not Upgraded") << "\n";
1095 std::cout << " - Carrier Capacity: " << (friendlyUpgradeCounter.carrierCapacity ? "Upgraded" : "Not Upgraded") << "\n";
1096 std::cout << " - Khaydarin Core: " << (friendlyUpgradeCounter.khaydarinCore ? "Upgraded" : "Not Upgraded") << "\n";
1097 std::cout << " - Argus Jewel: " << (friendlyUpgradeCounter.argusJewel ? "Upgraded" : "Not Upgraded") << "\n";
1098 std::cout << " - Argus Talisman: " << (friendlyUpgradeCounter.argusTalisman ? "Upgraded" : "Not Upgraded") << "\n";
1099}

◆ printKnownEnemies()

void InformationManager::printKnownEnemies ( ) const

Definition at line 782 of file InformationManager.cpp.

783{
784 std::cout << "Known enemy units:\n";
785 for (auto& unit : _knownEnemies)
786 {
787 if (unit && unit->exists())
788 std::cout << " - " << unit->getType().c_str() << " at " << unit->getPosition() << "\n";
789 }
790}

◆ printKnownEnemyBuildings()

void InformationManager::printKnownEnemyBuildings ( ) const

Definition at line 792 of file InformationManager.cpp.

793{
794 std::cout << "Known enemy buildings:\n";
795 for (auto& [unit, info] : _knownEnemyBuildings)
796 {
797 std::cout << " - " << info.type.c_str()
798 << " last seen at " << info.lastKnownPosition
799 << (info.destroyed ? " [destroyed]" : "") << "\n";
800 }
801}

◆ printTrackedEnemies()

void InformationManager::printTrackedEnemies ( ) const

Definition at line 853 of file InformationManager.cpp.

854{
855 std::cout << "Tracked enemies (" << trackedEnemies.size() << "):\n";
856
857 for (const auto& [id, e] : trackedEnemies)
858 {
859 std::cout << " - ID: " << id
860 << " | Type: " << e.type.c_str()
861 << " | Last seen at: ("
862 << e.lastSeenPos.x << ", " << e.lastSeenPos.y << ")"
863 << " | Building: " << (e.isBuilding ? "yes" : "no")
864 << " | Destroyed: " << (e.destroyed ? "yes" : "no")
865 << "\n";
866 }
867}

◆ queryThreatAt()

ThreatQueryResult InformationManager::queryThreatAt ( const BWAPI::Position & pos) const

Definition at line 1467 of file InformationManager.cpp.

1468{
1469 ThreatQueryResult r;
1470 r.airThreat = threatGrid.getAirThreat(pos);
1471 r.detectorThreat = threatGrid.getDetection(pos);
1472 return r;
1473}

◆ SetCommander()

void InformationManager::SetCommander ( ProtoBotCommander * commander)

Definition at line 17 of file InformationManager.cpp.

18{
19 this->commanderReference = commander;
20}

◆ TestDrawBaseOwnership()

void InformationManager::TestDrawBaseOwnership ( ) const

Definition at line 1161 of file InformationManager.cpp.

1162{
1163 const int markerRadius = 80; // pixels
1164 // Colors: player = green, enemy = red, unowned = yellow, candidates = blue
1165 for (const BWEM::Base* b : FindPlayerOwnedBases())
1166 {
1167 if (!b) continue;
1168 BWAPI::Position c = b->Center();
1169 BWAPI::Broodwar->drawCircleMap(c, markerRadius, BWAPI::Colors::Green, true);
1170 BWAPI::Broodwar->drawTextMap(c.x + 4, c.y + 4, "Player");
1171 }
1172
1173 for (const BWEM::Base* b : FindEnemyOwnedBases())
1174 {
1175 if (!b) continue;
1176 BWAPI::Position c = b->Center();
1177 BWAPI::Broodwar->drawCircleMap(c, markerRadius, BWAPI::Colors::Red, true);
1178 BWAPI::Broodwar->drawTextMap(c.x + 4, c.y + 4, "Enemy");
1179 }
1180
1181 for (const BWEM::Base* b : FindUnownedBases())
1182 {
1183 if (!b) continue;
1184 BWAPI::Position c = b->Center();
1185 BWAPI::Broodwar->drawCircleMap(c, markerRadius, BWAPI::Colors::Yellow, true);
1186 BWAPI::Broodwar->drawTextMap(c.x + 4, c.y + 4, "Unowned");
1187 }
1188
1189 // Draw nearest candidate expansions with a distinct color/label
1190 auto candidates = FindNewBases(3);
1191 int idx = 1;
1192 for (const BWEM::Base* b : candidates)
1193 {
1194 if (!b) continue;
1195 BWAPI::Position c = b->Center();
1196 BWAPI::Broodwar->drawCircleMap(c, markerRadius + 16, BWAPI::Colors::Blue, true);
1197 char buf[64];
1198 std::snprintf(buf, sizeof(buf), "Candidate #%d", idx++);
1199 BWAPI::Broodwar->drawTextMap(c.x + 4, c.y + 4, buf);
1200 }
1201}

◆ TestPrintBaseOwnership()

void InformationManager::TestPrintBaseOwnership ( ) const

Definition at line 1101 of file InformationManager.cpp.

1102{
1103 auto playerBases = FindPlayerOwnedBases();
1104 auto enemyBases = FindEnemyOwnedBases();
1105 auto unownedBases = FindUnownedBases();
1106 auto nearestCandidates = FindNewBases(3);
1107
1108 std::cout << "Base ownership summary:\n";
1109 std::cout << " - Player-owned: " << playerBases.size() << "\n";
1110 for (const BWEM::Base* b : playerBases)
1111 {
1112 if (!b) continue;
1113 auto loc = b->Location();
1114 std::cout << " Player base at tile (" << loc.x << "," << loc.y << ")\n";
1115 }
1116
1117 std::cout << " - Enemy-owned: " << enemyBases.size() << "\n";
1118 for (const BWEM::Base* b : enemyBases)
1119 {
1120 if (!b) continue;
1121 auto loc = b->Location();
1122 std::cout << " Enemy base at tile (" << loc.x << "," << loc.y << ")\n";
1123 }
1124
1125 std::cout << " - Unowned: " << unownedBases.size() << "\n";
1126 for (const BWEM::Base* b : unownedBases)
1127 {
1128 if (!b) continue;
1129 auto loc = b->Location();
1130 std::cout << " Unowned base location at tile (" << loc.x << "," << loc.y << ")\n";
1131 }
1132
1133 // Print the nearest unowned candidates (up to 3)
1134 std::cout << " - Nearest unowned candidate bases (up to 3): " << nearestCandidates.size() << "\n";
1135 // We'll also print distance to the nearest player base (if any)
1136 for (size_t i = 0; i < nearestCandidates.size(); ++i)
1137 {
1138 const BWEM::Base* b = nearestCandidates[i];
1139 if (!b) continue;
1140 auto loc = b->Location();
1141
1142 int minDist = -1;
1143 auto playerList = FindPlayerOwnedBases();
1144 if (!playerList.empty())
1145 {
1146 BWAPI::Position bc = b->Center();
1147 for (const BWEM::Base* pb : playerList)
1148 {
1149 if (!pb) continue;
1150 int d = bc.getApproxDistance(pb->Center());
1151 if (minDist < 0 || d < minDist) minDist = d;
1152 }
1153 }
1154
1155 std::cout << " Candidate #" << (i + 1) << " at tile (" << loc.x << "," << loc.y << ")";
1156 if (minDist >= 0) std::cout << " | approx px to nearest our base: " << minDist;
1157 std::cout << "\n";
1158 }
1159}

◆ updateEnemyBuildingCounter()

void InformationManager::updateEnemyBuildingCounter ( )

Definition at line 652 of file InformationManager.cpp.

653{
654 // Reset counts
655 enemyBuildingCounter = EnemyBuildingCounter();
656
657 for (const auto& kv : _knownEnemyBuildings)
658 {
659 const EnemyBuildingInfo& info = kv.second;
660 if (info.destroyed) continue;
661 const BWAPI::UnitType& type = info.type;
662 if (!type.isValid()) continue;
663
664 // Protoss
665 if (type == BWAPI::UnitTypes::Protoss_Arbiter_Tribunal) ++enemyBuildingCounter.arbiterTribunal;
666 else if (type == BWAPI::UnitTypes::Protoss_Assimilator) ++enemyBuildingCounter.assimilator;
667 else if (type == BWAPI::UnitTypes::Protoss_Citadel_of_Adun) ++enemyBuildingCounter.citadelOfAdun;
668 else if (type == BWAPI::UnitTypes::Protoss_Cybernetics_Core) ++enemyBuildingCounter.cyberneticsCore;
669 else if (type == BWAPI::UnitTypes::Protoss_Fleet_Beacon) ++enemyBuildingCounter.fleetBeacon;
670 else if (type == BWAPI::UnitTypes::Protoss_Forge) ++enemyBuildingCounter.forge;
671 else if (type == BWAPI::UnitTypes::Protoss_Gateway) ++enemyBuildingCounter.gateway;
672 else if (type == BWAPI::UnitTypes::Protoss_Nexus) ++enemyBuildingCounter.nexus;
673 else if (type == BWAPI::UnitTypes::Protoss_Observatory) ++enemyBuildingCounter.observatory;
674 else if (type == BWAPI::UnitTypes::Protoss_Photon_Cannon) ++enemyBuildingCounter.photonCannon;
675 else if (type == BWAPI::UnitTypes::Protoss_Pylon) ++enemyBuildingCounter.pylon;
676 else if (type == BWAPI::UnitTypes::Protoss_Robotics_Facility) ++enemyBuildingCounter.roboticsFacility;
677 else if (type == BWAPI::UnitTypes::Protoss_Robotics_Support_Bay) ++enemyBuildingCounter.roboticsSupportBay;
678 else if (type == BWAPI::UnitTypes::Protoss_Shield_Battery) ++enemyBuildingCounter.shieldBattery;
679 else if (type == BWAPI::UnitTypes::Protoss_Stargate) ++enemyBuildingCounter.stargate;
680 else if (type == BWAPI::UnitTypes::Protoss_Templar_Archives) ++enemyBuildingCounter.templarArchives;
681
682 // Terran
683 else if (type == BWAPI::UnitTypes::Terran_Academy) ++enemyBuildingCounter.terranAcademy;
684 else if (type == BWAPI::UnitTypes::Terran_Armory) ++enemyBuildingCounter.terranArmory;
685 else if (type == BWAPI::UnitTypes::Terran_Barracks) ++enemyBuildingCounter.terranBarracks;
686 else if (type == BWAPI::UnitTypes::Terran_Bunker) ++enemyBuildingCounter.terranBunker;
687 else if (type == BWAPI::UnitTypes::Terran_Command_Center) ++enemyBuildingCounter.terranCommandCenter;
688 else if (type == BWAPI::UnitTypes::Terran_Engineering_Bay) ++enemyBuildingCounter.terranEngineeringBay;
689 else if (type == BWAPI::UnitTypes::Terran_Factory) ++enemyBuildingCounter.terranFactory;
690 else if (type == BWAPI::UnitTypes::Terran_Missile_Turret) ++enemyBuildingCounter.terranMissileTurret;
691 else if (type == BWAPI::UnitTypes::Terran_Refinery) ++enemyBuildingCounter.terranRefinery;
692 else if (type == BWAPI::UnitTypes::Terran_Science_Facility) ++enemyBuildingCounter.terranScienceFacility;
693 else if (type == BWAPI::UnitTypes::Terran_Starport) ++enemyBuildingCounter.terranStarport;
694 else if (type == BWAPI::UnitTypes::Terran_Supply_Depot) ++enemyBuildingCounter.terranSupplyDepot;
695
696 // Zerg
697 else if (type == BWAPI::UnitTypes::Zerg_Creep_Colony) ++enemyBuildingCounter.zergCreepColony;
698 else if (type == BWAPI::UnitTypes::Zerg_Defiler_Mound) ++enemyBuildingCounter.zergDefilerMound;
699 else if (type == BWAPI::UnitTypes::Zerg_Evolution_Chamber) ++enemyBuildingCounter.zergEvolutionChamber;
700 else if (type == BWAPI::UnitTypes::Zerg_Extractor) ++enemyBuildingCounter.zergExtractor;
701 else if (type == BWAPI::UnitTypes::Zerg_Greater_Spire) ++enemyBuildingCounter.zergGreaterSpire;
702 else if (type == BWAPI::UnitTypes::Zerg_Hatchery) ++enemyBuildingCounter.zergHatchery;
703 else if (type == BWAPI::UnitTypes::Zerg_Hive) ++enemyBuildingCounter.zergHive;
704 else if (type == BWAPI::UnitTypes::Zerg_Hydralisk_Den) ++enemyBuildingCounter.zergHydraliskDen;
705 else if (type == BWAPI::UnitTypes::Zerg_Infested_Command_Center) ++enemyBuildingCounter.zergInfestedCommandCenter;
706 else if (type == BWAPI::UnitTypes::Zerg_Lair) ++enemyBuildingCounter.zergLair;
707 else if (type == BWAPI::UnitTypes::Zerg_Nydus_Canal) ++enemyBuildingCounter.zergNydusCanal;
708 else if (type == BWAPI::UnitTypes::Zerg_Queens_Nest) ++enemyBuildingCounter.zergQueensNest;
709 else if (type == BWAPI::UnitTypes::Zerg_Spawning_Pool) ++enemyBuildingCounter.zergSpawningPool;
710 else if (type == BWAPI::UnitTypes::Zerg_Spire) ++enemyBuildingCounter.zergSpire;
711 else if (type == BWAPI::UnitTypes::Zerg_Spore_Colony) ++enemyBuildingCounter.zergSporeColony;
712 else if (type == BWAPI::UnitTypes::Zerg_Sunken_Colony) ++enemyBuildingCounter.zergSunkenColony;
713 else if (type == BWAPI::UnitTypes::Zerg_Ultralisk_Cavern) ++enemyBuildingCounter.zergUltraliskCavern;
714 }
715}

Member Data Documentation

◆ _knownEnemies

std::set<BWAPI::Unit> InformationManager::_knownEnemies
private

Definition at line 263 of file InformationManager.h.

◆ _knownEnemyBuildings

std::map<BWAPI::Unit, EnemyBuildingInfo> InformationManager::_knownEnemyBuildings
private

Definition at line 264 of file InformationManager.h.

◆ commanderReference

ProtoBotCommander* InformationManager::commanderReference

Definition at line 287 of file InformationManager.h.

◆ EnemyBaseLocations

std::vector<BWAPI::Position> InformationManager::EnemyBaseLocations

Definition at line 294 of file InformationManager.h.

◆ enemyBuildingCounter

EnemyBuildingCounter InformationManager::enemyBuildingCounter
private

Definition at line 274 of file InformationManager.h.

◆ enemyTechCounter

EnemyTechCounter InformationManager::enemyTechCounter
private

Definition at line 275 of file InformationManager.h.

◆ enemyUpgradeCounter

EnemyUpgradeCounter InformationManager::enemyUpgradeCounter
private

Definition at line 276 of file InformationManager.h.

◆ friendlyBuildingCounter

FriendlyBuildingCounter InformationManager::friendlyBuildingCounter
private

Definition at line 271 of file InformationManager.h.

◆ friendlyTechCounter

FriendlyTechCounter InformationManager::friendlyTechCounter
private

Definition at line 272 of file InformationManager.h.

◆ friendlyUnitCounter

FriendlyUnitCounter InformationManager::friendlyUnitCounter
private

Definition at line 270 of file InformationManager.h.

◆ friendlyUpgradeCounter

FriendlyUpgradeCounter InformationManager::friendlyUpgradeCounter
private

Definition at line 273 of file InformationManager.h.

◆ gameState

double InformationManager::gameState
private

Definition at line 269 of file InformationManager.h.

◆ influenceMap

InfluenceMap InformationManager::influenceMap
private

Definition at line 266 of file InformationManager.h.

◆ playstyle

Playstyle InformationManager::playstyle = Playstyle::None
private

Definition at line 268 of file InformationManager.h.

◆ threatGrid

ThreatGrid InformationManager::threatGrid
private

Definition at line 267 of file InformationManager.h.

◆ trackedEnemies

std::map<int, TrackedEnemy> InformationManager::trackedEnemies
private

Definition at line 265 of file InformationManager.h.


The documentation for this class was generated from the following files: