BaseAgent* Squad::getCenterAgent() { TilePosition center = getCenter(); BaseAgent* cAgent = NULL; double dist = 10000; for (int i = 0; i < (int)agents.size(); i++) { if (agents.at(i)->isAlive()) { if ( (isAir() && agents.at(i)->getUnitType().isFlyer()) || (isGround() && !agents.at(i)->getUnitType().isFlyer())) { double cDist = agents.at(i)->getUnit()->getTilePosition().getDistance(center); if (cDist < dist) { cAgent = agents.at(i); dist = cDist; } } } } return cAgent; }
void downSpider(int x, int y, int z, block_t id, int tries) { block_t currentBlock = getblock(x, y, z); // air, crosses, water if (isAir(currentBlock) || currentBlock >= halfblock_start) { if (tries--) downSpider(x, y-1, z, id, tries); setb(x, y, z, id); } }
TilePosition Squad::getCenter() { if (agents.size() == 1) { return agents.at(0)->getUnit()->getTilePosition(); } int cX = 0; int cY = 0; int cnt = 0; //Calculate sum (x,y) for (int i = 0; i < (int)agents.size(); i++) { if (agents.at(i)->isAlive()) { cX += agents.at(i)->getUnit()->getTilePosition().x(); cY += agents.at(i)->getUnit()->getTilePosition().y(); cnt++; } } //Calculate average (x,y) if(cnt > 0) { cX = cX / cnt; cY = cY / cnt; } //To make sure the center is in a walkable tile, we need to //find the unit closest to center TilePosition c = TilePosition(cX, cY); TilePosition bestSpot = c; double bestDist = 10000; for (int i = 0; i < (int)agents.size(); i++) { if (agents.at(i)->isAlive()) { if ( (isAir() && agents.at(i)->getUnitType().isFlyer()) || (isGround() && !agents.at(i)->getUnitType().isFlyer())) { double dist = agents.at(i)->getUnit()->getTilePosition().getDistance(c); if (dist < bestDist) { bestDist = dist; bestSpot = agents.at(i)->getUnit()->getTilePosition(); } } } } return bestSpot; }
TilePosition Squad::nextMovePosition() { if (path.size() <= 0) { return goal; } if (isAir()) { return goal; } if (pathIndex >= (int)path.size()) { return goal; } if (arrivedFrame == -1) { for (int i = 0; i < (int)agents.size(); i++) { int seekDist = agents.at(i)->getUnitType().seekRange(); int dist = (int)agents.at(i)->getUnit()->getPosition().getDistance(Position(path.at(pathIndex))); if (dist <= seekDist) { arrivedFrame = Broodwar->getFrameCount(); break; } } } if (arrivedFrame != -1) { int cFrame = Broodwar->getFrameCount(); if (cFrame - arrivedFrame >= 200) { pathIndex += 10; if (pathIndex >= (int)path.size()) { pathIndex = (int)path.size() - 1; } arrivedFrame = -1; } } TilePosition cGoal = path.at(pathIndex); setMemberGoals(cGoal); return cGoal; }
void Squad::printInfo() { string f = "NotFull"; if (isFull()) { f = "Full"; } string a = "Inactive"; if (isActive()) { a = "Active"; } string m = "Ground"; if (isAir()) { m = "Air"; } Broodwar->printf("[SQ %d-%s] %s (%s, %s) prio: %d units: %d", id, m.c_str(), name.c_str(), f.c_str(), a.c_str(), priority, getSize()); }
TilePosition Squad::getCenter() { if (agents.size() == 1) { return agents.at(0)->getUnit()->getTilePosition(); } int cX = 0; int cY = 0; int cnt = 0; //Calculate sum (x,y) for (int i = 0; i < (int)agents.size(); i++) { if (agents.at(i)->isAlive()) { TilePosition unitPos = agents.at(i)->getUnit()->getTilePosition(); if (!unitPos.isValid()) { Broodwar->printf("Encountered invalid position, skipping"); continue; } cX += unitPos.x(); cY += unitPos.y(); cnt++; } } //Calculate average (x,y) if(cnt > 0) { cX = cX / cnt; cY = cY / cnt; } //To make sure the center is in a walkable tile, we need to //find the unit closest to center TilePosition c = TilePosition(cX, cY); TilePosition bestSpot = c; double bestDist = 10000; for (int i = 0; i < (int)agents.size(); i++) { if (agents.at(i)->isAlive()) { TilePosition unitPos = agents.at(i)->getUnit()->getTilePosition(); if (!unitPos.isValid()) continue; if ( (isAir() && agents.at(i)->getUnitType().isFlyer()) || (isGround() && !agents.at(i)->getUnitType().isFlyer())) { double dist = unitPos.getDistance(c); if (dist < bestDist) { bestDist = dist; bestSpot = unitPos; } } } } if (!bestSpot.isValid()) { Broodwar->printf("Invalid positions has distrupted the time-space continuum, expect the universe to implode."); } return bestSpot; }