New ore system / Multiblock fixes

This commit is contained in:
Anuken
2019-03-12 13:28:00 -04:00
parent e4875903f1
commit 8ad6f3abcc
30 changed files with 1594 additions and 3260 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 512 B

After

Width:  |  Height:  |  Size: 496 B

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 KiB

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 KiB

After

Width:  |  Height:  |  Size: 164 KiB

@@ -203,7 +203,7 @@ public class BlockIndexer{
for(int x = Math.max(0, tile.x - oreQuadrantSize / 2); x < tile.x + oreQuadrantSize / 2 && x < world.width(); x++){ for(int x = Math.max(0, tile.x - oreQuadrantSize / 2); x < tile.x + oreQuadrantSize / 2 && x < world.width(); x++){
for(int y = Math.max(0, tile.y - oreQuadrantSize / 2); y < tile.y + oreQuadrantSize / 2 && y < world.height(); y++){ for(int y = Math.max(0, tile.y - oreQuadrantSize / 2); y < tile.y + oreQuadrantSize / 2 && y < world.height(); y++){
Tile res = world.tile(x, y); Tile res = world.tile(x, y);
if(res.block() == Blocks.air && res.floor().itemDrop == item){ if(res.block() == Blocks.air && res.drop() == item){
return res; return res;
} }
} }
@@ -241,9 +241,9 @@ public class BlockIndexer{
for(int x = quadrantX * structQuadrantSize; x < world.width() && x < (quadrantX + 1) * structQuadrantSize; x++){ for(int x = quadrantX * structQuadrantSize; x < world.width() && x < (quadrantX + 1) * structQuadrantSize; x++){
for(int y = quadrantY * structQuadrantSize; y < world.height() && y < (quadrantY + 1) * structQuadrantSize; y++){ for(int y = quadrantY * structQuadrantSize; y < world.height() && y < (quadrantY + 1) * structQuadrantSize; y++){
Tile result = world.tile(x, y); Tile result = world.tile(x, y);
if( result == null || result.floor().itemDrop == null || !scanOres.contains(result.floor().itemDrop)) continue; if( result == null || result.drop() == null || !scanOres.contains(result.drop())) continue;
itemSet.add(result.floor().itemDrop); itemSet.add(result.drop());
} }
} }
@@ -320,8 +320,8 @@ public class BlockIndexer{
Tile tile = world.tile(x, y); Tile tile = world.tile(x, y);
//add position of quadrant to list when an ore is found //add position of quadrant to list when an ore is found
if(tile.floor().itemDrop != null && scanOres.contains(tile.floor().itemDrop) && tile.block() == Blocks.air){ if(tile.drop() != null && scanOres.contains(tile.drop()) && tile.block() == Blocks.air){
ores.get(tile.floor().itemDrop).add(world.tile( ores.get(tile.drop()).add(world.tile(
//make sure to clamp quadrant middle position, since it might go off bounds //make sure to clamp quadrant middle position, since it might go off bounds
Mathf.clamp(qx * oreQuadrantSize + oreQuadrantSize / 2, 0, world.width() - 1), Mathf.clamp(qx * oreQuadrantSize + oreQuadrantSize / 2, 0, world.width() - 1),
Mathf.clamp(qy * oreQuadrantSize + oreQuadrantSize / 2, 0, world.height() - 1))); Mathf.clamp(qy * oreQuadrantSize + oreQuadrantSize / 2, 0, world.height() - 1)));
+16 -24
View File
@@ -7,7 +7,6 @@ import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.graphics.CacheLayer; import io.anuke.mindustry.graphics.CacheLayer;
import io.anuke.mindustry.type.Category; import io.anuke.mindustry.type.Category;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
@@ -28,7 +27,8 @@ import io.anuke.mindustry.world.blocks.units.UnitFactory;
import io.anuke.mindustry.world.consumers.ConsumeItemFilter; import io.anuke.mindustry.world.consumers.ConsumeItemFilter;
import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter; import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.world;
public class Blocks implements ContentList{ public class Blocks implements ContentList{
public static Block public static Block
@@ -39,6 +39,9 @@ public class Blocks implements ContentList{
iceSnow, sandWater, duneRocks, sandRocks, stainedRocks, moss, stainedRocksRed, stainedStoneRed, stainedRocksYellow, stainedStoneYellow, stainedBoulder, grass, salt, iceSnow, sandWater, duneRocks, sandRocks, stainedRocks, moss, stainedRocksRed, stainedStoneRed, stainedRocksYellow, stainedStoneYellow, stainedBoulder, grass, salt,
metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, ignarock, magmarock, hotrock, snowrocks, metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, ignarock, magmarock, hotrock, snowrocks,
//ores
oreCopper, oreLead, oreScrap, oreCoal, oreTitanium, oreThorium,
//crafting //crafting
siliconSmelter, kiln, graphitePress, plastaniumCompressor, multiPress, phaseWeaver, surgeSmelter, pyratiteMixer, blastMixer, cryofluidMixer, siliconSmelter, kiln, graphitePress, plastaniumCompressor, multiPress, phaseWeaver, surgeSmelter, pyratiteMixer, blastMixer, cryofluidMixer,
melter, separator, sporePress, pulverizer, incinerator, melter, separator, sporePress, pulverizer, incinerator,
@@ -145,7 +148,7 @@ public class Blocks implements ContentList{
}}; }};
stone = new Floor("stone"){{ stone = new Floor("stone"){{
hasOres = true;
}}; }};
craters = new Floor("craters"){{ craters = new Floor("craters"){{
@@ -170,12 +173,10 @@ public class Blocks implements ContentList{
sand = new Floor("sand"){{ sand = new Floor("sand"){{
itemDrop = Items.sand; itemDrop = Items.sand;
hasOres = true;
playerUnmineable = true; playerUnmineable = true;
}}; }};
holostone = new Floor("holostone"){{ holostone = new Floor("holostone"){{
hasOres = true;
edgeStyle = "blocky"; edgeStyle = "blocky";
}}; }};
@@ -226,7 +227,6 @@ public class Blocks implements ContentList{
}}; }};
pine = new StaticWall("pine"){{ pine = new StaticWall("pine"){{
//fillsTile = false;
variants = 0; variants = 0;
}}; }};
@@ -253,7 +253,6 @@ public class Blocks implements ContentList{
}}; }};
stainedStoneRed = new Floor("stained-stone-red"){{ stainedStoneRed = new Floor("stained-stone-red"){{
hasOres = true;
variants = 1; variants = 1;
}}; }};
@@ -308,6 +307,16 @@ public class Blocks implements ContentList{
blendGroup = ignarock; blendGroup = ignarock;
}}; }};
//endregion
//region ore
oreCopper = new OreBlock(Items.copper);
oreLead = new OreBlock(Items.lead);
oreScrap = new OreBlock(Items.scrap);
oreCoal = new OreBlock(Items.coal);
oreTitanium = new OreBlock(Items.titanium);
oreThorium = new OreBlock(Items.thorium);
//endregion //endregion
//region crafting //region crafting
@@ -1418,23 +1427,6 @@ public class Blocks implements ContentList{
consumes.powerBuffered(120f); consumes.powerBuffered(120f);
}}; }};
//endregion
//region ores
//create ores for every floor and item combination necessary
for(Item item : content.items()){
if(!item.genOre) continue;
for(Block block : content.blocks()){
if(block instanceof Floor && ((Floor) block).hasOres){
new OreBlock(item, (Floor) block);
}
}
}
//special variants
new OreBlock(Items.scrap, (Floor)snow);
//endregion //endregion
} }
} }
@@ -15,7 +15,6 @@ public class Items implements ContentList{
type = ItemType.material; type = ItemType.material;
hardness = 1; hardness = 1;
cost = 0.6f; cost = 0.6f;
genOre = true;
alwaysUnlocked = true; alwaysUnlocked = true;
}}; }};
@@ -23,7 +22,6 @@ public class Items implements ContentList{
type = ItemType.material; type = ItemType.material;
hardness = 1; hardness = 1;
cost = 0.9f; cost = 0.9f;
genOre = true;
}}; }};
metaglass = new Item("metaglass", Color.valueOf("ebeef5")){{ metaglass = new Item("metaglass", Color.valueOf("ebeef5")){{
@@ -40,14 +38,12 @@ public class Items implements ContentList{
explosiveness = 0.4f; explosiveness = 0.4f;
flammability = 1f; flammability = 1f;
hardness = 2; hardness = 2;
genOre = true;
}}; }};
titanium = new Item("titanium", Color.valueOf("8da1e3")){{ titanium = new Item("titanium", Color.valueOf("8da1e3")){{
type = ItemType.material; type = ItemType.material;
hardness = 3; hardness = 3;
cost = 1.1f; cost = 1.1f;
genOre = true;
}}; }};
thorium = new Item("thorium", Color.valueOf("f9a3c7")){{ thorium = new Item("thorium", Color.valueOf("f9a3c7")){{
@@ -56,11 +52,10 @@ public class Items implements ContentList{
hardness = 4; hardness = 4;
radioactivity = 1f; radioactivity = 1f;
cost = 1.4f; cost = 1.4f;
genOre = true;
}}; }};
scrap = new Item("scrap", Color.valueOf("777777")){{ scrap = new Item("scrap", Color.valueOf("777777")){{
genOre = true;
}}; }};
silicon = new Item("silicon", Color.valueOf("53565c")){{ silicon = new Item("silicon", Color.valueOf("53565c")){{
@@ -45,7 +45,7 @@ public class DrawOperation{
}else if(type == OpType.team.ordinal()){ }else if(type == OpType.team.ordinal()){
tile.setTeam(Team.all[to]); tile.setTeam(Team.all[to]);
}else if(type == OpType.ore.ordinal()){ }else if(type == OpType.ore.ordinal()){
tile.setOre(to); tile.setOreByte(to);
} }
}); });
editor.renderer().updatePoint(tile.x, tile.y); editor.renderer().updatePoint(tile.x, tile.y);
@@ -1,11 +1,13 @@
package io.anuke.mindustry.editor; package io.anuke.mindustry.editor;
import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.editor.DrawOperation.OpType; import io.anuke.mindustry.editor.DrawOperation.OpType;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.gen.TileOp; import io.anuke.mindustry.gen.TileOp;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OreBlock;
import io.anuke.mindustry.world.modules.ConsumeModule; import io.anuke.mindustry.world.modules.ConsumeModule;
import io.anuke.mindustry.world.modules.ItemModule; import io.anuke.mindustry.world.modules.ItemModule;
import io.anuke.mindustry.world.modules.LiquidModule; import io.anuke.mindustry.world.modules.LiquidModule;
@@ -19,12 +21,30 @@ public class EditorTile extends Tile{
super(x, y, floor, wall); super(x, y, floor, wall);
} }
@Override
public Team getTeam(){
return Team.all[getTeamID()];
}
@Override @Override
public void setFloor(Floor type){ public void setFloor(Floor type){
if(type instanceof OreBlock){
//don't place on liquids
if(!floor().isLiquid) setOreByte(type.id);
return;
}
Block previous = floor(); Block previous = floor();
if(previous == type) return; Block ore = oreBlock();
if(previous == type && ore == Blocks.air) return;
super.setFloor(type); super.setFloor(type);
op(TileOp.get(x, y, (byte)OpType.floor.ordinal(), previous.id, type.id)); //ore may get nullified so make sure to save editrs
if(oreBlock() != ore){
op(TileOp.get(x, y, (byte)OpType.ore.ordinal(), ore.id, oreBlock().id));
}
if(previous != type){
op(TileOp.get(x, y, (byte)OpType.floor.ordinal(), previous.id, type.id));
}
} }
@Override @Override
@@ -52,10 +72,10 @@ public class EditorTile extends Tile{
} }
@Override @Override
public void setOre(byte ore){ public void setOreByte(byte ore){
byte previous = getRotation(); byte previous = getOreByte();
if(previous == ore) return; if(previous == ore) return;
super.setOre(ore); super.setOreByte(ore);
op(TileOp.get(x, y, (byte)OpType.ore.ordinal(), previous, ore)); op(TileOp.get(x, y, (byte)OpType.ore.ordinal(), previous, ore));
} }
@@ -3,6 +3,7 @@ package io.anuke.mindustry.editor;
import io.anuke.arc.collection.ObjectMap; import io.anuke.arc.collection.ObjectMap;
import io.anuke.arc.files.FileHandle; import io.anuke.arc.files.FileHandle;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Log;
import io.anuke.arc.util.Pack; import io.anuke.arc.util.Pack;
import io.anuke.arc.util.Structs; import io.anuke.arc.util.Structs;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
@@ -52,6 +53,7 @@ public class MapEditor{
tiles = createTiles(map.width, map.height); tiles = createTiles(map.width, map.height);
tags.putAll(map.tags); tags.putAll(map.tags);
MapIO.readTiles(map, tiles); MapIO.readTiles(map, tiles);
checkTiles();
renderer.resize(width(), height()); renderer.resize(width(), height());
loading = false; loading = false;
} }
@@ -60,9 +62,46 @@ public class MapEditor{
reset(); reset();
this.tiles = tiles; this.tiles = tiles;
checkTiles();
renderer.resize(width(), height()); renderer.resize(width(), height());
} }
//adds missing blockparts
void checkTiles(){
//clear block parts first
for(int x = 0; x < width(); x ++){
for(int y = 0; y < height(); y++){
if(tiles[x][y].block() == Blocks.part){
tiles[x][y].setBlock(Blocks.air);
tiles[x][y].setLinkByte((byte)0);
}
}
}
//set up missing blockparts
for(int x = 0; x < width(); x ++){
for(int y = 0; y < height(); y ++){
Block drawBlock = tiles[x][y].block();
if(drawBlock.isMultiblock()){
int offsetx = -(drawBlock.size - 1) / 2;
int offsety = -(drawBlock.size - 1) / 2;
for(int dx = 0; dx < drawBlock.size; dx++){
for(int dy = 0; dy < drawBlock.size; dy++){
int worldx = dx + offsetx + x;
int worldy = dy + offsety + y;
if(Structs.inBounds(worldx, worldy, width(), height()) && !(dx + offsetx == 0 && dy + offsety == 0)){
Tile tile = tiles[worldx][worldy];
tile.setBlock(Blocks.part);
tile.setLinkByte(Pack.byteByte((byte) (dx + offsetx + 8), (byte) (dy + offsety + 8)));
}
}
}
}
}
}
}
public void load(Runnable r){ public void load(Runnable r){
loading = true; loading = true;
r.run(); r.run();
@@ -137,6 +176,7 @@ public class MapEditor{
Tile tile = tiles[worldx][worldy]; Tile tile = tiles[worldx][worldy];
if(i == 1){ if(i == 1){
tile.setBlock(Blocks.part);
tile.setLinked((byte)(dx + offsetx), (byte)(dy + offsety)); tile.setLinked((byte)(dx + offsetx), (byte)(dy + offsety));
}else{ }else{
byte link = tile.getLinkByte(); byte link = tile.getLinkByte();
@@ -170,10 +210,11 @@ public class MapEditor{
if(!isfloor){ if(!isfloor){
byte link = tile.getLinkByte(); byte link = tile.getLinkByte();
Log.info("Remove linkd: " + tiles[x][y]);
if(tile.block().isMultiblock()){ if(tile.block().isMultiblock()){
removeLinked(wx, wy); removeLinked(wx, wy);
}else if(link != 0){ }else if(link != 0 && tiles[x][y].block() == Blocks.part){
removeLinked(wx - (Pack.leftByte(link) - 8), wy - (Pack.rightByte(link) - 8)); removeLinked(wx - (Pack.leftByte(link) - 8), wy - (Pack.rightByte(link) - 8));
} }
} }
@@ -422,6 +422,12 @@ public class MapEditorDialog extends Dialog implements Disposable{
} }
} }
if(Core.input.keyTap(KeyCode.ESCAPE)){
if(!menu.isShown()){
menu.show();
}
}
if(Core.input.keyTap(KeyCode.R)){ if(Core.input.keyTap(KeyCode.R)){
editor.rotation = Mathf.mod(editor.rotation + 1, 4); editor.rotation = Mathf.mod(editor.rotation + 1, 4);
} }
@@ -139,6 +139,8 @@ public class MapRenderer implements Disposable{
region = !Core.atlas.isFound(wall.editorIcon()) ? Core.atlas.find("clear-editor") : wall.editorIcon(); region = !Core.atlas.isFound(wall.editorIcon()) ? Core.atlas.find("clear-editor") : wall.editorIcon();
offsetX = tilesize/2f - region.getWidth()/2f * Draw.scl; offsetX = tilesize/2f - region.getWidth()/2f * Draw.scl;
offsetY = tilesize/2f - region.getHeight()/2f * Draw.scl; offsetY = tilesize/2f - region.getHeight()/2f * Draw.scl;
}else if(wall == Blocks.air && tile.oreBlock() != null){
region = tile.oreBlock().editorVariantRegions()[Mathf.randomSeed(idxWall, 0, tile.oreBlock().editorVariantRegions().length-1)];;
}else{ }else{
region = Core.atlas.find("clear-editor"); region = Core.atlas.find("clear-editor");
} }
@@ -252,10 +252,10 @@ public interface BuilderTrait extends Entity, TeamTrait{
TileEntity core = unit.getClosestCore(); TileEntity core = unit.getClosestCore();
if(core == null || tile.block() != Blocks.air || dst(tile.worldx(), tile.worldy()) > mineDistance if(core == null || tile.block() != Blocks.air || dst(tile.worldx(), tile.worldy()) > mineDistance
|| tile.floor().itemDrop == null || !unit.acceptsItem(tile.floor().itemDrop) || !canMine(tile.floor().itemDrop)){ || tile.drop() == null || !unit.acceptsItem(tile.drop()) || !canMine(tile.drop())){
setMineTile(null); setMineTile(null);
}else{ }else{
Item item = tile.floor().itemDrop; Item item = tile.drop();
unit.rotation = Mathf.slerpDelta(unit.rotation, unit.angleTo(tile.worldx(), tile.worldy()), 0.4f); unit.rotation = Mathf.slerpDelta(unit.rotation, unit.angleTo(tile.worldx(), tile.worldy()), 0.4f);
if(Mathf.chance(Time.delta() * (0.06 - item.hardness * 0.01) * getMinePower())){ if(Mathf.chance(Time.delta() * (0.06 - item.hardness * 0.01) * getMinePower())){
@@ -137,7 +137,7 @@ public class MinimapRenderer implements Disposable{
private int colorFor(Tile tile){ private int colorFor(Tile tile){
tile = tile.target(); tile = tile.target();
return MapIO.colorFor(tile.floor(), tile.block(), tile.getTeam()); return MapIO.colorFor(tile.floor(), tile.block(), tile.oreBlock(), tile.getTeam());
} }
@Override @Override
@@ -230,9 +230,9 @@ public abstract class InputHandler implements InputProcessor{
boolean canMine(Tile tile){ boolean canMine(Tile tile){
return !Core.scene.hasMouse() return !Core.scene.hasMouse()
&& tile.floor().itemDrop != null && tile.floor().itemDrop.hardness <= player.mech.drillPower && tile.drop() != null && tile.drop().hardness <= player.mech.drillPower
&& !tile.floor().playerUnmineable && !tile.floor().playerUnmineable
&& player.acceptsItem(tile.floor().itemDrop) && player.acceptsItem(tile.drop())
&& tile.block() == Blocks.air && player.dst(tile.worldx(), tile.worldy()) <= Player.mineDistance; && tile.block() == Blocks.air && player.dst(tile.worldx(), tile.worldy()) <= Player.mineDistance;
} }
+28 -15
View File
@@ -7,6 +7,7 @@ import io.anuke.arc.files.FileHandle;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.Pixmap; import io.anuke.arc.graphics.Pixmap;
import io.anuke.arc.graphics.Pixmap.Format; import io.anuke.arc.graphics.Pixmap.Format;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Pack; import io.anuke.arc.util.Pack;
import io.anuke.arc.util.Structs; import io.anuke.arc.util.Structs;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
@@ -66,13 +67,19 @@ public class MapIO{
CachedTile tile = new CachedTile(){ CachedTile tile = new CachedTile(){
@Override @Override
public void setFloor(Floor type){ public void setFloor(Floor type){
floor.drawPixel(x, floor.getHeight() - 1 - y, colorFor(type, Blocks.air, getTeam())); floor.drawPixel(x, floor.getHeight() - 1 - y, colorFor(type, Blocks.air, Blocks.air, getTeam()));
}
@Override
public void setOreByte(byte b){
if(b != 0)
floor.drawPixel(x, floor.getHeight() - 1 - y, colorFor(floor(), Blocks.air, content.block(b), getTeam()));
} }
@Override @Override
protected void changed(){ protected void changed(){
super.changed(); super.changed();
int c = colorFor(Blocks.air, block(), getTeam()); int c = colorFor(Blocks.air, block(), Blocks.air, getTeam());
if(c != black) wall.drawPixel(x, floor.getHeight() - 1 - y, c); if(c != black) wall.drawPixel(x, floor.getHeight() - 1 - y, c);
} }
}; };
@@ -91,17 +98,17 @@ public class MapIO{
for(int x = 0; x < pixmap.getWidth(); x++){ for(int x = 0; x < pixmap.getWidth(); x++){
for(int y = 0; y < pixmap.getHeight(); y++){ for(int y = 0; y < pixmap.getHeight(); y++){
Tile tile = tiles[x][y]; Tile tile = tiles[x][y];
pixmap.drawPixel(x, pixmap.getHeight() - 1 - y, colorFor(tile.floor(), tile.block(), tile.getTeam())); pixmap.drawPixel(x, pixmap.getHeight() - 1 - y, colorFor(tile.floor(), tile.block(), tile.oreBlock(), tile.getTeam()));
} }
} }
return pixmap; return pixmap;
} }
public static int colorFor(Block floor, Block wall, Team team){ public static int colorFor(Block floor, Block wall, Block ore, Team team){
if(wall.synthetic()){ if(wall.synthetic()){
return team.intColor; return team.intColor;
} }
return Color.rgba8888(wall.solid ? wall.color : floor.color); return Color.rgba8888(wall.solid ? wall.color : ore == Blocks.air ? floor.color : ore.color);
} }
public static void writeMap(FileHandle file, Map map, Tile[][] tiles) throws IOException{ public static void writeMap(FileHandle file, Map map, Tile[][] tiles) throws IOException{
@@ -130,13 +137,13 @@ public class MapIO{
for(int i = 0; i < tiles.length * tiles[0].length; i++){ for(int i = 0; i < tiles.length * tiles[0].length; i++){
Tile tile = tiles[i % width][i / width]; Tile tile = tiles[i % width][i / width];
stream.writeByte(tile.getFloorID()); stream.writeByte(tile.getFloorID());
stream.writeByte(tile.getOre()); stream.writeByte(tile.getOreByte());
int consecutives = 0; int consecutives = 0;
for(int j = i + 1; j < width * height && consecutives < 255; j++){ for(int j = i + 1; j < width * height && consecutives < 255; j++){
Tile nextTile = tiles[j % width][j / width]; Tile nextTile = tiles[j % width][j / width];
if(nextTile.getFloorID() != tile.getFloorID() || nextTile.block() != Blocks.air || nextTile.getOre() != tile.getOre()){ if(nextTile.getFloorID() != tile.getFloorID() || nextTile.block() != Blocks.air || nextTile.getOreByte() != tile.getOreByte()){
break; break;
} }
@@ -258,13 +265,13 @@ public class MapIO{
Tile tile = tiles.get(x, y); Tile tile = tiles.get(x, y);
tile.setFloor((Floor)content.block(floorid)); tile.setFloor((Floor)content.block(floorid));
tile.setOre(oreid); tile.setOreByte(oreid);
for(int j = i + 1; j < i + 1 + consecutives; j++){ for(int j = i + 1; j < i + 1 + consecutives; j++){
int newx = j % width, newy = j / width; int newx = j % width, newy = j / width;
Tile newTile = tiles.get(newx, newy); Tile newTile = tiles.get(newx, newy);
newTile.setFloor((Floor)content.block(floorid)); newTile.setFloor((Floor)content.block(floorid));
newTile.setOre(oreid); newTile.setOreByte(oreid);
} }
i += consecutives; i += consecutives;
@@ -323,6 +330,7 @@ public class MapIO{
tile.setFloor(block.floor); tile.setFloor(block.floor);
tile.setBlock(block.wall); tile.setBlock(block.wall);
if(block.ore != null) tile.setOre(block.ore);
//place core //place core
if(color == Color.rgba8888(Color.GREEN)){ if(color == Color.rgba8888(Color.GREEN)){
@@ -384,9 +392,10 @@ public class MapIO{
String[] split = name.split("-"); String[] split = name.split("-");
String itemName = split[1], floorName = split[2]; String itemName = split[1], floorName = split[2];
Item item = content.getByName(ContentType.item, itemName); Item item = content.getByName(ContentType.item, itemName);
Block oreBlock = item == null ? null : content.getByName(ContentType.block, "ore-" + item.name);
Block floor = content.getByName(ContentType.block, floorName); Block floor = content.getByName(ContentType.block, floorName);
if(item != null && floor != null){ if(oreBlock != null && floor != null){
oreMap.put(id, item.id); oreMap.put(id, oreBlock.id);
block = floor; block = floor;
}else{ }else{
block = Blocks.air; block = Blocks.air;
@@ -406,18 +415,22 @@ public class MapIO{
byte floorb = stream.readByte(); byte floorb = stream.readByte();
byte blockb = stream.readByte(); byte blockb = stream.readByte();
byte rotTeamb = stream.readByte(); byte rotTeamb = stream.readByte();
byte linkb = stream.readByte(); byte link = stream.readByte();
stream.readByte(); //unused stuff stream.readByte();//unused stuff
tile.setFloor((Floor)content.block(map.get(floorb, 0))); tile.setFloor((Floor)content.block(map.get(floorb, 0)));
tile.setBlock(content.block(map.get(blockb, 0))); tile.setBlock(content.block(map.get(blockb, 0)));
tile.setRotation(Pack.leftByte(rotTeamb)); tile.setRotation(Pack.leftByte(rotTeamb));
if(tile.block().synthetic()){
tile.setTeam(Team.all[Mathf.clamp(Pack.rightByte(rotTeamb), 0, Team.all.length)]);
}
if(tile.block() == Blocks.part){ if(tile.block() == Blocks.part){
tile.setLinkByte(linkb); tile.setLinkByte(link);
} }
if(oreMap.containsKey(floorb)){ if(oreMap.containsKey(floorb)){
tile.setOre((byte)oreMap.get(floorb, 0)); tile.setOreByte((byte)oreMap.get(floorb, 0));
} }
} }
} }
@@ -51,13 +51,13 @@ public abstract class SaveFileVersion{
for(int i = 0; i < world.width() * world.height(); i++){ for(int i = 0; i < world.width() * world.height(); i++){
Tile tile = world.tile(i % world.width(), i / world.width()); Tile tile = world.tile(i % world.width(), i / world.width());
stream.writeByte(tile.getFloorID()); stream.writeByte(tile.getFloorID());
stream.writeByte(tile.getOre()); stream.writeByte(tile.getOreByte());
int consecutives = 0; int consecutives = 0;
for(int j = i + 1; j < world.width() * world.height() && consecutives < 255; j++){ for(int j = i + 1; j < world.width() * world.height() && consecutives < 255; j++){
Tile nextTile = world.tile(j % world.width(), j / world.width()); Tile nextTile = world.tile(j % world.width(), j / world.width());
if(nextTile.getFloorID() != tile.getFloorID() || nextTile.getOre() != tile.getOre()){ if(nextTile.getFloorID() != tile.getFloorID() || nextTile.getOreByte() != tile.getOreByte()){
break; break;
} }
@@ -122,12 +122,12 @@ public abstract class SaveFileVersion{
int consecutives = stream.readUnsignedByte(); int consecutives = stream.readUnsignedByte();
tiles[x][y] = new Tile(x, y, floorid, (byte)0); tiles[x][y] = new Tile(x, y, floorid, (byte)0);
tiles[x][y].setOre(oreid); tiles[x][y].setOreByte(oreid);
for(int j = i + 1; j < i + 1 + consecutives; j++){ for(int j = i + 1; j < i + 1 + consecutives; j++){
int newx = j % width, newy = j / width; int newx = j % width, newy = j / width;
Tile newTile = new Tile(newx, newy, floorid, (byte)0); Tile newTile = new Tile(newx, newy, floorid, (byte)0);
newTile.setOre(oreid); newTile.setOreByte(oreid);
tiles[newx][newy] = newTile; tiles[newx][newy] = newTile;
} }
@@ -6,8 +6,6 @@ import io.anuke.arc.util.noise.Simplex;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OreBlock;
public class BasicGenerator extends RandomGenerator{ public class BasicGenerator extends RandomGenerator{
private Array<Item> ores; private Array<Item> ores;
@@ -31,13 +29,14 @@ public class BasicGenerator extends RandomGenerator{
public void generate(int x, int y){ public void generate(int x, int y){
floor = Blocks.stone; floor = Blocks.stone;
if(ores != null && ((Floor) floor).hasOres){ if(ores != null){
int offsetX = x - 4, offsetY = y + 23; int offsetX = x - 4, offsetY = y + 23;
for(int i = ores.size - 1; i >= 0; i--){ for(int i = ores.size - 1; i >= 0; i--){
Item entry = ores.get(i); Item entry = ores.get(i);
if(Math.abs(0.5f - sim.octaveNoise2D(2, 0.7, 1f / (50 + i * 2), offsetX, offsetY)) > 0.23f && if(Math.abs(0.5f - sim.octaveNoise2D(2, 0.7, 1f / (50 + i * 2), offsetX, offsetY)) > 0.23f &&
Math.abs(0.5f - sim2.octaveNoise2D(1, 1, 1f / (40 + i * 4), offsetX, offsetY)) > 0.32f){ Math.abs(0.5f - sim2.octaveNoise2D(1, 1, 1f / (40 + i * 4), offsetX, offsetY)) > 0.32f){
floor = OreBlock.get(floor, entry);
//floor = OreBlock.get(floor, entry);
break; break;
} }
} }
@@ -14,14 +14,13 @@ import io.anuke.mindustry.type.Loadout;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OreBlock;
import io.anuke.mindustry.world.blocks.StaticWall; import io.anuke.mindustry.world.blocks.StaticWall;
import io.anuke.mindustry.world.blocks.storage.CoreBlock; import io.anuke.mindustry.world.blocks.storage.CoreBlock;
import io.anuke.mindustry.world.blocks.storage.StorageBlock; import io.anuke.mindustry.world.blocks.storage.StorageBlock;
import java.io.IOException; import java.io.IOException;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.world;
public class MapGenerator extends Generator{ public class MapGenerator extends Generator{
private Map map; private Map map;
@@ -159,10 +158,7 @@ public class MapGenerator extends Generator{
double dst = Mathf.dst(x, y); double dst = Mathf.dst(x, y);
if(dst < frad && Structs.inBounds(wx, wy, tiles) && (dst <= rad || Mathf.chance(0.5))){ if(dst < frad && Structs.inBounds(wx, wy, tiles) && (dst <= rad || Mathf.chance(0.5))){
Tile tile = tiles[wx][wy]; Tile tile = tiles[wx][wy];
if(tile.floor() instanceof OreBlock){ tile.clearOre();
OreBlock block = (OreBlock)tile.floor();
tile.setFloor(block.base);
}
} }
} }
} }
+5 -4
View File
@@ -5,9 +5,12 @@ import io.anuke.arc.collection.Array;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.game.UnlockableContent;
import io.anuke.mindustry.ui.ContentDisplay; import io.anuke.mindustry.ui.ContentDisplay;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OreBlock;
import static io.anuke.mindustry.Vars.content;
public class Item extends UnlockableContent implements Comparable<Item>{ public class Item extends UnlockableContent implements Comparable<Item>{
public final Color color; public final Color color;
@@ -28,8 +31,6 @@ public class Item extends UnlockableContent implements Comparable<Item>{
* 1 cost = 1 tick added to build time * 1 cost = 1 tick added to build time
*/ */
public float cost = 3f; public float cost = 3f;
/**Whether this item has ores generated for it.*/
public boolean genOre = false;
/**If true, item is always unlocked.*/ /**If true, item is always unlocked.*/
public boolean alwaysUnlocked = false; public boolean alwaysUnlocked = false;
@@ -101,6 +102,6 @@ public class Item extends UnlockableContent implements Comparable<Item>{
/**Allocates a new array containing all items the generate ores.*/ /**Allocates a new array containing all items the generate ores.*/
public static Array<Item> getAllOres(){ public static Array<Item> getAllOres(){
return Vars.content.items().select(i -> i.genOre); return content.blocks().select(b -> b instanceof OreBlock).map(b -> ((Floor)b).itemDrop);
} }
} }
@@ -3,13 +3,10 @@ package io.anuke.mindustry.type;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.Array;
import io.anuke.arc.collection.IntMap; import io.anuke.arc.collection.IntMap;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OreBlock;
import io.anuke.mindustry.world.blocks.storage.CoreBlock; import io.anuke.mindustry.world.blocks.storage.CoreBlock;
import static io.anuke.mindustry.Vars.defaultTeam; import static io.anuke.mindustry.Vars.defaultTeam;
@@ -27,7 +24,7 @@ public class Loadout extends Content{
put('2', new BlockEntry(Blocks.coreFoundation)); put('2', new BlockEntry(Blocks.coreFoundation));
put('3', new BlockEntry(Blocks.coreNucleus)); put('3', new BlockEntry(Blocks.coreNucleus));
put('C', new BlockEntry(Blocks.mechanicalDrill, Items.copper)); put('C', new BlockEntry(Blocks.mechanicalDrill, Blocks.oreCopper));
}}; }};
private final IntMap<BlockEntry> blocks = new IntMap<>(); private final IntMap<BlockEntry> blocks = new IntMap<>();
@@ -79,8 +76,7 @@ public class Loadout extends Content{
tile.setRotation((byte)entry.value.rotation); tile.setRotation((byte)entry.value.rotation);
if(entry.value.ore != null){ if(entry.value.ore != null){
for(Tile t : tile.getLinkedTiles(outArray)){ for(Tile t : tile.getLinkedTiles(outArray)){
Floor floor = t.floor(); t.setOre(entry.value.ore);
t.setFloor(OreBlock.get(floor, entry.value.ore) == null ? OreBlock.get(Blocks.stone, entry.value.ore) : OreBlock.get(floor, entry.value.ore));
} }
} }
} }
@@ -93,10 +89,10 @@ public class Loadout extends Content{
static class BlockEntry{ static class BlockEntry{
final Block block; final Block block;
final Item ore; final Block ore;
final int rotation; final int rotation;
BlockEntry(Block block, Item ore){ BlockEntry(Block block, Block ore){
this.block = block; this.block = block;
this.ore = ore; this.ore = ore;
this.rotation = 0; this.rotation = 0;
@@ -13,6 +13,7 @@ import io.anuke.arc.scene.ui.ButtonGroup;
import io.anuke.arc.scene.ui.Image; import io.anuke.arc.scene.ui.Image;
import io.anuke.arc.scene.ui.ImageButton; import io.anuke.arc.scene.ui.ImageButton;
import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.game.EventType.UnlockEvent; import io.anuke.mindustry.game.EventType.UnlockEvent;
@@ -26,7 +27,6 @@ import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Block.Icon; import io.anuke.mindustry.world.Block.Icon;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.OreBlock;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -340,6 +340,6 @@ public class PlacementFragment extends Fragment{
/** Returns the block currently being hovered over in the world. */ /** Returns the block currently being hovered over in the world. */
Block tileDisplayBlock(){ Block tileDisplayBlock(){
return hoverTile == null ? null : hoverTile.block().synthetic() ? hoverTile.block() : hoverTile.floor() instanceof OreBlock ? hoverTile.floor() : null; return hoverTile == null ? null : hoverTile.block().synthetic() ? hoverTile.block() : hoverTile.oreBlock() != Blocks.air ? hoverTile.oreBlock() : null;
} }
} }
@@ -17,6 +17,11 @@ public class CachedTile extends Tile{
super(0, 0); super(0, 0);
} }
@Override
public Team getTeam(){
return Team.all[getTeamID()];
}
@Override @Override
protected void preChanged(){ protected void preChanged(){
super.setTeam(Team.none); super.setTeam(Team.none);
@@ -3,10 +3,8 @@ package io.anuke.mindustry.world;
import io.anuke.arc.collection.IntMap; import io.anuke.arc.collection.IntMap;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.game.ContentList;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OreBlock;
public class LegacyColorMapper implements ContentList{ public class LegacyColorMapper implements ContentList{
private static IntMap<LegacyBlock> blockMap = new IntMap<>(); private static IntMap<LegacyBlock> blockMap = new IntMap<>();
@@ -38,10 +36,14 @@ public class LegacyColorMapper implements ContentList{
map("6e501e", Blocks.stainedStoneRed); map("6e501e", Blocks.stainedStoneRed);
map("ed5334", Blocks.stainedStoneRed); map("ed5334", Blocks.stainedStoneRed);
map("292929", Blocks.tar); map("292929", Blocks.tar);
map("c3a490", OreBlock.get(Blocks.stone, Items.copper)); map("c3a490", Blocks.stone, Blocks.air, Blocks.oreCopper);
map("161616", OreBlock.get(Blocks.stone, Items.coal)); map("161616", Blocks.stone, Blocks.air, Blocks.oreCoal);
map("6277bc", OreBlock.get(Blocks.stone, Items.titanium)); map("6277bc", Blocks.stone, Blocks.air, Blocks.oreTitanium);
map("83bc58", OreBlock.get(Blocks.stone, Items.thorium)); map("83bc58", Blocks.stone, Blocks.air, Blocks.oreThorium);
}
private void map(String color, Block block, Block wall, Block ore){
blockMap.put(Color.rgba8888(Color.valueOf(color)), new LegacyBlock(block, wall, ore));
} }
private void map(String color, Block block, Block wall){ private void map(String color, Block block, Block wall){
@@ -55,10 +57,18 @@ public class LegacyColorMapper implements ContentList{
public static class LegacyBlock{ public static class LegacyBlock{
public final Floor floor; public final Floor floor;
public final Block wall; public final Block wall;
public final Block ore;
public LegacyBlock(Block floor, Block wall){ public LegacyBlock(Block floor, Block wall){
this.floor = (Floor) floor; this.floor = (Floor) floor;
this.wall = wall; this.wall = wall;
this.ore = null;
}
public LegacyBlock(Block floor, Block wall, Block ore){
this.floor = (Floor) floor;
this.wall = wall;
this.ore = ore;
} }
} }
+23 -5
View File
@@ -9,9 +9,10 @@ import io.anuke.arc.math.geom.Position;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.Vector2;
import io.anuke.arc.util.Pack; import io.anuke.arc.util.Pack;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.entities.traits.TargetTrait; import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.blocks.BlockPart; import io.anuke.mindustry.world.blocks.BlockPart;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.modules.ConsumeModule; import io.anuke.mindustry.world.modules.ConsumeModule;
@@ -40,7 +41,7 @@ public class Tile implements Position, TargetTrait{
/** Team ordinal. */ /** Team ordinal. */
private byte team; private byte team;
/**Ore that is on top of this (floor) block.*/ /**Ore that is on top of this (floor) block.*/
private byte ore; private byte ore = 0;
public Tile(int x, int y){ public Tile(int x, int y){
this.x = (short) x; this.x = (short) x;
@@ -162,6 +163,7 @@ public class Tile implements Position, TargetTrait{
public void setFloor(Floor type){ public void setFloor(Floor type){
this.floor = type; this.floor = type;
this.ore = 0;
} }
public byte getRotation(){ public byte getRotation(){
@@ -221,7 +223,7 @@ public class Tile implements Position, TargetTrait{
} }
public void setLinkByte(byte b){ public void setLinkByte(byte b){
this.link = 0; this.link = b;
} }
/** Sets this to a linked tile, which sets the block to a part. dx and dy can only be -8-7. */ /** Sets this to a linked tile, which sets the block to a part. dx and dy can only be -8-7. */
@@ -327,14 +329,30 @@ public class Tile implements Position, TargetTrait{
return getTeam() == Team.none || team == getTeam(); return getTeam() == Team.none || team == getTeam();
} }
public byte getOre(){ public byte getOreByte(){
return ore; return ore;
} }
public void setOre(byte ore){ public void setOreByte(byte ore){
this.ore = ore; this.ore = ore;
} }
public void setOre(Block floor){
setOreByte(floor.id);
}
public void clearOre(){
this.ore = 0;
}
public Floor oreBlock(){
return (Floor)content.block(ore);
}
public Item drop(){
return ore == 0 ? floor.itemDrop : ((Floor)content.block(ore)).itemDrop;
}
public void updateOcclusion(){ public void updateOcclusion(){
cost = 1; cost = 1;
boolean occluded = false; boolean occluded = false;
@@ -7,6 +7,7 @@ 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.Point2; import io.anuke.arc.math.geom.Point2;
import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.content.StatusEffects;
import io.anuke.mindustry.entities.Effects.Effect; import io.anuke.mindustry.entities.Effects.Effect;
@@ -45,8 +46,6 @@ public class Floor extends Block{
public Liquid liquidDrop = null; public Liquid liquidDrop = null;
/** item that drops from this block, used for drills */ /** item that drops from this block, used for drills */
public Item itemDrop = null; public Item itemDrop = null;
/** Whether ores generate on this block. */
public boolean hasOres = false;
/** whether this block can be drowned in */ /** whether this block can be drowned in */
public boolean isLiquid; public boolean isLiquid;
/** Heat of this block, 0 at baseline. Used for calculating output of thermal generators.*/ /** Heat of this block, 0 at baseline. Used for calculating output of thermal generators.*/
@@ -110,6 +109,10 @@ public class Floor extends Block{
Mathf.random.setSeed(tile.pos()); Mathf.random.setSeed(tile.pos());
Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy());
Floor floor = tile.oreBlock();
if(floor != Blocks.air){
floor.draw(tile);
}
drawEdges(tile); drawEdges(tile);
} }
@@ -1,28 +1,18 @@
package io.anuke.mindustry.world.blocks; package io.anuke.mindustry.world.blocks;
import io.anuke.arc.collection.ObjectMap;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
public class OreBlock extends Floor{ public class OreBlock extends Floor{
private static final ObjectMap<Item, ObjectMap<Block, Floor>> oreBlockMap = new ObjectMap<>();
public Floor base; public OreBlock(Item ore){
super("ore-" + ore.name);
public OreBlock(Item ore, Floor base){ this.localizedName = ore.localizedName();
super("ore-" + ore.name + "-" + base.name);
this.localizedName = ore.localizedName() + " " + base.localizedName;
this.itemDrop = ore; this.itemDrop = ore;
this.base = base;
this.variants = 3; this.variants = 3;
this.edge = base.name;
this.blendGroup = base.blendGroup;
this.color.set(ore.color); this.color.set(ore.color);
oreBlockMap.getOr(ore, ObjectMap::new).put(base, this);
} }
@Override @Override
@@ -38,22 +28,5 @@ public class OreBlock extends Floor{
@Override @Override
public void draw(Tile tile){ public void draw(Tile tile){
Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy());
drawEdges(tile);
}
@Override
public boolean doEdge(Floor floor, boolean f){
return floor != base && super.doEdge(floor, f);
}
@Override
protected boolean edgeOnto(Floor other){
return other != base;
}
public static Floor get(Block floor, Item item){
if(!oreBlockMap.containsKey(item) || !oreBlockMap.get(item).containsKey(floor)) return null;
return oreBlockMap.get(item).get(floor);
} }
} }
@@ -18,6 +18,7 @@ import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemType;
import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.ui.Bar;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
@@ -182,7 +183,7 @@ public class Drill extends Block{
} }
itemArray.sort((item1, item2) -> Integer.compare(oreCount.get(item1, 0), oreCount.get(item2, 0))); itemArray.sort((item1, item2) -> Integer.compare(oreCount.get(item1, 0), oreCount.get(item2, 0)));
itemArray.sort((item1, item2) -> item1.genOre && !item2.genOre ? 1 : item1.genOre == item2.genOre ? 0 : -1); itemArray.sort((item1, item2) -> Boolean.compare(item1.type == ItemType.material, item2.type == ItemType.material));
if(itemArray.size == 0){ if(itemArray.size == 0){
return; return;
@@ -259,12 +260,12 @@ public class Drill extends Block{
} }
public Item getDrop(Tile tile){ public Item getDrop(Tile tile){
return tile.floor().itemDrop; return tile.drop();
} }
public boolean isValid(Tile tile){ public boolean isValid(Tile tile){
if(tile == null) return false; if(tile == null) return false;
Item drops = tile.floor().itemDrop; Item drops = tile.drop();
return drops != null && drops.hardness <= tier; return drops != null && drops.hardness <= tier;
} }
+3 -4
View File
@@ -206,11 +206,10 @@ public class Generators {
OreBlock ore = (OreBlock)block; OreBlock ore = (OreBlock)block;
Item item = ore.itemDrop; Item item = ore.itemDrop;
Block base = ore.base;
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
//get base image to draw on //get base image to draw on
Image image = ImagePacker.get(base.name + (i+1)); Image image = new Image(32, 32);
Image shadow = ImagePacker.get(item.name + (i+1)); Image shadow = ImagePacker.get(item.name + (i+1));
int offset = image.width()/tilesize; int offset = image.width()/tilesize;
@@ -228,8 +227,8 @@ public class Generators {
} }
image.draw(ImagePacker.get(item.name + (i+1))); image.draw(ImagePacker.get(item.name + (i+1)));
image.save("../blocks/environment/ore-" + item.name + "-" + base.name + (i+1)); image.save("../blocks/environment/ore-" + item.name + (i+1));
image.save("../editor/editor-ore-" + item.name + "-" + base.name + (i+1)); image.save("../editor/editor-ore-" + item.name + (i+1));
//save icons //save icons
image.save(block.name + "-icon-full"); image.save(block.name + "-icon-full");