void Level::Impl::initMainUI() { PlayerCityPtr city = game->city(); gui::Ui& ui = *game->gui(); ui.clear(); topMenu = &ui.add<TopMenu>(topMenuHeight, !city->getOption(PlayerCity::c3gameplay)); //bool fitToHeidht = OSystem::isAndroid(); //menu = Menu::create( ui.rootWidget(), -1, city, fitToHeidht ); //menu->hide(); WindowMessageStack::create( ui.rootWidget() ); if( KILLSWITCH( rightMenu ) ) { //rightPanel->setSide( MenuRigthPanel::rightSide ); //menu->setSide( Menu::rightSide, rightPanel->lefttop() ); //extMenu->setSide( Menu::rightSide, rightPanel->lefttop() ); } else { //rightPanel->setSide( MenuRigthPanel::leftSide ); //menu->setSide( Menu::leftSide, rightPanel->righttop() ); //extMenu->setSide( Menu::leftSide, rightPanel->righttop() ); } }
void HealthCare::Impl::updateReasons( PlayerCityPtr city ) { int lvl = math::clamp<int>( value / (health::maxValue/health::levelNumber), 0, health::levelNumber-1 ); std::string mainReason = healthDescription[ lvl ]; int clinics_n = city->statistic().objects.count( object::clinic ); mainReason += clinics_n > 0 ? "_clinic##" : "##"; reasons << mainReason; if( lvl > health::levelNumber / 3 ) { for( int i=0; reasonsInfo[ i ].type != object::unknown; i++ ) { object::TypeSet availableTypes; availableTypes.insert( reasonsInfo[ i ].type ); HouseList housesWantEvolve = city->statistic().houses.ready4evolve( availableTypes ); if( housesWantEvolve.size() > 0 ) { reasons << reasonsInfo[i].info; } } } }
void initBuildOptions(PlayerCityPtr city) { city::development::Options bopts; bopts = city->buildOptions(); bopts.setGroupAvailable( city::development::all, true ); city->setBuildOptions( bopts ); }
static void __removeCorners(Game& game ) { PlayerCityPtr oCity = game.city(); Tilemap& oTilemap = oCity->tilemap(); unsigned int mapSize = oTilemap.size(); TilePos psAr[8] = { TilePos(0, 1), TilePos(-1, 1), TilePos(-1, 0), TilePos(-1, -1), TilePos(0, -1), TilePos(1, -1), TilePos(1, 0), TilePos(1, 1)}; //check one water tiles for( unsigned int i=0; i < mapSize; i++ ) for( unsigned int j=0; j < mapSize; j++ ) { TilePos tpos = TilePos( i, j ); Tile& wtile = oTilemap.at( tpos ); if( wtile.originalImgId() == 0 || wtile.getFlag( Tile::tlWater ) || wtile.getFlag( Tile::tlDeepWater ) ) continue; for( int k=0; k < 8; k++ ) { Tile& t = oTilemap.at( tpos + psAr[k] ); bool isWater = ( t.getFlag( Tile::tlWater ) || t.getFlag( Tile::tlDeepWater ) ); if( isWater ) { wtile.setFlag( Tile::clearAll, true ); wtile.setOriginalImgId( 0 ); wtile.setPicture( Picture() ); break; } } } }
void Migration::Impl::createMigrationToCity( PlayerCityPtr city ) { unsigned int vh = calcVacantHouse( city ); if( vh == 0 ) { return; } EmigrantList migrants; migrants << city->walkers(); if( vh <= migrants.size() * 5 ) { return; } Tile& roadTile = city->tilemap().at( city->borderInfo().roadEntry ); ImmigrantPtr emigrant = Immigrant::create( city ); if( emigrant.isValid() ) { bool success = emigrant->send2city( roadTile ); emigrant->setSpeedMultiplier( 0.8f + math::random( 40 ) / 100.f ); if( success ) lastMonthComing += emigrant->peoples().count(); } }
void PlayerArmy::_reachedWay() { if( _d->mode == PlayerArmy::go2location ) { _attackAny(); return2fort(); } else if( _d->mode == PlayerArmy::go2home ) { PlayerCityPtr pCity = ptr_cast<PlayerCity>( _d->base ); if( pCity.isValid() ) { for( auto sldr : _d->soldiersInfo ) { int type = sldr.save[ "type" ]; WalkerPtr walker = WalkerManager::instance().create( (walker::Type)type, pCity ); walker->load( sldr.save ); walker->attach(); } auto fort = pCity->getOverlay( _d->fortPos ).as<Fort>(); if( fort.isValid() ) { fort->returnSoldiers(); fort->resetExpedition(); } } deleteLater(); } }
void Level::initialize() { PlayerCityPtr city = _d->game->city(); _d->initRender(); _d->initMainUI(); _d->installHandlers( this ); _d->initSound(); _d->initTabletUI( this ); _d->undoStack.init( city ); //connect elements //city->tilemap().setFlag( Tilemap::fSvkGround, !KILLSWITCH(oldgfx) ); CONNECT( city, onWarningMessage(), _d.data(), Impl::resolveWarningMessage ) //CONNECT( _d->extMenu, onSelectOverlayType(), _d.data(), Impl::resolveSelectLayer ) CONNECT( city, onDisasterEvent(), &_d->alarmsHolder, AlarmEventHolder::add ) CONNECT( &_d->alarmsHolder, onMoveToAlarm(), _d->renderer.camera(), Camera::setCenter ) CONNECT( &_d->alarmsHolder, onAlarmChange(), _d.data(), Impl::setAlarmEnabled ) CONNECT( _d->renderer.camera(), onPositionChanged(), _d.data(), Impl::saveCameraPos ) CONNECT( _d->renderer.camera(), onDirectionChanged(), _d.data(), Impl::handleDirectionChange ) CONNECT( &_d->renderer, onLayerSwitch(), _d.data(), Impl::layerChangedOut ) CONNECT( &_d->undoStack, onUndoChange(), _d.data(), Impl::resolveUndoChange ) _d->renderer.camera()->setCenter(city->cameraPos()); _d->dhandler.insertTo(_d->game, _d->topMenu); _d->dhandler.setVisible(false); events::dispatch<events::ScriptFunc>("OnMissionStart"); }
void C3Map::Impl::initCameraStartPos(std::fstream &f, PlayerCityPtr ioCity) { /*unsigned short int i = 0; unsigned short int j = 0; f.seekg(kCamera, std::ios::beg); f.read((char*)&i, 2); f.read((char*)&j, 2);*/ int mapSize = ioCity->tilemap().size(); ioCity->setCameraPos( TilePos( mapSize / 2, mapSize / 2 ) ); }
void PostponeEvent::Impl::executeCityService( Game& game, const std::string& type, bool& r ) { PlayerCityPtr city = game.city(); std::string dtype = options.get( "type", Variant( type ) ).toString(); city::SrvcPtr srvc = city::ServiceFactory::create( game.city(), dtype ); if( srvc.isValid() ) { srvc->load( options ); city->addService( srvc ); r = true; return; } r = false; }
void Notify::_exec(Game& game, unsigned int) { world::CityPtr pCity = game.empire()->findCity( _d->cityname ); PlayerCityPtr plrCity = ptr_cast<PlayerCity>( pCity ); if( plrCity.isValid() ) { MilitaryPtr mil = plrCity->statistic().services.find<Military>(); if( mil.isValid() ) { mil->addNotification( _d->message, _d->object, (Notification::Type)_d->type ); } } }
void LowBridge::_computePictures(PlayerCityPtr city, const TilePos& startPos, const TilePos& endPos, constants::Direction dir ) { Tilemap& tilemap = city->tilemap(); //Picture& water = Picture::load( "land1a", 120 ); switch( dir ) { case northWest: { TilesArray tiles = tilemap.getArea( endPos, startPos ); if (tiles.size() < 3) break; tiles.pop_back(); tiles.erase( tiles.begin() ); _d->addSpan( tiles.front()->pos() - startPos - TilePos( 1, 0 ), LowBridgeSubTile::liftingWest ); foreach( it, tiles ) { _d->addSpan( (*it)->pos() - startPos, LowBridgeSubTile::spanWest ); } _d->addSpan( tiles.back()->pos() - startPos + TilePos( 1, 0 ), LowBridgeSubTile::descentWest ); } break; case northEast: { TilesArray tiles = tilemap.getArea( startPos, endPos ); if (tiles.size() < 3) break; tiles.pop_back(); tiles.erase( tiles.begin() ); _d->addSpan( tiles.back()->pos() - startPos + TilePos( 0, 1 ), LowBridgeSubTile::liftingNorth ); for( TilesArray::reverse_iterator it=tiles.rbegin(); it != tiles.rend(); ++it ) { _d->addSpan( (*it)->pos() - startPos, LowBridgeSubTile::spanNorth ); } _d->addSpan( tiles.front()->pos() - startPos - TilePos( 0, 1 ), LowBridgeSubTile::descentNorth ); } break; case southEast: { TilesArray tiles = tilemap.getArea( startPos, endPos ); if( tiles.size() < 3 ) break; tiles.pop_back(); tiles.erase( tiles.begin() ); _d->addSpan( tiles.front()->pos() - startPos - TilePos( 1, 0 ), LowBridgeSubTile::liftingWest ); foreach( it, tiles ) { _d->addSpan( (*it)->pos() - startPos, LowBridgeSubTile::spanWest ); //_d->subtiles.push_back( LowBridgeSubTile( (*it)->getIJ() - startPos, water ) ); } _d->addSpan( tiles.back()->pos() - startPos + TilePos( 1, 0 ), LowBridgeSubTile::descentWest ); }
EmpirePricesWindow::EmpirePricesWindow(Widget *parent, int id, const Rect &rectangle, PlayerCityPtr city) : Window( parent, rectangle, "", id ) { setupUI( ":/gui/empireprices.gui" ); city::TradeOptions& ctrade = city->tradeOptions(); Font font = Font::create( FONT_1 ); Point startPos( 140, 50 ); for( int i=Good::wheat; i < Good::prettyWine; i++ ) { if( i == Good::fish || i == Good::denaries) { continue; } Good::Type gtype = (Good::Type)i; Picture goodIcon = GoodHelper::picture( gtype ); new Image( this, startPos, goodIcon ); std::string priceStr = StringHelper::format( 0xff, "%d", ctrade.buyPrice( gtype ) ); Label* lb = new Label( this, Rect( startPos + Point( 0, 34 ), Size( 24, 24 ) ), priceStr ); lb->setFont( font ); priceStr = StringHelper::format( 0xff, "%d", ctrade.sellPrice( gtype ) ); lb = new Label( this, Rect( startPos + Point( 0, 58 ), Size( 24, 24 ) ), priceStr ); lb->setFont( font ); startPos += Point( 30, 0 ); } }
void Migration::Impl::createMigrationFromCity( PlayerCityPtr city ) { HouseList houses = city->statistic().houses.find(); const int minWorkersNumber = 4; for( HouseList::iterator i=houses.begin(); i != houses.end(); ) { int houseWorkless = (*i)->unemployed(); if( !(*i)->enterArea().empty() && houseWorkless > minWorkersNumber ) { ++i; } else { i = houses.erase( i ); } } if( !houses.empty() ) { int number = math::random( houses.size() ); HouseList randHouses = houses.random( number ); for( auto house : randHouses ) { ImmigrantPtr emigrant = Immigrant::create( city ); if( emigrant.isValid() ) { house->removeHabitants( minWorkersNumber ); emigrant->leaveCity( *(house->enterArea().front()) ); emigrant->setThinks( "##immigrant_no_work_for_me##" ); } } } }
void _removeGoodFrom( PlayerCityPtr city, objects::Type btype, good::Product what, int& qty ) { SmartList<T> bList; #ifdef CAESARIA_PLATFORM_HAIKU bList << city->overlays(); #else city::Helper helper( city ); bList = helper.find<T>( btype ); #endif foreach( it, bList ) { if( qty <= 0 ) break; good::Store& store = (*it)->store(); int maxQty = std::min( store.getMaxRetrieve( what ), qty ); if( maxQty > 0 ) { good::Stock stock( what, maxQty ); store.retrieve( stock, maxQty ); qty -= maxQty; } } }
void LowBridge::_computePictures(PlayerCityPtr city, const TilePos& startPos, const TilePos& endPos, Direction dir ) { Tilemap& tilemap = city->tilemap(); //Picture& water = Picture::load( "land1a", 120 ); switch( dir ) { case direction::northWest: { Bridge::Area area( tilemap, endPos, startPos ); if (area.size() < 3) break; area.cropCorners(); _d->addSpan( area.front()->pos() - startPos - TilePos( 1, 0 ), LowBridgeSubTile::liftingWest ); foreach( it, area ) { _d->addSpan( (*it)->pos() - startPos, LowBridgeSubTile::spanWest ); } _d->addSpan( area.back()->pos() - startPos + TilePos( 1, 0 ), LowBridgeSubTile::descentWest ); } break; case direction::northEast: { Bridge::Area area( tilemap, startPos, endPos ); if (area.size() < 3) break; area.cropCorners(); _d->addSpan( area.back()->pos() - startPos + TilePos( 0, 1 ), LowBridgeSubTile::liftingNorth ); for( TilesArray::reverse_iterator it=area.rbegin(); it != area.rend(); ++it ) { _d->addSpan( (*it)->pos() - startPos, LowBridgeSubTile::spanNorth ); } _d->addSpan( area.front()->pos() - startPos - TilePos( 0, 1 ), LowBridgeSubTile::descentNorth ); } break; case direction::southEast: { Bridge::Area area( tilemap, startPos, endPos ); if( area.size() < 3 ) break; area.cropCorners(); _d->addSpan( area.front()->pos() - startPos - TilePos( 1, 0 ), LowBridgeSubTile::liftingWest ); foreach( it, area ) { _d->addSpan( (*it)->pos() - startPos, LowBridgeSubTile::spanWest ); } _d->addSpan( area.back()->pos() - startPos + TilePos( 1, 0 ), LowBridgeSubTile::descentWest ); }
Tax::Tax( Camera& camera, PlayerCityPtr city) : Info( camera, city, 9 ) { if( !city->getOption( PlayerCity::c3gameplay ) ) _loadColumnPicture( ResourceGroup::sprites, 124 ); _addWalkerType( walker::taxCollector ); _initialize(); }
void Neptune::_doBlessing(PlayerCityPtr city) { FishingBoatList boats = city->statistic().walkers.find<FishingBoat>( walker::fishingBoat, TilePos(-1, -1)); boats = boats.random( math::max<size_t>( boats.size() / 5, 5 ) ); for( auto boat : boats ) { boat->addFish( boat->fishMax() - boat->fishQty() ); } }
void Locust::create(PlayerCityPtr city, TilePos pos, int time) { Locust* locust = new Locust( city ); locust->setPos( pos ); WalkerPtr ret( locust ); ret->drop(); city->addWalker( ret ); }
void PostponeEvent::Impl::executeRequest( Game& game, const std::string& type, bool& r ) { if( "city_request" == type ) { PlayerCityPtr city = game.city(); city::SrvcPtr service = city->findService( city::request::Dispatcher::defaultName() ); city::request::DispatcherPtr dispatcher = ptr_cast<city::request::Dispatcher>( service ); if( dispatcher.isValid() ) { dispatcher->add( options ); } r = true; return; } r = false; }
void C3Map::Impl::initClimate(std::fstream &f, PlayerCityPtr ioCity ) { // read climate unsigned int i = 0; f.seekg(kClimate, std::ios::beg); f.read((char*)&i, 1); ioCity->setOption( PlayerCity::climateType, i); Logger::warning( "C3MapLoader: climate type is %d", i ); }
void Disorder::Impl::changeCrimeLevel(PlayerCityPtr city, int delta ) { city->statistic().houses .find() .for_each( [delta](HousePtr house) { house->appendServiceValue( Service::crime, delta ); } ); }
bool MarbleQuarry::canBuild(PlayerCityPtr city, TilePos pos, const TilesArray& aroundTiles ) const { bool is_constructible = Construction::canBuild( city, pos, aroundTiles ); bool near_mountain = false; // tells if the factory is next to a mountain Tilemap& tilemap = city->tilemap(); TilesArray perimetr = tilemap.getRectangle( pos + TilePos( -1, -1 ), size() + Size( 2 ), Tilemap::checkCorners); foreach( tile, perimetr ) { near_mountain |= (*tile)->getFlag( Tile::tlRock ); }
Info::Parameters Migration::Impl::lastMonthParams( PlayerCityPtr city ) { InfoPtr info = city->statistic().services.find<Info>(); Info::Parameters params; if( info.isValid() ) { params = info->lastParams(); } return params; }
void Services::initialize(PlayerCityPtr city, const std::string& model) { VariantMap services = config::load( model ); for (auto it : services) { SrvcPtr service = ServiceFactory::instance().create( city, it.first ); if( service.isValid() ) city->addService( service ); else Logger::warning( "!!! WARNING: Cant initialize service %s on city create", it.first.c_str() ); } }
unsigned int Migration::Impl::calcVacantHouse( PlayerCityPtr city ) { unsigned int vh = 0; HouseList houses = city->statistic().houses.find(); for( auto house : houses ) { if( house->roadside().size() > 0 && house->state( pr::settleLock ) == 0 ) { vh += math::clamp<int>( house->capacity() - house->habitants().count(), 0, 0xff ); } } return vh; }
bool Construction::canBuild(PlayerCityPtr city, TilePos pos , const TilesArray& ) const { Tilemap& tilemap = city->tilemap(); bool is_constructible = true; //return area for available tiles TilesArray area = tilemap.getArea( pos, size() ); //on over map size if( (int)area.size() != size().area() ) return false; foreach( tile, area ) {is_constructible &= (*tile)->getFlag( Tile::isConstructible );}
void Level::Impl::checkFailedMission( Level* lvl, bool forceFailed ) { PlayerCityPtr pcity = game->city(); const city::VictoryConditions& vc = pcity->victoryConditions(); MilitaryPtr mil = pcity->statistic().services.find<Military>(); InfoPtr info = pcity->statistic().services.find<Info>(); if (mil.isValid() && info.isValid()) { const city::Info::MaxParameters& params = info->maxParams(); bool failedByDestroy = mil->value() > 0 && params[ Info::population ].value > 0 && !pcity->states().population; bool failedByTime = ( !vc.isSuccess() && game::Date::current() > vc.finishDate() ); if( failedByDestroy || failedByTime || forceFailed ) { game->pause(); events::dispatch<ScriptFunc>("OnMissionLose"); steamapi::missionLose(vc.name()); } } }
void C3Map::Impl::initEntryExit(std::fstream &f, PlayerCityPtr ioCity) { unsigned int size = ioCity->tilemap().size(); // init road entry/exit point unsigned short int i = 0; unsigned short int j = 0; f.seekg(kRoadEntry, std::ios::beg); f.read((char*)&i, 2); f.read((char*)&j, 2); BorderInfo borderInfo; borderInfo.roadEntry = TilePos( i, size - j - 1 ); f.read((char*)&i, 2); f.read((char*)&j, 2); borderInfo.roadExit = TilePos( i, size - j - 1 ); // init boat entry/exit point f.seekg(kBoatEntry, std::ios::beg); f.read((char*)&i, 2); f.read((char*)&j, 2); borderInfo.boatEntry = TilePos( i, size - j - 1 ); f.read((char*)&i, 2); f.read((char*)&j, 2); borderInfo.boatExit = TilePos( i, size - j - 1); ioCity->setBorderInfo( borderInfo ); //std::cout << "road entry at:" << ioCity.getRoadEntryI() << "," << ioCity.getRoadEntryJ() << std::endl; //std::cout << "road exit at:" << ioCity.getRoadExitI() << "," << ioCity.getRoadExitJ() << std::endl; //std::cout << "boat entry at:" << ioCity.getBoatEntryI() << "," << ioCity.getBoatEntryJ() << std::endl; //std::cout << "boat exit at:" << ioCity.getBoatExitI() << "," << ioCity.getBoatExitJ() << std::endl; }
void Disorder::Impl::generateMugger(PlayerCityPtr city, HousePtr house ) { int taxesThisYear = city->treasury().getIssueValue( econ::Issue::taxIncome ); int maxMoneyStolen = city->states().population / 10; if( taxesThisYear > minCityTax4mugger ) { int moneyStolen = taxesThisYear / 4; if( moneyStolen > maxMoneyStolen ) moneyStolen = math::random( maxMoneyStolen ); GameEventPtr e = ShowInfobox::create( "##money_stolen_title##", "##money_stolen_text##", ShowInfobox::send2scribe, "mugging" ); e->dispatch(); city->treasury().resolveIssue( econ::Issue( econ::Issue::moneyStolen, -moneyStolen ) ); } crime.level.current++; crime.muggers.thisYear++; //house->appendServiceValue( Service::crime, -crime::defaultValue / 2 ); changeCrimeLevel( city, -crime::muggerCost ); }
void C3Sav::Impl::initEntryExit(std::fstream &f, PlayerCityPtr ioCity) { unsigned int size = ioCity->tilemap().size(); const unsigned int savePos = f.tellg(); // init road entry/exit point unsigned short int i = 0; unsigned short int j = 0; f.seekg(1236, std::ios::cur); f.read((char*)&i, 2); f.read((char*)&j, 2); BorderInfo borderInfo; borderInfo.roadEntry = TilePos( i, size - j - 1 ); f.read((char*)&i, 2); f.read((char*)&j, 2); borderInfo.roadExit = TilePos( i, size - j - 1 ); // init boat entry/exit point f.seekg(savePos, std::ios::beg); f.seekg(1276, std::ios::cur); f.read((char*)&i, 2); f.read((char*)&j, 2); borderInfo.boatEntry = TilePos( i, size - j - 1 ); f.read((char*)&i, 2); f.read((char*)&j, 2); borderInfo.boatExit = TilePos( i, size - j - 1); ioCity->setBorderInfo( borderInfo ); f.seekg(savePos, std::ios::beg); }