Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make assembler plans support items and liquids, allow changing sap bullet regions #9413

Merged
merged 5 commits into from
Feb 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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