Skip to content

Commit b74a098

Browse files
authored
Merge branch 'master' into ipv6-base-merge
2 parents 51a9845 + 9039cf8 commit b74a098

12 files changed

+143
-22
lines changed

docs/tutorial1.md

+13-10
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,24 @@ The sc2_coordinator is included from sc2_api.h, you will use it to start and man
5555
The coordinator requires some preliminary information to properly start and connect
5656
to the Starcraft executable.
5757
58-
Add the following code inside the main function.
58+
Replace the `main` function with the following code:
5959
6060
```C++
61-
Coordinator coordinator;
62-
coordinator.LoadSettings(argc, argv);
61+
int main(int argc, char* argv[]) {
62+
Coordinator coordinator;
63+
coordinator.LoadSettings(argc, argv);
6364
64-
Bot bot;
65-
coordinator.SetParticipants({
66-
CreateParticipant(Race::Terran, &bot),
67-
CreateComputer(Race::Zerg)
68-
});
65+
Bot bot;
66+
coordinator.SetParticipants({
67+
CreateParticipant(Race::Terran, &bot),
68+
CreateComputer(Race::Zerg)
69+
});
6970
70-
coordinator.LaunchStarcraft();
71-
coordinator.StartGame(sc2::kMapBelShirVestigeLE);
71+
coordinator.LaunchStarcraft();
72+
coordinator.StartGame(sc2::kMapBelShirVestigeLE);
7273
74+
return 0;
75+
}
7376
```
7477

7578
> If you have started the retail binary LoadSettings should automatically load necessary settings.

examples/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,12 @@ example_project(bot_micro "bot_micro.cc")
4040
example_project(bot_mp "bot_mp.cc")
4141
example_project(intermediate_bot "intermediate_bot.cc")
4242
example_project(annoying_helper "annoying_helper.cc")
43+
example_project(proxy, "proxy.cc")
44+
example_project(save_load, "save_load.cc")
4345
# example_project(bot_mp_ipv6 "bot_mp_ipv6.cc")
4446

4547
if (NOT APPLE)
4648
example_project_extra(feature_layers "feature_layers.cc" sc2renderer)
4749
example_project_extra(rendered "rendered.cc" sc2renderer)
4850
endif ()
4951

50-

examples/common/bot_examples.cc

