Пример #1
0
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;
}
Пример #2
0
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();
  }
}