00001 #include "osl/additionalEffect.h"
00002 #include "osl/bits/additionalOrShadow.h"
00003
00004 bool osl::effect_util::
00005 AdditionalEffect::hasEffect(const NumEffectState& state, Square target,
00006 Player attack)
00007 {
00008 PieceMask direct = state.effectSetAt(target) & state.piecesOnBoard(attack);
00009 PieceMask mask;
00010 mask.setAll();
00011 mask.clearBit<KNIGHT>();
00012 direct &= (state.promotedPieces() | mask);
00013
00014 while (direct.any()) {
00015 const int num = direct.takeOneBit();
00016 const Square p = state.pieceOf(num).square();
00017 const Direction d=Board_Table.getShort8<BLACK>(p,target);
00018 const int num1=state.longEffectNumTable()[num][d];
00019 if(!Piece::isEmptyNum(num1) && state.pieceOf(num1).owner()==attack) return true;
00020 }
00021 return false;
00022 }
00023
00024 template <int count_max>
00025 int osl::effect_util::
00026 AdditionalEffect::count(const NumEffectState& state, Square target,
00027 Player attack)
00028 {
00029 PieceVector direct_pieces;
00030 state.findEffect(attack, target, direct_pieces);
00031 return AdditionalOrShadow::count<count_max>
00032 (direct_pieces, state, target, attack);
00033 }
00034
00035 bool osl::effect_util::
00036 AdditionalEffect::hasEffectStable(const NumEffectState& state, Square target,
00037 Player attack)
00038 {
00039 return count<1>(state, target, attack);
00040 }
00041
00042 int osl::effect_util::
00043 AdditionalEffect::count2(const NumEffectState& state, Square target,
00044 Player attack)
00045 {
00046 return count<2>(state, target, attack);
00047 }
00048
00049 void osl::effect_util::
00050 AdditionalEffect::find(const NumEffectState& state, Square target,
00051 const PieceVector& direct_effects,
00052 PieceVector& black, PieceVector& white)
00053 {
00054 for (Piece p: direct_effects)
00055 {
00056 const Square from = p.square();
00057 const Offset32 diff32 = Offset32(from, target);
00058 const Offset step = Board_Table.getShortOffsetNotKnight(diff32);
00059 if (step.zero())
00060 continue;
00061
00062 Piece candidate=state.nextPiece(from, step);
00063 if (! candidate.isPiece())
00064 continue;
00065 const Offset32 diff_reverse = Offset32(target,candidate.square());
00066 for (; candidate.isPiece();
00067 candidate=state.nextPiece(candidate.square(), step))
00068 {
00069 const EffectContent effect
00070 = Ptype_Table.getEffect(candidate.ptypeO(), diff_reverse);
00071 if (! effect.hasEffect())
00072 break;
00073 if (candidate.owner() == BLACK)
00074 black.push_back(candidate);
00075 else
00076 white.push_back(candidate);
00077 }
00078 }
00079
00080 }
00081
00082 void osl::effect_util::
00083 AdditionalEffect::find(const NumEffectState& state, Square target,
00084 PieceVector& black, PieceVector& white)
00085 {
00086 PieceVector direct_pieces;
00087 state.findEffect(BLACK, target, direct_pieces);
00088 find(state, target, direct_pieces, black, white);
00089
00090 direct_pieces.clear();
00091 state.findEffect(WHITE, target, direct_pieces);
00092 find(state, target, direct_pieces, black, white);
00093 }
00094
00095 void osl::effect_util::
00096 AdditionalEffect::count(const NumEffectState& state, Square target,
00097 int& black, int& white)
00098 {
00099 PieceVector black_pieces, white_pieces;
00100 find(state, target, black_pieces, white_pieces);
00101 black = black_pieces.size();
00102 white = white_pieces.size();
00103 }
00104
00105
00106
00107
00108