Implemented basic block explosion modeling
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 177 B |
Binary file not shown.
|
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 177 B |
Binary file not shown.
|
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 104 KiB |
@@ -1,7 +1,7 @@
|
|||||||
#Autogenerated file. Do not modify.
|
#Autogenerated file. Do not modify.
|
||||||
#Sun Apr 15 13:03:00 EDT 2018
|
#Sun Apr 15 14:54:46 EDT 2018
|
||||||
version=release
|
version=release
|
||||||
androidBuildCode=925
|
androidBuildCode=926
|
||||||
name=Mindustry
|
name=Mindustry
|
||||||
code=3.5
|
code=3.5
|
||||||
build=custom build
|
build=custom build
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public class TurretBullets {
|
|||||||
|
|
||||||
public static final BulletType
|
public static final BulletType
|
||||||
|
|
||||||
basicIron = new BulletType(3f, 0) {
|
basicIron = new BulletType(3f, 5) {
|
||||||
@Override
|
@Override
|
||||||
public void draw(Bullet b) {
|
public void draw(Bullet b) {
|
||||||
drawBullet(Palette.bulletYellow, Palette.bulletYellowBack,
|
drawBullet(Palette.bulletYellow, Palette.bulletYellowBack,
|
||||||
|
|||||||
@@ -46,6 +46,29 @@ public class ExplosionFx {
|
|||||||
Lines.lineAngle(e.x + x, e.y + y, Mathf.atan2(x, y), 1f + e.fout()*3f);
|
Lines.lineAngle(e.x + x, e.y + y, Mathf.atan2(x, y), 1f + e.fout()*3f);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Draw.reset();
|
||||||
|
}),
|
||||||
|
|
||||||
|
blockExplosion = new Effect(30, e -> {
|
||||||
|
e.scaled(7, i -> {
|
||||||
|
Lines.stroke(3f * i.fout());
|
||||||
|
Lines.circle(e.x, e.y, 3f + i.fin()*10f);
|
||||||
|
});
|
||||||
|
|
||||||
|
Draw.color(Color.GRAY);
|
||||||
|
|
||||||
|
Angles.randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) ->{
|
||||||
|
Fill.circle(e.x + x, e.y + y, e.fout()*3f + 0.5f);
|
||||||
|
Fill.circle(e.x + x/2f, e.y + y/2f, e.fout()*1f);
|
||||||
|
});
|
||||||
|
|
||||||
|
Draw.color(Palette.lighterOrange, Palette.lightOrange, Color.GRAY, e.fin());
|
||||||
|
Lines.stroke(1.5f * e.fout());
|
||||||
|
|
||||||
|
Angles.randLenVectors(e.id + 1, 8, 1f + 23f * e.finpow(), (x, y) -> {
|
||||||
|
Lines.lineAngle(e.x + x, e.y + y, Mathf.atan2(x, y), 1f + e.fout()*3f);
|
||||||
|
});
|
||||||
|
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,10 +86,10 @@ public class TileEntity extends Entity{
|
|||||||
damage(other.getDamage());
|
damage(other.getDamage());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void damage(int damage){
|
public void damage(float damage){
|
||||||
if(dead) return;
|
if(dead) return;
|
||||||
|
|
||||||
int amount = tile.block().handleDamage(tile, damage);
|
float amount = tile.block().handleDamage(tile, damage);
|
||||||
health -= amount;
|
health -= amount;
|
||||||
if(health <= 0) onDeath();
|
if(health <= 0) onDeath();
|
||||||
|
|
||||||
|
|||||||
@@ -66,18 +66,19 @@ public class DamageArea{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**Damages everything in a radius.*/
|
/**Damages everything in a radius.*/
|
||||||
public static void damage(float x, float y, float radius, int damage){
|
public static void damage(float x, float y, float radius, float damage){
|
||||||
damage(null, x, y, radius, damage);
|
damage(null, x, y, radius, damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Damages all entities and blocks in a radius that are enemies of the team.*/
|
/**Damages all entities and blocks in a radius that are enemies of the team.*/
|
||||||
public static void damage(Team team, float x, float y, float radius, int damage){
|
public static void damage(Team team, float x, float y, float radius, float damage){
|
||||||
Consumer<Unit> cons = entity -> {
|
Consumer<Unit> cons = entity -> {
|
||||||
if(entity.distanceTo(x, y) > radius){
|
if(entity.distanceTo(x, y) > radius){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int amount = calculateDamage(x, y, entity.x, entity.y, radius, damage);
|
float amount = calculateDamage(x, y, entity.x, entity.y, radius, damage);
|
||||||
entity.damage(amount);
|
entity.damage(amount);
|
||||||
|
entity.velocity.add(tr.set(entity.x - x, entity.y - y).setLength(Mathf.clamp(damage/2f, 0, 6)));
|
||||||
};
|
};
|
||||||
|
|
||||||
rect.setSize(radius *2).setCenter(x, y);
|
rect.setSize(radius *2).setCenter(x, y);
|
||||||
@@ -92,7 +93,7 @@ public class DamageArea{
|
|||||||
for(int dy= -trad; dy <= trad; dy ++){
|
for(int dy= -trad; dy <= trad; dy ++){
|
||||||
Tile tile = world.tile(Mathf.scl2(x, tilesize) + dx, Mathf.scl2(y, tilesize) + dy);
|
Tile tile = world.tile(Mathf.scl2(x, tilesize) + dx, Mathf.scl2(y, tilesize) + dy);
|
||||||
if(tile != null && tile.entity != null && (team == null || state.teams.areEnemies(team, tile.getTeam())) && Vector2.dst(dx, dy, 0, 0) <= trad){
|
if(tile != null && tile.entity != null && (team == null || state.teams.areEnemies(team, tile.getTeam())) && Vector2.dst(dx, dy, 0, 0) <= trad){
|
||||||
int amount = calculateDamage(x, y, tile.worldx(), tile.worldy(), radius, damage);
|
float amount = calculateDamage(x, y, tile.worldx(), tile.worldy(), radius, damage);
|
||||||
tile.entity.damage(amount);
|
tile.entity.damage(amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,9 +101,9 @@ public class DamageArea{
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int calculateDamage(float x, float y, float tx, float ty, float radius, int damage){
|
private static float calculateDamage(float x, float y, float tx, float ty, float radius, float damage){
|
||||||
float dist = Vector2.dst(x, y, tx, ty);
|
float dist = Vector2.dst(x, y, tx, ty);
|
||||||
float scaled = 1f - dist/radius;
|
float scaled = 1f - dist/radius;
|
||||||
return (int)(damage * scaled);
|
return damage * scaled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
13
core/src/io/anuke/mindustry/entities/effect/Fire.java
Normal file
13
core/src/io/anuke/mindustry/entities/effect/Fire.java
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package io.anuke.mindustry.entities.effect;
|
||||||
|
|
||||||
|
import io.anuke.ucore.entities.TimedEntity;
|
||||||
|
|
||||||
|
import static io.anuke.mindustry.Vars.effectGroup;
|
||||||
|
|
||||||
|
public class Fire extends TimedEntity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Fire add(){
|
||||||
|
return add(effectGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
47
core/src/io/anuke/mindustry/entities/effect/Fireball.java
Normal file
47
core/src/io/anuke/mindustry/entities/effect/Fireball.java
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package io.anuke.mindustry.entities.effect;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.graphics.Color;
|
||||||
|
import io.anuke.mindustry.graphics.Palette;
|
||||||
|
import io.anuke.ucore.entities.TimedEntity;
|
||||||
|
import io.anuke.ucore.graphics.Draw;
|
||||||
|
import io.anuke.ucore.graphics.Fill;
|
||||||
|
import io.anuke.ucore.util.Angles;
|
||||||
|
import io.anuke.ucore.util.Mathf;
|
||||||
|
|
||||||
|
import static io.anuke.mindustry.Vars.effectGroup;
|
||||||
|
|
||||||
|
public class Fireball extends TimedEntity {
|
||||||
|
private float rotation;
|
||||||
|
private float speed = 0.3f;
|
||||||
|
private Color color;
|
||||||
|
|
||||||
|
public Fireball(float x, float y, Color color, float rotation){
|
||||||
|
set(x, y);
|
||||||
|
this.rotation = rotation;
|
||||||
|
this.color = color;
|
||||||
|
lifetime = 70f;
|
||||||
|
speed += Mathf.random(1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update() {
|
||||||
|
super.update();
|
||||||
|
|
||||||
|
float speed = this.speed - fin()*0.1f;
|
||||||
|
x += Angles.trnsx(rotation, speed);
|
||||||
|
y += Angles.trnsy(rotation, speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw() {
|
||||||
|
Draw.color(Palette.lightFlame, color, Color.GRAY, fin());
|
||||||
|
Fill.circle(x, y, 3f * fout() + 0.5f);
|
||||||
|
Draw.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Fireball add(){
|
||||||
|
super.update();
|
||||||
|
return add(effectGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,6 +25,8 @@ public class Lightning extends TimedEntity {
|
|||||||
private Array<Vector2> lines = new Array<>();
|
private Array<Vector2> lines = new Array<>();
|
||||||
private float angle;
|
private float angle;
|
||||||
|
|
||||||
|
public Color color = Palette.lancerLaser;
|
||||||
|
|
||||||
public Lightning(Team team, Effect effect, int damage, float x, float y, float targetAngle, int length){
|
public Lightning(Team team, Effect effect, int damage, float x, float y, float targetAngle, int length){
|
||||||
this.x = x;
|
this.x = x;
|
||||||
this.y = y;
|
this.y = y;
|
||||||
@@ -83,7 +85,7 @@ public class Lightning extends TimedEntity {
|
|||||||
@Override
|
@Override
|
||||||
public void draw() {
|
public void draw() {
|
||||||
float lx = x, ly = y;
|
float lx = x, ly = y;
|
||||||
Draw.color(Palette.lancerLaser, Color.WHITE, fin());
|
Draw.color(color, Color.WHITE, fin());
|
||||||
for(int i = 0; i < lines.size; i ++){
|
for(int i = 0; i < lines.size; i ++){
|
||||||
Vector2 v = lines.get(i);
|
Vector2 v = lines.get(i);
|
||||||
Lines.stroke(fout() * 3f + 1f-(float)i/lines.size);
|
Lines.stroke(fout() * 3f + 1f-(float)i/lines.size);
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ public abstract class UnitType {
|
|||||||
public void onDeath(BaseUnit unit){
|
public void onDeath(BaseUnit unit){
|
||||||
//TODO other things, such as enemies?
|
//TODO other things, such as enemies?
|
||||||
Effects.effect(ExplosionFx.explosion, unit);
|
Effects.effect(ExplosionFx.explosion, unit);
|
||||||
|
Effects.shake(2f, 2f, unit);
|
||||||
|
|
||||||
if(Net.server()){
|
if(Net.server()){
|
||||||
NetEvents.handleUnitDeath(unit);
|
NetEvents.handleUnitDeath(unit);
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ public class TeamInfo {
|
|||||||
enemies = new ObjectSet<>();
|
enemies = new ObjectSet<>();
|
||||||
private ObjectSet<TeamData> allyData = new ObjectSet<>(),
|
private ObjectSet<TeamData> allyData = new ObjectSet<>(),
|
||||||
enemyData = new ObjectSet<>();
|
enemyData = new ObjectSet<>();
|
||||||
|
private ObjectSet<TeamData> allTeamData = new ObjectSet<>();
|
||||||
|
private ObjectSet<Team> allTeams = new ObjectSet<>();
|
||||||
|
|
||||||
public ObjectSet<TeamData> getTeams(boolean ally) {
|
public ObjectSet<TeamData> getTeams(boolean ally) {
|
||||||
return ally ? allyData : enemyData;
|
return ally ? allyData : enemyData;
|
||||||
@@ -38,6 +40,9 @@ public class TeamInfo {
|
|||||||
enemyData.add(data);
|
enemyData.add(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
allTeamData.add(data);
|
||||||
|
allTeams.add(team);
|
||||||
|
|
||||||
map.put(team, data);
|
map.put(team, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,8 +64,8 @@ public class TeamInfo {
|
|||||||
boolean ally = allies.contains(team);
|
boolean ally = allies.contains(team);
|
||||||
boolean enemy = enemies.contains(team);
|
boolean enemy = enemies.contains(team);
|
||||||
|
|
||||||
//this team isn't even in the game, so target nothing!
|
//this team isn't even in the game, so target everything!
|
||||||
if(!ally && !enemy) return empty;
|
if(!ally && !enemy) return allTeams;
|
||||||
|
|
||||||
return ally ? enemies : allies;
|
return ally ? enemies : allies;
|
||||||
}
|
}
|
||||||
@@ -72,8 +77,8 @@ public class TeamInfo {
|
|||||||
boolean ally = allies.contains(team);
|
boolean ally = allies.contains(team);
|
||||||
boolean enemy = enemies.contains(team);
|
boolean enemy = enemies.contains(team);
|
||||||
|
|
||||||
//this team isn't even in the game, so target nothing!
|
//this team isn't even in the game, so target everything!
|
||||||
if(!ally && !enemy) return emptyData;
|
if(!ally && !enemy) return allTeamData;
|
||||||
|
|
||||||
return ally ? enemyData : allyData;
|
return ally ? enemyData : allyData;
|
||||||
}
|
}
|
||||||
@@ -83,7 +88,7 @@ public class TeamInfo {
|
|||||||
if(team == other) return false; //fast fail to be more efficient
|
if(team == other) return false; //fast fail to be more efficient
|
||||||
boolean ally = allies.contains(team);
|
boolean ally = allies.contains(team);
|
||||||
boolean ally2 = enemies.contains(other);
|
boolean ally2 = enemies.contains(other);
|
||||||
return ally == ally2;
|
return (ally == ally2) || !allTeams.contains(team); //if it's not in the game, target everything.
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TeamData {
|
public class TeamData {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package io.anuke.mindustry.resource;
|
|||||||
import com.badlogic.gdx.graphics.Color;
|
import com.badlogic.gdx.graphics.Color;
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||||
import com.badlogic.gdx.utils.Array;
|
import com.badlogic.gdx.utils.Array;
|
||||||
|
import io.anuke.mindustry.graphics.Palette;
|
||||||
import io.anuke.ucore.graphics.Draw;
|
import io.anuke.ucore.graphics.Draw;
|
||||||
import io.anuke.ucore.util.Bundles;
|
import io.anuke.ucore.util.Bundles;
|
||||||
|
|
||||||
@@ -25,6 +26,8 @@ public class Item implements Comparable<Item>{
|
|||||||
public boolean material = true;
|
public boolean material = true;
|
||||||
/**drill hardness of the item*/
|
/**drill hardness of the item*/
|
||||||
public int hardness = 0;
|
public int hardness = 0;
|
||||||
|
/**the burning color of this item*/
|
||||||
|
public Color flameColor = Palette.darkFlame.cpy();
|
||||||
|
|
||||||
public Item(String name, Color color) {
|
public Item(String name, Color color) {
|
||||||
this.id = items.size;
|
this.id = items.size;
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ public class Liquid {
|
|||||||
public float viscosity = 0.5f;
|
public float viscosity = 0.5f;
|
||||||
/**how prone to exploding this liquid is, when heated. 0 = nothing, 1 = nuke*/
|
/**how prone to exploding this liquid is, when heated. 0 = nothing, 1 = nuke*/
|
||||||
public float explosiveness;
|
public float explosiveness;
|
||||||
|
/**the burning color of this liquid*/
|
||||||
|
public Color flameColor = Color.valueOf("ffb763");
|
||||||
|
|
||||||
public Liquid(String name, Color color) {
|
public Liquid(String name, Color color) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
|||||||
@@ -79,33 +79,6 @@ public class BlockInventoryFragment implements Fragment {
|
|||||||
|
|
||||||
table.margin(3f);
|
table.margin(3f);
|
||||||
table.defaults().size(16 * 2).space(6f);
|
table.defaults().size(16 * 2).space(6f);
|
||||||
/*
|
|
||||||
|
|
||||||
if(tile.block().hasPower){
|
|
||||||
table.add(new ItemImage(Draw.region("icon-power"), () -> round(tile.entity.power.amount), Colors.get("power")));
|
|
||||||
|
|
||||||
if (row++ % cols == cols - 1) table.row();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tile.block().hasLiquids){
|
|
||||||
ItemImage image = new ItemImage(Draw.region("icon-liquid"),
|
|
||||||
() -> round(tile.entity.liquid.amount),
|
|
||||||
tile.entity.liquid.liquid == Liquids.none ? Color.GRAY : tile.entity.liquid.liquid.color);
|
|
||||||
|
|
||||||
image.addListener(new HandCursorListener());
|
|
||||||
image.tapped(() -> {
|
|
||||||
if (tile.entity.liquid.amount > 0) {
|
|
||||||
/*
|
|
||||||
int amount = Inputs.keyDown("item_withdraw") ? items[f] : 1;
|
|
||||||
items[f] -= amount;
|
|
||||||
|
|
||||||
move(item.region, image, () -> player.inventory.addItem(item, amount), Color.WHITE);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
table.add(image);
|
|
||||||
if (row++ % cols == cols - 1) table.row();
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if(tile.block().hasInventory) {
|
if(tile.block().hasInventory) {
|
||||||
int[] items = tile.entity.inventory.items;
|
int[] items = tile.entity.inventory.items;
|
||||||
|
|||||||
@@ -51,6 +51,8 @@ public class DebugFragment implements Fragment {
|
|||||||
row();
|
row();
|
||||||
new button("noclip", "toggle", () -> noclip = !noclip);
|
new button("noclip", "toggle", () -> noclip = !noclip);
|
||||||
row();
|
row();
|
||||||
|
new button("team", "toggle", () -> player.team = (player.team == Team.blue ? Team.red : Team.blue));
|
||||||
|
row();
|
||||||
new button("blocks", "toggle", () -> showBlockDebug = !showBlockDebug);
|
new button("blocks", "toggle", () -> showBlockDebug = !showBlockDebug);
|
||||||
row();
|
row();
|
||||||
new button("effect", () -> Effects.effect(BlockFx.teleport, player));
|
new button("effect", () -> Effects.effect(BlockFx.teleport, player));
|
||||||
|
|||||||
@@ -1,23 +1,32 @@
|
|||||||
package io.anuke.mindustry.world;
|
package io.anuke.mindustry.world;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.graphics.Color;
|
||||||
|
import com.badlogic.gdx.graphics.Colors;
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||||
import com.badlogic.gdx.math.Vector2;
|
import com.badlogic.gdx.math.Vector2;
|
||||||
import com.badlogic.gdx.utils.Array;
|
import com.badlogic.gdx.utils.Array;
|
||||||
import com.badlogic.gdx.utils.ObjectMap;
|
import com.badlogic.gdx.utils.ObjectMap;
|
||||||
import com.badlogic.gdx.utils.reflect.ClassReflection;
|
import com.badlogic.gdx.utils.reflect.ClassReflection;
|
||||||
import io.anuke.mindustry.content.fx.ExplosionFx;
|
import io.anuke.mindustry.content.fx.ExplosionFx;
|
||||||
|
import io.anuke.mindustry.content.fx.Fx;
|
||||||
import io.anuke.mindustry.core.GameState.State;
|
import io.anuke.mindustry.core.GameState.State;
|
||||||
import io.anuke.mindustry.entities.TileEntity;
|
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.Fireball;
|
||||||
|
import io.anuke.mindustry.entities.effect.Lightning;
|
||||||
|
import io.anuke.mindustry.game.Team;
|
||||||
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.net.Net;
|
import io.anuke.mindustry.net.Net;
|
||||||
import io.anuke.mindustry.net.NetEvents;
|
import io.anuke.mindustry.net.NetEvents;
|
||||||
|
import io.anuke.mindustry.resource.Item;
|
||||||
import io.anuke.mindustry.resource.ItemStack;
|
import io.anuke.mindustry.resource.ItemStack;
|
||||||
import io.anuke.mindustry.resource.Liquid;
|
import io.anuke.mindustry.resource.Liquid;
|
||||||
import io.anuke.ucore.core.Effects;
|
import io.anuke.ucore.core.Effects;
|
||||||
import io.anuke.ucore.core.Effects.Effect;
|
import io.anuke.ucore.core.Timers;
|
||||||
import io.anuke.ucore.graphics.Draw;
|
import io.anuke.ucore.graphics.Draw;
|
||||||
|
import io.anuke.ucore.graphics.Hue;
|
||||||
import io.anuke.ucore.graphics.Lines;
|
import io.anuke.ucore.graphics.Lines;
|
||||||
import io.anuke.ucore.scene.ui.layout.Table;
|
import io.anuke.ucore.scene.ui.layout.Table;
|
||||||
import io.anuke.ucore.util.Bundles;
|
import io.anuke.ucore.util.Bundles;
|
||||||
@@ -32,7 +41,8 @@ public class Block extends BaseBlock {
|
|||||||
private static ObjectMap<String, Block> map = new ObjectMap<>();
|
private static ObjectMap<String, Block> map = new ObjectMap<>();
|
||||||
|
|
||||||
protected Array<Tile> tempTiles = new Array<>();
|
protected Array<Tile> tempTiles = new Array<>();
|
||||||
protected Vector2 offset = new Vector2();
|
protected Vector2 tempVector = new Vector2();
|
||||||
|
protected Color tempColor = new Color();
|
||||||
|
|
||||||
/**internal name*/
|
/**internal name*/
|
||||||
public final String name;
|
public final String name;
|
||||||
@@ -40,10 +50,6 @@ public class Block extends BaseBlock {
|
|||||||
public final int id;
|
public final int id;
|
||||||
/**display name*/
|
/**display name*/
|
||||||
public final String formalName;
|
public final String formalName;
|
||||||
/**played on destroy*/
|
|
||||||
public Effect explosionEffect = ExplosionFx.explosion; //TODO better explosion effect
|
|
||||||
/**played on destroy*/
|
|
||||||
public String explosionSound = "break";
|
|
||||||
/**whether this block has a tile entity that updates*/
|
/**whether this block has a tile entity that updates*/
|
||||||
public boolean update;
|
public boolean update;
|
||||||
/**whether this block has health and can be destroyed*/
|
/**whether this block has health and can be destroyed*/
|
||||||
@@ -66,6 +72,8 @@ public class Block extends BaseBlock {
|
|||||||
public float breaktime = 18;
|
public float breaktime = 18;
|
||||||
/**tile entity health*/
|
/**tile entity health*/
|
||||||
public int health = 40;
|
public int health = 40;
|
||||||
|
/**base block explosiveness*/
|
||||||
|
public float baseExplosiveness = 0f;
|
||||||
/**the shadow drawn under the block*/
|
/**the shadow drawn under the block*/
|
||||||
public String shadow = "shadow";
|
public String shadow = "shadow";
|
||||||
/**whether to display a different shadow per variant*/
|
/**whether to display a different shadow per variant*/
|
||||||
@@ -89,7 +97,7 @@ public class Block extends BaseBlock {
|
|||||||
/**Draw layer. Only used for 'cached' rendering.*/
|
/**Draw layer. Only used for 'cached' rendering.*/
|
||||||
public DrawLayer drawLayer = DrawLayer.normal;
|
public DrawLayer drawLayer = DrawLayer.normal;
|
||||||
/**Layer to draw extra stuff on.*/
|
/**Layer to draw extra stuff on.*/
|
||||||
public io.anuke.mindustry.graphics.Layer layer = null;
|
public Layer layer = null;
|
||||||
/**Extra layer to draw extra extra stuff on.*/
|
/**Extra layer to draw extra extra stuff on.*/
|
||||||
public Layer layer2 = null;
|
public Layer layer2 = null;
|
||||||
/**whether this block can be replaced in all cases*/
|
/**whether this block can be replaced in all cases*/
|
||||||
@@ -189,7 +197,7 @@ public class Block extends BaseBlock {
|
|||||||
return (other != this || rotate) && this.group != BlockGroup.none && other.group == this.group;
|
return (other != this || rotate) && this.group != BlockGroup.none && other.group == this.group;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int handleDamage(Tile tile, int amount){
|
public float handleDamage(Tile tile, float amount){
|
||||||
return amount;
|
return amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,10 +209,69 @@ public class Block extends BaseBlock {
|
|||||||
|
|
||||||
public void onDestroyed(Tile tile){
|
public void onDestroyed(Tile tile){
|
||||||
float x = tile.worldx(), y = tile.worldy();
|
float x = tile.worldx(), y = tile.worldy();
|
||||||
|
float explosiveness = baseExplosiveness;
|
||||||
Effects.shake(4f, 4f, x, y);
|
float flammability = 0f;
|
||||||
Effects.effect(explosionEffect, x, y);
|
float heat = 0f;
|
||||||
Effects.sound(explosionSound, x, y);
|
float power = 0f;
|
||||||
|
int units = 1;
|
||||||
|
tempColor.set(Color.WHITE);
|
||||||
|
|
||||||
|
if(hasInventory){
|
||||||
|
for(Item item : Item.getAllItems()){
|
||||||
|
int amount = tile.entity.inventory.getItem(item);
|
||||||
|
explosiveness += item.explosiveness*amount;
|
||||||
|
flammability += item.flammability*amount;
|
||||||
|
|
||||||
|
if(item.flammability*amount > 0.5){
|
||||||
|
units ++;
|
||||||
|
Hue.addu(tempColor, item.flameColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(hasLiquids){
|
||||||
|
float amount = tile.entity.liquid.amount;
|
||||||
|
explosiveness += tile.entity.liquid.liquid.explosiveness*amount/2f;
|
||||||
|
flammability += tile.entity.liquid.liquid.flammability*amount/2f;
|
||||||
|
heat += Mathf.clamp(tile.entity.liquid.liquid.temperature-0.5f)*amount/2f;
|
||||||
|
|
||||||
|
if(tile.entity.liquid.liquid.flammability*amount > 2f){
|
||||||
|
units ++;
|
||||||
|
Hue.addu(tempColor, tile.entity.liquid.liquid.flameColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(hasPower){
|
||||||
|
power += tile.entity.power.amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
tempColor.mul(1f/units);
|
||||||
|
|
||||||
|
for(int i = 0; i < Mathf.clamp(power / 20, 0, 6); i ++){
|
||||||
|
int branches = 5 + Mathf.clamp((int)(power/30), 1, 20);
|
||||||
|
Timers.run(i*2f + Mathf.random(4f), () -> {
|
||||||
|
Lightning l = new Lightning(Team.none, Fx.none, 3, x, y, Mathf.random(360f), branches + Mathf.range(2));
|
||||||
|
l.color = Colors.get("power");
|
||||||
|
l.add();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < Mathf.clamp(flammability / 20, 0, 20); i ++){
|
||||||
|
Timers.run(i, () -> {
|
||||||
|
Fireball f = new Fireball(x, y, Mathf.choose(tempColor, Color.LIGHT_GRAY), Mathf.random(360f));
|
||||||
|
f.add();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if(explosiveness > 15f){
|
||||||
|
Effects.effect(ExplosionFx.shockwave, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
float shake = Math.min(explosiveness/4f + 3f, 9f);
|
||||||
|
Effects.shake(shake, shake, x, y);
|
||||||
|
Effects.effect(ExplosionFx.blockExplosion, x, y);
|
||||||
|
|
||||||
|
DamageArea.damage(x, y, Mathf.clamp(size * tilesize + explosiveness, 0, 60f), 5 + explosiveness);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextureRegion[] getIcon(){
|
public TextureRegion[] getIcon(){
|
||||||
@@ -269,7 +336,7 @@ public class Block extends BaseBlock {
|
|||||||
|
|
||||||
/**Offset for placing and drawing multiblocks.*/
|
/**Offset for placing and drawing multiblocks.*/
|
||||||
public Vector2 getPlaceOffset(){
|
public Vector2 getPlaceOffset(){
|
||||||
return offset.set(((size + 1) % 2) * tilesize/2, ((size + 1) % 2) * tilesize/2);
|
return tempVector.set(((size + 1) % 2) * tilesize/2, ((size + 1) % 2) * tilesize/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isMultiblock(){
|
public boolean isMultiblock(){
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public class ShieldedWallBlock extends PowerBlock{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int handleDamage(Tile tile, int amount){
|
public float handleDamage(Tile tile, float amount){
|
||||||
float drain = amount * powerPerDamage;
|
float drain = amount * powerPerDamage;
|
||||||
ShieldedWallEntity entity = tile.entity();
|
ShieldedWallEntity entity = tile.entity();
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ public class NuclearReactor extends LiquidBurnerGenerator {
|
|||||||
generateItem = Items.thorium;
|
generateItem = Items.thorium;
|
||||||
itemCapacity = 30;
|
itemCapacity = 30;
|
||||||
liquidCapacity = 50;
|
liquidCapacity = 50;
|
||||||
explosionEffect = ExplosionFx.nuclearShockwave;
|
|
||||||
powerCapacity = 80f;
|
powerCapacity = 80f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +129,7 @@ public class NuclearReactor extends LiquidBurnerGenerator {
|
|||||||
if(fuel < 5 && entity.heat < 0.5f) return;
|
if(fuel < 5 && entity.heat < 0.5f) return;
|
||||||
|
|
||||||
Effects.shake(6f, 16f, tile.worldx(), tile.worldy());
|
Effects.shake(6f, 16f, tile.worldx(), tile.worldy());
|
||||||
Effects.effect(explosionEffect, tile.worldx(), tile.worldy());
|
Effects.effect(ExplosionFx.nuclearShockwave, tile.worldx(), tile.worldy());
|
||||||
for(int i = 0; i < 6; i ++){
|
for(int i = 0; i < 6; i ++){
|
||||||
Timers.run(Mathf.random(40), () -> {
|
Timers.run(Mathf.random(40), () -> {
|
||||||
Effects.effect(BlockFx.nuclearcloud, tile.worldx(), tile.worldy());
|
Effects.effect(BlockFx.nuclearcloud, tile.worldx(), tile.worldy());
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
package io.anuke.mindustry.world.blocks.types.power;
|
package io.anuke.mindustry.world.blocks.types.power;
|
||||||
|
|
||||||
import com.badlogic.gdx.math.GridPoint2;
|
import com.badlogic.gdx.math.GridPoint2;
|
||||||
import io.anuke.mindustry.content.fx.BlockFx;
|
|
||||||
import io.anuke.mindustry.entities.TileEntity;
|
import io.anuke.mindustry.entities.TileEntity;
|
||||||
import io.anuke.mindustry.world.Edges;
|
import io.anuke.mindustry.world.Edges;
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.Tile;
|
||||||
import io.anuke.mindustry.world.blocks.types.PowerBlock;
|
import io.anuke.mindustry.world.blocks.types.PowerBlock;
|
||||||
import io.anuke.ucore.core.Effects;
|
|
||||||
import io.anuke.ucore.core.Timers;
|
import io.anuke.ucore.core.Timers;
|
||||||
|
|
||||||
public class PowerGenerator extends PowerBlock {
|
public class PowerGenerator extends PowerBlock {
|
||||||
|
|
||||||
public PowerGenerator(String name) {
|
public PowerGenerator(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
|
baseExplosiveness = 5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void distributePower(Tile tile){
|
protected void distributePower(Tile tile){
|
||||||
@@ -56,14 +55,6 @@ public class PowerGenerator extends PowerBlock {
|
|||||||
distributePower(tile);
|
distributePower(tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroyed(Tile tile){
|
|
||||||
float x = tile.worldx(), y = tile.worldy();
|
|
||||||
|
|
||||||
Effects.effect(BlockFx.blastsmoke, x, y);
|
|
||||||
//TODO better effect
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TileEntity getEntity() {
|
public TileEntity getEntity() {
|
||||||
return new GeneratorEntity();
|
return new GeneratorEntity();
|
||||||
|
|||||||
Reference in New Issue
Block a user