public static Venue establishVenue(
    final Venue v, int atX, int atY, boolean intact, final World world,
    Actor... employed
  ) {
    
    Tile init = world.tileAt(atX, atY) ;
    init = Spacing.nearestOpenTile(init, init) ;
    if (init == null) return null ;
    
    final TileSpread search = new TileSpread(init) {
      protected boolean canAccess(Tile t) {
        return ! t.blocked() ;
      }
      protected boolean canPlaceAt(Tile t) {
        v.setPosition(t.x, t.y, world) ;
        if (! checkAreaClear(t, v.size, v.size, v.owningType())) return false ;
        return v.canPlace() ;
      }
    } ;
    search.doSearch() ;
    
    if (! search.success()) return null ;
    else v.doPlace(v.origin(), null) ;
    
    if (intact) {
      v.structure.setState(Structure.STATE_INTACT, 1.0f) ;
      v.onCompletion() ;
    }
    else {
      v.structure.setState(Structure.STATE_INSTALL, 0.0f) ;
    }
    final Tile e = world.tileAt(v) ;
    for (Actor a : employed) {
      a.mind.setWork(v) ;
      if (! a.inWorld()) {
        a.assignBase(v.base()) ;
        a.enterWorldAt(e.x, e.y, world) ;
        a.goAboard(v, world) ;
      }
    }
    if (GameSettings.hireFree) Personnel.fillVacancies(v) ;
    v.setAsEstablished(true) ;
    return v ;
  }