Unit requirements for payloads
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -9,11 +9,11 @@ import mindustry.ui.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
public class ConsumePayloadDynamic extends Consume{
|
||||
public final Func<Building, Seq<BlockStack>> payloads;
|
||||
public final Func<Building, Seq<PayloadStack>> payloads;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends Building> ConsumePayloadDynamic(Func<T, Seq<BlockStack>> payloads){
|
||||
this.payloads = (Func<Building, Seq<BlockStack>>)payloads;
|
||||
public <T extends Building> ConsumePayloadDynamic(Func<T, Seq<PayloadStack>> payloads){
|
||||
this.payloads = (Func<Building, Seq<PayloadStack>>)payloads;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -54,8 +54,8 @@ public class ConsumePayloadDynamic extends Consume{
|
||||
table.table(c -> {
|
||||
int i = 0;
|
||||
for(var stack : pay){
|
||||
c.add(new ReqImage(new ItemImage(stack.block.uiIcon, stack.amount),
|
||||
() -> inv.contains(stack.block, stack.amount))).padRight(8);
|
||||
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount),
|
||||
() -> inv.contains(stack.item, stack.amount))).padRight(8);
|
||||
if(++i % 4 == 0) c.row();
|
||||
}
|
||||
}).left();
|
||||
|
||||
@@ -2,23 +2,25 @@ package mindustry.world.consumers;
|
||||
|
||||
import arc.func.*;
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.struct.*;
|
||||
import mindustry.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class ConsumePayloadFilter extends Consume{
|
||||
//cache fitting blocks to prevent search over all blocks later
|
||||
protected final Block[] fitting;
|
||||
protected final UnlockableContent[] fitting;
|
||||
|
||||
public Boolf<Block> filter;
|
||||
public Boolf<UnlockableContent> filter;
|
||||
|
||||
public ConsumePayloadFilter(Boolf<Block> filter){
|
||||
public ConsumePayloadFilter(Boolf<UnlockableContent> filter){
|
||||
this.filter = filter;
|
||||
this.fitting = Vars.content.blocks().select(filter).toArray(Block.class);
|
||||
this.fitting = Vars.content.blocks().copy().<UnlockableContent>as().and(content.units().as())
|
||||
.select(filter).toArray(UnlockableContent.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -45,7 +47,7 @@ public class ConsumePayloadFilter extends Consume{
|
||||
|
||||
@Override
|
||||
public void display(Stats stats){
|
||||
stats.add(booster ? Stat.booster : Stat.input, StatValues.blocks(filter));
|
||||
stats.add(booster ? Stat.booster : Stat.input, StatValues.content(new Seq<>(fitting)));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,9 +8,9 @@ import mindustry.ui.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
public class ConsumePayloads extends Consume{
|
||||
public Seq<BlockStack> payloads;
|
||||
public Seq<PayloadStack> payloads;
|
||||
|
||||
public ConsumePayloads(Seq<BlockStack> payloads){
|
||||
public ConsumePayloads(Seq<PayloadStack> payloads){
|
||||
this.payloads = payloads;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class ConsumePayloads extends Consume{
|
||||
for(var stack : payloads){
|
||||
stats.add(Stat.input, t -> {
|
||||
t.add(new ItemImage(stack));
|
||||
t.add(stack.block.localizedName).padLeft(4).padRight(4);
|
||||
t.add(stack.item.localizedName).padLeft(4).padRight(4);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -43,8 +43,8 @@ public class ConsumePayloads extends Consume{
|
||||
table.table(c -> {
|
||||
int i = 0;
|
||||
for(var stack : payloads){
|
||||
c.add(new ReqImage(new ItemImage(stack.block.uiIcon, stack.amount),
|
||||
() -> inv.contains(stack.block, stack.amount))).padRight(8);
|
||||
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount),
|
||||
() -> inv.contains(stack.item, stack.amount))).padRight(8);
|
||||
if(++i % 4 == 0) c.row();
|
||||
}
|
||||
}).left();
|
||||
|
||||
@@ -197,16 +197,12 @@ public class StatValues{
|
||||
});
|
||||
}
|
||||
|
||||
public static StatValue blocks(Boolf<Block> pred){
|
||||
return blocks(content.blocks().select(pred));
|
||||
}
|
||||
|
||||
public static StatValue blocks(Seq<Block> list){
|
||||
public static StatValue content(Seq<UnlockableContent> list){
|
||||
return table -> table.table(l -> {
|
||||
l.left();
|
||||
|
||||
for(int i = 0; i < list.size; i++){
|
||||
Block item = list.get(i);
|
||||
var item = list.get(i);
|
||||
|
||||
l.image(item.uiIcon).size(iconSmall).padRight(2).padLeft(2).padTop(3).padBottom(3);
|
||||
l.add(item.localizedName).left().padLeft(1).padRight(4);
|
||||
@@ -217,6 +213,14 @@ public class StatValues{
|
||||
});
|
||||
}
|
||||
|
||||
public static StatValue blocks(Boolf<Block> pred){
|
||||
return blocks(content.blocks().select(pred));
|
||||
}
|
||||
|
||||
public static StatValue blocks(Seq<Block> list){
|
||||
return content(list.as());
|
||||
}
|
||||
|
||||
public static StatValue boosters(float reload, float maxUsed, float multiplier, boolean baseReload, Boolf<Liquid> filter){
|
||||
return table -> {
|
||||
table.row();
|
||||
|
||||
Reference in New Issue
Block a user