void FishPlace::timeStep(const unsigned long time) { _getAnimation().update( time ); _d->animations[ 0 ] = _getAnimation().getFrame(); if( _d->walker != 0 ) { TilePos lastPos = _d->walker->getIJ(); _d->walker->timeStep( time ); if( lastPos != _d->walker->getIJ() ) { getTile().setOverlay( 0 ); getTile().setPicture( _d->savePicture ); TilePos pos = _d->walker->getIJ(); _d->savePicture = &_getCity()->getTilemap().at( pos ).getPicture(); setPicture( *_d->savePicture ); TileOverlay::build( _getCity(), pos ); } else if( lastPos == _d->walker->getPathway().getDestination().getIJ() ) { deleteLater(); } } else { Pathway pathway; bool pathFound = Pathfinder::getInstance().getPath( getTilePos(), _getCity()->getBorderInfo().boatExit, pathway, Pathfinder::waterOnly, Size( 1 ) ); if( !pathFound ) { deleteLater(); } else { _d->walker = WalkerPtr( new Walker( _getCity() ) ); _d->walker->drop(); _d->walker->setSpeed( 0.1f ); _d->walker->setPathway( pathway ); _d->walker->setIJ( getTilePos() ); _d->walker->go(); } } }
void Prefecture::deliverService() { if( getWorkers() > 0 && getWalkerList().size() == 0 ) { bool fireDetect = _fireDetect.getI() >= 0; PrefectPtr walker = Prefect::create( _getCity() ); walker->setMaxDistance( 26 ); //bool patrol = true; if( fireDetect ) { Pathway pathway; TilePos startPos = getAccessRoads().front()->getIJ(); bool pathFounded = Pathfinder::getInstance().getPath( startPos, _fireDetect, pathway, false, Size( 0 ) ); //patrol = !pathFounded; if( pathFounded ) { walker->setPathway( pathway ); walker->setIJ( pathway.getOrigin().getIJ() ); } _fireDetect = TilePos( -1, -1 ); } walker->send2City( PrefecturePtr( this ), fireDetect ? 200 : 0 ); addWalker( walker.as<Walker>() ); } }
void Walker::load( const VariantMap& stream) { Tilemap& tmap = _getCity()->getTilemap(); _d->pathWay.init( tmap, tmap.at( 0, 0 ) ); _d->pathWay.load( stream.get( "pathway" ).toMap() ); _d->action.action = (Walker::Action) stream.get( "action" ).toInt(); _d->action.direction = (DirectionType) stream.get( "direction" ).toInt(); _d->pos = stream.get( "pos" ).toTilePos(); _d->tileOffset = stream.get( "tileoffset" ).toPoint(); _d->posOnMap = stream.get( "mappos" ).toPoint(); _d->uid = (UniqueId)stream.get( "uid" ).toInt(); _d->speedMultiplier = stream.get( "speedMul" ).toFloat(); _d->name = stream.get( "name" ).toString(); _OC3_DEBUG_BREAK_IF( _d->speedMultiplier < 0.1 ); if( _d->speedMultiplier < 0.1 ) //Sometime this have this error in save file { _d->speedMultiplier = 1; } _d->speed = stream.get( "speed" ).toFloat(); _d->midTilePos = stream.get( "midTile" ).toPoint(); _d->remainMove = stream.get( "remainmove" ).toPointF(); }
void House::timeStep(const unsigned long time) { if( _d->currentHabitants > 0 ) { if( time % 16 == 0 ) { // consume services for (int i = 0; i < Service::S_MAX; ++i) { Service::Type service = (Service::Type) i; _d->serviceAccess[service] = std::max(_d->serviceAccess[service] - 1, 0); } cancelService( Service::S_WORKERS_HUNTER ); _d->updateHealthLevel(); // consume goods for (int i = 0; i < Good::goodCount; ++i) { Good::Type goodType = (Good::Type) i; _d->goodStore.setCurrentQty( goodType, std::max( _d->goodStore.getCurrentQty(goodType) - 1, 0) ); } } if( time % 64 == 0 ) { bool validate = _d->houseLevelSpec.checkHouse( this ); if (!validate) { levelDown(); } else { _d->condition4Up = ""; validate = _d->nextHouseLevelSpec.checkHouse( this, &_d->condition4Up ); if( validate && _d->currentHabitants > 0 ) { levelUp(); } } int homeless = math::clamp( _d->currentHabitants - _d->maxHabitants, 0, 0xff ); if( homeless > 0 ) { _d->currentHabitants = math::clamp( _d->currentHabitants, 0, _d->maxHabitants ); ImmigrantPtr im = Immigrant::create( _getCity() ); im->setCapacity( homeless ); im->send2City( getTile() ); } } Building::timeStep( time ); } }
void Well::deliverService() { ServiceWalkerPtr walker = ServiceWalker::create( _getCity(), getService() ); walker->setBase( BuildingPtr( this ) ); ServiceWalker::ReachedBuildings reachedBuildings = walker->getReachedBuildings( getTile().getIJ() ); foreach( BuildingPtr building, reachedBuildings) { building->applyService( walker ); }
void CartPusher::send2City( BuildingPtr building, GoodStock& carry ) { _d->stock.append( carry ); setProducerBuilding( building ); computeWalkerDestination(); if( !isDeleted() ) { _getCity()->addWalker( this ); } }
void MarketLadyHelper::send2City( MarketPtr destination ) { if( destination.isValid() ) { _d->marketPos = destination->getTilePos(); _getCity()->addWalker( this ); } else { deleteLater(); } }
void ServiceBuilding::deliverService() { // make a service walker and send him to his wandering ServiceWalkerPtr serviceman = ServiceWalker::create( _getCity(), getService() ); serviceman->setMaxDistance( getWalkerDistance() ); serviceman->send2City( BuildingPtr( this ) ); if( !serviceman->isDeleted() ) { addWalker( serviceman.as<Walker>() ); } }
void CartPusher::computeWalkerDestination() { // get the list of buildings within reach PathWay pathWay; Propagator pathPropagator( _getCity() ); _d->consumerBuilding = 0; if( _d->producerBuilding.isNull() ) { StringHelper::debug( 0xff, "CartPusher destroyed: producerBuilding can't be NULL" ); deleteLater(); return; } pathPropagator.init( _d->producerBuilding.as<Construction>() ); pathPropagator.propagate(_d->maxDistance); BuildingPtr destBuilding; if (destBuilding == NULL) { // try send that good to a factory destBuilding = _d->getWalkerDestination_factory(pathPropagator, pathWay); } if (destBuilding == NULL) { // try send that good to a granary destBuilding = _d->getWalkerDestination_granary(pathPropagator, pathWay); } if (destBuilding == NULL) { // try send that good to a warehouse destBuilding = _d->getWalkerDestination_warehouse( pathPropagator, pathWay ); } if( destBuilding != NULL) { //_isDeleted = true; // no destination! setConsumerBuilding( destBuilding ); setPathWay( pathWay ); setIJ( _getPathway().getOrigin().getIJ() ); setSpeed( 1 ); } else { _setDirection( D_NORTH ); setSpeed( 0 ); setIJ( _d->producerBuilding->getAccessRoads().front()->getIJ() ); walk(); } }
void Forum::deliverService() { if( getWorkers() > 0 && getWalkerList().size() == 0 ) { TaxCollectorPtr walker = TaxCollector::create( _getCity() ); walker->send2City( this ); if( !walker->isDeleted() ) { addWalker( walker.as<Walker>() ); } } }
void CartPusher::load( const VariantMap& stream ) { Walker::load( stream ); _d->stock.load( stream.get( "stock" ).toList() ); TilePos prPos( stream.get( "producerPos" ).toTilePos() ); Tile& prTile = _getCity()->getTilemap().at( prPos ); _d->producerBuilding = prTile.getOverlay().as<Building>(); if( _d->producerBuilding.is<WorkingBuilding>() ) { _d->producerBuilding.as<WorkingBuilding>()->addWalker( this ); } TilePos cnsmPos( stream.get( "consumerPos" ).toTilePos() ); Tile& cnsmTile = _getCity()->getTilemap().at( cnsmPos ); _d->consumerBuilding = cnsmTile.getOverlay().as<Building>(); _d->maxDistance = stream.get( "maxDistance" ).toInt(); _d->reservationID = stream.get( "reservationID" ).toInt(); }
void MarketLadyHelper::onDestination() { Walker::onDestination(); deleteLater(); CityHelper cityh( _getCity() ); MarketPtr market = cityh.find< Market >( _d->marketPos ); if( market.isValid() ) { market->getGoodStore().store( _d->basket, _d->basket._currentQty ); } }
void LowBridge::destroy() { for( LowBridgeSubTiles::iterator it=_d->subtiles.begin(); it != _d->subtiles.end(); it++ ) { (*it)->_parent = 0; GameEventMgr::append( ClearLandEvent::create( (*it)->_pos ) ); std::string picName = TileHelper::convId2PicName( (*it)->_imgId ); Tile& mapTile = _getCity()->getTilemap().at( (*it)->_pos ); mapTile.setPicture( &Picture::load( picName ) ); TileHelper::decode( mapTile, (*it)->_info ); } }
void MarketLady::computeWalkerDestination( MarketPtr market ) { _d->market = market; std::list<Good::Type> priorityGoods = _d->market->getMostNeededGoods(); _d->destBuildingPos = TilePos( -1, -1 ); // no destination yet if( priorityGoods.size() > 0 ) { // we have something to buy! // get the list of buildings within reach PathWay pathWay; Propagator pathPropagator( _getCity() ); pathPropagator.init( _d->market.as<Construction>() ); pathPropagator.propagate( _d->maxDistance); // try to find the most needed good foreach( Good::Type goodType, priorityGoods ) { _d->priorityGood = goodType; if( _d->priorityGood == Good::wheat || _d->priorityGood == Good::fish || _d->priorityGood == Good::meat || _d->priorityGood == Good::fruit || _d->priorityGood == Good::vegetable) { // try get that good from a granary _d->destBuildingPos = getWalkerDestination2<Granary>( pathPropagator, B_GRANARY, _d->market, _d->basket, _d->priorityGood, pathWay, _d->reservationID ); } else { // try get that good from a warehouse _d->destBuildingPos = getWalkerDestination2<Warehouse>( pathPropagator, B_WAREHOUSE, _d->market, _d->basket, _d->priorityGood, pathWay, _d->reservationID ); } if( _d->destBuildingPos.getI() >= 0 ) { // we found a destination! setPathWay(pathWay); break; } }
void TileOverlay::setPicture(Picture picture) { _d->picture = picture; if (_d->masterTile != NULL) { Tilemap &tilemap = _getCity()->getTilemap(); // _master_tile == NULL is cloneable buildings TilePos pos = _d->masterTile->getIJ(); for (int dj = 0; dj<_d->size.getWidth(); ++dj) { for (int di = 0; di<_d->size.getHeight(); ++di) { Tile &tile = tilemap.at( pos + TilePos( di, dj ) ); tile.setPicture( &_d->picture ); } } } }
void Granary::_tryDevastateGranary() { //if granary in devastation mode need try send cart pusher with goods to other granary/warehouse/factory for( int goodType=Good::wheat; goodType <= Good::vegetable; goodType++ ) { int goodQty = math::clamp( goodQty, 0, 400); if( goodQty > 0 ) { GoodStock stock( (Good::Type)goodType, goodQty, goodQty); CartPusherPtr walker = CartPusher::create( _getCity() ); walker->send2City( BuildingPtr( this ), stock ); if( !walker->isDeleted() ) { stock._currentQty = 0; _d->goodStore.retrieve( stock, goodQty );//setCurrentQty( (GoodType)goodType, goodQtyMax - goodQty ); addWalker( walker.as<Walker>() ); break; } } } }
unsigned int Senate::getFunds() const { return _getCity()->getFunds().getValue(); }
void House::_tryUpdate_1_to_11_lvl( int level4grow, int startSmallPic, int startBigPic, const char desirability ) { if( getSize() == 1 ) { Tilemap& tmap = _getCity()->getTilemap(); TilemapTiles area = tmap.getFilledRectangle( getTile().getIJ(), Size(2) ); bool mayGrow = true; foreach( Tile* tile, area ) { if( tile == NULL ) { mayGrow = false; //some broken, can't grow break; } HousePtr house = tile->getOverlay().as<House>(); if( house != NULL && house->getLevelSpec().getHouseLevel() == level4grow ) { if( house->getSize().getWidth() > 1 ) //bigger house near, can't grow { mayGrow = false; break; } } else { mayGrow = false; //no house near, can't grow break; } } if( mayGrow ) { int sumHabitants = getNbHabitants(); int sumFreeWorkers = _d->freeWorkersCount; TilemapTiles::iterator delIt=area.begin(); HousePtr selfHouse = (*delIt)->getOverlay().as<House>(); delIt++; //don't remove himself for( ; delIt != area.end(); delIt++ ) { HousePtr house = (*delIt)->getOverlay().as<House>(); if( house.isValid() ) { house->deleteLater(); house->_d->currentHabitants = 0; sumHabitants += house->getNbHabitants(); sumFreeWorkers += house->_d->freeWorkersCount; selfHouse->getGoodStore().storeAll( house->getGoodStore() ); } } _d->currentHabitants = sumHabitants; _d->freeWorkersCount = sumFreeWorkers; _d->houseLevelSpec = HouseSpecHelper::getInstance().getHouseLevelSpec(_d->houseLevel); _d->nextHouseLevelSpec = _d->houseLevelSpec.next(); _update(); _updateDesirabilityInfluence( Construction::duNegative ); setSize( getSize() + Size(1) ); build( _getCity(), getTile().getIJ() ); } }