00001
00002
00003 #ifndef _DOUNDOMOVELOCK_TCC
00004 #define _DOUNDOMOVELOCK_TCC
00005
00006 #include "osl/apply_move/doUndoMoveLock.h"
00007 #include "osl/state/simpleState.h"
00008
00009 template <class State>
00010 void osl::apply_move::DoUndoMoveLock::
00011 init(State& s, osl::Move move)
00012 {
00013 state = &s;
00014 assert(state->getTurn() == move.player());
00015 assert(move.isValid());
00016 const Position from=move.from();
00017 const Position to=move.to();
00018 if (from.isPieceStand())
00019 {
00020 assert(state->getPieceAt(to) == Piece::EMPTY());
00021 cleaner.reset(new DoUndoMoveLockDrop<State>(s,to,move.ptype()));
00022 }
00023 else
00024 {
00025 assert(state->getPieceAt(from) != Piece::EMPTY());
00026 const Piece captured=state->getPieceAt(to);
00027 if (captured != Piece::EMPTY())
00028 {
00029 cleaner.reset(new DoUndoMoveLockCapture<State>
00030 (s,from,to,captured,move.promoteMask()));
00031 }
00032 else
00033 {
00034 cleaner.reset(new DoUndoMoveLockSimple<State>
00035 (s,from,to,move.promoteMask()));
00036 }
00037 }
00038 state->changeTurn();
00039 }
00040
00041 #endif
00042
00043
00044
00045