Better cliff sprites
BIN
core/assets-raw/sprites/blocks/environment/cliff0.png
Normal file
|
After Width: | Height: | Size: 456 B |
BIN
core/assets-raw/sprites/blocks/environment/cliff1.png
Normal file
|
After Width: | Height: | Size: 351 B |
BIN
core/assets-raw/sprites/blocks/environment/cliff2.png
Normal file
|
After Width: | Height: | Size: 429 B |
BIN
core/assets-raw/sprites/blocks/environment/cliff3.png
Normal file
|
After Width: | Height: | Size: 435 B |
BIN
core/assets-raw/sprites/blocks/environment/cliff4.png
Normal file
|
After Width: | Height: | Size: 416 B |
BIN
core/assets-raw/sprites/blocks/environment/cliff5.png
Normal file
|
After Width: | Height: | Size: 405 B |
BIN
core/assets-raw/sprites/blocks/environment/cliff6.png
Normal file
|
After Width: | Height: | Size: 365 B |
BIN
core/assets-raw/sprites/blocks/environment/cliff7.png
Normal file
|
After Width: | Height: | Size: 469 B |
|
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 389 B |
|
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 377 B |
|
Before Width: | Height: | Size: 562 KiB After Width: | Height: | Size: 562 KiB |
|
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 189 KiB |
|
Before Width: | Height: | Size: 333 KiB After Width: | Height: | Size: 372 KiB |
|
Before Width: | Height: | Size: 429 KiB After Width: | Height: | Size: 429 KiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 2.9 MiB After Width: | Height: | Size: 2.9 MiB |
|
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 190 KiB |
|
Before Width: | Height: | Size: 331 KiB After Width: | Height: | Size: 354 KiB |
|
Before Width: | Height: | Size: 426 KiB After Width: | Height: | Size: 426 KiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
@@ -65,6 +65,11 @@ public class World{
|
|||||||
return tile == null || tile.block().solid;
|
return tile == null || tile.block().solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean wallSolidFull(int x, int y){
|
||||||
|
Tile tile = tile(x, y);
|
||||||
|
return tile == null || (tile.block().solid && tile.block().fillsTile);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isAccessible(int x, int y){
|
public boolean isAccessible(int x, int y){
|
||||||
return !wallSolid(x, y - 1) || !wallSolid(x, y + 1) || !wallSolid(x - 1, y) || !wallSolid(x + 1, y);
|
return !wallSolid(x, y - 1) || !wallSolid(x, y + 1) || !wallSolid(x - 1, y) || !wallSolid(x + 1, y);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -557,6 +557,12 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
t.add(slider).width(size * 3f - 20).padTop(4f);
|
t.add(slider).width(size * 3f - 20).padTop(4f);
|
||||||
}).padTop(5).growX().top();
|
}).padTop(5).growX().top();
|
||||||
|
|
||||||
|
mid.row();
|
||||||
|
|
||||||
|
mid.table(t -> {
|
||||||
|
t.button("@editor.center", () -> view.center()).growX();
|
||||||
|
}).pad(-5).style(Styles.squaret).growX().top();
|
||||||
|
|
||||||
}).margin(0).left().growY();
|
}).margin(0).left().growY();
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -171,6 +171,10 @@ public class MapView extends Element implements GestureListener{
|
|||||||
this.grid = grid;
|
this.grid = grid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void center(){
|
||||||
|
offsetx = offsety = 0;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void act(float delta){
|
public void act(float delta){
|
||||||
super.act(delta);
|
super.act(delta);
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
|
|||||||
float scl = 5f;
|
float scl = 5f;
|
||||||
float waterOffset = 0.07f;
|
float waterOffset = 0.07f;
|
||||||
|
|
||||||
|
//TODO fix sand near snow (sector 173)
|
||||||
Block[][] arr =
|
Block[][] arr =
|
||||||
{
|
{
|
||||||
{Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.darksandTaintedWater, Blocks.stone, Blocks.stone},
|
{Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.darksandTaintedWater, Blocks.stone, Blocks.stone},
|
||||||
|
|||||||
@@ -496,8 +496,24 @@ public class Tile implements Position, QuadTreeObject, Displayable{
|
|||||||
|
|
||||||
protected void changeEntity(Team team, Prov<Building> entityprov, int rotation){
|
protected void changeEntity(Team team, Prov<Building> entityprov, int rotation){
|
||||||
if(build != null){
|
if(build != null){
|
||||||
|
int size = build.block.size;
|
||||||
build.remove();
|
build.remove();
|
||||||
build = null;
|
build = null;
|
||||||
|
|
||||||
|
//update edge entities
|
||||||
|
tileSet.clear();
|
||||||
|
|
||||||
|
for(Point2 edge : Edges.getEdges(size)){
|
||||||
|
Building other = world.build(x + edge.x, y + edge.y);
|
||||||
|
if(other != null){
|
||||||
|
tileSet.add(other);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//update proximity, since multiblock was just removed
|
||||||
|
for(Building t : tileSet){
|
||||||
|
t.updateProximity();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(block.hasBuilding()){
|
if(block.hasBuilding()){
|
||||||
|
|||||||
@@ -2,11 +2,13 @@ package mindustry.world.blocks.environment;
|
|||||||
|
|
||||||
import arc.graphics.g2d.*;
|
import arc.graphics.g2d.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import mindustry.annotations.Annotations.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
|
|
||||||
public class Cliff extends Block{
|
public class Cliff extends Block{
|
||||||
public float size = 11f;
|
public float size = 11f;
|
||||||
|
public @Load(value = "cliffmask#", length = 256) TextureRegion[] cliffs;
|
||||||
|
|
||||||
public Cliff(String name){
|
public Cliff(String name){
|
||||||
super(name);
|
super(name);
|
||||||
@@ -19,15 +21,8 @@ public class Cliff extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawBase(Tile tile){
|
public void drawBase(Tile tile){
|
||||||
|
Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.6f));
|
||||||
int r = tile.data;
|
Draw.rect(cliffs[tile.data & 0xff], tile.worldx(), tile.worldy());
|
||||||
for(int i = 0; i < 8; i++){
|
|
||||||
if((r & (1 << i)) != 0){
|
|
||||||
Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.3f + (i >= 4 ? -0.4f : 0.3f)));
|
|
||||||
Draw.rect(region, tile.worldx(), tile.worldy(), size, size, i * 45f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Draw.color();
|
Draw.color();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -78,6 +78,79 @@ public class Generators{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ImagePacker.generate("cliffs", () -> {
|
||||||
|
int size = 64;
|
||||||
|
Color dark = new Color(0.5f, 0.5f, 0.6f, 1f).mul(0.98f);
|
||||||
|
Color mid = Color.lightGray;
|
||||||
|
|
||||||
|
Image[] images = new Image[8];
|
||||||
|
for(int i = 0; i < 8; i++){
|
||||||
|
images[i] = ImagePacker.get("cliff" + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++){
|
||||||
|
Image result = new Image(size, size);
|
||||||
|
byte[][] mask = new byte[size][size];
|
||||||
|
|
||||||
|
byte val = (byte)i;
|
||||||
|
//check each bit/direction
|
||||||
|
for(int j = 0; j < 8; j++){
|
||||||
|
if((val & (1 << j)) != 0){
|
||||||
|
if(j % 2 == 1 && (((val & (1 << (j + 1))) != 0) != ((val & (1 << (j - 1))) != 0))){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Image image = images[j];
|
||||||
|
image.each((x, y) -> {
|
||||||
|
Color color = image.getColor(x, y);
|
||||||
|
if(color.a > 0.1){
|
||||||
|
//white -> bit 1 -> top
|
||||||
|
//black -> bit 2 -> bottom
|
||||||
|
mask[x][y] |= (color.r > 0.5f ? 1 : 2);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result.each((x, y) -> {
|
||||||
|
byte m = mask[x][y];
|
||||||
|
if(m != 0){
|
||||||
|
//mid
|
||||||
|
if(m == 3){
|
||||||
|
//find nearest non-mid color
|
||||||
|
byte best = 0;
|
||||||
|
float bestDst = 0;
|
||||||
|
boolean found = false;
|
||||||
|
//expand search range until found
|
||||||
|
for(int rad = 9; rad < 64; rad += 7){
|
||||||
|
for(int cx = Math.max(x - rad, 0); cx <= Math.min(x + rad, size - 1); cx++){
|
||||||
|
for(int cy = Math.max(y - rad, 0); cy <= Math.min(y + rad, size - 1); cy++){
|
||||||
|
byte nval = mask[cx][cy];
|
||||||
|
if(nval == 1 || nval == 2){
|
||||||
|
float dst2 = Mathf.dst2(cx, cy, x, y);
|
||||||
|
if(dst2 <= rad * rad && (!found || dst2 < bestDst)){
|
||||||
|
best = nval;
|
||||||
|
bestDst = dst2;
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(found){
|
||||||
|
m = best;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result.draw(x, y, m == 1 ? Color.white : m == 2 ? dark : mid);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
result.save("../blocks/environment/cliffmask" + (val & 0xff));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
ImagePacker.generate("cracks", () -> {
|
ImagePacker.generate("cracks", () -> {
|
||||||
RidgedPerlin r = new RidgedPerlin(1, 3);
|
RidgedPerlin r = new RidgedPerlin(1, 3);
|
||||||
for(int size = 1; size <= Block.maxCrackSize; size++){
|
for(int size = 1; size <= Block.maxCrackSize; size++){
|
||||||
|
|||||||