Esempio n. 1
0
/// Sagt Bescheid, dass ein Schiffsangreifer nicht mehr mit nach Hause fahren will
void noShip::SeaAttackerWishesNoReturn()
{
    assert(remaining_sea_attackers);
    --remaining_sea_attackers;
    // Alle Soldaten an Bord
    if(remaining_sea_attackers == 0)
    {
        // Andere Events ggf. erstmal abmelden
        em->RemoveEvent(current_ev);
        if(!figures.empty())
        {
            //set it to 1 so we "know" that we are driving back not any transport but a group of sea attackers (reset @ handleevent unload transport, used when target harbor dies to set the soldiers goal to 0)
            remaining_sea_attackers = 1;
            // Wieder nach Hause fahren
            goal_harbor_id = home_harbor;
            StartDrivingToHarborPlace();
            state = STATE_TRANSPORT_DRIVING;
            HandleState_TransportDriving();
            for(std::list<noFigure*>::iterator it = figures.begin(); it != figures.end(); ++it)
                (*it)->StartShipJourney(gwg->GetHarborPoint(goal_harbor_id));
        }
        else
        {
            // Wenn keine Soldaten mehr da sind können wir auch erstmal idlen
            StartIdling();
            players->getElement(player)->GetJobForShip(this);
        }
    }

}
Esempio n. 2
0
/// Sagt dem Schiff, dass ein neuer Hafen erbaut wurde
void noShip::NewHarborBuilt(nobHarborBuilding* hb)
{
    if(lost)
    {
        // Liegt der Hafen auch am Meer von diesem Schiff?
        if(!gwg->IsAtThisSea(hb->GetHarborPosID(), seaId_))
            return;
        //LOG.lprintf("lost ship has new goal harbor player %i state %i pos %u,%u \n",player,state,x,y);
        home_harbor = goal_harbor_id = hb->GetHarborPosID();
        lost = false;

        StartDrivingToHarborPlace();

        switch(state)
        {
            case STATE_EXPLORATIONEXPEDITION_DRIVING:
            case STATE_EXPEDITION_DRIVING:
            case STATE_TRANSPORT_DRIVING:
            {
                Driven();
            } break;
            default: assert(false); // Das darf eigentlich nicht passieren
        }

    }
}
Esempio n. 3
0
/// Weist das Schiff an, eine Expedition abzubrechen (nur wenn es steht) und zum
/// Hafen zurückzukehren
void noShip::CancelExpedition()
{
    // Protect against double execution
    if(state != STATE_EXPEDITION_WAITING)
        return;

    // We are waiting. There should be no event!
    RTTR_Assert(!current_ev);

    // Zum Heimathafen zurückkehren
    // Oder sind wir schon dort?
    if(goal_harborId == home_harbor)
    {
        route_.clear();
        curRouteIdx = 0;
        state = STATE_EXPEDITION_DRIVING; //just in case the home harbor was destroyed
        HandleState_ExpeditionDriving();
    }
    else
    {
        state = STATE_EXPEDITION_DRIVING;
        goal_harborId = home_harbor;
        StartDrivingToHarborPlace();
        HandleState_ExpeditionDriving();
    }
}
Esempio n. 4
0
/// Sagt dem Schiff, dass ein neuer Hafen erbaut wurde
void noShip::NewHarborBuilt(nobHarborBuilding* hb)
{
    if(!lost)
        return;
    // Liegt der Hafen auch am Meer von diesem Schiff?
    if(!gwg->IsHarborAtSea(hb->GetHarborPosID(), seaId_))
        return;

    //LOG.write(("lost ship has new goal harbor player %i state %i pos %u,%u \n",player,state,x,y);
    home_harbor = goal_harborId = hb->GetHarborPosID();
    lost = false;

    StartDrivingToHarborPlace();

    switch(state)
    {
    case STATE_EXPLORATIONEXPEDITION_DRIVING:
    case STATE_EXPEDITION_DRIVING:
    case STATE_TRANSPORT_DRIVING:
    case STATE_SEAATTACK_RETURN_DRIVING:
        Driven();
        break;
    default:
        RTTR_Assert(false); // Das darf eigentlich nicht passieren
        LOG.write("Bug detected: Invalid state in NewHarborBuilt");
        break;
    }
}
Esempio n. 5
0
/// Sagt Bescheid, dass ein Schiffsangreifer nicht mehr mit nach Hause fahren will
void noShip::SeaAttackerWishesNoReturn()
{
    RTTR_Assert(remaining_sea_attackers);
    RTTR_Assert(state == STATE_SEAATTACK_WAITING);

    --remaining_sea_attackers;
    // Alle Soldaten an Bord
    if(remaining_sea_attackers == 0)
    {
        // Andere Events ggf. erstmal abmelden
        GetEvMgr().RemoveEvent(current_ev);
        if(!figures.empty())
        {
            // Go back home. Note: home_harbor can be 0 if it was destroyed, allow this and let the state handlers handle that case later
            goal_harborId = home_harbor;
            state = STATE_SEAATTACK_RETURN_DRIVING;
            StartDrivingToHarborPlace();
            HandleState_SeaAttackReturn();
        }
        else
        {
            // Wenn keine Soldaten mehr da sind können wir auch erstmal idlen
            StartIdling();
            gwg->GetPlayer(player).GetJobForShip(this);
        }
    }

}
Esempio n. 6
0
/// Startet die eigentliche Transportaktion, nachdem das Schiff beladen wurde
void noShip::StartTransport()
{
    state = STATE_TRANSPORT_DRIVING;

    StartDrivingToHarborPlace();
    // Einfach weiterfahren
    HandleState_TransportDriving();
}
Esempio n. 7
0
/// Weist das Schiff an, eine Expedition abzubrechen (nur wenn es steht) und zum
/// Hafen zurückzukehren
void noShip::CancelExpedition()
{
    // Zum Heimathafen zurückkehren
    // Oder sind wir schon dort?
    if(goal_harbor_id == home_harbor)
    {
        route_.clear();
        curRouteIdx = 0;
        state = STATE_EXPEDITION_DRIVING; //just in case the home harbor was destroyed
        HandleState_ExpeditionDriving();
    }
    else
    {
        state = STATE_EXPEDITION_DRIVING;
        goal_harbor_id = home_harbor;
        StartDrivingToHarborPlace();
        HandleState_ExpeditionDriving();
    }
}
Esempio n. 8
0
/// Weist das Schiff an, seine Erkundungs-Expedition fortzusetzen
void noShip::ContinueExplorationExpedition()
{
    // Sind wir schon über unserem Limit, also zu weit gefahren
    if(covered_distance >= MAX_EXPLORATION_EXPEDITION_DISTANCE)
    {
        // Ggf. sind wir schon da?
        if(goal_harbor_id == home_harbor)
        {
            // Dann sind wir fertig -> wieder entladen
            state = STATE_EXPLORATIONEXPEDITION_UNLOADING;
            current_ev = em->AddEvent(this, UNLOADING_TIME, 1);
            return;
        }


        // Dann steuern wir unseren Heimathafen an!
        goal_harbor_id = home_harbor;


    }
    else
    {
        // Nächsten Zielpunkt bestimmen
        std::vector<unsigned> hps;
        gwg->GetHarborPointsWithinReach(goal_harbor_id, hps);

        // Keine möglichen Häfen gefunden?
        if(hps.size() == 0)
            // Dann wieder Heimathafen ansteuern
            goal_harbor_id = home_harbor;

        else
            // Zufällig den nächsten Hafen auswählen
            goal_harbor_id = hps[RANDOM.Rand(__FILE__, __LINE__, GetObjId(), hps.size())];
    }

    StartDrivingToHarborPlace();
    state = STATE_EXPLORATIONEXPEDITION_DRIVING;
    HandleState_ExplorationExpeditionDriving();
}
Esempio n. 9
0
/// Startet Schiffs-Angreiff
void noShip::StartSeaAttack()
{
    state = STATE_SEAATTACK_DRIVINGTODESTINATION;
    StartDrivingToHarborPlace();
    HandleState_SeaAttackDriving();
}