OSDN Git Service

remove subversion keyword
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / SysEvent.java
1 /*\r
2  * system event in game\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2008 olyutorskii\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf;\r
9 \r
10 import java.util.Collections;\r
11 import java.util.HashSet;\r
12 import java.util.LinkedList;\r
13 import java.util.List;\r
14 import java.util.Set;\r
15 import jp.sourceforge.jindolf.corelib.EventFamily;\r
16 import jp.sourceforge.jindolf.corelib.GameRole;\r
17 import jp.sourceforge.jindolf.corelib.SysEventType;\r
18 import jp.sourceforge.jindolf.parser.DecodedContent;\r
19 \r
20 /**\r
21  * 人狼BBSシステムが生成する各種メッセージ。\r
22  * Topicの具体化。\r
23  */\r
24 public class SysEvent implements Topic{\r
25     // TODO 狼の襲撃先表示は Talk か SysEvent どちらにしよう...\r
26 \r
27     private EventFamily eventFamily;\r
28     private SysEventType sysEventType;\r
29     private DecodedContent content;\r
30 \r
31     private final List<Avatar>   avatarList  = new LinkedList<Avatar>();\r
32     private final List<GameRole> roleList    = new LinkedList<GameRole>();\r
33     private final List<Integer>  integerList = new LinkedList<Integer>();\r
34     private final List<CharSequence>  charseqList =\r
35             new LinkedList<CharSequence>();\r
36 \r
37     /**\r
38      * コンストラクタ。\r
39      */\r
40     public SysEvent(){\r
41         super();\r
42         return;\r
43     }\r
44 \r
45     /**\r
46      * イベントファミリを取得する。\r
47      * @return イベントファミリ\r
48      */\r
49     public EventFamily getEventFamily(){\r
50         return this.eventFamily;\r
51     }\r
52 \r
53     /**\r
54      * イベントファミリを設定する。\r
55      * @param eventFamily イベントファミリ\r
56      * @throws NullPointerException 引数がnull\r
57      */\r
58     public void setEventFamily(EventFamily eventFamily)\r
59             throws NullPointerException{\r
60         this.eventFamily = eventFamily;\r
61         return;\r
62     }\r
63 \r
64     /**\r
65      * イベント種別を取得する。\r
66      * @return イベント種別\r
67      */\r
68     public SysEventType getSysEventType(){\r
69         return this.sysEventType;\r
70     }\r
71 \r
72     /**\r
73      * イベント種別を設定する。\r
74      * @param type イベント種別\r
75      * @throws NullPointerException 引数がnull\r
76      */\r
77     public void setSysEventType(SysEventType type)\r
78             throws NullPointerException{\r
79         if(type == null) throw new NullPointerException();\r
80         this.sysEventType = type;\r
81         return;\r
82     }\r
83 \r
84     /**\r
85      * イベントメッセージを取得する。\r
86      * @return イベントメッセージ\r
87      */\r
88     public DecodedContent getContent(){\r
89         return this.content;\r
90     }\r
91 \r
92     /**\r
93      * イベントメッセージを設定する。\r
94      * @param content イベントメッセージ\r
95      * @throws NullPointerException 引数がnull\r
96      */\r
97     public void setContent(DecodedContent content)\r
98             throws NullPointerException{\r
99         if(content == null) throw new NullPointerException();\r
100         this.content = content;\r
101         return;\r
102     }\r
103 \r
104     /**\r
105      * Avatarリストを取得する。\r
106      * @return Avatarリスト\r
107      */\r
108     public List<Avatar> getAvatarList(){\r
109         List<Avatar> result = Collections.unmodifiableList(this.avatarList);\r
110         return result;\r
111     }\r
112 \r
113     /**\r
114      * Roleリストを取得する。\r
115      * @return Roleリスト\r
116      */\r
117     public List<GameRole> getRoleList(){\r
118         List<GameRole> result = Collections.unmodifiableList(this.roleList);\r
119         return result;\r
120     }\r
121 \r
122     /**\r
123      * Integerリストを取得する。\r
124      * @return Integerリスト\r
125      */\r
126     public List<Integer> getIntegerList(){\r
127         List<Integer> result = Collections.unmodifiableList(this.integerList);\r
128         return result;\r
129     }\r
130 \r
131     /**\r
132      * CharSequenceリストを取得する。\r
133      * @return CharSequenceリスト\r
134      */\r
135     public List<CharSequence> getCharSequenceList(){\r
136         List<CharSequence> result =\r
137                 Collections.unmodifiableList(this.charseqList);\r
138         return result;\r
139     }\r
140 \r
141     /**\r
142      * Avatar一覧を追加する。\r
143      * @param list Avatar一覧\r
144      */\r
145     public void addAvatarList(List<Avatar> list){\r
146         this.avatarList.addAll(list);\r
147         return;\r
148     }\r
149 \r
150     /**\r
151      * 役職一覧を追加する。\r
152      * @param list 役職一覧\r
153      */\r
154     public void addRoleList(List<GameRole> list){\r
155         this.roleList.addAll(list);\r
156         return;\r
157     }\r
158 \r
159     /**\r
160      * 数値一覧を追加する。\r
161      * @param list 数値一覧\r
162      */\r
163     public void addIntegerList(List<Integer> list){\r
164         this.integerList.addAll(list);\r
165         return;\r
166     }\r
167 \r
168     /**\r
169      * 文字列一覧を追加する。\r
170      * @param list 文字列一覧\r
171      */\r
172     public void addCharSequenceList(List<CharSequence> list){\r
173         this.charseqList.addAll(list);\r
174         return;\r
175     }\r
176 \r
177     /**\r
178      * システムイベントを解析し、処刑されたAvatarを返す。\r
179      * G国運用中の時点で、処刑者が出るのはCOUNTINGとEXECUTIONのみ。\r
180      * @return 処刑されたAvatar。いなければnull\r
181      */\r
182     public Avatar getExecutedAvatar(){\r
183         Avatar result = null;\r
184 \r
185         int avatarNum;\r
186         Avatar lastAvatar;\r
187 \r
188         switch(this.sysEventType){\r
189         case COUNTING:\r
190             if(this.avatarList.isEmpty()) return null;\r
191             avatarNum = this.avatarList.size();\r
192             if(avatarNum % 2 != 0){\r
193                 lastAvatar = this.avatarList.get(avatarNum - 1);\r
194                 result = lastAvatar;\r
195             }\r
196             break;\r
197         case EXECUTION:\r
198             if(this.avatarList.isEmpty()) return null;\r
199             avatarNum = this.avatarList.size();\r
200             List<Integer> intList = getIntegerList();\r
201             int intNum = intList.size();\r
202             assert intNum > 0;\r
203             if(avatarNum != intNum || intList.get(intNum - 1) <= 0){\r
204                 lastAvatar = this.avatarList.get(avatarNum - 1);\r
205                 result = lastAvatar;\r
206             }\r
207             break;\r
208         case COUNTING2:\r
209             // NOTHING\r
210             break;\r
211         default:\r
212             break;\r
213         }\r
214 \r
215         return result;\r
216     }\r
217 \r
218     /**\r
219      * 投票に参加したAvatarの集合を返す。\r
220      * G国運用中の時点で、投票者が出るのはCOUNTINGとCOUNTING2のみ。\r
221      * @param set 結果格納先。nullなら自動的に確保される。\r
222      * @return 投票に参加したAvatarのSet\r
223      */\r
224     public Set<Avatar> getVoterSet(Set<Avatar> set){\r
225         Set<Avatar> result;\r
226         if(set == null) result = new HashSet<Avatar>();\r
227         else            result = set;\r
228 \r
229         if(   this.sysEventType != SysEventType.COUNTING\r
230            && this.sysEventType != SysEventType.COUNTING2 ){\r
231             return result;\r
232         }\r
233 \r
234         int size = this.avatarList.size();\r
235         assert size >= 2;\r
236         int limit = size - 1;\r
237         if(size % 2 != 0) limit--;\r
238 \r
239         for(int idx = 0; idx <= limit; idx += 2){\r
240             Avatar avatar = this.avatarList.get(idx);\r
241             result.add(avatar);\r
242         }\r
243 \r
244         return result;\r
245     }\r
246 \r
247 }\r