import jp.osdn.jindolf.parser.PageType;
import jp.osdn.jindolf.parser.SeqRange;
import jp.osdn.jindolf.parser.content.DecodedContent;
-import jp.sfjp.jindolf.util.StringUtils;
import jp.sourceforge.jindolf.corelib.EventFamily;
import jp.sourceforge.jindolf.corelib.GameRole;
import jp.sourceforge.jindolf.corelib.PeriodType;
this.period.addTopic(event);
- if( this.sysEventType == SysEventType.MURDERED
- || this.sysEventType == SysEventType.NOMURDER ){
+ boolean isMurderResult =
+ this.sysEventType == SysEventType.MURDERED
+ || this.sysEventType == SysEventType.NOMURDER;
+
+ if(isMurderResult){
for(Topic topic : this.period.getTopicList()){
if( ! (topic instanceof Talk) ) continue;
Talk talk = (Talk) topic;
- if(talk.getTalkType() != TalkType.WOLFONLY) continue;
- if( ! StringUtils
- .isTerminated(talk.getDialog(),
- "!\u0020今日がお前の命日だ!") ){
- continue;
+ if(talk.isMurderNotice()){
+ talk.setCount(-1);
+ this.countMap.clear();
+ break;
}
- talk.setCount(-1);
- this.countMap.clear();
}
}
package jp.sfjp.jindolf.data;
+import jp.sfjp.jindolf.util.StringUtils;
import jp.sourceforge.jindolf.corelib.TalkType;
/**
*/
public class Talk implements Topic{
+ private static final String MEINICHI_LAST = "!\u0020今日がお前の命日だ!";
+
+
private final Period homePeriod;
private final TalkType talkType;
private final Avatar avatar;
/**
* Talkの生成。
+ *
* @param homePeriod 発言元Period
* @param talkType 発言種別
* @param avatar Avatar
/**
* 会話種別から色名への変換を行う。
+ *
* @param type 会話種別
* @return 色名
*/
/**
* 発言が交わされたPeriodを返す。
+ *
* @return Period
*/
public Period getPeriod(){
/**
* 発言種別を得る。
+ *
* @return 種別
*/
public TalkType getTalkType(){
/**
* 墓下発言か否か判定する。
+ *
* @return 墓下発言ならtrue
*/
public boolean isGrave(){
}
/**
- * 発言種別ごとにその日(Period)の累積発言回数を返す。
- * 1から始まる。
+ * 各Avatarの発言種別ごとにその日(Period)の累積発言回数を返す。
+ *
+ * <p>システム生成の殺人予告の場合は負の値となる。
+ *
* @return 累積発言回数。
*/
public int getTalkCount(){
/**
* 発言文字数を返す。
- * 改行(\n)は1文字。
+ *
+ * <p>改行(\n)は1文字。
+ *
* @return 文字数
*/
public int getTotalChars(){
/**
* 発言元Avatarを得る。
+ *
* @return 発言元Avatar
*/
public Avatar getAvatar(){
/**
* 公開発言番号を取得する。
- * 公開発言番号が割り振られてなければ0以下の値を返す。
+ *
+ * <p>公開発言番号が割り振られてなければ0以下の値を返す。
+ *
* @return 公開発言番号
*/
public int getTalkNo(){
/**
* 公開発言番号の有無を返す。
+ *
* @return 公開発言番号が割り当てられているならtrueを返す。
*/
public boolean hasTalkNo(){
/**
* メッセージIDを取得する。
+ *
* @return メッセージID
*/
public String getMessageID(){
/**
* メッセージIDからエポック秒(ms)に変換する。
+ *
* @return GMT 1970-01-01 00:00:00 からのエポック秒(ms)
*/
public long getTimeFromID(){
/**
* 発言時を取得する。
+ *
* @return 発言時
*/
public int getHour(){
/**
* 発言分を取得する。
+ *
* @return 発言分
*/
public int getMinute(){
/**
* 会話データを取得する。
+ *
* @return 会話データ
*/
public CharSequence getDialog(){
/**
* 発言種別ごとの発言回数を設定する。
+ *
+ * <p>システム生成の殺人予告では負の値を入れれば良い。
+ *
* @param count 発言回数
*/
public void setCount(int count){
/**
* この会話を識別するためのアンカー文字列を生成する。
- * 例えば「3d09:56」など。
+ *
+ * <p>例えば「3d09:56」など。
+ *
* @return アンカー文字列
*/
public String getAnchorNotation(){
/**
* この会話を識別するためのG国用アンカー文字列を発言番号から生成する。
- * 例えば「{@literal >>172}」など。
+ *
+ * <p>例えば「{@literal >>172}」など。
+ *
* @return アンカー文字列。発言番号がなければ空文字列。
*/
public String getAnchorNotation_G(){
}
/**
+ * 会話テキスト本文が殺人予告たりうるか判定する。
+ *
+ * <p>Period開始時の殺人予告の文面はシステムが生成する文書であり、
+ * 狼プレイヤーの投稿に由来しない。
+ *
+ * <p>「! 今日がお前の命日だ!」で終わる赤ログは
+ * 殺人予告の可能性がある。
+ *
+ * <p>
+ * {@link jp.sourceforge.jindolf.corelib.SysEventType.MURDERED}
+ * もしくは
+ * {@link jp.sourceforge.jindolf.corelib.SysEventType.NOMURDER}
+ * の前に該当する赤ログが出現すれば、それは殺人予告と断定して良い。
+ *
+ * @return 殺人予告のテキストの可能性があるならtrue
+ */
+ public boolean isMurderNotice(){
+ boolean isWolf;
+ isWolf = this.talkType == TalkType.WOLFONLY;
+ if( ! isWolf) return false;
+
+ boolean meinichida;
+ meinichida = StringUtils.isTerminated(getDialog(), MEINICHI_LAST);
+ if( ! meinichida) return false;
+
+ return true;
+ }
+
+ /**
* {@inheritDoc}
* 会話のString表現を返す。
* 実体参照やHTMLタグも含まれる。