00001 #ifndef _GENERATE_DROP_MOVES_TCC
00002 #define _GENERATE_DROP_MOVES_TCC
00003 #include "osl/move_generator/drop.h"
00004 #include "osl/move_action/concept.h"
00005 namespace osl
00006 {
00007 namespace move_generator
00008 {
00009 namespace drop
00010 {
00015 template<Player P,class Action,bool hasPawn,bool hasLance,bool hasKnight,int N>
00016 void
00017 generateX(const NumEffectState& state,Action& action,int x,Move m1,Move m2,Move m3,Ptype t1,Ptype t2,Ptype t3)
00018 {
00019 assert(hasPawn || hasLance || hasKnight || N>0);
00020 if(P==BLACK){
00021 if(N>0){
00022 Position pos(x,1);
00023 Piece p=state.getPieceAt(pos);
00024 if(p.isEmpty()){
00025 if(N==4){
00026 action.dropMove(pos,ROOK,P);
00027 action.dropMove(pos,BISHOP,P);
00028 action.dropMove(pos,GOLD,P);
00029 action.dropMove(pos,SILVER,P);
00030 }
00031 else{
00032 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00033 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00034 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00035 }
00036 }
00037 }
00038 if(hasPawn || hasLance || N>0){
00039 Position pos(x,2);
00040 Piece p=state.getPieceAt(pos);
00041 if(p.isEmpty()){
00042 if(N==4){
00043 action.dropMove(pos,ROOK,P);
00044 action.dropMove(pos,BISHOP,P);
00045 action.dropMove(pos,GOLD,P);
00046 action.dropMove(pos,SILVER,P);
00047 }
00048 else{
00049 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00050 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00051 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00052 }
00053 if(hasLance)
00054 action.dropMove(pos,LANCE,P);
00055 if(hasPawn)
00056 action.dropMove(pos,PAWN,P);
00057 }
00058 }
00059 for(int y=3;y<=9;y++){
00060 Position pos(x,y);
00061 Piece p=state.getPieceAt(pos);
00062 if(p.isEmpty()){
00063 if(N==4){
00064 action.dropMove(pos,ROOK,P);
00065 action.dropMove(pos,BISHOP,P);
00066 action.dropMove(pos,GOLD,P);
00067 action.dropMove(pos,SILVER,P);
00068 }
00069 else{
00070 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00071 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00072 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00073 }
00074 if(hasKnight)
00075 action.dropMove(pos,KNIGHT,P);
00076 if(hasLance)
00077 action.dropMove(pos,LANCE,P);
00078 if(hasPawn)
00079 action.dropMove(pos,PAWN,P);
00080 }
00081 }
00082 }
00083 else{
00084 if(N>0){
00085 Position pos(x,9);
00086 Piece p=state.getPieceAt(pos);
00087 if(p.isEmpty()){
00088 if(N==4){
00089 action.dropMove(pos,ROOK,P);
00090 action.dropMove(pos,BISHOP,P);
00091 action.dropMove(pos,GOLD,P);
00092 action.dropMove(pos,SILVER,P);
00093 }
00094 else{
00095 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00096 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00097 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00098 }
00099 }
00100 }
00101 if(hasPawn || hasLance || N>0){
00102 Position pos(x,8);
00103 Piece p=state.getPieceAt(pos);
00104 if(p.isEmpty()){
00105 if(N==4){
00106 action.dropMove(pos,ROOK,P);
00107 action.dropMove(pos,BISHOP,P);
00108 action.dropMove(pos,GOLD,P);
00109 action.dropMove(pos,SILVER,P);
00110 }
00111 else{
00112 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00113 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00114 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00115 }
00116 if(hasLance)
00117 action.dropMove(pos,LANCE,P);
00118 if(hasPawn)
00119 action.dropMove(pos,PAWN,P);
00120 }
00121 }
00122 for(int y=7;y>=1;y--){
00123 Position pos(x,y);
00124 Piece p=state.getPieceAt(pos);
00125 if(p.isEmpty()){
00126 if(N==4){
00127 action.dropMove(pos,ROOK,P);
00128 action.dropMove(pos,BISHOP,P);
00129 action.dropMove(pos,GOLD,P);
00130 action.dropMove(pos,SILVER,P);
00131 }
00132 else{
00133 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
00134 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
00135 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
00136 }
00137 if(hasKnight)
00138 action.dropMove(pos,KNIGHT,P);
00139 if(hasLance)
00140 action.dropMove(pos,LANCE,P);
00141 if(hasPawn)
00142 action.dropMove(pos,PAWN,P);
00143 }
00144 }
00145 }
00146 }
00147
00148 template<Player P,class Action,bool hasPawn,bool hasLance,bool hasKnight,int N>
00149 void
00150 generate(const NumEffectState& state,Action& action,Move m1,Move m2,Move m3,Ptype t1,Ptype t2,Ptype t3)
00151 {
00152 if(hasPawn || hasLance || hasKnight || N>0){
00153 if(hasPawn){
00154 if(hasLance || hasKnight || N>0){
00155 for(int x=9;x>0;x--){
00156 if(state.isPawnMaskSet<P>(x))
00157 generateX<P,Action,false,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
00158 else
00159 generateX<P,Action,true,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
00160 }
00161 }
00162 else{
00163 for(int x=9;x>0;x--){
00164 if(!state.isPawnMaskSet<P>(x))
00165 generateX<P,Action,true,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
00166 }
00167 }
00168 }
00169 else{
00170 for(int x=9;x>0;x--){
00171 generateX<P,Action,false,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
00172 }
00173 }
00174 }
00175 }
00176
00177
00178 template<Player P,class Action,bool hasPawn,bool hasLance,bool hasKnight>
00179 static void checkSilver(const NumEffectState& state,Action& action)
00180 {
00181 if(state.template hasPieceOnStand<SILVER>(P)){
00182 if(state.template hasPieceOnStand<GOLD>(P)){
00183 if(state.template hasPieceOnStand<BISHOP>(P)){
00184 if(state.template hasPieceOnStand<ROOK>(P))
00185 generate<P,Action,hasPawn,hasLance,hasKnight,4>(
00186 state,action,
00187 Move::makeDirect(0),Move::makeDirect(0),Move::makeDirect(0),
00188 PTYPE_EMPTY,PTYPE_EMPTY,PTYPE_EMPTY);
00189 else
00190 generate<P,Action,hasPawn,hasLance,hasKnight,3>(
00191 state,action,
00192 Move(Position::STAND(),BISHOP,P),
00193 Move(Position::STAND(),GOLD,P),
00194 Move(Position::STAND(),SILVER,P),
00195 BISHOP,GOLD,SILVER);
00196 }
00197 else if(state.template hasPieceOnStand<ROOK>(P))
00198 generate<P,Action,hasPawn,hasLance,hasKnight,3>(
00199 state,action,
00200 Move(Position::STAND(),ROOK,P),
00201 Move(Position::STAND(),GOLD,P),
00202 Move(Position::STAND(),SILVER,P),
00203 ROOK,GOLD,SILVER);
00204 else
00205 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00206 state,action,
00207 Move(Position::STAND(),GOLD,P),
00208 Move(Position::STAND(),SILVER,P),
00209 Move::makeDirect(0),
00210 GOLD,SILVER,PTYPE_EMPTY);
00211 }
00212 else if(state.template hasPieceOnStand<BISHOP>(P)){
00213 if(state.template hasPieceOnStand<ROOK>(P))
00214 generate<P,Action,hasPawn,hasLance,hasKnight,3>(
00215 state,action,
00216 Move(Position::STAND(),ROOK,P),
00217 Move(Position::STAND(),BISHOP,P),
00218 Move(Position::STAND(),SILVER,P),
00219 ROOK,BISHOP,SILVER);
00220 else
00221 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00222 state,action,
00223 Move(Position::STAND(),BISHOP,P),
00224 Move(Position::STAND(),SILVER,P),
00225 Move::makeDirect(0),
00226 BISHOP,SILVER,PTYPE_EMPTY);
00227 }
00228 else if(state.template hasPieceOnStand<ROOK>(P))
00229 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00230 state,action,
00231 Move(Position::STAND(),ROOK,P),
00232 Move(Position::STAND(),SILVER,P),
00233 Move::makeDirect(0),
00234 ROOK,SILVER,PTYPE_EMPTY);
00235 else
00236 generate<P,Action,hasPawn,hasLance,hasKnight,1>(
00237 state,action,
00238 Move(Position::STAND(),SILVER,P),
00239 Move::makeDirect(0),
00240 Move::makeDirect(0),
00241 SILVER,PTYPE_EMPTY,PTYPE_EMPTY);
00242 }
00243 else if(state.template hasPieceOnStand<GOLD>(P)){
00244 if(state.template hasPieceOnStand<BISHOP>(P)){
00245 if(state.template hasPieceOnStand<ROOK>(P))
00246 generate<P,Action,hasPawn,hasLance,hasKnight,3>(
00247 state,action,
00248 Move(Position::STAND(),ROOK,P),
00249 Move(Position::STAND(),BISHOP,P),
00250 Move(Position::STAND(),GOLD,P),
00251 ROOK,BISHOP,GOLD);
00252 else
00253 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00254 state,action,
00255 Move(Position::STAND(),BISHOP,P),
00256 Move(Position::STAND(),GOLD,P),
00257 Move::makeDirect(0),
00258 BISHOP,GOLD,PTYPE_EMPTY);
00259 }
00260 else if(state.template hasPieceOnStand<ROOK>(P))
00261 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00262 state,action,
00263 Move(Position::STAND(),ROOK,P),
00264 Move(Position::STAND(),GOLD,P),
00265 Move::makeDirect(0),
00266 ROOK,GOLD,PTYPE_EMPTY);
00267 else
00268 generate<P,Action,hasPawn,hasLance,hasKnight,1>(
00269 state,action,
00270 Move(Position::STAND(),GOLD,P),
00271 Move::makeDirect(0),
00272 Move::makeDirect(0),
00273 GOLD,PTYPE_EMPTY,PTYPE_EMPTY);
00274 }
00275 else if(state.template hasPieceOnStand<BISHOP>(P)){
00276 if(state.template hasPieceOnStand<ROOK>(P))
00277 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
00278 state,action,
00279 Move(Position::STAND(),ROOK,P),
00280 Move(Position::STAND(),BISHOP,P),
00281 Move::makeDirect(0),
00282 ROOK,BISHOP,PTYPE_EMPTY);
00283 else
00284 generate<P,Action,hasPawn,hasLance,hasKnight,1>(
00285 state,action,
00286 Move(Position::STAND(),BISHOP,P),
00287 Move::makeDirect(0),
00288 Move::makeDirect(0),
00289 BISHOP,PTYPE_EMPTY,PTYPE_EMPTY);
00290 }
00291 else if(state.template hasPieceOnStand<ROOK>(P))
00292 generate<P,Action,hasPawn,hasLance,hasKnight,1>(
00293 state,action,
00294 Move(Position::STAND(),ROOK,P),
00295 Move::makeDirect(0),
00296 Move::makeDirect(0),
00297 ROOK,PTYPE_EMPTY,PTYPE_EMPTY);
00298 else
00299 generate<P,Action,hasPawn,hasLance,hasKnight,0>(
00300 state,action,
00301 Move::makeDirect(0),
00302 Move::makeDirect(0),
00303 Move::makeDirect(0),
00304 PTYPE_EMPTY,PTYPE_EMPTY,PTYPE_EMPTY);
00305 }
00306
00307 template<Player P,class Action,bool hasPawn,bool hasLance>
00308 static void checkKnight(const NumEffectState& state,Action& action)
00309 {
00310 if(state.template hasPieceOnStand<KNIGHT>(P))
00311 checkSilver<P,Action,hasPawn,hasLance,true>(state,action);
00312 else
00313 checkSilver<P,Action,hasPawn,hasLance,false>(state,action);
00314 }
00315
00316 template<Player P,class Action,bool hasPawn>
00317 static void checkLance(const NumEffectState& state,Action& action)
00318 {
00319 if(state.template hasPieceOnStand<LANCE>(P))
00320 checkKnight<P,Action,hasPawn,true>(state,action);
00321 else
00322 checkKnight<P,Action,hasPawn,false>(state,action);
00323 }
00324
00325 }
00326 using drop::checkLance;
00327
00328 template<class Action>
00329 template<osl::Player P>
00330 void osl::move_generator::Drop<Action>::
00331 generate(const NumEffectState& state,Action& action)
00332 {
00333 if(state.template hasPieceOnStand<PAWN>(P))
00334 checkLance<P,Action,true>(state,action);
00335 else
00336 checkLance<P,Action,false>(state,action);
00337 }
00338 }
00339 }
00340
00341 #endif
00342
00343
00344
00345