Пример #1
0
int TransportAgent::getCurrentLoad()
{
	Squad* sq = Commander::getInstance()->getSquad(squadID);
	if (sq != NULL)
	{
		int load = 0;
		vector<BaseAgent*> agents = sq->getMembers();
		for (int i = 0; i < (int)agents.size(); i++)
		{
			BaseAgent* a = agents.at(i);
			if (a->isAlive())
			{
				if (a->getUnit()->isLoaded())
				{
					if (a->getUnit()->getTransport()->getID() == unit->getID())
					{
						load += a->getUnitType().spaceRequired();
					}
				}
			}
		}
		currentLoad = load;
	}

	return currentLoad;
}
Пример #2
0
void CombatCommander::updateDefenseSquadUnits(Squad & defenseSquad, const size_t & flyingDefendersNeeded, const size_t & groundDefendersNeeded)
{
    auto & squadUnits = defenseSquad.getUnits();

    // TODO: right now this will assign arbitrary defenders, change this so that we make sure they can attack air/ground

    // if there's nothing left to defend, clear the squad
    if (flyingDefendersNeeded == 0 && groundDefendersNeeded == 0)
    {
        defenseSquad.clear();
        return;
    }

    size_t defendersNeeded = flyingDefendersNeeded + groundDefendersNeeded;
    size_t defendersAdded = 0;

    while (defendersNeeded > defendersAdded)
    {
        UnitTag defenderToAdd = findClosestDefender(defenseSquad, defenseSquad.getSquadOrder().getPosition());

        if (defenderToAdd)
        {
            m_squadData.assignUnitToSquad(defenderToAdd, defenseSquad);
            defendersAdded++;
        }
        else
        {
            break;
        }
    }
}
Пример #3
0
BaseAgent* TransportAgent::findUnitToLoad(int spaceLimit)
{
	BaseAgent* agent = NULL;
	double bestDist = 100000;

	Squad* sq = Commander::getInstance()->getSquad(squadID);
	if (sq != NULL)
	{
		vector<BaseAgent*> agents = sq->getMembers();
		for (int i = 0; i < (int)agents.size(); i++)
		{
			BaseAgent* a = agents.at(i);
			if (isValidLoadUnit(a))
			{
				double cDist = unit->getPosition().getDistance(a->getUnit()->getPosition());
				if (cDist < bestDist)
				{
					bestDist = cDist;
					agent = a;
				}
			}
		}
	}

	return agent;
}
Пример #4
0
int Commander::addBunkerSquad()
{
	Squad* bSquad = new Squad(100 + AgentManager::getInstance()->countNoUnits(UnitTypes::Terran_Bunker), Squad::BUNKER, "BunkerSquad", 5);
	bSquad->addSetup(UnitTypes::Terran_Marine, 4);
	squads.push_back(bSquad);

	//Try to fill from other squads.
	int added = 0;
	for (Squad* s : squads)
	{
		if (s->isOffensive() || s->isDefensive())
		{
			for (int i = 0; i < 4 - added; i++)
			{
				if (s->hasUnits(UnitTypes::Terran_Marine, 1))
				{
					if (added < 4)
					{
						BaseAgent* ma = s->removeMember(UnitTypes::Terran_Marine);
						if (ma != NULL)
						{
							added++;
							bSquad->addMember(ma);
							ma->clearGoal();
						}
					}
				}
			}
		}
	}

	return bSquad->getID();
}
Пример #5
0
bool MarineAgent::isNeededInBunker()
{
	if (!unit->isLoaded())
	{
		Squad* sq = Commander::getInstance()->getSquad(squadID);
		if (sq != NULL)
		{
			if (sq->isBunkerDefend())
			{
				vector<BaseAgent*> agents = AgentManager::getInstance()->getAgents();
				for (int i = 0; i < (int)agents.size(); i++)
				{
					if (agents.at(i)->isAlive() && agents.at(i)->isOfType(UnitTypes::Terran_Bunker))
				{
						if (agents.at(i)->getUnit()->getLoadedUnits().size() < 4)
				{
							unit->rightClick(agents.at(i)->getUnit());
							return true;
						}
					}
				}
			}
		}
	}
	return false;
}
Пример #6
0
BaseAgent* TransportAgent::findUnitToLoad(int spaceLimit)
{
	BaseAgent* agent = NULL;
	double bestDist = 100000;

	Squad* sq = Commander::getInstance()->getSquad(squadID);
	if (sq != NULL)
	{
		Agentset agents = sq->getMembers();
		for (auto &a : agents)
		{
			if (isValidLoadUnit(a))
			{
				double cDist = unit->getPosition().getDistance(a->getUnit()->getPosition());
				if (cDist < bestDist)
				{
					bestDist = cDist;
					agent = a;
				}
			}
		}
	}

	return agent;
}
Пример #7
0
void NodeCombat::incoming(Squad s)
{
    const Gamer &g = s.getOwner();
    int ressource = s.getNbRessources();

    if(&g == owner)
    {
        //Entrée d'allier
        setRessources(nbRessources+ressource);
    }
    else
    {
        //Entrée d'ennemis
        if(invicible) ressource = 0;
        ressource = dealDamageOnArmor(ressource);
        if (nbRessources < ressource)
        {
            //Changement de propriétaire
            ressource -= nbRessources;
            setRessources(ressource);
            setOwner(&g);
        }
        else
        {
            setRessources(nbRessources-ressource);
        }
    }
}
Пример #8
0
int TransportAgent::getCurrentLoad()
{
	Squad* sq = Commander::getInstance()->getSquad(squadID);
	if (sq != NULL)
	{
		int load = 0;
		Agentset agents = sq->getMembers();
		for (auto &a : agents)
		{
			if (a->isAlive())
			{
				if (a->getUnit()->isLoaded())
				{
					if (a->getUnit()->getTransport()->getID() == unit->getID())
					{
						load += a->getUnitType().spaceRequired();
					}
				}
			}
		}
		currentLoad = load;
	}

	return currentLoad;
}
void CombatCommander::updateDefenseSquadUnits(Squad & defenseSquad, const size_t & flyingDefendersNeeded, const size_t & groundDefendersNeeded)
{


	int zerglingsInOurBase = numZerglingsInOurBase();
	bool zerglingRush = zerglingsInOurBase > 0 && BWAPI::Broodwar->getFrameCount() < 5000;

	const BWAPI::Unitset & squadUnits = defenseSquad.getUnits();
	size_t flyingDefendersInSquad = std::count_if(squadUnits.begin(), squadUnits.end(), UnitUtil::CanAttackAir);
	size_t groundDefendersInSquad = std::count_if(squadUnits.begin(), squadUnits.end(), UnitUtil::CanAttackGround);

	// if there's nothing left to defend, clear the squad
	if (flyingDefendersNeeded == 0 && groundDefendersNeeded == 0)
	{
		defenseSquad.clear();
		return;
	}



	// add flying defenders if we still need them
	size_t flyingDefendersAdded = 0;
	while (flyingDefendersNeeded > flyingDefendersInSquad + flyingDefendersAdded)
	{
		BWAPI::Unit defenderToAdd = findClosestDefender(defenseSquad, defenseSquad.getSquadOrder().getPosition(), true);

		// if we find a valid flying defender, add it to the squad
		if (defenderToAdd)
		{
			_squadData.assignUnitToSquad(defenderToAdd, defenseSquad);
			++flyingDefendersAdded;
		}
		// otherwise we'll never find another one so break out of this loop
		else
		{
			break;
		}
	}


	// add ground defenders if we still need them
	size_t groundDefendersAdded = 0;
	while (groundDefendersNeeded > groundDefendersInSquad + groundDefendersAdded)
	{
		BWAPI::Unit defenderToAdd = findClosestDefender(defenseSquad, defenseSquad.getSquadOrder().getPosition(), false);

		// if we find a valid ground defender add it
		if (defenderToAdd)
		{
			_squadData.assignUnitToSquad(defenderToAdd, defenseSquad);
			++groundDefendersAdded;
		}
		// otherwise we'll never find another one so break out of this loop
		else
		{
			break;
		}
	}
}
Пример #10
0
int SquadBindings::apiJoinSquad(apikey squadKey, apikey shipKey) {
    Squad* squad = m_scriptEngine.get<Squad>(squadKey);
    if (!squad) { return -1; }

    Ship* ship = m_scriptEngine.get<Ship>(shipKey);
    if (!ship) { return -1; }

    ship->squadLogic()->joinSquadOf(squad->leader());
    return 0;
}
Пример #11
0
void	Squad::_copyUnits(const Squad& src)
{
	int	i = 0;
	int	n = src.getCount();

	while (i < n) {
		push(src.getUnit(i));
		++i;
	}
}
Пример #12
0
void Commander::assistBuilding(BaseAgent* building) {
	for (int i = 0; i < (int)squads.size(); i++) {
		Squad* sq = squads.at(i);
		if (sq->isDefensive()) {
			sq->setGoal(building->getUnit()->getTilePosition());
		}
		if (sq->isOffensive() && currentState == DEFEND) {
			sq->setGoal(building->getUnit()->getTilePosition());
		}
	}
}
Пример #13
0
void Commander::unitDestroyed(BaseAgent* agent)
{
	int squadID = agent->getSquadID();
	if (squadID != -1)
	{
		Squad* squad = getSquad(squadID);
		if (squad != NULL)
		{
			squad->removeMember(agent);
		}
	}
}
Пример #14
0
int SquadBindings::apiCreatePatrolWaypointsTask(apikey squadKey) {
    Squad* squad = m_scriptEngine.get<Squad>(squadKey);

    if (!squad) { return -1; }

    auto task = std::make_shared<PatrolWaypointsTask>(*squad);
    m_scriptEngine.registerScriptable(task.get());

    squad->setTask(task);

    return task->scriptKey();
}
Пример #15
0
int SquadBindings::apiCreateDefendAreaTask(apikey squadKey, const glm::vec3& point, float range) {
    Squad* squad = m_scriptEngine.get<Squad>(squadKey);

    if (!squad) { return -1; }

    auto task = std::shared_ptr<DefendAreaTask>(new DefendAreaTask(*squad, { point }, range));
    m_scriptEngine.registerScriptable(task.get());

    squad->setTask(task);

    return task->scriptKey();
}
Пример #16
0
void SquadData::assignUnitToSquad(BWAPI::Unit unit, Squad & squad)
{
    UAB_ASSERT_WARNING(canAssignUnitToSquad(unit, squad), "We shouldn't be re-assigning this unit!");

    Squad * previousSquad = getUnitSquad(unit);

    if (previousSquad)
    {
        previousSquad->removeUnit(unit);
    }

    squad.addUnit(unit);
}
Пример #17
0
void Commander::removeSquad(int id)
{
	for (int i = 0; i < (int)squads.size(); i++)
	{
		Squad* sq = squads.at(i);
		if (sq->getID() == id)
		{
			sq->disband();
			squads.erase(squads.begin() + i);
			return;
		}
	}	
}
Пример #18
0
void NodeCombat::sendSquad(int ressource, int nodeId)
{
    if(nodeId != getId() && mapConnexion.contains(nodeId))
    {
        int nbToSend = ressource > nbRessources ? nbRessources : ressource;
        if(nbToSend > 0)
        {
            nbRessources -= nbToSend;
            Squad s = Squad(*owner);
            s.setNbRessources(nbToSend);
            mapConnexion.value(nodeId)->sendSquad(s, getId());
        }
    }
}
Пример #19
0
void Commander::unitDestroyed(BaseAgent* agent) {
	int squadID = agent->getSquadID();
	if (squadID != -1) {
		Squad* squad = getSquad(squadID);
		if (squad != NULL) {
			squad->removeMember(agent);
		}
		// remove empty squad
		//for ( // I AM HERE
		if (squad->getMembers().size() == 0)
			squad->disband(squad->getCenter());
		//	squads.erase(squads.begin());
	}
}
Пример #20
0
// ----------------------------------------------------------------------
void Squad::combineWith(Squad & squad)
{
	LOGC(ConfigServerGame::isSpaceAiLoggingEnabled(), "space_debug_ai", ("Squad::combineWith() className(%s) squadId(%d) combineWithSquadId(%d)", getClassName(), m_id, squad.getId()));
	LOGC((ConfigServerGame::isSpaceAiLoggingEnabled() && squad.isEmpty()), "space_debug_ai", ("Squad::combineWith() className(%s) squadId(%d) combineWithSquadId(%d) Why are we combining with an empty squad?", getClassName(), m_id, squad.getId()));

	//-- Add all the units to this squad

	UnitMap::const_iterator iterUnitMap = squad.getUnitMap().begin();

	for (; iterUnitMap != squad.getUnitMap().end(); ++iterUnitMap)
	{
		NetworkId const & unit = iterUnitMap->first;
		addUnit(unit);
	}
}
Пример #21
0
void Commander::assignUnit(BaseAgent* agent)
{
	//Broodwar->printf("%s (%s) is not assigned to a squad", agent->getUnitType().getName().c_str(), agent->getTypeName().c_str());

	for (int i = 0; i < (int)squads.size(); i++)
	{
		Squad* sq = squads.at(i);
		if (sq->needUnit(agent->getUnitType()))
		{
			sq->addMember(agent);
			//Broodwar->printf("%s is assigned to SQ %d", agent->getUnitType().getName().c_str(), sq->getID());
			return;
		}
	}
}
Пример #22
0
void Commander::assistWorker(BaseAgent* worker)
{
	if (worker->getSquadID() != -1) return;
	if (!worker->getUnit()->isGatheringMinerals())
	{
		if (!worker->getUnit()->isGatheringGas())
		{
			return;
		}
	}

	//Find out who targets the worker
	TilePosition defPos = worker->getUnit()->getTilePosition();
	Unit* target = NULL;
	int bestScore = -1;

	for(set<Unit*>::const_iterator i=Broodwar->enemy()->getUnits().begin();i!=Broodwar->enemy()->getUnits().end();i++)
	{
		if ((*i)->exists())
		{
			double dist = (*i)->getDistance(Position(defPos));
			if (dist <= 13 * 32)
			{
				//Found a target
				if ((*i)->getType().destroyScore() > bestScore)
				{
					target = (*i);
					bestScore = (*i)->getType().destroyScore();
				}
			}
		}
	}

	if (target != NULL)
	{
		//Broodwar->printf("Assisting building: Targeting enemy %s", target->getType().getName().c_str());
		defPos = target->getTilePosition();
	}
	
	for (int i = 0; i < (int)squads.size(); i++)
	{
		Squad* sq = squads.at(i);
		if (!sq->isExplorer())
		{
			sq->assist(defPos);
		}
	}
}
Пример #23
0
bool SquadData::canAssignUnitToSquad(BWAPI::Unit unit, const Squad & squad) const
{
    const Squad * unitSquad = getUnitSquad(unit);

    // make sure strictly less than so we don't reassign to the same squad etc
    return !unitSquad || (unitSquad->getPriority() < squad.getPriority());
}
Пример #24
0
bool MarineAgent::useAbilities()
{
	//Load into a Bunker
	if (!unit->isLoaded())
	{
		Squad* sq = Commander::getInstance()->getSquad(squadID);
		if (sq != NULL)
		{
			if (sq->isBunkerDefend())
			{
				Agentset agents = AgentManager::getInstance()->getAgents();
				for (auto &a : agents)
				{
					if (a->isAlive() && a->isOfType(UnitTypes::Terran_Bunker) && a->getUnit()->exists())
					{
						if (a->getUnit()->getLoadedUnits().size() < 4)
						{
							unit->rightClick(a->getUnit());
							sq->setBunkerID(a->getUnitID());
							return true;
						}
					}
				}
			}
		}
	}

	//Use Stim Packs
	if (Broodwar->self()->hasResearched(TechTypes::Stim_Packs) && !unit->isStimmed() && unit->getHitPoints() >= 20 && !unit->isLoaded())
	{
		//Check if enemy units are visible
		for (auto &u : Broodwar->enemy()->getUnits())
		{
			if (u->exists())
			{
				if (unit->getDistance(u) <= unit->getType().sightRange())
				{
					unit->useTech(TechTypes::Stim_Packs);
					return true;
				}
			}
		}
	}

	return false;
}
Пример #25
0
void FirebatAgent::computeActions()
{
	if (!unit->isLoaded())
	{
		Squad* sq = Commander::getInstance()->getSquad(squadID);
		if (sq != NULL)
		{
			if (sq->isBunkerDefend())
			{
				vector<BaseAgent*> agents = AgentManager::getInstance()->getAgents();
				for (int i = 0; i < (int)agents.size(); i++)
				{
					if (agents.at(i)->isAlive() && agents.at(i)->isOfType(UnitTypes::Terran_Bunker))
				{
						if (agents.at(i)->getUnit()->getLoadedUnits().size() < 4)
				{
							unit->rightClick(agents.at(i)->getUnit());
							return;
						}
					}
				}
			}
		}
	}

	if (Broodwar->self()->hasResearched(TechTypes::Stim_Packs))
	{
		if (!unit->isStimmed() && unit->getHitPoints() >= 20)
		{
			if (unit->isAttacking())
			{
				unit->useTech(TechTypes::Stim_Packs);
				//Broodwar->printf("[%d] Using stim packs", unitID);
				return;
			}
		}
	}

	defensive = false;
	if (unit->getAirWeaponCooldown() > 2 || unit->getGroundWeaponCooldown() > 2) defensive = true;
	
	NavigationAgent::getInstance()->computeMove(this, goal, defensive);
	if (!defensive) TargetingAgent::checkTarget(this);
}
Пример #26
0
void AIPlayer::CheckBeingAttacked()
{
	for (int i = 0; i < m_SimMailbox.size(); ++i)
	{
		const Message* message = m_SimMailbox[i];
		switch (message->Type)
		{

		case MessageTypes::AI_MSG:
		{
			const AIMessage* openMsg = static_cast<const AIMessage*>(message);
			if (openMsg->TeamID == m_Team)
			{
				if (static_cast<AIStateMessages>(openMsg->AIMsg) == AIStateMessages::UNDER_ATTACK)
				{
					if (openMsg->SquadID >= m_Squads.size())
						continue;

					Squad* squadUnderAttack = m_Squads[openMsg->SquadID];
					Agent* agentUnderAttack = GetAgentPointer(openMsg->EntityID);

					if (squadUnderAttack->GetSize() == 0)
						continue;

					m_Brain.SquadIDUnderAttack = openMsg->SquadID;

					if (agentUnderAttack != nullptr)
					{
						m_Perceptions[PERCEPTION_UNDER_ATTACK] = 1;
						m_Brain.TimeSinceAttacked = 0;
						m_Brain.AgentUnderAttack = agentUnderAttack->GetEntityID();
					}
				}
			}
		}
		break;

		default:
			Logger::Log("Received unrecognized message", "SSAI", LogSeverity::WARNING_MSG);
			break;
		}
	}
}
Пример #27
0
void SiegeTankAgent::computeActions()
{
	if (Broodwar->self()->hasResearched(TechTypes::Tank_Siege_Mode))
	{
		bool goSiege = false;

		//If we have enemy targets nearby, go into siege mode
		int eCnt = enemyGroundUnitsWithinRange(getGroundRange(UnitTypes::Terran_Siege_Tank_Siege_Mode));
		if (eCnt > 0)
		{
			goSiege = true;
		}
		if (eCnt == 0)
		{
			goSiege = false;
		}

		//If we are defending and are at the defense position, go
		//in siege mode
		Squad* sq = Commander::getInstance()->getSquad(squadID);
		if (sq != NULL)
		{
			if (!sq->isActive())
			{
				int range = UnitTypes::Terran_Siege_Tank_Siege_Mode.groundWeapon().maxRange() * 0.5;
				double d = unit->getDistance(Position(goal));
				if (d <= range) goSiege = true;
			}
		}

		if (goSiege && !unit->isSieged()) unit->siege();
		if (!goSiege && unit->isSieged()) unit->unsiege();
	}

	defensive = false;
	TargetingAgent::checkTarget(this);

	//The tank cant move if sieged
	if (!unit->isSieged())
	{
		NavigationAgent::getInstance()->computeMove(this, goal, defensive);
	}
}
Пример #28
0
    // give back workers who were in squads
    BOOST_FOREACH (Squad & squad, squads)
	{
        const UnitVector & units = squad.getUnits();

        for (size_t u(0); u<units.size(); ++u)
        {
            if (units[u]->getType().isWorker())
            {
                WorkerManager::Instance().finishedWithWorker(units[u]);
            }
        }
	}
