Added block rubble, more liquid interaction

This commit is contained in:
Anuken
2018-04-19 19:06:52 -04:00
parent 32fb79478c
commit 7df232c65d
21 changed files with 563 additions and 450 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 106 KiB

View File

@@ -1,7 +1,7 @@
#Autogenerated file. Do not modify. #Autogenerated file. Do not modify.
#Wed Apr 18 21:31:08 EDT 2018 #Thu Apr 19 19:06:19 EDT 2018
version=release version=release
androidBuildCode=1049 androidBuildCode=1073
name=Mindustry name=Mindustry
code=3.5 code=3.5
build=custom build build=custom build

View File

@@ -147,7 +147,7 @@ public class Vars{
public static final EntityGroup<Shield> shieldGroup = Entities.addGroup(Shield.class, false); public static final EntityGroup<Shield> shieldGroup = Entities.addGroup(Shield.class, false);
public static final EntityGroup<EffectEntity> effectGroup = Entities.addGroup(EffectEntity.class, false); public static final EntityGroup<EffectEntity> effectGroup = Entities.addGroup(EffectEntity.class, false);
public static final EntityGroup<EffectEntity> groundEffectGroup = Entities.addGroup(EffectEntity.class, false); public static final EntityGroup<EffectEntity> groundEffectGroup = Entities.addGroup(EffectEntity.class, false);
public static final EntityGroup<Puddle> groundItemGroup = Entities.addGroup(Puddle.class, false); public static final EntityGroup<Puddle> puddleGroup = Entities.addGroup(Puddle.class, false);
public static final EntityGroup<Fire> airItemGroup = Entities.addGroup(Fire.class, false); public static final EntityGroup<Fire> airItemGroup = Entities.addGroup(Fire.class, false);
public static final EntityGroup<BaseUnit>[] unitGroups = new EntityGroup[Team.values().length]; public static final EntityGroup<BaseUnit>[] unitGroups = new EntityGroup[Team.values().length];

View File

@@ -44,7 +44,12 @@ public class Items {
} }
}, },
silicon = new Item("silicon", Color.valueOf("53565c")), silicon = new Item("silicon", Color.valueOf("53565c")),
plastic = new Item("plastic", Color.valueOf("e9ead3")), plastic = new Item("plastic", Color.valueOf("e9ead3")){
{
flammability = 0.2f;
explosiveness = 0.1f;
}
},
densealloy = new Item("densealloy", Color.valueOf("b4d5c7")), densealloy = new Item("densealloy", Color.valueOf("b4d5c7")),
biomatter = new Item("biomatter", Color.valueOf("648b55")) { biomatter = new Item("biomatter", Color.valueOf("648b55")) {
{ {

View File

@@ -126,7 +126,7 @@ public class Logic extends Module {
for(EntityGroup group : unitGroups){ for(EntityGroup group : unitGroups){
Entities.update(group); Entities.update(group);
} }
Entities.update(groundItemGroup); Entities.update(puddleGroup);
Entities.update(tileGroup); Entities.update(tileGroup);
Entities.update(airItemGroup); Entities.update(airItemGroup);
Entities.update(shieldGroup); Entities.update(shieldGroup);

View File

@@ -23,6 +23,7 @@ import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.graphics.BlockRenderer; import io.anuke.mindustry.graphics.BlockRenderer;
import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.graphics.MinimapRenderer;
import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.graphics.Shaders;
import io.anuke.mindustry.input.InputHandler; import io.anuke.mindustry.input.InputHandler;
import io.anuke.mindustry.input.PlaceMode; import io.anuke.mindustry.input.PlaceMode;
@@ -57,6 +58,7 @@ public class Renderer extends RendererModule{
private Array<Callable> shieldDraws = new Array<>(); private Array<Callable> shieldDraws = new Array<>();
private Rectangle rect = new Rectangle(), rect2 = new Rectangle(); private Rectangle rect = new Rectangle(), rect2 = new Rectangle();
private BlockRenderer blocks = new BlockRenderer(); private BlockRenderer blocks = new BlockRenderer();
private MinimapRenderer minimap = new MinimapRenderer();
public Renderer() { public Renderer() {
Lines.setCircleVertices(14); Lines.setCircleVertices(14);
@@ -204,16 +206,12 @@ public class Renderer extends RendererModule{
else else
batch.begin(); batch.begin();
//clears shield surface
//Graphics.surface(shieldSurface);
//Graphics.surface();
drawPadding(); drawPadding();
blocks.drawFloor(); blocks.drawFloor();
Entities.draw(groundItemGroup);
Entities.draw(groundEffectGroup); Entities.draw(groundEffectGroup);
Entities.draw(puddleGroup);
blocks.processBlocks(); blocks.processBlocks();
blocks.drawBlocks(Layer.overlay); blocks.drawBlocks(Layer.overlay);
@@ -275,6 +273,10 @@ public class Renderer extends RendererModule{
background.dispose(); background.dispose();
} }
public MinimapRenderer minimap() {
return minimap;
}
public void clearTiles(){ public void clearTiles(){
blocks.clearTiles(); blocks.clearTiles();
} }

View File

@@ -1,5 +1,6 @@
package io.anuke.mindustry.core; package io.anuke.mindustry.core;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.math.GridPoint2; import com.badlogic.gdx.math.GridPoint2;
import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
@@ -13,7 +14,6 @@ import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.WorldGenerator; import io.anuke.mindustry.world.WorldGenerator;
import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.modules.Module; import io.anuke.ucore.modules.Module;
import io.anuke.ucore.util.Log;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Tmp; import io.anuke.ucore.util.Tmp;
@@ -157,7 +157,6 @@ public class World extends Module{
} }
public void loadMap(Map map, int seed){ public void loadMap(Map map, int seed){
Log.info("--BEGIN LOAD MAP--");
this.currentMap = map; this.currentMap = map;
this.seed = seed; this.seed = seed;

View File

@@ -8,6 +8,7 @@ import io.anuke.mindustry.content.StatusEffects;
import io.anuke.mindustry.content.fx.EnvironmentFx; import io.anuke.mindustry.content.fx.EnvironmentFx;
import io.anuke.mindustry.entities.SerializableEntity; import io.anuke.mindustry.entities.SerializableEntity;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
@@ -27,6 +28,7 @@ public class Fire extends TimedEntity implements SerializableEntity, Poolable{
private int loadedPosition = -1; private int loadedPosition = -1;
private Tile tile; private Tile tile;
private Block block;
private float baseFlammability = -1, puddleFlammability; private float baseFlammability = -1, puddleFlammability;
/**Start a fire on the tile. If there already is a file there, refreshes its lifetime..*/ /**Start a fire on the tile. If there already is a file there, refreshes its lifetime..*/
@@ -67,8 +69,9 @@ public class Fire extends TimedEntity implements SerializableEntity, Poolable{
time += Timers.delta()*8; time += Timers.delta()*8;
} }
if (baseFlammability < 0){ if (baseFlammability < 0 || block != tile.block()){
baseFlammability = tile.block().getFlammability(tile); baseFlammability = tile.block().getFlammability(tile);
block = tile.block();
} }
if(damage) { if(damage) {

View File

@@ -27,7 +27,7 @@ import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import static io.anuke.mindustry.Vars.groundItemGroup; import static io.anuke.mindustry.Vars.puddleGroup;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
public class Puddle extends Entity implements SerializableEntity, Poolable{ public class Puddle extends Entity implements SerializableEntity, Poolable{
@@ -60,6 +60,16 @@ public class Puddle extends Entity implements SerializableEntity, Poolable{
} }
private static void deposit(Tile tile, Tile source, Liquid liquid, float amount, int generation){ private static void deposit(Tile tile, Tile source, Liquid liquid, float amount, int generation){
if(tile.floor().liquid){
reactPuddle(tile.floor().liquidDrop, liquid, amount, tile, tile.worldx(), tile.worldy());
if(generation == 0 && Timers.get(tile, "ripple", 50)){
Effects.effect(BlockFx.ripple, tile.floor().liquidDrop.color,
(tile.worldx() + source.worldx())/2f, (tile.worldy() + source.worldy())/2f);
}
return;
}
Puddle p = map.get(tile.packedPosition()); Puddle p = map.get(tile.packedPosition());
if(p == null){ if(p == null){
Puddle puddle = Pools.obtain(Puddle.class); Puddle puddle = Pools.obtain(Puddle.class);
@@ -76,28 +86,29 @@ public class Puddle extends Entity implements SerializableEntity, Poolable{
Effects.effect(BlockFx.ripple, p.liquid.color, (tile.worldx() + source.worldx())/2f, (tile.worldy() + source.worldy())/2f); Effects.effect(BlockFx.ripple, p.liquid.color, (tile.worldx() + source.worldx())/2f, (tile.worldy() + source.worldy())/2f);
} }
}else{ }else{
reactPuddle(p, liquid, amount); p.amount -= reactPuddle(p.liquid, liquid, amount, p.tile, p.x, p.y);
} }
} }
private static void reactPuddle(Puddle p, Liquid liquid, float amount){ private static float reactPuddle(Liquid pliquid, Liquid liquid, float amount, Tile tile, float x, float y){
if((p.liquid.flammability > 0.3f && liquid.temperature > 0.7f) || if((pliquid.flammability > 0.3f && liquid.temperature > 0.7f) ||
(liquid.flammability > 0.3f && p.liquid.temperature > 0.7f)){ //flammable liquid + hot liquid (liquid.flammability > 0.3f && pliquid.temperature > 0.7f)){ //flammable liquid + hot liquid
Fire.create(p.tile); Fire.create(tile);
if(Mathf.chance(0.006 * amount)){ if(Mathf.chance(0.006 * amount)){
new Fireball(p.x, p.y, p.liquid.flameColor, Mathf.random(360f)).add(); new Fireball(x, y, pliquid.flameColor, Mathf.random(360f)).add();
} }
}else if(p.liquid.temperature > 0.7f && liquid.temperature < 0.55f){ //cold liquid poured onto hot puddle }else if(pliquid.temperature > 0.7f && liquid.temperature < 0.55f){ //cold liquid poured onto hot puddle
if(Mathf.chance(0.5f * amount)){ if(Mathf.chance(0.5f * amount)){
Effects.effect(EnvironmentFx.steam, p.x, p.y); Effects.effect(EnvironmentFx.steam, x, y);
} }
p.amount -= 0.1f * amount; return - 0.1f * amount;
}else if(liquid.temperature > 0.7f && p.liquid.temperature < 0.55f){ //hot liquid poured onto cold puddle }else if(liquid.temperature > 0.7f && pliquid.temperature < 0.55f){ //hot liquid poured onto cold puddle
if(Mathf.chance(0.8f * amount)){ if(Mathf.chance(0.8f * amount)){
Effects.effect(EnvironmentFx.steam, p.x, p.y); Effects.effect(EnvironmentFx.steam, x, y);
} }
p.amount -= 0.4f * amount; return - 0.4f * amount;
} }
return 0f;
} }
/**Deserialization use only!*/ /**Deserialization use only!*/
@@ -209,6 +220,6 @@ public class Puddle extends Entity implements SerializableEntity, Poolable{
@Override @Override
public Puddle add() { public Puddle add() {
return add(groundItemGroup); return add(puddleGroup);
} }
} }

View File

@@ -0,0 +1,35 @@
package io.anuke.mindustry.entities.effect;
import com.badlogic.gdx.graphics.Color;
import io.anuke.ucore.entities.TimedEntity;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.groundEffectGroup;
public class Rubble extends TimedEntity{
private static final Color color = Color.valueOf("52504e");
private int size;
public static void create(float x, float y, int size){
Rubble rubble = new Rubble();
rubble.size = size;
rubble.set(x + Mathf.range(1), y + Mathf.range(1)).add();
}
private Rubble(){
lifetime = 7000f;
}
@Override
public void draw(){
Draw.color(color.r, color.g, color.b, 1f-Mathf.curve(fin(), 0.98f));
Draw.rect("rubble-" + size + "-" + Mathf.randomSeed(id, 0, 1), x, y, Mathf.randomSeed(id, 0, 4) * 90);
Draw.color();
}
@Override
public Rubble add() {
return add(groundEffectGroup);
}
}

View File

@@ -54,9 +54,6 @@ public class BlockRenderer{
requestidx = 0; requestidx = 0;
lastLayer = null; lastLayer = null;
int crangex = (int) (camera.viewportWidth / (chunksize * tilesize)) + 1;
int crangey = (int) (camera.viewportHeight / (chunksize * tilesize)) + 1;
int rangex = (int) (camera.viewportWidth * camera.zoom / tilesize / 2)+2; int rangex = (int) (camera.viewportWidth * camera.zoom / tilesize / 2)+2;
int rangey = (int) (camera.viewportHeight * camera.zoom / tilesize / 2)+2; int rangey = (int) (camera.viewportHeight * camera.zoom / tilesize / 2)+2;
@@ -100,6 +97,7 @@ public class BlockRenderer{
} }
} }
//TODO this actually isn't necessary
Draw.color(0, 0, 0, 0.15f); Draw.color(0, 0, 0, 0.15f);
Graphics.flushSurface(); Graphics.flushSurface();
Draw.color(); Draw.color();

View File

@@ -65,10 +65,10 @@ public enum DrawLayer {
} }
protected void beginShader(){ protected void beginShader(){
renderer.getBlocks().endFloor(); //renderer.getBlocks().endFloor();
renderer.waterSurface.getBuffer().begin(); renderer.waterSurface.getBuffer().begin();
Graphics.clear(Color.CLEAR); Graphics.clear(Color.CLEAR);
renderer.getBlocks().beginFloor(); //renderer.getBlocks().beginFloor();
} }
public void endShader(Shader shader){ public void endShader(Shader shader){

View File

@@ -113,9 +113,8 @@ public class FloorRenderer {
} }
public void beginDraw(){ public void beginDraw(){
Gdx.gl.glEnable(GL20.GL_BLEND);
Core.atlas.getTextures().first().bind(); Core.atlas.getTextures().first().bind();
Gdx.gl.glEnable(GL20.GL_BLEND);
program.begin(); program.begin();
program.setUniformMatrix("u_projTrans", Core.camera.combined); program.setUniformMatrix("u_projTrans", Core.camera.combined);
@@ -187,6 +186,7 @@ public class FloorRenderer {
int idx = chunk.idx; int idx = chunk.idx;
TextureRegion region = new TextureRegion(Core.atlas.getTextures().first()); TextureRegion region = new TextureRegion(Core.atlas.getTextures().first());
IntArray edges = new IntArray();
for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){ for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){
for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){ for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){
@@ -194,9 +194,9 @@ public class FloorRenderer {
if(tile == null) continue; if(tile == null) continue;
if(tile.floor().drawLayer == layer && tile.block().drawLayer != DrawLayer.walls){ if(tile.floor().drawLayer == layer && tile.block().drawLayer != DrawLayer.walls){
idx = drawFloor(tile, idx, region, vertices, false); idx = drawFloor(tile, idx, region, vertices, false, edges);
}else if(tile.floor().drawLayer.ordinal() < layer.ordinal() && tile.block().drawLayer != DrawLayer.walls){ }else if(tile.floor().drawLayer.ordinal() < layer.ordinal() && tile.block().drawLayer != DrawLayer.walls && layer != DrawLayer.walls){
idx = drawFloor(tile, idx, region, vertices, true); idx = drawFloor(tile, idx, region, vertices, true, edges);
} }
if(tile.block().drawLayer == layer && layer == DrawLayer.walls){ if(tile.block().drawLayer == layer && layer == DrawLayer.walls){
@@ -214,7 +214,7 @@ public class FloorRenderer {
chunk.idx = idx; chunk.idx = idx;
} }
private int drawFloor(Tile tile, int idx, TextureRegion region, float[] vertices, boolean edgesOnly){ private int drawFloor(Tile tile, int idx, TextureRegion region, float[] vertices, boolean edgesOnly, IntArray edges){
MathUtils.random.setSeed(tile.id()); MathUtils.random.setSeed(tile.id());
Block block = tile.floor(); Block block = tile.floor();

View File

@@ -0,0 +1,29 @@
package io.anuke.mindustry.graphics;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Texture;
import com.sun.media.jfxmediaimpl.MediaDisposer.Disposable;
import io.anuke.mindustry.world.Tile;
public class MinimapRenderer implements Disposable{
private Pixmap pixmap;
private Texture texture;
public Texture getTexture(){
return texture;
}
public void reset(){
}
public void updated(Tile tile){
}
@Override
public void dispose() {
pixmap.dispose();
texture.dispose();
}
}

View File

@@ -33,6 +33,7 @@ public class BlockConfigFragment implements Fragment {
public void showConfig(Tile tile){ public void showConfig(Tile tile){
configTile = tile; configTile = tile;
table.setVisible(true);
table.clear(); table.clear();
tile.block().buildTable(tile, table); tile.block().buildTable(tile, table);
table.pack(); table.pack();

View File

@@ -11,6 +11,7 @@ import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.effect.DamageArea; import io.anuke.mindustry.entities.effect.DamageArea;
import io.anuke.mindustry.entities.effect.Puddle; import io.anuke.mindustry.entities.effect.Puddle;
import io.anuke.mindustry.entities.effect.Rubble;
import io.anuke.mindustry.graphics.DrawLayer; import io.anuke.mindustry.graphics.DrawLayer;
import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
@@ -264,6 +265,7 @@ public class Block extends BaseBlock {
} }
DamageArea.dynamicExplosion(x, y, flammability, explosiveness, power, tilesize * size/2f, tempColor); DamageArea.dynamicExplosion(x, y, flammability, explosiveness, power, tilesize * size/2f, tempColor);
Rubble.create(tile.drawx(), tile.drawy(), size);
} }
/**Returns the flammability of the tile. Used for fire calculations. /**Returns the flammability of the tile. Used for fire calculations.