Added new unit type / Made reactor use cryo only / Balancing
BIN
core/assets-raw/sprites/units/eruptor-base.png
Normal file
|
After Width: | Height: | Size: 1014 B |
BIN
core/assets-raw/sprites/units/eruptor-leg.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
core/assets-raw/sprites/units/eruptor.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
core/assets-raw/sprites/weapons/eruption-equip.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 206 B After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
@@ -857,6 +857,7 @@ public class Blocks implements ContentList{
|
|||||||
size = 3;
|
size = 3;
|
||||||
health = 700;
|
health = 700;
|
||||||
powerProduction = 11f;
|
powerProduction = 11f;
|
||||||
|
consumes.liquid(Liquids.cryofluid, maxLiquidUse);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
fusionReactor = new FusionReactor("fusion-reactor"){{
|
fusionReactor = new FusionReactor("fusion-reactor"){{
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ public class Bullets implements ContentList{
|
|||||||
waterShot, cryoShot, slagShot, oilShot,
|
waterShot, cryoShot, slagShot, oilShot,
|
||||||
|
|
||||||
//environment, misc.
|
//environment, misc.
|
||||||
fireball, basicFlame, fuseShot, driverBolt, healBullet, frag,
|
fireball, basicFlame, fuseShot, driverBolt, healBullet, frag, eruptorShot,
|
||||||
|
|
||||||
//bombs
|
//bombs
|
||||||
bombExplosive, bombIncendiary, bombOil, explode;
|
bombExplosive, bombIncendiary, bombOil, explode;
|
||||||
@@ -559,6 +559,12 @@ public class Bullets implements ContentList{
|
|||||||
drag = 0.03f;
|
drag = 0.03f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
eruptorShot = new LiquidBulletType(Liquids.slag){{
|
||||||
|
damage = 2;
|
||||||
|
speed = 2.1f;
|
||||||
|
drag = 0.02f;
|
||||||
|
}};
|
||||||
|
|
||||||
oilShot = new LiquidBulletType(Liquids.oil){{
|
oilShot = new LiquidBulletType(Liquids.oil){{
|
||||||
speed = 2f;
|
speed = 2f;
|
||||||
drag = 0.03f;
|
drag = 0.03f;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public class Liquids implements ContentList{
|
|||||||
effect = StatusEffects.wet;
|
effect = StatusEffects.wet;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
slag = new Liquid("slag", Color.valueOf("ffcd66")){{
|
slag = new Liquid("slag", Color.valueOf("ffa166")){{
|
||||||
temperature = 1f;
|
temperature = 1f;
|
||||||
viscosity = 0.8f;
|
viscosity = 0.8f;
|
||||||
tier = 2;
|
tier = 2;
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ public class UnitTypes implements ContentList{
|
|||||||
rotatespeed = 0.1f;
|
rotatespeed = 0.1f;
|
||||||
weapon = Weapons.flamethrower;
|
weapon = Weapons.flamethrower;
|
||||||
health = 440;
|
health = 440;
|
||||||
|
immunities.add(StatusEffects.burning);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
fortress = new UnitType("fortress", Fortress.class, Fortress::new){{
|
fortress = new UnitType("fortress", Fortress.class, Fortress::new){{
|
||||||
@@ -69,15 +70,16 @@ public class UnitTypes implements ContentList{
|
|||||||
|
|
||||||
eruptor = new UnitType("eruptor", Eruptor.class, Eruptor::new){{
|
eruptor = new UnitType("eruptor", Eruptor.class, Eruptor::new){{
|
||||||
maxVelocity = 0.81f;
|
maxVelocity = 0.81f;
|
||||||
speed = 0.17f;
|
speed = 0.16f;
|
||||||
drag = 0.4f;
|
drag = 0.4f;
|
||||||
mass = 5f;
|
mass = 5f;
|
||||||
hitsize = 9f;
|
hitsize = 9f;
|
||||||
rotatespeed = 0.07f;
|
rotatespeed = 0.05f;
|
||||||
weaponOffsetX = 1;
|
weaponOffsetX = 3;
|
||||||
targetAir = false;
|
targetAir = false;
|
||||||
weapon = Weapons.eruption;
|
weapon = Weapons.eruption;
|
||||||
health = 600;
|
health = 600;
|
||||||
|
immunities = ObjectSet.with(StatusEffects.burning, StatusEffects.melting);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
wraith = new UnitType("wraith", Wraith.class, Wraith::new){{
|
wraith = new UnitType("wraith", Wraith.class, Wraith::new){{
|
||||||
|
|||||||
@@ -11,11 +11,13 @@ public class Weapons implements ContentList{
|
|||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
eruption = new Weapon("eruption"){{
|
eruption = new Weapon("eruption"){{
|
||||||
length = 1.5f;
|
length = 3f;
|
||||||
reload = 14f;
|
reload = 10f;
|
||||||
roundrobin = true;
|
roundrobin = true;
|
||||||
ejectEffect = Fx.none;
|
ejectEffect = Fx.none;
|
||||||
ammo = Bullets.slagShot;
|
ammo = Bullets.eruptorShot;
|
||||||
|
recoil = 1f;
|
||||||
|
width = 9f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
blaster = new Weapon("blaster"){{
|
blaster = new Weapon("blaster"){{
|
||||||
|
|||||||
@@ -316,8 +316,8 @@ public class Zones implements ContentList{
|
|||||||
impact = new Zone("impact0079", new MapGenerator("impact0079", 2)
|
impact = new Zone("impact0079", new MapGenerator("impact0079", 2)
|
||||||
.decor(
|
.decor(
|
||||||
new Decoration(Blocks.snow, Blocks.sporeCluster, 0.01),
|
new Decoration(Blocks.snow, Blocks.sporeCluster, 0.01),
|
||||||
new Decoration(Blocks.metalFloor, Blocks.metalFloorDamaged, 0.02))
|
new Decoration(Blocks.metalFloor, Blocks.metalFloorDamaged, 0.02)
|
||||||
){{
|
).drops(ItemStack.with(Items.copper, 2000, Items.lead, 1500, Items.silicon, 1000, Items.graphite, 1000, Items.pyratite, 2000, Items.titanium, 2000, Items.metaglass, 1000))){{
|
||||||
deployCost = ItemStack.with(Items.copper, 2500, Items.lead, 1000, Items.silicon, 300);
|
deployCost = ItemStack.with(Items.copper, 2500, Items.lead, 1000, Items.silicon, 300);
|
||||||
startingItems = ItemStack.with(Items.copper, 2000, Items.lead, 500, Items.silicon, 200);
|
startingItems = ItemStack.with(Items.copper, 2000, Items.lead, 500, Items.silicon, 200);
|
||||||
itemRequirements = ItemStack.with(Items.silicon, 8000, Items.titanium, 6000, Items.graphite, 4000);
|
itemRequirements = ItemStack.with(Items.silicon, 8000, Items.titanium, 6000, Items.graphite, 4000);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ public class StatusController implements Saveable{
|
|||||||
private float armorMultiplier;
|
private float armorMultiplier;
|
||||||
|
|
||||||
public void handleApply(Unit unit, StatusEffect effect, float duration){
|
public void handleApply(Unit unit, StatusEffect effect, float duration){
|
||||||
if(effect == StatusEffects.none) return; //don't apply empty effects
|
if(effect == StatusEffects.none || unit.isImmune(effect)) return; //don't apply empty or immune effects
|
||||||
|
|
||||||
if(statuses.size > 0){
|
if(statuses.size > 0){
|
||||||
//check for opposite effects
|
//check for opposite effects
|
||||||
|
|||||||
@@ -184,6 +184,10 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
|||||||
damage(1);
|
damage(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isImmune(StatusEffect effect){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isOutOfBounds(){
|
public boolean isOutOfBounds(){
|
||||||
return x < -worldBounds || y < -worldBounds || x > world.width() * tilesize + worldBounds || y > world.height() * tilesize + worldBounds;
|
return x < -worldBounds || y < -worldBounds || x > world.width() * tilesize + worldBounds || y > world.height() * tilesize + worldBounds;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public abstract class BulletType extends Content{
|
|||||||
|
|
||||||
/**Returns maximum distance the bullet this bullet type has can travel.*/
|
/**Returns maximum distance the bullet this bullet type has can travel.*/
|
||||||
public float range(){
|
public float range(){
|
||||||
return speed * lifetime;
|
return speed * lifetime * (1f - drag);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean collides(Bullet bullet, Tile tile){
|
public boolean collides(Bullet bullet, Tile tile){
|
||||||
|
|||||||
@@ -33,6 +33,11 @@ public class LiquidBulletType extends BulletType{
|
|||||||
knockback = 0.5f;
|
knockback = 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float range(){
|
||||||
|
return speed * lifetime /2f;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Bullet b) {
|
public void update(Bullet b) {
|
||||||
super.update(b);
|
super.update(b);
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
|
|||||||
entity.damage(0.4f);
|
entity.damage(0.4f);
|
||||||
}
|
}
|
||||||
Damage.damageUnits(null, tile.worldx(), tile.worldy(), tilesize, 3f,
|
Damage.damageUnits(null, tile.worldx(), tile.worldy(), tilesize, 3f,
|
||||||
unit -> !unit.isFlying(),
|
unit -> !unit.isFlying() && !unit.isImmune(StatusEffects.burning),
|
||||||
unit -> unit.applyEffect(StatusEffects.burning, 60 * 5));
|
unit -> unit.applyEffect(StatusEffects.burning, 60 * 5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if(liquid.temperature > 0.7f && tile.entity != null && Mathf.chance(0.3 * Time.delta())){
|
if(liquid.temperature > 0.7f && (tile.target().entity != null) && Mathf.chance(0.3 * Time.delta())){
|
||||||
Fire.create(tile);
|
Fire.create(tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import io.anuke.mindustry.graphics.Palette;
|
|||||||
import io.anuke.mindustry.net.Net;
|
import io.anuke.mindustry.net.Net;
|
||||||
import io.anuke.mindustry.type.ContentType;
|
import io.anuke.mindustry.type.ContentType;
|
||||||
import io.anuke.mindustry.type.ItemStack;
|
import io.anuke.mindustry.type.ItemStack;
|
||||||
|
import io.anuke.mindustry.type.StatusEffect;
|
||||||
import io.anuke.mindustry.type.Weapon;
|
import io.anuke.mindustry.type.Weapon;
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.Tile;
|
||||||
import io.anuke.mindustry.world.meta.BlockFlag;
|
import io.anuke.mindustry.world.meta.BlockFlag;
|
||||||
@@ -205,6 +206,11 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isImmune(StatusEffect effect){
|
||||||
|
return type.immunities.contains(effect);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isValid(){
|
public boolean isValid(){
|
||||||
return super.isValid() && isAdded();
|
return super.isValid() && isAdded();
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package io.anuke.mindustry.entities.units;
|
|||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.Core;
|
||||||
import io.anuke.arc.collection.ObjectSet;
|
import io.anuke.arc.collection.ObjectSet;
|
||||||
import io.anuke.arc.function.Supplier;
|
import io.anuke.arc.function.Supplier;
|
||||||
import io.anuke.arc.graphics.Color;
|
|
||||||
import io.anuke.arc.graphics.g2d.TextureRegion;
|
import io.anuke.arc.graphics.g2d.TextureRegion;
|
||||||
import io.anuke.arc.scene.ui.layout.Table;
|
import io.anuke.arc.scene.ui.layout.Table;
|
||||||
import io.anuke.arc.util.Log;
|
import io.anuke.arc.util.Log;
|
||||||
@@ -15,6 +14,7 @@ import io.anuke.mindustry.game.Team;
|
|||||||
import io.anuke.mindustry.game.UnlockableContent;
|
import io.anuke.mindustry.game.UnlockableContent;
|
||||||
import io.anuke.mindustry.type.ContentType;
|
import io.anuke.mindustry.type.ContentType;
|
||||||
import io.anuke.mindustry.type.Item;
|
import io.anuke.mindustry.type.Item;
|
||||||
|
import io.anuke.mindustry.type.StatusEffect;
|
||||||
import io.anuke.mindustry.type.Weapon;
|
import io.anuke.mindustry.type.Weapon;
|
||||||
import io.anuke.mindustry.ui.ContentDisplay;
|
import io.anuke.mindustry.ui.ContentDisplay;
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ public class UnitType extends UnlockableContent{
|
|||||||
public float buildPower = 0.3f, minePower = 0.7f;
|
public float buildPower = 0.3f, minePower = 0.7f;
|
||||||
public Weapon weapon = Weapons.blaster;
|
public Weapon weapon = Weapons.blaster;
|
||||||
public float weaponOffsetX, weaponOffsetY;
|
public float weaponOffsetX, weaponOffsetY;
|
||||||
public Color trailColor = Color.valueOf("ffa665");
|
public ObjectSet<StatusEffect> immunities = new ObjectSet<>();
|
||||||
|
|
||||||
public TextureRegion iconRegion, legRegion, baseRegion, region;
|
public TextureRegion iconRegion, legRegion, baseRegion, region;
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,11 @@ public class MapGenerator extends Generator{
|
|||||||
this.enemySpawns = enemySpawns;
|
this.enemySpawns = enemySpawns;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MapGenerator drops(ItemStack[] drops){
|
||||||
|
this.storageDrops = drops;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public MapGenerator decor(Decoration... decor){
|
public MapGenerator decor(Decoration... decor){
|
||||||
this.decorations.addAll(decor);
|
this.decorations.addAll(decor);
|
||||||
return this;
|
return this;
|
||||||
|
|||||||
@@ -6,17 +6,16 @@ import io.anuke.arc.graphics.Color;
|
|||||||
import io.anuke.arc.graphics.g2d.Draw;
|
import io.anuke.arc.graphics.g2d.Draw;
|
||||||
import io.anuke.arc.graphics.g2d.TextureRegion;
|
import io.anuke.arc.graphics.g2d.TextureRegion;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.Mathf;
|
||||||
import io.anuke.arc.util.Time;
|
|
||||||
import io.anuke.arc.math.geom.Vector2;
|
import io.anuke.arc.math.geom.Vector2;
|
||||||
import io.anuke.mindustry.content.Items;
|
import io.anuke.arc.util.Time;
|
||||||
import io.anuke.mindustry.content.Fx;
|
import io.anuke.mindustry.content.Fx;
|
||||||
|
import io.anuke.mindustry.content.Items;
|
||||||
import io.anuke.mindustry.entities.Damage;
|
import io.anuke.mindustry.entities.Damage;
|
||||||
import io.anuke.mindustry.entities.TileEntity;
|
import io.anuke.mindustry.entities.TileEntity;
|
||||||
import io.anuke.mindustry.type.Liquid;
|
import io.anuke.mindustry.type.Liquid;
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.Tile;
|
||||||
import io.anuke.mindustry.world.meta.BlockStat;
|
import io.anuke.mindustry.world.meta.BlockStat;
|
||||||
import io.anuke.mindustry.world.meta.StatUnit;
|
import io.anuke.mindustry.world.meta.StatUnit;
|
||||||
import io.anuke.mindustry.world.meta.values.LiquidFilterValue;
|
|
||||||
|
|
||||||
import java.io.DataInput;
|
import java.io.DataInput;
|
||||||
import java.io.DataOutput;
|
import java.io.DataOutput;
|
||||||
@@ -63,11 +62,9 @@ public class NuclearReactor extends PowerGenerator{
|
|||||||
@Override
|
@Override
|
||||||
public void setStats(){
|
public void setStats(){
|
||||||
super.setStats();
|
super.setStats();
|
||||||
stats.add(BlockStat.inputLiquid, new LiquidFilterValue(liquid -> liquid.temperature <= 0.5f));
|
|
||||||
|
|
||||||
stats.remove(BlockStat.basePowerGeneration);
|
stats.remove(BlockStat.basePowerGeneration);
|
||||||
// Display the power which will be produced at 50% efficiency
|
stats.add(BlockStat.basePowerGeneration, powerProduction * 60f, StatUnit.powerSecond);
|
||||||
stats.add(BlockStat.basePowerGeneration, powerProduction * 60f * 0.5f, StatUnit.powerSecond);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -76,7 +73,7 @@ public class NuclearReactor extends PowerGenerator{
|
|||||||
|
|
||||||
int fuel = entity.items.get(consumes.item());
|
int fuel = entity.items.get(consumes.item());
|
||||||
float fullness = (float) fuel / itemCapacity;
|
float fullness = (float) fuel / itemCapacity;
|
||||||
entity.productionEfficiency = fullness / 2.0f; // Currently, efficiency of 0.5 = 100%
|
entity.productionEfficiency = fullness;
|
||||||
|
|
||||||
if(fuel > 0){
|
if(fuel > 0){
|
||||||
entity.heat += fullness * heating * Math.min(entity.delta(), 4f);
|
entity.heat += fullness * heating * Math.min(entity.delta(), 4f);
|
||||||
@@ -153,12 +150,6 @@ public class NuclearReactor extends PowerGenerator{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){
|
|
||||||
return tile.entity.liquids.get(liquid) + amount < liquidCapacity && liquid.temperature <= 0.5f &&
|
|
||||||
(tile.entity.liquids.current() == liquid || tile.entity.liquids.get(tile.entity.liquids.current()) < 0.01f);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(Tile tile){
|
public void draw(Tile tile){
|
||||||
super.draw(tile);
|
super.draw(tile);
|
||||||
|
|||||||