Added new blocks, maps, and a temporary editor

This commit is contained in:
Anuken
2017-11-30 19:11:54 -05:00
parent ff993a353d
commit 8abe4a9cee
50 changed files with 792 additions and 256 deletions

View File

@@ -81,11 +81,7 @@ public class UI extends SceneModule{
TooltipManager.getInstance().animations = false;
Settings.setErrorHandler(()->{
Timers.run(1f, ()->{
settingserror.show();
});
});
Settings.setErrorHandler(()-> Timers.run(1f, ()-> settingserror.show()));
Settings.defaults("pixelate", true);

View File

@@ -0,0 +1,15 @@
package io.anuke.mindustry.editor;
import io.anuke.ucore.modules.ModuleCore;
public class Editor extends ModuleCore{
public static EditorControl control;
public static EditorUI ui;
@Override
public void init(){
module(control = new EditorControl());
module(ui = new EditorUI());
}
}

View File

@@ -0,0 +1,245 @@
package io.anuke.mindustry.editor;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.PixmapIO;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.OrderedMap;
import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Generator;
import io.anuke.mindustry.world.blocks.Blocks;
import io.anuke.mindustry.world.blocks.types.Floor;
import io.anuke.ucore.core.Core;
import io.anuke.ucore.core.Inputs;
import io.anuke.ucore.graphics.Pixmaps;
import io.anuke.ucore.modules.Module;
import io.anuke.ucore.noise.RidgedPerlin;
import io.anuke.ucore.noise.Simplex;
import io.anuke.ucore.util.Mathf;
public class EditorControl extends Module{
private ObjectMap<Block, Integer> colors = new ObjectMap<>();
Pixmap pixmap;
Texture texture;
Simplex sim = new Simplex();
RidgedPerlin rid = new RidgedPerlin(1, 10, 20f);
RidgedPerlin rid2 = new RidgedPerlin(1, 6, 1f);
RidgedPerlin rid3 = new RidgedPerlin(1, 6, 1f);
String map = "volcano";
ObjectMap<String, Boolean> prefs = new OrderedMap<String, Boolean>(){
{
put("replace", true);
put("terrain", false);
put("distort", false);
put("sand", false);
put("grass", false);
put("stone", false);
put("allgrass", false);
put("allsnow", false);
put("lavarock", false);
put("water", false);
put("oil", false);
put("lavariver", false);
put("river", false);
put("iceriver", false);
put("oilriver", false);
}
};
public EditorControl() {
for(int key : Generator.colors.keys()){
colors.put(Generator.colors.get(key), key);
}
loadMap(map);
}
@Override
public void update(){
clearScreen();
if(Inputs.keyUp(Keys.ESCAPE)){
Gdx.app.exit();
}
if(Core.scene.getKeyboardFocus() == null){
if(Inputs.keyUp(Keys.R)){
randomize();
loadMap(map);
}
if(Inputs.keyUp(Keys.E)){
PixmapIO.writePNG(Gdx.files.absolute("/home/anuke/Pictures/maps/out-" + TimeUtils.millis() + ".png"), pixmap);
}
}
}
public void randomize(){
sim.setSeed(Mathf.random(999999));
rid.setSeed(Mathf.random(999999));
rid2.setSeed(Mathf.random(999999));
rid3.setSeed(Mathf.random(999999));
}
public void reload(){
loadMap(map);
}
public void loadMap(String name){
if(pixmap != null)
pixmap.dispose();
pixmap = new Pixmap(Gdx.files.internal("maps/" + name + ".png"));
process();
}
public void process(){
if(prefs.get("terrain")){
for(int x = 0; x < pixmap.getWidth(); x++){
for(int y = 0; y < pixmap.getHeight(); y++){
float dist = Vector2.dst((float) x / pixmap.getWidth(), (float) y / pixmap.getHeight(), 0.5f, 0.5f) * 2f;
double noise = sim.octaveNoise2D(5, 0.6, 1 / 150.0, x, y + 9999) + dist / 10f;
if(dist > 0.8){
noise += 2 * (dist - 0.8);
}
Block block = noise > 0.6 ? Blocks.stoneblock : Blocks.stone;
pixmap.drawPixel(x, y, colors.get(block));
}
}
}
Pixmap src = Pixmaps.copy(pixmap);
for(int x = 0; x < pixmap.getWidth(); x++){
for(int y = 0; y < pixmap.getHeight(); y++){
int dx = 0, dy = 0;
if(prefs.get("distort")){
double intensity = 10;
double scale = 80;
double octaves = 3;
double falloff = 0.7;
double nx = (sim.octaveNoise2D(octaves, falloff, 1 / scale, x, y) - 0.5f) * intensity;
double ny = (sim.octaveNoise2D(octaves, falloff, 1 / scale, x, y + 99999) - 0.5f) * intensity;
dx = (int) nx;
dy = (int) ny;
}
int pix = src.getPixel(x + dx, y + dy);
Block block = Generator.colors.get(pix);
if(block == null)
continue;
boolean floor = block instanceof Floor;
double noise = sim.octaveNoise2D(4, 0.6, 1 / 170.0, x, y) + sim.octaveNoise2D(1, 1.0, 1 / 5.0, x, y) / 18.0;
double nwater = sim.octaveNoise2D(1, 1.0, 1 / 130.0, x, y);
noise += nwater / 5.0;
double noil = sim.octaveNoise2D(1, 1.0, 1 / 150.0, x + 9999, y) + sim.octaveNoise2D(1, 1.0, 1 / 2.0, x, y) / 290.0;
if(!floor || prefs.get("replace")){
if(prefs.get("allgrass")){
block = floor ? Blocks.grass : Blocks.grassblock;
}
if(prefs.get("allsnow")){
block = floor ? Blocks.snow : Blocks.snowblock;
}
if(noise > 0.7 && prefs.get("grass")){
block = floor ? Blocks.grass : Blocks.grassblock;
}else if(noise > 0.7 && prefs.get("lavarock")){
block = floor ? Blocks.blackstone : Blocks.blackstoneblock;
}else if(noise > 0.7 && prefs.get("sand")){
block = floor ? Blocks.sand : Blocks.sandblock;
}else if(noise > 0.8 && prefs.get("stone")){
block = floor ? Blocks.stone : Blocks.stoneblock;
}else if(prefs.get("replace") && !prefs.get("allgrass") && !prefs.get("allsnow")){
block = floor ? Blocks.stone : Blocks.stoneblock;
}
}
if(floor){
if(nwater > 0.93 && prefs.get("water")){
block = Blocks.water;
if(nwater > 0.943){
block = Blocks.deepwater;
}
}
if(noil > 0.95 && prefs.get("oil")){
block = Blocks.dirt;
if(noil > 0.955){
block = Blocks.oil;
}
}
}
if(floor && prefs.get("lavariver")){
double lava = rid.getValue(x, y, 1 / 100f);
double t = 0.6;
if(lava > t){
block = Blocks.lava;
}else if(lava > t - 0.2){
block = Blocks.blackstone;
}
}
if(floor && prefs.get("oilriver")){
double lava = rid3.getValue(x, y, 1 / 100f);
double t = 0.9;
if(lava > t){
block = Blocks.oil;
}else if(lava > t - 0.2){
block = Blocks.dirt;
}
}
if(floor && prefs.get("river")){
double riv = rid2.getValue(x, y, 1 / 140f);
double t = 0.4;
if(riv > t + 0.1){
block = Blocks.deepwater;
}else if(riv > t){
block = Blocks.water;
}else if(riv > t - 0.2){
block = Blocks.grass;
}
}
if(floor && prefs.get("iceriver")){
double riv = rid2.getValue(x, y, 1 / 140f);
double t = 0.4;
if(riv > t + 0.1){
block = Blocks.ice;
}else if(riv > t){
block = Blocks.ice;
}else if(riv > t - 0.2){
block = Blocks.snow;
}
}
pixmap.drawPixel(x, y, colors.get(block));
}
}
src.dispose();
if(texture != null){
texture.dispose();
}
texture = new Texture(pixmap);
}
}

View File

@@ -0,0 +1,65 @@
package io.anuke.mindustry.editor;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Buttons;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Scaling;
import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Inputs;
import io.anuke.ucore.graphics.Atlas;
import io.anuke.ucore.modules.SceneModule;
import io.anuke.ucore.scene.Skin;
import io.anuke.ucore.scene.builders.*;
import io.anuke.ucore.scene.style.TextureRegionDrawable;
import io.anuke.ucore.scene.ui.Image;
import io.anuke.ucore.scene.ui.TextField;
public class EditorUI extends SceneModule{
@Override
public void init(){
build.begin();
new table(){{
Image image = new Image();
image.update(()-> image.setDrawable(new TextureRegionDrawable(new TextureRegion(Editor.control.texture))));
image.setScaling(Scaling.fit);
add(image).size(256 * 3);
new table("button"){{
new field(Editor.control.map, text->{
if(Gdx.files.internal("maps/" + text + ".png").exists()){
Editor.control.map = text;
Editor.control.reload();
}
});
row();
for(String key : Editor.control.prefs.keys()){
new checkbox(key, Editor.control.prefs.get(key), b->{
Editor.control.prefs.put(key, b);
Editor.control.reload();
}).left();
row();
}
get().pad(16);
}}.end();
}}.end();
build.end();
}
@Override
public void update(){
super.update();
if(Inputs.buttonUp(Buttons.LEFT)){
if(!hasMouse() || !(scene.hit(Graphics.mouse().x, Graphics.mouse().y, true) instanceof TextField)){
scene.setKeyboardFocus(null);
}
}
}
@Override
protected void loadSkin(){
skin = new Skin(Gdx.files.internal("ui/uiskin.json"), new Atlas(Gdx.files.internal("sprites/sprites.atlas")));
}
}

View File

@@ -10,6 +10,7 @@ import io.anuke.ucore.core.Settings;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.function.StringSupplier;
import io.anuke.ucore.scene.ui.*;
import io.anuke.ucore.scene.ui.layout.Stack;
import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.scene.ui.layout.Unit;
import io.anuke.ucore.scene.utils.Elements;
@@ -66,6 +67,11 @@ public class LevelDialog extends FloatingDialog{
float images = 154f;
Stack stack = new Stack();
Image back = new Image("white");
back.setColor(map.backgroundColor);
ImageButton image = new ImageButton(new TextureRegion(Vars.world.getTexture(map)), "togglemap");
image.row();
image.add(inset).width(images+6).units(Unit.dp);
@@ -75,7 +81,11 @@ public class LevelDialog extends FloatingDialog{
Vars.control.playMap(selectedMap);
});
image.getImageCell().size(images).units(Unit.dp);
maps.add(image).width(170).pad(4f).units(Unit.dp);
stack.add(back);
stack.add(image);
maps.add(stack).width(170).pad(4f).units(Unit.dp);
maps.padRight(Unit.dp.inPixels(26));
}

