void InfoBoxManager::showHelp( const Tile& tile ) { LandOverlayPtr overlay = tile.getTerrain().getOverlay(); BuildingType type; if( _d->showDebugInfo ) { StringHelper::debug( 0xff, "Tile debug info: dsrbl=%d", tile.getTerrain().getDesirability() ); } type = overlay.isNull() ? B_NONE : overlay->getType(); Impl::InfoboxCreators::iterator findConstructor = _d->constructors.find( type ); GuiInfoBox* infoBox = findConstructor != _d->constructors.end() ? findConstructor->second->create( _d->gui->getRootWidget(), tile ) : 0; if( infoBox && infoBox->isAutoPosition() ) { Size rSize = _d->gui->getRootWidget()->getSize(); int y = ( _d->gui->getCursorPos().getY() < rSize.getHeight() / 2 ) ? rSize.getHeight() - infoBox->getHeight() - 5 : 30; Point pos( ( rSize.getWidth() - infoBox->getWidth() ) / 2, y ); infoBox->setPosition( pos ); } }
void DisasterEvent::exec( Game& game ) { Tilemap& tmap = game.getCity()->getTilemap(); Tile& tile = tmap.at( _pos ); TilePos rPos = _pos; if( tile.getFlag( Tile::isDestructible ) ) { Size size( 1 ); LandOverlayPtr overlay = tile.getOverlay(); if( overlay.isValid() ) { overlay->deleteLater(); size = overlay->getSize(); rPos = overlay->getTile().getIJ(); } //bool deleteRoad = false; TilemapArea clearedTiles = tmap.getFilledRectangle( rPos, size ); foreach( Tile* tile, clearedTiles ) { BuildingType dstr2constr[] = { B_BURNING_RUINS, B_COLLAPSED_RUINS, B_PLAGUE_RUINS }; bool canCreate = ConstructionManager::getInstance().canCreate( dstr2constr[_type] ); if( canCreate ) { GameEventMgr::append( BuildEvent::create( tile->getIJ(), dstr2constr[_type] ) ); } }
void Minimap::Impl::getBuildingColours(const Tile& tile, int &c1, int &c2) { LandOverlayPtr overlay = tile.getOverlay(); if (overlay == NULL) return; BuildingType type = overlay->getType(); switch(type) { case B_HOUSE: { switch (overlay->getSize().getWidth()) { case 1: { c1 = colors->colour(MinimapColors::MAP_HOUSE, 0); c2 = colors->colour(MinimapColors::MAP_HOUSE, 1); break; } default: { c1 = colors->colour(MinimapColors::MAP_HOUSE, 2); c2 = colors->colour(MinimapColors::MAP_HOUSE, 0); } } break; } case B_RESERVOIR: { c1 = colors->colour(MinimapColors::MAP_AQUA, 1); c2 = colors->colour(MinimapColors::MAP_AQUA, 0); break; } default: { switch (overlay->getSize().getWidth()) { case 1: { c1 = colors->colour(MinimapColors::MAP_BUILDING, 0); c2 = colors->colour(MinimapColors::MAP_BUILDING, 1); break; } default: { c1 = colors->colour(MinimapColors::MAP_BUILDING, 0); c2 = colors->colour(MinimapColors::MAP_BUILDING, 2); } } } } c1 |= 0xff000000; c2 |= 0xff000000; }
void ScenarioMapLoader::Impl::decodeTerrain(Tile &oTile, CityPtr city ) { if (!oTile.isMasterTile() && oTile.getMasterTile()!=NULL) return; TerrainTile& terrain = oTile.getTerrain(); LandOverlayPtr overlay; // This is the overlay object, if any if( terrain.isRoad() ) // road { overlay = ConstructionManager::getInstance().create( B_ROAD ).as<LandOverlay>(); } else if (terrain.isBuilding()) { StringHelper::debug( 0xff, "Building at ( %d, %d ) with ID: %x", oTile.getI(), oTile.getJ(), terrain.getOriginalImgId() ); switch ( terrain.getOriginalImgId() ) { case 0xb0e: case 0xb0f: case 0xb0b: case 0xb0c: overlay = ConstructionManager::getInstance().create( B_NATIVE_HUT ).as<LandOverlay>(); break; case 0xb10: case 0xb0d: overlay = ConstructionManager::getInstance().create( B_NATIVE_CENTER ).as<LandOverlay>(); StringHelper::debug( 0xff, "creation of Native center at (%d,%d)", oTile.getI(), oTile.getJ() ); break; case 0xb11: case 0xb44: overlay = ConstructionManager::getInstance().create( B_NATIVE_FIELD ).as<LandOverlay>(); break; } } //terrain.setOverlay( overlay ); if( overlay != NULL ) { overlay->build( oTile.getIJ() ); city->getOverlayList().push_back(overlay); } }
void WalkerPrefect::onMidTile() { ReachedBuildings reachedBuildings; TilePos firePos; bool haveBurningRuinsNear = _looks4Fire( reachedBuildings, firePos ); bool isDestination = _getPathway().isDestination(); switch( _d->action ) { case Impl::doNothing: break; case Impl::patrol: { if( haveBurningRuinsNear ) { //tell our prefecture that need send prefect with water to fight with fire //on next deliverService //found fire, no water, go prefecture getBase().as<Prefecture>()->fireDetect( firePos ); _back2Prefecture(); Walker::onNewDirection(); } else { foreach( BuildingPtr building, reachedBuildings ) { building->applyService( ServiceWalkerPtr( this ) ); HousePtr house = building.as<House>(); if( house.isValid() && house->getHealthLevel() < 1 ) { house->deleteLater(); GameEventMgr::append( DisasterEvent::create( house->getTilePos(), DisasterEvent::plague ) ); } } } if( isDestination ) { _back2Prefecture(); } Walker::onMidTile(); } break; case Impl::back2Prefecture: { if( haveBurningRuinsNear ) { //tell our prefecture that need send prefect with water to fight with fire //on next deliverService getBase().as<Prefecture>()->fireDetect( firePos ); } if( isDestination ) { deleteLater(); _d->action = Impl::doNothing; } Walker::onMidTile(); } break; case Impl::gotoFire: { if( _getPathway().getDestination().getIJ().distanceFrom( getIJ() ) < 1.5f ) { LandOverlayPtr overlay = _getPathway().getDestination().getOverlay(); if( overlay.isValid() && overlay->getType() == B_BURNING_RUINS ) { _d->action = Impl::fightFire; _setGraphic( WG_PREFECT_FIGHTS_FIRE ); Walker::onNewDirection(); isDestination = false; } } if( isDestination ) { if( !haveBurningRuinsNear || _d->water == 0 ) { _back2Prefecture(); } else { _setGraphic( WG_PREFECT_DRAG_WATER ); _d->action = Impl::gotoFire; _checkPath2NearestFire( reachedBuildings ); Walker::onNewDirection(); } } Walker::onMidTile(); } break; case Impl::fightFire: break; }