OSDN Git Service

merge onStage and playerList info.
authorOlyutorskii <olyutorskii@users.osdn.me>
Mon, 16 Mar 2020 06:57:11 +0000 (15:57 +0900)
committerOlyutorskii <olyutorskii@users.osdn.me>
Mon, 16 Mar 2020 06:57:11 +0000 (15:57 +0900)
src/main/java/jp/sfjp/jindolf/data/html/PeriodHandler.java
src/main/java/jp/sfjp/jindolf/summary/GameSummary.java

index 3049ba1..1880a51 100644 (file)
@@ -24,6 +24,7 @@ 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.Destiny;
 import jp.sourceforge.jindolf.corelib.EventFamily;
 import jp.sourceforge.jindolf.corelib.GameRole;
 import jp.sourceforge.jindolf.corelib.PeriodType;
@@ -700,15 +701,18 @@ class PeriodHandler extends HtmlAdapter {
         CharSequence account = this.converter
                                    .convert(content, loginRange);
 
-        Integer liveOrDead;
-        if(isLiving) liveOrDead = 1;
-        else         liveOrDead = 0;
+        Player player = new Player();
 
-        this.avatarList.add(who);
-        this.charseqList.add(anchor);
-        this.charseqList.add(account);
-        this.integerList.add(liveOrDead);
-        this.roleList.add(role);
+        player.setAvatar(who);
+        player.setRole(role);
+        player.setIdName(account.toString());
+        player.setUrlText(anchor.toString());
+        if(isLiving){
+            player.setObitDay(-1);
+            player.setDestiny(Destiny.ALIVE);
+        }
+
+        this.playerList.add(player);
 
         return;
     }
index f22f697..34a2068 100644 (file)
@@ -135,10 +135,10 @@ public class GameSummary{
      */
     private void summarize(){
         buildEventMap();
+        buildPlayerList();
 
         summarizeTime();
         summarizeWinner();
-        summarizePlayers();
 
         for(Period period : this.village.getPeriodList()){
             summarizePeriod(period);
@@ -159,15 +159,53 @@ public class GameSummary{
             this.eventMap.put(type, eventList);
         }
 
-        for(Period period : this.village.getPeriodList()){
-            for(Topic topic : period.getTopicList()){
-                if( ! (topic instanceof SysEvent) ) continue;
-                SysEvent event = (SysEvent) topic;
-                SysEventType type = event.getSysEventType();
-                List<SysEvent> eventList = this.eventMap.get(type);
-                eventList.add(event);
-            }
-        }
+        this.village.getPeriodList().stream()
+                .flatMap(period -> period.getTopicList().stream())
+                .filter(topic -> (topic instanceof SysEvent) )
+                .map(topic -> (SysEvent) topic)
+                .forEachOrdered(event -> {
+                    SysEventType type = event.getSysEventType();
+                    List<SysEvent> eventList = this.eventMap.get(type);
+                    eventList.add(event);
+                });
+
+        return;
+    }
+
+    /**
+     * playerListイベントとonStageイベントの内容を付き合わせ、
+     * Player一覧情報を完成させる。
+     *
+     * <p>プロローグで失踪したPlayerは対象外。
+     */
+    private void buildPlayerList(){
+        List<SysEvent> playerListEventList =
+                this.eventMap.get(SysEventType.PLAYERLIST);
+        assert playerListEventList.size() == 1;
+        SysEvent playerListEvent = playerListEventList.get(0);
+
+        List<Player> players = playerListEvent.getPlayerList();
+        players.forEach( player -> {
+            Avatar avatar = player.getAvatar();
+            this.playerMap.put(avatar, player);
+        });
+
+        List<SysEvent> onStageEventList =
+                this.eventMap.get(SysEventType.ONSTAGE);
+        onStageEventList.stream()
+                .map(onStageEvent -> onStageEvent.getPlayerList().get(0))
+                .forEachOrdered(onStagePlayer -> {
+                    Avatar avatar = onStagePlayer.getAvatar();
+                    Player listPlayer = this.playerMap.get(avatar);
+                    if(listPlayer != null){
+                        int entryNo = onStagePlayer.getEntryNo();
+                        listPlayer.setEntryNo(entryNo);
+                        this.playerList.add(listPlayer);
+                    }else{
+                        assert true;
+                        // プレイヤー失踪?
+                    }
+                });
 
         return;
     }
@@ -199,56 +237,6 @@ public class GameSummary{
     }
 
     /**
-     * 参加者集計。
-     */
-    private void summarizePlayers(){
-        List<SysEvent> eventList;
-
-        List<Avatar>       avatarList;
-        List<GameRole>     roleList;
-        List<Integer>      integerList;
-        List<CharSequence> textList;
-
-        eventList = this.eventMap.get(SysEventType.ONSTAGE);
-        for(SysEvent event : eventList){
-            Player player = event.getPlayerList().get(0);
-            Avatar onstageAvatar = player.getAvatar();
-            Player onstagePlayer = registPlayer(onstageAvatar);
-            onstagePlayer.setEntryNo(player.getEntryNo());
-        }
-
-        eventList = this.eventMap.get(SysEventType.PLAYERLIST);
-        assert eventList.size() == 1;
-        SysEvent event = eventList.get(0);
-
-        avatarList  = event.getAvatarList();
-        roleList    = event.getRoleList();
-        integerList = event.getIntegerList();
-        textList    = event.getCharSequenceList();
-        int avatarNum = avatarList.size();
-        for(int idx = 0; idx < avatarNum; idx++){
-            Avatar avatar = avatarList.get(idx);
-            GameRole role = roleList.get(idx);
-            CharSequence urlText = textList.get(idx * 2);
-            CharSequence idName  = textList.get(idx * 2 + 1);
-            int liveOrDead = integerList.get(idx);
-
-            Player player = registPlayer(avatar);
-            player.setRole(role);
-            player.setUrlText(urlText.toString());
-            player.setIdName(idName.toString());
-            if(liveOrDead != 0){        // 生存
-                player.setObitDay(-1);
-                player.setDestiny(Destiny.ALIVE);
-            }
-
-            this.playerList.add(player);
-        }
-
-        return;
-    }
-
-    /**
      * Periodのサマライズ。
      * @param period Period
      */