void UniteUtilitaire::convertir(Unite* ennemi , Player* joueur, Player* joueurEnnemi)
{
	if (outil == Outil::convertisseur) {
		int index = -1;
		for (int i = 0; i < joueurEnnemi->getNombreUnite(); i++) {
			if (joueurEnnemi->getUnite(i)->getCoordX() == ennemi->getCoordX() && joueurEnnemi->getUnite(i)->getCoordY() == ennemi->getCoordY()) {
				index = i;
				break;
			}
		}
		if (joueurEnnemi->getUnite(index)->isUtilitaire()) {
			UniteUtilitaire* u = (UniteUtilitaire*)joueurEnnemi->getUnite(index);
			if (u->estPlein()) {
				Unite* temp = u->getUnite();
				for (int i = 0; i < joueurEnnemi->getNombreUnite(); i++) {
					if (joueurEnnemi->getUnite(i)->getCoordX() == temp->getCoordX() && joueurEnnemi->getUnite(i)->getCoordY() == temp->getCoordY()) {
						joueurEnnemi->detruireUnite(i);
					}
				}
			}
		}
		joueur->creerUnite(ennemi, ennemi->getResistance());
		joueurEnnemi->detruireUnite(index);
		outilRestant--;
		setAAgi();
	}
}
void RTSSelectedUnitsCommand::addBuild(const TypeUnite *type, int count)
{
    if (m_availableBuilds.find(type) != m_availableBuilds.end())
    {
        EngineMessage message(nullptr);
        message.message = mf::EngineMessageType::BUILD;
        message.ints[mf::EngineMessageKey::OBJECT_TYPE] = type->id();
        message.ints[mf::EngineMessageKey::COUNT] = count;
        message.ints[mf::EngineMessageKey::TEAM_ID] = m_rtsState->game()->getCurrentJoueur()->equipe()->id();
        ClientNetworkEngine *network = m_rtsState->game()->clientNetwork();
        for (WorldObject * object : m_selection)
        {
            Unite *unite = dynamic_cast<Unite*>(object);
            message.ints[mf::EngineMessageKey::BUILDER] = unite->id();
            network->sendToServerTcp(message);
        }
    }
}
void RTSSelectedUnitsCommand::changeSelection(const std::vector<WorldObject *> &selection)
{
    m_selection = selection;
    m_availableBuilds.clear();
    std::vector<const std::vector<TypeUnite *>*> available;
    for (WorldObject * object : m_selection)
    {
        Unite *unite = dynamic_cast<Unite *>(object);
        if (unite)
        {
            available.push_back(&unite->type()->construit());
        }
        else
        {
            available.clear();
            break;
        }
    }

    for (auto * types : available)
    {
        for (TypeUnite * type : *types)
        {
            bool add = true;
            for (const std::vector<TypeUnite *> *typesToTest : available)
            {
                auto it = std::find(typesToTest->begin(), typesToTest->end(), type);
                if (it == typesToTest->end())
                {
                    add = false;
                    break;
                }
            }
            if (add)
            {
                m_availableBuilds.insert(type);
            }
        }
    }
}
Beispiel #4
0
void Player::decouvre() {
	for (unsigned int i = 0; i < listUnite.size(); i++) {
		Unite* unite = listUnite[i];
		for (int j = unite->getCoordY() - unite->getChampVision(); j < unite->getCoordY() + unite->getChampVision(); j++) {
			if (j >= 0 && j < MAP_HEIGTH) {
				for (int k = 1 + unite->getCoordX() - (unite->getChampVision() - abs(j - unite->getCoordY())); k < unite->getCoordX() + (unite->getChampVision() - abs(j - unite->getCoordY()));k++) {
					if (k >= 0 && k < MAP_WIDTH) {
						caseDecouverte[k][j] = true;
					}
				}
			}
		}
	}
}
Beispiel #5
0
Uint32 gestionAction(Uint32 intervalle, void *arg)
{
    ObjetMap *temp, *cible;
    Unite *n;

    for(int i=0;i< m->getvec().size();i++)
    {
        temp=m->getvec()[i];
        if(temp->gettype()==PEON || temp->gettype()==LANCIER)
        {
            SDL_mutexP(mutexObjet);
            n = (Unite*)temp;
            if(n->getStatut()==DEPLACEMENT)
            {
                point coordActuel=n->getc1(), coordDesti=n->getdesti();
                if(coordActuel.x==coordDesti.x && coordActuel.y==coordDesti.y)
                {
                    n->setStatut(AFK);
                    n->setCible(NULL);
                }
                else
                {
                    deplaceToi(n, coordDesti.x, coordDesti.y);
                }

            }
            if(n->getStatut()==COLLECTE)
            {
                point coordActuel=n->getc1(), coordDesti=(n->getcible())->getc1();
                if(abs(coordActuel.x-coordDesti.x)<=1 && abs(coordActuel.y-coordDesti.y)<=1)
                {
                    cible=n->getcible();
                    cible->setpv(cible->getpv()-1);
                    if(cible->gettype()==BLE)
                    {
                        joueur1.setmiam(joueur1.getmiam()+1);
                    }
                    else
                    {
                        joueur1.setbois(joueur1.getbois()+1);
                    }
                 }
                 else
                 {
                     deplaceToi(n, coordDesti.x, coordDesti.y);
                 }
            }
            if(n->getStatut()==ATTAQUE)
            {
                point coordActuel=n->getc1(), coordDesti=(n->getcible())->getc1();
                if(abs(coordActuel.x-coordDesti.x)<=1 && abs(coordActuel.y-coordDesti.y)<=1)
                {
                    cible=n->getcible();
                    cible->setpv(cible->getpv()-n->getPa());
                 }
                 else
                 {
                     deplaceToi(n, coordDesti.x, coordDesti.y);
                 }
            }
            SDL_mutexV(mutexObjet);
        }
    }
    return intervalle;
}
Beispiel #6
0
void gestionCliqueD(int cliqueX, int cliqueY)
{
    if(objetReadyToDrop != 0)
    {
        objetReadyToDrop = 0;
    }
    else if(cliqueY<maxH-MENU_H)// si on est hors du menu
    {
        Position positionVue;
        SDL_mutexP(mutexInput);
            positionVue.offsetCaseX=maPosition.offsetCaseX;
            positionVue.offsetCaseY=maPosition.offsetCaseY;
            positionVue.offsetPositionX=maPosition.offsetPositionX;
            positionVue.offsetPositionY=maPosition.offsetPositionY;
        SDL_mutexV(mutexInput);

        cliqueX=(int)(cliqueX+positionVue.offsetPositionX)/TILE_SIZE+positionVue.offsetCaseX;
        cliqueY=(int)(cliqueY+positionVue.offsetPositionY)/TILE_SIZE+positionVue.offsetCaseY;

        if(currentObj!=NULL && currentObj->getcamp()==0)
        {
            bool rien=true;
            Unite *n;

            ObjetMap *temp;
            for(int i=0;i< m->getvec().size();i++)
            {
                temp=m->getvec()[i];
                if(cliqueX>=((point)temp->getc1()).x  && cliqueX<=(((point)temp->getc1()).x+temp->getnum()) && cliqueY>=((point)temp->getc1()).y  && cliqueY<=(((point)temp->getc1()).y+temp->getnum()) )
                {
                    rien=false;
                    SDL_mutexP(mutexObjet);
                    if(currentObj->gettype()==PEON)
                    {
                        if(temp->gettype()==FORET || temp->gettype()==BLE)
                        {
                            n = (Unite*)currentObj;
                            n->setCible(temp);
                            n->setStatut(COLLECTE);
                        }
                        else
                        {
                             n = (Unite*)currentObj;
                            n->setStatut(AFK);
                            n->setCible(NULL);
                        }
                    }
                    else if(currentObj->gettype()==LANCIER)
                    {
                        if((temp->gettype()==FORUM || temp->gettype()==CASERNE || temp->gettype()==PEON || temp->gettype()==LANCIER) && (temp->getcamp()==1))
                        {
                            n = (Unite*)currentObj;
                            n->setCible(temp);
                            n->setStatut(ATTAQUE);
                        }
                        else
                        {
                            n = (Unite*)currentObj;
                            n->setStatut(AFK);
                            n->setCible(NULL);
                        }
                    }
                    SDL_mutexV(mutexObjet);
                }
            }

            if(rien)
            {
                if(currentObj->gettype()==PEON || currentObj->gettype()==LANCIER)
                {
                    SDL_mutexP(mutexObjet);
                    n = (Unite*)currentObj;
                    n->setStatut(DEPLACEMENT);
                    n->setdesti(cliqueX, cliqueY);
                    SDL_mutexV(mutexObjet);
                }
            }
        }
    }
}