00001
00002
00003 #ifndef _ORACLEADUST_H
00004 #define _ORACLEADUST_H
00005
00006 #include "osl/state/numEffectState.h"
00007
00008 namespace osl
00009 {
00010 namespace checkmate
00011 {
00012 struct OracleAdjust
00013 {
00014 static const Move attack(const NumEffectState& state, Move check_move)
00015 {
00016 assert(check_move.isValid());
00017 if (! check_move.isDrop())
00018 {
00019
00020 const Ptype existing = state.getPieceOnBoard(check_move.to()).ptype();
00021 if (existing == KING)
00022 return Move();
00023 check_move.setCapturePtype(existing);
00024
00025
00026 if (state.getPieceOnBoard(check_move.from()).ptype() != check_move.oldPtype()
00027 && Ptype_Table.hasLongMove(check_move.ptype())) {
00028 Piece p;
00029 switch (unpromote(check_move.ptype())) {
00030 case ROOK: p = state.effectPtype<ROOK>(check_move.player(), check_move.to());
00031 break;
00032 case BISHOP: p = state.effectPtype<BISHOP>(check_move.player(), check_move.to());
00033 break;
00034 case LANCE: p = state.effectPtype<LANCE>(check_move.player(), check_move.to());
00035 break;
00036 default:
00037 assert(0);
00038 }
00039 if (p.isPiece()) {
00040 if (check_move.oldPtype() == p.ptype())
00041 check_move.setFrom(p.position());
00042 else if (check_move.ptype() == p.ptype())
00043 check_move = Move(p.position(), check_move.to(), check_move.ptype(),
00044 check_move.capturePtype(), false, check_move.player());
00045 if (! state.isValidMoveByRule(check_move, false))
00046 return Move();
00047 }
00048 }
00049 }
00050 if (! state.isAlmostValidMove<false>(check_move))
00051 return Move();
00052 return check_move;
00053 }
00054 };
00055 }
00056 }
00057
00058
00059 #endif
00060
00061
00062
00063