00001
00002
00003
00004
00005
00006 #include "SgSystem.h"
00007 #include "GoGtpExtraCommands.h"
00008
00009 #include <limits>
00010 #include <boost/format.hpp>
00011 #include "GoBoard.h"
00012 #include "GoBoardUtil.h"
00013 #include "GoGtpCommandUtil.h"
00014 #include "GoLadder.h"
00015 #include "GoStaticLadder.h"
00016
00017 using namespace std;
00018 using boost::format;
00019 using GoGtpCommandUtil::PointArg;
00020 using GoGtpCommandUtil::StoneArg;
00021
00022
00023
00024 GoGtpExtraCommands::GoGtpExtraCommands(GoBoard& bd)
00025 : m_bd(bd)
00026 {
00027 }
00028
00029 void GoGtpExtraCommands::AddGoGuiAnalyzeCommands(GtpCommand& cmd)
00030 {
00031 cmd <<
00032 "sboard/Go CFG Distance/go_cfg_distance %p\n"
00033 "sboard/Go CFG Distance N/go_cfg_distance %p %s\n"
00034 "string/Go Ladder/go_ladder %p\n"
00035 "string/Go Static Ladder/go_static_ladder %p\n";
00036 }
00037
00038
00039
00040
00041
00042
00043
00044 void GoGtpExtraCommands::CmdCfgDistance(GtpCommand& cmd)
00045 {
00046 cmd.CheckNuArgLessEqual(2);
00047 SgPoint p = PointArg(cmd, 0, m_bd);
00048 int maxDist = numeric_limits<int>::max();
00049 if (cmd.NuArg() > 1)
00050 maxDist = cmd.IntArg(1, 0);
00051 SgPointArray<int> distance = GoBoardUtil::CfgDistance(m_bd, p, maxDist);
00052
00053 SgPointArray<string> stringArray("\"\"");
00054 for (GoBoard::Iterator it(m_bd); it; ++it)
00055 if (m_bd.IsEmpty(*it) || m_bd.Anchor(*it) == *it)
00056 stringArray[*it] = str(format("%i") % distance[*it]);
00057 cmd << '\n' << SgWritePointArray<string>(stringArray, m_bd.Size());
00058 }
00059
00060
00061
00062
00063
00064
00065 void GoGtpExtraCommands::CmdLadder(GtpCommand& cmd)
00066 {
00067 cmd.CheckNuArg(1);
00068 SgPoint prey = StoneArg(cmd, 0, m_bd);
00069 GoLadderStatus status = GoLadderUtil::LadderStatus(m_bd, prey);
00070 switch (status)
00071 {
00072 case GO_LADDER_ESCAPED:
00073 cmd << "escaped";
00074 break;
00075 case GO_LADDER_CAPTURED:
00076 cmd << "captured";
00077 break;
00078 case GO_LADDER_UNSETTLED:
00079 cmd << "unsettled";
00080 break;
00081 default:
00082 throw GtpFailure() << "Unexpected ladder status: " << status;
00083 }
00084 }
00085
00086
00087
00088
00089
00090
00091 void GoGtpExtraCommands::CmdStaticLadder(GtpCommand& cmd)
00092 {
00093 cmd.CheckNuArg(1);
00094 SgPoint p = StoneArg(cmd, 0, m_bd);
00095 SgBlackWhite c = m_bd.GetColor(p);
00096 if (GoStaticLadder::IsLadder(m_bd, p, c))
00097 cmd << "captured";
00098 else if (GoStaticLadder::IsLadder(m_bd, p, SgOppBW(c)))
00099 cmd << "unsettled";
00100 else
00101 cmd << "escaped";
00102 }
00103
00104 void GoGtpExtraCommands::Register(GtpEngine& e)
00105 {
00106 Register(e, "go_cfg_distance", &GoGtpExtraCommands::CmdCfgDistance);
00107 Register(e, "go_ladder", &GoGtpExtraCommands::CmdLadder);
00108 Register(e, "go_static_ladder", &GoGtpExtraCommands::CmdStaticLadder);
00109 }
00110
00111 void GoGtpExtraCommands::Register(GtpEngine& engine,
00112 const std::string& command,
00113 GtpCallback<GoGtpExtraCommands>::Method method)
00114 {
00115 engine.Register(command,
00116 new GtpCallback<GoGtpExtraCommands>(this, method));
00117 }
00118
00119