Skip to content

Commit 210aa73

Browse files
author
Bytekeeper
committed
Fixed death handling: Spawn marines at bunker location
1 parent 64485d2 commit 210aa73

File tree

7 files changed

+117
-29
lines changed

7 files changed

+117
-29
lines changed

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@
77
import java.util.Collection;
88
import java.util.Collections;
99
import java.util.List;
10-
import java.util.function.BiConsumer;
10+
import java.util.function.Consumer;
1111

1212
public class Agent {
13-
static final BiConsumer<Agent, Collection<Agent>> CARRIER_DEATH_HANDLER =
14-
(carrier, agents) -> agents.removeAll(carrier.interceptors);
13+
14+
static final Consumer<UnitDeathContext> CARRIER_DEATH_HANDLER =
15+
context -> {
16+
Agent carrier = context.deadUnit;
17+
context.removeAgents(carrier.interceptors);
18+
};
1519
// Retrieved from OpenBW
1620
private static final int STIM_TIMER = 37;
1721
private static final int STIM_HEALTH_COST_SHIFTED = 10 << 8;
@@ -100,7 +104,8 @@ public class Agent {
100104
List<Agent> interceptors = Collections.emptyList();
101105

102106
// Allow replacement of units on death (for example bunker -> marines)
103-
BiConsumer<Agent, Collection<Agent>> onDeathHandler = (ignored1, ignored2) -> {};
107+
Consumer<UnitDeathContext> onDeathHandler = (ignored1) -> {
108+
};
104109

105110
public Agent(String name) {
106111
this.name = name;
@@ -419,7 +424,7 @@ public Agent setSize(UnitSize size) {
419424
return this;
420425
}
421426

422-
public Agent setOnDeathHandler(BiConsumer<Agent, Collection<Agent>> onDeathHandler) {
427+
public Agent setOnDeathHandler(Consumer<UnitDeathContext> onDeathHandler) {
423428
this.onDeathHandler = onDeathHandler;
424429
return this;
425430
}

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

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

33
import static org.bk.ass.sim.Agent.CARRIER_DEATH_HANDLER;
44

5-
import java.util.Collection;
65
import java.util.EnumSet;
7-
import java.util.function.BiConsumer;
6+
import java.util.function.Consumer;
87
import org.bk.ass.info.BWAPI4JUnitInfo;
98
import org.openbw.bwapi4j.BWMap;
109
import org.openbw.bwapi4j.Player;
@@ -34,13 +33,13 @@ public class BWAPI4JAgentFactory {
3433
UnitType.Terran_Marine, UnitType.Terran_Vulture,
3534
UnitType.Zerg_Mutalisk, UnitType.Protoss_Dragoon);
3635

37-
private BiConsumer<Agent, Collection<Agent>> bunkerDeathHandler =
38-
(bunker, agents) -> {
39-
// TODO: Fix collision map not being updated here
40-
agents.add(of(UnitType.Terran_Marine));
41-
agents.add(of(UnitType.Terran_Marine));
42-
agents.add(of(UnitType.Terran_Marine));
43-
agents.add(of(UnitType.Terran_Marine));
36+
private final Consumer<UnitDeathContext> bunkerDeathHandler =
37+
context -> {
38+
Agent bunker = context.deadUnit;
39+
context.addAgent(of(UnitType.Terran_Marine).setX(bunker.x).setY(bunker.y));
40+
context.addAgent(of(UnitType.Terran_Marine).setX(bunker.x).setY(bunker.y));
41+
context.addAgent(of(UnitType.Terran_Marine).setX(bunker.x).setY(bunker.y));
42+
context.addAgent(of(UnitType.Terran_Marine).setX(bunker.x).setY(bunker.y));
4443
};
4544

4645
private final BWMap map;

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public String toString() {
2525
};
2626
private final Parameters parameters;
2727
private SplittableRandom prng = new SplittableRandom();
28+
private EvaluatorDeathContext deathContext = new EvaluatorDeathContext();
2829

2930
public Evaluator(Parameters parameters) {
3031
this.parameters = parameters;
@@ -40,9 +41,17 @@ public Evaluator() {
4041
*/
4142
public EvaluationResult evaluate(Collection<Agent> agentsA, Collection<Agent> agentsB) {
4243
List<Agent> finalAgentsA = new ArrayList<>();
43-
agentsA.forEach(a -> a.onDeathHandler.accept(a, finalAgentsA));
44+
deathContext.target = finalAgentsA;
45+
agentsA.forEach(a -> {
46+
deathContext.deadUnit = a;
47+
a.onDeathHandler.accept(deathContext);
48+
});
4449
List<Agent> finalAgentsB = new ArrayList<>();
45-
agentsB.forEach(a -> a.onDeathHandler.accept(a, finalAgentsB));
50+
deathContext.target = finalAgentsB;
51+
agentsB.forEach(a -> {
52+
deathContext.deadUnit = a;
53+
a.onDeathHandler.accept(deathContext);
54+
});
4655
finalAgentsA.addAll(agentsA);
4756
finalAgentsA.forEach(Agent::updateSpeed);
4857
finalAgentsB.addAll(agentsB);
@@ -296,6 +305,21 @@ public EvalWithAgents(double eval, List<Agent> agents) {
296305
}
297306
}
298307

308+
private static final class EvaluatorDeathContext extends UnitDeathContext {
309+
310+
Collection<Agent> target;
311+
312+
@Override
313+
public void addAgent(Agent agent) {
314+
target.add(agent);
315+
}
316+
317+
@Override
318+
public void removeAgents(List<Agent> agents) {
319+
throw new UnsupportedOperationException();
320+
}
321+
}
322+
299323
public static class Parameters {
300324

301325
final double shieldScale;

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@
1313
import bwapi.UnitType;
1414
import bwapi.UpgradeType;
1515
import bwapi.WeaponType;
16-
import java.util.Collection;
1716
import java.util.EnumSet;
1817
import java.util.Set;
19-
import java.util.function.BiConsumer;
18+
import java.util.function.Consumer;
2019
import org.bk.ass.info.BWMirrorUnitInfo;
2120

2221
/**
@@ -38,13 +37,13 @@ public class JBWAPIAgentFactory {
3837
UnitType.Zerg_Mutalisk,
3938
UnitType.Protoss_Dragoon);
4039

41-
private BiConsumer<Agent, Collection<Agent>> bunkerReplacer =
42-
(bunker, agents) -> {
43-
// TODO: Fix collision map not being updated here
44-
agents.add(of(UnitType.Terran_Marine));
45-
agents.add(of(UnitType.Terran_Marine));
46-
agents.add(of(UnitType.Terran_Marine));
47-
agents.add(of(UnitType.Terran_Marine));
40+
private Consumer<UnitDeathContext> bunkerReplacer =
41+
context -> {
42+
Agent bunker = context.deadUnit;
43+
context.addAgent(of(UnitType.Terran_Marine).setX(bunker.x).setY(bunker.y));
44+
context.addAgent(of(UnitType.Terran_Marine).setX(bunker.x).setY(bunker.y));
45+
context.addAgent(of(UnitType.Terran_Marine).setX(bunker.x).setY(bunker.y));
46+
context.addAgent(of(UnitType.Terran_Marine).setX(bunker.x).setY(bunker.y));
4847
};
4948

5049
private final Game game;

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

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

33
import java.util.Collection;
44
import java.util.Collections;
5+
import java.util.List;
56
import java.util.Objects;
67
import java.util.function.ToIntFunction;
78
import org.bk.ass.PositionOutOfBoundsException;
@@ -40,6 +41,7 @@ public class Simulator {
4041
private final Behavior playerABehavior;
4142
private final Behavior playerBBehavior;
4243
private final int frameSkip;
44+
private final SimulatorDeathContext deathContext = new SimulatorDeathContext();
4345

4446
private Simulator(int frameSkip, Behavior playerABehavior, Behavior playerBBehavior) {
4547
if (frameSkip < 1) throw new IllegalArgumentException("frameSkip must be >= 1");
@@ -216,8 +218,12 @@ private void removeDead(UnorderedCollection<Agent> agents) {
216218
while (i < agents.size()) {
217219
if (agents.get(i).healthShifted < 1) {
218220
Agent agent = agents.removeAt(i);
219-
if (!agent.isFlyer) collision[colindex(agent.x, agent.y)]--;
220-
agent.onDeathHandler.accept(agent, agents);
221+
if (!agent.isFlyer) {
222+
collision[colindex(agent.x, agent.y)]--;
223+
}
224+
deathContext.deadUnit = agent;
225+
deathContext.myUnits = agents;
226+
agent.onDeathHandler.accept(deathContext);
221227
} else {
222228
i++;
223229
}
@@ -369,4 +375,42 @@ public Simulator build() {
369375
return new Simulator(frameSkip, playerABehavior, playerBBehavior);
370376
}
371377
}
378+
379+
/**
380+
* Context for death handlers
381+
*/
382+
public final class SimulatorDeathContext extends UnitDeathContext {
383+
384+
Collection<Agent> myUnits;
385+
386+
public Collection<Agent> getMyUnits() {
387+
return myUnits;
388+
}
389+
390+
/**
391+
* Adds the given agent to "our" agents. <em>Do not modify the position after adding it
392+
* here!</em>
393+
*/
394+
@Override
395+
public void addAgent(Agent agent) {
396+
agent.x = agent.nx;
397+
agent.y = agent.ny;
398+
myUnits.add(agent);
399+
checkBounds(agent);
400+
if (!agent.isFlyer) {
401+
collision[colindex(agent.x, agent.y)]++;
402+
}
403+
}
404+
405+
@Override
406+
public void removeAgents(List<Agent> agents) {
407+
for (int i = 0; i < agents.size(); i++) {
408+
Agent a = agents.get(i);
409+
if (!a.isFlyer) {
410+
collision[colindex(a.x, a.y)]--;
411+
}
412+
myUnits.remove(a);
413+
}
414+
}
415+
}
372416
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.bk.ass.sim;
2+
3+
import java.util.List;
4+
5+
public abstract class UnitDeathContext {
6+
7+
Agent deadUnit;
8+
9+
public Agent getDeadUnit() {
10+
return deadUnit;
11+
}
12+
13+
14+
abstract void addAgent(Agent agent);
15+
16+
public abstract void removeAgents(List<Agent> agents);
17+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,9 +471,9 @@ void _6MutaVs1BunkerAnd4SCVs() {
471471
void _5MutaVs1Bunker() {
472472
// GIVEN
473473
for (int i = 0; i < 5; i++) {
474-
simulator.addAgentA(factory.of(UnitType.Zerg_Mutalisk));
474+
simulator.addAgentA(factory.of(UnitType.Zerg_Mutalisk).setX(1000));
475475
}
476-
simulator.addAgentB(factory.of(UnitType.Terran_Bunker));
476+
simulator.addAgentB(factory.of(UnitType.Terran_Bunker).setX(1100));
477477

478478
// WHEN
479479
simulator.simulate(-1);

0 commit comments

Comments
 (0)