Exemplo n.º 1
0
void nofBuilder::GoalReached()
{
    goal_ = NULL;
    // an der Baustelle normal anfangen zu arbeiten
    state = STATE_WAITINGFREEWALK;

    // Sind jetzt an der Baustelle
    rel_x = rel_y = 0;

    // Anfangen um die Baustelle herumzulaufen
    StartFreewalk();
}
Exemplo n.º 2
0
void nofBuilder::HandleDerivedEvent(const unsigned int id)
{
    switch(state)
    {
        case STATE_WAITINGFREEWALK:
        {
            // Platz einnehmen
            rel_x = next_rel_x;
            rel_y = next_rel_y;

            // Ware aufnehmen, falls es eine gibt
            if(ChooseWare())
                state = STATE_BUILDFREEWALK;

            // Weiter drumrumlaufen
            StartFreewalk();
        } break;
        case STATE_BUILDFREEWALK:
        {
            // Platz einnehmen
            rel_x = next_rel_x;
            rel_y = next_rel_y;

            // Gibts noch was zu bauen?
            if(building_steps_available)
            {
                // dann mal schön bauen
                current_ev = em->AddEvent(this, 40, 1);
                state = STATE_BUILD;
            }
            else if(building_site->IsBuildingComplete())
            {
                // fertig mit Bauen!

                // Baustelle abreißen und Gebäude hinsetzen

                // Gebäudetyp merken und das Volk des Gebäudes
                BuildingType building_type = building_site->GetBuildingType();
                Nation building_nation = building_site->GetNation();

                state = STATE_FIGUREWORK;

                // Baustelle abmelden
                GameClientPlayer& owner = gwg->GetPlayer(player);
                owner.RemoveBuildingSite(building_site);

                // ggf. Baustellenfenster schließen
                gwg->ImportantObjectDestroyed(building_site->GetPos());

                // Baustelle kommt in den Bytehimmel
                gwg->SetNO(NULL, building_site->GetPos());
                delete building_site;

                // KI-Event schicken
                GAMECLIENT.SendAIEvent(new AIEvent::Building(AIEvent::BuildingFinished, pos, building_type), player);

                noBuilding* bld = BuildingFactory::CreateBuilding(gwg, building_type, pos, player, building_nation);

                // Special handling for storehouses and harbours
                if(building_type == BLD_STOREHOUSE || building_type == BLD_HARBORBUILDING){
                    nobBaseWarehouse* wh = static_cast<nobBaseWarehouse*>(bld);
                    // Mich dort gleich einquartieren und nicht erst zurücklaufen
                    wh->AddFigure(this);
                    gwg->RemoveFigure(this, pos);

                    // Evtl Träger aus dem HQ wieder verwenden
                    owner.FindWarehouseForAllRoads();
                    owner.FindWarehouseForAllJobs(JOB_HELPER);

                    // Evtl gabs verlorene Waren, die jetzt in das HQ wieder reinkönnen
                    owner.FindClientForLostWares();

                    return;
                }

                // Nach Hause laufen bzw. auch rumirren
                rs_pos = 0;
                rs_dir = true;
                cur_rs = gwg->GetSpecObj<noRoadNode>(pos)->routes[4];
                building_site = 0;

                GoHome();
                StartWalking(4);

            }
            else
            {
                // Brauchen neues Material

                // Ware aufnehmen, falls es eine gibt
                if(!ChooseWare())
                    state = STATE_WAITINGFREEWALK;

                // Weiter drumrumlaufen
                StartFreewalk();
            }

        } break;
        case STATE_BUILD:
        {
            // Sounds abmelden
            SOUNDMANAGER.WorkingFinished(this);

            // ein Bauschritt weniger, Haus um eins höher
            --building_steps_available;
            ++building_site->build_progress;
            // Fertig mit dem Bauschritt, dann an nächste Position gehen
            state = STATE_BUILDFREEWALK;
            StartFreewalk();
        } break;
        default: break;
    }
}