00001 #include "osl/effect_util/additionalEffect.h"
00002 #include "osl/effect_util/additionalOrShadow.h"
00003 #include "osl/effect_util/effectUtil.h"
00004
00005 template <int count_max>
00006 int osl::effect_util::
00007 AdditionalEffect::count(const NumEffectState& state, Position target,
00008 Player attack)
00009 {
00010 PieceVector direct_pieces;
00011 EffectUtil::findEffect(attack, state, target, direct_pieces);
00012 return AdditionalOrShadow::count<count_max>
00013 (direct_pieces, state, target, attack);
00014 }
00015
00016 bool osl::effect_util::
00017 AdditionalEffect::hasEffect(const NumEffectState& state, Position target,
00018 Player attack)
00019 {
00020 return count<1>(state, target, attack);
00021 }
00022
00023 int osl::effect_util::
00024 AdditionalEffect::count2(const NumEffectState& state, Position target,
00025 Player attack)
00026 {
00027 return count<2>(state, target, attack);
00028 }
00029
00030 void osl::effect_util::
00031 AdditionalEffect::find(const NumEffectState& state, Position target,
00032 const PieceVector& direct_effects,
00033 PieceVector& black, PieceVector& white)
00034 {
00035 for (PieceVector::const_iterator p=direct_effects.begin();
00036 p!=direct_effects.end(); ++p)
00037 {
00038 const Position from = p->position();
00039 const Offset32 diff32 = Offset32(from, target);
00040 const Offset step = Board_Table.getShortOffsetNotKnight(diff32);
00041 if (step.zero())
00042 continue;
00043
00044 Piece candidate=state.nextPiece(from, step);
00045 if (! candidate.isPiece())
00046 continue;
00047 const Offset32 diff_reverse = Offset32(target,candidate.position());
00048 for (; candidate.isPiece();
00049 candidate=state.nextPiece(candidate.position(), step))
00050 {
00051 const EffectContent effect
00052 = Ptype_Table.getEffect(candidate.ptypeO(), diff_reverse);
00053 if (! effect.hasEffect())
00054 break;
00055 if (candidate.owner() == BLACK)
00056 black.push_back(candidate);
00057 else
00058 white.push_back(candidate);
00059 }
00060 }
00061
00062 }
00063
00064 void osl::effect_util::
00065 AdditionalEffect::find(const NumEffectState& state, Position target,
00066 PieceVector& black, PieceVector& white)
00067 {
00068 PieceVector direct_pieces;
00069 EffectUtil::findEffect(BLACK, state, target, direct_pieces);
00070 find(state, target, direct_pieces, black, white);
00071
00072 direct_pieces.clear();
00073 EffectUtil::findEffect(WHITE, state, target, direct_pieces);
00074 find(state, target, direct_pieces, black, white);
00075 }
00076
00077 void osl::effect_util::
00078 AdditionalEffect::count(const NumEffectState& state, Position target,
00079 int& black, int& white)
00080 {
00081 PieceVector black_pieces, white_pieces;
00082 find(state, target, black_pieces, white_pieces);
00083 black = black_pieces.size();
00084 white = white_pieces.size();
00085 }
00086
00087
00088
00089
00090