View Javadoc
1   /*
2    * Roles in game
3    *
4    * License : The MIT License
5    * Copyright(c) 2009 olyutorskii
6    */
7   
8   package jp.sourceforge.jindolf.corelib;
9   
10  import java.util.Comparator;
11  import java.util.regex.Matcher;
12  import java.util.regex.Pattern;
13  
14  /**
15   * 役職。
16   */
17  public enum GameRole{
18  
19      /** 村人。 */
20      INNOCENT("村人", '村', "innocent",         Team.VILLAGE, -50),
21      /** 人狼。 */
22      WOLF("人狼", '狼', "wolf",                 Team.WOLF,    +20),
23      /** 占い師。 */
24      SEER("占い師", '占', "seer",               Team.VILLAGE, -30),
25      /** 霊能者。 */
26      SHAMAN("霊能者", '霊', "shaman",           Team.VILLAGE, -20),
27      /** 狂人。 */
28      MADMAN("狂人", '狂', "madman",             Team.WOLF,    +10),
29      /** 狩人。 */
30      HUNTER("狩人", '狩', "hunter",             Team.VILLAGE, -10),
31      /** 共有者。 */
32      FRATER("共有者", '共', "frater",           Team.VILLAGE, -40),
33      /** ハムスター人間。 */
34      HAMSTER("ハムスター人間", '公', "hamster", Team.HAMSTER,   0),
35      ;
36  
37      private static final Comparator<GameRole> BALANCE_COMPARATOR =
38              new PowerBalanceComparator();
39  
40      private static final Pattern ROLE_PATTERN;
41  
42      static{
43          StringBuilder roleRegex = new StringBuilder();
44          for(GameRole role : values()){
45              if(roleRegex.length() > 0){
46                  roleRegex.append('|');
47              }
48              roleRegex.append('(')
49                       .append(Pattern.quote(role.getRoleName()))
50                       .append(')');
51          }
52          ROLE_PATTERN = Pattern.compile(roleRegex.toString());
53      }
54  
55  
56      private final String roleName;
57      private final char shortName;
58      private final String xmlName;
59      private final Team team;
60      private final int order;
61  
62  
63      /**
64       * コンストラクタ。
65       * @param roleName 役職名
66       * @param shortName 短縮名
67       * @param xmlName XML用シンボル
68       * @param team 陣営
69       * @param order 順位
70       */
71      GameRole(String roleName,
72                char shortName,
73                String xmlName,
74                Team team,
75                int order ){
76          this.roleName = roleName.intern();
77          this.shortName = shortName;
78          this.xmlName = xmlName.intern();
79          this.team = team;
80          this.order = order;
81          return;
82      }
83  
84  
85      /**
86       * 与えられたマッチャ先頭が定義済みRole名に一致しないか調べる。
87       * @param matcher マッチャ
88       * @return 一致した役職。どれにも一致しなければnull。
89       */
90      public static GameRole lookingAtRole(Matcher matcher){
91          matcher.usePattern(ROLE_PATTERN);
92  
93          if( ! matcher.lookingAt() ) return null;
94          int groupCt = matcher.groupCount();
95          for(int group = 1; group <= groupCt; group++){
96              if(matcher.start(group) >= 0){
97                  GameRole role = values()[group - 1];
98                  return role;
99              }
100         }
101 
102         return null;
103     }
104 
105     /**
106      * 勢力バランス表記用Comparatorを得る。
107      * 「村共占霊狩公狂狼」の順で役職を一意に順序づける。
108      * @return Comparator
109      */
110     public static Comparator<GameRole> getPowerBalanceComparator(){
111         return BALANCE_COMPARATOR;
112     }
113 
114 
115     /**
116      * 役職名を返す。
117      * @return 役職名
118      */
119     public String getRoleName(){
120         return this.roleName;
121     }
122 
123     /**
124      * 一文字に短縮された役職名を得る。
125      * @return 短縮された役職名
126      */
127     public char getShortName(){
128         return this.shortName;
129     }
130 
131     /**
132      * XML用シンボルを取得する。
133      * @return XML用シンボル
134      */
135     public String getXmlName(){
136         return this.xmlName;
137     }
138 
139     /**
140      * 各役職のチームを得る。
141      * @return チーム
142      */
143     public Team getTeam(){
144         return this.team;
145     }
146 
147     /**
148      * 順位を返す。
149      * @return 順位
150      */
151     private int getOrder(){
152         return this.order;
153     }
154 
155 
156     /**
157      * 勢力バランス表記用Comparator。
158      * 「村共占霊狩公狂狼」の順で役職を一意に順序づける。
159      */
160     @SuppressWarnings("serial")
161     private static final class PowerBalanceComparator
162             implements Comparator<GameRole> {
163 
164         /**
165          * コンストラクタ。
166          */
167         private PowerBalanceComparator(){
168             super();
169             return;
170         }
171 
172         /**
173          * 役職に順序を割り当てる。
174          * 村人陣営のほうが狼陣営より小さい値を返す。
175          * @param role 役職
176          * @return 順位
177          */
178         private static int getPowerValue(GameRole role){
179             if(role == null) return Integer.MIN_VALUE;
180             int result = role.getOrder();
181             return result;
182         }
183 
184         /**
185          * {@inheritDoc}
186          * @param role1 {@inheritDoc}
187          * @param role2 {@inheritDoc}
188          * @return {@inheritDoc}
189          */
190         @Override
191         public int compare(GameRole role1, GameRole role2){
192             int order1 = getPowerValue(role1);
193             int order2 = getPowerValue(role2);
194             return order1 - order2;
195         }
196 
197     }
198 
199 }