Save fixes / Implemented overdrive projector
This commit is contained in:
@@ -121,10 +121,10 @@ public class StatusEffects implements ContentList{
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
overdrive = new StatusEffect(6f){
|
overdrive = new StatusEffect(60f*15){
|
||||||
{
|
{
|
||||||
armorMultiplier = 0.95f;
|
armorMultiplier = 0.95f;
|
||||||
speedMultiplier = 1.05f;
|
speedMultiplier = 1.15f;
|
||||||
damageMultiplier = 1.4f;
|
damageMultiplier = 1.4f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,6 +132,10 @@ public class StatusEffects implements ContentList{
|
|||||||
public void update(Unit unit, float time){
|
public void update(Unit unit, float time){
|
||||||
//idle regen boosted
|
//idle regen boosted
|
||||||
unit.health += 0.01f * Timers.delta();
|
unit.health += 0.01f * Timers.delta();
|
||||||
|
|
||||||
|
if(Mathf.chance(Timers.delta() * 0.25f)){
|
||||||
|
Effects.effect(EnvironmentFx.overdriven, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f), 0f, unit);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import io.anuke.mindustry.world.blocks.defense.*;
|
|||||||
|
|
||||||
public class DefenseBlocks extends BlockList implements ContentList{
|
public class DefenseBlocks extends BlockList implements ContentList{
|
||||||
public static Block copperWall, copperWallLarge, compositeWall, compositeWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge,
|
public static Block copperWall, copperWallLarge, compositeWall, compositeWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge,
|
||||||
phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, mendProjector, overdriveProjector, shockMine;
|
phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, mendProjector, overdriveProjector, forceProjector, shockMine;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
@@ -82,6 +82,12 @@ public class DefenseBlocks extends BlockList implements ContentList{
|
|||||||
consumes.item(Items.phasematter).optional(true);
|
consumes.item(Items.phasematter).optional(true);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
forceProjector = new ForceProjector("force-projector"){{
|
||||||
|
consumes.power(0.25f);
|
||||||
|
size = 3;
|
||||||
|
consumes.item(Items.phasematter).optional(true);
|
||||||
|
}};
|
||||||
|
|
||||||
shockMine = new ShockMine("shock-mine"){{
|
shockMine = new ShockMine("shock-mine"){{
|
||||||
health = 40;
|
health = 40;
|
||||||
damage = 11;
|
damage = 11;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public class BlockFx extends FxList implements ContentList{
|
|||||||
public static Effect reactorsmoke, nuclearsmoke, nuclearcloud, redgeneratespark, generatespark, fuelburn, plasticburn,
|
public static Effect reactorsmoke, nuclearsmoke, nuclearcloud, redgeneratespark, generatespark, fuelburn, plasticburn,
|
||||||
pulverize, pulverizeRed, pulverizeRedder, pulverizeSmall, pulverizeMedium, producesmoke, smeltsmoke, formsmoke, blastsmoke,
|
pulverize, pulverizeRed, pulverizeRedder, pulverizeSmall, pulverizeMedium, producesmoke, smeltsmoke, formsmoke, blastsmoke,
|
||||||
lava, dooropen, doorclose, dooropenlarge, doorcloselarge, purify, purifyoil, purifystone, generate, mine, mineBig, mineHuge,
|
lava, dooropen, doorclose, dooropenlarge, doorcloselarge, purify, purifyoil, purifystone, generate, mine, mineBig, mineHuge,
|
||||||
smelt, teleportActivate, teleport, teleportOut, ripple, bubble, commandSend, healBlock, healBlockFull;
|
smelt, teleportActivate, teleport, teleportOut, ripple, bubble, commandSend, healBlock, healBlockFull, healWaveMend, overdriveWave;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
@@ -285,6 +285,20 @@ public class BlockFx extends FxList implements ContentList{
|
|||||||
Draw.color();
|
Draw.color();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
healWaveMend = new Effect(40, e -> {
|
||||||
|
Draw.color(e.color);
|
||||||
|
Lines.stroke(e.fout() * 2f);
|
||||||
|
Lines.poly(e.x, e.y, 30, e.finpow() * e.rotation);
|
||||||
|
Draw.color();
|
||||||
|
});
|
||||||
|
|
||||||
|
overdriveWave = new Effect(50, e -> {
|
||||||
|
Draw.color(e.color);
|
||||||
|
Lines.stroke(e.fout() * 1f);
|
||||||
|
Lines.poly(e.x, e.y, 30, e.finpow() * e.rotation);
|
||||||
|
Draw.color();
|
||||||
|
});
|
||||||
|
|
||||||
healBlock = new Effect(20, e -> {
|
healBlock = new Effect(20, e -> {
|
||||||
Draw.color(Palette.heal);
|
Draw.color(Palette.heal);
|
||||||
Lines.stroke(2f * e.fout() + 0.5f);
|
Lines.stroke(2f * e.fout() + 0.5f);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import io.anuke.ucore.util.Angles;
|
|||||||
import io.anuke.ucore.util.Mathf;
|
import io.anuke.ucore.util.Mathf;
|
||||||
|
|
||||||
public class EnvironmentFx extends FxList implements ContentList{
|
public class EnvironmentFx extends FxList implements ContentList{
|
||||||
public static Effect burning, fire, smoke, steam, fireballsmoke, ballfire, freezing, melting, wet, oily;
|
public static Effect burning, fire, smoke, steam, fireballsmoke, ballfire, freezing, melting, wet, oily, overdriven;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
@@ -115,5 +115,15 @@ public class EnvironmentFx extends FxList implements ContentList{
|
|||||||
|
|
||||||
Draw.color();
|
Draw.color();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
overdriven = new Effect(20f, e -> {
|
||||||
|
Draw.color(Palette.accent);
|
||||||
|
|
||||||
|
Angles.randLenVectors(e.id, 2, 1f + e.fin() * 2f, (x, y) -> {
|
||||||
|
Fill.square(e.x + x, e.y + y, e.fout() * 2.3f+0.5f);
|
||||||
|
});
|
||||||
|
|
||||||
|
Draw.color();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import io.anuke.ucore.util.Angles;
|
|||||||
import io.anuke.ucore.util.Mathf;
|
import io.anuke.ucore.util.Mathf;
|
||||||
|
|
||||||
public class UnitFx extends FxList implements ContentList{
|
public class UnitFx extends FxList implements ContentList{
|
||||||
public static Effect vtolHover, unitDrop, unitPickup, unitLand, pickup, healWave, healWaveMend, heal;
|
public static Effect vtolHover, unitDrop, unitPickup, unitLand, pickup, healWave, heal;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
@@ -61,13 +61,6 @@ public class UnitFx extends FxList implements ContentList{
|
|||||||
Draw.color();
|
Draw.color();
|
||||||
});
|
});
|
||||||
|
|
||||||
healWaveMend = new Effect(40, e -> {
|
|
||||||
Draw.color(e.color);
|
|
||||||
Lines.stroke(e.fout() * 2f);
|
|
||||||
Lines.poly(e.x, e.y, 30, e.finpow() * e.rotation);
|
|
||||||
Draw.color();
|
|
||||||
});
|
|
||||||
|
|
||||||
heal = new Effect(11, e -> {
|
heal = new Effect(11, e -> {
|
||||||
Draw.color(Palette.heal);
|
Draw.color(Palette.heal);
|
||||||
Lines.stroke(e.fout() * 2f);
|
Lines.stroke(e.fout() * 2f);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package io.anuke.mindustry.entities;
|
package io.anuke.mindustry.entities;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.graphics.Color;
|
||||||
import com.badlogic.gdx.utils.Array;
|
import com.badlogic.gdx.utils.Array;
|
||||||
import io.anuke.mindustry.content.StatusEffects;
|
import io.anuke.mindustry.content.StatusEffects;
|
||||||
import io.anuke.mindustry.entities.traits.Saveable;
|
import io.anuke.mindustry.entities.traits.Saveable;
|
||||||
@@ -8,10 +9,12 @@ import io.anuke.mindustry.type.StatusEffect;
|
|||||||
import io.anuke.ucore.core.Timers;
|
import io.anuke.ucore.core.Timers;
|
||||||
import io.anuke.ucore.util.Pooling;
|
import io.anuke.ucore.util.Pooling;
|
||||||
import io.anuke.ucore.util.ThreadArray;
|
import io.anuke.ucore.util.ThreadArray;
|
||||||
|
import io.anuke.ucore.util.Tmp;
|
||||||
|
|
||||||
import java.io.DataInput;
|
import java.io.DataInput;
|
||||||
import java.io.DataOutput;
|
import java.io.DataOutput;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.content;
|
import static io.anuke.mindustry.Vars.content;
|
||||||
/**
|
/**
|
||||||
* Class for controlling status effects on an entity.
|
* Class for controlling status effects on an entity.
|
||||||
@@ -59,6 +62,20 @@ public class StatusController implements Saveable{
|
|||||||
statuses.add(entry);
|
statuses.add(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Color getStatusColor(){
|
||||||
|
if(statuses.size == 0){
|
||||||
|
return Tmp.c1.set(Color.WHITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
float r = 0f, g = 0f, b = 0f;
|
||||||
|
for(StatusEntry entry : statuses){
|
||||||
|
r += entry.effect.color.r;
|
||||||
|
g += entry.effect.color.g;
|
||||||
|
b += entry.effect.color.b;
|
||||||
|
}
|
||||||
|
return Tmp.c1.set(r / statuses.size, g / statuses.size, b / statuses.size, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
public void clear(){
|
public void clear(){
|
||||||
statuses.clear();
|
statuses.clear();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,16 +35,16 @@ public abstract class SaveFileVersion{
|
|||||||
|
|
||||||
byte mapped = stream.readByte();
|
byte mapped = stream.readByte();
|
||||||
|
|
||||||
MappableContent[][] map = new MappableContent[mapped][0];
|
MappableContent[][] map = new MappableContent[ContentType.values().length][0];
|
||||||
|
|
||||||
for (int i = 0; i < mapped; i++) {
|
for (int i = 0; i < mapped; i++) {
|
||||||
ContentType type = ContentType.values()[stream.readByte()];
|
ContentType type = ContentType.values()[stream.readByte()];
|
||||||
short total = stream.readShort();
|
short total = stream.readShort();
|
||||||
map[i] = new MappableContent[total];
|
map[type.ordinal()] = new MappableContent[total];
|
||||||
|
|
||||||
for (int j = 0; j < total; j++) {
|
for (int j = 0; j < total; j++) {
|
||||||
String name = stream.readUTF();
|
String name = stream.readUTF();
|
||||||
map[i][j] = content.getByName(type, name);
|
map[type.ordinal()][j] = content.getByName(type, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package io.anuke.mindustry.type;
|
package io.anuke.mindustry.type;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.graphics.Color;
|
||||||
import com.badlogic.gdx.utils.ObjectSet;
|
import com.badlogic.gdx.utils.ObjectSet;
|
||||||
import io.anuke.mindustry.entities.StatusController.StatusEntry;
|
import io.anuke.mindustry.entities.StatusController.StatusEntry;
|
||||||
import io.anuke.mindustry.entities.Unit;
|
import io.anuke.mindustry.entities.Unit;
|
||||||
@@ -12,6 +13,7 @@ public class StatusEffect extends Content{
|
|||||||
public float damageMultiplier = 1f; //damage dealt
|
public float damageMultiplier = 1f; //damage dealt
|
||||||
public float armorMultiplier = 1f; //armor points
|
public float armorMultiplier = 1f; //armor points
|
||||||
public float speedMultiplier = 1f; //speed
|
public float speedMultiplier = 1f; //speed
|
||||||
|
public Color color = Color.WHITE.cpy(); //tint color
|
||||||
|
|
||||||
/**Set of 'opposite' effects, which will decrease the duration of this effect when applied.*/
|
/**Set of 'opposite' effects, which will decrease the duration of this effect when applied.*/
|
||||||
protected ObjectSet<StatusEffect> opposites = new ObjectSet<>();
|
protected ObjectSet<StatusEffect> opposites = new ObjectSet<>();
|
||||||
@@ -44,9 +46,7 @@ public class StatusEffect extends Content{
|
|||||||
return result.set(to, newTime);
|
return result.set(to, newTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**Called when this effect transitions to a new status effect.*/
|
||||||
* Called when this effect transitions to a new status effect.
|
|
||||||
*/
|
|
||||||
public void onTransition(Unit unit, StatusEffect to){
|
public void onTransition(Unit unit, StatusEffect to){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
|||||||
import com.badlogic.gdx.math.Vector2;
|
import com.badlogic.gdx.math.Vector2;
|
||||||
import com.badlogic.gdx.utils.IntSet;
|
import com.badlogic.gdx.utils.IntSet;
|
||||||
import io.anuke.mindustry.content.fx.BlockFx;
|
import io.anuke.mindustry.content.fx.BlockFx;
|
||||||
import io.anuke.mindustry.content.fx.UnitFx;
|
|
||||||
import io.anuke.mindustry.entities.TileEntity;
|
import io.anuke.mindustry.entities.TileEntity;
|
||||||
import io.anuke.mindustry.world.Block;
|
import io.anuke.mindustry.world.Block;
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.Tile;
|
||||||
@@ -64,7 +63,7 @@ public class MendProjector extends Block{
|
|||||||
if(entity.charge >= reload){
|
if(entity.charge >= reload){
|
||||||
float realRange = range + entity.phaseHeat * 20f;
|
float realRange = range + entity.phaseHeat * 20f;
|
||||||
|
|
||||||
Effects.effect(UnitFx.healWaveMend, Hue.mix(color, phase, entity.phaseHeat), tile.drawx(), tile.drawy(), realRange);
|
Effects.effect(BlockFx.healWaveMend, Hue.mix(color, phase, entity.phaseHeat), tile.drawx(), tile.drawy(), realRange);
|
||||||
entity.charge = 0f;
|
entity.charge = 0f;
|
||||||
|
|
||||||
Timers.run(10f, () -> {
|
Timers.run(10f, () -> {
|
||||||
|
|||||||
@@ -3,16 +3,13 @@ package io.anuke.mindustry.world.blocks.defense;
|
|||||||
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 io.anuke.mindustry.content.StatusEffects;
|
import io.anuke.mindustry.content.StatusEffects;
|
||||||
import io.anuke.mindustry.content.fx.BlockFx;
|
|
||||||
import io.anuke.mindustry.entities.TileEntity;
|
import io.anuke.mindustry.entities.TileEntity;
|
||||||
import io.anuke.mindustry.entities.Units;
|
import io.anuke.mindustry.entities.Units;
|
||||||
import io.anuke.mindustry.world.Block;
|
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.Graphics;
|
import io.anuke.ucore.core.Graphics;
|
||||||
import io.anuke.ucore.core.Timers;
|
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.util.Mathf;
|
import io.anuke.ucore.util.Mathf;
|
||||||
|
|
||||||
@@ -21,12 +18,12 @@ public class OverdriveProjector extends Block{
|
|||||||
private static Color phase = Color.valueOf("ffd59e");
|
private static Color phase = Color.valueOf("ffd59e");
|
||||||
|
|
||||||
protected int timerUse = timers ++;
|
protected int timerUse = timers ++;
|
||||||
|
protected int timerApply = timers ++;
|
||||||
|
|
||||||
protected TextureRegion topRegion;
|
protected TextureRegion topRegion;
|
||||||
protected float reload = 250f;
|
protected float reload = 60f;
|
||||||
protected float range = 50f;
|
protected float range = 100f;
|
||||||
protected float healPercent = 6f;
|
protected float phaseBoost = 30f;
|
||||||
protected float phaseBoost = 10f;
|
|
||||||
protected float useTime = 300f;
|
protected float useTime = 300f;
|
||||||
|
|
||||||
public OverdriveProjector(String name){
|
public OverdriveProjector(String name){
|
||||||
@@ -47,28 +44,28 @@ public class OverdriveProjector extends Block{
|
|||||||
@Override
|
@Override
|
||||||
public void update(Tile tile){
|
public void update(Tile tile){
|
||||||
OverdriveEntity entity = tile.entity();
|
OverdriveEntity entity = tile.entity();
|
||||||
entity.heat = Mathf.lerpDelta(entity.heat, entity.cons.valid() ? 1f : 0f, 0.08f);
|
|
||||||
entity.charge += entity.heat * Timers.delta();
|
|
||||||
|
|
||||||
|
entity.heat = Mathf.lerpDelta(entity.heat, entity.cons.valid() ? 1f : 0f, 0.08f);
|
||||||
entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, (float)entity.items.get(consumes.item()) / itemCapacity, 0.1f);
|
entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, (float)entity.items.get(consumes.item()) / itemCapacity, 0.1f);
|
||||||
|
|
||||||
if(entity.timer.get(timerUse, useTime) && entity.items.total() > 0){
|
if(entity.timer.get(timerUse, useTime) && entity.items.total() > 0){
|
||||||
entity.items.remove(consumes.item(), 1);
|
entity.items.remove(consumes.item(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(entity.charge >= reload){
|
if(entity.heat > 0.5f && entity.timer.get(timerApply, 10)){
|
||||||
float realRange = range + entity.phaseHeat * 20f;
|
float realRange = range + entity.phaseHeat * phaseBoost;
|
||||||
|
|
||||||
Effects.effect(BlockFx.commandSend, Hue.mix(color, phase, entity.phaseHeat), tile.drawx(), tile.drawy(), realRange);
|
Units.getNearby(tile.getTeam(), tile.drawx(), tile.drawy(), realRange, unit -> unit.applyEffect(StatusEffects.overdrive, 1f + entity.phaseHeat));
|
||||||
Units.getNearby(tile.getTeam(), tile.drawx(), tile.drawy(), realRange, unit -> unit.applyEffect(StatusEffects.overdrive, 1f));
|
|
||||||
entity.charge = 0f;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawSelect(Tile tile){
|
public void drawSelect(Tile tile){
|
||||||
|
OverdriveEntity entity = tile.entity();
|
||||||
|
float realRange = range + entity.phaseHeat * phaseBoost;
|
||||||
|
|
||||||
Draw.color(color);
|
Draw.color(color);
|
||||||
Lines.dashCircle(tile.drawx(), tile.drawy() - 1f, range);
|
Lines.poly(tile.drawx(), tile.drawy(), 300, realRange);
|
||||||
Draw.color();
|
Draw.color();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,7 +96,6 @@ public class OverdriveProjector extends Block{
|
|||||||
|
|
||||||
class OverdriveEntity extends TileEntity{
|
class OverdriveEntity extends TileEntity{
|
||||||
float heat;
|
float heat;
|
||||||
float charge;
|
|
||||||
float phaseHeat;
|
float phaseHeat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user