void Build::_buildAll() { __D_REF(d,Build); auto command = d.renderer->mode().as<BuildMode>(); if( command.isNull() ) return; ConstructionPtr construction = command->contruction(); if( !construction.isValid() ) { Logger::warning( "LayerBuild: No construction for build" ); return; } if( !_city()->treasury().haveMoneyForAction( 1 ) ) { events::dispatch<WarningMessage>( "##out_of_credit##", 2 ); return; } bool buildOk = false; bool tileBusyBuilding = false; city::AreaInfo areaInfo( _city(), TilePos() ); for( auto tile : d.buildTiles ) { areaInfo.pos = tile->epos(); tileBusyBuilding |= tile->overlay().is<Building>(); if( construction->canBuild( areaInfo ) && tile->isMaster()) { events::dispatch<BuildAny>( tile->epos(), construction->type() ); buildOk = true; events::dispatch<UndoAction>( UndoAction::built, construction->type(), tile->epos(), construction->info().cost() ); } } d.startTilePos = d.lastTilePos; if( !buildOk ) { std::string errorStr = construction->errorDesc(); std::string busyText = tileBusyBuilding ? "##need_build_on_free_area##" : "##need_build_on_cleared_area##"; events::dispatch<WarningMessage>( errorStr.empty() ? busyText : errorStr, WarningMessage::neitral ); } d.needUpdateTiles = true; }
void Build::_drawBuildTile( const RenderInfo& rinfo, Tile* tile) { if( tile == nullptr ) return; __D_IMPL(_d,Build); city::AreaInfo areaInfo( _city(), TilePos(), &_d->buildTiles ); Tile* postTile = tile; postTile->resetRendered(); if( postTile->master() ) postTile = postTile->master(); ConstructionPtr construction = postTile->overlay<Construction>(); rinfo.engine.resetColorMask(); areaInfo.pos = postTile->epos(); bool maskSet = false; Size size(1,1); if( construction.isValid() && construction->canBuild( areaInfo ) ) { rinfo.engine.setColorMask( 0x00000000, 0x0000ff00, 0, 0xff000000 ); maskSet = true; size = construction->size(); } if( postTile == tile && maskSet ) { TilesArray area = _city()->tilemap().area( areaInfo.pos, size ); for( auto gtile : area ) drawLandTile( rinfo, *gtile ); } drawLandTile( rinfo, *postTile ); if( maskSet ) { const Picture& picOver = construction->picture( areaInfo ); rinfo.engine.draw( picOver, postTile->mappos() + rinfo.offset ); drawPass( rinfo, *postTile, Renderer::overlayAnimation ); rinfo.engine.resetColorMask(); } }