Set IPT instruction
This commit is contained in:
@@ -3543,7 +3543,7 @@ public class Blocks{
|
|||||||
requirements(Category.units, with(Items.graphite, 600, Items.beryllium, 600, Items.oxide, 250, Items.tungsten, 400, Items.silicon, 500));
|
requirements(Category.units, with(Items.graphite, 600, Items.beryllium, 600, Items.oxide, 250, Items.tungsten, 400, Items.silicon, 500));
|
||||||
size = 5;
|
size = 5;
|
||||||
//TODO remove ducts and crushers, replace with 2-3 high cost special blocks with silicon requirements
|
//TODO remove ducts and crushers, replace with 2-3 high cost special blocks with silicon requirements
|
||||||
plans.add(new AssemblerUnitPlan(UnitTypes.vanquish, 60f * 50f, BlockStack.list(Blocks.tungstenWallLarge, 12, Blocks.duct, 14, Blocks.cliffCrusher, 12)));
|
plans.add(new AssemblerUnitPlan(UnitTypes.vanquish, 60f * 50f, BlockStack.list(Blocks.tungstenWallLarge, 12, Blocks.cliffCrusher, 12)));
|
||||||
consumes.power(3f);
|
consumes.power(3f);
|
||||||
areaSize = 13;
|
areaSize = 13;
|
||||||
researchCostMultiplier = 0.4f;
|
researchCostMultiplier = 0.4f;
|
||||||
@@ -3555,7 +3555,7 @@ public class Blocks{
|
|||||||
shipAssembler = new UnitAssembler("ship-assembler"){{
|
shipAssembler = new UnitAssembler("ship-assembler"){{
|
||||||
requirements(Category.units, with(Items.beryllium, 700, Items.oxide, 300, Items.tungsten, 500, Items.silicon, 800));
|
requirements(Category.units, with(Items.beryllium, 700, Items.oxide, 300, Items.tungsten, 500, Items.silicon, 800));
|
||||||
size = 5;
|
size = 5;
|
||||||
plans.add(new AssemblerUnitPlan(UnitTypes.quell, 60f * 60f, BlockStack.list(Blocks.berylliumWallLarge, 12, Blocks.duct, 20, Blocks.plasmaBore, 8)));
|
plans.add(new AssemblerUnitPlan(UnitTypes.quell, 60f * 60f, BlockStack.list(Blocks.berylliumWallLarge, 12, Blocks.plasmaBore, 8)));
|
||||||
consumes.power(3f);
|
consumes.power(3f);
|
||||||
areaSize = 13;
|
areaSize = 13;
|
||||||
|
|
||||||
@@ -3566,7 +3566,7 @@ public class Blocks{
|
|||||||
mechAssembler = new UnitAssembler("mech-assembler"){{
|
mechAssembler = new UnitAssembler("mech-assembler"){{
|
||||||
requirements(Category.units, with(Items.graphite, 500, Items.carbide, 600, Items.oxide, 200, Items.tungsten, 500, Items.silicon, 900));
|
requirements(Category.units, with(Items.graphite, 500, Items.carbide, 600, Items.oxide, 200, Items.tungsten, 500, Items.silicon, 900));
|
||||||
size = 5;
|
size = 5;
|
||||||
plans.add(new AssemblerUnitPlan(UnitTypes.bulwark, 60f * 60f, BlockStack.list(Blocks.tungstenWallLarge, 5, Blocks.duct, 2)));
|
plans.add(new AssemblerUnitPlan(UnitTypes.bulwark, 60f * 60f, BlockStack.list(Blocks.tungstenWallLarge, 5)));
|
||||||
consumes.power(3f);
|
consumes.power(3f);
|
||||||
areaSize = 13;
|
areaSize = 13;
|
||||||
|
|
||||||
@@ -3860,12 +3860,12 @@ public class Blocks{
|
|||||||
worldProcessor = new LogicBlock("world-processor"){{
|
worldProcessor = new LogicBlock("world-processor"){{
|
||||||
requirements(Category.logic, BuildVisibility.editorOnly, with());
|
requirements(Category.logic, BuildVisibility.editorOnly, with());
|
||||||
|
|
||||||
//TODO customizable IPT
|
|
||||||
targetable = false;
|
targetable = false;
|
||||||
instructionsPerTick = 8;
|
instructionsPerTick = 8;
|
||||||
forceDark = true;
|
forceDark = true;
|
||||||
privileged = true;
|
privileged = true;
|
||||||
size = 1;
|
size = 1;
|
||||||
|
maxInstructionsPerTick = 30;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
worldCell = new MemoryBlock("world-cell"){{
|
worldCell = new MemoryBlock("world-cell"){{
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import mindustry.type.*;
|
|||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
import mindustry.world.blocks.environment.*;
|
import mindustry.world.blocks.environment.*;
|
||||||
import mindustry.world.blocks.logic.*;
|
import mindustry.world.blocks.logic.*;
|
||||||
|
import mindustry.world.blocks.logic.LogicBlock.*;
|
||||||
import mindustry.world.blocks.logic.LogicDisplay.*;
|
import mindustry.world.blocks.logic.LogicDisplay.*;
|
||||||
import mindustry.world.blocks.logic.MemoryBlock.*;
|
import mindustry.world.blocks.logic.MemoryBlock.*;
|
||||||
import mindustry.world.blocks.logic.MessageBlock.*;
|
import mindustry.world.blocks.logic.MessageBlock.*;
|
||||||
@@ -46,9 +47,11 @@ public class LExecutor{
|
|||||||
public Var counter;
|
public Var counter;
|
||||||
public int[] binds;
|
public int[] binds;
|
||||||
|
|
||||||
|
public int iptIndex = -1;
|
||||||
public LongSeq graphicsBuffer = new LongSeq();
|
public LongSeq graphicsBuffer = new LongSeq();
|
||||||
public StringBuilder textBuffer = new StringBuilder();
|
public StringBuilder textBuffer = new StringBuilder();
|
||||||
public Building[] links = {};
|
public Building[] links = {};
|
||||||
|
public @Nullable LogicBuild build;
|
||||||
public IntSet linkIds = new IntSet();
|
public IntSet linkIds = new IntSet();
|
||||||
public Team team = Team.derelict;
|
public Team team = Team.derelict;
|
||||||
public boolean privileged = false;
|
public boolean privileged = false;
|
||||||
@@ -73,10 +76,14 @@ public class LExecutor{
|
|||||||
public void load(LAssembler builder){
|
public void load(LAssembler builder){
|
||||||
vars = new Var[builder.vars.size];
|
vars = new Var[builder.vars.size];
|
||||||
instructions = builder.instructions;
|
instructions = builder.instructions;
|
||||||
|
iptIndex = -1;
|
||||||
|
|
||||||
builder.vars.each((name, var) -> {
|
builder.vars.each((name, var) -> {
|
||||||
Var dest = new Var(name);
|
Var dest = new Var(name);
|
||||||
vars[var.id] = dest;
|
vars[var.id] = dest;
|
||||||
|
if(dest.name.equals("@ipt")){
|
||||||
|
iptIndex = var.id;
|
||||||
|
}
|
||||||
|
|
||||||
dest.constant = var.constant;
|
dest.constant = var.constant;
|
||||||
|
|
||||||
@@ -1364,5 +1371,26 @@ public class LExecutor{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class SetRateI implements LInstruction{
|
||||||
|
public int amount;
|
||||||
|
|
||||||
|
public SetRateI(int amount){
|
||||||
|
this.amount = amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SetRateI(){
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run(LExecutor exec){
|
||||||
|
if(exec.build != null && exec.build.block.privileged){
|
||||||
|
exec.build.ipt = Mathf.clamp(exec.numi(amount), 1, ((LogicBlock)exec.build.block).maxInstructionsPerTick);
|
||||||
|
if(exec.iptIndex >= 0 && exec.vars.length > exec.iptIndex){
|
||||||
|
exec.vars[exec.iptIndex].numval = exec.build.ipt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1403,4 +1403,29 @@ public class LStatements{
|
|||||||
return new ExplosionI(b.var(team), b.var(x), b.var(y), b.var(radius), b.var(damage), b.var(air), b.var(ground), b.var(pierce));
|
return new ExplosionI(b.var(team), b.var(x), b.var(y), b.var(radius), b.var(damage), b.var(air), b.var(ground), b.var(pierce));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RegisterStatement("setrate")
|
||||||
|
public static class SetRateStatement extends LStatement{
|
||||||
|
public String amount = "10";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void build(Table table){
|
||||||
|
fields(table, "ipt = ", amount, str -> amount = str);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean privileged(){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Color color(){
|
||||||
|
return Pal.logicWorld;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LInstruction build(LAssembler builder){
|
||||||
|
return new SetRateI(builder.var(amount));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ public class LogicBlock extends Block{
|
|||||||
|
|
||||||
public int maxInstructionScale = 5;
|
public int maxInstructionScale = 5;
|
||||||
public int instructionsPerTick = 1;
|
public int instructionsPerTick = 1;
|
||||||
|
//privileged only
|
||||||
|
public int maxInstructionsPerTick = 40;
|
||||||
public float range = 8 * 10;
|
public float range = 8 * 10;
|
||||||
|
|
||||||
public LogicBlock(String name){
|
public LogicBlock(String name){
|
||||||
@@ -220,12 +222,15 @@ public class LogicBlock extends Block{
|
|||||||
public float accumulator = 0;
|
public float accumulator = 0;
|
||||||
public Seq<LogicLink> links = new Seq<>();
|
public Seq<LogicLink> links = new Seq<>();
|
||||||
public boolean checkedDuplicates = false;
|
public boolean checkedDuplicates = false;
|
||||||
|
//dynamic only for privileged processors
|
||||||
|
public int ipt = instructionsPerTick;
|
||||||
|
|
||||||
/** Block of code to run after load. */
|
/** Block of code to run after load. */
|
||||||
public @Nullable Runnable loadBlock;
|
public @Nullable Runnable loadBlock;
|
||||||
|
|
||||||
{
|
{
|
||||||
executor.privileged = privileged;
|
executor.privileged = privileged;
|
||||||
|
executor.build = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void readCompressed(byte[] data, boolean relative){
|
public void readCompressed(byte[] data, boolean relative){
|
||||||
@@ -474,10 +479,14 @@ public class LogicBlock extends Block{
|
|||||||
updateCode(code, true, null);
|
updateCode(code, true, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(enabled && executor.initialized()){
|
if(!privileged){
|
||||||
accumulator += edelta() * instructionsPerTick * (consValid() ? 1 : 0);
|
ipt = instructionsPerTick;
|
||||||
|
}
|
||||||
|
|
||||||
if(accumulator > maxInstructionScale * instructionsPerTick) accumulator = maxInstructionScale * instructionsPerTick;
|
if(enabled && executor.initialized()){
|
||||||
|
accumulator += edelta() * ipt * (consValid() ? 1 : 0);
|
||||||
|
|
||||||
|
if(accumulator > maxInstructionScale * ipt) accumulator = maxInstructionScale * ipt;
|
||||||
|
|
||||||
for(int i = 0; i < (int)accumulator; i++){
|
for(int i = 0; i < (int)accumulator; i++){
|
||||||
executor.runOnce();
|
executor.runOnce();
|
||||||
@@ -567,7 +576,7 @@ public class LogicBlock extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte version(){
|
public byte version(){
|
||||||
return 1;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -600,13 +609,17 @@ public class LogicBlock extends Block{
|
|||||||
|
|
||||||
//no memory
|
//no memory
|
||||||
write.i(0);
|
write.i(0);
|
||||||
|
|
||||||
|
if(privileged){
|
||||||
|
write.s(ipt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void read(Reads read, byte revision){
|
public void read(Reads read, byte revision){
|
||||||
super.read(read, revision);
|
super.read(read, revision);
|
||||||
|
|
||||||
if(revision == 1){
|
if(revision >= 1){
|
||||||
int compl = read.i();
|
int compl = read.i();
|
||||||
byte[] bytes = new byte[compl];
|
byte[] bytes = new byte[compl];
|
||||||
read.b(bytes);
|
read.b(bytes);
|
||||||
@@ -652,6 +665,10 @@ public class LogicBlock extends Block{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if(privileged && revision >= 2){
|
||||||
|
ipt = Math.max(read.s(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user