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<>();
39 private final List<Nominated> nominatedList = new LinkedList<>();
54 public EventFamily getEventFamily(){
55 return this.eventFamily;
60 * @param eventFamily イベントファミリ
61 * @throws NullPointerException 引数がnull
63 public void setEventFamily(EventFamily eventFamily)
64 throws NullPointerException{
65 this.eventFamily = eventFamily;
73 public SysEventType getSysEventType(){
74 return this.sysEventType;
80 * @throws NullPointerException 引数がnull
82 public void setSysEventType(SysEventType type)
83 throws NullPointerException{
84 if(type == null) throw new NullPointerException();
85 this.sysEventType = type;
93 public DecodedContent getContent(){
99 * @param content イベントメッセージ
100 * @throws NullPointerException 引数がnull
102 public void setContent(DecodedContent content)
103 throws NullPointerException{
104 if(content == null) throw new NullPointerException();
105 this.content = content;
113 public List<Avatar> getAvatarList(){
114 List<Avatar> result = Collections.unmodifiableList(this.avatarList);
122 public List<GameRole> getRoleList(){
123 List<GameRole> result = Collections.unmodifiableList(this.roleList);
131 public List<Integer> getIntegerList(){
132 List<Integer> result = Collections.unmodifiableList(this.integerList);
137 * CharSequenceリストを取得する。
138 * @return CharSequenceリスト
140 public List<CharSequence> getCharSequenceList(){
141 List<CharSequence> result =
142 Collections.unmodifiableList(this.charseqList);
151 public List<Player> getPlayerList(){
152 List<Player> result =
153 Collections.unmodifiableList(this.playerList);
160 * @return Nominatedリスト
162 public List<Nominated> getNominatedList(){
163 List<Nominated> result =
164 Collections.unmodifiableList(this.nominatedList);
170 * @param list Avatar一覧
172 public void addAvatarList(List<Avatar> list){
173 this.avatarList.addAll(list);
181 public void addRoleList(List<GameRole> list){
182 this.roleList.addAll(list);
190 public void addIntegerList(List<Integer> list){
191 this.integerList.addAll(list);
199 public void addCharSequenceList(List<CharSequence> list){
200 this.charseqList.addAll(list);
207 * @param list Player一覧
209 public void addPlayerList(List<Player> list){
210 this.playerList.addAll(list);
217 * @param list Nominated一覧
219 public void addNominatedList(List<Nominated> list){
220 this.nominatedList.addAll(list);
225 * システムイベントを解析し、処刑されたAvatarを返す。
226 * G国運用中の時点で、処刑者が出るのはCOUNTINGとEXECUTIONのみ。
227 * @return 処刑されたAvatar。いなければnull
229 public Avatar getExecutedAvatar(){
230 Avatar result = null;
235 switch(this.sysEventType){
237 if(this.avatarList.isEmpty()) return null;
238 avatarNum = this.avatarList.size();
239 if(avatarNum % 2 != 0){
240 lastAvatar = this.avatarList.get(avatarNum - 1);
245 if( ! this.avatarList.isEmpty()){
246 result = this.avatarList.get(0);
260 * 投票に参加したAvatarの集合を返す。
261 * G国運用中の時点で、投票者が出るのはCOUNTINGとCOUNTING2のみ。
262 * @param set 結果格納先。nullなら自動的に確保される。
263 * @return 投票に参加したAvatarのSet
265 public Set<Avatar> getVoterSet(Set<Avatar> set){
267 if(set == null) result = new HashSet<>();
270 if( this.sysEventType != SysEventType.COUNTING
271 && this.sysEventType != SysEventType.COUNTING2 ){
275 int size = this.avatarList.size();
277 int limit = size - 1;
278 if(size % 2 != 0) limit--;
280 for(int idx = 0; idx <= limit; idx += 2){
281 Avatar avatar = this.avatarList.get(idx);