2 * system event in game
\r
4 * License : The MIT License
\r
5 * Copyright(c) 2008 olyutorskii
\r
8 package jp.sourceforge.jindolf;
\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
21 * 人狼BBSシステムが生成する各種メッセージ。
\r
24 public class SysEvent implements Topic{
\r
25 // TODO 狼の襲撃先表示は Talk か SysEvent どちらにしよう...
\r
27 private EventFamily eventFamily;
\r
28 private SysEventType sysEventType;
\r
29 private DecodedContent content;
\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
49 public EventFamily getEventFamily(){
\r
50 return this.eventFamily;
\r
55 * @param eventFamily イベントファミリ
\r
56 * @throws NullPointerException 引数がnull
\r
58 public void setEventFamily(EventFamily eventFamily)
\r
59 throws NullPointerException{
\r
60 this.eventFamily = eventFamily;
\r
68 public SysEventType getSysEventType(){
\r
69 return this.sysEventType;
\r
74 * @param type イベント種別
\r
75 * @throws NullPointerException 引数がnull
\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
88 public DecodedContent getContent(){
\r
89 return this.content;
\r
94 * @param content イベントメッセージ
\r
95 * @throws NullPointerException 引数がnull
\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
106 * @return Avatarリスト
\r
108 public List<Avatar> getAvatarList(){
\r
109 List<Avatar> result = Collections.unmodifiableList(this.avatarList);
\r
117 public List<GameRole> getRoleList(){
\r
118 List<GameRole> result = Collections.unmodifiableList(this.roleList);
\r
124 * @return Integerリスト
\r
126 public List<Integer> getIntegerList(){
\r
127 List<Integer> result = Collections.unmodifiableList(this.integerList);
\r
132 * CharSequenceリストを取得する。
\r
133 * @return CharSequenceリスト
\r
135 public List<CharSequence> getCharSequenceList(){
\r
136 List<CharSequence> result =
\r
137 Collections.unmodifiableList(this.charseqList);
\r
143 * @param list Avatar一覧
\r
145 public void addAvatarList(List<Avatar> list){
\r
146 this.avatarList.addAll(list);
\r
154 public void addRoleList(List<GameRole> list){
\r
155 this.roleList.addAll(list);
\r
163 public void addIntegerList(List<Integer> list){
\r
164 this.integerList.addAll(list);
\r
170 * @param list 文字列一覧
\r
172 public void addCharSequenceList(List<CharSequence> list){
\r
173 this.charseqList.addAll(list);
\r
178 * システムイベントを解析し、処刑されたAvatarを返す。
\r
179 * G国運用中の時点で、処刑者が出るのはCOUNTINGとEXECUTIONのみ。
\r
180 * @return 処刑されたAvatar。いなければnull
\r
182 public Avatar getExecutedAvatar(){
\r
183 Avatar result = null;
\r
188 switch(this.sysEventType){
\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
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
203 if(avatarNum != intNum || intList.get(intNum - 1) <= 0){
\r
204 lastAvatar = this.avatarList.get(avatarNum - 1);
\r
205 result = lastAvatar;
\r
219 * 投票に参加したAvatarの集合を返す。
\r
220 * G国運用中の時点で、投票者が出るのはCOUNTINGとCOUNTING2のみ。
\r
221 * @param set 結果格納先。nullなら自動的に確保される。
\r
222 * @return 投票に参加したAvatarのSet
\r
224 public Set<Avatar> getVoterSet(Set<Avatar> set){
\r
225 Set<Avatar> result;
\r
226 if(set == null) result = new HashSet<Avatar>();
\r
229 if( this.sysEventType != SysEventType.COUNTING
\r
230 && this.sysEventType != SysEventType.COUNTING2 ){
\r
234 int size = this.avatarList.size();
\r
236 int limit = size - 1;
\r
237 if(size % 2 != 0) limit--;
\r
239 for(int idx = 0; idx <= limit; idx += 2){
\r
240 Avatar avatar = this.avatarList.get(idx);
\r
241 result.add(avatar);
\r