00001 #include "osl/record/kanjiPrint.h"
00002 #include "osl/ptype.h"
00003 #include "osl/pieceStand.h"
00004 #include "osl/move.h"
00005 #include "osl/misc/carray.h"
00006 #include <iostream>
00007 #include <string>
00008 #include <algorithm>
00009 #include <cctype>
00010
00011 bool caseInsentiveCharCompare(char a, char b)
00012 {
00013 return toupper(a) == toupper(b);
00014 }
00015
00016 bool caseInsentiveCompare(const std::string& s1, const std::string& s2)
00017 {
00018 return s1.size() == s2.size() &&
00019 equal(s1.begin(), s1.end(), s2.begin(), caseInsentiveCharCompare);
00020 }
00021
00022 const osl::record::Color osl::record::Color::NONE ("", "NONE", false);
00023 const osl::record::Color osl::record::Color::Black ("0;30", "BLACK");
00024 const osl::record::Color osl::record::Color::Red ("0;31", "RED");
00025 const osl::record::Color osl::record::Color::Green ("0;32", "GREEN");
00026 const osl::record::Color osl::record::Color::Brown ("0;33", "BROWN");
00027 const osl::record::Color osl::record::Color::Blue ("0;34", "BLUE");
00028 const osl::record::Color osl::record::Color::Purple ("0;35", "PURPLE");
00029 const osl::record::Color osl::record::Color::Cyan ("0;36", "CYAN");
00030 const osl::record::Color osl::record::Color::LightGray ("0;37", "LIGHTGRAY");
00031 const osl::record::Color osl::record::Color::DarkGray ("1;30", "DARKGRAY");
00032 const osl::record::Color osl::record::Color::LightRed ("1;31", "LIGHTRED");
00033 const osl::record::Color osl::record::Color::LightGreen ("1;32", "LIGHTGREEN");
00034 const osl::record::Color osl::record::Color::Yellow ("1;33", "YELLOW");
00035 const osl::record::Color osl::record::Color::LightBlue ("1;34", "LIGHTBLUE");
00036 const osl::record::Color osl::record::Color::LightPurple ("1;35", "LIGHTPURPLE");
00037 const osl::record::Color osl::record::Color::LightCyan ("1;36", "LIGHTCYAN");
00038 const osl::record::Color osl::record::Color::White ("1;37", "WHITE");
00039
00040 const osl::record::Color osl::record::
00041 Color::colorFor(const std::string& str)
00042 {
00043 static const CArray<const osl::record::Color,17> colors = {{
00044 osl::record::Color::NONE,
00045 osl::record::Color::Black, osl::record::Color::Red,
00046 osl::record::Color::Green, osl::record::Color::Brown,
00047 osl::record::Color::Blue, osl::record::Color::Purple,
00048 osl::record::Color::Cyan, osl::record::Color::LightGray,
00049 osl::record::Color::DarkGray, osl::record::Color::LightRed,
00050 osl::record::Color::LightGreen, osl::record::Color::Yellow,
00051 osl::record::Color::LightBlue, osl::record::Color::LightPurple,
00052 osl::record::Color::LightCyan, osl::record::Color::White}};
00053
00054 for (size_t i=0; i<colors.size(); i++)
00055 {
00056 const osl::record::Color& c = colors[i];
00057 if (caseInsentiveCompare(str, c.getName()))
00058 return c;
00059 }
00060 return osl::record::Color::NONE;
00061 }
00062
00063 osl::record::Color::Color(const std::string& value, const std::string& name, const bool valid)
00064 : value(value), name(name), valid(valid)
00065 {
00066 }
00067 osl::record::Color::~Color()
00068 {
00069 }
00070
00071 osl::record::Characters::~Characters()
00072 {
00073 }
00074
00075 const osl::misc::CArray<std::string,32> osl::record::Characters::stand =
00076 {{
00077 "", "+E",
00078 "", "", "", "", "", "ζ", "",
00079 "", "", "", "", "", "", "",
00080
00081 "", "+E",
00082 "", "", "", "", "", "ζ", "",
00083 "", "", "", "", "", "", ""
00084 }};
00085
00086 const osl::misc::CArray<std::string,10> osl::record::StandardCharacters::dan = {{"", "", "", "", "", "", "ϻ", "", "Ȭ", ""}};
00087 const osl::misc::CArray<std::string,10> osl::record::StandardCharacters::suji = {{"", "", "", "", "", "", "", "", "", ""}};
00088 const osl::misc::CArray<std::string,32> osl::record::StandardCharacters::pieces =
00089 {{
00090 "", "+E",
00091 "", "", "", "", "", "ζ", "",
00092 "", "", "", "", "", "", "",
00093
00094 "", "+E",
00095 "", "", "", "", "", "ζ", "",
00096 "", "", "", "", "", "", ""
00097 }};
00098
00099 const osl::misc::CArray<std::string,10> osl::record::RussianCharacters::dan = osl::record::StandardCharacters::dan;
00100 const osl::misc::CArray<std::string,10> osl::record::RussianCharacters::suji = osl::record::StandardCharacters::suji;
00101 const osl::misc::CArray<std::string,32> osl::record::RussianCharacters::pieces =
00102 {{
00103 "", "+E",
00104
00105
00106 "", "", "", "" , "", "", "",
00107 "", "", "", "", "", "", "",
00108
00109 "", "+E",
00110 "", "", "", "", "", "ζ", "",
00111 "", "", "", "", "", "", ""
00112 }};
00113
00114 const osl::misc::CArray<std::string,10> osl::record::KIFCharacters::dan = osl::record::StandardCharacters::dan;
00115 const osl::misc::CArray<std::string,10> osl::record::KIFCharacters::suji =
00116 {{"", " ", " ", " ", " ", " ", " ", " ", " ", " "}};
00117 const osl::misc::CArray<std::string,32> osl::record::KIFCharacters::pieces =
00118 {{
00119 " ", "+E",
00120
00121 "v", "v", "v", "v", "v", "vζ", "v",
00122 "v", "v", "v", "v", "v", "v", "v",
00123
00124 " ", "+E",
00125 " ", " ", " ", " ", " ", " ζ", " ",
00126 " ", " ", " ", " ", " ", " ", " "
00127 }};
00128
00129
00130 std::ostream& osl::record::
00131 operator<<(std::ostream& os, const Color& c)
00132 {
00133 return os << c.value;
00134 }
00135
00136 void osl::record::ChangeShellColor::
00137 escColSet() const
00138 {
00139 if (!color.isValid()) return;
00140 os << "\033[" << color << "m";
00141 }
00142
00143 void osl::record::ChangeShellColor::
00144 escColReSet() const
00145 {
00146 if (!color.isValid()) return;
00147 os << "\033[0m";
00148 }
00149
00150 void osl::record::KanjiPrint::
00151 print(const osl::state::SimpleState& state,
00152 const osl::Move *last_move) const
00153 {
00154 os << " ";
00155 for (unsigned int i=0; i<PieceStand::order.size(); ++i)
00156 {
00157 const Ptype ptype = PieceStand::order[i];
00158 const int count = state.countPiecesOnStand(WHITE, ptype);
00159 if (count)
00160 os << pieces->stand_kanji(newPtypeO(BLACK, ptype))
00161 << count << " ";
00162 }
00163 os << std::endl;
00164
00165 os << " ";
00166 for(int x=9;x>0;x--)
00167 {
00168 os << pieces->getSuji(x);
00169 }
00170 os << std::endl;
00171
00172 os << "+";
00173 for(int x=9*pieces->getSuji(1).size();x>0;x--)
00174 {
00175 os << "-";
00176 }
00177 os << "+" << std::endl;
00178
00179 for(int y=1;y<=9;y++)
00180 {
00181 os << '|';
00182 for(int x=9;x>0;x--)
00183 {
00184 const PtypeO ptypeo = state.getPieceOnBoard(Position(x,y)).ptypeO();
00185 if (last_move &&
00186 !last_move->isInvalid() &&
00187 last_move->to() == Position(x,y))
00188 {
00189 ChangeShellColor csc(os, last_move_color);
00190 os << pieces->kanji(ptypeo);
00191 }
00192 else if (isPiece(ptypeo)) {
00193 Player owner = getOwner(ptypeo);
00194 osl::record::Color color;
00195 if (owner == BLACK)
00196 color = black_color;
00197 else
00198 color = white_color;
00199 ChangeShellColor csc(os, color);
00200 os << pieces->kanji(ptypeo);
00201 }
00202 else
00203 {
00204 os << pieces->kanji(ptypeo);
00205 }
00206 }
00207 os << '|';
00208 os << pieces->getDan(y);
00209 os << std::endl;
00210 }
00211
00212 os << "+";
00213 for(int x=9*pieces->getSuji(1).size();x>0;x--)
00214 {
00215 os << "-";
00216 }
00217 os << "+" << std::endl;
00218
00219
00220 os << " ";
00221 for (unsigned int i=0; i<PieceStand::order.size(); ++i)
00222 {
00223 const Ptype ptype = PieceStand::order[i];
00224 const int count = state.countPiecesOnStand(BLACK, ptype);
00225 if (count)
00226 os << pieces->stand_kanji(newPtypeO(BLACK, ptype))
00227 << count << " ";
00228 }
00229 os << std::endl;
00230 os << state.getTurn() << std::endl;
00231 }
00232
00233
00234
00235
00236
00237