OSDN Git Service

f30f19cee5fe613df22c2763aab03084b0bd486c
[jindolf/JinCore.git] / src / main / java / jp / sourceforge / jindolf / corelib / GameRole.java
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),
21     /** 人狼。 */
22     WOLF("人狼", '狼', "wolf", Team.WOLF),
23     /** 占い師。 */
24     SEER("占い師", '占', "seer", Team.VILLAGE),
25     /** 霊能者。 */
26     SHAMAN("霊能者", '霊', "shaman", Team.VILLAGE),
27     /** 狂人。 */
28     MADMAN("狂人", '狂', "madman", Team.WOLF),
29     /** 狩人。 */
30     HUNTER("狩人", '狩', "hunter", Team.VILLAGE),
31     /** 共有者。 */
32     FRATER("共有者", '共', "frater", Team.VILLAGE),
33     /** ハムスター人間。 */
34     HAMSTER("ハムスター人間", '公', "hamster", Team.HAMSTER),
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
61
62     /**
63      * コンストラクタ。
64      * @param roleName 役職名
65      * @param shortName 短縮名
66      * @param xmlName XML用シンボル
67      * @param team 陣営
68      */
69     private GameRole(String roleName,
70                       char shortName,
71                       String xmlName,
72                       Team team ){
73         this.roleName = roleName.intern();
74         this.shortName = shortName;
75         this.xmlName = xmlName.intern();
76         this.team = team;
77         return;
78     }
79
80
81     /**
82      * 与えられたマッチャ先頭が定義済みRole名に一致しないか調べる。
83      * @param matcher マッチャ
84      * @return 一致した役職。どれにも一致しなければnull。
85      */
86     public static GameRole lookingAtRole(Matcher matcher){
87         matcher.usePattern(ROLE_PATTERN);
88
89         if( ! matcher.lookingAt() ) return null;
90         int groupCt = matcher.groupCount();
91         for(int group = 1; group <= groupCt; group++){
92             if(matcher.start(group) >= 0){
93                 GameRole role = values()[group - 1];
94                 return role;
95             }
96         }
97
98         return null;
99     }
100
101     /**
102      * 勢力バランス表記用Comparatorを得る。
103      * 「村共占霊狩公狂狼」の順で役職を一意に順序づける。
104      * @return Comparator
105      */
106     public static Comparator<GameRole> getPowerBalanceComparator(){
107         return BALANCE_COMPARATOR;
108     }
109
110
111     /**
112      * 役職名を返す。
113      * @return 役職名
114      */
115     public String getRoleName(){
116         return this.roleName;
117     }
118
119     /**
120      * 一文字に短縮された役職名を得る。
121      * @return 短縮された役職名
122      */
123     public char getShortName(){
124         return this.shortName;
125     }
126
127     /**
128      * XML用シンボルを取得する。
129      * @return XML用シンボル
130      */
131     public String getXmlName(){
132         return this.xmlName;
133     }
134
135     /**
136      * 各役職のチームを得る。
137      * @return チーム
138      */
139     public Team getTeam(){
140         return this.team;
141     }
142
143     /**
144      * 勢力バランス表記用Comparator。
145      * 「村共占霊狩公狂狼」の順で役職を一意に順序づける。
146      */
147     private static final class PowerBalanceComparator
148             implements Comparator<GameRole> {
149
150         /**
151          * コンストラクタ。
152          */
153         private PowerBalanceComparator(){
154             super();
155             return;
156         }
157
158         /**
159          * 役職に順序を割り当てる。
160          * 村人陣営のほうが狼陣営より小さい値を返す。
161          * @param role 役職
162          * @return 強さ
163          */
164         private static int getPowerValue(GameRole role){
165             int power;
166
167             if(role == null) return Integer.MIN_VALUE;
168
169             switch(role){
170             case INNOCENT: power = -50; break;
171             case FRATER:   power = -40; break;
172             case SEER:     power = -30; break;
173             case SHAMAN:   power = -20; break;
174             case HUNTER:   power = -10; break;
175             case HAMSTER:  power =   0; break;
176             case MADMAN:   power = +10; break;
177             case WOLF:     power = +20; break;
178             default:
179                 assert false;
180                 throw new AssertionError();
181             }
182
183             return power;
184         }
185
186         /**
187          * {@inheritDoc}
188          * @param role1 {@inheritDoc}
189          * @param role2 {@inheritDoc}
190          * @return {@inheritDoc}
191          */
192         @Override
193         public int compare(GameRole role1, GameRole role2){
194             int power1 = getPowerValue(role1);
195             int power2 = getPowerValue(role2);
196             return power1 - power2;
197         }
198
199     }
200
201 }