void LoaderHelper::decodeTerrain( Tile &oTile, PlayerCityPtr city, unsigned int forceId ) { unsigned int imgId = oTile.originalImgId(); TileOverlay::Type ovType = construction::unknown; if( oTile.getFlag( Tile::tlRoad ) ) // road { ovType = construction::road; Picture pic = Picture::load( ResourceGroup::land1a, 230 + math::random( 59) ); oTile.setPicture( pic ); oTile.setOriginalImgId( TileHelper::convPicName2Id( pic.name() ) ); } else if( (imgId >= 372 && imgId <= 427) ) { oTile.setFlag( Tile::tlCoast, true ); if( imgId >= 388 ) oTile.setFlag( Tile::tlRubble, true ); } else /*if( oTile.getFlag( Tile::tlBuilding ) )*/ { unsigned id = forceId > 0 ? forceId : oTile.originalImgId(); ovType = convImgId2ovrType( id ); } if( ovType == construction::unknown ) return; TileOverlayPtr overlay; // This is the overlay object, if any overlay = TileOverlayFactory::instance().create( ovType ); if( ovType == building::elevation ) { std::string elevationPicName = TileHelper::convId2PicName( oTile.originalImgId() ); overlay->setPicture( Picture::load( elevationPicName ) ); } if( overlay != NULL ) { //Logger::warning( "Building at ( %d, %d ) with ID: %x", oTile.i(), oTile.j(), oTile.originalImgId() ); if( oTile.overlay().isValid() ) return; overlay->build( city, oTile.pos() ); city->overlays().push_back( overlay ); } }
void GameLoaderC3Map::Impl::decodeTerrain(Tile &oTile, CityPtr city ) { if (!oTile.isMasterTile() && oTile.getMasterTile()!=NULL) return; TileOverlayPtr overlay; // This is the overlay object, if any if( oTile.getFlag( Tile::tlRoad ) ) // road { overlay = TileOverlayFactory::getInstance().create( B_ROAD ).as<TileOverlay>(); } else if( oTile.getFlag( Tile::tlBuilding ) ) { StringHelper::debug( 0xff, "Building at ( %d, %d ) with ID: %x", oTile.getI(), oTile.getJ(), oTile.getOriginalImgId() ); switch ( oTile.getOriginalImgId() ) { case 0xb0e: case 0xb0f: case 0xb0b: case 0xb0c: overlay = TileOverlayFactory::getInstance().create( B_NATIVE_HUT ).as<TileOverlay>(); break; case 0xb10: case 0xb0d: overlay = TileOverlayFactory::getInstance().create( B_NATIVE_CENTER ).as<TileOverlay>(); StringHelper::debug( 0xff, "creation of Native center at (%d,%d)", oTile.getI(), oTile.getJ() ); break; case 0xb11: case 0xb44: overlay = TileOverlayFactory::getInstance().create( B_NATIVE_FIELD ).as<TileOverlay>(); break; } } //terrain.setOverlay( overlay ); if( overlay != NULL ) { overlay->build( city, oTile.getIJ() ); city->getOverlayList().push_back(overlay); } }
void CityServiceFishPlace::update( const unsigned int time ) { if( time % 44 != 1 ) return; if( _d->places.empty() ) { CityHelper helper( _d->city ); _d->places = helper.find<FishPlace>( constants::place::fishPlace ); } while( _d->places.size() < _d->maxFishPlace ) { TileOverlayPtr fishplace = TileOverlayFactory::getInstance().create( constants::place::fishPlace ); if( fishplace != 0 ) { fishplace->build( _d->city, _d->city->getBorderInfo().boatEntry ); _d->city->addOverlay( fishplace ); _d->places.push_back( fishplace.as<FishPlace>() ); } } FishPlaceList::iterator fit = _d->places.begin(); while( fit != _d->places.end() ) { if( (*fit)->isDeleted() ) { fit = _d->places.erase( fit ); } else { fit++; } } }
static void __createRivers(Game& game ) { PlayerCityPtr oCity = game.city(); Tilemap& oTilemap = oCity->tilemap(); TerrainGeneratorHelper tgHelper; Pathfinder& pathfinder = Pathfinder::instance(); pathfinder.setCondition( makeDelegate( &tgHelper, &TerrainGeneratorHelper::canBuildRiver ) ); TilesArray terrainTiles = oTilemap.getArea( TilePos(0,0), Size( oTilemap.size() ) ); for( TilesArray::iterator it=terrainTiles.begin(); it != terrainTiles.end(); ) { Tile* tile = *it; if( tile->isWalkable( true ) || tile->getFlag( Tile::tlTree ) ) { ++it; } else { it = terrainTiles.erase( it ); } } int riverCount = 0; for( int tryCount=0; tryCount < 20; tryCount++ ) { if( riverCount++ > oTilemap.size() / 60 ) break; Tile* centertile = terrainTiles.random(); Pathway way; for( int range=0; range < 99; range++ ) { TilesArray perimeter = oTilemap.getRectangle( range, centertile->pos() ); foreach( it, perimeter ) { Tile* currentTile = *it; if( currentTile->getFlag( Tile::tlWater ) ) { way = pathfinder.getPath( *centertile, *currentTile, Pathfinder::customCondition | Pathfinder::fourDirection ); if( way.isValid() ) { break; } } } if( way.isValid() ) break; } if( way.isValid() ) { TilesArray wayTiles = way.allTiles(); foreach( it, wayTiles ) { TileOverlayPtr overlay = TileOverlayFactory::instance().create( constants::objects::river ); //Picture pic = Picture::load( ResourceGroup::land1a, 62 + math::random( 57 ) ); (*it)->setPicture( Picture::getInvalid() ); //(*it)->setOriginalImgId( TileHelper::convPicName2Id( pic.name() ) ); (*it)->setOriginalImgId( 0 ); bool isWater = (*it)->getFlag( Tile::tlWater ); CityAreaInfo info = { oCity, (*it)->pos(), TilesArray() }; overlay->build( info ); oCity->overlays().push_back( overlay ); if( isWater ) break; }