package game;
import com.badlogic.gdx.Gdx;
import libnoiseforjava.NoiseGen;
import libnoiseforjava.exception.ExceptionInvalidParam;
import libnoiseforjava.module.*;
public class Noise {
public static final ModuleBase TERRAIN; // mostly for aesthetics
public static final ModuleBase DENSITY; // cities/towns/rural, how close networks will be or the chance of generating a network on that spot.
public static final ModuleBase POLITICS; // political espionage? dependant on countries, maybe
public static final ModuleBase ETHICS; // hacker ethics, somewhat dependant on crime
public static final ModuleBase COUNTRY; // not sure yet, maybe voroni noise, or maybe code
public static final ModuleBase INCOME; // somewhat dependant on density and crime
public static final ModuleBase CRIME; // dependant on density
private static ModuleBase land;
static {
TERRAIN = TERRAIN();
DENSITY = density();
POLITICS = politics();
ETHICS = ethics();
COUNTRY = country();
INCOME = income();
CRIME = crime();
}
private static ModuleBase TERRAIN() { // modified version of http://libnoise.sourceforge.net/tutorials/tutorial5.html
try {
Perlin land1;
Billow land2;
RidgedMulti mountainTerrain;
Billow baseFlatTerrain;
ScaleBias flatTerrain;
Perlin terrainType;
ScaleBias terrainTypeScaleBias;
Select finalTerrain;
Select landSelector;
land1 = new Perlin();
land1.setNoiseQuality(NoiseGen.NoiseQuality.QUALITY_BEST);
land1.setSeed((int) (Math.random() * Integer.MAX_VALUE));
land1.setFrequency(.0001);
land1.setPersistence(.45);
land1.setLacunarity(2.5);
land1.setOctaveCount(6);
land2 = new Billow();
land2.setNoiseQuality(NoiseGen.NoiseQuality.QUALITY_BEST);
land2.setSeed((int) (Math.random() * Integer.MAX_VALUE));
land2.setFrequency(.0001);
land2.setPersistence(.45);
land2.setLacunarity(2.5);
land2.setOctaveCount(6);
ScaleBias scale = new ScaleBias(new Add(land1, land2));
scale.setScale(.5);
scale.setBias(0);
land = new Clamp(scale);
((Clamp) land).setBounds(-1, 1);
mountainTerrain = new RidgedMulti();
mountainTerrain.setNoiseQuality(NoiseGen.NoiseQuality.QUALITY_BEST);
mountainTerrain.setSeed((int) (Math.random() * Integer.MAX_VALUE));
mountainTerrain.setFrequency(.0005);
ScaleBias mountainScale = new ScaleBias(mountainTerrain);
mountainScale.setScale(.25);
mountainScale.setBias(.65);
baseFlatTerrain = new Billow();
baseFlatTerrain.setNoiseQuality(NoiseGen.NoiseQuality.QUALITY_BEST);
baseFlatTerrain.setSeed((int) (Math.random() * Integer.MAX_VALUE));
baseFlatTerrain.setFrequency(.0003);
flatTerrain = new ScaleBias(baseFlatTerrain);
flatTerrain.setScale(0.125);
flatTerrain.setBias(.5);
terrainType = new Perlin();
terrainType.setNoiseQuality(NoiseGen.NoiseQuality.QUALITY_BEST);
terrainType.setSeed((int) (Math.random() * Integer.MAX_VALUE));
terrainType.setFrequency(.00008);
terrainType.setPersistence(0.25);
terrainTypeScaleBias = new ScaleBias(terrainType);
terrainTypeScaleBias.setScale(.3);
terrainTypeScaleBias.setBias(.6);
finalTerrain = new Select(flatTerrain, mountainScale, terrainTypeScaleBias);
finalTerrain.setBounds(.7, 10);
finalTerrain.setEdgeFalloff(.05);
landSelector = new Select(new Const(0), finalTerrain, land);
landSelector.setBounds(0, 10); // -0.3, 1
landSelector.setEdgeFalloff(.2);
Select select = new Select(new Const(-1), new Const(1), landSelector);
select.setBounds(0, .1);
select.setEdgeFalloff(.02);
Clamp clamp = new Clamp(select);
clamp.setBounds(-1, 1);
return clamp;
} catch (ExceptionInvalidParam exceptionInvalidParam) {
exceptionInvalidParam.printStackTrace();
}
return null;
}
private static ModuleBase density() {
try {
Perlin perlin1 = new Perlin();
perlin1.setNoiseQuality(NoiseGen.NoiseQuality.QUALITY_BEST);
perlin1.setSeed((int) (Math.random() * Integer.MAX_VALUE));
perlin1.setFrequency(.00015);
perlin1.setLacunarity(2.5);
perlin1.setOctaveCount(4);
ScaleBias scale1 = new ScaleBias(perlin1);
scale1.setScale(3);
scale1.setBias(-1.5);
Perlin perlin2 = new Perlin();
perlin2.setNoiseQuality(NoiseGen.NoiseQuality.QUALITY_BEST);
perlin2.setSeed((int) (Math.random() * Integer.MAX_VALUE));
perlin2.setFrequency(.0003);
perlin2.setOctaveCount(6);
ScaleBias scale2 = new ScaleBias(perlin2);
scale2.setScale(.8);
scale2.setBias(-.1);
Select select = new Select(new Const(-1), new Max(scale1, scale2), land);
select.setBounds(0, 1);
select.setEdgeFalloff(.2);
Clamp clamp = new Clamp(select);
clamp.setBounds(-1, 1);
return clamp;
} catch (ExceptionInvalidParam exceptionInvalidParam) {
exceptionInvalidParam.printStackTrace();
}
return null;
}
private static ModuleBase politics() {
try {
Clamp clamp = new Clamp(new Const());
clamp.setBounds(0, 1);
return clamp;
} catch (ExceptionInvalidParam exceptionInvalidParam) {
exceptionInvalidParam.printStackTrace();
}
return null;
}
private static ModuleBase ethics() {
try {
Clamp clamp = new Clamp(new Const());
clamp.setBounds(0, 1);
return clamp;
} catch (ExceptionInvalidParam exceptionInvalidParam) {
exceptionInvalidParam.printStackTrace();
}
return null;
}
private static ModuleBase country() {
try {
Clamp clamp = new Clamp(new Const());
clamp.setBounds(0, 1);
return clamp;
} catch (ExceptionInvalidParam exceptionInvalidParam) {
exceptionInvalidParam.printStackTrace();
}
return null;
}
private static ModuleBase income() {
try {
Clamp clamp = new Clamp(new Const());
clamp.setBounds(0, 1);
return clamp;
} catch (ExceptionInvalidParam exceptionInvalidParam) {
exceptionInvalidParam.printStackTrace();
}
return null;
}
private static ModuleBase crime() {
try {
Clamp clamp = new Clamp(new Const());
clamp.setBounds(0, 1);
return clamp;
} catch (ExceptionInvalidParam exceptionInvalidParam) {
exceptionInvalidParam.printStackTrace();
}
return null;
}
public static double getValue(NoiseType type, double x, double y) {
switch (type) {
case TERRAIN:
return TERRAIN.getValue(x, 0, y);
case DENSITY:
return DENSITY.getValue(x, 0, y);
case COUNTRY:
return COUNTRY.getValue(x, 0, y);
case POLITICS:
return POLITICS.getValue(x, 0, y);
case ETHICS:
return ETHICS.getValue(x, 0, y);
case INCOME:
return INCOME.getValue(x, 0, y);
case CRIME:
return CRIME.getValue(x, 0, y);
}
Gdx.app.error("Noise.getValue", "Unknown noise type");
return 0; // this should never happen
}
public enum NoiseType {
TERRAIN, DENSITY, POLITICS, ETHICS, COUNTRY, INCOME, CRIME
}
public static ModuleBase getLand() {
return land;
}
}