void HighBridge::build( const TilePos& pos ) { TilePos endPos, startPos; _d->direction=D_NONE; _d->subtiles.clear(); _fgPictures.clear(); CityPtr city = Scenario::instance().getCity(); Tilemap& tilemap = city->getTilemap(); _checkParams( _d->direction, startPos, endPos, pos ); if( _d->direction != D_NONE ) { _computePictures( startPos, endPos, _d->direction ); for( HighBridgeSubTiles::iterator it=_d->subtiles.begin(); it != _d->subtiles.end(); it++ ) { HighBridgeSubTilePtr subtile = (*it); TilePos buildPos = pos + subtile->_pos; Tile& tile = tilemap.at( buildPos ); subtile->setPicture( tile.getPicture() ); subtile->_imgId = tile.getTerrain().getOriginalImgId(); subtile->_info = tile.getTerrain().encode(); subtile->_parent = this; city->build( subtile.as<Construction>(), buildPos ); } } }
Pathway PathwayHelper::create(CityPtr city, TilePos startPos, TilePos stopPos, WayType type/*=roadOnly */, Size arrivedArea ) { switch( type ) { case allTerrain: { const Tilemap& tmap = city->getTilemap(); Pathway ret; Pathfinder::getInstance().getPath( tmap.at( startPos ), tmap.at( stopPos ), ret, 0, arrivedArea ); return ret; } break; case roadFirst: { const Tilemap& tmap = city->getTilemap(); Pathway ret; Pathfinder::getInstance().getPath( tmap.at( startPos ), tmap.at( stopPos ), ret, 0, arrivedArea ); return ret; } break; default: break; } return Pathway(); }
MerchantPtr Merchant::create( EmpirePtr empire, TraderoutePtr route, const std::string& start, good::Store &sell, good::Store &buy ) { MerchantPtr ret( new Merchant( empire ) ); ret->drop(); ret->_d->route = route; bool startCity = (route->beginCity()->name() == start); ret->_d->sells.resize( sell ); ret->_d->sells.storeAll( sell ); ret->_d->buys.resize( buy ); ret->_d->buys.storeAll( buy ); CityPtr baseCity = startCity ? route->beginCity() : route->endCity(); CityPtr destCity = startCity ? route->endCity() : route->beginCity(); ret->_d->baseCity = baseCity->name(); ret->_d->destCity = destCity->name(); ret->_d->steps = route->points( !startCity ); ret->_d->step = 0; bool noWayForMe = ret->_d->steps.empty(); if( noWayForMe ) { return MerchantPtr(); } ret->setPicture( gfx::Picture( ResourceGroup::empirebits, route->isSeaRoute() ? PicID::seaTradeRoute : PicID::landTradeRoute )); ret->setLocation( ret->_d->steps.front() ); return ret; }
void ScreenGame::setScenario(Scenario& scenario) { _d->scenario = &scenario; CityPtr city = scenario.getCity(); Tilemap& tilemap = city->getTilemap(); _d->mapArea.init( tilemap ); _d->mapRenderer.init( city, _d->mapArea, this); }
void HighBridge::destroy() { CityPtr city = Scenario::instance().getCity(); for( HighBridgeSubTiles::iterator it=_d->subtiles.begin(); it != _d->subtiles.end(); it++ ) { (*it)->_parent = 0; city->clearLand( (*it)->_pos ); std::string picName = TerrainTileHelper::convId2PicName( (*it)->_imgId ); city->getTilemap().at( (*it)->_pos ).setPicture( &Picture::load( picName ) ); city->getTilemap().at( (*it)->_pos ).getTerrain().decode( (*it)->_info ); } }
CityServiceProsperity::CityServiceProsperity( CityPtr city ) : CityService( getDefaultName() ), _d( new Impl ) { _d->city = city; _d->lastDate = GameDate::current(); _d->prosperity = 0; _d->houseCapTrand = 0; _d->prosperityExtend = 0; _d->makeProfit = false; _d->lastYearBalance = city->getFunds().getValue(); _d->worklessPercent = 0; _d->workersSalary = city->getFunds().getWorkerSalary(); _d->lastYearProsperity = 0; _d->percentPlebs = 0; }
void FishPlace::build(CityPtr city, const TilePos& pos) { _d->savePicture = &city->getTilemap().at( pos ).getPicture(); setPicture( *_d->savePicture ); TileOverlay::build( city, pos ); }
void TileOverlay::build( CityPtr city, const TilePos& pos ) { Tilemap &tilemap = city->getTilemap(); _d->city = city; _d->masterTile = &tilemap.at( pos ); 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.setMasterTile( _d->masterTile ); tile.setPicture( &_d->picture ); if( tile.getOverlay().isValid() && tile.getOverlay() != this ) { tile.getOverlay()->deleteLater(); } tile.setOverlay( this ); initTerrain( tile ); } } }
void GameLoaderC3Map::Impl::initClimate(std::fstream &f, CityPtr ioCity) { // read climate unsigned int i = 0; f.seekg(kClimate, std::ios::beg); f.read((char*)&i, 1); ClimateType climate = (ClimateType) i; ioCity->setClimate(climate); StringHelper::debug( 0xff, "Climate type is %d", climate ); // reload all pics for the given climate // PicLoader &pic_loader = PicLoader::instance(); // if (climate == C_CENTRAL) // { // pic_loader.load_archive("resources/pics/pics.zip"); // } // else if (climate == C_NORTHERN) // { // pic_loader.load_archive("resources/pics/pics_north.zip"); // } // else if (climate == C_DESERT) // { // pic_loader.load_archive("resources/pics/pics_south.zip"); // } }
void LowBridge::build( CityPtr city, const TilePos& pos ) { TilePos endPos, startPos; _d->direction=noneDirection; _d->subtiles.clear(); _fgPicturesRef().clear(); Tilemap& tilemap = city->getTilemap(); _checkParams( city, _d->direction, startPos, endPos, pos ); int signSum = 1; if( _d->direction != noneDirection ) { switch( _d->direction ) { case northEast: _computePictures( city, endPos, startPos, southWest ); std::swap( _d->subtiles.front()->_pos, _d->subtiles.back()->_pos ); signSum = -1; break; case northWest: _computePictures( city, endPos, startPos, southEast ); std::swap( _d->subtiles.front()->_pos, _d->subtiles.back()->_pos ); std::swap( startPos, endPos ); signSum = -1; break; case southWest: _computePictures( city, startPos, endPos, _d->direction ); std::swap( startPos, endPos ); break; case southEast: _computePictures( city, startPos, endPos, _d->direction ); break; default: break; } TilemapArea tiles = tilemap.getArea( startPos, endPos ); int index=0; for( TilemapArea::iterator it=tiles.begin(); it != tiles.end(); it++ ) { LowBridgeSubTilePtr subtile = _d->subtiles[ index ]; TilePos buildPos = pos + subtile->_pos * signSum; Tile& tile = tilemap.at( buildPos ); subtile->setPicture( tile.getPicture() ); subtile->_imgId = tile.getOriginalImgId(); subtile->_info = TileHelper::encode( tile ); subtile->_parent = this; events::GameEventPtr event = events::BuildEvent::create( buildPos, subtile.as<TileOverlay>() ); event->dispatch(); index++; } } }
void LowBridge::build( CityPtr city, const TilePos& pos ) { TilePos endPos, startPos; _d->direction=D_NONE; _d->subtiles.clear(); _fgPictures.clear(); Tilemap& tilemap = city->getTilemap(); _checkParams( city, _d->direction, startPos, endPos, pos ); int signSum = 1; if( _d->direction != D_NONE ) { switch( _d->direction ) { case D_NORTH_EAST: _computePictures( city, endPos, startPos, D_SOUTH_WEST ); std::swap( _d->subtiles.front()->_pos, _d->subtiles.back()->_pos ); signSum = -1; break; case D_NORTH_WEST: _computePictures( city, endPos, startPos, D_SOUTH_EAST ); std::swap( _d->subtiles.front()->_pos, _d->subtiles.back()->_pos ); std::swap( startPos, endPos ); signSum = -1; break; case D_SOUTH_WEST: _computePictures( city, startPos, endPos, _d->direction ); std::swap( startPos, endPos ); break; case D_SOUTH_EAST: _computePictures( city, startPos, endPos, _d->direction ); break; default: break; } TilemapArea tiles = tilemap.getFilledRectangle( startPos, endPos ); int index=0; for( TilemapArea::iterator it=tiles.begin(); it != tiles.end(); it++ ) { LowBridgeSubTilePtr subtile = _d->subtiles[ index ]; TilePos buildPos = pos + subtile->_pos * signSum; Tile& tile = tilemap.at( buildPos ); subtile->setPicture( tile.getPicture() ); subtile->_imgId = tile.getOriginalImgId(); subtile->_info = TileHelper::encode( tile ); subtile->_parent = this; GameEventMgr::append( BuildEvent::create( buildPos, subtile.as<Construction>() ) ); index++; } } }
bool Barbarian::_attackObject(ObjectPtr obj) { if( obj.is<WMerchant>() ) { obj->deleteLater(); return true; } else if( obj.is<City>() ) { CityPtr pcity = obj.as<City>(); pcity->addObject( this ); return !pcity->strength(); } //else if( ) return false; }
PlayerArmyPtr PlayerArmy::create(EmpirePtr empire, CityPtr city) { PlayerArmyPtr ret( new PlayerArmy( empire ) ); ret->_d->base = city; ret->setLocation( city->location() - Point( 0, 10 )); ret->drop(); return ret; }
void GameLoaderC3Map::Impl::initCameraStartPos(std::fstream &f, CityPtr 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); ioCity->setCameraPos( TilePos( i, j ) ); }
bool MarbleQuarry::canBuild( CityPtr city, const TilePos& pos ) const { bool is_constructible = Construction::canBuild( city, pos ); bool near_mountain = false; // tells if the factory is next to a mountain Tilemap& tilemap = city->getTilemap(); TilemapTiles perimetr = tilemap.getRectangle( pos + TilePos( -1, -1 ), getSize() + Size( 2 ), Tilemap::checkCorners); foreach( Tile* tile, perimetr ) { near_mountain |= tile->getFlag( Tile::tlRock ); }
void drawReportRow( const Point& pos, const std::string& title, CityFunds::IssueType type ) { Font font = Font::create( FONT_1 ); int lyvalue = city->getFunds().getIssueValue( type, CityFunds::lastYear ); int tyvalue = city->getFunds().getIssueValue( type, CityFunds::thisYear ); font.draw( *background, title, pos, false ); font.draw( *background, StringHelper::format( 0xff, "%d", lyvalue ), pos + Point( 215, 0), false ); font.draw( *background, StringHelper::format( 0xff, "%d", tyvalue ), pos + Point( 355, 0), false ); }
void Emperor::Impl::updateRelation(CityPtr cityp) { if (!cityp->isAvailable()) return; Relation &relation = relations[cityp->name()]; relation.soldiers.sent = 0; // clear chasteners count relation.change(-config::emperor::yearlyFavorDecrease); int monthWithoutTax = relation.lastTaxDate.monthsTo(game::Date::current()); if (monthWithoutTax > DateTime::monthsInYear) { int decrease = math::clamp(taxBrokenFavourDecrease + monthWithoutTax / DateTime::monthsInYear * 2, 0, taxBrokenFavourDecreaseMax); relation.change(-decrease); } float salaryKoeff = EmpireHelper::governorSalaryKoeff(cityp); if (salaryKoeff > 1.f) { salaryKoeff = -(int)salaryKoeff * salaryKoeff; } else if (salaryKoeff < 1.f) { salaryKoeff = normalSalaryFavourUpdate; } else { salaryKoeff = 0; } relation.change(salaryKoeff); int brokenEmpireTax = cityp->treasury().getIssueValue( econ::Issue::overdueEmpireTax, econ::Treasury::lastYear); if (brokenEmpireTax > 0) { relation.change(-brokenTaxPenalty); brokenEmpireTax = cityp->treasury().getIssueValue( econ::Issue::overdueEmpireTax, econ::Treasury::twoYearsAgo); if (brokenEmpireTax > 0) relation.change(-brokenMoreTaxPenalty); } }
void GameLoaderC3Map::Impl::initEntryExit(std::fstream &f, CityPtr ioCity) { unsigned int size = ioCity->getTilemap().getSize(); // 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); ioCity->setRoadEntry( TilePos( i, size - j - 1 ) ); i = 0; j = 0; f.read((char*)&i, 2); f.read((char*)&j, 2); ioCity->setRoadExit( TilePos( i, size - j - 1 ) ); // init boat entry/exit point i = 0; j = 0; f.seekg(kBoatEntry, std::ios::beg); f.read((char*)&i, 2); f.read((char*)&j, 2); ioCity->setBoatEntry( TilePos( i, size - j - 1 ) ); i = 0; j = 0; f.read((char*)&i, 2); f.read((char*)&j, 2); ioCity->setBoatExit( TilePos( i, size - j - 1) ); //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; }
CityList Emperor::Impl::findTroubleCities() { CityList ret; for (auto &item : relations) { CityPtr city = empire->findCity(item.first); Relation &relation = item.second; if (!city.isValid()) { Logger::warning("!!! city not availaible " + item.first); continue; } bool emperorAngry = relation.value() < minimumFavour4wrathGenerate; if (emperorAngry) { relation.wrathPoint += math::clamp(maxWrathPointValue - relation.value(), 0, maxWrathPointValue); if (relation.soldiers.sent == 0) ret.push_back(city); } else { relation.wrathPoint = 0; } } return ret; }
bool Construction::canBuild( CityPtr city, const TilePos& pos ) const { Tilemap& tilemap = city->getTilemap(); bool is_constructible = true; //return area for available tiles TilemapArea area = tilemap.getFilledRectangle( pos, getSize() ); //on over map size if( (int)area.size() != getSize().getArea() ) return false; foreach( Tile* tile, area ) { is_constructible &= tile->getFlag( Tile::isConstructible ); }
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 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 Garden::build( CityPtr city, const TilePos& pos ) { // this is the same arrangement of garden tiles as existed in C3 int theGrid[2][2] = {{113, 110}, {112, 111}}; Construction::build( city, pos ); setPicture( ResourceGroup::entertaiment, theGrid[pos.getI() % 2][pos.getJ() % 2] ); if( getSize().getArea() == 1 ) { TilemapTiles tilesAround = city->getTilemap().getRectangle( getTilePos() - TilePos( 1, 1), getTilePos() + TilePos( 1, 1 ) ); foreach( Tile* tile, tilesAround ) { GardenPtr garden = tile->getOverlay().as<Garden>(); if( garden.isValid() ) { garden->update(); } }
Pathway PathwayHelper::randomWay(CityPtr city, TilePos startPos, int walkRadius) { int loopCounter = 0; //loop limiter do { const Tilemap& tmap = city->getTilemap(); TilePos destPos( std::rand() % walkRadius - walkRadius / 2, std::rand() % walkRadius - walkRadius / 2 ); destPos = (startPos+destPos).fit( TilePos( 0, 0 ), TilePos( tmap.getSize()-1, tmap.getSize()-1 ) ); if( tmap.at( destPos ).isWalkable( true) ) { Pathway pathway = create( city, startPos, destPos, PathwayHelper::allTerrain ); if( pathway.isValid() ) { return pathway; } } } while( ++loopCounter < 20 ); return Pathway(); }
void GameLoaderC3Map::Impl::loadCity(std::fstream& f, CityPtr oCity) { Tilemap& oTilemap = oCity->getTilemap(); /* get number of city */ f.seekg(kLocation, std::ios::beg); unsigned int location=0; f.read((char*)&location, 1); StringHelper::debug( 0xff, "Location of city is %d", (int)(location+1) ); std::string cityName = ""; switch( location+1 ) { case 1: case 29: cityName = "Lugdunum"; break; case 2: cityName = "Corinthus"; break; case 3: case 37: cityName = "Londinium"; break; case 4: case 13: case 28: cityName = "Mediolanum"; break; case 5: case 40: cityName = "Lindum"; break; case 6: cityName = "Toletum"; break; case 7: case 33: cityName = "Valentia"; break; case 8: case 35: cityName = "Caesarea"; break; case 9: case 30: cityName = "Carthago"; break; case 10: cityName = "Cyrene"; break; case 11: case 15: case 25: cityName = "Tarraco"; break; case 12: cityName = "Hierosolyma"; break; case 14: case 26: cityName = "Syracusae"; break; case 16: case 31: cityName = "Tarsus"; break; case 17: case 32: cityName = "Tingis"; break; case 18: cityName = "Augusta Trevorum"; break; case 19: cityName = "Carthago Nova"; break; case 20: cityName = "Leptis Magna"; break; case 21: cityName = "Athenae"; break; case 22: cityName = "Brundisium"; break; case 23: cityName = "Capua"; break; case 24: cityName = "Tarentum"; break; case 27: cityName = "Miletus"; break; case 34: cityName = "Lutetia"; break; case 36: cityName = "Sarmizegetusa"; break; case 38: cityName = "Damascus"; break; case 39: cityName = "Massilia"; break; } oCity->setName( cityName ); f.seekg(kSize, std::ios::beg); int size; // 32bits int size_2; f.read((char*)&size, 4); f.read((char*)&size_2, 4); StringHelper::debug( 0xff, "Map size is %d", size ); if (size != size_2) { THROW("Horisontal and vertical map sizes are different!"); } oTilemap.resize(size); // need to rewrite better ScopedPtr<short> pGraphicGrid( new short[26244] ); ScopedPtr<unsigned char> pEdgeGrid( new unsigned char[26244] ); ScopedPtr<short> pTerrainGrid( new short[26244] ); ScopedPtr<unsigned char> pRndmTerGrid( new unsigned char[26244] ); ScopedPtr<unsigned char> pRandomGrid( new unsigned char[26244] ); ScopedPtr<unsigned char> pZeroGrid( new unsigned char[26244] ); if( pGraphicGrid.isNull() || pEdgeGrid.isNull() || pTerrainGrid.isNull() || pRndmTerGrid.isNull() || pRandomGrid.isNull() || pZeroGrid.isNull() ) { THROW("NOT ENOUGH MEMORY!!!! FATAL"); } // here also make copy of original arrays in memory f.seekg(kGraphicGrid, std::ios::beg); f.read((char*)pGraphicGrid.data(), 52488); f.seekg(kEdgeGrid, std::ios::beg); f.read((char*)pEdgeGrid.data(), 26244); f.seekg(kTerrainGrid, std::ios::beg); f.read((char*)pTerrainGrid.data(), 52488); f.seekg(kRndmTerGrid, std::ios::beg); f.read((char*)pRndmTerGrid.data(), 26244); f.seekg(kRandomGrid, std::ios::beg); f.read((char*)pRandomGrid.data(), 26244); f.seekg(kZeroGrid, std::ios::beg); f.read((char*)pZeroGrid.data(), 26244); std::map< int, std::map< int, unsigned char > > edgeData; // loads the graphics map int border_size = (162 - size) / 2; for (int itA = 0; itA < size; ++itA) { for (int itB = 0; itB < size; ++itB) { int i = itB; int j = size - itA - 1; int index = 162 * (border_size + itA) + border_size + itB; Tile& tile = oTilemap.at(i, j); tile.setPicture( TileHelper::convId2PicName( pGraphicGrid.data()[index] ) ); tile.setOriginalImgId( pGraphicGrid.data()[index] ); edgeData[ i ][ j ] = pEdgeGrid.data()[index]; TileHelper::decode( tile, pTerrainGrid.data()[index] ); } } for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { unsigned char ed = edgeData[ i ][ j ]; if( ed == 0x00) { int size = 1; { int dj; try { // find size, 5 is maximal size for building for (dj = 0; dj < 5; ++dj) { int edd = edgeData[ i ][ j - dj ]; // find bottom left corner if (edd == 8 * dj + 0x40) { size = dj + 1; break; } } } catch(...) { size = dj + 1; } } StringHelper::debug( 0xff, "Multi-tile x %d at (%d,%d)", size, i, j ); Tile& master = oTilemap.at(i, j - size + 1); StringHelper::debug( 0xff, "Master will be at (%d,%d)", master.getI(), master.getJ() ); for (int di = 0; di < size; ++di) { for (int dj = 0; dj < size; ++dj) { oTilemap.at(master.getI() + di, master.getJ() + dj).setMasterTile(&master); } } StringHelper::debug( 0xff, " decoding " ); } // Check if it is building and type of building //if (ttile.getMasterTile() == NULL) decodeTerrain( oTilemap.at( i, j ), oCity ); } } }
void ScreenGame::initialize( GfxEngine& engine, GuiEnv& gui ) { _d->gui = &gui; _d->engine = &engine; _d->infoBoxMgr = InfoBoxManager::create( &gui ); CityPtr city = _d->scenario->getCity(); _d->gui->clear(); /*new PopupMessageBox( _d->gui->getRootWidget(), "Test title", "This is test string for popup message box", "Sen 351 BC", "For New player" ); */ const int topMenuHeight = 23; const Picture& rPanelPic = Picture::load( ResourceGroup::panelBackground, 14 ); Rect rPanelRect( engine.getScreenWidth() - rPanelPic.getWidth(), topMenuHeight, engine.getScreenWidth(), engine.getScreenHeight() ); _d->rightPanel = MenuRigthPanel::create( gui.getRootWidget(), rPanelRect, rPanelPic); _d->topMenu = TopMenu::create( gui.getRootWidget(), topMenuHeight ); _d->topMenu->setPopulation( city->getPopulation() ); _d->topMenu->setFunds( city->getFunds().getValue() ); _d->topMenu->setDate( GameDate::current() ); _d->menu = Menu::create( gui.getRootWidget(), -1, _d->scenario->getCity() ); _d->menu->setPosition( Point( engine.getScreenWidth() - _d->menu->getWidth() - _d->rightPanel->getWidth(), _d->topMenu->getHeight() ) ); _d->extMenu = ExtentMenu::create( gui.getRootWidget(), _d->mapRenderer, -1, _d->scenario->getCity() ); _d->extMenu->setPosition( Point( engine.getScreenWidth() - _d->extMenu->getWidth() - _d->rightPanel->getWidth(), _d->topMenu->getHeight() ) ); _d->wndStackMsgs = WindowMessageStack::create( gui.getRootWidget(), -1 ); _d->wndStackMsgs->setPosition( Point( gui.getRootWidget()->getWidth() / 4, 33 ) ); _d->wndStackMsgs->sendToBack(); _d->rightPanel->bringToFront(); // 8*30: used for high buildings (granary...), visible even when not in tilemap_area. getMapArea().setViewSize( engine.getScreenSize() + Size( 180 ) ); // here move camera to start position of map getMapArea().setCenterIJ( _d->scenario->getCity()->getCameraPos() ); new SenatePopupInfo( _d->gui->getRootWidget(), _d->mapRenderer ); //connect elements CONNECT( _d->topMenu, onSave(), _d.data(), Impl::showSaveDialog ); CONNECT( _d->topMenu, onExit(), this, ScreenGame::resolveExitGame ); CONNECT( _d->topMenu, onEnd(), this, ScreenGame::resolveEndGame ); CONNECT( _d->topMenu, onRequestAdvisor(), _d.data(), Impl::showAdvisorsWindow ); CONNECT( _d->menu, onCreateConstruction(), _d.data(), Impl::resolveCreateConstruction ); CONNECT( _d->menu, onRemoveTool(), _d.data(), Impl::resolveRemoveTool ); CONNECT( _d->menu, onMaximize(), _d->extMenu, ExtentMenu::maximize ); CONNECT( _d->extMenu, onCreateConstruction(), _d.data(), Impl::resolveCreateConstruction ); CONNECT( _d->extMenu, onRemoveTool(), _d.data(), Impl::resolveRemoveTool ); CONNECT( city, onPopulationChanged(), _d->topMenu, TopMenu::setPopulation ); CONNECT( city, onFundsChanged(), _d->topMenu, TopMenu::setFunds ); CONNECT( &GameDate::instance(), onMonthChanged(), _d->topMenu, TopMenu::setDate ); CONNECT( &_d->mapRenderer, onShowTileInfo(), _d.data(), Impl::showTileInfo ); CONNECT( city, onWarningMessage(), _d->wndStackMsgs, WindowMessageStack::addMessage ); CONNECT( &_d->mapRenderer, onWarningMessage(), _d->wndStackMsgs, WindowMessageStack::addMessage ); CONNECT( _d->extMenu, onSelectOverlayType(), _d.data(), Impl::resolveSelectOverlayView ); CONNECT( _d->extMenu, onEmpireMapShow(), _d.data(), Impl::showEmpireMapWindow ); CONNECT( _d->extMenu, onAdvisorsWindowShow(), _d.data(), Impl::showAdvisorsWindow ); CONNECT( _d->extMenu, onMissionTargetsWindowShow(), _d.data(), Impl::showMissionTaretsWindow ); CONNECT( city, onDisasterEvent(), &_d->alarmsHolder, AlarmEventHolder::add ); CONNECT( _d->extMenu, onSwitchAlarm(), &_d->alarmsHolder, AlarmEventHolder::next ); CONNECT( &_d->alarmsHolder, onMoveToAlarm(), &_d->mapArea, TilemapArea::setCenterIJ ); CONNECT( &_d->alarmsHolder, onAlarmChange(), _d->extMenu, ExtentMenu::setAlarmEnabled ); }
void LowBridge::_checkParams( CityPtr city, constants::Direction& direction, TilePos& start, TilePos& stop, const TilePos& curPos ) const { start = curPos; Tilemap& tilemap = city->getTilemap(); Tile& tile = tilemap.at( curPos ); if( tile.getFlag( Tile::tlRoad ) ) { direction = constants::noneDirection; return; } int imdId = tile.getOriginalImgId(); if( imdId == 384 || imdId == 385 || imdId == 386 || imdId == 387 ) { TilemapArea tiles = tilemap.getArea( curPos - TilePos( 10, 0), curPos ); for( TilemapArea::reverse_iterator it=tiles.rbegin(); it != tiles.rend(); it++ ) { imdId = (*it)->getOriginalImgId(); if( imdId == 376 || imdId == 377 || imdId == 378 || imdId == 379 ) { stop = (*it)->getIJ(); direction = constants::northWest; break; } } } else if( imdId == 376 || imdId == 377 || imdId == 378 || imdId == 379 ) { TilemapArea tiles = tilemap.getArea( curPos, curPos + TilePos( 10, 0) ); for( TilemapArea::reverse_iterator it=tiles.rbegin(); it != tiles.rend(); it++ ) { imdId = (*it)->getOriginalImgId(); if( imdId == 384 || imdId == 385 || imdId == 386 || imdId == 387 ) { stop = (*it)->getIJ(); direction = southEast; break; } } } else if( imdId == 372 || imdId == 373 || imdId == 374 || imdId == 375 ) { TilemapArea tiles = tilemap.getArea( curPos, curPos + TilePos( 0, 10) ); for( TilemapArea::reverse_iterator it=tiles.rbegin(); it != tiles.rend(); it++ ) { imdId = (*it)->getOriginalImgId(); if( imdId == 380 || imdId == 381 || imdId == 382 || imdId == 383 ) { stop = (*it)->getIJ(); direction = northEast; break; } } } else if( imdId == 380 || imdId == 381 || imdId == 382 || imdId == 383 ) { TilemapArea tiles = tilemap.getArea( curPos - TilePos( 0, 10), curPos ); for( TilemapArea::reverse_iterator it=tiles.rbegin(); it != tiles.rend(); it++ ) { imdId = (*it)->getOriginalImgId(); if( imdId == 372 || imdId == 373 || imdId == 374 || imdId == 375 ) { stop = (*it)->getIJ(); direction = southWest; break; } } } else { direction = noneDirection; } }
void updateTaxRateNowLabel() { std::string strCurretnTax = StringHelper::format( 0xff, "%d%% %s %d %s", city->getTaxRate(), _("##may_collect_about##"), 0, _("##denaries##") ); lbTaxRateNow->setText( strCurretnTax ); }
AdvisorFinanceWindow::AdvisorFinanceWindow( CityPtr city, Widget* parent, int id ) : Widget( parent, id, Rect( 0, 0, 1, 1 ) ), _d( new Impl ) { _d->city = city; setGeometry( Rect( Point( (parent->getWidth() - 640 )/2, parent->getHeight() / 2 - 242 ), Size( 640, 420 ) ) ); Label* title = new Label( this, Rect( 60, 10, 60 + 210, 10 + 40) ); title->setText( _("##Finance advisor##") ); title->setFont( Font::create( FONT_3 ) ); title->setTextAlignment( alignUpperLeft, alignCenter ); _d->background.reset( Picture::create( getSize() ) ); //main _d->_d->background GuiPaneling::instance().draw_white_frame(*_d->background, 0, 0, getWidth(), getHeight() ); Picture& icon = Picture::load( ResourceGroup::panelBackground, 265 ); _d->background->draw( icon, Point( 11, 11 ) ); //buttons _d->_d->background Font fontWhite = Font::create( FONT_1_WHITE ); GuiPaneling::instance().draw_black_frame( *_d->background, 70, 50, getWidth() - 86, 70 ); std::string moneyStr = StringHelper::format( 0xff, "%s %d %s", _("##city_have##"), city->getFunds().getValue(), _("##denaries##") ); fontWhite.draw( *_d->background, moneyStr, 70, 55, false ); fontWhite.draw( *_d->background, _("##tax_rate##"), 65, 75, false ); _d->lbTaxRateNow = new Label( this, Rect( 245, 75, 245 + 350, 75 + 20 ), "" ); _d->lbTaxRateNow->setFont( fontWhite ); _d->updateTaxRateNowLabel(); std::string strRegPaeyrs = StringHelper::format( 0xff, "%d%% %s", 0, _("##population_registered_as_taxpayers##") ); fontWhite.draw( *_d->background, strRegPaeyrs, 70, 95, false ); Font font = Font::create( FONT_1 ); font.draw( *_d->background, _("##Last year##"), 265, 130, false ); font.draw( *_d->background, _("##This year##"), 400, 130, false ); Point startPoint( 75, 145 ); Point offset( 0, 17 ); _d->drawReportRow( startPoint, _("##Taxes##"), 0, 0 ); _d->drawReportRow( startPoint + offset, _("##Trade##"), 0, 0 ); _d->drawReportRow( startPoint + offset * 2, _("##Donations"), 0, 0 ); _d->drawReportRow( startPoint + offset * 3, _("##Debet##"), 0, 0 ); _d->background->fill( 0xff000000, Rect( startPoint + offset * 3 + Point( 200, 0 ), Size( 72, 1) ) ); _d->background->fill( 0xff000000, Rect( startPoint + offset * 3 + Point( 340, 0 ), Size( 72, 1) ) ); startPoint += Point( 0, 6 ); _d->drawReportRow( startPoint + offset * 4, _("##Import##"), 0, 0 ); _d->drawReportRow( startPoint + offset * 5, _("##Salaries##"), 0, 0 ); _d->drawReportRow( startPoint + offset * 6, _("##Buildings##"), 0, 0 ); _d->drawReportRow( startPoint + offset * 7, _("##Percents##"), 0, 0 ); _d->drawReportRow( startPoint + offset * 8, _("##Self salary##"), 0, 0 ); _d->drawReportRow( startPoint + offset * 9, _("##Other##"), 0, 0 ); _d->drawReportRow( startPoint + offset * 10, _("##Empire tax##"), 0, 0 ); _d->background->fill( 0xff000000, Rect( startPoint + offset * 10 + Point( 200, 0 ), Size( 72, 1) ) ); _d->background->fill( 0xff000000, Rect( startPoint + offset * 10 + Point( 340, 0 ), Size( 72, 1) ) ); _d->drawReportRow( startPoint + offset * 11, _("##Credit##"), 0, 0 ); startPoint += Point( 0, 6 ); _d->drawReportRow( startPoint + offset * 12, _("##Profit##"), 0, 0 ); startPoint += Point( 0, 6 ); _d->drawReportRow( startPoint + offset * 13, _("##Balance##"), 0, 0 ); _d->btnHelp = new TexturedButton( this, Point( 12, getHeight() - 39), Size( 24 ), -1, ResourceMenu::helpInfBtnPicId ); Picture pic = Picture::load( ResourceGroup::advisorwindow, 1 ); PushButton* btn = new PushButton( this, Rect( Point( 185, 70 ), Size( 24 ) ), "", -1 ); btn->setPicture( &pic, stNormal ); btn->setPicture( &pic, stHovered ); btn->setPicture( &pic, stPressed ); pic = Picture::load( ResourceGroup::advisorwindow, 2 ); btn = new PushButton( this, Rect( Point( 185+24, 70 ), Size( 24 ) ), "", -1 ); btn->setPicture( &pic, stNormal ); btn->setPicture( &pic, stHovered ); btn->setPicture( &pic, stPressed ); }
void ScenarioMapLoader::Impl::loadMap(std::fstream& f, Scenario& oScenario) { CityPtr oCity = oScenario.getCity(); Tilemap& oTilemap = oCity->getTilemap(); /* get number of city */ f.seekg(kLocation, std::ios::beg); unsigned int location=0; f.read((char*)&location, 1); StringHelper::debug( 0xff, "Location of city is %d", (int)(location+1) ); std::string cityName = ""; switch( location+1 ) { case 1: case 29: cityName = "Lugdunum"; break; case 2: cityName = "Corinthus"; break; case 3: case 37: cityName = "Londinium"; break; case 4: case 13: case 28: cityName = "Mediolanum"; break; case 5: case 40: cityName = "Lindum"; break; case 6: cityName = "Toletum"; break; case 7: case 33: cityName = "Valentia"; break; case 8: case 35: cityName = "Caesarea"; break; case 9: case 30: cityName = "Carthago"; break; case 10: cityName = "Cyrene"; break; case 11: case 15: case 25: cityName = "Tarraco"; break; case 12: cityName = "Hierosolyma"; break; case 14: case 26: cityName = "Syracusae"; break; case 16: case 31: cityName = "Tarsus"; break; case 17: case 32: cityName = "Tingis"; break; case 18: cityName = "Augusta Trevorum"; break; case 19: cityName = "Carthago Nova"; break; case 20: cityName = "Leptis Magna"; break; case 21: cityName = "Athenae"; break; case 22: cityName = "Brundisium"; break; case 23: cityName = "Capua"; break; case 24: cityName = "Tarentum"; break; case 27: cityName = "Miletus"; break; case 34: cityName = "Lutetia"; break; case 36: cityName = "Sarmizegetusa"; break; case 38: cityName = "Damascus"; break; case 39: cityName = "Massilia"; break; } oCity->setName( cityName ); f.seekg(kSize, std::ios::beg); int size; // 32bits int size_2; f.read((char*)&size, 4); f.read((char*)&size_2, 4); StringHelper::debug( 0xff, "Map size is %d", size ); if (size != size_2) { THROW("Horisontal and vertical map sizes are different!"); } oTilemap.init(size); // need to rewrite better short int *pGraphicGrid = (short int *)malloc(52488); unsigned char *pEdgeGrid = (unsigned char *)malloc(26244); short int *pTerrainGrid = (short int *)malloc(52488); unsigned char *pRndmTerGrid = (unsigned char *)malloc(26244); unsigned char *pRandomGrid = (unsigned char *)malloc(26244); unsigned char *pZeroGrid = (unsigned char *)malloc(26244); if( pGraphicGrid == NULL || pEdgeGrid == NULL || pTerrainGrid == NULL || pRndmTerGrid == NULL || pRandomGrid == NULL || pZeroGrid == NULL ) { THROW("NOT ENOUGH MEMORY!!!! FATAL"); } // here also make copy of original arrays in memory f.seekg(kGraphicGrid, std::ios::beg); f.read((char*)pGraphicGrid, 52488); f.seekg(kEdgeGrid, std::ios::beg); f.read((char*)pEdgeGrid, 26244); f.seekg(kTerrainGrid, std::ios::beg); f.read((char*)pTerrainGrid, 52488); f.seekg(kRndmTerGrid, std::ios::beg); f.read((char*)pRndmTerGrid, 26244); f.seekg(kRandomGrid, std::ios::beg); f.read((char*)pRandomGrid, 26244); f.seekg(kZeroGrid, std::ios::beg); f.read((char*)pZeroGrid, 26244); // loads the graphics map int border_size = (162 - size) / 2; for (int itA = 0; itA < size; ++itA) { for (int itB = 0; itB < size; ++itB) { int i = itB; int j = size - itA - 1; int index = 162 * (border_size + itA) + border_size + itB; TerrainTile terrain(pGraphicGrid[index], pEdgeGrid[index], pTerrainGrid[index], pRndmTerGrid[index], pRandomGrid[index], pZeroGrid[index] ); Tile& tile = oTilemap.at(i, j); Picture& pic = Picture::load( TerrainTileHelper::convId2PicName( pGraphicGrid[index] ) ); tile.setPicture( &pic ); tile.getTerrain() = terrain; // what happens here? } } for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { Tile& tile = oTilemap.at(i, j); TerrainTile& terrain = tile.getTerrain(); if (terrain.getEdgeData()==0x00) { int size = 1; { int dj; try { // find size, 5 is maximal size for building for (dj = 0; dj < 5; ++dj) { int edge = oTilemap.at(i, j - dj).getTerrain().getEdgeData(); // find bottom left corner if (edge == 8 * dj + 0x40) { size = dj + 1; break; } } } catch(...) { size = dj + 1; } } StringHelper::debug( 0xff, "Multi-tile x %d at (%d,%d)", size, i, j ); bool bBad = false; //Str << "probing "; /* for (int di = 0; di < size && !bBad; ++di) { for (int dj = 0; dj < size && !bBad; ++dj) { //std::cout << i - di << "," << j - dj << " "; try { int edge = oTilemap.at(i - di, j - dj).getTerrain().getEdgeData(); } catch(...) { } // if (edge != 8 * dj + di && edge != 8 * dj + 0x40) // bBad = true; } }*/ //std::cout << std::endl; if (bBad) THROW ("ERROR in multi-tiles!!!"); Tile& master = oTilemap.at(i, j - size + 1); StringHelper::debug( 0xff, "Master will be at (%d,%d)", master.getI(), master.getJ() ); for (int di = 0; di < size; ++di) { for (int dj = 0; dj < size; ++dj) { oTilemap.at(master.getI() + di, master.getJ() + dj).setMasterTile(&master); } } StringHelper::debug( 0xff, " decoding " ); } TilePos pos( i, j ); Tile &ttile = oTilemap.at( pos ); LandOverlayPtr overlay = ttile.getTerrain().getOverlay(); // Check if it is building and type of building //if (ttile.getMasterTile() == NULL) decodeTerrain(ttile, oCity ); } } }