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(); }
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 ); } }
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 ); } } }
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 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++; } } }
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); }
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 ); }
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 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(); } }
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; }
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 HighBridge::_computePictures( CityPtr city, const TilePos& startPos, const TilePos& endPos, DirectionType dir ) { Tilemap& tilemap = city->getTilemap(); //Picture& water = Picture::load( "land1a", 120 ); switch( dir ) { case D_NORTH_WEST: { TilemapArea tiles = tilemap.getFilledRectangle( endPos, startPos ); tiles.pop_back(); tiles.pop_back(); tiles.pop_front(); _d->addSpan( tiles.front()->getIJ() - startPos - TilePos( 1, 0 ), HighBridgeSubTile::liftingSE ); _d->addSpan( tiles.front()->getIJ() - startPos, HighBridgeSubTile::liftingSE2 ); tiles.pop_front(); foreach( Tile* tile, tiles ) { _d->addSpan( tile->getIJ() - startPos, HighBridgeSubTile::spanSE ); } _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 1, 0 ), HighBridgeSubTile::descentSE ); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 2, 0 ), HighBridgeSubTile::descentSE2 ); } break; case D_NORTH_EAST: { TilemapArea tiles = tilemap.getFilledRectangle( startPos, endPos ); tiles.pop_back(); tiles.pop_back(); tiles.pop_front(); TilePos liftPos = tiles.front()->getIJ(); tiles.pop_front(); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 0, 1 ), HighBridgeSubTile::liftingSW ); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 0, 2 ), HighBridgeSubTile::liftingSW2 ); for( TilemapArea::reverse_iterator it=tiles.rbegin(); it != tiles.rend(); it++ ) { _d->addSpan( (*it)->getIJ() - startPos, HighBridgeSubTile::spanSW ); } _d->addSpan( liftPos - startPos, HighBridgeSubTile::descentSW2 ); _d->addSpan( liftPos - startPos - TilePos( 0, 1 ), HighBridgeSubTile::descentSW ); } break; case D_SOUTH_EAST: { TilemapArea tiles = tilemap.getFilledRectangle( startPos, endPos ); tiles.pop_back(); tiles.pop_back(); tiles.pop_front(); _d->addSpan( tiles.front()->getIJ() - startPos - TilePos( 1, 0 ), HighBridgeSubTile::liftingSE ); _d->addSpan( tiles.front()->getIJ() - startPos, HighBridgeSubTile::liftingSE2 ); tiles.pop_front(); foreach( Tile* tile, tiles ) { _d->addSpan( tile->getIJ() - startPos, HighBridgeSubTile::spanSE ); } _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 1, 0 ), HighBridgeSubTile::descentSE ); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 2, 0 ), HighBridgeSubTile::descentSE2 ); }
void House::levelDown() { _d->houseLevel--; _d->houseLevelSpec = HouseSpecHelper::getInstance().getHouseLevelSpec(_d->houseLevel); _d->nextHouseLevelSpec = _d->houseLevelSpec.next(); switch (_d->houseLevel) { case 1: { _d->houseId = 1; _d->picIdOffset = ( rand() % 10 > 6 ? 1 : 0 ); CityPtr city = Scenario::instance().getCity(); Tilemap& tmap = city->getTilemap(); if( getSize().getWidth() > 1 ) { _updateDesirabilityInfluence( Construction::duNegative ); PtrTilesList tiles = tmap.getFilledRectangle( getTile().getIJ(), Size(2) ); PtrTilesList::iterator it=tiles.begin(); int peoplesPerHouse = getNbHabitants() / 4; _d->currentHabitants = peoplesPerHouse; it++; //no destroy himself for( ; it != tiles.end(); it++ ) { HousePtr house = ConstructionManager::getInstance().create( B_HOUSE ).as<House>(); house->build( (*it)->getIJ() ); house->_d->currentHabitants = peoplesPerHouse; house->_update(); } setSize( Size( 1 ) ); _updateDesirabilityInfluence( Construction::duPositive ); } } break; case 2: _tryDegrage_11_to_2_lvl( 1, 5, -3 ); break; case 3: _tryDegrage_11_to_2_lvl( 3, 6, -3 ); break; case 4: _tryDegrage_11_to_2_lvl( 7, 11, -2 ); break; case 5: _tryDegrage_11_to_2_lvl( 9, 12, -2 ); break; case 6: _tryDegrage_11_to_2_lvl( 13, 17, -2 ); break; case 7: _tryDegrage_11_to_2_lvl( 15, 18, -2 ); break; case 8: _tryDegrage_11_to_2_lvl( 19, 23, -1 ); break; case 9: _tryDegrage_11_to_2_lvl( 21, 23, -1 ); break; case 10: _tryDegrage_11_to_2_lvl( 25, 29, 0 ); break; case 11: _tryDegrage_11_to_2_lvl( 27, 30, 0 ); break; } _update(); }
void LowBridge::_checkParams( CityPtr city, DirectionType& 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 = D_NONE; return; } int imdId = tile.getOriginalImgId(); if( imdId == 384 || imdId == 385 || imdId == 386 || imdId == 387 ) { TilemapArea tiles = tilemap.getFilledRectangle( 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 = D_NORTH_WEST; break; } } } else if( imdId == 376 || imdId == 377 || imdId == 378 || imdId == 379 ) { TilemapArea tiles = tilemap.getFilledRectangle( 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 = D_SOUTH_EAST; break; } } } else if( imdId == 372 || imdId == 373 || imdId == 374 || imdId == 375 ) { TilemapArea tiles = tilemap.getFilledRectangle( 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 = D_NORTH_EAST; break; } } } else if( imdId == 380 || imdId == 381 || imdId == 382 || imdId == 383 ) { TilemapArea tiles = tilemap.getFilledRectangle( 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 = D_SOUTH_WEST; break; } } } else { direction = D_NONE; } }
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 ); } } }
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 House::_tryUpdate_1_to_11_lvl( int level4grow, int startSmallPic, int startBigPic, const char desirability ) { if( getSize() == 1 ) { CityPtr city = Scenario::instance().getCity(); Tilemap& tmap = city->getTilemap(); PtrTilesList tiles = tmap.getFilledRectangle( getTile().getIJ(), Size(2) ); bool mayGrow = true; for( PtrTilesList::iterator it=tiles.begin(); it != tiles.end(); it++ ) { if( *it == NULL ) { mayGrow = false; //some broken, can't grow break; } HousePtr house = (*it)->getTerrain().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; PtrTilesList::iterator delIt=tiles.begin(); delIt++; //don't remove himself for( ; delIt != tiles.end(); delIt++ ) { HousePtr house = (*delIt)->getTerrain().getOverlay().as<House>(); if( house.isValid() ) { house->deleteLater(); house->_d->currentHabitants = 0; sumHabitants += house->getNbHabitants(); sumFreeWorkers += house->_d->freeWorkersCount; } } _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( getTile().getIJ() ); } } _updateDesirabilityInfluence( Construction::duNegative ); _d->desirability = desirability; _updateDesirabilityInfluence( Construction::duPositive ); bool bigSize = getSize().getWidth() > 1; _d->houseId = bigSize ? startBigPic : startSmallPic; _d->picIdOffset = bigSize ? 0 : ( (rand() % 10 > 6) ? 1 : 0 ); }
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 LowBridge::_computePictures( CityPtr city, const TilePos& startPos, const TilePos& endPos, constants::Direction dir ) { Tilemap& tilemap = city->getTilemap(); //Picture& water = Picture::load( "land1a", 120 ); switch( dir ) { case northWest: { TilemapArea tiles = tilemap.getArea( endPos, startPos ); tiles.pop_back(); tiles.pop_front(); _d->addSpan( tiles.front()->getIJ() - startPos - TilePos( 1, 0 ), LowBridgeSubTile::liftingSE ); for( TilemapArea::iterator it=tiles.begin(); it != tiles.end(); it++ ) { _d->addSpan( (*it)->getIJ() - startPos, LowBridgeSubTile::spanSE ); } _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 1, 0 ), LowBridgeSubTile::descentSE ); } break; case northEast: { TilemapArea tiles = tilemap.getArea( startPos, endPos ); tiles.pop_back(); tiles.pop_front(); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 0, 1 ), LowBridgeSubTile::liftingSW ); for( TilemapArea::reverse_iterator it=tiles.rbegin(); it != tiles.rend(); it++ ) { _d->addSpan( (*it)->getIJ() - startPos, LowBridgeSubTile::spanSW ); } _d->addSpan( tiles.front()->getIJ() - startPos - TilePos( 0, 1 ), LowBridgeSubTile::descentSW ); } break; case southEast: { TilemapArea tiles = tilemap.getArea( startPos, endPos ); if( tiles.size() < 3 ) break; tiles.pop_back(); tiles.pop_front(); _d->addSpan( tiles.front()->getIJ() - startPos - TilePos( 1, 0 ), LowBridgeSubTile::liftingSE ); for( TilemapArea::iterator it=tiles.begin(); it != tiles.end(); it++ ) { _d->addSpan( (*it)->getIJ() - startPos, LowBridgeSubTile::spanSE ); //_d->subtiles.push_back( LowBridgeSubTile( (*it)->getIJ() - startPos, water ) ); } _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 1, 0 ), LowBridgeSubTile::descentSE ); } break; case southWest: { TilemapArea tiles = tilemap.getArea( endPos, startPos ); if( tiles.size() < 3 ) break; tiles.pop_back(); tiles.pop_front(); _d->addSpan( tiles.back()->getIJ() - startPos + TilePos( 0, 1 ), LowBridgeSubTile::liftingSW ); for( TilemapArea::reverse_iterator it=tiles.rbegin(); it != tiles.rend(); it++ ) { _d->addSpan( (*it)->getIJ() - startPos, LowBridgeSubTile::spanSW ); //_d->subtiles.push_back( LowBridgeSubTile( (*it)->getIJ() - startPos, water ) ); } _d->addSpan( tiles.front()->getIJ() - startPos - TilePos( 0, 1 ), LowBridgeSubTile::descentSW ); } break; default: break; } for( LowBridgeSubTiles::iterator it=_d->subtiles.begin(); it != _d->subtiles.end(); it++ ) { _fgPicturesRef().push_back( (*it)->_picture ); } }
bool GameLoaderC3Sav::load(const std::string& filename, Game& game ) { std::fstream f(filename.c_str(), std::ios::in | std::ios::binary); uint32_t tmp; // 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"); } if (!f.is_open()) THROW("can't open file"); f.read((char*)&tmp, 4); // read dummy f.read((char*)&tmp, 4); // read scenario flag try { f.read((char*)&tmp, 4); // read length of compressed chunk std::cout << "length of compressed ids is " << tmp << std::endl; PKWareInputStream *pk = new PKWareInputStream(&f, false, tmp); for (int i = 0; i < 162 * 162; i++) { pGraphicGrid[i] = pk->readShort(); } pk->empty(); delete pk; f.read((char*)&tmp, 4); // read length of compressed chunk std::cout << "length of compressed egdes is " << tmp << std::endl; pk = new PKWareInputStream(&f, false, tmp); for (int i = 0; i < 162 * 162; i++) { pEdgeGrid[i] = pk->readByte(); } pk->empty(); delete pk; SkipCompressed(f); // skip building ids f.read((char*)&tmp, 4); // read length of compressed chunk std::cout << "length of compressed terraindata is " << tmp << std::endl; pk = new PKWareInputStream(&f, false, tmp); for (int i = 0; i < 162 * 162; i++) { pTerrainGrid[i] = pk->readShort(); } pk->empty(); delete pk; SkipCompressed(f); SkipCompressed(f); SkipCompressed(f); SkipCompressed(f); f.read((char*)pRandomGrid, 26244); SkipCompressed(f); SkipCompressed(f); SkipCompressed(f); SkipCompressed(f); SkipCompressed(f); // here goes walkers array f.read((char*)&tmp, 4); // read length of compressed chunk std::cout << "length of compressed walkers data is " << tmp << std::endl; pk = new PKWareInputStream(&f, false, tmp); for (int j = 0; j < 1000; j++) { pk->skip(10); pk->readShort(); pk->skip(8); pk->readByte(); pk->readByte(); pk->skip(106); } pk->empty(); delete pk; int length; f.read((char*)&length, 4); // read next length :-) if (length <= 0) f.seekg(1200, std::ios::cur); else f.seekg(length, std::ios::cur); SkipCompressed(f); SkipCompressed(f); // 3x int f.read((char*)&tmp, 4); f.read((char*)&tmp, 4); f.read((char*)&tmp, 4); SkipCompressed(f); f.seekg(70, std::ios::cur); SkipCompressed(f); // skip building list f.seekg(208, std::ios::cur); SkipCompressed(f); // skip unknown f.seekg(788, std::ios::cur); // skip unused data f.read((char*)&tmp, 4); //mapsize int size = tmp; f.seekg(1312, std::ios::cur); char climate; f.read(&climate, 1); // here goes the WORK! CityPtr oCity = game.getCity(); oCity->setClimate((ClimateType)climate); Tilemap& oTilemap = oCity->getTilemap(); oTilemap.resize(size); oCity->setCameraPos( TilePos( 0, 0 ) ); // 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[index] ) ); tile.setOriginalImgId( pGraphicGrid[index] ); TileHelper::decode( tile, pTerrainGrid[index] ); } } } catch(PKException) { THROW("fatal error when unpacking"); } f.close(); return true; }