private static final String REG_HYPHEN = "\\-";
static{
+ StringBuilder txt = new StringBuilder();
+
String gYear = "([0-9][0-9][0-9][0-9])";
String gMonth = "([0-1][0-9])";
String gDay = "([0-3][0-9])";
- String gHour = "([0-2][0-9])";
- String gMinute = "([0-5][0-9])";
- String gSecond = "([0-6][0-9])";
- String diffHour = "[" + REG_PLUS + REG_HYPHEN + "][0-2][0-9]";
- String diffMin = "(?:" + ":?[0-5][0-9]" + ")?";
- String gTimezone = "(" + diffHour + diffMin + "|Z)";
-
- StringBuilder txt = new StringBuilder();
txt.append(gYear).append(REG_HYPHEN);
txt.append(gMonth).append(REG_HYPHEN);
txt.append(gDay);
+
txt.append('T');
+
+ String gHour = "([0-2][0-9])";
+ String gMinute = "([0-5][0-9])";
+ String gSecond = "([0-6][0-9])";
+
txt.append(gHour).append(':');
txt.append(gMinute).append(':');
txt.append(gSecond);
+
+ String diffHour = "[" + REG_PLUS + REG_HYPHEN + "][0-2][0-9]";
+ String diffMin = "(?:" + ":?[0-5][0-9]" + ")?";
+ String gTimezone = "(" + diffHour + diffMin + "|Z)";
+
txt.append(gTimezone);
String iso8601Regex = txt.toString();
public enum GameRole{
/** 村人。 */
- INNOCENT("村人", '村', "innocent", Team.VILLAGE),
+ INNOCENT("村人", '村', "innocent", Team.VILLAGE, -50),
/** 人狼。 */
- WOLF("人狼", '狼', "wolf", Team.WOLF),
+ WOLF("人狼", '狼', "wolf", Team.WOLF, +20),
/** 占い師。 */
- SEER("占い師", '占', "seer", Team.VILLAGE),
+ SEER("占い師", '占', "seer", Team.VILLAGE, -30),
/** 霊能者。 */
- SHAMAN("霊能者", '霊', "shaman", Team.VILLAGE),
+ SHAMAN("霊能者", '霊', "shaman", Team.VILLAGE, -20),
/** 狂人。 */
- MADMAN("狂人", '狂', "madman", Team.WOLF),
+ MADMAN("狂人", '狂', "madman", Team.WOLF, +10),
/** 狩人。 */
- HUNTER("狩人", '狩', "hunter", Team.VILLAGE),
+ HUNTER("狩人", '狩', "hunter", Team.VILLAGE, -10),
/** 共有者。 */
- FRATER("共有者", '共', "frater", Team.VILLAGE),
+ FRATER("共有者", '共', "frater", Team.VILLAGE, -40),
/** ハムスター人間。 */
- HAMSTER("ハムスター人間", '公', "hamster", Team.HAMSTER),
+ HAMSTER("ハムスター人間", '公', "hamster", Team.HAMSTER, 0),
;
private static final Comparator<GameRole> BALANCE_COMPARATOR =
private final char shortName;
private final String xmlName;
private final Team team;
+ private final int order;
/**
* @param shortName 短縮名
* @param xmlName XML用シンボル
* @param team 陣営
+ * @param order 順位
*/
private GameRole(String roleName,
char shortName,
String xmlName,
- Team team ){
+ Team team,
+ int order ){
this.roleName = roleName.intern();
this.shortName = shortName;
this.xmlName = xmlName.intern();
this.team = team;
+ this.order = order;
return;
}
}
/**
+ * 順位を返す。
+ * @return 順位
+ */
+ private int getOrder(){
+ return this.order;
+ }
+
+
+ /**
* 勢力バランス表記用Comparator。
* 「村共占霊狩公狂狼」の順で役職を一意に順序づける。
*/
+ @SuppressWarnings("serial")
private static final class PowerBalanceComparator
implements Comparator<GameRole> {
* 役職に順序を割り当てる。
* 村人陣営のほうが狼陣営より小さい値を返す。
* @param role 役職
- * @return 強さ
+ * @return 順位
*/
private static int getPowerValue(GameRole role){
- int power;
-
if(role == null) return Integer.MIN_VALUE;
-
- switch(role){
- case INNOCENT: power = -50; break;
- case FRATER: power = -40; break;
- case SEER: power = -30; break;
- case SHAMAN: power = -20; break;
- case HUNTER: power = -10; break;
- case HAMSTER: power = 0; break;
- case MADMAN: power = +10; break;
- case WOLF: power = +20; break;
- default:
- assert false;
- throw new AssertionError();
- }
-
- return power;
+ int result = role.getOrder();
+ return result;
}
/**
*/
@Override
public int compare(GameRole role1, GameRole role2){
- int power1 = getPowerValue(role1);
- int power2 = getPowerValue(role2);
- return power1 - power2;
+ int order1 = getPowerValue(role1);
+ int order2 = getPowerValue(role2);
+ return order1 - order2;
}
}
private static final Map<String, LandState> STATE_MAP;
+ /** space or tab. */
+ private static final String REG_POSIXBLANK = "\\p{Blank}";
+
private static final char HYPHEN_CH = '-';
private static final String HYPHEN = "-";
private static final String COMMA = ",";
if(seq.length() <= 0 ) return result;
String str = seq.toString();
- str = str.replaceAll("\\p{Blank}", "");
+ str = str.replaceAll(REG_POSIXBLANK, "");
String[] tokens = str.split(COMMA);
assert tokens.length >= 1;
for(String token : tokens){
if(token.length() <= 0) continue;
- if( token.charAt(0) == HYPHEN_CH
- || token.endsWith(HYPHEN) ){
+ if(token.charAt(0) == HYPHEN_CH || token.endsWith(HYPHEN)){
throw new IllegalArgumentException(token);
}
parseIntPair(result, token);
String formalName = DomUtils.attrRequired(elem, "formalName");
String landPrefix = DomUtils.attrRequired(elem, "landPrefix");
- if( landName .length() <= 0
- || landId .length() <= 0
- || formalName.length() <= 0 ){
+ if( landName .length() <= 0
+ || landId .length() <= 0
+ || formalName.length() <= 0 ){
throw new SAXException("no identification info");
}
int minMembers = Integer.parseInt(minStr);
int maxMembers = Integer.parseInt(maxStr);
- if( minMembers <= 0
- || minMembers > maxMembers ){
+ if( minMembers <= 0
+ || minMembers > maxMembers ){
throw new SAXException("invalid member limitation");
}
if(webURI == null || cgiURI == null){
throw new SAXException("no URI");
}
- if( ! webURI.isAbsolute()
- || ! cgiURI.isAbsolute() ){
+ if( ! webURI.isAbsolute()
+ || ! cgiURI.isAbsolute() ){
throw new SAXException("relative URI");
}