public void run() {
		groundWaterLevel = new float[Globals.width][Globals.height];
		float startingWater = Globals.getSetting("Starting water", "Water");
		for(int x = 0; x < Globals.width; x++)
			for(int y = 0; y < Globals.height; y++)
				groundWaterLevel[x][y] = startingWater;

		Globals.registerGraph("Ground water level", "Water", new Callable<Float>() {
			public Float call() throws Exception {
				return getAverageGroundWater();
			}
		}, 500);

		Random random = new Random();
		float[][] xCurrent = new float[Globals.width][Globals.height];
		float[][] yCurrent = new float[Globals.width][Globals.height];
		float randomRange = Globals.getSetting("Wind fractal random range", "Cloud");
		float divFactor = Globals.getSetting("Wind fractal div factor", "Cloud");
		Fractal.generateFractal(xCurrent, 1.0f, 0.0f, randomRange, divFactor);
		Fractal.generateFractal(yCurrent, 1.0f, 0.0f, randomRange, divFactor);
		int cloudCount = (int)Globals.getSetting("Cloud count", "Cloud");
		int cloudSleep = (int)Globals.getSetting("Sleep", "Cloud");
		for(int i = 0; i < cloudCount; i++){
			Cloud cloud = new Cloud(cloudSleep, random.nextFloat()*Globals.width, random.nextFloat()*Globals.height, random.nextFloat()*3.0f, xCurrent, yCurrent);
			Thread cloudThread = new Thread(cloud);
			cloudThread.start();
			clouds.add(cloud);
		}
		while(true){
			step();
			try{
				Thread.sleep((long) Globals.getSetting("Sleep", "Water"));
			}
			catch(InterruptedException e){

			}
		}
	}