1
2
3
4
5
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
66
67
68
69
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
87
88
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
107
108
109
110 public static Comparator<GameRole> getPowerBalanceComparator(){
111 return BALANCE_COMPARATOR;
112 }
113
114
115
116
117
118
119 public String getRoleName(){
120 return this.roleName;
121 }
122
123
124
125
126
127 public char getShortName(){
128 return this.shortName;
129 }
130
131
132
133
134
135 public String getXmlName(){
136 return this.xmlName;
137 }
138
139
140
141
142
143 public Team getTeam(){
144 return this.team;
145 }
146
147
148
149
150
151 private int getOrder(){
152 return this.order;
153 }
154
155
156
157
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
176
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
186
187
188
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 }