00001
00002
00003 #ifndef PROGRESS_EFFECT5X3_H
00004 #define PROGRESS_EFFECT5X3_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 {
00026 struct Effect5x3
00027 {
00028 private:
00029 static void updateStand(int& old_stand, Move last_move);
00030 static int makeProgressAll(Player defense, const NumEffectState& state,
00031 Position king);
00032 static int makeProgressArea(Player attack, const NumEffectState& state,
00033 Position king);
00034 template <Player Attack>
00035 static int makeProgressAreaBonus(const NumEffectState& state,
00036 Position king);
00037 template <Player Attack, bool AlwaysPromotable, bool AlwaysNotPromotable>
00038 static int makeProgressAreaBonus(const NumEffectState& state,
00039 Position king, Position center);
00040 static int attackEffect3(const NumEffectState& state, Player attack, Position target);
00041 public:
00042 static int makeProgressStand(Player attack, const NumEffectState& state);
00051 static int makeProgress(Player defense, const NumEffectState& state){
00052 return makeProgressAll(defense,state,state.getKingPosition(defense));
00053 }
00054 static int makeProgress(const NumEffectState& state)
00055 {
00056 return makeProgress(BLACK, state) + makeProgress(WHITE, state);
00057 }
00061 static const Progress16 progress16(int progress)
00062 {
00063 assert(progress >= 0);
00064 const int rank = progress / 8;
00065 return Progress16(std::min(rank, 15));
00066 }
00071 static const Progress16 progress16each(int progress)
00072 {
00073 assert(progress >= 0);
00074 const int rank = progress / 8;
00075 return Progress16(std::min(rank, 15));
00076 }
00077 template <Player Defense>
00078 static PieceMask makeEffectMask(const NumEffectState& state);
00079 private:
00080 CArray<int,2> progresses, progress_bonuses, stand_progresses;
00081 CArray<PieceMask, 2> effect_mask;
00082 void updateProgressBonuses(const NumEffectState& state);
00083 public:
00084 explicit Effect5x3(const NumEffectState& state);
00085 void changeTurn() {}
00086 int progress(Player p) const { return progresses[playerToIndex(p)]; }
00087 const Progress16 progress16() const
00088 {
00089 return progress16(progresses[0] + progresses[1]);
00090 }
00091 const Progress16 progress16(Player p) const
00092 {
00093 return progress16each(progress(p));
00094 }
00095 const Progress16 progress16bonus(Player p) const
00096 {
00097 return progress16each(progress_bonuses[playerToIndex(p)] +
00098 stand_progresses[playerToIndex(p)]);
00099 }
00100
00101 int countEffectPieces(const NumEffectState &state, Player attack) const;
00102
00103 const PieceMask effect5x3Mask(Player p) const {
00104 return effect_mask[playerToIndex(p)]; }
00105
00106 Effect5x3 expect(const NumEffectState& state, Move move) const;
00107 void update(const NumEffectState& new_state, Move last_move);
00108 };
00109 }
00110 }
00111
00112 #endif
00113
00114
00115
00116