// GameInfo.java
package net.sf.gogui.game;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import net.sf.gogui.go.BlackWhiteSet;
import net.sf.gogui.go.GoColor;
import static net.sf.gogui.go.GoColor.BLACK;
import static net.sf.gogui.go.GoColor.WHITE;
import net.sf.gogui.go.Komi;
import net.sf.gogui.go.Score.ScoringMethod;
import static net.sf.gogui.go.Score.ScoringMethod.AREA;
import static net.sf.gogui.go.Score.ScoringMethod.TERRITORY;
import net.sf.gogui.util.ObjectUtil;
import net.sf.gogui.util.StringUtil;
/** Game information.
Contains information about handicap, rules and players. */
public class GameInfo
implements ConstGameInfo
{
public GameInfo()
{
}
public GameInfo(ConstGameInfo info)
{
copyFrom(info);
}
public final void copyFrom(ConstGameInfo info)
{
GameInfo infoNonConst = (GameInfo)info;
m_handicap = infoNonConst.m_handicap;
m_komi = infoNonConst.m_komi;
m_timeSettings = infoNonConst.m_timeSettings;
m_stringInfo.clear();
m_stringInfo.putAll(infoNonConst.m_stringInfo);
m_stringInfoColor.clear();
for (Map.Entry<StringInfoColor,BlackWhiteSet<String>> entry
: infoNonConst.m_stringInfoColor.entrySet())
{
StringInfoColor type = entry.getKey();
BlackWhiteSet<String> set = entry.getValue();
assert set != null;
BlackWhiteSet<String> newSet = new BlackWhiteSet<String>();
newSet.set(BLACK, set.get(BLACK));
newSet.set(WHITE, set.get(WHITE));
m_stringInfoColor.put(type, newSet);
}
}
public boolean equals(Object object)
{
if (object == null || object.getClass() != getClass())
return false;
GameInfo info = (GameInfo)object;
return (m_handicap == info.getHandicap()
&& ObjectUtil.equals(m_komi, info.getKomi())
&& ObjectUtil.equals(m_timeSettings, info.getTimeSettings())
&& m_stringInfo.equals(info.m_stringInfo)
&& m_stringInfoColor.equals(info.m_stringInfoColor));
}
public String get(StringInfo type)
{
return m_stringInfo.get(type);
}
public String get(StringInfoColor type, GoColor c)
{
BlackWhiteSet<String> set = m_stringInfoColor.get(type);
if (set == null)
return null;
return set.get(c);
}
public int getHandicap()
{
return m_handicap;
}
/** Get komi.
@return The komi or null if komi is unknown. */
public Komi getKomi()
{
return m_komi;
}
public TimeSettings getTimeSettings()
{
return m_timeSettings;
}
/** Hash code dummy function (don't use).
This class is not desgined to be used in a HashMap/HashTable. The
function will trigger an assertion if assertions are enabled. */
public int hashCode()
{
assert false : "hashCode not designed";
return 0;
}
public boolean isEmpty()
{
return (m_handicap == 0 && m_komi == null && m_stringInfo.isEmpty()
&& m_stringInfoColor.isEmpty() && m_timeSettings == null);
}
/** Try to parse rules.
@return Score.ScoringMethod.TERRITORY if rules string (to lowercase)
is "japanese", Score.ScoringMethod.AREA otherwise. */
public ScoringMethod parseRules()
{
ScoringMethod result = AREA;
String rules = get(StringInfo.RULES);
if (rules != null)
{
rules = rules.trim().toLowerCase(Locale.ENGLISH);
if (rules.equals("japanese"))
result = TERRITORY;
}
return result;
}
public void set(StringInfo type, String value)
{
value = checkEmpty(value);
if (value == null)
m_stringInfo.remove(type);
else
m_stringInfo.put(type, value);
}
public void set(StringInfoColor type, GoColor c, String value)
{
value = checkEmpty(value);
BlackWhiteSet<String> set = m_stringInfoColor.get(type);
if (set == null)
{
set = new BlackWhiteSet<String>();
m_stringInfoColor.put(type, set);
}
set.set(c, value);
if (set.get(BLACK) == null && set.get(WHITE) == null)
m_stringInfoColor.remove(type);
}
public void setHandicap(int handicap)
{
m_handicap = handicap;
}
public void setKomi(Komi komi)
{
m_komi = komi;
}
/** Set time settings. */
public void setTimeSettings(TimeSettings timeSettings)
{
m_timeSettings = timeSettings;
}
/** Suggest a game name from the player names.
@return A game name built from the player names or null, if not at
least one player name is known. */
public String suggestGameName()
{
String playerBlack = get(StringInfoColor.NAME, BLACK);
String playerWhite = get(StringInfoColor.NAME, WHITE);
boolean playerBlackKnown = ! StringUtil.isEmpty(playerBlack);
boolean playerWhiteKnown = ! StringUtil.isEmpty(playerWhite);
if (! playerBlackKnown && ! playerWhiteKnown)
return null;
if (playerBlackKnown)
playerBlack = StringUtil.capitalize(playerBlack);
else
playerBlack = "Unknown";
if (playerWhiteKnown)
playerWhite = StringUtil.capitalize(playerWhite);
else
playerWhite = "Unknown";
return playerWhite + " vs " + playerBlack + " (B)";
}
private int m_handicap;
private Komi m_komi;
private TimeSettings m_timeSettings;
private Map<StringInfo,String> m_stringInfo =
new TreeMap<StringInfo,String>();
private Map<StringInfoColor,BlackWhiteSet<String>> m_stringInfoColor =
new TreeMap<StringInfoColor,BlackWhiteSet<String>>();
private String checkEmpty(String s)
{
if (s == null || s.trim().equals(""))
return null;
return s;
}
}