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:
@@ -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.
|
||||||
|
|||||||
@@ -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. */
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ public enum LogicRule{
|
|||||||
waves,
|
waves,
|
||||||
wave,
|
wave,
|
||||||
waveSpacing,
|
waveSpacing,
|
||||||
|
waveSending,
|
||||||
attackMode,
|
attackMode,
|
||||||
enemyCoreBuildRadius,
|
enemyCoreBuildRadius,
|
||||||
dropZoneRadius,
|
dropZoneRadius,
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user