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