30 if (y != move.
to().
y())
32 const int x = move.
to().
x();
33 return (x == king.
x() || abs(king.
x() - x) == 2);
38 const Player defender =
alt(state.turn());
39 const CArray<Square,2> knight_position = {{
45 for (
int i=0; i<2; ++i) {
46 const Square kp = knight_position[i];
47 const Piece p = state.pieceAt(kp);
48 if (state.hasEffectNotBy(defender, captured, kp))
52 || state.hasPieceOnStand<
KNIGHT>(state.turn())))
55 && state.hasEffectByPtypeStrict<
KNIGHT>(state.turn(), kp))
63 const Player defender =
alt(state.turn());
64 const Square king = state.kingSquare(defender);
65 if (Neighboring8Direct::hasEffectOrAdditional(state, move.
ptypeO(), move.
to(), king)
67 || state.longEffectAt(move.
to(),
alt(state.turn())).any()
68 || (! move.
isDrop() && state.longEffectAt(move.
from(), state.turn()).any())
72 && Neighboring8Direct::hasEffectOrAdditional(state, move.
capturePtypeO(), move.
to(), king))
75 const King8Info info(state.king8Info(defender));
77 && (info.dropCandidate()
81 && (info.dropCandidate() || info.moveCandidate2()
82 || info.liberty() == 0))
84 if (info.liberty() == 0
87 && ((state.hasPieceOnStand<
KNIGHT>(state.turn())
89 || state.hasEffectByPtypeStrict<
KNIGHT>(state.turn(), move.
from())))))
97 NumEffectState& state =
const_cast<NumEffectState&
>(cstate);
98 if (! isCandidate(cstate, move))
102 state.makeUnmakeMove(move, helper);
104 if (result && ! isCandidate(cstate, move))
105 std::cerr << cstate << move <<
"\n", assert(0);