in rts/game_CF/cf_rule_actor.cc [11:79]
bool CFRuleActor::FlagActByState(const GameEnv &env, const vector<int>& state, AssignedCmds *assigned_cmds) {
const auto &enemy_troops = _preload.EnemyTroops();
const auto &my_troops = _preload.MyTroops();
if (state[FLAGSTATE_GET_FLAG] == 1) {
if (!enemy_troops[FLAG].empty()) {
// flag is idle, get it
UnitId flag_id = enemy_troops[FLAG][0]->GetId();
for (const Unit *u : my_troops[FLAG_ATHLETE]) {
store_cmd(u, CmdBPtr(new CmdGetFlag(INVALID, flag_id)), assigned_cmds);
}
}
}
if (state[FLAGSTATE_ATTACK_FLAG] == 1) {
for (const Unit *eu : enemy_troops[FLAG_ATHLETE]) {
if (eu->HasFlag()) {
for (const Unit *u : my_troops[FLAG_ATHLETE]) {
store_cmd(u, _A(eu->GetId()), assigned_cmds);
}
}
}
}
if (state[FLAGSTATE_ESCORT_FLAG] == 1) {
for (const Unit *u : my_troops[FLAG_ATHLETE]) {
if (u->HasFlag()) {
// try to send the flag back to base
store_cmd(u, CmdBPtr(new CmdEscortFlagToBase(INVALID)), assigned_cmds);
}
}
}
if (state[FLAGSTATE_PROTECT_FLAG] == 1) {
UnitId our_flag_athlete_id = INVALID;
for (const Unit *u : my_troops[FLAG_ATHLETE]) {
if (u->HasFlag()) {
our_flag_athlete_id = u->GetId();
}
}
// others, protect our flag athlete
const Unit* our_flag_athlete = env.GetUnit(our_flag_athlete_id);
if (our_flag_athlete != nullptr) {
UnitId damage_from = our_flag_athlete->GetProperty().GetLastDamageFrom();
const Unit *source = env.GetUnit(damage_from);
if (source != nullptr) {
for (const Unit *u : my_troops[FLAG_ATHLETE]) {
if (!u->HasFlag()) {
store_cmd(u, _A(damage_from), assigned_cmds);
}
}
}
}
}
/*
if (state[FLAGSTATE_MOVE] == 1) {
// move towards center of the map
for (const Unit *u : my_troops[FLAG_ATHLETE]) {
store_cmd(u, _M(PointF(9.5, 9.5)), assigned_cmds);
}
}
if (state[FLAGSTATE_ATTACK] == 1) {
// don't care about flag, just attack enemy
if (!enemy_troops[FLAG_ATHLETE].empty()) {
UnitId target = enemy_troops[FLAG_ATHLETE][0]->GetId();
for (const Unit *u : my_troops[FLAG_ATHLETE]) {
store_cmd(u, _A(target), assigned_cmds);
}
}
}*/
return true;
}