/// Behandelt das Laufen zurück zum Schiff
void nofAttacker::HandleState_SeaAttack_ReturnToShip()
{
    // Ist evtl. unser Heimatgebäude zerstört?
    if(!building)
    {
        // Rumirren
        state = STATE_FIGUREWORK;
        StartWandering();
        Wander();

        // Schiff Bescheid sagen
        CancelAtShip();
        return;
    }

    // Sind wir schon im Schiff?
    if(pos == shipPos)
    {
        // Alle Figuren durchgehen
        for(noBase* figure : gwg->GetFigures(pos))
        {
            if(figure->GetObjId() == ship_obj_id)
            {
                StartReturnViaShip(static_cast<noShip&>(*figure));
                return;
            }
        }

        RTTR_Assert(false);
        ship_obj_id = 0;
        // Kein Schiff gefunden? Das kann eigentlich nich sein!
        // Dann rumirren
        StartWandering();
        state = STATE_FIGUREWORK;
        Wander();
        return;
    }
    unsigned char dir = gwg->FindHumanPath(pos, shipPos, MAX_ATTACKING_RUN_DISTANCE);
    // oder finden wir gar keinen Weg mehr?
    if(dir == 0xFF)
    {
        // Kein Weg gefunden --> Rumirren
        StartWandering();
        state = STATE_FIGUREWORK;
        Wander();

        // Dem Heimatgebäude Bescheid sagen
        building->SoldierLost(this);
        // Und dem Schiff
        CancelAtShip();
    }
    // oder ist alles ok? :)
    else
    {
        // weiterlaufen
        StartWalking(Direction(dir));
    }
}
Example #2
0
/// Behandelt das Laufen zurück zum Schiff
void nofAttacker::HandleState_SeaAttack_ReturnToShip()
{
    // Ist evtl. unser Heimatgebäude zerstört?
    if(!building)
    {
        // Rumirren
        state = STATE_FIGUREWORK;
        StartWandering();
        Wander();

        // Schiff Bescheid sagen
        CancelAtShip();

        return;
    }

    // Sind wir schon im Schiff?
    if(pos == shipPos)
    {
        // Alle Figuren durchgehen
        std::vector<noBase*> figures = gwg->GetDynamicObjectsFrom(pos);
        for(std::vector<noBase*>::iterator it = figures.begin(); it != figures.end(); ++it)
        {
            if((*it)->GetObjId() == ship_obj_id)
            {
                noShip* ship = static_cast<noShip*>(*it);
                // Und von der Landkarte tilgen
                gwg->RemoveFigure(this, pos);
                // Uns zum Schiff hinzufügen
                ship->AddAttacker(this);

                state = STATE_FIGUREWORK;
                fs = FS_GOTOGOAL;
                StartReturnViaShip();
                return;
            }
        }

        // Kein Schiff gefunden? Das kann eigentlich nich sein!
        // Dann rumirren
        StartWandering();
        state = STATE_FIGUREWORK;
        Wander();
    }
    // oder finden wir gar keinen Weg mehr?
    else if((dir = gwg->FindHumanPath(pos, shipPos, MAX_ATTACKING_RUN_DISTANCE)) == 0xFF)
    {
        // Kein Weg gefunden --> Rumirren
        StartWandering();
        state = STATE_FIGUREWORK;
        Wander();

        // Dem Heimatgebäude Bescheid sagen
        building->SoldierLost(this);
        // Und dem Schiff
        CancelAtShip();
    }
    // oder ist alles ok? :)
    else
    {
        // weiterlaufen
        StartWalking(dir);
    }

}