8 #include <boost/static_assert.hpp>
20 template <Player Defense,Direction DIR>
22 PieceMask& pins, PieceMask
const& onBoard)
30 int num1=state.longEffectNumTable()[num][DIR];
36 template<Player Defense>
40 PieceMask mask=state.piecesOnBoard(
alt(Defense));
41 findDirectionStep<Defense,UL>(state,
target,pins,mask);
42 findDirectionStep<Defense,U>(state,
target,pins,mask);
43 findDirectionStep<Defense,UR>(state,
target,pins,mask);
44 findDirectionStep<Defense,L>(state,
target,pins,mask);
45 findDirectionStep<Defense,R>(state,
target,pins,mask);
46 findDirectionStep<Defense,DL>(state,
target,pins,mask);
47 findDirectionStep<Defense,D>(state,
target,pins,mask);
48 findDirectionStep<Defense,DR>(state,
target,pins,mask);
56 return makeStep<BLACK>(state,
target);
58 return makeStep<WHITE>(state,
target);
60 static PieceMask
make(
const NumEffectState& state,
Player defense)
72 template <Direction DIR>
74 Player defense, PieceMask& pins)
77 const Piece pin = state.nextPiece(target, diff);
79 const Piece attack_piece = state.nextPiece(pin.
square(), diff);
94 assert(target==state.kingSquare<P>());
102 NumBitmapEffect effect=state.effectSetAt(pos);
119 const Piece attack_piece2 = state.nextPiece(pin.
square(), diff);
120 return attack_piece == attack_piece2;
125 return state.hasEffectByPiece(attack_piece, pin.
square());
131 const Piece pin = state.nextPiece(target, diff);
133 if (pin.
owner() != defense)
139 template <Ptype PTYPE>
146 i < PtypeTraits<PTYPE>::indexLimit; ++i)
148 const Piece attack_piece = state.pieceOf(i);
152 const Offset32 diff(attack_position, target);
162 findOffset(state, attack_piece, target, defense,
185 template <Player Defense,Direction DIR>
196 if(!state.pieceAt(pos).pieceIsBlack())
return;
199 if(state.pieceAt(pos).pieceIsBlack())
return;
201 int num1=state.longEffectNumTable()[num][DIR];
204 if(!state.pieceOf(num1).pieceIsBlack())
208 if(state.pieceOf(num1).pieceIsBlack())
212 template<Player Defense>
216 findDirectionStep<Defense,UL>(state,
target,pins);
217 findDirectionStep<Defense,U>(state,
target,pins);
218 findDirectionStep<Defense,UR>(state,
target,pins);
219 findDirectionStep<Defense,L>(state,
target,pins);
220 findDirectionStep<Defense,R>(state,
target,pins);
221 findDirectionStep<Defense,DL>(state,
target,pins);
222 findDirectionStep<Defense,D>(state,
target,pins);
223 findDirectionStep<Defense,DR>(state,
target,pins);
231 return makeStep<BLACK>(state,
target);
233 return makeStep<WHITE>(state,
target);
235 template<Player Defense>
238 PieceMask pins=PinOrOpen::makeStep<Defense>(state,
target);;
239 pins &= state.piecesOnBoard(Defense);
247 return makeStep1<BLACK>(state,
target);
249 return makeStep1<WHITE>(state,
target);
265 static PieceMask
make(
const NumEffectState& state,
Player defense)
271 return makeNaive(state, state.kingSquare(defense), defense);
282 const PieceMask pins =
make(state, defense);
283 return pins.countBit();
288 const PieceMask pins =
make(state, target, defense);
289 return pins.countBit();