View File

@@ -16,7 +16,7 @@ public class Generator{
static final int spawn = Color.rgba8888(Color.RED);
static final int start = Color.rgba8888(Color.GREEN);
static ObjectMap<Integer, Block> colors = map(
public static ObjectMap<Integer, Block> colors = map(
Hue.rgb(80, 150, 90), Blocks.grass,
Hue.rgb(90, 180, 100), Blocks.grassblock,
Hue.rgb(80, 110, 180), Blocks.water,
@@ -24,10 +24,16 @@ public class Generator{
Hue.rgb(110, 80, 30), Blocks.dirt,
Hue.rgb(160, 120, 70), Blocks.dirtblock,
Hue.rgb(100, 100, 100), Blocks.stoneblock,
Color.valueOf("414141"), Blocks.blackstoneblock,
Color.valueOf("323232"), Blocks.stone,
Color.valueOf("575757"), Blocks.blackstoneblock,
Color.valueOf("252525"), Blocks.blackstone,
Color.valueOf("ed5334"), Blocks.lava,
Color.valueOf("292929"), Blocks.oil
Color.valueOf("292929"), Blocks.oil,
Color.valueOf("e5d8bb"), Blocks.sandblock,
Color.valueOf("988a67"), Blocks.sand,
Color.valueOf("f7feff"), Blocks.snowblock,
Color.valueOf("c2d1d2"), Blocks.snow,
Color.valueOf("c4e3e7"), Blocks.ice
);
/**Returns world size.*/
@@ -61,12 +67,17 @@ public class Generator{
block = Blocks.rock;
}
if(floor == Blocks.snow && Mathf.chance(0.02)){
block = Blocks.icerock;
}
if(floor == Blocks.blackstone && Mathf.chance(0.03)){
block = Blocks.blackrock;
}
}
if(floor == Blocks.stone || floor == Blocks.grass || floor == Blocks.blackstone){
if(floor == Blocks.stone || floor == Blocks.grass || floor == Blocks.blackstone ||
floor == Blocks.snow){
if(Noise.nnoise(x, y, 8, 1) > 0.2){
floor = Blocks.iron;
}
@@ -88,6 +99,10 @@ public class Generator{
floor = Blocks.grass;
}
if(block == Blocks.snowblock){
floor = Blocks.snow;
}
if(floor == Blocks.grass && Mathf.chance(0.02) && block == Blocks.air){
block = Blocks.shrub;
}

View File

@@ -1,5 +1,7 @@
package io.anuke.mindustry.world;
import com.badlogic.gdx.graphics.Color;
public enum Map{
delta("Starting map."),
pit("Eck."),
@@ -7,14 +9,24 @@ public enum Map{
maze("it's okay."),
volcano("desc"),
fortress("desc", true),
sinkhole("desc"),
volcanic("desc"),
rooms("desc"),
desert("desc"),
grassland("desc"){{
backgroundColor = Color.valueOf("5ab464");
}},
tundra("desc"),
tutorial(false),
test1(false),
test2(false);
test2(false),
test3(false);
public final boolean visible;
public final String description;
public final boolean flipBase;
public int width, height;
public Color backgroundColor = Color.valueOf("646464");
private Map(boolean visible){
this.visible = visible;

View File

@@ -102,36 +102,33 @@ public class Blocks{
dirt = new Floor("dirt"),
sand = new Floor("sand"),
ice = new Floor("ice"),
snow = new Floor("snow"),
grass = new Floor("grass"),
stoneblock = new Block("stoneblock"){
{
solid = true;
variants = 3;
}
@Override
public void draw(Tile tile){
// Draw.colorl(0.9f + Mathf.randomSeed(tile.id()*9999, 1, 10)/10f / 10f);
super.draw(tile);
// Draw.color();
}
},
sandblock = new Block("sandblock"){{
solid = true;
variants = 3;
}},
blackstoneblock = new Block("blackstoneblock"){
{
solid = true;
variants = 3;
}
@Override
public void draw(Tile tile){
// float f = 0.15f;
// Draw.colorl(1f - f + Mathf.randomSeed(tile.id()*9999, 1, 10)/10f / (1f / f));
super.draw(tile);
// Draw.color();
}
},
snowblock = new Block("snowblock"){{
solid = true;
variants = 3;
}},
stoneblock = new Block("stoneblock"){{
solid = true;
variants = 3;
}},
blackstoneblock = new Block("blackstoneblock"){{
solid = true;
variants = 3;
}},
grassblock = new Block("grassblock"){{
solid = true;
@@ -157,6 +154,15 @@ public class Blocks{
drops = new ItemStack(Item.stone, 3);
}},
icerock = new Block("icerock"){{
shadow = "rockshadow";
breakable = true;
breaktime = 15;
variants = 2;
varyShadow = true;
drops = new ItemStack(Item.stone, 3);
}},
blackrock = new Block("blackrock"){{
shadow = "blackrockshadow";
breakable = true;