Implemented basic mech factories
Before Width: | Height: | Size: 381 B |
BIN
core/assets-raw/sprites/blocks/units/mech-factory.png
Normal file
After Width: | Height: | Size: 438 B |
BIN
core/assets-raw/sprites/blocks/units/ship-factory.png
Normal file
After Width: | Height: | Size: 438 B |
Before Width: | Height: | Size: 195 B After Width: | Height: | Size: 195 B |
Before Width: | Height: | Size: 177 B After Width: | Height: | Size: 177 B |
Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 264 B |
BIN
core/assets-raw/sprites/mechs/mechs/delta-mech-base.png
Normal file
After Width: | Height: | Size: 195 B |
BIN
core/assets-raw/sprites/mechs/mechs/delta-mech-leg.png
Normal file
After Width: | Height: | Size: 177 B |
BIN
core/assets-raw/sprites/mechs/mechs/delta-mech.png
Normal file
After Width: | Height: | Size: 264 B |
BIN
core/assets-raw/sprites/mechs/mechs/omega-mech-base.png
Normal file
After Width: | Height: | Size: 195 B |
BIN
core/assets-raw/sprites/mechs/mechs/omega-mech-leg.png
Normal file
After Width: | Height: | Size: 177 B |
BIN
core/assets-raw/sprites/mechs/mechs/omega-mech.png
Normal file
After Width: | Height: | Size: 264 B |
BIN
core/assets-raw/sprites/mechs/mechs/tau-mech-base.png
Normal file
After Width: | Height: | Size: 195 B |
BIN
core/assets-raw/sprites/mechs/mechs/tau-mech-leg.png
Normal file
After Width: | Height: | Size: 177 B |
BIN
core/assets-raw/sprites/mechs/mechs/tau-mech.png
Normal file
After Width: | Height: | Size: 264 B |
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
@ -7,22 +7,46 @@ import io.anuke.mindustry.type.Mech;
|
|||||||
import io.anuke.mindustry.type.Upgrade;
|
import io.anuke.mindustry.type.Upgrade;
|
||||||
|
|
||||||
public class Mechs implements ContentList {
|
public class Mechs implements ContentList {
|
||||||
public static Mech standard, standardShip;
|
public static Mech alpha, delta, tau, omega, standardShip;
|
||||||
|
|
||||||
|
/**These are not new mechs, just re-assignments for convenience.*/
|
||||||
|
public static Mech starterDesktop, starterMobile;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load() {
|
public void load() {
|
||||||
|
|
||||||
standard = new Mech("standard-mech", false){{
|
alpha = new Mech("alpha-mech", false){{
|
||||||
drillPower = 1;
|
drillPower = 2;
|
||||||
speed = 1.1f;
|
speed = 1.1f;
|
||||||
maxSpeed = 1.1f;
|
maxSpeed = 1.1f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
delta = new Mech("delta-mech", false){{
|
||||||
|
drillPower = -1;
|
||||||
|
speed = 1.5f;
|
||||||
|
maxSpeed = 1.5f;
|
||||||
|
}};
|
||||||
|
|
||||||
|
tau = new Mech("tau-mech", false){{
|
||||||
|
drillPower = 2;
|
||||||
|
speed = 1.1f;
|
||||||
|
maxSpeed = 1.1f;
|
||||||
|
}};
|
||||||
|
|
||||||
|
omega = new Mech("omega-mech", false){{
|
||||||
|
drillPower = 1;
|
||||||
|
speed = 1.0f;
|
||||||
|
maxSpeed = 1.0f;
|
||||||
|
}};
|
||||||
|
|
||||||
standardShip = new Mech("standard-ship", true){{
|
standardShip = new Mech("standard-ship", true){{
|
||||||
drillPower = 1;
|
drillPower = 1;
|
||||||
speed = 0.4f;
|
speed = 0.4f;
|
||||||
maxSpeed = 3f;
|
maxSpeed = 3f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
starterDesktop = alpha;
|
||||||
|
starterMobile = standardShip;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -6,6 +6,7 @@ import io.anuke.mindustry.game.Content;
|
|||||||
import io.anuke.mindustry.type.ContentList;
|
import io.anuke.mindustry.type.ContentList;
|
||||||
import io.anuke.mindustry.type.ItemStack;
|
import io.anuke.mindustry.type.ItemStack;
|
||||||
import io.anuke.mindustry.type.Recipe;
|
import io.anuke.mindustry.type.Recipe;
|
||||||
|
|
||||||
import static io.anuke.mindustry.type.Category.*;
|
import static io.anuke.mindustry.type.Category.*;
|
||||||
|
|
||||||
public class Recipes implements ContentList{
|
public class Recipes implements ContentList{
|
||||||
@ -126,11 +127,9 @@ public class Recipes implements ContentList{
|
|||||||
new Recipe(units, UnitBlocks.overdriveProjector, new ItemStack(Items.iron, 1));
|
new Recipe(units, UnitBlocks.overdriveProjector, new ItemStack(Items.iron, 1));
|
||||||
new Recipe(units, UnitBlocks.shieldProjector, new ItemStack(Items.iron, 1));
|
new Recipe(units, UnitBlocks.shieldProjector, new ItemStack(Items.iron, 1));
|
||||||
|
|
||||||
|
new Recipe(units, UpgradeBlocks.omegaFactory, new ItemStack(Items.iron, 1));
|
||||||
//new Recipe(units, UnitBlocks.vtolFactory, new ItemStack(Items.steel, 10));
|
new Recipe(units, UpgradeBlocks.deltaFactory, new ItemStack(Items.iron, 1));
|
||||||
//new Recipe(units, UnitBlocks.droneFactory, new ItemStack(Items.steel, 10));
|
new Recipe(units, UpgradeBlocks.tauFactory, new ItemStack(Items.iron, 1));
|
||||||
//new Recipe(units, UnitBlocks.droneFactory, new ItemStack(Items.steel, 10));
|
|
||||||
//new Recipe(units, UnitBlocks.walkerFactory, new ItemStack(Items.steel, 10));
|
|
||||||
|
|
||||||
new Recipe(units, DebugBlocks.itemSource, new ItemStack(Items.steel, 10)).setDebug();
|
new Recipe(units, DebugBlocks.itemSource, new ItemStack(Items.steel, 10)).setDebug();
|
||||||
new Recipe(units, DebugBlocks.itemVoid, new ItemStack(Items.steel, 10)).setDebug();
|
new Recipe(units, DebugBlocks.itemVoid, new ItemStack(Items.steel, 10)).setDebug();
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
package io.anuke.mindustry.content.blocks;
|
||||||
|
|
||||||
|
import io.anuke.mindustry.content.Mechs;
|
||||||
|
import io.anuke.mindustry.world.Block;
|
||||||
|
import io.anuke.mindustry.world.blocks.production.MechFactory;
|
||||||
|
|
||||||
|
public class UpgradeBlocks extends BlockList {
|
||||||
|
public static Block deltaFactory, tauFactory, omegaFactory;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void load() {
|
||||||
|
deltaFactory = new MechFactory("delta-mech-factory"){{
|
||||||
|
mech = Mechs.delta;
|
||||||
|
size = 2;
|
||||||
|
}};
|
||||||
|
|
||||||
|
tauFactory = new MechFactory("tau-mech-factory"){{
|
||||||
|
mech = Mechs.tau;
|
||||||
|
size = 2;
|
||||||
|
}};
|
||||||
|
|
||||||
|
omegaFactory = new MechFactory("omega-mech-factory"){{
|
||||||
|
mech = Mechs.omega;
|
||||||
|
size = 3;
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
}
|
@ -82,6 +82,7 @@ public class ContentLoader {
|
|||||||
new UnitBlocks(),
|
new UnitBlocks(),
|
||||||
new PowerBlocks(),
|
new PowerBlocks(),
|
||||||
new CraftingBlocks(),
|
new CraftingBlocks(),
|
||||||
|
new UpgradeBlocks(),
|
||||||
|
|
||||||
//recipes
|
//recipes
|
||||||
new Recipes(),
|
new Recipes(),
|
||||||
|
@ -195,7 +195,7 @@ public class Control extends Module{
|
|||||||
|
|
||||||
Player player = new Player();
|
Player player = new Player();
|
||||||
player.name = Settings.getString("name");
|
player.name = Settings.getString("name");
|
||||||
player.mech = mobile ? Mechs.standardShip : Mechs.standard;
|
player.mech = mobile ? Mechs.starterMobile : Mechs.starterDesktop;
|
||||||
player.color.set(Settings.getInt("color-" + index));
|
player.color.set(Settings.getInt("color-" + index));
|
||||||
player.isLocal = true;
|
player.isLocal = true;
|
||||||
player.playerIndex = index;
|
player.playerIndex = index;
|
||||||
|
@ -137,7 +137,7 @@ public class NetServer extends Module{
|
|||||||
player.usid = packet.usid;
|
player.usid = packet.usid;
|
||||||
player.name = packet.name;
|
player.name = packet.name;
|
||||||
player.uuid = uuid;
|
player.uuid = uuid;
|
||||||
player.mech = packet.mobile ? Mechs.standardShip : Mechs.standard;
|
player.mech = packet.mobile ? Mechs.starterMobile : Mechs.starterDesktop;
|
||||||
player.dead = true;
|
player.dead = true;
|
||||||
player.setNet(player.x, player.y);
|
player.setNet(player.x, player.y);
|
||||||
player.color.set(packet.color);
|
player.color.set(packet.color);
|
||||||
|
@ -8,7 +8,6 @@ import com.badlogic.gdx.utils.Queue;
|
|||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.Loc;
|
||||||
import io.anuke.annotations.Annotations.Remote;
|
import io.anuke.annotations.Annotations.Remote;
|
||||||
import io.anuke.mindustry.Vars;
|
import io.anuke.mindustry.Vars;
|
||||||
import io.anuke.mindustry.content.Mechs;
|
|
||||||
import io.anuke.mindustry.entities.effect.ItemDrop;
|
import io.anuke.mindustry.entities.effect.ItemDrop;
|
||||||
import io.anuke.mindustry.entities.traits.BuilderTrait;
|
import io.anuke.mindustry.entities.traits.BuilderTrait;
|
||||||
import io.anuke.mindustry.entities.traits.CarriableTrait;
|
import io.anuke.mindustry.entities.traits.CarriableTrait;
|
||||||
@ -62,7 +61,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
|||||||
public String uuid, usid;
|
public String uuid, usid;
|
||||||
public boolean isAdmin, isTransferring, isShooting;
|
public boolean isAdmin, isTransferring, isShooting;
|
||||||
public Color color = new Color();
|
public Color color = new Color();
|
||||||
public Mech mech = Mechs.standard;
|
public Mech mech;
|
||||||
|
|
||||||
public int clientid = -1;
|
public int clientid = -1;
|
||||||
public int playerIndex = 0;
|
public int playerIndex = 0;
|
||||||
@ -87,7 +86,18 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
|||||||
|
|
||||||
//region unit and event overrides, utility methods
|
//region unit and event overrides, utility methods
|
||||||
|
|
||||||
@Override
|
|
||||||
|
@Override
|
||||||
|
public int getItemCapacity() {
|
||||||
|
return mech.itemCapacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAmmoCapacity() {
|
||||||
|
return mech.ammoCapacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void interpolate() {
|
public void interpolate() {
|
||||||
super.interpolate();
|
super.interpolate();
|
||||||
|
|
||||||
@ -122,7 +132,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getBuildPower(Tile tile) {
|
public float getBuildPower(Tile tile) {
|
||||||
return 1f;
|
return mech.buildPower;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -35,7 +35,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
|||||||
/**Maximum absolute value of a velocity vector component.*/
|
/**Maximum absolute value of a velocity vector component.*/
|
||||||
public static final float maxAbsVelocity = 127f/velocityPercision;
|
public static final float maxAbsVelocity = 127f/velocityPercision;
|
||||||
|
|
||||||
public UnitInventory inventory = new UnitInventory(100, 100);
|
public UnitInventory inventory = new UnitInventory(this);
|
||||||
public float rotation;
|
public float rotation;
|
||||||
|
|
||||||
protected Interpolator interpolator = new Interpolator();
|
protected Interpolator interpolator = new Interpolator();
|
||||||
@ -259,6 +259,12 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
|||||||
public void drawUnder(){}
|
public void drawUnder(){}
|
||||||
public void drawOver(){}
|
public void drawOver(){}
|
||||||
|
|
||||||
|
public boolean isInfiniteAmmo(){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract int getItemCapacity();
|
||||||
|
public abstract int getAmmoCapacity();
|
||||||
public abstract float getArmor();
|
public abstract float getArmor();
|
||||||
public abstract boolean acceptsAmmo(Item item);
|
public abstract boolean acceptsAmmo(Item item);
|
||||||
public abstract void addAmmo(Item item);
|
public abstract void addAmmo(Item item);
|
||||||
|
@ -14,28 +14,21 @@ public class UnitInventory implements Saveable{
|
|||||||
private Array<AmmoEntry> ammos = new Array<>();
|
private Array<AmmoEntry> ammos = new Array<>();
|
||||||
private int totalAmmo;
|
private int totalAmmo;
|
||||||
private ItemStack item = new ItemStack(Items.stone, 0);
|
private ItemStack item = new ItemStack(Items.stone, 0);
|
||||||
//TODO move these somewhere else so they're not variables?
|
|
||||||
private int capacity, ammoCapacity;
|
|
||||||
private boolean infiniteAmmo;
|
|
||||||
|
|
||||||
public UnitInventory(int capacity, int ammoCapacity) {
|
private final Unit unit;
|
||||||
this.capacity = capacity;
|
|
||||||
this.ammoCapacity = ammoCapacity;
|
public UnitInventory(Unit unit) {
|
||||||
|
this.unit = unit;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFull(){
|
public boolean isFull(){
|
||||||
return item != null && item.amount >= capacity;
|
return item != null && item.amount >= unit.getItemCapacity();
|
||||||
}
|
|
||||||
|
|
||||||
public void setInfiniteAmmo(boolean infinite){
|
|
||||||
infiniteAmmo = infinite;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeSave(DataOutput stream) throws IOException {
|
public void writeSave(DataOutput stream) throws IOException {
|
||||||
stream.writeShort(item.amount);
|
stream.writeShort(item.amount);
|
||||||
stream.writeByte(item.item.id);
|
stream.writeByte(item.item.id);
|
||||||
stream.writeBoolean(infiniteAmmo);
|
|
||||||
stream.writeShort(totalAmmo);
|
stream.writeShort(totalAmmo);
|
||||||
stream.writeByte(ammos.size);
|
stream.writeByte(ammos.size);
|
||||||
for(int i = 0; i < ammos.size; i ++){
|
for(int i = 0; i < ammos.size; i ++){
|
||||||
@ -48,7 +41,6 @@ public class UnitInventory implements Saveable{
|
|||||||
public void readSave(DataInput stream) throws IOException {
|
public void readSave(DataInput stream) throws IOException {
|
||||||
short iamount = stream.readShort();
|
short iamount = stream.readShort();
|
||||||
byte iid = stream.readByte();
|
byte iid = stream.readByte();
|
||||||
infiniteAmmo = stream.readBoolean();
|
|
||||||
this.totalAmmo = stream.readShort();
|
this.totalAmmo = stream.readShort();
|
||||||
byte ammoa = stream.readByte();
|
byte ammoa = stream.readByte();
|
||||||
for(int i = 0; i < ammoa; i ++){
|
for(int i = 0; i < ammoa; i ++){
|
||||||
@ -75,7 +67,7 @@ public class UnitInventory implements Saveable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void useAmmo(){
|
public void useAmmo(){
|
||||||
if(infiniteAmmo) return;
|
if(unit.isInfiniteAmmo()) return;
|
||||||
AmmoEntry entry = ammos.peek();
|
AmmoEntry entry = ammos.peek();
|
||||||
entry.amount --;
|
entry.amount --;
|
||||||
if(entry.amount == 0) ammos.pop();
|
if(entry.amount == 0) ammos.pop();
|
||||||
@ -87,11 +79,11 @@ public class UnitInventory implements Saveable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int ammoCapacity(){
|
public int ammoCapacity(){
|
||||||
return ammoCapacity;
|
return unit.getAmmoCapacity();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canAcceptAmmo(AmmoType type){
|
public boolean canAcceptAmmo(AmmoType type){
|
||||||
return totalAmmo + type.quantityMultiplier <= ammoCapacity;
|
return totalAmmo + type.quantityMultiplier <= unit.getAmmoCapacity();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addAmmo(AmmoType type){
|
public void addAmmo(AmmoType type){
|
||||||
@ -115,7 +107,7 @@ public class UnitInventory implements Saveable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int capacity(){
|
public int capacity(){
|
||||||
return capacity;
|
return unit.getItemCapacity();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEmpty(){
|
public boolean isEmpty(){
|
||||||
@ -124,18 +116,18 @@ public class UnitInventory implements Saveable{
|
|||||||
|
|
||||||
public int itemCapacityUsed(Item type){
|
public int itemCapacityUsed(Item type){
|
||||||
if(canAcceptItem(type)){
|
if(canAcceptItem(type)){
|
||||||
return !hasItem() ? capacity : (capacity - item.amount);
|
return !hasItem() ? unit.getItemCapacity() : (unit.getItemCapacity() - item.amount);
|
||||||
}else{
|
}else{
|
||||||
return capacity;
|
return unit.getItemCapacity();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canAcceptItem(Item type){
|
public boolean canAcceptItem(Item type){
|
||||||
return !hasItem() || (item.item == type && capacity - item.amount > 0);
|
return !hasItem() || (item.item == type && unit.getItemCapacity() - item.amount > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canAcceptItem(Item type, int amount){
|
public boolean canAcceptItem(Item type, int amount){
|
||||||
return !hasItem() || (item.item == type && item.amount + amount <= capacity);
|
return !hasItem() || (item.item == type && item.amount + amount <= unit.getItemCapacity());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clear(){
|
public void clear(){
|
||||||
|
@ -76,7 +76,7 @@ public class Units {
|
|||||||
boolean[] value = new boolean[1];
|
boolean[] value = new boolean[1];
|
||||||
|
|
||||||
Units.getNearby(rect, unit -> {
|
Units.getNearby(rect, unit -> {
|
||||||
if(value[0] || !pred.test(unit)) return;
|
if(value[0] || !pred.test(unit) || unit.isDead()) return;
|
||||||
if(!unit.isFlying()){
|
if(!unit.isFlying()){
|
||||||
unit.getHitbox(hitrect);
|
unit.getHitbox(hitrect);
|
||||||
|
|
||||||
|
@ -53,7 +53,6 @@ public abstract class BaseUnit extends Unit{
|
|||||||
/**Sets this to a 'wave' unit, which means it has slightly different AI and will not run out of ammo.*/
|
/**Sets this to a 'wave' unit, which means it has slightly different AI and will not run out of ammo.*/
|
||||||
public void setWave(){
|
public void setWave(){
|
||||||
isWave = true;
|
isWave = true;
|
||||||
inventory.setInfiniteAmmo(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void rotate(float angle){
|
public void rotate(float angle){
|
||||||
@ -115,6 +114,21 @@ public abstract class BaseUnit extends Unit{
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCapacity() {
|
||||||
|
return type.itemCapacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAmmoCapacity() {
|
||||||
|
return type.ammoCapacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isInfiniteAmmo() {
|
||||||
|
return isWave;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void interpolate() {
|
public void interpolate() {
|
||||||
super.interpolate();
|
super.interpolate();
|
||||||
|
@ -31,6 +31,8 @@ public class UnitType {
|
|||||||
public float retreatPercent = 0.2f;
|
public float retreatPercent = 0.2f;
|
||||||
public float armor = 0f;
|
public float armor = 0f;
|
||||||
public float carryWeight = 1f;
|
public float carryWeight = 1f;
|
||||||
|
public int ammoCapacity = 100;
|
||||||
|
public int itemCapacity = 100;
|
||||||
public ObjectMap<Item, AmmoType> ammo = new ObjectMap<>();
|
public ObjectMap<Item, AmmoType> ammo = new ObjectMap<>();
|
||||||
|
|
||||||
public UnitType(String name, UnitCreator creator){
|
public UnitType(String name, UnitCreator creator){
|
||||||
|
@ -6,14 +6,22 @@ import io.anuke.ucore.graphics.Draw;
|
|||||||
|
|
||||||
public class Mech extends Upgrade {
|
public class Mech extends Upgrade {
|
||||||
public boolean flying;
|
public boolean flying;
|
||||||
|
|
||||||
public float speed = 1.1f;
|
public float speed = 1.1f;
|
||||||
public float maxSpeed = 1.1f;
|
public float maxSpeed = 1.1f;
|
||||||
public float mass = 1f;
|
public float mass = 1f;
|
||||||
|
public float armor = 1f;
|
||||||
|
|
||||||
public int drillPower = -1;
|
public int drillPower = -1;
|
||||||
public float carryWeight = 1f;
|
public float carryWeight = 1f;
|
||||||
public float armor = 1f;
|
public float buildPower = 1f;
|
||||||
|
public boolean canRepair = false;
|
||||||
|
|
||||||
public Weapon weapon = Weapons.blaster;
|
public Weapon weapon = Weapons.blaster;
|
||||||
|
|
||||||
|
public int itemCapacity = 30;
|
||||||
|
public int ammoCapacity = 100;
|
||||||
|
|
||||||
public TextureRegion baseRegion, legRegion, region, iconRegion;
|
public TextureRegion baseRegion, legRegion, region, iconRegion;
|
||||||
|
|
||||||
public Mech(String name, boolean flying){
|
public Mech(String name, boolean flying){
|
||||||
|
@ -3,6 +3,8 @@ package io.anuke.mindustry.type;
|
|||||||
import com.badlogic.gdx.utils.Array;
|
import com.badlogic.gdx.utils.Array;
|
||||||
import io.anuke.mindustry.game.Content;
|
import io.anuke.mindustry.game.Content;
|
||||||
import io.anuke.mindustry.game.UnlockableContent;
|
import io.anuke.mindustry.game.UnlockableContent;
|
||||||
|
import io.anuke.ucore.function.Consumer;
|
||||||
|
import io.anuke.ucore.function.Predicate;
|
||||||
import io.anuke.ucore.util.Bundles;
|
import io.anuke.ucore.util.Bundles;
|
||||||
|
|
||||||
public abstract class Upgrade implements UnlockableContent{
|
public abstract class Upgrade implements UnlockableContent{
|
||||||
@ -45,6 +47,14 @@ public abstract class Upgrade implements UnlockableContent{
|
|||||||
return all();
|
return all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T extends Upgrade> void forEach(Consumer<T> type, Predicate<Upgrade> pred){
|
||||||
|
for(Upgrade u : upgrades){
|
||||||
|
if(pred.test(u)){
|
||||||
|
type.accept((T)u);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static Array<Upgrade> all() {
|
public static Array<Upgrade> all() {
|
||||||
return upgrades;
|
return upgrades;
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,18 @@
|
|||||||
package io.anuke.mindustry.world.blocks.production;
|
package io.anuke.mindustry.world.blocks.production;
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||||
import com.badlogic.gdx.utils.Array;
|
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.Loc;
|
||||||
import io.anuke.annotations.Annotations.Remote;
|
import io.anuke.annotations.Annotations.Remote;
|
||||||
import io.anuke.mindustry.Vars;
|
import io.anuke.mindustry.Vars;
|
||||||
import io.anuke.mindustry.content.fx.Fx;
|
import io.anuke.mindustry.content.fx.Fx;
|
||||||
import io.anuke.mindustry.entities.Player;
|
import io.anuke.mindustry.entities.Player;
|
||||||
import io.anuke.mindustry.entities.TileEntity;
|
import io.anuke.mindustry.entities.TileEntity;
|
||||||
|
import io.anuke.mindustry.entities.Units;
|
||||||
import io.anuke.mindustry.gen.CallBlocks;
|
import io.anuke.mindustry.gen.CallBlocks;
|
||||||
import io.anuke.mindustry.graphics.Palette;
|
import io.anuke.mindustry.graphics.Palette;
|
||||||
import io.anuke.mindustry.graphics.Shaders;
|
import io.anuke.mindustry.graphics.Shaders;
|
||||||
import io.anuke.mindustry.net.In;
|
import io.anuke.mindustry.net.In;
|
||||||
import io.anuke.mindustry.type.Mech;
|
import io.anuke.mindustry.type.Mech;
|
||||||
import io.anuke.mindustry.type.Upgrade;
|
|
||||||
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.Effects;
|
||||||
@ -21,35 +20,49 @@ 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.Lines;
|
import io.anuke.ucore.graphics.Lines;
|
||||||
import io.anuke.ucore.scene.style.TextureRegionDrawable;
|
|
||||||
import io.anuke.ucore.scene.ui.ButtonGroup;
|
|
||||||
import io.anuke.ucore.scene.ui.ImageButton;
|
|
||||||
import io.anuke.ucore.scene.ui.layout.Table;
|
|
||||||
import io.anuke.ucore.util.Mathf;
|
import io.anuke.ucore.util.Mathf;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
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.tilesize;
|
||||||
|
|
||||||
public class MechFactory extends Block{
|
public class MechFactory extends Block{
|
||||||
|
protected float powerUse = 0.1f;
|
||||||
|
protected Mech mech;
|
||||||
|
|
||||||
public MechFactory(String name){
|
public MechFactory(String name){
|
||||||
super(name);
|
super(name);
|
||||||
solid = true;
|
|
||||||
hasItems = true;
|
hasItems = true;
|
||||||
destructible = true;
|
hasPower = true;
|
||||||
configurable = true;
|
|
||||||
update = true;
|
update = true;
|
||||||
|
consumesTap = true;
|
||||||
|
solidifes = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSolidFor(Tile tile) {
|
||||||
|
MechFactoryEntity entity = tile.entity();
|
||||||
|
return !entity.open;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tapped(Tile tile, Player player) {
|
||||||
|
|
||||||
|
if(checkValidTap(tile, player)){
|
||||||
|
CallBlocks.onMechFactoryBegin(player, tile);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(Tile tile) {
|
public void draw(Tile tile) {
|
||||||
MechFactoryEntity entity = tile.entity();
|
MechFactoryEntity entity = tile.entity();
|
||||||
|
|
||||||
Draw.rect(name, tile.drawx(), tile.drawy());
|
Draw.rect(entity.open ? name + "-open" : name, tile.drawx(), tile.drawy());
|
||||||
|
|
||||||
if(entity.current != null) {
|
if(entity.player != null) {
|
||||||
TextureRegion region = entity.current.region;
|
TextureRegion region = mech.iconRegion;
|
||||||
|
|
||||||
Shaders.build.region = region;
|
Shaders.build.region = region;
|
||||||
Shaders.build.progress = entity.progress;
|
Shaders.build.progress = entity.progress;
|
||||||
@ -77,136 +90,87 @@ public class MechFactory extends Block{
|
|||||||
public void update(Tile tile) {
|
public void update(Tile tile) {
|
||||||
MechFactoryEntity entity = tile.entity();
|
MechFactoryEntity entity = tile.entity();
|
||||||
|
|
||||||
if(entity.current != null){
|
float used = Math.min(powerCapacity, Timers.delta() * powerUse);
|
||||||
entity.heat = Mathf.lerpDelta(entity.heat, 1f, 0.1f);
|
|
||||||
entity.time += Timers.delta();
|
if(entity.open){
|
||||||
entity.progress += 1f / Vars.respawnduration;
|
if(!Units.anyEntities(tile)){
|
||||||
|
entity.open = false;
|
||||||
|
}else{
|
||||||
|
entity.heat = Mathf.lerpDelta(entity.heat, 0f, 0.1f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(entity.player != null){
|
||||||
|
if(entity.power.amount >= used || true) {
|
||||||
|
entity.heat = Mathf.lerpDelta(entity.heat, 1f, 0.1f);
|
||||||
|
entity.progress += 1f / Vars.respawnduration;
|
||||||
|
entity.power.amount -= used;
|
||||||
|
}else{
|
||||||
|
entity.heat = Mathf.lerpDelta(entity.heat, 0f, 0.05f);
|
||||||
|
}
|
||||||
|
|
||||||
|
entity.time += entity.heat;
|
||||||
|
|
||||||
if(entity.progress >= 1f){
|
if(entity.progress >= 1f){
|
||||||
CallBlocks.onMechFactoryDone(tile, entity.current);
|
CallBlocks.onMechFactoryDone(tile);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
if(Units.anyEntities(tile, 4f, unit -> unit.getTeam() == entity.getTeam() && unit instanceof Player)){
|
||||||
|
entity.open = true;
|
||||||
|
}
|
||||||
|
|
||||||
entity.heat = Mathf.lerpDelta(entity.heat, 0f, 0.1f);
|
entity.heat = Mathf.lerpDelta(entity.heat, 0f, 0.1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void buildTable(Tile tile, Table table) {
|
|
||||||
MechFactoryEntity entity = tile.entity();
|
|
||||||
|
|
||||||
Table cont = new Table();
|
|
||||||
|
|
||||||
//no result to show, build weapon selection menu
|
|
||||||
if(entity.result == null) {
|
|
||||||
//show weapon to select and build
|
|
||||||
showSelect(tile, cont);
|
|
||||||
}else{
|
|
||||||
//show weapon to withdraw
|
|
||||||
showResult(tile, cont);
|
|
||||||
}
|
|
||||||
|
|
||||||
table.add(cont);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void showSelect(Tile tile, Table cont){
|
|
||||||
MechFactoryEntity entity = tile.entity();
|
|
||||||
|
|
||||||
Array<Upgrade> items = Upgrade.all();
|
|
||||||
|
|
||||||
ButtonGroup<ImageButton> group = new ButtonGroup<>();
|
|
||||||
group.setMinCheckCount(0);
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
for (Upgrade upgrade : items) {
|
|
||||||
if (!(upgrade instanceof Mech)) continue;
|
|
||||||
Mech mech = (Mech) upgrade;
|
|
||||||
|
|
||||||
ImageButton button = cont.addImageButton("white", "toggle", 24, () -> CallBlocks.setMechFactory(null, tile, mech))
|
|
||||||
.size(38, 42).padBottom(-5.1f).group(group).get();
|
|
||||||
button.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(mech.region));
|
|
||||||
button.setChecked(entity.current == mech);
|
|
||||||
|
|
||||||
if (i++ % 4 == 3) {
|
|
||||||
cont.row();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cont.update(() -> {
|
|
||||||
//show result when done
|
|
||||||
if(entity.result != null){
|
|
||||||
cont.clear();
|
|
||||||
cont.update(null);
|
|
||||||
showResult(tile, cont);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void showResult(Tile tile, Table cont){
|
|
||||||
MechFactoryEntity entity = tile.entity();
|
|
||||||
|
|
||||||
Mech mech = entity.result;
|
|
||||||
|
|
||||||
ImageButton button = cont.addImageButton("white", "toggle", 24, () -> CallBlocks.pickupMechFactory(null, tile))
|
|
||||||
.size(38, 42).padBottom(-5.1f).get();
|
|
||||||
button.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(mech.region));
|
|
||||||
button.setChecked(entity.current == mech);
|
|
||||||
|
|
||||||
cont.update(() -> {
|
|
||||||
//show selection menu when result disappears
|
|
||||||
if(entity.result == null){
|
|
||||||
cont.clear();
|
|
||||||
cont.update(null);
|
|
||||||
showSelect(tile, cont);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TileEntity getEntity() {
|
public TileEntity getEntity() {
|
||||||
return new MechFactoryEntity();
|
return new MechFactoryEntity();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Remote(targets = Loc.both, called = Loc.server, in = In.blocks, forward = true)
|
@Remote(targets = Loc.both, called = Loc.server, in = In.blocks, forward = true)
|
||||||
public static void pickupMechFactory(Player player, Tile tile){
|
public static void onMechFactoryBegin(Player player, Tile tile){
|
||||||
MechFactoryEntity entity = tile.entity();
|
if(!checkValidTap(tile, player)) return;
|
||||||
|
|
||||||
if(entity.current != null){
|
|
||||||
player.mech = entity.current;
|
|
||||||
entity.current = null;
|
|
||||||
entity.progress = 0;
|
|
||||||
entity.result = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Remote(targets = Loc.both, called = Loc.server, in = In.blocks, forward = true)
|
|
||||||
public static void setMechFactory(Player player, Tile tile, Mech weapon){
|
|
||||||
MechFactoryEntity entity = tile.entity();
|
MechFactoryEntity entity = tile.entity();
|
||||||
entity.current = weapon;
|
|
||||||
entity.progress = 0f;
|
entity.progress = 0f;
|
||||||
entity.heat = 0f;
|
entity.player = player;
|
||||||
|
|
||||||
|
player.rotation = 90f;
|
||||||
|
player.baseRotation = 90f;
|
||||||
|
player.set(entity.x, entity.y);
|
||||||
|
player.setDead(true);
|
||||||
|
player.setRespawning(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Remote(called = Loc.server, in = In.blocks)
|
@Remote(called = Loc.server, in = In.blocks)
|
||||||
public static void onMechFactoryDone(Tile tile, Mech result){
|
public static void onMechFactoryDone(Tile tile){
|
||||||
MechFactoryEntity entity = tile.entity();
|
MechFactoryEntity entity = tile.entity();
|
||||||
|
|
||||||
Effects.effect(Fx.spawn, entity);
|
Effects.effect(Fx.spawn, entity);
|
||||||
entity.current = null;
|
|
||||||
|
entity.player.mech = ((MechFactory)tile.block()).mech;
|
||||||
entity.progress = 0;
|
entity.progress = 0;
|
||||||
entity.result = result;
|
entity.player.heal();
|
||||||
|
entity.player.setDead(false);
|
||||||
|
entity.player = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean checkValidTap(Tile tile, Player player){
|
||||||
|
MechFactoryEntity entity = tile.entity();
|
||||||
|
return Math.abs(player.x - tile.drawx()) <= tile.block().size * tilesize / 2f &&
|
||||||
|
Math.abs(player.y - tile.drawy()) <= tile.block().size * tilesize / 2f && entity.player == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MechFactoryEntity extends TileEntity{
|
public class MechFactoryEntity extends TileEntity{
|
||||||
public Mech current;
|
public Player player;
|
||||||
public Mech result;
|
|
||||||
public float progress;
|
public float progress;
|
||||||
public float time;
|
public float time;
|
||||||
public float heat;
|
public float heat;
|
||||||
|
public boolean open;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(DataOutputStream stream) throws IOException {
|
public void write(DataOutputStream stream) throws IOException {
|
||||||
stream.writeByte(current == null ? -1 : current.id);
|
|
||||||
stream.writeByte(result == null ? -1 : result.id);
|
|
||||||
stream.writeFloat(progress);
|
stream.writeFloat(progress);
|
||||||
stream.writeFloat(time);
|
stream.writeFloat(time);
|
||||||
stream.writeFloat(heat);
|
stream.writeFloat(heat);
|
||||||
@ -214,18 +178,9 @@ public class MechFactory extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void read(DataInputStream stream) throws IOException {
|
public void read(DataInputStream stream) throws IOException {
|
||||||
byte id = stream.readByte(), rid = stream.readByte();
|
|
||||||
progress = stream.readFloat();
|
progress = stream.readFloat();
|
||||||
time = stream.readFloat();
|
time = stream.readFloat();
|
||||||
heat = stream.readFloat();
|
heat = stream.readFloat();
|
||||||
|
|
||||||
if(id != -1){
|
|
||||||
current = Upgrade.getByID(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(rid != -1){
|
|
||||||
result = Upgrade.getByID(rid);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|