diff --git a/core/assets-raw/sprites/blocks/environment/colored-floor-autotile.png b/core/assets-raw/sprites/blocks/environment/colored-floor-autotile.png new file mode 100644 index 0000000000..b3c7d8da22 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/colored-floor-autotile.png differ diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 461b780be5..06c302ee2e 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -604,3 +604,4 @@ 63078=crux-floor-2|block-crux-floor-2-ui 63077=crux-floor-3|block-crux-floor-3-ui 63076=crux-floor-4|block-crux-floor-4-ui +63075=colored-floor|block-colored-floor-ui diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index d2136d8652..7444472600 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -11,7 +11,6 @@ import mindustry.entities.effect.*; import mindustry.entities.part.DrawPart.*; import mindustry.entities.part.*; import mindustry.entities.pattern.*; -import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; @@ -59,7 +58,7 @@ public class Blocks{ shaleBoulder, sandBoulder, daciteBoulder, boulder, snowBoulder, basaltBoulder, carbonBoulder, ferricBoulder, beryllicBoulder, yellowStoneBoulder, arkyicBoulder, crystalCluster, vibrantCrystalCluster, crystalBlocks, crystalOrbs, crystallineBoulder, redIceBoulder, rhyoliteBoulder, redStoneBoulder, metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor4, metalFloor5, basalt, magmarock, hotrock, snowWall, saltWall, - darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6, darkMetal, cruxFloor1, cruxFloor2, cruxFloor3, cruxFloor4, + darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6, darkMetal, cruxFloor1, cruxFloor2, cruxFloor3, cruxFloor4, coloredFloor, pebbles, tendrils, //ores @@ -819,23 +818,27 @@ public class Blocks{ cruxFloor2 = new Floor("crux-floor-2"){{ autotile = true; - emitLight = true; - lightRadius = 30f; - lightColor = Team.crux.color.cpy().a(0.3f); + //emitLight = true; + //lightRadius = 30f; + //lightColor = Team.crux.color.cpy().a(0.3f); drawEdgeOut = false; drawEdgeIn = false; }}; cruxFloor3 = new Floor("crux-floor-3"){{ autotile = true; - emitLight = true; drawEdgeOut = false; drawEdgeIn = false; }}; cruxFloor4 = new Floor("crux-floor-4"){{ autotile = true; - emitLight = true; + drawEdgeOut = false; + drawEdgeIn = false; + }}; + + coloredFloor = new ColoredFloor("colored-floor"){{ + autotile = true; drawEdgeOut = false; drawEdgeIn = false; }}; diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index de42d08957..1eb24a901b 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -360,6 +360,7 @@ public class MinimapRenderer{ if(tile == null) return 0; Block real = realBlock(tile); int bc = real.minimapColor(tile); + if(bc == 0 && tile.block() == Blocks.air && tile.overlay() == Blocks.air) bc = tile.floor().minimapColor(tile); Color color = Tmp.c1.set(bc == 0 ? MapIO.colorFor(real, tile.floor(), tile.overlay(), tile.team()) : bc); color.mul(1f - Mathf.clamp(world.getDarkness(tile.x, tile.y) / 4f)); diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index 2efcd50070..b6d55a6814 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -209,7 +209,7 @@ public abstract class SaveVersion extends SaveFileReader{ //floor + overlay for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.rawTile(i % world.width(), i / world.width()); + Tile tile = world.tiles.geti(i); stream.writeShort(tile.floorID()); stream.writeShort(tile.overlayID()); int consecutives = 0; @@ -230,10 +230,10 @@ public abstract class SaveVersion extends SaveFileReader{ //blocks for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.rawTile(i % world.width(), i / world.width()); + Tile tile = world.tiles.geti(i); stream.writeShort(tile.blockID()); - boolean savedata = tile.floor().saveData || tile.overlay().saveData || tile.block().saveData; + boolean savedata = tile.shouldSaveData(); //in the old version, the second bit was set to indicate presence of data, but that approach was flawed - it didn't allow buildings + data on the same tile //so now the third bit is used instead @@ -268,7 +268,7 @@ public abstract class SaveVersion extends SaveFileReader{ for(int j = i + 1; j < world.width() * world.height() && consecutives < 255; j++){ Tile nextTile = world.rawTile(j % world.width(), j / world.width()); - if(nextTile.blockID() != tile.blockID()){ + if(nextTile.blockID() != tile.blockID() || savedata != nextTile.shouldSaveData()){ break; } diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index ee5e19436f..fac7607edb 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -311,6 +311,10 @@ public class Tile implements Position, QuadTreeObject, Displayable{ if(!world.isGenerating() && prev != type){ Events.fire(floorChange.set(this, prev, type)); } + + if(this.floor != prev){ + this.floor.floorChanged(this); + } } public boolean isEditorTile(){ @@ -564,6 +568,10 @@ public class Tile implements Position, QuadTreeObject, Displayable{ null : null; } + public boolean shouldSaveData(){ + return floor.saveData || overlay.saveData || block.saveData; + } + public int staticDarkness(){ return block.solid && block.fillsTile && !block.synthetic() ? data : 0; } diff --git a/core/src/mindustry/world/blocks/environment/ColoredFloor.java b/core/src/mindustry/world/blocks/environment/ColoredFloor.java new file mode 100644 index 0000000000..ddb7080f82 --- /dev/null +++ b/core/src/mindustry/world/blocks/environment/ColoredFloor.java @@ -0,0 +1,47 @@ +package mindustry.world.blocks.environment; + +import arc.graphics.*; +import arc.graphics.g2d.*; +import mindustry.world.*; + +public class ColoredFloor extends Floor{ + public Color defaultColor = Color.white; + protected int defaultColorRgba; + + public ColoredFloor(String name){ + super(name); + saveData = true; + } + + @Override + public void init(){ + super.init(); + defaultColorRgba = defaultColor.rgba(); + } + + @Override + public void drawBase(Tile tile){ + //make sure to mask out the alpha channel - it's generally undesirable, and leads to invisible blocks when the data is not initialized + Draw.color(tile.extraData | 0xff); + super.drawBase(tile); + Draw.color(); + } + + @Override + public void drawOverlay(Tile tile){ + //make sure color doesn't carry over + Draw.color(); + super.drawOverlay(tile); + } + + @Override + public void floorChanged(Tile tile){ + //reset to white + tile.extraData = defaultColorRgba; + } + + @Override + public int minimapColor(Tile tile){ + return tile.extraData | 0xff; + } +} diff --git a/core/src/mindustry/world/blocks/environment/Floor.java b/core/src/mindustry/world/blocks/environment/Floor.java index b67ecf9313..5e0695deff 100644 --- a/core/src/mindustry/world/blocks/environment/Floor.java +++ b/core/src/mindustry/world/blocks/environment/Floor.java @@ -268,6 +268,9 @@ public class Floor extends Block{ return new TextureRegion[]{Core.atlas.find(Core.atlas.has(name) ? name : name + "1")}; } + /** Called when this floor is set on the specified tile. */ + public void floorChanged(Tile tile){} + /** @return whether to index this floor by flag */ public boolean shouldIndex(Tile tile){ return true;