Added map-specific generator

This commit is contained in:
Anuken 2019-01-15 21:21:28 -05:00
parent 2f76684113
commit 5ec11c61bd
9 changed files with 90 additions and 36 deletions

View File

@ -18,8 +18,8 @@ import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.game.Saves;
import io.anuke.mindustry.game.GlobalData; import io.anuke.mindustry.game.GlobalData;
import io.anuke.mindustry.game.Saves;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.input.Binding; import io.anuke.mindustry.input.Binding;
import io.anuke.mindustry.input.DesktopInput; import io.anuke.mindustry.input.DesktopInput;

View File

@ -254,12 +254,9 @@ public class World implements ApplicationListener{
ui.showError("$map.nospawn.pvp"); ui.showError("$map.nospawn.pvp");
} }
} }
}else{
invalidMap = false;
} }
if(invalidMap) Core.app.post(() -> state.set(State.menu)); if(invalidMap) Core.app.post(() -> state.set(State.menu));
} }
public void notifyChanged(Tile tile){ public void notifyChanged(Tile tile){
@ -410,7 +407,7 @@ public class World implements ApplicationListener{
* - setting up multiblocks<br> * - setting up multiblocks<br>
* - updating occlusion<br> * - updating occlusion<br>
* Usually used before placing structures on a tile array.*/ * Usually used before placing structures on a tile array.*/
void prepareTiles(Tile[][] tiles){ public void prepareTiles(Tile[][] tiles){
//find multiblocks //find multiblocks
IntArray multiblocks = new IntArray(); IntArray multiblocks = new IntArray();

View File

@ -83,7 +83,7 @@ public class BlockRenderer{
Draw.shader(); Draw.shader();
} }
/**Process all blocks to draw, simultaneously updating the block shadow framebuffer.*/ /**Process all blocks to draw.*/
public void processBlocks(){ public void processBlocks(){
iterateidx = 0; iterateidx = 0;
@ -108,28 +108,25 @@ public class BlockRenderer{
for(int y = miny; y <= maxy; y++){ for(int y = miny; y <= maxy; y++){
boolean expanded = (Math.abs(x - avgx) > rangex || Math.abs(y - avgy) > rangey); boolean expanded = (Math.abs(x - avgx) > rangex || Math.abs(y - avgy) > rangey);
Tile tile = world.rawTile(x, y); Tile tile = world.rawTile(x, y);
Block block = tile.block();
if(tile != null){ if(!expanded && block != Blocks.air && world.isAccessible(x, y)){
Block block = tile.block(); tile.block().drawShadow(tile);
}
if(!expanded && block != Blocks.air && world.isAccessible(x, y)){ if(block != Blocks.air){
tile.block().drawShadow(tile); if(!expanded){
addRequest(tile, Layer.shadow);
addRequest(tile, Layer.block);
} }
if(block != Blocks.air){ if(block.expanded || !expanded){
if(!expanded){ if(block.layer != null && block.isLayer(tile)){
addRequest(tile, Layer.shadow); addRequest(tile, block.layer);
addRequest(tile, Layer.block);
} }
if(block.expanded || !expanded){ if(block.layer2 != null && block.isLayer2(tile)){
if(block.layer != null && block.isLayer(tile)){ addRequest(tile, block.layer2);
addRequest(tile, block.layer);
}
if(block.layer2 != null && block.isLayer2(tile)){
addRequest(tile, block.layer2);
}
} }
} }
} }

View File

@ -18,7 +18,7 @@ import static io.anuke.mindustry.Vars.*;
public class Maps implements Disposable{ public class Maps implements Disposable{
/**List of all built-in maps.*/ /**List of all built-in maps.*/
private static final String[] defaultMapNames = {"sandbox"}; private static final String[] defaultMapNames = {};
/**Tile format version.*/ /**Tile format version.*/
private static final int version = 0; private static final int version = 0;
@ -57,9 +57,28 @@ public class Maps implements Disposable{
return maps.get(name.toLowerCase()); return maps.get(name.toLowerCase());
} }
/**Loads a map from the map folder and returns it. Should only be used for zone maps.
* Does not add this map to the map list.*/
public Map loadInternalMap(String name){
FileHandle file = Core.files.internal("maps/" + name + "." + mapExtension);
try(DataInputStream ds = new DataInputStream(file.read())) {
MapMeta meta = MapIO.readMapMeta(ds);
Map map = new Map(name, meta, false, file::read);
if (!headless){
map.texture = new Texture(MapIO.generatePixmap(MapIO.readTileData(ds, meta, true)));
}
return map;
}catch(IOException e){
throw new RuntimeException(e);
}
}
/**Load all maps. Should be called at application start.*/ /**Load all maps. Should be called at application start.*/
public void load(){ public void load(){
try { try{
for (String name : defaultMapNames) { for (String name : defaultMapNames) {
FileHandle file = Core.files.internal("maps/" + name + "." + mapExtension); FileHandle file = Core.files.internal("maps/" + name + "." + mapExtension);
loadMap(file.nameWithoutExtension(), file::read, false); loadMap(file.nameWithoutExtension(), file::read, false);

View File

@ -3,12 +3,17 @@ package io.anuke.mindustry.maps.generators;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
public abstract class Generator{ public abstract class Generator{
public final int width, height; public int width, height;
public Generator(int width, int height){ public Generator(int width, int height){
this.width = width; this.width = width;
this.height = height; this.height = height;
} }
public Generator(){}
/**Initialize special variables like maps.*/
public void init(){}
public abstract void generate(Tile[][] tiles); public abstract void generate(Tile[][] tiles);
} }

View File

@ -0,0 +1,38 @@
package io.anuke.mindustry.maps.generators;
import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.io.MapIO;
import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.maps.MapTileData;
import io.anuke.mindustry.maps.MapTileData.TileDataMarker;
import io.anuke.mindustry.world.Tile;
import static io.anuke.mindustry.Vars.world;
public class MapGenerator extends Generator{
private final Map map;
public MapGenerator(String mapName){
map = world.maps.loadInternalMap(mapName);
width = map.meta.width;
height = map.meta.height;
}
@Override
public void generate(Tile[][] tiles){
MapTileData data = MapIO.readTileData(map, true);
data.position(0, 0);
TileDataMarker marker = data.newDataMarker();
for(int y = 0; y < data.height(); y++){
for(int x = 0; x < data.width(); x++){
data.read(marker);
tiles[x][y] = new Tile(x, y, marker.floor, marker.wall == Blocks.blockpart.id ? 0 : marker.wall, marker.rotation, marker.team);
}
}
world.prepareTiles(tiles);
}
}

View File

@ -20,6 +20,11 @@ public class Zone extends UnlockableContent{
this.generator = generator; this.generator = generator;
} }
@Override
public void init(){
generator.init();
}
@Override @Override
public boolean isHidden(){ public boolean isHidden(){
return true; return true;

View File

@ -46,7 +46,7 @@ public class DeployDialog extends FloatingDialog{
data.removeItems(zone.deployCost); data.removeItems(zone.deployCost);
hide(); hide();
world.playZone(zone); world.playZone(zone);
}).size(150f).disabled(b -> !data.hasItems(zone.deployCost)); }).size(150f)/*.disabled(b -> !data.hasItems(zone.deployCost))*/;
t.row(); t.row();
t.table(req -> { t.table(req -> {
req.left(); req.left();

View File

@ -2,7 +2,6 @@ package io.anuke.mindustry.world.blocks;
import io.anuke.arc.Core; import io.anuke.arc.Core;
import io.anuke.arc.entities.Effects.Effect; import io.anuke.arc.entities.Effects.Effect;
import io.anuke.arc.function.BiPredicate;
import io.anuke.arc.function.Predicate; import io.anuke.arc.function.Predicate;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Draw;
@ -10,8 +9,8 @@ import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Geometry;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.Vector2;
import io.anuke.mindustry.content.StatusEffects;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.content.StatusEffects;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.type.StatusEffect;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
@ -52,11 +51,9 @@ public class Floor extends Block{
public boolean playerUnmineable = false; public boolean playerUnmineable = false;
protected TextureRegion edgeRegion; protected TextureRegion edgeRegion;
protected TextureRegion[] edgeRegions; protected TextureRegion[] edgeRegions;
protected TextureRegion[] cliffRegions;
protected TextureRegion[] variantRegions; protected TextureRegion[] variantRegions;
protected Vector2[] offsets; protected Vector2[] offsets;
protected Predicate<Floor> blends = block -> block != this && !block.blendOverride(this); protected Predicate<Floor> blends = block -> block != this && !block.blendOverride(this);
protected BiPredicate<Tile, Tile> tileBlends = (tile, other) -> false;
protected boolean blend = true; protected boolean blend = true;
public Floor(String name){ public Floor(String name){
@ -96,12 +93,6 @@ public class Floor extends Block{
edgeRegions[i] = result; edgeRegions[i] = result;
offsets[i] = new Vector2(-padSize + rx, -padSize + ry); offsets[i] = new Vector2(-padSize + rx, -padSize + ry);
} }
cliffRegions = new TextureRegion[4];
cliffRegions[0] = Core.atlas.find(name + "-cliff-edge-2");
cliffRegions[1] = Core.atlas.find(name + "-cliff-edge");
cliffRegions[2] = Core.atlas.find(name + "-cliff-edge-1");
cliffRegions[3] = Core.atlas.find(name + "-cliff-side");
} }
//load variant regions for drawing //load variant regions for drawing
@ -115,6 +106,8 @@ public class Floor extends Block{
variantRegions = new TextureRegion[1]; variantRegions = new TextureRegion[1];
variantRegions[0] = Core.atlas.find(name); variantRegions[0] = Core.atlas.find(name);
} }
region = variantRegions[0];
} }
@Override @Override