OSDN Git Service

戦果の記録を表示する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 2 Apr 2017 14:15:48 +0000 (23:15 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 2 Apr 2017 14:18:13 +0000 (23:18 +0900)
KancolleSniffer.Test/LoggerTest.cs
KancolleSniffer/Logger.cs
LogViewer/index.html

index ef2d9b1..78a52a6 100644 (file)
@@ -334,5 +334,35 @@ namespace KancolleSniffer.Test
                                "2015-01-01 00:00:00,91式高射装置,10,○,○,10cm連装高角砲,2,0,0,60,40,9,7,明石改(50),摩耶改(98)|"\r
                                == result);\r
         }\r
+\r
+        [TestMethod]\r
+        public void Achievement()\r
+        {\r
+            var logger = new Logger(null, null, null);\r
+            logger.EnableLog(LogType.Achivement);\r
+            var result = "";\r
+            var dateEnum = new[]\r
+            {\r
+                new DateTime(2017, 3, 31, 21, 0, 0),\r
+                new DateTime(2017, 3, 31, 22, 0, 0),\r
+                new DateTime(2017, 4, 1, 4, 0, 0),\r
+                new DateTime(2017, 4, 1, 5, 0, 0),\r
+                new DateTime(2017, 4, 1, 6, 0, 0),\r
+                new DateTime(2017, 4, 2, 5, 0, 0),\r
+                new DateTime(2017, 4, 2, 6,0,0)\r
+            }.GetEnumerator();\r
+            logger.SetWriter((path, s, h) => { result += s + "|"; }, () =>\r
+            {\r
+                dateEnum.MoveNext();\r
+                return (DateTime)dateEnum.Current;\r
+            });\r
+            for (var i = 0; i < 6; i++)\r
+                logger.InspectBasic(JsonParser.Parse($"{{\"api_experience\": {i * 1000}}}"));\r
+            logger.InspectBattleResult(JsonParser.Parse("{\"api_get_exmap_rate\": \"100\"}"));\r
+            PAssert.That(() =>\r
+                "2017-03-31 21:00:00,0,0|2017-03-31 21:00:00,0,0|2017-03-31 22:00:00,1000,0|"+\r
+                "2017-04-01 06:00:00,4000,0|2017-04-02 05:00:00,5000,0|2017-04-02 06:00:00,5000,100|"\r
+                == result);\r
+        }\r
     }\r
 }
\ No newline at end of file
index 3202ca8..a829212 100644 (file)
@@ -24,13 +24,14 @@ namespace KancolleSniffer
     public enum LogType\r
     {\r
         None = 0,\r
-        Mission = 1,\r
-        Battle = 2,\r
-        Material = 4,\r
-        CreateItem = 8,\r
-        CreateShip = 16,\r
-        RemodelSlot = 32,\r
-        All = 63,\r
+        Mission = 1 << 0,\r
+        Battle = 1 << 1,\r
+        Material = 1 << 2,\r
+        CreateItem = 1 << 3,\r
+        CreateShip = 1 << 4,\r
+        RemodelSlot = 1 << 5,\r
+        Achivement = 1 << 6,\r
+        All = (1 << 7) - 1\r
     }\r
 \r
     public class Logger\r
@@ -50,6 +51,10 @@ namespace KancolleSniffer
         private int[] _currentMaterial = new int[Enum.GetValues(typeof(Material)).Length];\r
         private int _materialLogInterval = 10;\r
         private bool _start;\r
