More control over wave sending (#7442)

* Wave send rule

* Send natural wave command

* Use a boolean

* boolean selection

* Revert "boolean selection"

This reverts commit 01e7a8f0e0.

* Natural wave last

* I don't see why it wouldn't
This commit is contained in:
MEEPofFaith
2022-09-07 15:54:26 -07:00
committed by GitHub
parent 687bc11e54
commit 31149c08ea
7 changed files with 26 additions and 11 deletions

View File

@@ -1153,6 +1153,7 @@ rules.coreincinerates = Core Incinerates Overflow
rules.disableworldprocessors = Disable World Processors rules.disableworldprocessors = Disable World Processors
rules.schematic = Schematics Allowed rules.schematic = Schematics Allowed
rules.wavetimer = Wave Timer rules.wavetimer = Wave Timer
rules.wavesending = Wave Sending
rules.waves = Waves rules.waves = Waves
rules.attack = Attack Mode rules.attack = Attack Mode
rules.rtsai = RTS AI rules.rtsai = RTS AI
@@ -2114,7 +2115,7 @@ lst.getblock = Get tile data at any location.
lst.setblock = Set tile data at any location. lst.setblock = Set tile data at any location.
lst.spawnunit = Spawn unit at a location. lst.spawnunit = Spawn unit at a location.
lst.applystatus = Apply or clear a status effect from a unit. lst.applystatus = Apply or clear a status effect from a unit.
lst.spawnwave = Simulate a wave being spawned at an arbitrary location.\nWill not increment the wave counter. lst.spawnwave = Spawn a wave.
lst.explosion = Create an explosion at a location. lst.explosion = Create an explosion at a location.
lst.setrate = Set processor execution speed in instructions/tick. lst.setrate = Set processor execution speed in instructions/tick.
lst.fetch = Lookup units, cores, players or buildings by index.\nIndices start at 0 and end at their returned count. lst.fetch = Lookup units, cores, players or buildings by index.\nIndices start at 0 and end at their returned count.

View File

@@ -25,6 +25,8 @@ public class Rules{
public TeamRules teams = new TeamRules(); public TeamRules teams = new TeamRules();
/** Whether the waves come automatically on a timer. If not, waves come when the play button is pressed. */ /** Whether the waves come automatically on a timer. If not, waves come when the play button is pressed. */
public boolean waveTimer = true; public boolean waveTimer = true;
/** Whether the waves can be manually summoned with the play button. */
public boolean waveSending = true;
/** Whether waves are spawnable at all. */ /** Whether waves are spawnable at all. */
public boolean waves; public boolean waves;
/** Whether the game objective is PvP. Note that this enables automatic hosting. */ /** Whether the game objective is PvP. Note that this enables automatic hosting. */

View File

@@ -1409,6 +1409,7 @@ public class LExecutor{
case wave -> state.wave = exec.numi(value); case wave -> state.wave = exec.numi(value);
case currentWaveTime -> state.wavetime = exec.numf(value) * 60f; case currentWaveTime -> state.wavetime = exec.numf(value) * 60f;
case waves -> state.rules.waves = exec.bool(value); case waves -> state.rules.waves = exec.bool(value);
case waveSending -> state.rules.waveSending = exec.bool(value);
case attackMode -> state.rules.attackMode = exec.bool(value); case attackMode -> state.rules.attackMode = exec.bool(value);
case waveSpacing -> state.rules.waveSpacing = exec.numf(value) * 60f; case waveSpacing -> state.rules.waveSpacing = exec.numf(value) * 60f;
case enemyCoreBuildRadius -> state.rules.enemyCoreBuildRadius = exec.numf(value) * 8f; case enemyCoreBuildRadius -> state.rules.enemyCoreBuildRadius = exec.numf(value) * 8f;
@@ -1641,12 +1642,14 @@ public class LExecutor{
} }
public static class SpawnWaveI implements LInstruction{ public static class SpawnWaveI implements LInstruction{
public int natural;
public int x, y; public int x, y;
public SpawnWaveI(){ public SpawnWaveI(){
} }
public SpawnWaveI(int x, int y){ public SpawnWaveI(int natural, int x, int y){
this.natural = natural;
this.x = x; this.x = x;
this.y = y; this.y = y;
} }
@@ -1655,9 +1658,14 @@ public class LExecutor{
public void run(LExecutor exec){ public void run(LExecutor exec){
if(net.client()) return; if(net.client()) return;
if(exec.bool(natural)){
logic.skipWave();
return;
}
float float
spawnX = World.unconv(exec.numf(x)), spawnX = World.unconv(exec.numf(x)),
spawnY = World.unconv(exec.numf(y)); spawnY = World.unconv(exec.numf(y));
int packed = Point2.pack(exec.numi(x), exec.numi(y)); int packed = Point2.pack(exec.numi(x), exec.numi(y));
for(SpawnGroup group : state.rules.spawns){ for(SpawnGroup group : state.rules.spawns){

View File

@@ -1309,16 +1309,18 @@ public class LStatements{
@RegisterStatement("spawnwave") @RegisterStatement("spawnwave")
public static class SpawnWaveStatement extends LStatement{ public static class SpawnWaveStatement extends LStatement{
public String x = "10", y = "10"; public String x = "10", y = "10", natural = "false";
@Override @Override
public void build(Table table){ public void build(Table table){
table.add("natural ");
fields(table, natural, str -> natural = str);
table.add("x "); table.add("x ").visible(() -> natural.equals("false"));
fields(table, x, str -> x = str); fields(table, x, str -> x = str).visible(() -> natural.equals("false"));
table.add(" y "); table.add(" y ").visible(() -> natural.equals("false"));
fields(table, y, str -> y = str); fields(table, y, str -> y = str).visible(() -> natural.equals("false"));
} }
@Override @Override
@@ -1328,7 +1330,7 @@ public class LStatements{
@Override @Override
public LInstruction build(LAssembler builder){ public LInstruction build(LAssembler builder){
return new SpawnWaveI(builder.var(x), builder.var(y)); return new SpawnWaveI(builder.var(natural), builder.var(x), builder.var(y));
} }
@Override @Override

View File

@@ -6,6 +6,7 @@ public enum LogicRule{
waves, waves,
wave, wave,
waveSpacing, waveSpacing,
waveSending,
attackMode, attackMode,
enemyCoreBuildRadius, enemyCoreBuildRadius,
dropZoneRadius, dropZoneRadius,

View File

@@ -139,6 +139,7 @@ public class CustomRulesDialog extends BaseDialog{
title("@rules.title.waves"); title("@rules.title.waves");
check("@rules.waves", b -> rules.waves = b, () -> rules.waves); check("@rules.waves", b -> rules.waves = b, () -> rules.waves);
check("@rules.wavetimer", b -> rules.waveTimer = b, () -> rules.waveTimer); check("@rules.wavetimer", b -> rules.waveTimer = b, () -> rules.waveTimer);
check("@rules.wavesending", b -> rules.waveSending = b, () -> rules.waveSending);
check("@rules.waitForWaveToEnd", b -> rules.waitEnemies = b, () -> rules.waitEnemies); check("@rules.waitForWaveToEnd", b -> rules.waitEnemies = b, () -> rules.waitEnemies);
number("@rules.wavespacing", false, f -> rules.waveSpacing = f * 60f, () -> rules.waveSpacing / 60f, () -> rules.waveTimer, 1, Float.MAX_VALUE); number("@rules.wavespacing", false, f -> rules.waveSpacing = f * 60f, () -> rules.waveSpacing / 60f, () -> rules.waveTimer, 1, Float.MAX_VALUE);
//this is experimental, because it's not clear that 0 makes it default. //this is experimental, because it's not clear that 0 makes it default.

View File

@@ -908,7 +908,7 @@ public class HudFragment{
} }
private boolean canSkipWave(){ private boolean canSkipWave(){
return state.rules.waves && ((net.server() || player.admin) || !net.active()) && state.enemies == 0 && !spawner.isSpawning(); return state.rules.waves && state.rules.waveSending && ((net.server() || player.admin) || !net.active()) && state.enemies == 0 && !spawner.isSpawning();
} }
} }