00001
00002
00003 #ifndef PROGRESS_EFFECT5X3D_H
00004 #define PROGRESS_EFFECT5X3D_H
00005
00006 #include "osl/progress/progress16.h"
00007 #include "osl/state/numEffectState.h"
00008 #include "osl/centering5x3.h"
00009 #include "osl/misc/carray.h"
00010 #include <algorithm>
00011 namespace osl
00012 {
00013 namespace progress
00014 {
00021 struct Effect5x3d
00022 {
00031 static int makeProgress(Player defense, const NumEffectState& state,
00032 Position king);
00033 static int makeProgress(Player defense, const NumEffectState& state){
00034 return makeProgress(defense,state,state.getKingPosition(defense));
00035 }
00036 static int makeProgress(const NumEffectState& state)
00037 {
00038 return makeProgress(BLACK, state) + makeProgress(WHITE, state);
00039 }
00043 static const Progress16 progress16(int progress)
00044 {
00045 assert(progress >= 0);
00046 const int rank = progress / 8 - 16;
00047 return Progress16(std::max(std::min(rank, 15), 0));
00048 }
00053 static const Progress16 progress16each(int progress)
00054 {
00055 assert(progress >= 0);
00056 const int rank = progress / 8 - 8;
00057 return Progress16(std::max(std::min(rank, 15), 0));
00058 }
00059 private:
00060 CArray<int,2> progresses;
00061 public:
00062 explicit Effect5x3d(const NumEffectState& state)
00063 {
00064 progresses[playerToIndex(BLACK)]=makeProgress(BLACK, state);
00065 progresses[playerToIndex(WHITE)]=makeProgress(WHITE, state);
00066 }
00067 void changeTurn() {}
00068 int progress(Player p) const { return progresses[playerToIndex(p)]; }
00069 const Progress16 progress16() const
00070 {
00071 return progress16(progresses[0] + progresses[1]);
00072 }
00073 const Progress16 progress16(Player p) const
00074 {
00075 return progress16each(progress(p));
00076 }
00077
00078 void update(const NumEffectState& new_state, Move last_move);
00079 };
00080 }
00081 }
00082
00083 #endif
00084
00085
00086
00087