Unit requirements for payloads

This commit is contained in:
Anuken
2022-02-17 10:41:33 -05:00
parent fcc26154c2
commit fd764bd517
25 changed files with 203 additions and 156 deletions

View File

@@ -4,6 +4,7 @@ import arc.scene.ui.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.io.*;
import mindustry.ctype.*;
import mindustry.entities.bullet.*;
import mindustry.gen.*;
import mindustry.graphics.*;
@@ -18,9 +19,9 @@ import static mindustry.Vars.*;
//TODO visuals!
public class PayloadTurret extends Turret{
public ObjectMap<Block, BulletType> ammoTypes = new ObjectMap<>();
public ObjectMap<UnlockableContent, BulletType> ammoTypes = new ObjectMap<>();
protected Block[] ammoKeys;
protected UnlockableContent[] ammoKeys;
public PayloadTurret(String name){
super(name);
@@ -62,7 +63,7 @@ public class PayloadTurret extends Turret{
public void build(Building build, Table table){
MultiReqImage image = new MultiReqImage();
content.blocks().each(i -> filter.get(i) && i.unlockedNow(), block -> image.add(new ReqImage(new Image(block.uiIcon),
() -> build instanceof PayloadTurretBuild it && !it.blocks.isEmpty() && it.currentBlock() == block)));
() -> build instanceof PayloadTurretBuild it && !it.payloads.isEmpty() && it.currentBlock() == block)));
table.add(image).size(8 * 4);
}
@@ -70,7 +71,7 @@ public class PayloadTurret extends Turret{
@Override
public boolean valid(Building build){
//valid when there's any ammo in the turret
return build instanceof PayloadTurretBuild it && it.blocks.any();
return build instanceof PayloadTurretBuild it && it.payloads.any();
}
@Override
@@ -85,11 +86,11 @@ public class PayloadTurret extends Turret{
}
public class PayloadTurretBuild extends TurretBuild{
public BlockSeq blocks = new BlockSeq();
public PayloadSeq payloads = new PayloadSeq();
public Block currentBlock(){
for(Block block : ammoKeys){
if(blocks.contains(block)){
public UnlockableContent currentBlock(){
for(var block : ammoKeys){
if(payloads.contains(block)){
return block;
}
}
@@ -98,25 +99,25 @@ public class PayloadTurret extends Turret{
@Override
public boolean acceptPayload(Building source, Payload payload){
return payload instanceof BuildPayload build && blocks.total() < maxAmmo && ammoTypes.containsKey(build.block());
return payload instanceof BuildPayload build && payloads.total() < maxAmmo && ammoTypes.containsKey(build.block());
}
@Override
public void handlePayload(Building source, Payload payload){
blocks.add(((BuildPayload)payload).block());
payloads.add(((BuildPayload)payload).block());
}
@Override
public boolean hasAmmo(){
return blocks.total() > 0;
return payloads.total() > 0;
}
@Override
public BulletType useAmmo(){
ejectEffects();
for(Block block : ammoKeys){
if(blocks.contains(block)){
blocks.remove(block);
for(var block : ammoKeys){
if(payloads.contains(block)){
payloads.remove(block);
return ammoTypes.get(block);
}
}
@@ -125,8 +126,8 @@ public class PayloadTurret extends Turret{
@Override
public BulletType peekAmmo(){
for(Block block : ammoKeys){
if(blocks.contains(block)){
for(var block : ammoKeys){
if(payloads.contains(block)){
return ammoTypes.get(block);
}
}
@@ -134,13 +135,13 @@ public class PayloadTurret extends Turret{
}
@Override
public BlockSeq getBlockPayloads(){
return blocks;
public PayloadSeq getBlockPayloads(){
return payloads;
}
@Override
public void updateTile(){
totalAmmo = blocks.total();
totalAmmo = payloads.total();
unit.ammo((float)unit.type().ammoCapacity * totalAmmo / maxAmmo);
super.updateTile();
@@ -157,13 +158,13 @@ public class PayloadTurret extends Turret{
@Override
public void write(Writes write){
super.write(write);
blocks.write(write);
payloads.write(write);
}
@Override
public void read(Reads read, byte revision){
super.read(read, revision);
blocks.read(read);
payloads.read(read);
//TODO remove invalid ammo
}
}

View File

@@ -3,6 +3,7 @@ package mindustry.world.blocks.payloads;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.util.io.*;
import mindustry.ctype.*;
import mindustry.game.*;
import mindustry.gen.*;
import mindustry.graphics.*;
@@ -36,6 +37,11 @@ public class BuildPayload implements Payload{
build.dropped();
}
@Override
public UnlockableContent content(){
return build.block;
}
@Override
public void update(boolean inUnit){
if(inUnit && !build.block.updateInUnits) return;

View File

@@ -4,6 +4,7 @@ import arc.graphics.g2d.*;
import arc.math.geom.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.ctype.*;
import mindustry.game.*;
import mindustry.gen.*;
import mindustry.type.*;
@@ -60,6 +61,9 @@ public interface Payload extends Position{
/** @return icon describing the contents. */
TextureRegion icon();
/** @return content describing this payload (block or unit) */
UnlockableContent content();
@Override
default float getX(){
return x();

View File

@@ -9,6 +9,7 @@ import arc.util.*;
import arc.util.io.*;
import mindustry.*;
import mindustry.core.*;
import mindustry.ctype.*;
import mindustry.entities.EntityCollisions.*;
import mindustry.entities.*;
import mindustry.game.EventType.*;
@@ -40,6 +41,11 @@ public class UnitPayload implements Payload{
showOverlay(icon.getRegion());
}
@Override
public UnlockableContent content(){
return unit.type;
}
@Override
public ItemStack[] requirements(){
return unit.type.getTotalRequirements();

View File

@@ -17,7 +17,7 @@ public class ConsumeGenerator extends PowerGenerator{
public float itemDuration = 120f;
public float effectChance = 0.01f;
public Effect generateEffect = Fx.none;
public Effect generateEffect = Fx.none, consumeEffect = Fx.none;
public float generateEffectRange = 3f;
public @Nullable LiquidStack liquidOutput;
@@ -79,6 +79,7 @@ public class ConsumeGenerator extends PowerGenerator{
//take in items periodically
if(hasItems && valid && generateTime <= 0f && items.any()){
consume();
consumeEffect.at(x + Mathf.range(generateEffectRange), y + Mathf.range(generateEffectRange));
generateTime = 1f;
}
@@ -92,6 +93,10 @@ public class ConsumeGenerator extends PowerGenerator{
generateTime -= Math.min(1f / itemDuration * delta(), generateTime);
}
public float getEfficiencyMultiplier(){
return 1f;
}
@Override
public boolean consumeTriggerValid(){
return generateTime > 0;

View File

@@ -12,6 +12,7 @@ import arc.util.io.*;
import mindustry.ai.types.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.ctype.*;
import mindustry.entities.*;
import mindustry.entities.units.*;
import mindustry.game.*;
@@ -50,6 +51,7 @@ public class UnitAssembler extends PayloadBlock{
flags = EnumSet.of(BlockFlag.unitAssembler);
regionRotated1 = 1;
sync = true;
group = BlockGroup.units;
}
public Rect getRect(Rect rect, float x, float y, int rotation){
@@ -148,10 +150,10 @@ public class UnitAssembler extends PayloadBlock{
public static class AssemblerUnitPlan{
public UnitType unit;
public Seq<BlockStack> requirements;
public Seq<PayloadStack> requirements;
public float time;
public AssemblerUnitPlan(UnitType unit, float time, Seq<BlockStack> requirements){
public AssemblerUnitPlan(UnitType unit, float time, Seq<PayloadStack> requirements){
this.unit = unit;
this.time = time;
this.requirements = requirements;
@@ -163,11 +165,11 @@ public class UnitAssembler extends PayloadBlock{
/** hbgwerjhbagjegwg */
public static class YeetData{
public Vec2 target;
public Block block;
public UnlockableContent item;
public YeetData(Vec2 target, Block block){
public YeetData(Vec2 target, UnlockableContent item){
this.target = target;
this.block = block;
this.item = item;
}
}
@@ -183,14 +185,14 @@ public class UnitAssembler extends PayloadBlock{
build.droneSpawned(id);
}
public class UnitAssemblerBuild extends PayloadBlockBuild<BuildPayload>{
public class UnitAssemblerBuild extends PayloadBlockBuild<Payload>{
protected IntSeq readUnits = new IntSeq();
//holds drone IDs that have been sent, but not synced yet - add to list as soon as possible
protected IntSeq whenSyncedUnits = new IntSeq();
public Seq<Unit> units = new Seq<>();
public Seq<UnitAssemblerModuleBuild> modules = new Seq<>();
public BlockSeq blocks = new BlockSeq();
public PayloadSeq blocks = new PayloadSeq();
public float progress, warmup, droneWarmup, powerWarmup, sameTypeWarmup;
public float invalidWarmup = 0f;
public int currentTier = 0;
@@ -518,12 +520,12 @@ public class UnitAssembler extends PayloadBlock{
return consValid() && !wasOccupied;
}
public void yeetPayload(BuildPayload payload){
public void yeetPayload(Payload payload){
var spawn = getUnitSpawn();
blocks.add(payload.block(), 1);
blocks.add(payload.content(), 1);
float rot = payload.angleTo(spawn);
Fx.shootPayloadDriver.at(payload.x(), payload.y(), rot);
Fx.payloadDeposit.at(payload.x(), payload.y(), rot, new YeetData(spawn.cpy(), payload.block()));
Fx.payloadDeposit.at(payload.x(), payload.y(), rot, new YeetData(spawn.cpy(), payload.content()));
}
@Override
@@ -533,7 +535,7 @@ public class UnitAssembler extends PayloadBlock{
}
@Override
public BlockSeq getBlockPayloads(){
public PayloadSeq getBlockPayloads(){
return blocks;
}
@@ -541,7 +543,7 @@ public class UnitAssembler extends PayloadBlock{
public boolean acceptPayload(Building source, Payload payload){
var plan = plan();
return (this.payload == null || source instanceof UnitAssemblerModuleBuild) &&
payload instanceof BuildPayload bp && plan.requirements.contains(b -> b.block == bp.block() && blocks.get(bp.block()) < b.amount);
plan.requirements.contains(b -> b.item == payload.content() && blocks.get(payload.content()) < b.amount);
}
@Override

View File

@@ -61,7 +61,7 @@ public class UnitAssemblerModule extends PayloadBlock{
return results.find(b -> b.moduleFits(this, x * tilesize + offset, y * tilesize + offset, rotation));
}
public class UnitAssemblerModuleBuild extends PayloadBlockBuild<BuildPayload>{
public class UnitAssemblerModuleBuild extends PayloadBlockBuild<Payload>{
public UnitAssemblerBuild link;
public int lastChange = -2;