RoadSegment* RoadSegment::create(TypeRoad type, bool isBegin, const Vec2& pos )
{
	RoadSegment* pRet = new RoadSegment(type, isBegin, pos);
	if (pRet && pRet->init())
	{
		pRet->autorelease();
		return pRet;
	}
	CC_SAFE_DELETE(pRet);
	return nullptr;
}
Exemple #2
0
void noRoadNode::DestroyRoad(const unsigned char dir)
{
    if(routes[dir])
    {
        MapPoint t = routes[dir]->GetF1()->GetPos();
        for(unsigned z = 0; z < routes[dir]->GetLength(); ++z)
        {
            gwg->SetPointRoad(t, routes[dir]->GetRoute(z), 0);
            gwg->CalcRoad(t, player);
            t = gwg->GetNeighbour(t, routes[dir]->GetRoute(z));
        }

        noRoadNode* oflag;

        if(routes[dir]->GetF1() == this)
            oflag = routes[dir]->GetF2();
        else
            oflag = routes[dir]->GetF1();

#ifndef NDEBUG
        bool found = false;
#endif
        for(unsigned z = 0; z < 6; ++z)
        {
            if(oflag->routes[z] == routes[dir])
            {
                oflag->routes[z] = NULL;
#ifndef NDEBUG
                found = true;
#endif
                break;
            }
        }

#ifndef NDEBUG
        assert(found);
#endif

        RoadSegment* tmp = routes[dir];
        routes[dir] = 0;

        tmp->Destroy();
        delete tmp;

        // Spieler Bescheid sagen
        gwg->GetPlayer(player)->RoadDestroyed();
    }
}
Exemple #3
0
bool nofCarrier::WantInBuilding(bool* calculated)
{
    RoadSegment* rs = static_cast<noFlag*>((rs_dir ? cur_rs->GetF1() : cur_rs->GetF2()))->routes[1];
    if(!rs)
        return false;

    if(rs->GetLength() != 1)
        return false;

    if (calculated)
    {
        *calculated = true;
    }

    carried_ware->RecalcRoute();
    return (carried_ware->GetNextDir() == 1);
}
Exemple #4
0
bool render(const Tile& tile,const std::vector<RoadSegment>& segments,agg::rendering_buffer& rbuf)
{
	typedef agg::renderer_base<agg::pixfmt_rgba32> ren_base;
	typedef agg::renderer_outline_aa<ren_base> renderer_oaa;
	typedef agg::rasterizer_outline_aa<renderer_oaa> rasterizer_outline_aa;
	typedef agg::renderer_scanline_aa_solid<ren_base> renderer;

    agg::pixfmt_rgba32 pixf(rbuf);
    ren_base renb(pixf);

    renderer ren(renb);
    agg::rasterizer_scanline_aa<> ras;
    agg::scanline_p8 sl;

    unsigned i = 0;
    for (i=0; i < segments.size(); i++)
    {
    	RoadSegment rseg = segments[i];
    	Segment seg = rseg.convertToSegment(tile);


    	ren.color(seg.getColor());
    	agg::path_storage path;
    	path.move_to(seg.getFromPoint().getX(), seg.getFromPoint().getY());
    	path.line_to(seg.getToPoint().getX(), seg.getToPoint().getY());

    	agg::conv_stroke<agg::path_storage> stroke(path);
    	stroke.width(seg.getStrokeWidth());

        agg::line_cap_e  cap = agg::round_cap;
        agg::line_join_e join = agg::round_join;
        stroke.line_join(join);
        stroke.line_cap(cap);


    	ras.reset();
    	ras.add_path(stroke);
    	agg::render_scanlines(ras,sl,ren);
    }
	return true;
}
void nobBaseWarehouse::OrderCarrier(noRoadNode& goal, RoadSegment& workplace)
{
    RTTR_Assert(workplace.getCarrier(0) == NULL);
    const bool isBoatRequired = workplace.GetRoadType() == RoadSegment::RT_BOAT;

    // We assume, that the caller already checked, if this is possible
    RTTR_Assert(inventory[JOB_HELPER]);
    if(isBoatRequired)
        RTTR_Assert(inventory[GD_BOAT]);

    nofCarrier* carrier = new nofCarrier(isBoatRequired ? nofCarrier::CT_BOAT : nofCarrier::CT_NORMAL, pos, player, &workplace, &goal);
    workplace.setCarrier(0, carrier);

    if(!UseFigureAtOnce(carrier, goal))
        AddLeavingFigure(carrier);

    inventory.real.Remove(JOB_HELPER);
    if(isBoatRequired)
        inventory.real.Remove(GD_BOAT);

    // Evtl. kein Gehilfe mehr, sodass das Rekrutieren gestoppt werden muss
    TryStopRecruiting();
}
void nofDonkeybreeder::WorkFinished()
{
    // Straße und Zielflagge für Esel suchen
    noRoadNode* flag_goal;
    RoadSegment* road = gwg->GetPlayer(player).FindRoadForDonkey(workplace, &flag_goal);

    // Esel erzeugen und zum Ziel beordern
    nofCarrier* donkey = new nofCarrier(nofCarrier::CT_DONKEY, pos, player, road, flag_goal);
    gwg->GetPlayer(player).IncreaseInventoryJob(JOB_PACKDONKEY, 1);
    donkey->InitializeRoadWalking(gwg->GetSpecObj<noRoadNode>(pos)->routes[4], 0, true);

    // Wenn keine Straße gefunden wurde, muss er nach Hause gehen
    if(!road)
        donkey->GoHome();
    else
        // ansonsten Arbeitsplatz Bescheid sagen
        road->GotDonkey(donkey);

    // Esel absetzen
    gwg->AddFigure(donkey, pos);

    // In die neue Welt laufen
    donkey->ActAtFirst();
}
Exemple #7
0
void nofCarrier::RoadSplitted(RoadSegment* rs1, RoadSegment* rs2)
{
    // Bin ich schon auf meinem Arbeitsplatz (=Straße) oder bin ich erst noch auf dem Weg dorthin?
    if(state == CARRS_FIGUREWORK)
    {
        // ich gehe erst noch hin, also gucken, welche Flagge ich anvisiert habe und das jeweilige Teilstück dann als Arbeitsstraße
        if(GetGoal() == rs1->GetF1())
            workplace = rs1;
        else
            workplace = rs2;
    }
    else if(state == CARRS_CARRYWARETOBUILDING || state == CARRS_LEAVEBUILDING)
    {
        // Wenn ich in ein Gebäude gehen oder rauskomme, auf den Weg gehen, der an dieses Gebäude grenzt
        if(cur_rs->GetF1() == rs1->GetF1() || cur_rs->GetF1() == rs1->GetF2())
            workplace = rs1;
        else
            workplace = rs2;
    }
    else
    {
        // sonst wurde es ja schon entschieden
        workplace = (cur_rs == rs1) ? rs1 : rs2;
    }

    // Sonstige Sachen für jeweilige States unternehmen
    switch(state)
    {
        default:
            break;
        case CARRS_WAITFORWARE:
        {
            // Wenn wir stehen, müssen wir in die Mitte laufen
            state = CARRS_GOTOMIDDLEOFROAD;
            Walked();
        } break;
        case CARRS_FETCHWARE:
        {
            // Wenn wir zur 2. Flagge vom 1. Wegstück gelaufen sind, können wir das nun vergessen
            if(!workplace->AreWareJobs(!rs_dir, ct, false))
                state = CARRS_GOTOMIDDLEOFROAD;
        } break;
    }

    RoadSegment* otherRoad = (workplace == rs1) ? rs2 : rs1;
    unsigned char carrierNr = ct == CT_DONKEY ? 1 : 0;

    // Switch road if required
    if(workplace->getCarrier(carrierNr) != this)
    {
        RTTR_Assert(otherRoad->getCarrier(carrierNr) == this);  // I should have been on other road
        // Mich als Träger für meinen neuen Arbeitsplatz zuweisen
        workplace->setCarrier(carrierNr, this);
        // Für andere Straße neuen Träger/Esel rufen
        otherRoad->setCarrier(carrierNr, NULL);
    }else
        RTTR_Assert(otherRoad->getCarrier(carrierNr) == NULL);  // No carrier expected

    if(ct == CT_NORMAL)
        gwg->GetPlayer(player).FindCarrierForRoad(otherRoad);
    else if(ct == CT_DONKEY)
        otherRoad->setCarrier(1, gwg->GetPlayer(player).OrderDonkey(otherRoad));
}
 bool operator()(const RoadSegment& segment) const
 {
     return segment.GetRoadType() != T_roadType;
 }