Example #1
0
/**
 *
 *
 *  @author OLiver
 */
void nobUsual::Destroy_nobUsual()
{
    // Arbeiter Bescheid sagen
    if(worker)
    {
        worker->LostWork();
        worker = NULL;
    }else
        gwg->GetPlayer(player).JobNotWanted(this);

    // Bestellte Waren Bescheid sagen
    for(unsigned i = 0; i < USUAL_BUILDING_CONSTS[type_ - 10].wares_needed_count; ++i)
    {
        for(std::list<Ware*>::iterator it = ordered_wares[i].begin(); it != ordered_wares[i].end(); ++it)
            WareNotNeeded((*it));
        ordered_wares[i].clear();
    }

    // Events löschen
    em->RemoveEvent(orderware_ev);
    em->RemoveEvent(productivity_ev);
    orderware_ev = NULL;
    productivity_ev = NULL;

    // Gebäude wieder aus der Liste entfernen
    gwg->GetPlayer(player).RemoveUsualBuilding(this);

    // Inventur entsprechend verringern wegen den Waren, die vernichtetet werden
    for(unsigned i = 0; i < USUAL_BUILDING_CONSTS[type_ - 10].wares_needed_count; ++i)
        gwg->GetPlayer(player).DecreaseInventoryWare(USUAL_BUILDING_CONSTS[type_ - 10].wares_needed[i], wares[i]);

    Destroy_noBuilding();
}
Example #2
0
void nobBaseMilitary::Destroy_nobBaseMilitary()
{
    // Soldaten Bescheid sagen, die evtl auf Mission sind
    // ATTENTION: iterators can be deleted in HomeDestroyed, -> copy first
    std::vector<nofActiveSoldier*> tmposroopsOnMission(troops_on_mission.begin(), troops_on_mission.end());
    for(std::vector<nofActiveSoldier*>::iterator it = tmposroopsOnMission.begin(); it != tmposroopsOnMission.end(); ++it)
        (*it)->HomeDestroyed();

    // Und die, die das Gebäude evtl gerade angreifen
    // ATTENTION: iterators can be deleted in AttackedGoalDestroyed, -> copy first
    std::vector<nofAttacker*> tmpAggressors(aggressors.begin(), aggressors.end());
    for(std::vector<nofAttacker*>::iterator it = tmpAggressors.begin(); it != tmpAggressors.end(); ++it)
        (*it)->AttackedGoalDestroyed();

    // Aggressiv-Verteidigenden Soldaten Bescheid sagen, dass sie nach Hause gehen können
    std::vector<nofAggressiveDefender*> tmpDefenders(aggressive_defenders.begin(), aggressive_defenders.end());
    for(std::vector<nofAggressiveDefender*>::iterator it = tmpDefenders.begin(); it != tmpDefenders.end(); ++it)
        (*it)->AttackedGoalDestroyed();

    // Verteidiger Bescheid sagen
    if(defender_)
        defender_->HomeDestroyed();

    // Warteschlangenevent vernichten
    em->RemoveEvent(leaving_event);

    // Soldaten, die noch in der Warteschlange hängen, rausschicken
    for(std::list<noFigure*>::iterator it = leave_house.begin(); it != leave_house.end(); ++it)
    {
        gwg->AddFigure((*it), pos);

        if((*it)->DoJobWorks() && dynamic_cast<nofActiveSoldier*>(*it))
            // Wenn er Job-Arbeiten verrichtet, ists ein ActiveSoldier oder TradeDonkey --> dem Soldat muss extra noch Bescheid gesagt werden!
            static_cast<nofActiveSoldier*>(*it)->HomeDestroyedAtBegin();
        else
        {
            (*it)->Abrogate();
            (*it)->StartWandering();
            (*it)->StartWalking(RANDOM.Rand(__FILE__, __LINE__, GetObjId(), 6));
        }
    }

    leave_house.clear();

    // Umgebung nach feindlichen Militärgebäuden absuchen und die ihre Grenzflaggen neu berechnen lassen
    // da, wir ja nicht mehr existieren
    sortedMilitaryBlds buildings = gwg->LookForMilitaryBuildings(pos, 4);
    for(sortedMilitaryBlds::iterator it = buildings.begin(); it != buildings.end(); ++it)
    {
        if((*it)->GetPlayer() != player
                && (*it)->GetBuildingType() >= BLD_BARRACKS  && (*it)->GetBuildingType() <= BLD_FORTRESS)
            static_cast<nobMilitary*>(*it)->LookForEnemyBuildings(this);
    }


    Destroy_noBuilding();
}