Skip to content

Commit 16478fc

Browse files
author
Bytekeeper
committed
Fixed frameskip with value != -1 running potentially nonstop and using an invalid internal frame count
1 parent f89f248 commit 16478fc

File tree

3 files changed

+20
-20
lines changed

3 files changed

+20
-20
lines changed

src/jmh/java/org/bk/ass/SimulatorBenchmark.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import org.bk.ass.sim.BWAPI4JAgentFactory;
44
import org.bk.ass.sim.Simulator;
5-
import org.bk.ass.sim.Simulator.SimulatorBuilder;
5+
import org.bk.ass.sim.Simulator.Builder;
66
import org.openbw.bwapi4j.test.BWDataProvider;
77
import org.openbw.bwapi4j.type.UnitType;
88
import org.openjdk.jmh.annotations.*;
@@ -20,8 +20,8 @@ public static class MyState {
2020

2121
@Setup(Level.Invocation)
2222
public void setup() {
23-
simulator = new SimulatorBuilder().build();
24-
simulatorFS4 = new SimulatorBuilder().withFrameSkip(4).build();
23+
simulator = new Builder().build();
24+
simulatorFS4 = new Builder().withFrameSkip(4).build();
2525

2626
for (int i = 0; i < 30; i++) {
2727
simulator.addAgentA(factory.of(UnitType.Zerg_Mutalisk));

src/main/java/org/bk/ass/sim/Simulator.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,10 @@ public int simulate() {
123123
* Simulate the given number of frames. If negative, simulation will only stop if one party has no
124124
* agents left. If units decide to run away, this could be an endless loop - use with care!
125125
*
126-
* @return the actual number of frames simulated, usually the given number of frames
126+
* @return the number of frames left after simulating, usually 0
127127
*/
128128
public int simulate(int frames) {
129-
if (frames > 0) frames = (frames + frameSkip - 1) / frameSkip;
129+
if (frames > 0) frames += Math.floorMod(frameSkip - frames, frameSkip);
130130
while (frames != 0 && !playerA.isEmpty() && !playerB.isEmpty()) {
131131
frames -= frameSkip;
132132
if (!step()) {
@@ -342,24 +342,24 @@ public IntEvaluation subtract(IntEvaluation other) {
342342
}
343343
}
344344

345-
public static final class SimulatorBuilder {
345+
public static final class Builder {
346346
private Behavior playerABehavior = new RoleBasedBehavior();
347347
private Behavior playerBBehavior = new RoleBasedBehavior();
348348
private int frameSkip = 1;
349349

350-
public SimulatorBuilder() {}
350+
public Builder() {}
351351

352-
public SimulatorBuilder withPlayerABehavior(Behavior playerABehavior) {
352+
public Builder withPlayerABehavior(Behavior playerABehavior) {
353353
this.playerABehavior = playerABehavior;
354354
return this;
355355
}
356356

357-
public SimulatorBuilder withPlayerBBehavior(Behavior playerBBehavior) {
357+
public Builder withPlayerBBehavior(Behavior playerBBehavior) {
358358
this.playerBBehavior = playerBBehavior;
359359
return this;
360360
}
361361

362-
public SimulatorBuilder withFrameSkip(int frameSkip) {
362+
public Builder withFrameSkip(int frameSkip) {
363363
this.frameSkip = frameSkip;
364364
return this;
365365
}

src/test/java/org/bk/ass/sim/SimulatorTest.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.bk.ass.sim;
22

33
import org.bk.ass.PositionOutOfBoundsException;
4-
import org.bk.ass.sim.Simulator.SimulatorBuilder;
4+
import org.bk.ass.sim.Simulator.Builder;
55
import org.junit.jupiter.api.BeforeAll;
66
import org.junit.jupiter.api.Test;
77
import org.openbw.bwapi4j.test.BWDataProvider;
@@ -13,7 +13,7 @@
1313

1414
class SimulatorTest {
1515

16-
private Simulator simulator = new SimulatorBuilder().build();
16+
private Simulator simulator = new Builder().build();
1717
private BWAPI4JAgentFactory factory = new BWAPI4JAgentFactory(null);
1818

1919
@BeforeAll
@@ -108,7 +108,7 @@ void MMvsMM() {
108108
@Test
109109
void MMvsMM_FS4() {
110110
// GIVEN
111-
simulator = new SimulatorBuilder().withFrameSkip(4).build();
111+
simulator = new Builder().withFrameSkip(4).build();
112112
simulator.addAgentA(factory.of(UnitType.Terran_Marine));
113113
simulator.addAgentA(factory.of(UnitType.Terran_Marine));
114114
simulator.addAgentA(factory.of(UnitType.Terran_Marine));
@@ -657,7 +657,7 @@ void archonSplashShouldNotAffectOwnUnits() {
657657
@Test
658658
void goonShouldDieWhenRunningAwayFromScout() {
659659
// GIVEN
660-
simulator = new SimulatorBuilder().withPlayerABehavior(new RetreatBehavior()).build();
660+
simulator = new Builder().withPlayerABehavior(new RetreatBehavior()).build();
661661
simulator.addAgentA(factory.of(UnitType.Protoss_Dragoon).setX(500));
662662
simulator.addAgentB(factory.of(UnitType.Protoss_Scout).setX(495));
663663

@@ -704,7 +704,7 @@ void shouldResetCollisions() {
704704
@Test
705705
void shouldNotAttackStasisedUnitsNorBeAttackedByThem() {
706706
// GIVEN
707-
simulator = new SimulatorBuilder().build();
707+
simulator = new Builder().build();
708708
simulator.addAgentA(factory.of(UnitType.Terran_Goliath).setX(500).setStasised(true));
709709
simulator.addAgentB(factory.of(UnitType.Terran_Wraith).setX(495));
710710

@@ -719,7 +719,7 @@ void shouldNotAttackStasisedUnitsNorBeAttackedByThem() {
719719
@Test
720720
void shouldAttackLockeddownUnitsButDontBeAttackedByThem() {
721721
// GIVEN
722-
simulator = new SimulatorBuilder().build();
722+
simulator = new Builder().build();
723723
simulator.addAgentA(factory.of(UnitType.Terran_Goliath).setX(500).setLockeddown(true));
724724
simulator.addAgentB(factory.of(UnitType.Terran_Wraith).setX(495));
725725

@@ -734,7 +734,7 @@ void shouldAttackLockeddownUnitsButDontBeAttackedByThem() {
734734
@Test
735735
void shouldNotRepairStasisedUnit() {
736736
// GIVEN
737-
simulator = new SimulatorBuilder().build();
737+
simulator = new Builder().build();
738738
simulator.addAgentA(
739739
factory.of(UnitType.Terran_Goliath).setX(500).setStasised(true).setHealth(97));
740740
simulator.addAgentA(factory.of(UnitType.Terran_SCV).setX(500));
@@ -749,7 +749,7 @@ void shouldNotRepairStasisedUnit() {
749749
@Test
750750
void shouldRepairLockeddownUnit() {
751751
// GIVEN
752-
simulator = new SimulatorBuilder().build();
752+
simulator = new Builder().build();
753753
simulator.addAgentA(
754754
factory.of(UnitType.Terran_Goliath).setX(500).setLockeddown(true).setHealth(97));
755755
simulator.addAgentA(factory.of(UnitType.Terran_SCV).setX(500));
@@ -897,7 +897,7 @@ void reaverVs12Lings() {
897897
@Test
898898
void lingsVsZealots_FS3() {
899899
// GIVEN
900-
simulator = new SimulatorBuilder().withFrameSkip(3).build();
900+
simulator = new Builder().withFrameSkip(3).build();
901901
simulator.addAgentA(factory.of(UnitType.Protoss_Zealot));
902902
simulator.addAgentA(factory.of(UnitType.Protoss_Zealot));
903903

@@ -908,7 +908,7 @@ void lingsVsZealots_FS3() {
908908
simulator.addAgentB(factory.of(UnitType.Zerg_Zergling));
909909

910910
// WHEN
911-
simulator.simulate(-1);
911+
simulator.simulate(250);
912912

913913
// THEN
914914
assertThat(simulator.getAgentsA()).size().isOne();

0 commit comments

Comments
 (0)