void Enemigo::atacar(string& NickAtacado,PlayerManager& pm,ServerSocket& socks){ BitStream bs; int danio = intRand(0,30); //resto danio si ataca a un golem o a un enemigo bool encontro = false; bool murio = false; for(auto it = pm.getEnemies().begin();it !=pm.getEnemies().end();it++) { Enemigo* unEnemigo = it->second; if(unEnemigo->getNick() == NickAtacado){ unEnemigo->hacerDanio(danio); encontro = true; if(!it->second->estaVivo()){ murio = true; pm.getEnemies().erase(it); break; } } } //para golem if(!encontro){ for(auto it = pm.getGolems().begin();it !=pm.getGolems().end();it++) { Golem* unGolem = it->second; if(unGolem->getNick() == NickAtacado){ unGolem->hacerDanio(danio); if(!it->second->estaVivo()){ //aviso a los demas que murio enemigo murio = true; pm.getGolems().erase(it); break; } } } } //aviso del ataque for(auto it = socks.get_clients().begin();it !=socks.get_clients().end();it++) { //ataco con la danio bs.clear(); bs << PROTO::ATACAR << this->getNick() << NickAtacado; it->second.send(bs.str()); //mando danio bs.clear(); bs << PROTO::DAMAGE << this->getNick() << NickAtacado << danio; it->second.send(bs.str()); std::cout << "Update " << it->second.nick << " que " << this->getNick() << "->" << NickAtacado << endl; //aviso si murio if(murio){ //Veo si termino la mision if (mision.getTipo() == Misiones::MISION_ENEMIGO) { if (mision.enemigoMision() == NickAtacado) { bs.clear(); bs << PROTO::WINNER << pm.getEnemy(NickAtacado)->ultimoAtacante(); it->second.send(bs.str()); } } else { bs.clear(); bs << PROTO::ENEMY_DEAD << NickAtacado; it->second.send(bs.str()); } } } return; }