00001 #ifndef _GENERATER_ADD_EFFECT_WITH_EFFECT_TCC
00002 #define _GENERATER_ADD_EFFECT_WITH_EFFECT_TCC
00003
00004 #include "osl/move_generator/addEffectWithEffect.h"
00005 #include "osl/move_generator/open.h"
00006
00007 namespace osl
00008 {
00009 namespace move_generator
00010 {
00011 template<class State,class Action>
00012 template<Player P>
00013 void AddEffectWithEffect<State,Action>::generateMoves(const State& state,Position pos,Action& action)
00014 {
00015 generateEffectDir<P,U>(state,pos,action);
00016 generateEffectDir<P,UL>(state,pos,action);
00017 generateEffectDir<P,UR>(state,pos,action);
00018 generateEffectDir<P,L>(state,pos,action);
00019 generateEffectDir<P,R>(state,pos,action);
00020 generateEffectDir<P,DL>(state,pos,action);
00021 generateEffectDir<P,D>(state,pos,action);
00022 generateEffectDir<P,DR>(state,pos,action);
00023 generateEffectDirKnight<P,UUL>(state,pos,action);
00024 generateEffectDirKnight<P,UUR>(state,pos,action);
00025 }
00026
00033 template<class State,class Action>
00034 template<Player P,Direction Dir>
00035 void AddEffectWithEffect<State,Action>::generateEffectDir(const State& state,Position to,Action& action){
00036 BOOST_STATIC_ASSERT( (Dir != UUL && Dir!= UUR ));
00037 Position from=to-DirectionPlayerTraits<Dir,P>::offset();
00038 Piece p=state.getPieceAt(from);
00039 if(p.isEmpty()){
00040
00041 generateDrop<P,Dir,PAWN>(state,from,action);
00042 generateDrop<P,Dir,SILVER>(state,from,action);
00043 generateDrop<P,Dir,GOLD>(state,from,action);
00044 generateDrop<P,Dir,LANCE>(state,from,action);
00045 generateDrop<P,Dir,BISHOP>(state,from,action);
00046 generateDrop<P,Dir,ROOK>(state,from,action);
00047
00048 generateSimpleMovesTo<P,Dir,PAWN>(state,from,action);
00049 generateSimpleMovesTo<P,Dir,KNIGHT>(state,from,action);
00050 generateSimpleMovesTo<P,Dir,SILVER>(state,from,action);
00051 generateSimpleMovesTo<P,Dir,GOLD>(state,from,action);
00052 generateSimpleMovesTo<P,Dir,KING>(state,from,action);
00053 generateSimpleMovesTo<P,Dir,LANCE>(state,from,action);
00054 generateSimpleMovesTo<P,Dir,BISHOP>(state,from,action);
00055 generateSimpleMovesTo<P,Dir,ROOK> (state,from,action);
00056
00057
00058 from-=DirectionPlayerTraits<Dir,P>::offset();
00059 p=state.getPieceAt(from);
00060 while(p.isEmpty()){
00061
00062 generateDrop<P,Dir,LANCE>(state,from,action);
00063 generateDrop<P,Dir,BISHOP>(state,from,action);
00064 generateDrop<P,Dir,ROOK>(state,from,action);
00065
00066
00067 generateSimpleMovesTo<P,DirectionTraits<Dir>::longDir,BISHOP>
00068 (state,from,action);
00069 generateSimpleMovesTo<P,DirectionTraits<Dir>::longDir,ROOK>
00070 (state,from,action);
00071 from-=DirectionPlayerTraits<Dir,P>::offset();
00072 p=state.getPieceAt(from);
00073 }
00074 if(canMoveOn<P>(p)){
00075
00076
00077 generateCaptureMovesTo<P,DirectionTraits<Dir>::longDir,LANCE>
00078 (state,from,action);
00079 generateCaptureMovesTo<P,DirectionTraits<Dir>::longDir,BISHOP>
00080 (state,from,action);
00081 generateCaptureMovesTo<P,DirectionTraits<Dir>::longDir,ROOK>
00082 (state,from,action);
00083 }
00084 else if(!isEdge(p)){
00085 assert(p.owner()==P);
00086
00087 if (state.template hasEffectDir<DirectionTraits<Dir>::longDir,P>(from))
00088 {
00089 typedef typename State::simple_board_t simple_board_t;
00090 Open<P>::template
00091 generateOpenAttack<simple_board_t,Action,DirectionTraitsGen<Dir>::primDir>
00092 (state,from,p,action,to);
00093 }
00094 }
00095 }
00096 else if(canMoveOn<P>(p)){
00097 assert(p.owner()==alt(P));
00098
00099
00100 generateCaptureMovesTo<P,Dir,PAWN>(state,from,action);
00101 generateCaptureMovesTo<P,Dir,KNIGHT>(state,from,action);
00102 generateCaptureMovesTo<P,Dir,SILVER>(state,from,action);
00103 generateCaptureMovesTo<P,Dir,GOLD>(state,from,action);
00104 generateCaptureMovesTo<P,Dir,KING>(state,from,action);
00105
00106 generateCaptureMovesTo<P,Dir,LANCE>(state,from,action);
00107 generateCaptureMovesTo<P,Dir,BISHOP>(state,from,action);
00108 generateCaptureMovesTo<P,Dir,ROOK>(state,from,action);
00109 }
00110 else if(!isEdge(p)){
00111
00112 assert(p.owner()==P);
00113 if (state.template hasEffectDir<DirectionTraits<Dir>::longDir,P>(from))
00114 {
00115 typedef typename State::simple_board_t simple_board_t;
00116 Open<P>::template
00117 generateOpenAttack<simple_board_t,Action,DirectionTraitsGen<Dir>::primDir>
00118 (state,from,p,action,to);
00119 }
00120 }
00121 }
00122 }
00123 }
00124 #endif
00125
00126
00127
00128