OSDN Git Service

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