4 * License : The MIT License
5 * Copyright(c) 2009 olyutorskii
8 package jp.sourceforge.jindolf.corelib;
10 import java.util.Comparator;
11 import java.util.regex.Matcher;
12 import java.util.regex.Pattern;
20 INNOCENT("村人", '村', "innocent", Team.VILLAGE),
22 WOLF("人狼", '狼', "wolf", Team.WOLF),
24 SEER("占い師", '占', "seer", Team.VILLAGE),
26 SHAMAN("霊能者", '霊', "shaman", Team.VILLAGE),
28 MADMAN("狂人", '狂', "madman", Team.WOLF),
30 HUNTER("狩人", '狩', "hunter", Team.VILLAGE),
32 FRATER("共有者", '共', "frater", Team.VILLAGE),
34 HAMSTER("ハムスター人間", '公', "hamster", Team.HAMSTER),
37 private static final Comparator<GameRole> BALANCE_COMPARATOR =
38 new PowerBalanceComparator();
40 private static final Pattern ROLE_PATTERN;
43 StringBuilder roleRegex = new StringBuilder();
44 for(GameRole role : values()){
45 if(roleRegex.length() > 0){
46 roleRegex.append('|');
49 .append(Pattern.quote(role.getRoleName()))
52 ROLE_PATTERN = Pattern.compile(roleRegex.toString());
56 private final String roleName;
57 private final char shortName;
58 private final String xmlName;
59 private final Team team;
65 * @param shortName 短縮名
66 * @param xmlName XML用シンボル
69 private GameRole(String roleName,
73 this.roleName = roleName.intern();
74 this.shortName = shortName;
75 this.xmlName = xmlName.intern();
82 * 与えられたマッチャ先頭が定義済みRole名に一致しないか調べる。
84 * @return 一致した役職。どれにも一致しなければnull。
86 public static GameRole lookingAtRole(Matcher matcher){
87 matcher.usePattern(ROLE_PATTERN);
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];
102 * 勢力バランス表記用Comparatorを得る。
103 * 「村共占霊狩公狂狼」の順で役職を一意に順序づける。
106 public static Comparator<GameRole> getPowerBalanceComparator(){
107 return BALANCE_COMPARATOR;
115 public String getRoleName(){
116 return this.roleName;
123 public char getShortName(){
124 return this.shortName;
131 public String getXmlName(){
139 public Team getTeam(){
144 * 勢力バランス表記用Comparator。
145 * 「村共占霊狩公狂狼」の順で役職を一意に順序づける。
147 private static final class PowerBalanceComparator
148 implements Comparator<GameRole> {
153 private PowerBalanceComparator(){
160 * 村人陣営のほうが狼陣営より小さい値を返す。
164 private static int getPowerValue(GameRole role){
167 if(role == null) return Integer.MIN_VALUE;
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;
180 throw new AssertionError();
188 * @param role1 {@inheritDoc}
189 * @param role2 {@inheritDoc}
190 * @return {@inheritDoc}
193 public int compare(GameRole role1, GameRole role2){
194 int power1 = getPowerValue(role1);
195 int power2 = getPowerValue(role2);
196 return power1 - power2;