Added new blocks, maps, and a temporary editor
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
15
core/src/io/anuke/mindustry/editor/Editor.java
Normal file
15
core/src/io/anuke/mindustry/editor/Editor.java
Normal 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());
|
||||
}
|
||||
|
||||
}
|
||||
245
core/src/io/anuke/mindustry/editor/EditorControl.java
Normal file
245
core/src/io/anuke/mindustry/editor/EditorControl.java
Normal 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);
|
||||
}
|
||||
}
|
||||
65
core/src/io/anuke/mindustry/editor/EditorUI.java
Normal file
65
core/src/io/anuke/mindustry/editor/EditorUI.java
Normal 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")));
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user