Fires, puddles, feature reimplementations

This commit is contained in:
Anuken
2020-02-09 23:43:08 -05:00
parent 3feca9bbf8
commit e9b066b866
23 changed files with 375 additions and 159 deletions

View File

@@ -1,25 +1,22 @@
package mindustry.entities.def;
import arc.*;
import arc.math.*;
import arc.math.geom.*;
import arc.struct.*;
import arc.util.*;
import mindustry.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.game.EventType.*;
import mindustry.game.*;
import mindustry.gen.*;
import mindustry.world.*;
import static mindustry.Vars.*;
@EntityDef(value = {Firec.class}, pooled = true)
@Component
abstract class FireComp implements Timedc, Posc, Firec{
private static final IntMap<Firec> map = new IntMap<>();
private static final float baseLifetime = 1000f, spreadChance = 0.05f, fireballChance = 0.07f;
private static final float spreadChance = 0.05f, fireballChance = 0.07f;
transient float time, lifetime, x, y;
@@ -27,46 +24,6 @@ abstract class FireComp implements Timedc, Posc, Firec{
private Block block;
private float baseFlammability = -1, puddleFlammability;
/** Start a fire on the tile. If there already is a file there, refreshes its lifetime. */
public static void create(Tile tile){
if(net.client() || tile == null) return; //not clientside.
Firec fire = map.get(tile.pos());
if(fire == null){
fire = FireEntity.create();
fire.tile(tile);
fire.lifetime(baseLifetime);
fire.set(tile.worldx(), tile.worldy());
fire.add();
map.put(tile.pos(), fire);
}else{
fire.lifetime(baseLifetime);
fire.time(0f);
}
}
public static boolean has(int x, int y){
if(!Structs.inBounds(x, y, world.width(), world.height()) || !map.containsKey(Pos.get(x, y))){
return false;
}
Firec fire = map.get(Pos.get(x, y));
return fire.isAdded() && fire.fin() < 1f && fire.tile() != null && fire.tile().x == x && fire.tile().y == y;
}
/**
* Attempts to extinguish a fire by shortening its life. If there is no fire here, does nothing.
*/
public static void extinguish(Tile tile, float intensity){
if(tile != null && map.containsKey(tile.pos())){
Firec fire = map.get(tile.pos());
fire.time(fire.time() + intensity * Time.delta());
if(fire.time() >= fire.lifetime()){
Events.fire(Trigger.fireExtinguish);
}
}
}
@Override
public void update(){
if(Mathf.chance(0.1 * Time.delta())){
@@ -82,7 +39,6 @@ abstract class FireComp implements Timedc, Posc, Firec{
}
time = Mathf.clamp(time + Time.delta(), 0, lifetime());
map.put(tile.pos(), this);
if(Vars.net.client()){
return;
@@ -114,7 +70,7 @@ abstract class FireComp implements Timedc, Posc, Firec{
if(flammability > 1f && Mathf.chance(spreadChance * Time.delta() * Mathf.clamp(flammability / 5f, 0.3f, 2f))){
Point2 p = Geometry.d4[Mathf.random(3)];
Tile other = world.tile(tile.x + p.x, tile.y + p.y);
create(other);
Fires.create(other);
if(Mathf.chance(fireballChance * Time.delta() * Mathf.clamp(flammability / 10f))){
Bullets.fireball.createNet(Team.derelict, x, y, Mathf.random(360f), -1f, 1, 1);
@@ -122,13 +78,8 @@ abstract class FireComp implements Timedc, Posc, Firec{
}
if(Mathf.chance(0.1 * Time.delta())){
//TODO implement
//Puddle p = Puddle.getPuddle(tile);
//if(p != null){
// puddleFlammability = p.getFlammability() / 3f;
//}else{
puddleFlammability = 0;
//}
Puddlec p = Puddles.get(tile);
puddleFlammability = p != null ? p.getFlammability() / 3f : 0;
if(damage){
entity.damage(0.4f);
@@ -141,7 +92,7 @@ abstract class FireComp implements Timedc, Posc, Firec{
@Override
public void remove(){
map.remove(tile.pos());
Fires.remove(tile);
}
}