Пример #29
0
//----------------------------------------------------------------------------------------------------------------------
void GameWorld::draw(ngl::Camera* _cam, ngl::Mat4 _mouseGlobalTX)
{
    ngl::Material a(ngl::Colour(0.2f,0.2f,0.2f, 1.0), ngl::Colour(0.32f,0.31f,0.3f, 1.), ngl::Colour(0.77391f,0.77391f,0.77391f, 1.0));
    a.setSpecularExponent(20.f);
    a.loadToShader("material");
    loadMatricesToShader(_cam, _mouseGlobalTX);
    m_streetMesh->draw();

    ngl::Material b(ngl::Colour(0.2f,0.2f,0.2f, 1.0), ngl::Colour(0.45f,0.45f,0.45f, 1.), ngl::Colour(0.77391f,0.77391f,0.77391f, 1.0));
    b.setSpecularExponent(20.f);
    b.loadToShader("material");
    loadMatricesToShader(_cam, _mouseGlobalTX);
    m_buildingMesh->draw();

    for(unsigned int a=0; a<m_numberOfObstacles; ++a)
    {
        StaticEntity* currentObstacle = m_obstacles[a];
        currentObstacle->draw(_cam, _mouseGlobalTX);
    }

    for(unsigned int a=0; a<m_numberOfRioters; ++a)
    {
        Rioter* currentRioter = m_rioters[a];
        currentRioter->draw(_cam, _mouseGlobalTX);
    }

    m_numberOfSquads = m_squads.size();

    for(unsigned int a=0; a<m_numberOfSquads; ++a)
    {
        Squad* currentSquad = m_squads[a];
        currentSquad->draw(_cam, _mouseGlobalTX);
        if(currentSquad->getSquadState() == squadMove)
        {
            currentSquad->drawTarget(_cam, _mouseGlobalTX);
        }
    }


}
Пример #30
0
void PFManager::computeAttackingUnitActions(BaseAgent* agent, TilePosition goal, bool defensive, bool forceMove)
{
	Unit* unit = agent->getUnit();

	if (!defensive || !forceMove)
	{
		//if (agent->getUnit()->isStartingAttack()) return;
		if (agent->getUnit()->isAttacking()) return;
		if (agent->getUnit()->isSieged()) return;
	}
	if (agent->getUnit()->isLoaded()) return;

	//PF
	int unitX = unit->getPosition().x();
	int unitY = unit->getPosition().y();

	float bestP = getAttackingUnitP(agent, unitX, unitY, defensive);
	float cP = 0;
	
	float startP = bestP;
    int bestX = -1;
    int bestY = -1;

	for (int cX = unitX - checkRange; cX <= unitX + checkRange; cX += stepSize)
	{
        for (int cY = unitY - checkRange; cY <= unitY + checkRange; cY += stepSize)
		{
            if (cX >= 0 && cY >= 0 && cX <= mapW && cY <= mapH)
			{
				cP = getAttackingUnitP(agent, cX, cY, defensive);
				//Broodwar->printf("p(%d,%d)=%d",cX,cY,cP);

                if (cP != bestP)
				{
					bestP = cP;
                    bestX = cX;
                    bestY = cY;
                }
            }
        }
    }
	
	if (bestX >= 0 && bestY >= 0)
	{
		Position toMove(bestX, bestY);
		if (!defensive)
		{
			unit->attack(toMove);
		}
		else
		{
			unit->rightClick(toMove);
		}
		return;
    }
	//EndPF

	TilePosition checkpoint = goal;
	if (agent->getSquadID() >= 0)
	{
		Squad* sq = Commander::getInstance()->getSquad(agent->getSquadID());
		if (sq != NULL)
		{
			checkpoint = sq->nextMovePosition();
		}
	}
	
	if (goal.x() != -1)
	{
		moveToGoal(agent, checkpoint, goal);
	}
}