OSDN Git Service

改行コード指定
[jindolf/JinArchiver.git] / src / main / java / jp / sourceforge / jindolf / archiver / EventData.java
1 /*
2  * system event
3  *
4  * License : The MIT License
5  * Copyright(c) 2008 olyutorskii
6  */
7
8 package jp.sourceforge.jindolf.archiver;
9
10 import java.io.IOException;
11 import java.io.Writer;
12 import java.util.LinkedList;
13 import java.util.List;
14 import jp.sourceforge.jindolf.corelib.GameRole;
15 import jp.sourceforge.jindolf.corelib.SysEventType;
16 import jp.sourceforge.jindolf.parser.DecodedContent;
17
18 /**
19  * システムイベント モデル。
20  */
21 public class EventData extends TopicData{
22
23     private SysEventType eventType = null;
24
25     private final List<AvatarData> avatarList = new LinkedList<AvatarData>();
26     private final List<Integer> intList = new LinkedList<Integer>();
27     private final List<GameRole> roleList = new LinkedList<GameRole>();
28     private final List<DecodedContent> strList =
29             new LinkedList<DecodedContent>();
30
31
32     /**
33      * コンストラクタ。
34      * @param periodData 所属元Period
35      */
36     public EventData(PeriodData periodData){
37         super();
38         return;
39     }
40
41
42     /**
43      * イベント種別からXML要素名を取得する。
44      * @param type イベント種別
45      * @return 要素名
46      */
47     public static String getTagName(SysEventType type){
48         String tagName;
49
50         switch(type){
51         case STARTENTRY:   tagName = "startEntry";   break;
52         case ONSTAGE:      tagName = "onStage";      break;
53         case STARTMIRROR:  tagName = "startMirror";  break;
54         case OPENROLE:     tagName = "openRole";     break;
55         case MURDERED:     tagName = "murdered";     break;
56         case STARTASSAULT: tagName = "startAssault"; break;
57         case SURVIVOR:     tagName = "survivor";     break;
58         case COUNTING:     tagName = "counting";     break;
59         case NOMURDER:     tagName = "noMurder";     break;
60         case SUDDENDEATH:  tagName = "suddenDeath";  break;
61         case WINVILLAGE:   tagName = "winVillage";   break;
62         case WINWOLF:      tagName = "winWolf";      break;
63         case WINHAMSTER:   tagName = "winHamster";   break;
64         case PLAYERLIST:   tagName = "playerList";   break;
65         case PANIC:        tagName = "panic";        break;
66         case EXECUTION:    tagName = "execution";    break;
67         case VANISH:       tagName = "vanish";       break;
68         case CHECKOUT:     tagName = "checkout";     break;
69         case SHORTMEMBER:  tagName = "shortMember";  break;
70         case ASKENTRY:     tagName = "askEntry";     break;
71         case ASKCOMMIT:    tagName = "askCommit";    break;
72         case NOCOMMENT:    tagName = "noComment";    break;
73         case STAYEPILOGUE: tagName = "stayEpilogue"; break;
74         case GAMEOVER:     tagName = "gameOver";     break;
75         case GUARD:        tagName = "guard";        break;
76         case JUDGE:        tagName = "judge";        break;
77         case COUNTING2:    tagName = "counting2";    break;
78         case ASSAULT:      tagName = "assault";      break;
79         default: throw new IllegalArgumentException();
80         }
81
82         return tagName;
83     }
84
85     /**
86      * 役職からXMLシンボル名を取得する。
87      * @param role 役職
88      * @return XMLシンボル名
89      */
90     public static String getRoleAttrValue(GameRole role){
91         String roleName;
92
93         switch(role){
94         case INNOCENT: roleName = "innocent"; break;
95         case WOLF:     roleName = "wolf";     break;
96         case SEER:     roleName = "seer";     break;
97         case SHAMAN:   roleName = "shaman";   break;
98         case MADMAN:   roleName = "madman";   break;
99         case HUNTER:   roleName = "hunter";   break;
100         case FRATER:   roleName = "frater";   break;
101         case HAMSTER:  roleName = "hamster";  break;
102         default: throw new IllegalArgumentException();
103         }
104
105         return roleName;
106     }
107
108     /**
109      * avatarRef要素をXML出力する。
110      * @param writer 出力先
111      * @param avatar Avatar
112      * @throws IOException 出力エラー
113      */
114     public static void dumpAvatarRef(Writer writer, AvatarData avatar)
115             throws IOException{
116         writer.append("<avatarRef");
117         writer.append(' ');
118         XmlUtils.attrOut(writer, "avatarId", avatar.getAvatarId());
119         writer.append(" />\n");
120         return;
121     }
122
123     /**
124      * システムイベント種別を取得する。
125      * @return システムイベント種別
126      */
127     public SysEventType getEventType(){
128         return this.eventType;
129     }
130
131     /**
132      * システムイベント種別を設定する。
133      * @param eventType システムイベント種別
134      */
135     public void setEventType(SysEventType eventType){
136         this.eventType = eventType;
137         return;
138     }
139
140     /**
141      * Avatar情報を追加する。
142      * @param avatarData Avatar情報
143      */
144     public void addAvatarData(AvatarData avatarData){
145         this.avatarList.add(avatarData);
146         return;
147     }
148
149     /**
150      * 整数情報を追加する。
151      * @param intVal 整数情報
152      */
153     public void addInteger(int intVal){
154         this.intList.add(intVal);
155         return;
156     }
157
158     /**
159      * 役職情報を追加する。
160      * @param role 役職情報
161      */
162     public void addGameRole(GameRole role){
163         this.roleList.add(role);
164         return;
165     }
166
167     /**
168      * 文字列情報を追加する。
169      * @param seq 文字列情報
170      */
171     public void addDecodedContent(DecodedContent seq){
172         this.strList.add(seq);
173         return;
174     }
175
176     /**
177      * ONSTAGE属性値をXML出力する。
178      * @param writer 出力先
179      * @throws IOException 出力エラー
180      */
181     public void dumpOnstageAttr(Writer writer) throws IOException{
182         int entryNo = this.intList.get(0);
183         AvatarData avatarData = this.avatarList.get(0);
184
185         writer.append(' ');
186         XmlUtils.attrOut(writer, "entryNo", Integer.toString(entryNo));
187         writer.append(' ');
188         XmlUtils.attrOut(writer, "avatarId", avatarData.getAvatarId());
189
190         return;
191     }
192
193     /**
194      * avatarId属性値をXML出力する。
195      * @param writer 出力先
196      * @throws IOException 出力エラー
197      */
198     public void dumpSingleAvatarAttr(Writer writer) throws IOException{
199         AvatarData avatarData = this.avatarList.get(0);
200
201         writer.append(' ');
202         XmlUtils.attrOut(writer, "avatarId", avatarData.getAvatarId());
203
204         return;
205     }
206
207     /**
208      * COUNTINGのvictim属性値をXML出力する。
209      * @param writer 出力先
210      * @throws IOException 出力エラー
211      */
212     public void dumpCountingAttr(Writer writer) throws IOException{
213         int total = this.avatarList.size();
214         if(total % 2 != 0){
215             AvatarData victim = this.avatarList.get(total - 1);
216             writer.append(' ');
217             XmlUtils.attrOut(writer, "victim", victim.getAvatarId());
218         }
219         return;
220     }
221
222     /**
223      * EXECUTIONのvictim属性値をXML出力する。
224      * @param writer 出力先
225      * @throws IOException 出力エラー
226      */
227     public void dumpExecutionAttr(Writer writer) throws IOException{
228         int totalAvatar = this.avatarList.size();
229         int totalVotes = this.intList.size();
230         if(totalAvatar != totalVotes){
231             AvatarData victim = this.avatarList.get(totalAvatar - 1);
232             writer.append(' ');
233             XmlUtils.attrOut(writer, "victim", victim.getAvatarId());
234         }
235         return;
236     }
237
238     /**
239      * ASKENTRY属性値をXML出力する。
240      * @param writer 出力先
241      * @throws IOException 出力エラー
242      */
243     public void dumpAskEntryAttr(Writer writer) throws IOException{
244         int hour     = this.intList.get(0);
245         int minute   = this.intList.get(1);
246         int minLimit = this.intList.get(2);
247         int maxLimit = this.intList.get(3);
248
249         writer.append(' ');
250         XmlUtils.timeAttrOut(writer, "commitTime", hour, minute);
251
252         writer.append(' ');
253         XmlUtils.attrOut(writer, "minMembers", Integer.toString(minLimit));
254
255         writer.append(' ');
256         XmlUtils.attrOut(writer, "maxMembers", Integer.toString(maxLimit));
257
258         return;
259     }
260
261     /**
262      * ASKCOMMIT属性値をXML出力する。
263      * @param writer 出力先
264      * @throws IOException 出力エラー
265      */
266     public void dumpAskCommitAttr(Writer writer) throws IOException{
267         int hour     = this.intList.get(0);
268         int minute   = this.intList.get(1);
269
270         writer.append(' ');
271         XmlUtils.timeAttrOut(writer, "limitVote", hour, minute);
272
273         writer.append(' ');
274         XmlUtils.timeAttrOut(writer, "limitSpecial", hour, minute);
275
276         return;
277     }
278
279     /**
280      * STAYEPILOGUE属性値をXML出力する。
281      * @param writer 出力先
282      * @throws IOException 出力エラー
283      */
284     public void dumpStayEpilogueAttr(Writer writer) throws IOException{
285         GameRole role = this.roleList.get(0);
286         int hour   = this.intList.get(0);
287         int minute = this.intList.get(1);
288
289         String winner;
290         switch(role){
291         case INNOCENT: winner = "village"; break;
292         case WOLF:     winner = "wolf";    break;
293         case HAMSTER:  winner = "hamster"; break;
294         default: throw new IllegalArgumentException();
295         }
296         writer.append(' ');
297         XmlUtils.attrOut(writer, "maxMembers", winner);
298
299         writer.append(' ');
300         XmlUtils.timeAttrOut(writer, "limitTime", hour, minute);
301
302         return;
303     }
304
305     /**
306      * openRole子要素をXML出力する。
307      * @param writer 出力先
308      * @throws IOException 出力エラー
309      */
310     public void dumpOpenroleElem(Writer writer) throws IOException{
311         int num = this.roleList.size();
312         for(int index = 0; index < num; index++){
313             int heads = this.intList.get(index);
314             GameRole role = this.roleList.get(index);
315             String roleName = getRoleAttrValue(role);
316
317             writer.append("<roleHeads");
318             writer.append(' ');
319             XmlUtils.attrOut(writer, "role", roleName);
320             writer.append(' ');
321             XmlUtils.attrOut(writer, "heads", Integer.toString(heads));
322             writer.append(" />\n");
323         }
324         return;
325     }
326
327     /**
328      * murdered子要素をXML出力する。
329      * @param writer 出力先
330      * @throws IOException 出力エラー
331      */
332     public void dumpMurderedElem(Writer writer) throws IOException{
333         for(AvatarData avatar : this.avatarList){
334             dumpAvatarRef(writer, avatar);
335         }
336         return;
337     }
338
339     /**
340      * survivor子要素をXML出力する。
341      * @param writer 出力先
342      * @throws IOException 出力エラー
343      */
344     public void dumpSurvivorElem(Writer writer) throws IOException{
345         for(AvatarData avatar : this.avatarList){
346             dumpAvatarRef(writer, avatar);
347         }
348         return;
349     }
350
351     /**
352      * nocomment子要素をXML出力する。
353      * @param writer 出力先
354      * @throws IOException 出力エラー
355      */
356     public void dumpNoCommentElem(Writer writer) throws IOException{
357         for(AvatarData avatar : this.avatarList){
358             dumpAvatarRef(writer, avatar);
359         }
360         return;
361     }
362
363     /**
364      * counting子要素をXML出力する。
365      * @param writer 出力先
366      * @throws IOException 出力エラー
367      */
368     public void dumpCountingElem(Writer writer) throws IOException{
369         int total = this.avatarList.size();
370         total = total / 2 * 2;
371         for(int index = 0; index < total; index += 2){
372             AvatarData voteBy = this.avatarList.get(index);
373             AvatarData voteTo = this.avatarList.get(index + 1);
374             writer.append("<vote");
375             writer.append(' ');
376             XmlUtils.attrOut(writer, "byWhom", voteBy.getAvatarId());
377             writer.append(' ');
378             XmlUtils.attrOut(writer, "target", voteTo.getAvatarId());
379             writer.append(" />\n");
380         }
381         return;
382     }
383
384     /**
385      * execution子要素をXML出力する。
386      * @param writer 出力先
387      * @throws IOException 出力エラー
388      */
389     public void dumpExecutionElem(Writer writer) throws IOException{
390         int total = this.intList.size();
391         for(int index = 0; index < total; index++){
392             AvatarData voteTo = this.avatarList.get(index);
393             int count = this.intList.get(index);
394             writer.append("<nominated");
395             writer.append(' ');
396             XmlUtils.attrOut(writer, "avatarId", voteTo.getAvatarId());
397             writer.append(' ');
398             XmlUtils.attrOut(writer, "count", "" + count);
399             writer.append(" />\n");
400         }
401         return;
402     }
403
404     /**
405      * playerlist子要素をXML出力する。
406      * @param writer 出力先
407      * @throws IOException 出力エラー
408      */
409     public void dumpPlayerlistElem(Writer writer) throws IOException{
410         int num = this.avatarList.size();
411
412         for(int index = 0; index < num; index++){
413             AvatarData avatar = this.avatarList.get(index);
414             DecodedContent uri     = this.strList.get(index * 2);
415             DecodedContent account = this.strList.get(index * 2 + 1);
416             int isLiving = this.intList.get(index);
417             String survive;
418             if(isLiving == 0) survive = "false";
419             else              survive = "true";
420             GameRole role = this.roleList.get(index);
421             String roleName = getRoleAttrValue(role);
422
423             writer.append("<playerInfo");
424             writer.append(' ');
425             XmlUtils.attrOut(writer, "playerId", account.toString());
426             writer.append(' ');
427             XmlUtils.attrOut(writer, "avatarId", avatar.getAvatarId());
428             writer.append(' ');
429             XmlUtils.attrOut(writer, "survive", survive);
430             writer.append(' ');
431             XmlUtils.attrOut(writer, "role", roleName);
432
433             String uriStr = uri.toString();
434             uriStr = uriStr.replaceAll("^[\\s]+", "");
435             uriStr = uriStr.replaceAll("[\\s]+$", "");
436             uriStr = uriStr.replaceAll("[\\s]+", "\u0020");
437             if(uriStr.length() > 0){
438                 writer.append(' ');
439                 XmlUtils.attrOut(writer, "uri", uriStr);
440             }
441
442             writer.append(" />\n");
443         }
444
445         return;
446     }
447
448     /**
449      * Avatar間関係の属性値をXML出力する。
450      * @param writer 出力先
451      * @throws IOException 出力エラー
452      */
453     public void dumpByWhomAttr(Writer writer) throws IOException{
454         AvatarData by = this.avatarList.get(0);
455         AvatarData to = this.avatarList.get(1);
456
457         writer.append(' ');
458         XmlUtils.attrOut(writer, "byWhom", by.getAvatarId());
459         writer.append(' ');
460         XmlUtils.attrOut(writer, "target", to.getAvatarId());
461
462         return;
463     }
464
465     /**
466      * ASSAULT属性値をXML出力する。
467      * @param writer 出力先
468      * @throws IOException 出力エラー
469      */
470     public void dumpAssaultAttr(Writer writer) throws IOException{
471         AvatarData by = this.avatarList.get(0);
472         AvatarData to = this.avatarList.get(1);
473
474         writer.append('\n');
475
476         XmlUtils.indent(writer, 1);
477         XmlUtils.attrOut(writer, "byWhom", by.getAvatarId());
478         writer.append(' ');
479         XmlUtils.attrOut(writer, "target", to.getAvatarId());
480         writer.append('\n');
481
482         DecodedContent xname = this.strList.get(0);
483         XmlUtils.indent(writer, 1);
484         XmlUtils.attrOut(writer, "xname", xname);
485
486         int hour = this.intList.get(0);
487         int minute = this.intList.get(1);
488         writer.append(' ');
489         XmlUtils.timeAttrOut(writer, "time", hour, minute);
490         writer.append('\n');
491
492         String icon = this.strList.get(1).toString();
493         if( ! icon.equals(by.getFaceIconUri()) ){
494             XmlUtils.indent(writer, 1);
495             XmlUtils.attrOut(writer, "faceIconURI", icon);
496             writer.append('\n');
497         }
498
499         return;
500     }
501
502     /**
503      * システムイベント各種要素のXML出力を行う。
504      * @param writer 出力先
505      * @throws IOException 出力エラー
506      */
507     public void dumpXml(Writer writer) throws IOException{
508         String tagName = getTagName(this.eventType);
509
510         writer.append("<");
511         writer.append(tagName);
512
513         boolean hasAttr = true;
514         switch(this.eventType){
515         case ONSTAGE:
516             dumpOnstageAttr(writer);
517             break;
518         case COUNTING:
519             dumpCountingAttr(writer);
520             break;
521         case EXECUTION:
522             dumpExecutionAttr(writer);
523             break;
524         case SUDDENDEATH:
525         case VANISH:
526         case CHECKOUT:
527             dumpSingleAvatarAttr(writer);
528             break;
529         case ASKENTRY:
530             dumpAskEntryAttr(writer);
531             break;
532         case ASKCOMMIT:
533             dumpAskCommitAttr(writer);
534             break;
535         case STAYEPILOGUE:
536             dumpStayEpilogueAttr(writer);
537             break;
538         case JUDGE:
539         case GUARD:
540             dumpByWhomAttr(writer);
541             break;
542         case ASSAULT:
543             dumpAssaultAttr(writer);
544             break;
545         default:
546             hasAttr = false;
547             break;
548         }
549
550         if(hasAttr) writer.append(' ');
551         writer.append(">\n");
552
553         dumpLines(writer);
554
555         switch(this.eventType){
556         case OPENROLE:
557             dumpOpenroleElem(writer);
558             break;
559         case MURDERED:
560             dumpMurderedElem(writer);
561             break;
562         case SURVIVOR:
563             dumpSurvivorElem(writer);
564             break;
565         case COUNTING:
566         case COUNTING2:
567             dumpCountingElem(writer);
568             break;
569         case EXECUTION:
570             dumpExecutionElem(writer);
571             break;
572         case PLAYERLIST:
573             dumpPlayerlistElem(writer);
574             break;
575         case NOCOMMENT:
576             dumpNoCommentElem(writer);
577             break;
578         default:
579             break;
580         }
581
582         writer.append("</");
583         writer.append(tagName);
584         writer.append(">\n");
585
586         return;
587     }
588
589 }