package squidpony.gdx.examples;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
import squidpony.squidgrid.gui.gdx.SColor;
import squidpony.squidgrid.gui.gdx.SquidColorCenter;
import squidpony.squidgrid.gui.gdx.SquidInput;
import squidpony.squidgrid.gui.gdx.SquidPanel;
import squidpony.squidgrid.mapping.MetsaMapFactory;
import squidpony.squidmath.Coord;
import java.util.List;
public class WorldMapDemo extends ApplicationAdapter {
private MetsaMapFactory mapFactory;
private SpriteBatch batch;
private SquidColorCenter colorFactory;
private SquidPanel display;
private int width, height;
private int cellWidth, cellHeight;
private SquidInput input;
private static final SColor bgColor = SColor.DARK_SLATE_GRAY;
private Stage stage;
private Viewport view;
private final SColor CITY_COLOR = new SColor(0xFF9944);
//COLORORDER
/*
0 = deepsea
1 = beach
2 = low
3 = high
4 = mountain
5 = snowcap
6 = lowsea
*/
private final SColor[] colors = new SColor[]{SColor.DENIM, SColor.PEACH, SColor.PALE_YOUNG_GREEN_ONION,
SColor.FOREST_GREEN, SColor.SLATE_GRAY, SColor.ALICE_BLUE, SColor.AZUL};
private final SColor[] polarcolors = colors;
// new SColor[]{SColor.DARK_SLATE_GRAY, SColor.SCHOOL_BUS_YELLOW, SColor.YELLOW_GREEN,
// SColor.GREEN_BAMBOO, SColorFactory.lighter(SColor.LIGHT_BLUE_SILK), SColor.ALICE_BLUE, SColor.AZUL};
private final SColor[] desertcolors = colors;
// new SColor[]{SColor.DARK_SLATE_GRAY, SColor.SCHOOL_BUS_YELLOW, SColor.YELLOW_GREEN,
// SColor.GREEN_BAMBOO, SColorFactory.lighter(SColor.LIGHT_BLUE_SILK), SColor.ALICE_BLUE, SColor.AZUL};
private double highn = 0;
private int[][] biomeMap;
private double[][] map;
private List<Coord> cities;
@Override
public void create () {
batch = new SpriteBatch();
width = 240;
height = 120;
cellWidth = 5;
cellHeight = 5;
display = new SquidPanel(width, height, cellWidth, cellHeight);
colorFactory = new SquidColorCenter();
mapFactory = new MetsaMapFactory(width, height);
map = mapFactory.getHeightMap();
biomeMap = mapFactory.makeBiomeMap();
mapFactory.makeWeightedMap();
highn = mapFactory.getMaxPeak();
cities = mapFactory.getCities();
view = new ScreenViewport();
stage = new Stage(view, batch);
input = new SquidInput(new SquidInput.KeyHandler() {
@Override
public void handle(char key, boolean alt, boolean ctrl, boolean shift) {
switch (key)
{
case 'Q':
case 'q':
case SquidInput.ESCAPE:
{
Gdx.app.exit();
}
}
}
});
// ABSOLUTELY NEEDED TO HANDLE INPUT
Gdx.input.setInputProcessor(input);
// and then add display, our one visual component, to the list of things that act in Stage.
display.setPosition(0, 0);
stage.addActor(display);
Gdx.graphics.setContinuousRendering(false);
Gdx.graphics.requestRendering();
}
public void putMap()
{
display.clear();
double n;
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
n = map[x][y];
SColor[] curcolor = colors;
if (biomeMap[x][y] == 1 || biomeMap[x][y] == 3) {
curcolor = polarcolors;
}
if (biomeMap[x][y] == 2) {
curcolor = desertcolors;
}
Color color = curcolor[6];
if (n > MetsaMapFactory.SEA_LEVEL) {
color = curcolor[1];
}
if (n > MetsaMapFactory.BEACH_LEVEL) {
color = curcolor[2];
}
if (n > MetsaMapFactory.PLAINS_LEVEL) {
color = curcolor[3];
}
if (n > MetsaMapFactory.MOUNTAIN_LEVEL) {
color = curcolor[4];
}
if (n > MetsaMapFactory.SNOW_LEVEL) {
color = curcolor[5];
}
//Polar ice
if (n < MetsaMapFactory.DEEP_SEA_LEVEL) {
if (biomeMap[x][y] == 3) {
color = polarcolors[0];
} else {
color = colors[0];
}
}
// use alpha to blend
if (n > 0) {
color = colorFactory.lerp(color, SColor.ALICE_BLUE, (float)Math.pow(n / highn, 2) / 2f);//high stuff gets lighter
color = colorFactory.lerp(color, SColor.DARK_BLUE_DYE, (float)(0.2 - n * n));//low stuff gets darker
int shadow = mapFactory.getShadow(x, y, map);
if (n > MetsaMapFactory.SNOW_LEVEL && (biomeMap[x][y] == 1 || biomeMap[x][y] == 3)) {//SNOWAREA VOLCANO CASE
if (shadow == -1) {//shadow side INVERSE
// color = SColorFactory.blend(color, new SColor(0, 0, 90), 0.2);
color = colorFactory.lerp(color, SColor.DENIM, (float)(0.2 * n / 2));
}
if (shadow == 1) {//sun side INVERSE
// color = SColorFactory.blend(color, new SColor(255, 255, 0), 0.1);
color = colorFactory.lerp(color, SColor.BRASS, (float)(0.1 * n / 2));
}
} else {
if (shadow == 1) { //shadow side
// color = SColorFactory.blend(color, new SColor(0, 0, 90), 0.2);
color = colorFactory.lerp(color, SColor.ONANDO, (float)(0.2 * n / 2));
}
if (shadow == -1) {//sun side
// color = SColorFactory.blend(color, new SColor(220, 220, 100), 0.2);
color = colorFactory.lerp(color, SColor.YELLOW, (float)(0.2 * n / 2));
}
}
}
display.put(x, y, color);
}
}
for (Coord city : cities) {
display.put(city.x, city.y, '@', CITY_COLOR);
}
}
@Override
public void render () {
// standard clear the background routine for libGDX
Gdx.gl.glClearColor(bgColor.r / 255.0f, bgColor.g / 255.0f, bgColor.b / 255.0f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// not sure if this is always needed...
Gdx.gl.glEnable(GL20.GL_BLEND);
view.apply(true);
// need to display the map every frame, since we clear the screen to avoid artifacts.
putMap();
// if the user clicked, we have a list of moves to perform.
// if we are waiting for the player's input and get input, process it.
if(input.hasNext()) {
input.next();
}
// stage has its own batch and must be explicitly told to draw(). this also causes it to act().
stage.draw();
}
@Override
public void resize(int width, int height) {
super.resize(width, height);
this.width = width / cellWidth;
this.height = height / cellHeight;
view.update(width, height, true);
mapFactory.regenerateHeightMap(this.width, this.height);
map = mapFactory.getHeightMap();
biomeMap = mapFactory.makeBiomeMap();
mapFactory.makeWeightedMap();
highn = mapFactory.getMaxPeak();
cities = mapFactory.getCities();
display = new SquidPanel(this.width, this.height, cellWidth, cellHeight);
display.setPosition(0,0);
stage.clear();
stage.addActor(display);
Gdx.graphics.requestRendering();
}
}