Skip to content

Commit 4837c40

Browse files
authored
Merge branch 'develop' into develop
2 parents 9b27727 + 6b05f82 commit 4837c40

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+104
-47
lines changed

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
- docker exec app pip install --upgrade pipenv
3131
# Create pipenv virtual environment and install dev packages for testing
3232
# Command origins from here: https://stackoverflow.com/a/28037991/10882657
33-
- docker exec -i app bash -c "cd /root/template && pipenv install --dev"
33+
- docker exec -i app bash -c "cd /root/template && pipenv install --dev --python 3.7"
3434
# Run tests
3535
- docker exec -i app bash -c "cd /root/template && pipenv run pytest test/"
3636
# Shut down and remove container
@@ -43,7 +43,7 @@ jobs:
4343
- docker run -it -d --name app python:3.8-rc-slim
4444
- docker cp . app:/root/template
4545
- docker exec app pip install --upgrade pipenv
46-
- docker exec -i app bash -c "cd /root/template && pipenv --python python install --dev"
46+
- docker exec -i app bash -c "cd /root/template && pipenv --python python install --dev --python 3.8"
4747
- docker exec -i app bash -c "cd /root/template && pipenv run pytest test/"
4848
- docker rm -f app
4949

examples/terran/ramp_wall.py

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,30 +43,36 @@ async def on_step(self, iteration):
4343
# Uncomment the following if you want to build 3 supplydepots in the wall instead of a barracks in the middle + 2 depots in the corner
4444
# depot_placement_positions = self.main_base_ramp.corner_depots | {self.main_base_ramp.depot_in_middle}
4545

46-
barracks_placement_position = None
4746
barracks_placement_position = self.main_base_ramp.barracks_correct_placement
4847
# If you prefer to have the barracks in the middle without room for addons, use the following instead
4948
# barracks_placement_position = self.main_base_ramp.barracks_in_middle
5049

5150
depots = self.units(SUPPLYDEPOT) | self.units(SUPPLYDEPOTLOWERED)
5251

5352
# Draw ramp points
54-
# def terrain_to_z_height(h):
55-
# return round(16 * h / 255, 2)
56-
57-
# for ramp in self.game_info.map_ramps:
58-
# for p in ramp.points:
59-
# h = self.get_terrain_height(p)
60-
# h2 = terrain_to_z_height(h)
61-
# pos = Point3((p.x, p.y, h2))
62-
# p0 = Point3((pos.x - 0.25, pos.y - 0.25, pos.z))
63-
# p1 = Point3((pos.x + 0.25, pos.y + 0.25, pos.z - 0.5))
64-
# print(f"drawing {p0} to {p1}")
65-
# self._client.debug_box_out(p0, p1, color=Point3((255, 0, 0)))
66-
#
67-
# await self._client.send_debug()
68-
69-
# Filter locations close to finished supply depots
53+
def terrain_to_z_height(h):
54+
return round(16 * h / 255, 2)
55+
56+
for ramp in self.game_info.map_ramps:
57+
for p in ramp.points:
58+
h = self.get_terrain_height(p)
59+
h2 = terrain_to_z_height(h)
60+
pos = Point3((p.x, p.y, h2))
61+
p0 = Point3((pos.x - 0.25, pos.y - 0.25, pos.z))
62+
p1 = Point3((pos.x + 0.25, pos.y + 0.25, pos.z - 0.5))
63+
# print(f"Drawing {p0} to {p1}")
64+
color=Point3((255, 0, 0))
65+
if p in ramp.upper:
66+
color = Point3((0, 255, 0))
67+
if p in ramp.upper2_for_ramp_wall:
68+
color = Point3((0, 255, 255))
69+
if p in ramp.lower:
70+
color = Point3((0, 0, 255))
71+
self._client.debug_box_out(p0, p1, color=color)
72+
73+
await self._client.send_debug()
74+
75+
# # Filter locations close to finished supply depots
7076
if depots:
7177
depot_placement_positions = {d for d in depot_placement_positions if depots.closest_distance_to(d) > 1}
7278

