実装もややこしい…
void zarakima2() {
int zaraki_start = findBestZarakiStart();
LOG(INFO) << "ZARAKIMA! from " << zaraki_start;
if (zaraki_start < 0) {
zarakima_failed_ = true;
return;
}
vector<int> o = zarakima_slots_;
// K(n)
setNumberFromZero(zaraki_start, o[0]);
c2s(K, o[0]);
// S(K(loop))(K(n))
s2c(o[2], ZERO);
setCard(ZERO, o[0]);
// Move 2 => 0
setNumberFromZero(o[2], o[0]);
c2s(GET, o[0]);
// Launch! S(zombie(0))(get)(zero)
setCard(ZOMBIE, o[2]);
s2c(o[2], ZERO);
c2s(K, o[2]);
c2s(S, o[2]);
s2c(o[2], GET);
addSetNumber(o[2], o[0]);
if (opp_->slot(255).v == 1) {
set<int> except(o.begin(), o.end());
vector<int> o2;
if (!getLiveNWorkerExcept(224, 1, except, &o2)) {
state_ = STATE_NORMAL;
zarakima_failed_ = true;
ops_.clear();
return;
}
setCard(ZERO, o2[0]);
c2s(DEC, o2[0]);
} else if (opp_->slot(255).v > 1) {
set<int> except(o.begin(), o.end());
vector<int> o2;
if (!getLiveNWorkerExcept(224, 3, except, &o2)) {
state_ = STATE_NORMAL;
zarakima_failed_ = true;
ops_.clear();
return;
}
set<int> used;
int ni = o2[0];
int ai = o2[1];
int mi = o2[2];
int v = opp_->slot(255).v;
bool first = true;
while (v > 0) {
int sac = -1;
for (int i = 0; i < 256; i++) {
int j = (i + 5) % 256;
if (me_->slot(j).v > 8192 && used.insert(j).second) {
sac = j;
break;
}
}
if (sac < 0) {
state_ = STATE_NORMAL;
zarakima_failed_ = true;
ops_.clear();
return;
}
if (first) {
setCard(ZERO, mi);
setNumberFromZero(sac, mi);
c2s(ATTACK, mi);
s2c(mi, ZERO);
} else {
setCard(ZERO, ai);
setNumberFromZero(sac, ai);
c2s(ATTACK, ai);
s2c(ai, ZERO);
c2s(S, mi);
addArgFilterSlot(mi, ai);
}
first = false;
v -= 7372;
}
setCard(ZERO, ni);
setNumberFromZero(8192, ni);
addArgFilterSlot(mi, ni);
}
s2c(o[2], ZERO);
setSpell("ZARAKIMA2");
state_ = STATE_ZARAKIMA3;
}