-/*\r
- * Roles in game\r
- *\r
- * License : The MIT License\r
- * Copyright(c) 2009 olyutorskii\r
- */\r
-\r
-package jp.sourceforge.jindolf.corelib;\r
-\r
-import java.util.Comparator;\r
-import java.util.regex.Matcher;\r
-import java.util.regex.Pattern;\r
-\r
-/**\r
- * 役職。\r
- */\r
-public enum GameRole{\r
-\r
- /** 村人。 */\r
- INNOCENT("村人", '村', "innocent", Team.VILLAGE),\r
- /** 人狼。 */\r
- WOLF("人狼", '狼', "wolf", Team.WOLF),\r
- /** 占い師。 */\r
- SEER("占い師", '占', "seer", Team.VILLAGE),\r
- /** 霊能者。 */\r
- SHAMAN("霊能者", '霊', "shaman", Team.VILLAGE),\r
- /** 狂人。 */\r
- MADMAN("狂人", '狂', "madman", Team.WOLF),\r
- /** 狩人。 */\r
- HUNTER("狩人", '狩', "hunter", Team.VILLAGE),\r
- /** 共有者。 */\r
- FRATER("共有者", '共', "frater", Team.VILLAGE),\r
- /** ハムスター人間。 */\r
- HAMSTER("ハムスター人間", '公', "hamster", Team.HAMSTER),\r
- ;\r
-\r
- private static final Comparator<GameRole> BALANCE_COMPARATOR =\r
- new PowerBalanceComparator();\r
-\r
- private static final Pattern ROLE_PATTERN;\r
-\r
- static{\r
- StringBuilder roleRegex = new StringBuilder();\r
- for(GameRole role : values()){\r
- if(roleRegex.length() > 0){\r
- roleRegex.append('|');\r
- }\r
- roleRegex.append('(')\r
- .append(Pattern.quote(role.getRoleName()))\r
- .append(')');\r
- }\r
- ROLE_PATTERN = Pattern.compile(roleRegex.toString());\r
- }\r
-\r
-\r
- private final String roleName;\r
- private final char shortName;\r
- private final String xmlName;\r
- private final Team team;\r
-\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param roleName 役職名\r
- * @param shortName 短縮名\r
- * @param xmlName XML用シンボル\r
- * @param team 陣営\r
- */\r
- private GameRole(String roleName,\r
- char shortName,\r
- String xmlName,\r
- Team team ){\r
- this.roleName = roleName.intern();\r
- this.shortName = shortName;\r
- this.xmlName = xmlName.intern();\r
- this.team = team;\r
- return;\r
- }\r
-\r
-\r
- /**\r
- * 与えられたマッチャ先頭が定義済みRole名に一致しないか調べる。\r
- * @param matcher マッチャ\r
- * @return 一致した役職。どれにも一致しなければnull。\r
- */\r
- public static GameRole lookingAtRole(Matcher matcher){\r
- matcher.usePattern(ROLE_PATTERN);\r
-\r
- if( ! matcher.lookingAt() ) return null;\r
- int groupCt = matcher.groupCount();\r
- for(int group = 1; group <= groupCt; group++){\r
- if(matcher.start(group) >= 0){\r
- GameRole role = values()[group - 1];\r
- return role;\r
- }\r
- }\r
-\r
- return null;\r
- }\r
-\r
- /**\r
- * 勢力バランス表記用Comparatorを得る。\r
- * 「村共占霊狩公狂狼」の順で役職を一意に順序づける。\r
- * @return Comparator\r
- */\r
- public static Comparator<GameRole> getPowerBalanceComparator(){\r
- return BALANCE_COMPARATOR;\r
- }\r
-\r
-\r
- /**\r
- * 役職名を返す。\r
- * @return 役職名\r
- */\r
- public String getRoleName(){\r
- return this.roleName;\r
- }\r
-\r
- /**\r
- * 一文字に短縮された役職名を得る。\r
- * @return 短縮された役職名\r
- */\r
- public char getShortName(){\r
- return this.shortName;\r
- }\r
-\r
- /**\r
- * XML用シンボルを取得する。\r
- * @return XML用シンボル\r
- */\r
- public String getXmlName(){\r
- return this.xmlName;\r
- }\r
-\r
- /**\r
- * 各役職のチームを得る。\r
- * @return チーム\r
- */\r
- public Team getTeam(){\r
- return this.team;\r
- }\r
-\r
- /**\r
- * 勢力バランス表記用Comparator。\r
- * 「村共占霊狩公狂狼」の順で役職を一意に順序づける。\r
- */\r
- private static final class PowerBalanceComparator\r
- implements Comparator<GameRole> {\r
-\r
- /**\r
- * コンストラクタ。\r
- */\r
- private PowerBalanceComparator(){\r
- super();\r
- return;\r
- }\r
-\r
- /**\r
- * 役職に順序を割り当てる。\r
- * 村人陣営のほうが狼陣営より小さい値を返す。\r
- * @param role 役職\r
- * @return 強さ\r
- */\r
- private static int getPowerValue(GameRole role){\r
- int power;\r
-\r
- if(role == null) return Integer.MIN_VALUE;\r
-\r
- switch(role){\r
- case INNOCENT: power = -50; break;\r
- case FRATER: power = -40; break;\r
- case SEER: power = -30; break;\r
- case SHAMAN: power = -20; break;\r
- case HUNTER: power = -10; break;\r
- case HAMSTER: power = 0; break;\r
- case MADMAN: power = +10; break;\r
- case WOLF: power = +20; break;\r
- default:\r
- assert false;\r
- throw new AssertionError();\r
- }\r
-\r
- return power;\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @param role1 {@inheritDoc}\r
- * @param role2 {@inheritDoc}\r
- * @return {@inheritDoc}\r
- */\r
- @Override\r
- public int compare(GameRole role1, GameRole role2){\r
- int power1 = getPowerValue(role1);\r
- int power2 = getPowerValue(role2);\r
- return power1 - power2;\r
- }\r
-\r
- }\r
-\r
-}\r
+/*
+ * Roles in game
+ *
+ * License : The MIT License
+ * Copyright(c) 2009 olyutorskii
+ */
+
+package jp.sourceforge.jindolf.corelib;
+
+import java.util.Comparator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 役職。
+ */
+public enum GameRole{
+
+ /** 村人。 */
+ INNOCENT("村人", '村', "innocent", Team.VILLAGE),
+ /** 人狼。 */
+ WOLF("人狼", '狼', "wolf", Team.WOLF),
+ /** 占い師。 */
+ SEER("占い師", '占', "seer", Team.VILLAGE),
+ /** 霊能者。 */
+ SHAMAN("霊能者", '霊', "shaman", Team.VILLAGE),
+ /** 狂人。 */
+ MADMAN("狂人", '狂', "madman", Team.WOLF),
+ /** 狩人。 */
+ HUNTER("狩人", '狩', "hunter", Team.VILLAGE),
+ /** 共有者。 */
+ FRATER("共有者", '共', "frater", Team.VILLAGE),
+ /** ハムスター人間。 */
+ HAMSTER("ハムスター人間", '公', "hamster", Team.HAMSTER),
+ ;
+
+ private static final Comparator<GameRole> BALANCE_COMPARATOR =
+ new PowerBalanceComparator();
+
+ private static final Pattern ROLE_PATTERN;
+
+ static{
+ StringBuilder roleRegex = new StringBuilder();
+ for(GameRole role : values()){
+ if(roleRegex.length() > 0){
+ roleRegex.append('|');
+ }
+ roleRegex.append('(')
+ .append(Pattern.quote(role.getRoleName()))
+ .append(')');
+ }
+ ROLE_PATTERN = Pattern.compile(roleRegex.toString());
+ }
+
+
+ private final String roleName;
+ private final char shortName;
+ private final String xmlName;
+ private final Team team;
+
+
+ /**
+ * コンストラクタ。
+ * @param roleName 役職名
+ * @param shortName 短縮名
+ * @param xmlName XML用シンボル
+ * @param team 陣営
+ */
+ private GameRole(String roleName,
+ char shortName,
+ String xmlName,
+ Team team ){
+ this.roleName = roleName.intern();
+ this.shortName = shortName;
+ this.xmlName = xmlName.intern();
+ this.team = team;
+ return;
+ }
+
+
+ /**
+ * 与えられたマッチャ先頭が定義済みRole名に一致しないか調べる。
+ * @param matcher マッチャ
+ * @return 一致した役職。どれにも一致しなければnull。
+ */
+ public static GameRole lookingAtRole(Matcher matcher){
+ matcher.usePattern(ROLE_PATTERN);
+
+ if( ! matcher.lookingAt() ) return null;
+ int groupCt = matcher.groupCount();
+ for(int group = 1; group <= groupCt; group++){
+ if(matcher.start(group) >= 0){
+ GameRole role = values()[group - 1];
+ return role;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * 勢力バランス表記用Comparatorを得る。
+ * 「村共占霊狩公狂狼」の順で役職を一意に順序づける。
+ * @return Comparator
+ */
+ public static Comparator<GameRole> getPowerBalanceComparator(){
+ return BALANCE_COMPARATOR;
+ }
+
+
+ /**
+ * 役職名を返す。
+ * @return 役職名
+ */
+ public String getRoleName(){
+ return this.roleName;
+ }
+
+ /**
+ * 一文字に短縮された役職名を得る。
+ * @return 短縮された役職名
+ */
+ public char getShortName(){
+ return this.shortName;
+ }
+
+ /**
+ * XML用シンボルを取得する。
+ * @return XML用シンボル
+ */
+ public String getXmlName(){
+ return this.xmlName;
+ }
+
+ /**
+ * 各役職のチームを得る。
+ * @return チーム
+ */
+ public Team getTeam(){
+ return this.team;
+ }
+
+ /**
+ * 勢力バランス表記用Comparator。
+ * 「村共占霊狩公狂狼」の順で役職を一意に順序づける。
+ */
+ private static final class PowerBalanceComparator
+ implements Comparator<GameRole> {
+
+ /**
+ * コンストラクタ。
+ */
+ private PowerBalanceComparator(){
+ super();
+ return;
+ }
+
+ /**
+ * 役職に順序を割り当てる。
+ * 村人陣営のほうが狼陣営より小さい値を返す。
+ * @param role 役職
+ * @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;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @param role1 {@inheritDoc}
+ * @param role2 {@inheritDoc}
+ * @return {@inheritDoc}
+ */
+ @Override
+ public int compare(GameRole role1, GameRole role2){
+ int power1 = getPowerValue(role1);
+ int power2 = getPowerValue(role2);
+ return power1 - power2;
+ }
+
+ }
+
+}