00001 #ifndef _GENERATE_OPEN_MOVES_TCC
00002 #define _GENERATE_OPEN_MOVES_TCC
00003
00004 #include "osl/move_generator/open.h"
00005 #include "osl/move_generator/pieceOnBoard.tcc"
00006 #include "osl/move_action/noAddEffectFilter.h"
00007
00008 namespace osl
00009 {
00010 namespace move_generator
00011 {
00012
00013 template <Player P>
00014 template<class Action,Ptype Type,PromoteType CanP,Direction Dir>
00015
00016 void Open<P>::
00017 generateMoveNotDir3(const SimpleState& state,Piece p,Action& action,Position to,Int2Type<true>){
00018
00019
00020 typedef move_action::NoAddEffectFilter<Action> action_t;
00021 action_t newAction(state,action,to);
00022
00023
00024 bits::PieceOnBoardDirUnsafe<P,Type,CanP,Dir>::
00025 generate(state,p.position(),newAction);
00026 }
00027
00028
00030 template <Player P>
00031 template<class Action,Ptype Type,Direction Dir>
00032 void Open<P>::
00033 generateMoveNotDir(const SimpleState& state,Piece p,Action& action,Position to){
00034 generateMoveNotDirSub<Action,Type,Dir>(state,p,action,to,Int2Type<PtypeTraits<Type>::canPromote>());
00035 }
00036
00037 template <Player P>
00038 template<class Action,Direction Dir>
00039 void Open<P>::
00040 generateOpenAttack(const SimpleState& state,Piece p,Action& action,Position to){
00041
00042 assert(p.owner()==P);
00043 switch(p.ptype()){
00044 case PAWN: generateMoveNotDir<Action,PAWN,Dir>(state,p,action,to); break;
00045 case LANCE: generateMoveNotDir<Action,LANCE,Dir>(state,p,action,to); break;
00046 case KNIGHT: generateMoveNotDir<Action,KNIGHT,Dir>(state,p,action,to); break;
00047 case SILVER: generateMoveNotDir<Action,SILVER,Dir>(state,p,action,to); break;
00048
00049 case GOLD: generateMoveNotDir<Action,GOLD,Dir>(state,p,action,to); break;
00050 case PPAWN: generateMoveNotDir<Action,PPAWN,Dir>(state,p,action,to); break;
00051 case PLANCE: generateMoveNotDir<Action,PLANCE,Dir>(state,p,action,to); break;
00052 case PKNIGHT: generateMoveNotDir<Action,PKNIGHT,Dir>(state,p,action,to); break;
00053 case PSILVER: generateMoveNotDir<Action,PSILVER,Dir>(state,p,action,to); break;
00054
00055 case BISHOP: generateMoveNotDir<Action,BISHOP,Dir>(state,p,action,to); break;
00056 case PBISHOP: generateMoveNotDir<Action,PBISHOP,Dir>(state,p,action,to); break;
00057 case ROOK: generateMoveNotDir<Action,ROOK,Dir>(state,p,action,to); break;
00058 case PROOK: generateMoveNotDir<Action,PROOK,Dir>(state,p,action,to); break;
00059 case KING: generateMoveNotDir<Action,KING,Dir>(state,p,action,to); break;
00060 default: abort();
00061 }
00062 }
00063
00064 }
00065 }
00066
00067 template<osl::Player P>
00068 template<class Action>
00069 void osl::move_generator::Open<P>::
00070 generate(const SimpleState& state,Piece p,Action& action,Position to,Direction dir)
00071 {
00072 switch(dir){
00073 case UL: generateOpenAttack<Action,UL>(state,p,action,to); break;
00074 case U: generateOpenAttack<Action,U>(state,p,action,to); break;
00075 case UR: generateOpenAttack<Action,UR>(state,p,action,to); break;
00076 case L: generateOpenAttack<Action,L>(state,p,action,to); break;
00077 case R: generateOpenAttack<Action,L>(state,p,action,to); break;
00078 case DL: generateOpenAttack<Action,UR>(state,p,action,to); break;
00079 case D: generateOpenAttack<Action,U>(state,p,action,to); break;
00080 case DR: generateOpenAttack<Action,UL>(state,p,action,to); break;
00081 default: assert(0);
00082 }
00083 }
00084
00085 #endif
00086
00087
00088
00089