00001
00002
00003 #include "osl/effect_util/sendOffPosition.h"
00004 #include "osl/ptypeTable.h"
00005 #include "osl/misc/bitOp.h"
00006
00007 osl::effect_util::SendOffPosition::
00008 Table::Table()
00009 {
00010 normal[0] = Offset( 1, 1);
00011 normal[1] = Offset( 1, 0);
00012 normal[2] = Offset( 1,-1);
00013 normal[3] = Offset( 0, 1);
00014 normal[4] = Offset( 0,-1);
00015 normal[5] = Offset(-1, 1);
00016 normal[6] = Offset(-1, 0);
00017 normal[7] = Offset(-1,-1);
00018
00019 const Position center(5,5);
00020 const PtypeO king = newPtypeO(BLACK, KING);
00021 for (int i=0; i<8; ++i)
00022 {
00023 const Offset king_position = normal[i];
00024 for (int j=0; j<8; ++j)
00025 {
00026 const Offset target = normal[j];
00027 if (i==j)
00028 continue;
00029 const int dx = king_position.dx() - target.dx();
00030 const int dy = king_position.dy() - target.dy();
00031 const EffectContent effect
00032 = Ptype_Table.getEffect(king, Offset32(dx, dy));
00033 if (! effect.hasEffect())
00034 {
00035 reverse[i].push_back(normal[j]);
00036 }
00037 }
00038 }
00039
00040 for (int i=0; i<256; ++i)
00041 {
00042 unsigned int val = i;
00043 while (val)
00044 {
00045 const int j = misc::BitOp::takeOneBit(val);
00046
00047 const Offset8& offsets = reverse[j];
00048 for (Offset8::const_iterator p=offsets.begin(); p!=offsets.end(); ++p)
00049 {
00050 if (! reverse_all[i].isMember(*p))
00051 reverse_all[i].push_back(*p);
00052 }
00053 }
00054 }
00055 }
00056
00057 template <osl::Player Attack>
00058 void
00059 #ifdef __GNUC__
00060 __attribute__ ((used))
00061 #endif
00062 osl::effect_util::
00063 SendOffPosition::find(const NumEffectState& state, Position king_position,
00064 Position8& out)
00065 {
00066 assert(out.empty());
00067 int flags=0;
00068 for (int i=0; i<8; ++i)
00069 {
00070 testPosition<Attack>(state, king_position+table.normal[i], i, flags);
00071 }
00072 const Offset8& offsets = table.reverse_all[flags];
00073 for (size_t i=0; i<offsets.size(); ++i)
00074 {
00075 const Position candidate = king_position + offsets[i];
00076 if (! state.getPieceAt(candidate).isEdge()
00077 && state.countEffect(alt(Attack), candidate) == 1)
00078 out.push_back(candidate);
00079 }
00080 }
00081
00082 void osl::effect_util::
00083 SendOffPosition::find(Player attack, const NumEffectState& state,
00084 Position king_position,
00085 Position8& out)
00086 {
00087 if (attack == BLACK)
00088 find<BLACK>(state, king_position, out);
00089 else
00090 find<WHITE>(state, king_position, out);
00091 }
00092
00093
00094
00095
00096
00097