+        private int _lastExp = -1;\r
+        private DateTime _lastDate;\r
+        private DateTime _endOfMonth;\r
+        private DateTime _nextDate;\r
 \r
         public int MaterialLogInterval\r
         {\r
@@ -134,6 +139,17 @@ namespace KancolleSniffer
 \r
         public void InspectBattleResult(dynamic result)\r
         {\r
+            if ((_logType & LogType.Achivement) != 0 && result.api_get_exmap_rate())\r
+            {\r
+                var rate = result.api_get_exmap_rate is string\r
+                    ? int.Parse(result.api_get_exmap_rate)\r
+                    : (int)result.api_get_exmap_rate;\r
+                if (rate != 0)\r
+                {\r
+                    _writer("戦果", _nowFunc().ToString(DateTimeFormat) + "," + _lastExp + "," + rate,\r
+                        "日付,経験値,EO");\r
+                }\r
+            }\r
             if ((_logType & LogType.Battle) == 0 || _map == null || _battle == null)\r
             {\r
                 _map = _battle = null;\r
@@ -333,6 +349,38 @@ namespace KancolleSniffer
         public void InspectBasic(dynamic json)\r
         {\r
             _basic = json;\r
+            if ((_logType & LogType.Achivement) == 0)\r
+                return;\r
+            var now = _nowFunc();\r
+            var exp = (int)json.api_experience;\r
+            var isNewMonth = _endOfMonth == DateTime.MinValue || now.CompareTo(_endOfMonth) >= 0;\r
+            var isNewDate = _nextDate == DateTime.MinValue || now.CompareTo(_nextDate) >= 0;\r
+            if (isNewDate || isNewMonth)\r
+            {\r
+                if (_lastDate != DateTime.MinValue)\r
+                {\r
+                    _writer("戦果", _lastDate.ToString(DateTimeFormat) + "," + _lastExp + ",0", "日付,経験値,EO");\r
+                }\r
+                _writer("戦果", now.ToString(DateTimeFormat) + "," + exp + ",0", "日付,経験値,EO");\r
+                if (isNewMonth)\r
+                {\r
+                    _endOfMonth = new DateTime(now.Year, now.Month, DateTime.DaysInMonth(now.Year, now.Month), 22, 0, 0);\r
+                    if (_endOfMonth.CompareTo(now) <= 0)\r
+                    {\r
+                        var days = _endOfMonth.Month == 12\r
+                            ? DateTime.DaysInMonth(_endOfMonth.Year + 1, 1)\r
+                            : DateTime.DaysInMonth(_endOfMonth.Year, _endOfMonth.Month);\r
+                        _endOfMonth = _endOfMonth.AddDays(days);\r
+                    }\r
+                }\r
+                _nextDate = new DateTime(now.Year, now.Month, now.Day, 5, 0, 0);\r
+                if (now.Hour >= 5)\r
+                    _nextDate = _nextDate.AddDays(1);\r
+                if (_nextDate.Day == 1)\r
+                    _nextDate = _nextDate.AddDays(1);\r
+            }\r
+            _lastDate = now;\r
+            _lastExp = exp;\r
         }\r
 \r
         public void InspectCreateItem(string request, dynamic json)\r
index 99dbe3b..1a60d64 100644 (file)
@@ -10,7 +10,7 @@
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.min.js"></script>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.11/c3.min.js"></script>
 <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.11/c3.min.css">
-<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.min.js"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
 <link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
 <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/i18n/datepicker-ja.min.js"></script>
@@ -623,6 +623,82 @@ function initSortieStatTables() {
     }
 }
 
+function showAchivementTable(data) {
+    var expPerAch = 1428.0;
+    if (!data) {
+        $('#loading').show();
+        $.ajax({
+            url: "./戦果.json",
+            success: function (data) {
+                showAchivementTable(data.data);
+            },
+            dataType: 'json',
+            cache: false
+        });
+        return;
+    }
+    var result = [];
+    var dayEo = 0;
+    var endOfMonth = null;
+    var monthExp = 0;
+    var monthEo = 0;
+    var prevExp = null;
+    var lastExp = -1;
+    var nextDate = null;
+    for (var i = 0; i < data.length; i++) {
+        var row = data[i];
+        var date = parseDate(row[0]);
+        var exp = row[1] - 0;
+        var eo = row[2] - 0;
+        var isNewMonth = endOfMonth == null || date.isSameOrAfter(endOfMonth);
+        var isNewDate = nextDate == null || date.isSameOrAfter(nextDate);
+        if (isNewDate || isNewMonth) {
+            if (nextDate != null) {
+                result.push([
+                    (isNewDate ? nextDate.subtract(1, 'days') : endOfMonth).format("YYYY-MM-DD"),
+                    new Number((lastExp - prevExp) / expPerAch).toFixed(1), dayEo,
+                    new Number((lastExp - monthExp) / expPerAch + monthEo).toFixed(1)
+                ]);
+            }
+            prevExp = lastExp === -1 ? exp : lastExp;
+            if (isNewMonth) {
+                endOfMonth = date.clone().endOf('month').hour(22).startOf('hour');
+                if (endOfMonth.isSameOrBefore(date))
+                    endOfMonth.add(1, 'month').endOf('month');
+                monthExp = lastExp === -1 ? exp : lastExp;
+                monthEo = 0;
+            }
+            dayEo = 0;
+            nextDate = date.clone().hour(5).startOf('hour');
+            if (date.hour() >= 5)
+                nextDate.add(1, 'days');
+            if (nextDate.date() === 1)
+                nextDate.add(1, 'days');
+        }
+        dayEo += eo;
+        monthEo += eo;
+        lastExp = exp;
+    }
+    var dt = $('#achivement_table').DataTable();
+    dt.clear();
+    dt.rows.add(result).draw();
+    $('#loading').hide();
+}
+
+function initAchievementTable() {
+    $("#achivement_table").dataTable({
+        destroy: true,
+        deferRener: true,
+        stateSave: true,
+        order: [[0, "desc"]],
+        pageLength: 50,
+        lengthMenu: [[50, 100, 200, -1], [50, 100, 200, "All"]],
+        drawCallback: function () {
+            $('#loading').hide();
+        }
+    });
+}
+
 function selectTopTab(i) {
     var chart = tables;
     showChart = false;
@@ -633,6 +709,8 @@ function selectTopTab(i) {
         showChart = true;
         drawChart();
     } else if (i === chart + 1) {
+        showAchivementTable();
+    } else if (i === chart + 2) {
         setSortieStat();
     }
     if (i < tables)
@@ -772,6 +850,7 @@ $(function () {
     initSortieStatDatePicker();
     $('table').addClass('display compact cell-border');
     initTables();
+    initAchievementTable();
     initSortieStatTables();
     $('#range_sortie_stat li').removeClass('select');
     $('#range_sortie_stat li').eq(sortieStatRange).addClass('select');
@@ -792,6 +871,7 @@ $(function () {
 <li>改修</li>
 <li>資材</li>
 <li>資材グラフ</li>
+<li>戦果</li>
 <li>出撃統計</li>
 </ul>
 
@@ -883,6 +963,13 @@ $(function () {
 <div id="chart" style="clear: both; margin: 1em;"></div>
 
 <li class="hide">
+<table id="achivement_table">
+<thead>
+<tr><th>日付</th><th>戦果</th><th>EO</th><th>月毎</th></tr>
+</thead>
+</table>
+
+<li class="hide">
 <ul class="tab tab1" id="range_sortie_stat" style="float: left; margin-right: 0.2em">
 <li>直近</li>
 <li>期間指定</li>