"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
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
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
\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
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
<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>
}
}
+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;
showChart = true;
drawChart();
} else if (i === chart + 1) {
+ showAchivementTable();
+ } else if (i === chart + 2) {
setSortieStat();
}
if (i < tables)
initSortieStatDatePicker();
$('table').addClass('display compact cell-border');
initTables();
+ initAchievementTable();
initSortieStatTables();
$('#range_sortie_stat li').removeClass('select');
$('#range_sortie_stat li').eq(sortieStatRange).addClass('select');
<li>改修</li>
<li>資材</li>
<li>資材グラフ</li>
+<li>戦果</li>
<li>出撃統計</li>
</ul>
<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>