4 * Copyright(c) 2008 olyutorskii
\r
7 package jp.sourceforge.jindolf.archiver;
\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
20 public class EventData extends TopicData{
\r
23 * イベント種別からXML要素名を取得する。
\r
24 * @param type イベント種別
\r
27 public static String getTagName(SysEventType 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
61 * 役職からXMLシンボル名を取得する。
\r
65 public static String getRoleAttrValue(GameRole 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
84 * avatarRef要素をXML出力する。
\r
86 * @param avatar Avatar
\r
87 * @throws IOException 出力エラー
\r
89 public static void dumpAvatarRef(Writer writer, AvatarData avatar)
\r
91 writer.append("<avatarRef");
\r
93 XmlUtils.attrOut(writer, "avatarId", avatar.getAvatarId());
\r
94 writer.append(" />\n");
\r
98 private final PeriodData periodData;
\r
99 private SysEventType eventType = null;
\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
109 * @param periodData 所属元Period
\r
111 public EventData(PeriodData periodData){
\r
113 this.periodData = periodData;
\r
119 * @return システムイベント種別
\r
121 public SysEventType getEventType(){
\r
122 return this.eventType;
\r
127 * @param eventType システムイベント種別
\r
129 public void setEventType(SysEventType eventType){
\r
130 this.eventType = eventType;
\r
136 * @param avatarData Avatar情報
\r
138 public void addAvatarData(AvatarData avatarData){
\r
139 this.avatarList.add(avatarData);
\r
145 * @param intVal 整数情報
\r
147 public void addInteger(int intVal){
\r
148 this.intList.add(intVal);
\r
156 public void addGameRole(GameRole role){
\r
157 this.roleList.add(role);
\r
165 public void addDecodedContent(DecodedContent seq){
\r
166 this.strList.add(seq);
\r
171 * ONSTAGE属性値をXML出力する。
\r
172 * @param writer 出力先
\r
173 * @throws IOException 出力エラー
\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
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
188 * COUNTING属性値をXML出力する。
\r
189 * @param writer 出力先
\r
190 * @throws IOException 出力エラー
\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
203 * SUDDENDEATH属性値をXML出力する。
\r
204 * @param writer 出力先
\r
205 * @throws IOException 出力エラー
\r
207 public void dumpSuddendeathAttr(Writer writer) throws IOException{
\r
208 AvatarData avatarData = this.avatarList.get(0);
\r
210 writer.append(' ');
\r
211 XmlUtils.attrOut(writer, "avatarId", avatarData.getAvatarId());
\r
217 * ASKENTRY属性値をXML出力する。
\r
218 * @param writer 出力先
\r
219 * @throws IOException 出力エラー
\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
227 writer.append(' ');
\r
228 XmlUtils.timeAttrOut(writer, "commitTime", hour, minute);
\r
230 writer.append(' ');
\r
231 XmlUtils.attrOut(writer, "minMembers", Integer.toString(minLimit));
\r
233 writer.append(' ');
\r
234 XmlUtils.attrOut(writer, "maxMembers", Integer.toString(maxLimit));
\r
240 * ASKCOMMIT属性値をXML出力する。
\r
241 * @param writer 出力先
\r
242 * @throws IOException 出力エラー
\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
248 writer.append(' ');
\r
249 XmlUtils.timeAttrOut(writer, "limitVote", hour, minute);
\r
251 writer.append(' ');
\r
252 XmlUtils.timeAttrOut(writer, "limitSpecial", hour, minute);
\r
258 * STAYEPILOGUE属性値をXML出力する。
\r
259 * @param writer 出力先
\r
260 * @throws IOException 出力エラー
\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
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
274 writer.append(' ');
\r
275 XmlUtils.attrOut(writer, "maxMembers", winner);
\r
277 writer.append(' ');
\r
278 XmlUtils.timeAttrOut(writer, "limitTime", hour, minute);
\r
284 * openRole子要素をXML出力する。
\r
285 * @param writer 出力先
\r
286 * @throws IOException 出力エラー
\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
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
306 * murdered子要素をXML出力する。
\r
307 * @param writer 出力先
\r
308 * @throws IOException 出力エラー
\r
310 public void dumpMurderedElem(Writer writer) throws IOException{
\r
311 for(AvatarData avatar : this.avatarList){
\r
312 dumpAvatarRef(writer, avatar);
\r
318 * survivor子要素をXML出力する。
\r
319 * @param writer 出力先
\r
320 * @throws IOException 出力エラー
\r
322 public void dumpSurvivorElem(Writer writer) throws IOException{
\r
323 for(AvatarData avatar : this.avatarList){
\r
324 dumpAvatarRef(writer, avatar);
\r
330 * nocomment子要素をXML出力する。
\r
331 * @param writer 出力先
\r
332 * @throws IOException 出力エラー
\r
334 public void dumpNoCommentElem(Writer writer) throws IOException{
\r
335 for(AvatarData avatar : this.avatarList){
\r
336 dumpAvatarRef(writer, avatar);
\r
342 * counting子要素をXML出力する。
\r
343 * @param writer 出力先
\r
344 * @throws IOException 出力エラー
\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
363 * playerlist子要素をXML出力する。
\r
364 * @param writer 出力先
\r
365 * @throws IOException 出力エラー
\r
367 public void dumpPlayerlistElem(Writer writer) throws IOException{
\r
368 int num = this.avatarList.size();
\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
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
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
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
400 writer.append(" />\n");
\r
407 * Avatar間関係の属性値をXML出力する。
\r
408 * @param writer 出力先
\r
409 * @throws IOException 出力エラー
\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
415 writer.append(' ');
\r
416 XmlUtils.attrOut(writer, "byWhom", by.getAvatarId());
\r
417 writer.append(' ');
\r
418 XmlUtils.attrOut(writer, "target", to.getAvatarId());
\r
424 * ASSAULT属性値をXML出力する。
\r
425 * @param writer 出力先
\r
426 * @throws IOException 出力エラー
\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
432 writer.append('\n');
\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
440 DecodedContent xname = this.strList.get(0);
\r
441 XmlUtils.indent(writer, 1);
\r
442 XmlUtils.attrOut(writer, "xname", xname);
\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
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
461 * システムイベント各種要素のXML出力を行う。
\r
462 * @param writer 出力先
\r
463 * @throws IOException 出力エラー
\r
465 public void dumpXml(Writer writer) throws IOException{
\r
466 String tagName = getTagName(this.eventType);
\r
468 writer.append("<");
\r
469 writer.append(tagName);
\r
471 boolean hasAttr = true;
\r
472 switch(this.eventType){
\r
474 dumpOnstageAttr(writer);
\r
477 dumpCountingAttr(writer);
\r
480 dumpSuddendeathAttr(writer);
\r
483 dumpAskEntryAttr(writer);
\r
486 dumpAskCommitAttr(writer);
\r
489 dumpStayEpilogueAttr(writer);
\r
493 dumpByWhomAttr(writer);
\r
496 dumpAssaultAttr(writer);
\r
503 if(hasAttr) writer.append(' ');
\r
504 writer.append(">\n");
\r
508 switch(this.eventType){
\r
510 dumpOpenroleElem(writer);
\r
513 dumpMurderedElem(writer);
\r
516 dumpSurvivorElem(writer);
\r
519 dumpCountingElem(writer);
\r
522 dumpPlayerlistElem(writer);
\r
525 dumpNoCommentElem(writer);
\r
531 writer.append("</");
\r
532 writer.append(tagName);
\r
533 writer.append(">\n");
\r