00001 #include "osl/record/kanjiPrint.h"
00002 #include "osl/record/kanjiCode.h"
00003 #include "osl/ptype.h"
00004 #include "osl/pieceStand.h"
00005 #include "osl/move.h"
00006 #include "osl/misc/carray.h"
00007 #ifndef _WIN32
00008 #include "osl/misc/iconvConvert.h"
00009 #else
00010 #include "osl/misc/characterEncodingConvertWin32.h"
00011 #endif
00012 #include <boost/foreach.hpp>
00013 #include <iostream>
00014 #include <string>
00015 #include <algorithm>
00016 #include <cctype>
00017
00018 bool caseInsentiveCharCompare(char a, char b)
00019 {
00020 return toupper(a) == toupper(b);
00021 }
00022
00023 bool caseInsentiveCompare(const std::string& s1, const std::string& s2)
00024 {
00025 return s1.size() == s2.size() &&
00026 equal(s1.begin(), s1.end(), s2.begin(), caseInsentiveCharCompare);
00027 }
00028
00029 const osl::record::Color osl::record::Color::NONE ("", "NONE", false);
00030 const osl::record::Color osl::record::Color::Black ("0;30", "BLACK");
00031 const osl::record::Color osl::record::Color::Red ("0;31", "RED");
00032 const osl::record::Color osl::record::Color::Green ("0;32", "GREEN");
00033 const osl::record::Color osl::record::Color::Brown ("0;33", "BROWN");
00034 const osl::record::Color osl::record::Color::Blue ("0;34", "BLUE");
00035 const osl::record::Color osl::record::Color::Purple ("0;35", "PURPLE");
00036 const osl::record::Color osl::record::Color::Cyan ("0;36", "CYAN");
00037 const osl::record::Color osl::record::Color::LightGray ("0;37", "LIGHTGRAY");
00038 const osl::record::Color osl::record::Color::DarkGray ("1;30", "DARKGRAY");
00039 const osl::record::Color osl::record::Color::LightRed ("1;31", "LIGHTRED");
00040 const osl::record::Color osl::record::Color::LightGreen ("1;32", "LIGHTGREEN");
00041 const osl::record::Color osl::record::Color::Yellow ("1;33", "YELLOW");
00042 const osl::record::Color osl::record::Color::LightBlue ("1;34", "LIGHTBLUE");
00043 const osl::record::Color osl::record::Color::LightPurple ("1;35", "LIGHTPURPLE");
00044 const osl::record::Color osl::record::Color::LightCyan ("1;36", "LIGHTCYAN");
00045 const osl::record::Color osl::record::Color::White ("1;37", "WHITE");
00046
00047 const osl::record::Color osl::record::
00048 Color::colorFor(const std::string& str)
00049 {
00050 static const CArray<const osl::record::Color,17> colors = {{
00051 osl::record::Color::NONE,
00052 osl::record::Color::Black, osl::record::Color::Red,
00053 osl::record::Color::Green, osl::record::Color::Brown,
00054 osl::record::Color::Blue, osl::record::Color::Purple,
00055 osl::record::Color::Cyan, osl::record::Color::LightGray,
00056 osl::record::Color::DarkGray, osl::record::Color::LightRed,
00057 osl::record::Color::LightGreen, osl::record::Color::Yellow,
00058 osl::record::Color::LightBlue, osl::record::Color::LightPurple,
00059 osl::record::Color::LightCyan, osl::record::Color::White}};
00060
00061 BOOST_FOREACH(const record::Color& c, colors)
00062 {
00063 if (caseInsentiveCompare(str, c.getName()))
00064 return c;
00065 }
00066 return osl::record::Color::NONE;
00067 }
00068
00069 osl::record::Color::Color(const std::string& value, const std::string& name, const bool valid)
00070 : value(value), name(name), valid(valid)
00071 {
00072 }
00073 osl::record::Color::~Color()
00074 {
00075 }
00076
00077 std::string osl::record::
00078 kanjiNumber(const int n)
00079 {
00080 assert((1 <= n) && (n <= 18));
00081 switch(n) {
00082 case 1: return K_K1;
00083 case 2: return K_K2;
00084 case 3: return K_K3;
00085 case 4: return K_K4;
00086 case 5: return K_K5;
00087 case 6: return K_K6;
00088 case 7: return K_K7;
00089 case 8: return K_K8;
00090 case 9: return K_K9;
00091 case 10: return K_K10;
00092 case 11: return K_K11;
00093 case 12: return K_K12;
00094 case 13: return K_K13;
00095 case 14: return K_K14;
00096 case 15: return K_K15;
00097 case 16: return K_K16;
00098 case 17: return K_K17;
00099 case 18: return K_K18;
00100 }
00101 assert(false);
00102 return "";
00103 }
00104
00105 osl::record::Characters::~Characters()
00106 {
00107 }
00108
00109 const osl::misc::CArray<std::string,32> osl::record::Characters::stand =
00110 {{
00111 K_NAKAGURO, "+E",
00112 K_PPAWN, K_PLANCE, K_PKNIGHT, K_PSILVER, K_PBISHOP, K_PROOK, K_KING,
00113 K_GOLD, K_PAWN, K_LANCE, K_KNIGHT, K_SILVER, K_BISHOP, K_ROOK,
00114
00115 K_NAKAGURO, "+E",
00116 K_PPAWN, K_PLANCE, K_PKNIGHT, K_PSILVER, K_PBISHOP, K_PROOK, K_KING,
00117 K_GOLD, K_PAWN, K_LANCE, K_KNIGHT, K_SILVER, K_BISHOP, K_ROOK
00118 }};
00119
00120 const osl::misc::CArray<std::string,10> osl::record::StandardCharacters::dan =
00121 {{"", K_K1, K_K2, K_K3, K_K4, K_K5, K_K6, K_K7, K_K8, K_K9}};
00122 const osl::misc::CArray<std::string,10> osl::record::StandardCharacters::suji =
00123 {{"", K_R1, K_R2, K_R3, K_R4, K_R5, K_R6, K_R7, K_R8, K_R9}};
00124 const osl::misc::CArray<std::string,32> osl::record::StandardCharacters::pieces =
00125 {{
00126 K_NAKAGURO, "+E",
00127 K_PPAWN, K_PLANCE, K_PKNIGHT, K_PSILVER, K_PBISHOP, K_PROOK, K_KING,
00128 K_GOLD, K_PAWN, K_LANCE, K_KNIGHT, K_SILVER, K_BISHOP, K_ROOK,
00129
00130 K_NAKAGURO, "+E",
00131 K_PPAWN, K_PLANCE, K_PKNIGHT, K_PSILVER, K_PBISHOP, K_PROOK, K_KING,
00132 K_GOLD, K_PAWN, K_LANCE, K_KNIGHT, K_SILVER, K_BISHOP, K_ROOK
00133 }};
00134
00135 const osl::misc::CArray<std::string,10> osl::record::RussianCharacters::dan = osl::record::StandardCharacters::dan;
00136 const osl::misc::CArray<std::string,10> osl::record::RussianCharacters::suji = osl::record::StandardCharacters::suji;
00137 const osl::misc::CArray<std::string,32> osl::record::RussianCharacters::pieces =
00138 {{
00139 K_NAKAGURO, "+E",
00140 K_PPAWN_R, K_PLANCE_R, K_PKNIGHT_R, K_PSILVER_R, K_PBISHOP_R, K_PROOK_R, K_KING_R,
00141 K_GOLD_R, K_PAWN_R, K_LANCE_R, K_KNIGHT_R, K_SILVER_R, K_BISHOP_R, K_ROOK_R,
00142
00143 K_NAKAGURO, "+E",
00144 K_PPAWN, K_PLANCE, K_PKNIGHT, K_PSILVER, K_PBISHOP, K_PROOK, K_KING,
00145 K_GOLD, K_PAWN, K_LANCE, K_KNIGHT, K_SILVER, K_BISHOP, K_ROOK
00146 }};
00147
00148 const osl::misc::CArray<std::string,10> osl::record::KIFCharacters::dan =
00149 osl::record::StandardCharacters::dan;
00150 const osl::misc::CArray<std::string,10> osl::record::KIFCharacters::suji =
00151 {{"", " " K_R1, " " K_R2, " " K_R3, " " K_R4, " " K_R5, " " K_R6, " " K_R7, " " K_R8, " " K_R9}};
00152 const osl::misc::CArray<std::string,32> osl::record::KIFCharacters::pieces =
00153 {{
00154 " " K_NAKAGURO, "+E",
00155 "v" K_PPAWN, "v" K_PLANCE, "v" K_PKNIGHT, "v" K_PSILVER, "v" K_PBISHOP, "v" K_PROOK, "v" K_KING,
00156 "v" K_GOLD, "v" K_PAWN, "v" K_LANCE, "v" K_KNIGHT, "v" K_SILVER, "v" K_BISHOP, "v" K_ROOK,
00157
00158 " " K_NAKAGURO, "+E",
00159 " " K_PPAWN, " " K_PLANCE, " " K_PKNIGHT, " " K_PSILVER, " " K_PBISHOP, " " K_PROOK, " " K_KING,
00160 " " K_GOLD, " " K_PAWN, " " K_LANCE, " " K_KNIGHT, " " K_SILVER, " " K_BISHOP, " " K_ROOK
00161 }};
00162
00163
00164 std::ostream& osl::record::
00165 operator<<(std::ostream& os, const Color& c)
00166 {
00167 return os << c.value;
00168 }
00169
00170 void osl::record::ChangeShellColor::
00171 escColSet() const
00172 {
00173 if (!color.isValid()) return;
00174 os << "\033[" << color << "m";
00175 }
00176
00177 void osl::record::ChangeShellColor::
00178 escColReSet() const
00179 {
00180 if (!color.isValid()) return;
00181 os << "\033[0m";
00182 }
00183
00184 void osl::record::KanjiPrint::
00185 print(const osl::state::SimpleState& state,
00186 const osl::Move *last_move) const
00187 {
00188 os <<
00189 #ifndef _WIN32
00190 IconvConvert::
00191 #endif
00192 eucToLang(K_WHITE_STAND) << " ";
00193 BOOST_FOREACH(Ptype ptype, PieceStand::order)
00194 {
00195 const int count = state.countPiecesOnStand(WHITE, ptype);
00196 if (count)
00197 os <<
00198 #ifndef _WIN32
00199 IconvConvert::
00200 #endif
00201 eucToLang(pieces->stand_kanji(newPtypeO(BLACK, ptype)))
00202 << count << " ";
00203 }
00204 os << std::endl;
00205
00206 os << " ";
00207 for(int x=9;x>0;x--)
00208 {
00209 os <<
00210 #ifndef _WIN32
00211 IconvConvert::
00212 #endif
00213 eucToLang(pieces->getSuji(x));
00214 }
00215 os << std::endl;
00216
00217 os << "+";
00218 for(int x=9*pieces->getSuji(1).size();x>0;x--)
00219 {
00220 os << "-";
00221 }
00222 os << "+" << std::endl;
00223
00224 for(int y=1;y<=9;y++)
00225 {
00226 os << '|';
00227 for(int x=9;x>0;x--)
00228 {
00229 const PtypeO ptypeo = state.pieceOnBoard(Square(x,y)).ptypeO();
00230 const std::string piece =
00231 #ifndef _WIN32
00232 IconvConvert::
00233 #endif
00234 eucToLang(pieces->kanji(ptypeo));
00235 if (last_move &&
00236 !last_move->isInvalid() &&
00237 last_move->to() == Square(x,y))
00238 {
00239 ChangeShellColor csc(os, last_move_color);
00240 os << piece;
00241 }
00242 else if (isPiece(ptypeo)) {
00243 Player owner = getOwner(ptypeo);
00244 osl::record::Color color;
00245 if (owner == BLACK)
00246 color = black_color;
00247 else
00248 color = white_color;
00249 ChangeShellColor csc(os, color);
00250 os << piece;
00251 }
00252 else
00253 {
00254 os << piece;
00255 }
00256 }
00257 os << '|';
00258 os <<
00259 #ifndef _WIN32
00260 IconvConvert::
00261 #endif
00262 eucToLang(pieces->getDan(y));
00263
00264 os << std::endl;
00265 }
00266
00267 os << "+";
00268 for(int x=9*pieces->getSuji(1).size();x>0;x--)
00269 {
00270 os << "-";
00271 }
00272 os << "+" << std::endl;
00273
00274
00275 os <<
00276 #ifndef _WIN32
00277 IconvConvert::
00278 #endif
00279 eucToLang(K_BLACK_STAND) << " ";
00280 BOOST_FOREACH(Ptype ptype, PieceStand::order)
00281 {
00282 const int count = state.countPiecesOnStand(BLACK, ptype);
00283 if (count)
00284 os <<
00285 #ifndef _WIN32
00286 IconvConvert::
00287 #endif
00288 eucToLang(pieces->stand_kanji(newPtypeO(BLACK, ptype)))
00289 << count << " ";
00290 }
00291 os << std::endl;
00292 os << state.turn() << std::endl;
00293 }
00294
00295
00296
00297
00298
00299