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