4 * License : The MIT License
5 * Copyright(c) 2008 olyutorskii
8 package jp.sfjp.jindolf.data;
10 import java.util.Collections;
11 import java.util.HashSet;
12 import java.util.LinkedList;
13 import java.util.List;
15 import jp.osdn.jindolf.parser.content.DecodedContent;
16 import jp.sourceforge.jindolf.corelib.EventFamily;
17 import jp.sourceforge.jindolf.corelib.GameRole;
18 import jp.sourceforge.jindolf.corelib.SysEventType;
21 * 人狼BBSシステムが生成する各種メッセージ。
24 public class SysEvent implements Topic{
25 // TODO 狼の襲撃先表示は Talk か SysEvent どちらにしよう...
27 private EventFamily eventFamily;
28 private SysEventType sysEventType;
29 private DecodedContent content;
31 private final List<Avatar> avatarList = new LinkedList<>();
32 private final List<GameRole> roleList = new LinkedList<>();
33 private final List<Integer> integerList = new LinkedList<>();
34 private final List<CharSequence> charseqList =
36 /** for playerList and onStage. */
37 private final List<Player> playerList = new LinkedList<>();
52 public EventFamily getEventFamily(){
53 return this.eventFamily;
58 * @param eventFamily イベントファミリ
59 * @throws NullPointerException 引数がnull
61 public void setEventFamily(EventFamily eventFamily)
62 throws NullPointerException{
63 this.eventFamily = eventFamily;
71 public SysEventType getSysEventType(){
72 return this.sysEventType;
78 * @throws NullPointerException 引数がnull
80 public void setSysEventType(SysEventType type)
81 throws NullPointerException{
82 if(type == null) throw new NullPointerException();
83 this.sysEventType = type;
91 public DecodedContent getContent(){
97 * @param content イベントメッセージ
98 * @throws NullPointerException 引数がnull
100 public void setContent(DecodedContent content)
101 throws NullPointerException{
102 if(content == null) throw new NullPointerException();
103 this.content = content;
111 public List<Avatar> getAvatarList(){
112 List<Avatar> result = Collections.unmodifiableList(this.avatarList);
120 public List<GameRole> getRoleList(){
121 List<GameRole> result = Collections.unmodifiableList(this.roleList);
129 public List<Integer> getIntegerList(){
130 List<Integer> result = Collections.unmodifiableList(this.integerList);
135 * CharSequenceリストを取得する。
136 * @return CharSequenceリスト
138 public List<CharSequence> getCharSequenceList(){
139 List<CharSequence> result =
140 Collections.unmodifiableList(this.charseqList);
148 public List<Player> getPlayerList(){
149 List<Player> result =
150 Collections.unmodifiableList(this.playerList);
156 * @param list Avatar一覧
158 public void addAvatarList(List<Avatar> list){
159 this.avatarList.addAll(list);
167 public void addRoleList(List<GameRole> list){
168 this.roleList.addAll(list);
176 public void addIntegerList(List<Integer> list){
177 this.integerList.addAll(list);
185 public void addCharSequenceList(List<CharSequence> list){
186 this.charseqList.addAll(list);
193 * @param list Player一覧
195 public void addPlayerList(List<Player> list){
196 this.playerList.addAll(list);
201 * システムイベントを解析し、処刑されたAvatarを返す。
202 * G国運用中の時点で、処刑者が出るのはCOUNTINGとEXECUTIONのみ。
203 * @return 処刑されたAvatar。いなければnull
205 public Avatar getExecutedAvatar(){
206 Avatar result = null;
211 switch(this.sysEventType){
213 if(this.avatarList.isEmpty()) return null;
214 avatarNum = this.avatarList.size();
215 if(avatarNum % 2 != 0){
216 lastAvatar = this.avatarList.get(avatarNum - 1);
221 if(this.avatarList.isEmpty()) return null;
222 avatarNum = this.avatarList.size();
223 List<Integer> intList = getIntegerList();
224 int intNum = intList.size();
226 if(avatarNum != intNum || intList.get(intNum - 1) <= 0){
227 lastAvatar = this.avatarList.get(avatarNum - 1);
242 * 投票に参加したAvatarの集合を返す。
243 * G国運用中の時点で、投票者が出るのはCOUNTINGとCOUNTING2のみ。
244 * @param set 結果格納先。nullなら自動的に確保される。
245 * @return 投票に参加したAvatarのSet
247 public Set<Avatar> getVoterSet(Set<Avatar> set){
249 if(set == null) result = new HashSet<>();
252 if( this.sysEventType != SysEventType.COUNTING
253 && this.sysEventType != SysEventType.COUNTING2 ){
257 int size = this.avatarList.size();
259 int limit = size - 1;
260 if(size % 2 != 0) limit--;
262 for(int idx = 0; idx <= limit; idx += 2){
263 Avatar avatar = this.avatarList.get(idx);