Esempio n. 1
0
/// Erhält die Waren von einem Schiff und nimmt diese in den Warenbestand auf
void nobHarborBuilding::ReceiveGoodsFromShip(std::list<noFigure*>& figures, std::list<Ware*>& wares)
{
    // Menschen zur Ausgehliste hinzufügen
    for(std::list<noFigure*>::const_iterator it = figures.begin(); it != figures.end(); ++it)
    {
        (*it)->ArrivedByShip(pos);

        // Wenn es kein Ziel mehr hat, sprich keinen weiteren Weg, kann es direkt hier gelagert werden
        if((*it)->GetGoal() == this)
            (*it)->SetGoalToNULL();
        else if(!(*it)->HasNoGoal())
        {
            unsigned char nextDir;
            MapPoint next_harbor = (*it)->ExamineRouteBeforeShipping(nextDir);

            if (nextDir == 4)
            {
                // Increase visual count
                if((*it)->GetJobType() == JOB_BOATCARRIER)
                {
                    inventory.visual.Add(JOB_HELPER);
                    inventory.visual.Add(GD_BOAT);
                }
                else
                    inventory.visual.Add((*it)->GetJobType());
                AddLeavingFigure(*it);
                (*it)->ShipJourneyEnded();
            }
            else if (nextDir == SHIP_DIR)
            {
                AddFigureForShip(*it, next_harbor);
            }else
            {
                // No or invalid path -> Store here
                RTTR_Assert(nextDir == 0xFF);
                (*it)->SetGoalToNULL();
                AddDependentFigure(*it);
            }
        }else
            AddDependentFigure(*it); // No goal? We take it
        if ((*it)->HasNoGoal())
             AddFigure(*it, true);
    }
    figures.clear();

    // Waren zur Warteliste hinzufügen
    for(std::list<Ware*>::iterator it = wares.begin(); it != wares.end(); ++it)
    {
        (*it)->ShipJorneyEnded(this);
        AddWare(*it);
    }
    wares.clear();
}
/// Dasselbe für Menschen
bool nobHarborBuilding::UseFigureAtOnce(noFigure * fig, noRoadNode* const goal)
{
	// Evtl. muss die Ware gleich das Schiff nehmen -> 
	// dann zum Schiffsreservoir hinzufügen
	Point<MapCoord> next_harbor;
	if(gwg->FindHumanPathOnRoads(this,goal,NULL,&next_harbor) == SHIP_DIR)
	{
		// Reduce figure count because figues don't go through the house leaving process
		// And therefore the visual count reducement
		goods.people[fig->GetJobType()]--;
		// Dann fügen wir die mal bei uns hinzu
		AddFigureForShip(fig,next_harbor);
		return true;
	}

	return false;
}
Esempio n. 3
0
/// Dasselbe für Menschen
bool nobHarborBuilding::UseFigureAtOnce(noFigure* fig, noRoadNode& goal)
{
    // If the figure needs to take a ship, add it to the ships inventory

    // If the goal is this building don't handle it
    if(this == &goal)
        return false;

    MapPoint next_harbor;
    if(gwg->FindHumanPathOnRoads(*this, goal, NULL, &next_harbor) == SHIP_DIR)
    {
        // Reduce figure count because figues don't go through the house leaving process
        // And therefore the visual count reducement
        inventory.visual.Remove(fig->GetJobType());
        // Dann fügen wir die mal bei uns hinzu
        AddFigureForShip(fig, next_harbor);
        return true;
    }

    return false;
}
/// Erhält die Waren von einem Schiff und nimmt diese in den Warenbestand auf
void nobHarborBuilding::ReceiveGoodsFromShip(const std::list<noFigure*> figures, const std::list<Ware*> wares)
{
	// Menschen zur Ausgehliste hinzufügen
	for(std::list<noFigure*>::const_iterator it = figures.begin();it!=figures.end();++it)
	{
		if((*it)->GetJobType() == JOB_BOATCARRIER)
		{
			++goods.people[JOB_HELPER];
			++goods.goods[GD_BOAT];
		}
		else
			++goods.people[(*it)->GetJobType()];

		// Wenn es kein Ziel mehr hat, sprich keinen weiteren Weg, kann es direkt hier gelagert
		// werden
		if ((*it)->HasNoGoal() || ((*it)->GetGoal() == this))
		{
			AddFigure(*it, false);
		} else
		{
			Point<MapCoord> next_harbor = (*it)->ExamineRouteBeforeShipping();
			unsigned char next_dir = (*it)->GetDir();

			if (next_dir == 4)
			{
				AddLeavingFigure(*it);
				(*it)->ShipJourneyEnded();
			} else if (next_dir == SHIP_DIR)
			{
				AddFigureForShip(*it, next_harbor);
			} else
			{
				AddFigure(*it, false);
			}
		}
	}

	// Waren zur Warteliste hinzufügen
	for(std::list<Ware*>::const_iterator it = wares.begin();it!=wares.end();++it)
	{
		// Optische Warenwerte entsprechend erhöhen
		++goods.goods[ConvertShields((*it)->type)];
		if((*it)->ShipJorneyEnded(this))
		{
			
			// Ware will die weitere Reise antreten, also muss sie zur Liste der rausgetragenen Waren
			// hinzugefügt werden
			waiting_wares.push_back(*it);
		}
		else
		{
			// Ansonsten fügen wir die Ware einfach zu unserem Inventar dazu
			RemoveDependentWare(*it);
			++real_goods.goods[ConvertShields((*it)->type)];
			players->getElement(player)->RemoveWare(*it);
			delete *it;
		}
	}

	// Ggf. neues Rausgeh-Event anmelden, was notwendig ist, wenn z.B. nur Waren zur Liste hinzugefügt wurden
	AddLeavingEvent();
}