@@ -82,7 +88,7 @@ async def on_step(self, iteration):
8288
await self.do(w.build(SUPPLYDEPOT, target_depot_location))
8389

8490
# Build barracks
85-
if depots.ready.exists and self.can_afford(BARRACKS) and not self.already_pending(BARRACKS):
91+
if depots.ready and self.can_afford(BARRACKS) and not self.already_pending(BARRACKS):
8692
if self.units(BARRACKS).amount + self.already_pending(BARRACKS) > 0:
8793
return
8894
ws = self.workers.gathering
@@ -108,6 +114,7 @@ def main():
108114
"DarknessSanctuaryLE",
109115
"ParaSiteLE", # Has 5 upper points at the main ramp
110116
"AcolyteLE", # Has 4 upper points at the ramp to the in-base natural and 2 upper points at the small ramp
117+
"HonorgroundsLE", # Has 4 or 9 upper points at the large main base ramp
111118
]
112119
)
113120
sc2.run_game(

sc2/game_info.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,10 @@ def bottom_center(self) -> Point2:
9292
return pos
9393

9494
@property_immutable_cache
95-
def barracks_in_middle(self) -> Point2:
95+
def barracks_in_middle(self) -> Optional[Point2]:
9696
""" Barracks position in the middle of the 2 depots """
97+
if len(self.upper) not in {2, 5}:
98+
return None
9799
if len(self.upper2_for_ramp_wall) == 2:
98100
points = self.upper2_for_ramp_wall
99101
p1 = points.pop().offset((self.x_offset, self.y_offset))
@@ -105,27 +107,35 @@ def barracks_in_middle(self) -> Point2:
105107
raise Exception("Not implemented. Trying to access a ramp that has a wrong amount of upper points.")
106108

107109
@property_immutable_cache
108-
def depot_in_middle(self) -> Point2:
110+
def depot_in_middle(self) -> Optional[Point2]:
109111
""" Depot in the middle of the 3 depots """
110112
if len(self.upper2_for_ramp_wall) == 2:
111113
points = self.upper2_for_ramp_wall
112-
p1 = points.pop().offset((self.x_offset, self.y_offset)) # still an error with pixelmap?
114+
p1 = points.pop().offset((self.x_offset, self.y_offset))
113115
p2 = points.pop().offset((self.x_offset, self.y_offset))
114116
# Offset from top point to depot center is (1.5, 0.5)
115-
intersects = p1.circle_intersection(p2, 2.5 ** 0.5)
117+
try:
118+
intersects = p1.circle_intersection(p2, 2.5 ** 0.5)
119+
except AssertionError:
120+
# Returns None when no placement was found, this is the case on the map Honorgrounds LE with an exceptionally large main base ramp
121+
return None
116122
anyLowerPoint = next(iter(self.lower))
117123
return max(intersects, key=lambda p: p.distance_to_point2(anyLowerPoint))
118124
raise Exception("Not implemented. Trying to access a ramp that has a wrong amount of upper points.")
119125

120126
@property_mutable_cache
121127
def corner_depots(self) -> Set[Point2]:
122128
""" Finds the 2 depot positions on the outside """
129+
if not self.upper2_for_ramp_wall:
130+
return set()
123131
if len(self.upper2_for_ramp_wall) == 2:
124132
points = self.upper2_for_ramp_wall
125-
p1 = points.pop().offset((self.x_offset, self.y_offset)) # still an error with pixelmap?
133+
p1 = points.pop().offset((self.x_offset, self.y_offset))
126134
p2 = points.pop().offset((self.x_offset, self.y_offset))
127135
center = p1.towards(p2, p1.distance_to_point2(p2) / 2)
128136
depotPosition = self.depot_in_middle
137+
if depotPosition is None:
138+
return set()
129139
# Offset from middle depot to corner depots is (2, 1)
130140
intersects = center.circle_intersection(depotPosition, 5 ** 0.5)
131141
return intersects
@@ -140,8 +150,10 @@ def barracks_can_fit_addon(self) -> bool:
140150
raise Exception("Not implemented. Trying to access a ramp that has a wrong amount of upper points.")
141151

142152
@property_immutable_cache
143-
def barracks_correct_placement(self) -> Point2:
153+
def barracks_correct_placement(self) -> Optional[Point2]:
144154
""" Corrected placement so that an addon can fit """
155+
if self.barracks_in_middle is None:
156+
return None
145157
if len(self.upper2_for_ramp_wall) == 2:
146158
if self.barracks_can_fit_addon:
147159
return self.barracks_in_middle

test/generate_pickle_files_bot.py

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,6 @@
3737

3838
class ExporterBot(sc2.BotAI):
3939
async def on_step(self, iteration):
40-
if iteration == 0:
41-
await self.on_first_iteration()
42-
4340
actions = []
4441
await self.do_actions(actions)
4542

@@ -76,27 +73,61 @@ async def on_start_async(self):
7673
def main():
7774

7875
maps = [
76+
"16-BitLE",
77+
"AbiogenesisLE",
78+
"AbyssalReefLE",
79+
"AcidPlantLE",
80+
"AcolyteLE",
7981
"Acropolis",
8082
"Artana",
81-
"CrystalCavern",
82-
"DigitalFrontier",
83-
"OldSunshine",
84-
"Treachery",
85-
"Triton",
83+
"AscensiontoAiurLE",
8684
"AutomatonLE",
85+
"BackwaterLE",
86+
"Bandwidth",
87+
"BattleontheBoardwalkLE",
88+
"BelShirVestigeLE",
89+
"BlackpinkLE",
90+
"BloodBoilLE",
8791
"BlueshiftLE",
92+
"CactusValleyLE",
93+
"CatalystLE",
8894
"CeruleanFallLE",
95+
"CrystalCavern",
96+
"CyberForestLE",
8997
"DarknessSanctuaryLE",
98+
"DefendersLandingLE",
99+
"DigitalFrontier",
100+
"DreamcatcherLE",
101+
"EastwatchLE",
102+
"Ephemeron",
103+
"FractureLE",
104+
"FrostLE",
105+
"HonorgroundsLE",
106+
"InterloperLE",
90107
"KairosJunctionLE",
108+
"KingsCoveLE",
109+
"LostandFoundLE",
110+
"MechDepotLE",
111+
"NeonVioletSquareLE",
112+
"NewkirkPrecinctTE",
113+
"NewRepugnancyLE",
114+
"OdysseyLE",
115+
"OldSunshine",
116+
"PaladinoTerminalLE",
91117
"ParaSiteLE",
92118
"PortAleksanderLE",
93-
"Bandwidth",
94-
"Ephemeron",
95119
"PrimusQ9",
120+
"ProximaStationLE",
121+
"RedshiftLE",
96122
"Reminiscence",
97123
"Sanglune",
124+
"SequencerLE",
125+
# "StasisLE", Commented out because it has uneven number of expansions
98126
"TheTimelessVoid",
127+
"Treachery",
128+
"Triton",
99129
"Urzagol",
130+
"YearZeroLE",
100131
]
101132

102133
for map in maps:
@@ -106,7 +137,6 @@ def main():
106137
sc2.maps.get(map),
107138
[Bot(Race.Terran, ExporterBot()), Computer(Race.Zerg, Difficulty.Easy)],
108139
realtime=False,
109-
save_replay_as="Example.SC2Replay",
110140
)
111141
except ProtocolError:
112142
# ProtocolError appears after a leave game request

test/pickle_data/16-Bit LE.pkl

424 KB
Binary file not shown.
430 KB
Binary file not shown.
442 KB
Binary file not shown.

test/pickle_data/Acid Plant LE.pkl

428 KB
Binary file not shown.

test/pickle_data/Acolyte LE.pkl

437 KB
Binary file not shown.
415 KB
Binary file not shown.

0 commit comments

Comments
 (0)