public WellArchetype getWellManager(World world, Random random, int chunkX, int chunkZ) {
		// get the list of wells
		if (wells == null)
			wells = new Hashtable<Long, WellArchetype>();
		
		// find the origin for the well
		int wellX = calcOrigin(chunkX);
		int wellZ = calcOrigin(chunkZ);
		
		// hex offset... finally!
		if (hexishWells && (Math.abs(wellX) / WellWorld.wellWidthInChunks) % 2 != 0)
			if (wellZ + wellWidthInChunksHalf > chunkZ)
				wellZ -= wellWidthInChunksHalf;
			else
				wellZ += wellWidthInChunksHalf;

		// calculate the plat's key
		long wellpos = (long) wellX * (long) Integer.MAX_VALUE + (long) wellZ;
		Long wellkey = Long.valueOf(wellpos);

		// see if the well is already out there
		WellArchetype wellmanager = wells.get(wellkey);
		
		// doesn't exist? then make it!
		if (wellmanager == null) {
			
			// calculate the well's random seed
			long wellseed = wellpos ^ world.getSeed();
			
			// make sure the initial spawn location is "safe-ish"
			if (wellX == 0 && wellZ == 0)
				wellmanager = new KnollsWell(world, wellseed, wellX, wellZ);
			else {
				
				// noise please
				if (generator == null)
					generator = new SimplexNoiseGenerator(world.getSeed());
//				Random wellrand = new Random(wellseed);
//				double noise = (generator.noise(wellrand.nextDouble() * wellX, 
//												wellrand.nextDouble() * wellZ, 
//												wellrand.nextDouble() * 23.0,
//												wellrand.nextGaussian() * 71.0) + 1) / 2;
//				double noise = (generator.noise(wellX / ByteChunk.Width, wellZ / ByteChunk.Width) + 1) / 2;
//				double noise = ((generator.noise(wellX, wellZ) + 1) / 2 + 
//								 getWellFactor(wellX) + 
//								 getWellFactor(wellZ) + 
//								 new Random(wellseed).nextDouble()) / 4;
//				double noise = new Random(wellseed).nextDouble();
//				double doubleNoise = wellrand.nextDouble();
//				double gaussianNoise = wellrand.nextGaussian();
//				double noise = (doubleNoise + gaussianNoise) / 2.0;
//				double noise = (wellrand.nextGaussian() + 1.0) / 2.0;
				double noise = new HighQualityRandom(wellseed).nextDouble();
				
//				WellWorld.log.info("Well: " + wellX + ", " + wellZ + " Noise = " + noise);
				
				// pick one from the list
				wellmanager = chooseWellManager(noise, world, wellseed, wellX, wellZ);
			}
			
			// remember it for the next time
			wells.put(wellkey, wellmanager);
		}
		
		// return it
		return wellmanager;
	}