00001 #ifndef _GENERATE_PIECE_MOVES_TCC
00002 #define _GENERATE_PIECE_MOVES_TCC
00003 #include "osl/move_generator/pieceOnBoard.h"
00004 #include "osl/move_action/concept.h"
00005 namespace osl
00006 {
00007 namespace move_generator
00008 {
00009 template<Player P,Ptype Type,PromoteType CanP,Direction Dir>
00010 template<class Action>
00011 void bits::PieceOnBoardLong<P,Type,CanP,Dir>::
00012 generate(const SimpleState& state,Position pos, Action& action)
00013 {
00014
00015 const Offset offset=DirectionPlayerTraits<Dir,P>::offset();
00016 assert(!offset.zero());
00017 Position toPos=pos+offset;
00018 Piece p1=state.getPieceAt(toPos);
00019 while(p1.isEmpty()){
00020 if(CanP==CanPromoteType
00021 || (CanP==CheckPromoteType && toPos.canPromote<P>())){
00022 action.simpleMove(pos,toPos,PtypeFuns<Type>::promotePtype,true,P);
00023 if(PtypePlayerTraits<Type,P>::canDropTo(toPos))
00024 action.simpleMove(pos,toPos,Type,false,P);
00025 }
00026 else{
00027 action.simpleMove(pos,toPos,Type,false,P);
00028 }
00029 toPos=toPos+offset;
00030 p1=state.getPieceAt(toPos);
00031 }
00032 if(p1.canMoveOn<P>()){
00033 if(CanP==CanPromoteType
00034 || (CanP==CheckPromoteType && toPos.canPromote<P>())){
00035 action.unknownMove(pos,toPos,p1,PtypeFuns<Type>::promotePtype,true,P);
00036 if (PtypePlayerTraits<Type,P>::canDropTo(toPos))
00037 action.unknownMove(pos,toPos,p1,Type,false,P);
00038 }
00039 else{
00040 action.unknownMove(pos,toPos,p1,Type,false,P);
00041 }
00042 }
00043 }
00044
00045
00046 template<Player P,Ptype T,Ptype MoveT,PromoteType CanP>
00047 template<class Action>
00048 void PieceOnBoardTypePromotion<P,T,MoveT,CanP>::
00049 generate(const SimpleState& state,Position pos,
00050 Action& action)
00051 {
00052 PieceOnBoardDir<P,T,MoveT,CanP,UL>::generate(state,pos,action);
00053 PieceOnBoardDir<P,T,MoveT,CanP,U>::generate(state,pos,action);
00054 PieceOnBoardDir<P,T,MoveT,CanP,UR>::generate(state,pos,action);
00055 PieceOnBoardDir<P,T,MoveT,CanP,L>::generate(state,pos,action);
00056 PieceOnBoardDir<P,T,MoveT,CanP,R>::generate(state,pos,action);
00057 PieceOnBoardDir<P,T,MoveT,CanP,DL>::generate(state,pos,action);
00058 PieceOnBoardDir<P,T,MoveT,CanP,D>::generate(state,pos,action);
00059 PieceOnBoardDir<P,T,MoveT,CanP,DR>::generate(state,pos,action);
00060 PieceOnBoardDir<P,T,MoveT,CanP,UUL>::generate(state,pos,action);
00061 PieceOnBoardDir<P,T,MoveT,CanP,UUR>::generate(state,pos,action);
00062 PieceOnBoardDir<P,T,MoveT,CanP,LONG_UL>::generate(state,pos,action);
00063 PieceOnBoardDir<P,T,MoveT,CanP,LONG_U>::generate(state,pos,action);
00064 PieceOnBoardDir<P,T,MoveT,CanP,LONG_UR>::generate(state,pos,action);
00065 PieceOnBoardDir<P,T,MoveT,CanP,LONG_L>::generate(state,pos,action);
00066 PieceOnBoardDir<P,T,MoveT,CanP,LONG_R>::generate(state,pos,action);
00067 PieceOnBoardDir<P,T,MoveT,CanP,LONG_DL>::generate(state,pos,action);
00068 PieceOnBoardDir<P,T,MoveT,CanP,LONG_D>::generate(state,pos,action);
00069 PieceOnBoardDir<P,T,MoveT,CanP,LONG_DR>::generate(state,pos,action);
00070 }
00071
00072 template <Player P>
00073 template <class Action>
00074 void PieceOnBoard<P>::
00075 generate(const SimpleState& state,Piece p, Action& action)
00076 {
00077 if (p.ptype() == PPAWN)
00078 {
00079 PieceOnBoardType<P, PPAWN>::generate(state,p,action);
00080 }
00081 else if (p.ptype() == PLANCE)
00082 {
00083 PieceOnBoardType<P, PLANCE>::generate(state,p,action);
00084 }
00085 else if (p.ptype() == PKNIGHT)
00086 {
00087 PieceOnBoardType<P, PKNIGHT>::generate(state,p,action);
00088 }
00089 else if (p.ptype() == PSILVER)
00090 {
00091 PieceOnBoardType<P, PSILVER>::generate(state,p,action);
00092 }
00093 else if (p.ptype() == PBISHOP)
00094 {
00095 PieceOnBoardType<P, PBISHOP>::generate(state,p,action);
00096 }
00097 else if (p.ptype() == PROOK)
00098 {
00099 PieceOnBoardType<P, PROOK>::generate(state,p,action);
00100 }
00101 else if (p.ptype() == KING)
00102 {
00103 PieceOnBoardType<P, KING>::generate(state,p,action);
00104 }
00105 else if (p.ptype() == GOLD)
00106 {
00107 PieceOnBoardType<P, GOLD>::generate(state,p,action);
00108 }
00109 else if (p.ptype() == PAWN)
00110 {
00111 PieceOnBoardType<P, PAWN>::generate(state,p,action);
00112 }
00113 else if (p.ptype() == LANCE)
00114 {
00115 PieceOnBoardType<P, LANCE>::generate(state,p,action);
00116 }
00117 else if (p.ptype() == KNIGHT)
00118 {
00119 PieceOnBoardType<P, KNIGHT>::generate(state,p,action);
00120 }
00121 else if (p.ptype() == SILVER)
00122 {
00123 PieceOnBoardType<P, SILVER>::generate(state,p,action);
00124 }
00125 else if (p.ptype() == BISHOP)
00126 {
00127 PieceOnBoardType<P, BISHOP>::generate(state,p,action);
00128 }
00129 else if (p.ptype() == ROOK)
00130 {
00131 PieceOnBoardType<P, ROOK>::generate(state,p,action);
00132 }
00133 }
00134
00135
00136 }
00137 }
00138
00139 #endif
00140
00141
00142
00143
00144