-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ namespace sc2 {
1414

1515
static int TargetSCVCount = 15;
1616

17-
struct IsVisible {
18-
bool operator()(const Unit& unit) { return unit.display_type == Unit::Visible; };
19-
};
2017
struct IsAttackable {
2118
bool operator()(const Unit& unit) {
2219
switch (unit.unit_type.ToType()) {

examples/rendered.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ int main(int argc, char* argv[]) {
4949
#if LINUX_USE_SOFTWARE_RENDER
5050
coordinator.AddCommandLine("-osmesapath /usr/lib/x86_64-linux-gnu/libOSMesa.so");
5151
#else
52-
coordinator.AddCommandLine("-eglpath /usr/lib/nvidia-384/libEGL.so");
52+
coordinator.AddCommandLine("-eglpath libEGL.so");
5353
#endif
5454
#endif
5555

@@ -71,4 +71,4 @@ int main(int argc, char* argv[]) {
7171
}
7272

7373
return 0;
74-
}
74+
}

examples/save_load.cc

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#include "sc2api/sc2_api.h"
2+
#include "sc2lib/sc2_lib.h"
3+
#include "sc2utils/sc2_manage_process.h"
4+
5+
#include <iostream>
6+
7+
using namespace sc2;
8+
9+
class WorkerRushBot : public Agent {
10+
public:
11+
void CenterCamera(std::vector<const Unit*> units) {
12+
if (units.size() == 0)
13+
return;
14+
15+
Point2D center;
16+
for (auto unit : units) {
17+
center += unit->pos;
18+
}
19+
center /= (float)units.size();
20+
21+
Debug()->DebugMoveCamera(center);
22+
Debug()->SendDebug();
23+
}
24+
25+
virtual void OnStep() final {
26+
const ObservationInterface* obs = Observation();
27+
28+
// Worker rush the enemy!
29+
//
30+
auto enemy_base = obs->GetGameInfo().enemy_start_locations[0];
31+
const auto& workers = obs->GetUnits(Unit::Alliance::Self, IsUnit(UNIT_TYPEID::TERRAN_SCV));
32+
for (auto unit : workers) {
33+
Actions()->UnitCommand(unit, ABILITY_ID::ATTACK, enemy_base);
34+
}
35+
CenterCamera(workers);
36+
37+
// Create a savepoint as we arrive at the enemy base
38+
//
39+
if (!has_save) {
40+
const auto& enemies = obs->GetUnits(Unit::Alliance::Enemy, IsVisible());
41+
if (enemies.size() > 0) {
42+
Control()->Save();
43+
has_save = true;
44+
}
45+
}
46+
47+
// All our workers died... Load the savepoint and try again.
48+
//
49+
if (has_save && workers.size() == 0) {
50+
Control()->Load();
51+
}
52+
};
53+
54+
private:
55+
bool has_save = false;
56+
57+
};
58+
59+
//*************************************************************************************************
60+
int main(int argc, char* argv[]) {
61+
sc2::Coordinator coordinator;
62+
if (!coordinator.LoadSettings(argc, argv)) {
63+
return 1;
64+
}
65+
66+
WorkerRushBot bot;
67+
coordinator.SetParticipants({
68+
CreateParticipant(sc2::Race::Terran, &bot),
69+
CreateComputer(sc2::Race::Protoss)
70+
});
71+
72+
coordinator.LaunchStarcraft();
73+
coordinator.StartGame(sc2::kMapBelShirVestigeLE);
74+
75+
while (coordinator.Update());
76+
while (!sc2::PollKeyPress());
77+
78+
return 0;
79+
}

include/sc2api/sc2_client.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -134,5 +134,8 @@ bool IsCarryingMinerals(const Unit& unit);
134134
//!< \return Returns true if the unit is carrying vespene, false otherwise.
135135
bool IsCarryingVespene(const Unit& unit);
136136

137+
struct IsVisible {
138+
bool operator()(const Unit& unit);
139+
};
137140

138-
}
141+
}

include/sc2api/sc2_control_interfaces.h

+4
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ class ControlInterface {
6868
virtual void ClearProtocolErrors() = 0;
6969

7070
virtual void UseGeneralizedAbility(bool value) = 0;
71+
72+
// Save/Load.
73+
virtual void Save() = 0;
74+
virtual void Load() = 0;
7175
};
7276

7377
class AgentControlInterface {

include/sc2api/sc2_typeenums.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -179,18 +179,19 @@ namespace sc2 {
179179
PROTOSS_INTERCEPTOR = 85, // SMART, MOVE, PATROL, HOLDPOSITION, STOP, ATTACK
180180
PROTOSS_MOTHERSHIP = 10, // SMART, MOVE, PATROL, HOLDPOSITION, EFFECT_PHOTONOVERCHARGE, EFFECT_TIMEWARP, STOP, ATTACK, EFFECT_MASSRECALL
181181
PROTOSS_MOTHERSHIPCORE = 488, // SMART, MOVE, PATROL, HOLDPOSITION, MORPH_MOTHERSHIP, EFFECT_PHOTONOVERCHARGE, EFFECT_TIMEWARP, CANCEL, STOP, ATTACK, EFFECT_MASSRECALL
182-
PROTOSS_NEXUS = 59, // SMART, EFFECT_CHRONOBOOST, TRAIN_PROBE, TRAIN_MOTHERSHIPCORE, CANCEL, CANCEL_LAST, RALLY_WORKERS
182+
PROTOSS_NEXUS = 59, // SMART, EFFECT_CHRONOBOOST, TRAIN_PROBE, TRAIN_MOTHERSHIP, CANCEL, CANCEL_LAST, RALLY_WORKERS
183183
PROTOSS_OBSERVER = 82, // SMART, MOVE, PATROL, HOLDPOSITION, STOP, ATTACK
184184
PROTOSS_ORACLE = 495, // SMART, MOVE, PATROL, HOLDPOSITION, EFFECT_ORACLEREVELATION, BEHAVIOR_PULSARBEAMON, BEHAVIOR_PULSARBEAMOFF, BUILD_STASISTRAP, CANCEL, STOP, ATTACK
185185
PROTOSS_ORACLESTASISTRAP = 732, // CANCEL
186186
PROTOSS_PHOENIX = 78, // SMART, MOVE, PATROL, HOLDPOSITION, EFFECT_GRAVITONBEAM, CANCEL, STOP, ATTACK
187187
PROTOSS_PHOTONCANNON = 66, // SMART, CANCEL, STOP, ATTACK
188-
PROTOSS_PROBE = 84, // SMART, MOVE, PATROL, HOLDPOSITION, BUILD_NEXUS, BUILD_PYLON, BUILD_ASSIMILATOR, BUILD_GATEWAY, BUILD_FORGE, BUILD_FLEETBEACON, BUILD_TWILIGHTCOUNCIL, BUILD_PHOTONCANNON, BUILD_STARGATE, BUILD_TEMPLARARCHIVE, BUILD_DARKSHRINE, BUILD_ROBOTICSBAY, BUILD_ROBOTICSFACILITY, BUILD_CYBERNETICSCORE, STOP, HARVEST_GATHER, HARVEST_RETURN, ATTACK, EFFECT_SPRAY
188+
PROTOSS_PROBE = 84, // SMART, MOVE, PATROL, HOLDPOSITION, BUILD_NEXUS, BUILD_PYLON, BUILD_ASSIMILATOR, BUILD_GATEWAY, BUILD_FORGE, BUILD_FLEETBEACON, BUILD_TWILIGHTCOUNCIL, BUILD_PHOTONCANNON, BUILD_SHIELDBATTERY, BUILD_STARGATE, BUILD_TEMPLARARCHIVE, BUILD_DARKSHRINE, BUILD_ROBOTICSBAY, BUILD_ROBOTICSFACILITY, BUILD_CYBERNETICSCORE, STOP, HARVEST_GATHER, HARVEST_RETURN, ATTACK, EFFECT_SPRAY
189189
PROTOSS_PYLON = 60, // CANCEL
190190
PROTOSS_PYLONOVERCHARGED = 894, // SMART, STOP, ATTACK
191191
PROTOSS_ROBOTICSBAY = 70, // RESEARCH_GRAVITICBOOSTER, RESEARCH_GRAVITICDRIVE, RESEARCH_EXTENDEDTHERMALLANCE, CANCEL, CANCEL_LAST
192192
PROTOSS_ROBOTICSFACILITY = 71, // SMART, TRAIN_WARPPRISM, TRAIN_OBSERVER, TRAIN_COLOSSUS, TRAIN_IMMORTAL, TRAIN_DISRUPTOR, CANCEL, CANCEL_LAST, RALLY_UNITS
193193
PROTOSS_SENTRY = 77, // SMART, MOVE, PATROL, HOLDPOSITION, EFFECT_GUARDIANSHIELD, HALLUCINATION_ARCHON, HALLUCINATION_COLOSSUS, HALLUCINATION_HIGHTEMPLAR, HALLUCINATION_IMMORTAL, HALLUCINATION_PHOENIX, HALLUCINATION_PROBE, HALLUCINATION_STALKER, HALLUCINATION_VOIDRAY, HALLUCINATION_WARPPRISM, HALLUCINATION_ZEALOT, EFFECT_FORCEFIELD, HALLUCINATION_ORACLE, HALLUCINATION_DISRUPTOR, HALLUCINATION_ADEPT, STOP, RALLY_UNITS, ATTACK
194+
PROTOSS_SHIELDBATTERY = 1910, // SMART, EFFECT_RESTORE
194195
PROTOSS_STALKER = 74, // SMART, MOVE, PATROL, HOLDPOSITION, STOP, RALLY_UNITS, ATTACK, EFFECT_BLINK
195196
PROTOSS_STARGATE = 67, // SMART, TRAIN_PHOENIX, TRAIN_CARRIER, TRAIN_VOIDRAY, TRAIN_ORACLE, TRAIN_TEMPEST, CANCEL, CANCEL_LAST, RALLY_UNITS
196197
PROTOSS_TEMPEST = 496, // SMART, MOVE, PATROL, HOLDPOSITION, EFFECT_TEMPESTDISRUPTIONBLAST, CANCEL, STOP, ATTACK
@@ -314,6 +315,7 @@ namespace sc2 {
314315
BUILD_ROBOTICSBAY = 892, // Target: Point.
315316
BUILD_ROBOTICSFACILITY = 893, // Target: Point.
316317
BUILD_SENSORTOWER = 326, // Target: Point.
318+
BUILD_SHIELDBATTERY = 895, // Target: Point.
317319
BUILD_SPAWNINGPOOL = 1155, // Target: Point.
318320
BUILD_SPINECRAWLER = 1166, // Target: Point.
319321
BUILD_SPIRE = 1158, // Target: Point.
@@ -428,6 +430,7 @@ namespace sc2 {
428430
EFFECT_REPAIR = 3685, // Target: Unit.
429431
EFFECT_REPAIR_MULE = 78, // Target: Unit.
430432
EFFECT_REPAIR_SCV = 316, // Target: Unit.
433+
EFFECT_RESTORE = 3765, // Target: Unit.
431434
EFFECT_SALVAGE = 32, // Target: None.
432435
EFFECT_SCAN = 399, // Target: Point.
433436
EFFECT_SHADOWSTRIDE = 2700, // Target: Point.
@@ -673,6 +676,7 @@ namespace sc2 {
673676
TRAIN_MARAUDER = 563, // Target: None.
674677
TRAIN_MARINE = 560, // Target: None.
675678
TRAIN_MEDIVAC = 620, // Target: None.
679+
TRAIN_MOTHERSHIP = 110, // Target: None.
676680
TRAIN_MOTHERSHIPCORE = 1853, // Target: None.
677681
TRAIN_MUTALISK = 1346, // Target: None.
678682
TRAIN_OBSERVER = 977, // Target: None.

src/sc2api/sc2_client.cc

+26-1
Original file line numberDiff line numberDiff line change
@@ -1429,14 +1429,17 @@ class ControlImp : public ControlInterface {
14291429

14301430
void DumpProtoUsage() override;
14311431

1432-
void ResolveMap (const std::string& map_name, SC2APIProtocol::RequestCreateGame* request);
1432+
void ResolveMap(const std::string& map_name, SC2APIProtocol::RequestCreateGame* request);
14331433

14341434
const std::vector<ClientError>& GetClientErrors() const final { return client_errors_; };
14351435
const std::vector<std::string>& GetProtocolErrors() const final { return protocol_errors_; };
14361436

14371437
void ClearClientErrors() override { client_errors_.clear(); };
14381438
void ClearProtocolErrors() override { protocol_errors_.clear(); };
14391439
void UseGeneralizedAbility(bool value) override { observation_imp_->use_generalized_ability_ = value; };
1440+
1441+
virtual void Save();
1442+
virtual void Load();
14401443
};
14411444

14421445
ControlImp::ControlImp(Client& client) :
@@ -2213,6 +2216,24 @@ void ControlImp::DumpProtoUsage() {
22132216
std::cout << "******************************************************" << std::endl;
22142217
}
22152218

2219+
void ControlImp::Save() {
2220+
GameRequestPtr request = Proto().MakeRequest();
2221+
request->mutable_quick_save();
2222+
if (!Proto().SendRequest(request)) {
2223+
return;
2224+
}
2225+
WaitForResponse();
2226+
}
2227+
2228+
void ControlImp::Load() {
2229+
GameRequestPtr request = Proto().MakeRequest();
2230+
request->mutable_quick_load();
2231+
if (!Proto().SendRequest(request)) {
2232+
return;
2233+
}
2234+
WaitForResponse();
2235+
}
2236+
22162237
//-------------------------------------------------------------------------------------------------
22172238
// Client
22182239
//-------------------------------------------------------------------------------------------------
@@ -2270,4 +2291,8 @@ bool IsCarryingVespene(const Unit& unit) {
22702291
return std::find_if(unit.buffs.begin(), unit.buffs.end(), is_vespene) != unit.buffs.end();
22712292
}
22722293

2294+
bool IsVisible::operator()(const Unit& unit) {
2295+
return unit.display_type == Unit::Visible;
2296+
};
2297+
22732298
}

src/sc2api/sc2_typeenums.cc

+4
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ namespace sc2 {
6767
case UNIT_TYPEID::PROTOSS_FLEETBEACON: return "PROTOSS_FLEETBEACON"; // 337
6868
case UNIT_TYPEID::PROTOSS_TWILIGHTCOUNCIL: return "PROTOSS_TWILIGHTCOUNCIL"; // 1677
6969
case UNIT_TYPEID::PROTOSS_PHOTONCANNON: return "PROTOSS_PHOTONCANNON"; // 8601
70+
case UNIT_TYPEID::PROTOSS_SHIELDBATTERY: return "PROTOSS_SHIELDBATTERY"; // 8601
7071
case UNIT_TYPEID::PROTOSS_STARGATE: return "PROTOSS_STARGATE"; // 2286
7172
case UNIT_TYPEID::PROTOSS_TEMPLARARCHIVE: return "PROTOSS_TEMPLARARCHIVE"; // 342
7273
case UNIT_TYPEID::PROTOSS_DARKSHRINE: return "PROTOSS_DARKSHRINE"; // 408
@@ -391,6 +392,7 @@ namespace sc2 {
391392
case ABILITY_ID::BUILD_FLEETBEACON: return "BUILD_FLEETBEACON"; // 130
392393
case ABILITY_ID::BUILD_TWILIGHTCOUNCIL: return "BUILD_TWILIGHTCOUNCIL"; // 486
393394
case ABILITY_ID::BUILD_PHOTONCANNON: return "BUILD_PHOTONCANNON"; // 2895
395+
case ABILITY_ID::BUILD_SHIELDBATTERY: return "BUILD_SHIELDBATTERY";
394396
case ABILITY_ID::BUILD_STARGATE: return "BUILD_STARGATE"; // 791
395397
case ABILITY_ID::BUILD_TEMPLARARCHIVE: return "BUILD_TEMPLARARCHIVE"; // 167
396398
case ABILITY_ID::BUILD_DARKSHRINE: return "BUILD_DARKSHRINE"; // 165
@@ -565,6 +567,7 @@ namespace sc2 {
565567
case ABILITY_ID::CANCEL_MORPHMOTHERSHIP: return "CANCEL_MORPHMOTHERSHIP"; // 5
566568
case ABILITY_ID::TRAIN_MOTHERSHIPCORE: return "TRAIN_MOTHERSHIPCORE"; // 869
567569
case ABILITY_ID::EFFECT_MASSRECALL_MOTHERSHIPCORE: return "EFFECT_MASSRECALL_MOTHERSHIPCORE"; // 46
570+
case ABILITY_ID::TRAIN_MOTHERSHIP: return "TRAIN_MOTHERSHIP";
568571
case ABILITY_ID::MORPH_HELLION: return "MORPH_HELLION"; // 31
569572
case ABILITY_ID::MORPH_HELLBAT: return "MORPH_HELLBAT"; // 325
570573
case ABILITY_ID::BURROWDOWN_SWARMHOST: return "BURROWDOWN_SWARMHOST"; // 19
@@ -654,6 +657,7 @@ namespace sc2 {
654657
case ABILITY_ID::EFFECT_REPAIR: return "EFFECT_REPAIR"; // 1
655658
case ABILITY_ID::EFFECT_MASSRECALL: return "EFFECT_MASSRECALL"; // 1
656659
case ABILITY_ID::EFFECT_BLINK: return "EFFECT_BLINK"; // 1
660+
case ABILITY_ID::EFFECT_RESTORE: return "EFFECT_RESTORE"; // 1
657661
case ABILITY_ID::BEHAVIOR_HOLDFIREON: return "BEHAVIOR_HOLDFIREON"; // 1
658662
case ABILITY_ID::BEHAVIOR_HOLDFIREOFF: return "BEHAVIOR_HOLDFIREOFF"; // 1
659663
case ABILITY_ID::RALLY_WORKERS: return "RALLY_WORKERS"; // 1

src/sc2utils/sc2_manage_process.cc

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <string>
2121
#include <codecvt>
2222
#include <locale>
23+
#include <cstring>
2324

2425
#elif defined(__APPLE__)
2526

tests/test_rendered.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ bool TestRendered(int argc, char** argv) {
117117
coordinator.SetRender(settings);
118118

119119
#if defined(__linux__)
120-
coordinator.AddCommandLine("-eglpath /usr/lib/nvidia-367/libEGL.so");
120+
coordinator.AddCommandLine("-eglpath libEGL.so");
121121
#endif
122122

123123
// Add the custom bot, it will control the players.
@@ -139,4 +139,4 @@ bool TestRendered(int argc, char** argv) {
139139
return bot.Success();
140140
}
141141

142-
}
142+
}

0 commit comments

Comments
 (0)