13 typedef std::bitset<8> bs_t;
34 template<Player P>
inline
39 hasEnoughEffect(NumEffectState
const& state,
Square target,
Square pos,
const PieceMask& pinned,
40 const PieceMask& on_board_defense,
43 assert(state.kingSquare(P)==
target);
45 PieceMask pieceMask = state.effectSetAt(pos)&on_board_defense;
46 if(pieceMask.none())
return false;
47 PieceMask pieceMask1=pieceMask&~pinned;
48 if(pieceMask1.any())
return true;
50 assert(pieceMask.any());
52 int num=pieceMask.takeOneBit();
53 Piece p=state.pieceOf(num);
59 if(dir1==dir)
return true;
60 }
while(pieceMask.any());
66 template<osl::Player P,osl::Direction Dir>
69 PieceMask on_board_defense)
73 Piece p=state.pieceAt(pos);
76 if(!state.hasEffectAt(P,pos)){
79 return 0x1000000000000ull+(0x100010100ull<<static_cast<int>(Dir));
81 return 0x1000000000000ull+(0x10100ull<<static_cast<int>(Dir));
86 const bool has_enough_effect = hasEnoughEffect<altP>(state,
target,pos,pinned,on_board_defense,Dir);
87 if(has_enough_effect){
90 return 0x10100010000ull<<static_cast<int>(Dir);
92 return 0x10000ull<<static_cast<int>(Dir);
95 return 0x10000000000ull<<static_cast<int>(Dir);
99 return 0x10101010001ull<<static_cast<int>(Dir);
101 return 0x10000ull<<static_cast<int>(Dir);
103 return 0x10001000000ull<<static_cast<int>(Dir);
107 template<osl::Player P>
109 #if (defined __GNUC__) && (! defined GPSONE) && (! defined GPSUSIONE)
114 PieceMask on_board_defense=state.piecesOnBoard(
alt(P));
116 uint64_t canMoveMask=
117 hasEffectMask<P,UR>(state,
target,pinned,on_board_defense)+
118 hasEffectMask<P,R>(state,target,pinned,on_board_defense)+
119 hasEffectMask<P,DR>(state,
target,pinned,on_board_defense)+
120 hasEffectMask<P,U>(state,target,pinned,on_board_defense)+
121 hasEffectMask<P,D>(state,
target,pinned,on_board_defense)+
122 hasEffectMask<P,UL>(state,target,pinned,on_board_defense)+
123 hasEffectMask<P,L>(state,
target,pinned,on_board_defense)+
124 hasEffectMask<P,DL>(state,target,pinned,on_board_defense);
125 mask_t longMask=state.longEffectAt(target,P);
126 while(longMask.any()){
128 Piece attacker=state.pieceOf(num);
131 if((canMoveMask&(0x100<<d))!=0){
132 canMoveMask-=((0x100<<d)+0x1000000000000ull);
138 template <osl::Player P>
140 #if (defined __GNUC__) && (! defined GPSONE) && (! defined GPSUSIONE)
146 return make<P>(state,
target,state.pin(
alt(P)));
152 const Square king=state.kingSquare(
alt(attack));
154 return make<BLACK>(state, king);
156 return make<WHITE>(state, king);
161 const PieceMask& pins)
163 const Square king=state.kingSquare(
alt(attack));
165 return make<BLACK>(state, king, pins);
167 return make<WHITE>(state, king, pins);
172 edge_mask.fill(~(0xfull << 48));
173 for (
int x=1; x<=9; ++x) {
174 for (
int y=1; y<=9; ++y) {
178 if (target.
x() <= 1 || target.
x() >= 9 || target.
y() <=1 || target.
y() >=9)
179 edge_mask[
BLACK][king.
index()] &= ~(0x100ull<<d);
181 if (target.
x() <= 1 || target.
x() >= 9 || target.
y() <=1 || target.
y() >=9)
182 edge_mask[
WHITE][king.
index()] &= ~(0x100ull<<d);