Skip to content

Commit

Permalink
Make assembler plans support items and liquids, allow changing sap bu…
Browse files Browse the repository at this point in the history
…llet regions (#9413)

* make assembler plans support items and liquids, allow changing sap bullet regions

* leftover copypaste

* hhhhhhhhhhhhhhh

* may want to add this as well

---------

Co-authored-by: Anuken <[email protected]>
  • Loading branch information
stacktrace-error and Anuken authored Feb 10, 2025
1 parent e7e1e1f commit 8ee0256
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 11 deletions.
14 changes: 13 additions & 1 deletion core/src/mindustry/entities/bullet/SapBulletType.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,18 @@ public class SapBulletType extends BulletType{
public float sapStrength = 0.5f;
public Color color = Color.white.cpy();
public float width = 0.4f;
public String sprite = "laser";

public TextureRegion laserRegion;
public TextureRegion laserEndRegion;

@Override
public void load(){
super.load();

laserRegion = Core.atlas.find(sprite);
laserEndRegion = Core.atlas.find(sprite + "-end");
}

public SapBulletType(){
speed = 0f;
Expand All @@ -37,7 +49,7 @@ public void draw(Bullet b){
Tmp.v1.set(data).lerp(b, b.fin());

Draw.color(color);
Drawf.laser(Core.atlas.find("laser"), Core.atlas.find("laser-end"),
Drawf.laser(laserRegion, laserEndRegion,
b.x, b.y, Tmp.v1.x, Tmp.v1.y, width * b.fout());

Draw.reset();
Expand Down
94 changes: 84 additions & 10 deletions core/src/mindustry/world/blocks/units/UnitAssembler.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import arc.struct.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.Vars;
import mindustry.ai.types.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
Expand Down Expand Up @@ -40,17 +41,19 @@ public class UnitAssembler extends PayloadBlock{
public UnitType droneType = UnitTypes.assemblyDrone;
public int dronesCreated = 4;
public float droneConstructTime = 60f * 4f;
public int[] capacities = {};

public Seq<AssemblerUnitPlan> plans = new Seq<>(4);

protected @Nullable ConsumePayloadDynamic consPayload;
protected @Nullable ConsumeItemDynamic consItem;

public UnitAssembler(String name){
super(name);
update = solid = true;
rotate = true;
rotateDraw = false;
acceptsPayload = true;
acceptsPayload = hasItems = true;
flags = EnumSet.of(BlockFlag.unitAssembler);
regionRotated1 = 1;
sync = true;
Expand Down Expand Up @@ -96,6 +99,21 @@ public boolean canPlaceOn(Tile tile, Team team, int rotation){
public void setBars(){
super.setBars();

boolean planLiquids = false;
for(int i = 0; i < plans.size; i++){
var req = plans.get(i).liquidReq;
if(req != null && req.length > 0){
for(var stack : req){
addLiquidBar(stack.liquid);
}
planLiquids = true;
}
}

if(planLiquids){
removeBar("liquid");
}

addBar("progress", (UnitAssemblerBuild e) -> new Bar("bar.progress", Pal.ammo, () -> e.progress));

addBar("units", (UnitAssemblerBuild e) ->
Expand Down Expand Up @@ -125,11 +143,30 @@ public TextureRegion[] icons(){
@Override
public void init(){
updateClipRadius(areaSize * tilesize);

consume(consPayload = new ConsumePayloadDynamic((UnitAssemblerBuild build) -> build.plan().requirements));
consume(consItem = new ConsumeItemDynamic((UnitAssemblerBuild build) -> build.plan().itemReq != null ? build.plan().itemReq : ItemStack.empty));
consume(new ConsumeLiquidsDynamic((UnitAssemblerBuild build) -> build.plan().liquidReq != null ? build.plan().liquidReq : LiquidStack.empty));

consumeBuilder.each(c -> c.multiplier = b -> state.rules.unitCost(b.team));

super.init();

capacities = new int[Vars.content.items().size];
for(AssemblerUnitPlan plan : plans){
if(plan.itemReq != null){
for(ItemStack stack : plan.itemReq){
capacities[stack.item.id] = Math.max(capacities[stack.item.id], stack.amount * 2);
itemCapacity = Math.max(itemCapacity, stack.amount * 2);
}
}

if(plan.liquidReq != null){
for(LiquidStack stack : plan.liquidReq){
liquidFilter[stack.liquid.id] = true;
}
}
}
}

@Override
Expand Down Expand Up @@ -163,16 +200,40 @@ public void setStats(){
}).left();

t.table(req -> {
req.right();
for(int i = 0; i < plan.requirements.size; i++){
if(i % 6 == 0){
req.row();
req.table().grow(); //it refuses to go to the right unless I do this. please help.

req.table(solid -> {
int length = 0;
if(plan.itemReq != null){
for(int i = 0; i < plan.itemReq.length; i++){
if(length % 6 == 0){
solid.row();
}
solid.add(StatValues.stack(plan.itemReq[i])).pad(5);
length++;
}
}

PayloadStack stack = plan.requirements.get(i);
req.add(StatValues.stack(stack)).pad(5);
for(int i = 0; i < plan.requirements.size; i++){
if(length % 6 == 0){
solid.row();
}
solid.add(StatValues.stack(plan.requirements.get(i))).pad(5);
length++;
}
}).right();

LiquidStack[] stacks = plan.liquidReq;
if(stacks != null){
for(int i = 0; i < plan.liquidReq.length; i++){
req.row();

req.table().grow(); //another one.

req.add(StatValues.displayLiquid(stacks[i].liquid, stacks[i].amount * 60f, true)).right();
}
}
}).right().grow().pad(10f);
}).grow().pad(10f);
}else{
t.image(Icon.lock).color(Pal.darkerGray).size(40).pad(10);
}
Expand All @@ -185,7 +246,9 @@ public void setStats(){

public static class AssemblerUnitPlan{
public UnitType unit;
public Seq<PayloadStack> requirements;
@Nullable public Seq<PayloadStack> requirements;
@Nullable public ItemStack[] itemReq;
@Nullable public LiquidStack[] liquidReq;
public float time;

public AssemblerUnitPlan(UnitType unit, float time, Seq<PayloadStack> requirements){
Expand Down Expand Up @@ -296,7 +359,7 @@ public AssemblerUnitPlan plan(){
@Override
public boolean shouldConsume(){
//liquid is only consumed when building is being done
return enabled && !wasOccupied && Units.canCreate(team, plan().unit) && consPayload.efficiency(this) > 0;
return enabled && !wasOccupied && Units.canCreate(team, plan().unit) && consPayload.efficiency(this) > 0 && consItem.efficiency(this) > 0;
}

@Override
Expand Down Expand Up @@ -601,6 +664,17 @@ public boolean acceptPayload(Building source, Payload payload){
plan.requirements.contains(b -> b.item == payload.content() && blocks.get(payload.content()) < Mathf.round(b.amount * state.rules.unitCost(team)));
}

@Override
public int getMaximumAccepted(Item item){
return Mathf.round(capacities[item.id] * state.rules.unitCost(team));
}

@Override
public boolean acceptItem(Building source, Item item){
return plan().itemReq != null && items.get(item) < getMaximumAccepted(item) &&
Structs.contains(plan().itemReq, stack -> stack.item == item);
}

@Override
public Vec2 getCommandPosition(){
return commandPos;
Expand Down

0 comments on commit 8ee0256

Please sign in to comment.