From 9b8ddca7df094bb0097ae5692f805a244d300965 Mon Sep 17 00:00:00 2001 From: Olyutorskii Date: Fri, 13 Mar 2020 12:39:15 +0900 Subject: [PATCH] implement SystemEvent XML-loader. --- .../java/jp/sfjp/jindolf/data/xml/ElemTag.java | 75 ++++++++++++++++- .../jp/sfjp/jindolf/data/xml/VillageHandler.java | 98 ++++++++++++++++++++++ 2 files changed, 172 insertions(+), 1 deletion(-) diff --git a/src/main/java/jp/sfjp/jindolf/data/xml/ElemTag.java b/src/main/java/jp/sfjp/jindolf/data/xml/ElemTag.java index c5693e6..9c6da11 100644 --- a/src/main/java/jp/sfjp/jindolf/data/xml/ElemTag.java +++ b/src/main/java/jp/sfjp/jindolf/data/xml/ElemTag.java @@ -9,6 +9,7 @@ package jp.sfjp.jindolf.data.xml; import java.util.HashMap; import java.util.Map; +import jp.sourceforge.jindolf.corelib.SysEventType; /** * XMLファイルのタグ要素名デコーダ。 @@ -16,23 +17,76 @@ import java.util.Map; public enum ElemTag { VILLAGE("village"), + AVATARLIST("avatarList"), AVATAR("avatar"), + AVATARREF("avatarRef"), PERIOD("period"), + TALK("talk"), LI("li"), + RAWDATA("rawdata"), + + STARTENTRY("startEntry", SysEventType.STARTENTRY), + ONSTAGE("onStage", SysEventType.ONSTAGE), + STARTMIRROR("startMirror", SysEventType.STARTMIRROR), + OPENROLE("openRole", SysEventType.OPENROLE), + MURDERED("murdered", SysEventType.MURDERED), + STARTASSAULT("startAssault", SysEventType.STARTASSAULT), + SURVIVOR("survivor", SysEventType.SURVIVOR), + COUNTING("counting", SysEventType.COUNTING), + SUDDENDEATH("suddenDeath", SysEventType.SUDDENDEATH), + NOMURDER("noMurder", SysEventType.NOMURDER), + WINVILLAGE("winVillage", SysEventType.WINVILLAGE), + WINWOLF("winWolf", SysEventType.WINWOLF), + WINHAMSTER("winHamster", SysEventType.WINHAMSTER), + PLAYERLIST("playerList", SysEventType.PLAYERLIST), + PANIC("panic", SysEventType.PANIC), + EXECUTION("execution", SysEventType.EXECUTION), + VANISH("vanish", SysEventType.VANISH), + CHECKOUT("checkout", SysEventType.CHECKOUT), + SHORTMEMBER("shortMember", SysEventType.SHORTMEMBER), + ASKENTRY("askEntry", SysEventType.ASKENTRY), + ASKCOMMIT("askCommit", SysEventType.ASKCOMMIT), + NOCOMMENT("noComment", SysEventType.NOCOMMENT), + STAYEPILOGUE("stayEpilogue", SysEventType.STAYEPILOGUE), + GAMEOVER("gameOver", SysEventType.GAMEOVER), + JUDGE("judge", SysEventType.JUDGE), + GUARD("guard", SysEventType.GUARD), + COUNTING2("counting2", SysEventType.COUNTING2), + ASSAULT("assault", SysEventType.ASSAULT), + + ROLEHEADS("roleHeads"), + VOTE("vote"), + PLAYERINFO("playerInfo"), + NOMINATED("nominated"), ; private final String name; + private final SysEventType sysEventType; /** * constructor. * * @param name element name + * @param isSysEvent true if SysEvent */ - ElemTag(String name){ + ElemTag(String name, SysEventType type){ this.name = name; + this.sysEventType = type; + return; + } + + /** + * constructor. + * + *

It's not SysEvent. + * + * @param name element name + */ + ElemTag(String name){ + this(name, null); return; } @@ -62,4 +116,23 @@ public enum ElemTag { return result; } + + /** + * タグがSysEventか判定する。 + * + * @return SysEventならtrue + */ + public boolean isSysEventTag(){ + return this.sysEventType != null; + } + + /** + * return SysEventType. + * + * @return SysEventType. true if not SystemEvent. + */ + public SysEventType getSystemEventType(){ + return this.sysEventType; + } + } diff --git a/src/main/java/jp/sfjp/jindolf/data/xml/VillageHandler.java b/src/main/java/jp/sfjp/jindolf/data/xml/VillageHandler.java index d8bafc7..5ad78fb 100644 --- a/src/main/java/jp/sfjp/jindolf/data/xml/VillageHandler.java +++ b/src/main/java/jp/sfjp/jindolf/data/xml/VillageHandler.java @@ -9,13 +9,18 @@ package jp.sfjp.jindolf.data.xml; import java.util.HashMap; import java.util.Map; +import jp.osdn.jindolf.parser.content.DecodedContent; import jp.sfjp.jindolf.data.Avatar; import jp.sfjp.jindolf.data.CoreData; import jp.sfjp.jindolf.data.Land; import jp.sfjp.jindolf.data.Period; +import jp.sfjp.jindolf.data.SysEvent; import jp.sfjp.jindolf.data.Talk; +import jp.sfjp.jindolf.data.Topic; import jp.sfjp.jindolf.data.Village; +import jp.sourceforge.jindolf.corelib.EventFamily; import jp.sourceforge.jindolf.corelib.PeriodType; +import jp.sourceforge.jindolf.corelib.SysEventType; import jp.sourceforge.jindolf.corelib.TalkType; import jp.sourceforge.jindolf.corelib.VillageState; import org.xml.sax.Attributes; @@ -47,6 +52,8 @@ public class VillageHandler implements ContentHandler{ private String messageId; private String talkTime; + private SysEventType sysEventType; + private boolean inLine; private final StringBuilder content = new StringBuilder(250); @@ -354,6 +361,87 @@ public class VillageHandler implements ContentHandler{ } /** + * SysEvent 開始の受信。 + * + * @param type SysEvent種別 + */ + private void startSysEvent(SysEventType type, Attributes atts){ + this.sysEventType = type; + + if(this.sysEventType == SysEventType.ASSAULT){ + String byWhom = attrValue(atts, "byWhom"); + String xname = attrValue(atts, "xname"); + String time = attrValue(atts, "time"); + + this.talkAvatar = this.idAvatarMap.get(byWhom); + this.talkType = TalkType.WOLFONLY; + this.messageId = xname; + this.talkTime = time; + } + + this.content.setLength(0); + return; + } + + /** + * SysEvent 終了の受信。 + * + * @return パースしたSysEvent。 + */ + private SysEvent endSysEvent(){ + SysEvent ev = null; + Topic topic; + if(this.sysEventType == SysEventType.ASSAULT){ + int hour = decodeHour (this.talkTime); + int minute = decodeMinute(this.talkTime); + + String dialog = this.content.toString(); + + Talk talk = new Talk( + this.period, + this.talkType, this.talkAvatar, + 0, this.messageId, + hour, minute, + dialog ); + topic = talk; + this.talkType = null; + this.talkAvatar = null; + this.talkTime = null; + this.messageId = null; + }else{ + ev = buildSysEvent(); + topic = ev; + } + + this.period.addTopic(topic); + + this.content.setLength(0); + this.sysEventType = null; + + return ev; + } + + /** + * SystemEvent 生成共通処理。 + * + *

イベントファミリ、イベントタイプ、会話テキストが設定される。 + * + * @return SystemEvent + */ + private SysEvent buildSysEvent(){ + SysEvent ev = new SysEvent(); + + EventFamily eventFamily = this.sysEventType.getEventFamily(); + ev.setSysEventType(this.sysEventType); + ev.setEventFamily(eventFamily); + + DecodedContent dc = new DecodedContent(this.content); + ev.setContent(dc); + + return ev; + } + + /** * {@inheritDoc} * * @param locator {@inheritDoc} @@ -432,6 +520,11 @@ public class VillageHandler implements ContentHandler{ ElemTag tag = decodeElemTag(uri, localName, qName); if(tag == null) return; + if(tag.isSysEventTag()){ + startSysEvent(tag.getSystemEventType(), atts); + return; + } + switch(tag){ case VILLAGE: startVillage(atts); @@ -469,6 +562,11 @@ public class VillageHandler implements ContentHandler{ ElemTag tag = decodeElemTag(uri, localName, qName); if(tag == null) return; + if(tag.isSysEventTag()){ + endSysEvent(); + return; + } + switch(tag){ case TALK: endTalk(); -- 2.11.0