1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
#include "osl/effect_util/additionalEffect.h"
#include "osl/effect_util/additionalOrShadow.h"
#include "osl/effect_util/effectUtil.h"
#include "osl/effect_util/effectUtil.tcc"
#include <boost/foreach.hpp>
bool osl::effect_util::
AdditionalEffect::hasEffect(const NumEffectState& state, Position target,
Player attack)
{
PieceMask direct = state.getEffect(target) & state.getOnBoardMask(attack);
PieceMask mask;
mask.setAll();
mask.clearBit<KNIGHT>();
direct &= (state.promotedPieces() | mask);
while (direct.any()) {
const int num = direct.takeOneBit();
const Position p = state.getPieceOf(num).position();
const Direction d=Board_Table.getShort8<BLACK>(p,target);
const int num1=state.longEffectNumTable()[num][d];
if(!Piece::isEmptyNum(num1) && state.getPieceOf(num1).owner()==attack) return true;
}
return false;
}
template <int count_max>
int osl::effect_util::
AdditionalEffect::count(const NumEffectState& state, Position target,
Player attack)
{
PieceVector direct_pieces;
EffectUtil::findEffect(attack, state, target, direct_pieces);
return AdditionalOrShadow::count<count_max>
(direct_pieces, state, target, attack);
}
bool osl::effect_util::
AdditionalEffect::hasEffectStable(const NumEffectState& state, Position target,
Player attack)
{
return count<1>(state, target, attack);
}
int osl::effect_util::
AdditionalEffect::count2(const NumEffectState& state, Position target,
Player attack)
{
return count<2>(state, target, attack);
}
void osl::effect_util::
AdditionalEffect::find(const NumEffectState& state, Position target,
const PieceVector& direct_effects,
PieceVector& black, PieceVector& white)
{
BOOST_FOREACH(Piece p, direct_effects)
{
const Position from = p.position();
const Offset32 diff32 = Offset32(from, target);
const Offset step = Board_Table.getShortOffsetNotKnight(diff32);
if (step.zero())
continue;
// 利きが8方向の場合
Piece candidate=state.nextPiece(from, step);
if (! candidate.isPiece())
continue;
const Offset32 diff_reverse = Offset32(target,candidate.position());
for (; candidate.isPiece();
candidate=state.nextPiece(candidate.position(), step))
{
const EffectContent effect
= Ptype_Table.getEffect(candidate.ptypeO(), diff_reverse);
if (! effect.hasEffect())
break;
if (candidate.owner() == BLACK)
black.push_back(candidate);
else
white.push_back(candidate);
}
}
}
void osl::effect_util::
AdditionalEffect::find(const NumEffectState& state, Position target,
PieceVector& black, PieceVector& white)
{
PieceVector direct_pieces;
EffectUtil::findEffect(BLACK, state, target, direct_pieces);
find(state, target, direct_pieces, black, white);
direct_pieces.clear();
EffectUtil::findEffect(WHITE, state, target, direct_pieces);
find(state, target, direct_pieces, black, white);
}
void osl::effect_util::
AdditionalEffect::count(const NumEffectState& state, Position target,
int& black, int& white)
{
PieceVector black_pieces, white_pieces;
find(state, target, black_pieces, white_pieces);
black = black_pieces.size();
white = white_pieces.size();
}
// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End:
|