From: Kazuhiro Fujieda Date: Sun, 2 Apr 2017 14:15:48 +0000 (+0900) Subject: 戦果の記録を表示する X-Git-Tag: v9.12~4 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=b2c73ddf86508c3eef5b36edbdfc4d8487a4cdc2;p=kancollesniffer%2FKancolleSniffer.git 戦果の記録を表示する --- diff --git a/KancolleSniffer.Test/LoggerTest.cs b/KancolleSniffer.Test/LoggerTest.cs index ef2d9b1..78a52a6 100644 --- a/KancolleSniffer.Test/LoggerTest.cs +++ b/KancolleSniffer.Test/LoggerTest.cs @@ -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)|" == result); } + + [TestMethod] + public void Achievement() + { + var logger = new Logger(null, null, null); + logger.EnableLog(LogType.Achivement); + var result = ""; + var dateEnum = new[] + { + new DateTime(2017, 3, 31, 21, 0, 0), + new DateTime(2017, 3, 31, 22, 0, 0), + new DateTime(2017, 4, 1, 4, 0, 0), + new DateTime(2017, 4, 1, 5, 0, 0), + new DateTime(2017, 4, 1, 6, 0, 0), + new DateTime(2017, 4, 2, 5, 0, 0), + new DateTime(2017, 4, 2, 6,0,0) + }.GetEnumerator(); + logger.SetWriter((path, s, h) => { result += s + "|"; }, () => + { + dateEnum.MoveNext(); + return (DateTime)dateEnum.Current; + }); + for (var i = 0; i < 6; i++) + logger.InspectBasic(JsonParser.Parse($"{{\"api_experience\": {i * 1000}}}")); + logger.InspectBattleResult(JsonParser.Parse("{\"api_get_exmap_rate\": \"100\"}")); + PAssert.That(() => + "2017-03-31 21:00:00,0,0|2017-03-31 21:00:00,0,0|2017-03-31 22:00:00,1000,0|"+ + "2017-04-01 06:00:00,4000,0|2017-04-02 05:00:00,5000,0|2017-04-02 06:00:00,5000,100|" + == result); + } } } \ No newline at end of file diff --git a/KancolleSniffer/Logger.cs b/KancolleSniffer/Logger.cs index 3202ca8..a829212 100644 --- a/KancolleSniffer/Logger.cs +++ b/KancolleSniffer/Logger.cs @@ -24,13 +24,14 @@ namespace KancolleSniffer public enum LogType { None = 0, - Mission = 1, - Battle = 2, - Material = 4, - CreateItem = 8, - CreateShip = 16, - RemodelSlot = 32, - All = 63, + Mission = 1 << 0, + Battle = 1 << 1, + Material = 1 << 2, + CreateItem = 1 << 3, + CreateShip = 1 << 4, + RemodelSlot = 1 << 5, + Achivement = 1 << 6, + All = (1 << 7) - 1 } public class Logger @@ -50,6 +51,10 @@ namespace KancolleSniffer private int[] _currentMaterial = new int[Enum.GetValues(typeof(Material)).Length]; private int _materialLogInterval = 10; private bool _start; + private int _lastExp = -1; + private DateTime _lastDate; + private DateTime _endOfMonth; + private DateTime _nextDate; public int MaterialLogInterval { @@ -134,6 +139,17 @@ namespace KancolleSniffer public void InspectBattleResult(dynamic result) { + if ((_logType & LogType.Achivement) != 0 && result.api_get_exmap_rate()) + { + var rate = result.api_get_exmap_rate is string + ? int.Parse(result.api_get_exmap_rate) + : (int)result.api_get_exmap_rate; + if (rate != 0) + { + _writer("戦果", _nowFunc().ToString(DateTimeFormat) + "," + _lastExp + "," + rate, + "日付,経験値,EO"); + } + } if ((_logType & LogType.Battle) == 0 || _map == null || _battle == null) { _map = _battle = null; @@ -333,6 +349,38 @@ namespace KancolleSniffer public void InspectBasic(dynamic json) { _basic = json; + if ((_logType & LogType.Achivement) == 0) + return; + var now = _nowFunc(); + var exp = (int)json.api_experience; + var isNewMonth = _endOfMonth == DateTime.MinValue || now.CompareTo(_endOfMonth) >= 0; + var isNewDate = _nextDate == DateTime.MinValue || now.CompareTo(_nextDate) >= 0; + if (isNewDate || isNewMonth) + { + if (_lastDate != DateTime.MinValue) + { + _writer("戦果", _lastDate.ToString(DateTimeFormat) + "," + _lastExp + ",0", "日付,経験値,EO"); + } + _writer("戦果", now.ToString(DateTimeFormat) + "," + exp + ",0", "日付,経験値,EO"); + if (isNewMonth) + { + _endOfMonth = new DateTime(now.Year, now.Month, DateTime.DaysInMonth(now.Year, now.Month), 22, 0, 0); + if (_endOfMonth.CompareTo(now) <= 0) + { + var days = _endOfMonth.Month == 12 + ? DateTime.DaysInMonth(_endOfMonth.Year + 1, 1) + : DateTime.DaysInMonth(_endOfMonth.Year, _endOfMonth.Month); + _endOfMonth = _endOfMonth.AddDays(days); + } + } + _nextDate = new DateTime(now.Year, now.Month, now.Day, 5, 0, 0); + if (now.Hour >= 5) + _nextDate = _nextDate.AddDays(1); + if (_nextDate.Day == 1) + _nextDate = _nextDate.AddDays(1); + } + _lastDate = now; + _lastExp = exp; } public void InspectCreateItem(string request, dynamic json) diff --git a/LogViewer/index.html b/LogViewer/index.html index 99dbe3b..1a60d64 100644 --- a/LogViewer/index.html +++ b/LogViewer/index.html @@ -10,7 +10,7 @@ - + @@ -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 () {
  • 改修
  • 資材
  • 資材グラフ
  • +
  • 戦果
  • 出撃統計
  • @@ -883,6 +963,13 @@ $(function () {
  • + + + + +
    日付戦果EO月毎
    + +