Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
	}
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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());
}
Esempio n. 6
0
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;
}