1 #ifndef OSL_NUM_SIMPLE_EFFECT_H
2 #define OSL_NUM_SIMPLE_EFFECT_H
13 #include <boost/static_assert.hpp>
23 class NumSimpleEffectTable;
24 bool operator==(
const NumSimpleEffectTable&,
const NumSimpleEffectTable&);
25 std::ostream&
operator<<(std::ostream&,
const NumSimpleEffectTable&);
33 CArray<NumBitmapEffect, Square::SIZE>
effects
57 template<Player P,Ptype T,Direction Dir,NumBitmapEffect::Op OP,
bool UC>
63 effects[target.
index()].template opEqual<OP>(NumBitmapEffect::makeEffect<P>(num));
65 int posIndex=BoardMask::index(pos);
92 template<Player P,Ptype T,Direction Dir,NumBitmapEffect::Op OP,
bool UC>
99 posIndex=BoardMask::index(pos);
102 assert(!offset.
zero());
108 int count=((SD==
D || SD==
DL || SD==
DR) ? ePos.
y()-pos.
y() :
109 ( (SD==
U || SD==
UL || SD==
UR) ? pos.
y()-ePos.
y() :
110 ( SD==
L ? ePos.
x()-pos.
x() : pos.
x()-ePos.
x())));
111 assert(0<=count && count<=9);
113 for(
int i=1;i<
count;i++){
115 posIndex+=BoardMask::getIndexOffset<Dir,BLACK>();
121 int num1=state.pieceAt(ePos).number();
126 posIndex+=BoardMask::getIndexOffset<Dir,BLACK>();
134 for(
int i=0;i<
count;i++){
138 int num1=state.pieceAt(ePos).number();
148 posIndex+=BoardMask::getIndexOffset<Dir,BLACK>();
153 int num1=state.pieceAt(pos).number();
182 template<Player P,Ptype T,NumBitmapEffect::Op OP,
bool UC>
192 template<NumBitmapEffect::Op OP,
bool UC>
201 template<NumBitmapEffect::Op OP,
bool UC>
210 void init(
const SimpleState& state);
216 assert(reinterpret_cast<size_t>(
this) % 16 == 0);
233 template<NumBitmapEffect::Op OP,
bool UC>
278 using effect::NumBitmapEffect;
288 template<osl::effect::NumBitmapEffect::Op OP,
bool UC>
293 setChangedPieces(effects[pos.
index()]);
296 & NumBitmapEffect::longEffectMask());
298 int num=mask1.takeOneBit()+NumBitmapEffect::longToNumOffset;
299 assert(32<=num && num<=39);
300 Piece p1=state.pieceOf(num);
306 if(OP==NumBitmapEffect::Sub){
307 Square endSquare=mobilityTable.get(d,num);
311 int pos2Index, offset81;
313 int posIndex=BoardMask::index(pos);
314 pos2Index=BoardMask::index(pos2);
315 offset81=pos2Index-posIndex;
317 for(;pos2!=endSquare;pos2+=offset0){
319 changed_effects[pl1].set(pos2Index);
322 effects[pos2.
index()].template opEqual<OP>(effect);
324 effects[pos2.
index()].template opEqual<OP>(effect);
325 int num1=state.pieceAt(endSquare).number();
326 if (!Piece::isEdgeNum(num1)){
329 changed_effects[pl1].set(pos2Index);
330 if((effects[endSquare.
index()].getMask(1)&NumBitmapEffect::playerEffectMask(pl1)).none()){
331 effected_mask[pl1].reset(num1);
333 effected_changed_mask[pl1].set(num1);
334 mobilityTable.set(d,num,pos);
338 mobilityTable.set(d,num,pos);
339 effectedNumTable[piece_num][d]=num;
344 int pos2Index, offset81;
346 int posIndex=BoardMask::index(pos);
347 pos2Index=BoardMask::index(pos2);
348 offset81=pos2Index-posIndex;
351 int num1=state.pieceAt(pos2).number();
352 if(!Piece::isEmptyNum(num1)){
354 mobilityTable.set(d,num,pos2);
355 if(!Piece::isEdgeNum(num1)){
356 effectedNumTable[num1][d]=num;
357 effects[pos2.
index()].template opEqual<OP>(effect);
358 changed_effects[pl1].set(pos2Index);
359 effected_mask[pl1].set(num1);
360 effected_changed_mask[pl1].set(num1);
363 else if(!Piece::isEdgeNum(num1)){
364 effectedNumTable[num1][d]=num;
365 effects[pos2.
index()].template opEqual<OP>(effect);
370 changed_effects[pl1].set(pos2Index);
373 effects[pos2.
index()].template opEqual<OP>(effect);
380 #endif // OSL_NUM_SIMPLE_EFFECT_H