public void populateWithRuins() {
    float ruined = terGen.baseAmount(Habitat.CURSED_EARTH) ;
    ruined = (ruined + (1 - totalFertility)) / 2f ;
    
    final int
      numMajorRuins = (int) ((ruined * numMajor) + 0.5f),
      numMinorRuins = (int) ((ruined * numMinor) + 0.5f) ;
    I.say("Major/minor ruins: "+numMajorRuins+"/"+numMinorRuins) ;
    
    for (int n = numMajorRuins + numMinorRuins ; n-- > 0 ;) {
      final int SS = World.SECTOR_SIZE ;
      Coord pos = findBasePosition(null, -1) ;
      I.say("Ruins site at: "+pos) ;
      final Tile centre = world.tileAt(
        (pos.x + 0.5f) * SS,
        (pos.y + 0.5f) * SS
      ) ;
      final boolean minor = n < numMinorRuins ;
      
      int maxRuins = (minor ? 3 : 1) + Rand.index(3) ;
      final Batch <Venue> ruins = new Batch <Venue> () ;
      while (maxRuins-- > 0) {
        final Ruins r = new Ruins() ;
        Placement.establishVenue(r, centre.x, centre.y, true, world) ;
        if (r.inWorld()) ruins.add(r) ;
      }
      
      for (Venue r : ruins) for (Tile t : world.tilesIn(r.area(), true)) {
        Habitat h = Rand.yes() ? Habitat.CURSED_EARTH : Habitat.DUNE ;
        world.terrain().setHabitat(t, h) ;
      }
      populateArtilects(ruins, minor) ;
    }
    //
    //  TODO:  The slag/wreckage positioning must be done in a distinct pass.
  }