}\r
\r
/// <summary>\r
+ /// 2-5をクリアしたときの特別戦果を反映する\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void ExMapBattleResult()\r
+ {\r
+ var sniffer0 = new Sniffer();\r
+ sniffer0.ExMap.ClearClearStatus();\r
+ SniffLogFile(sniffer0, "eo_001");\r
+ PAssert.That(() => sniffer0.ExMap.Achievement == 100, "ほかのマップの情報なし");\r
+ var sniffer1 = new Sniffer();\r
+ SniffLogFile(sniffer1, "eo_001");\r
+ // すでに3-5をクリアしているので合計で250\r
+ PAssert.That(() => sniffer1.ExMap.Achievement == 250, "ほかのマップの情報あり");\r
+ }\r
+\r
+ /// <summary>\r
+ /// 1-6をクリアしたときの特別戦果を反映する\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void ExMapMapNext()\r
+ {\r
+ var sniffer0 = new Sniffer();\r
+ sniffer0.ExMap.ClearClearStatus();\r
+ SniffLogFile(sniffer0, "eo_002");\r
+ PAssert.That(() => sniffer0.ExMap.Achievement == 75, "ほかのマップの情報なし");\r
+ var sniffer1 = new Sniffer();\r
+ SniffLogFile(sniffer1, "eo_002");\r
+ // 5-5以外クリアしているので合計で400\r
+ PAssert.That(()=> sniffer1.ExMap.Achievement == 400, "ほかのマップの情報あり");\r
+ }\r
+\r
+ /// <summary>\r
/// 編成で空き番号を使ったローテートを正しく反映する\r
/// </summary>\r
[TestMethod]\r
\r
namespace KancolleSniffer\r
{\r
- public class Achievement\r
+ public class Achievement : IHaveState\r
{\r
private int _current;\r
\r
\r
namespace KancolleSniffer\r
{\r
- public class ConditionTimer\r
+ public class ConditionTimer : IHaveState\r
{\r
private readonly ShipInfo _shipInfo;\r
private const int Interval = 180;\r
--- /dev/null
+// Copyright (C) 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+//\r
+// This program is part of KancolleSniffer.\r
+//\r
+// KancolleSniffer is free software: you can redistribute it and/or modify\r
+// it under the terms of the GNU General Public License as published by\r
+// the Free Software Foundation, either version 3 of the License, or\r
+// (at your option) any later version.\r
+//\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+// GNU General Public License for more details.\r
+//\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, see <http://www.gnu.org/licenses/>.\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+\r
+namespace KancolleSniffer\r
+{\r
+ public class ExMapInfo : IHaveState\r
+ {\r
+ public class ClearStatus\r
+ {\r
+ public int Map { get; set; }\r
+ public bool Cleared { get; set; }\r
+ public int Rate { get; set; }\r
+ }\r
+\r
+ private readonly Dictionary<int, ClearStatus> _clearStatus =\r
+ new Dictionary<int, ClearStatus>\r
+ {\r
+ {15, new ClearStatus {Map = 15, Cleared = false, Rate = 75}},\r
+ {16, new ClearStatus {Map = 16, Cleared = false, Rate = 75}},\r
+ {25, new ClearStatus {Map = 25, Cleared = false, Rate = 100}},\r
+ {35, new ClearStatus {Map = 35, Cleared = false, Rate = 150}},\r
+ {45, new ClearStatus {Map = 45, Cleared = false, Rate = 180}},\r
+ {55, new ClearStatus {Map = 55, Cleared = false, Rate = 200}}\r
+ };\r
+\r
+ private DateTime _lastReset;\r
+\r
+ private int _currentMap;\r
+\r
+ public bool NeedSave { get; private set; }\r
+\r
+ public void InspectMapInfo(dynamic json)\r
+ {\r
+ foreach (var entry in json)\r
+ {\r
+ var map = (int)entry.api_id;\r
+ if (map % 10 <= 4)\r
+ continue;\r
+ ClearStatus stat;\r
+ if (!_clearStatus.TryGetValue(map, out stat))\r
+ _clearStatus.Add(map, stat = new ClearStatus { Map = map});\r
+ var prev = stat.Cleared;\r
+ stat.Cleared = (int)entry.api_cleared == 1;\r
+ if (prev != stat.Cleared)\r
+ NeedSave = true;\r
+ }\r
+ }\r
+\r
+ public void InspectMapStart(dynamic json)\r
+ {\r
+ InspectMapNext(json);\r
+ }\r
+\r
+ public void InspectMapNext(dynamic json)\r
+ {\r
+ _currentMap = (int)json.api_maparea_id * 10 + (int)json.api_mapinfo_no;\r
+ if (!json.api_get_eo_rate() || json.api_get_eo_rate == 0)\r
+ return;\r
+ ClearStatus stat;\r
+ if (!_clearStatus.TryGetValue(_currentMap, out stat))\r
+ _clearStatus.Add(_currentMap, stat = new ClearStatus{Map = _currentMap});\r
+ stat.Cleared = true;\r
+ stat.Rate = (int)json.api_get_eo_rate;\r
+ NeedSave = true;\r
+ }\r
+\r
+ public void InspectBattleResult(dynamic json)\r
+ {\r
+ if (!json.api_get_exmap_rate())\r
+ return;\r
+ var rate = json.api_get_exmap_rate is string\r
+ ? int.Parse(json.api_get_exmap_rate)\r
+ : (int)json.api_get_exmap_rate;\r
+ if (rate == 0)\r
+ return;\r
+ ClearStatus stat;\r
+ if (!_clearStatus.TryGetValue(_currentMap, out stat))\r
+ _clearStatus.Add(_currentMap, stat = new ClearStatus{Map = _currentMap});\r
+ stat.Cleared = true;\r
+ stat.Rate = rate;\r
+ NeedSave = true;\r
+ }\r
+\r
+ public int Achievement\r
+ {\r
+ get { return _clearStatus.Values.Where(s => s.Cleared).Sum(s => s.Rate); }\r
+ }\r
+\r
+ public void ResetIfNeeded()\r
+ {\r
+ var now = DateTime.Now;\r
+ if (_lastReset.Month == now.Month)\r
+ return;\r
+ _lastReset = now;\r
+ foreach (var e in _clearStatus.Values)\r
+ e.Cleared = false;\r
+ }\r
+\r
+ // テスト用\r
+ public void ClearClearStatus()\r
+ {\r
+ _clearStatus.Clear();\r
+ }\r
+\r
+ public void SaveState(Status status)\r
+ {\r
+ NeedSave = false;\r
+ status.ExMapState = new ExMapState\r
+ {\r
+ ClearStatusList = _clearStatus.Values.ToArray(),\r
+ LastReset = _lastReset\r
+ };\r
+ }\r
+\r
+ public void LoadState(Status status)\r
+ {\r
+ if (status.ExMapState == null)\r
+ return;\r
+ _lastReset = status.ExMapState.LastReset;\r
+ foreach (var s in status.ExMapState.ClearStatusList)\r
+ _clearStatus[s.Map] = s;\r
+ }\r
+\r
+ public class ExMapState\r
+ {\r
+ public ClearStatus[] ClearStatusList { get; set; }\r
+ public DateTime LastReset { get; set; }\r
+ }\r
+ }\r
+}
\ No newline at end of file
}\r
}\r
\r
- public class ItemInfo\r
+ public class ItemInfo : IHaveState\r
{\r
private int _nowShips, _nowEquips;\r
private readonly Dictionary<int, ItemSpec> _itemSpecs = new Dictionary<int, ItemSpec>();\r
status.MatreialHistory = MaterialHistory;\r
}\r
\r
- public void LoadSate(Status status)\r
+ public void LoadState(Status status)\r
{\r
if (status.MatreialHistory != null)\r
status.MatreialHistory.CopyTo(MaterialHistory, 0);\r
<Compile Include="EquipPanel.cs">\r
<SubType>Component</SubType>\r
</Compile>\r
+ <Compile Include="ExMapInfo.cs" />\r
<Compile Include="ItemTreeView.cs">\r
<SubType>Component</SubType>\r
</Compile>\r
\r
// この時点でAutoScaleDimensions == CurrentAutoScaleDimensionsなので、\r
// MainForm.Designer.csのAutoScaleDimensionsの6f,12fを使う。\r
- ShipLabel.ScaleFactor = new SizeF(CurrentAutoScaleDimensions.Width / 6f, CurrentAutoScaleDimensions.Height / 12f);\r
+ ShipLabel.ScaleFactor = new SizeF(CurrentAutoScaleDimensions.Width / 6f,\r
+ CurrentAutoScaleDimensions.Height / 12f);\r
\r
SetupFleetClick();\r
_shipLabels = new ShipLabels();\r
if (ac >= 10000)\r
ac = 9999;\r
labelAchievement.Text = ac >= 1000 ? ((int)ac).ToString("D") : ac.ToString("F1");\r
- toolTipAchievement.SetToolTip(labelAchievement, "今月 " + _sniffer.Achievement.ValueOfMonth.ToString("F1"));\r
+ toolTipAchievement.SetToolTip(labelAchievement,\r
+ "今月 " + _sniffer.Achievement.ValueOfMonth.ToString("F1") + "\n" +\r
+ "EO " + _sniffer.ExMap.Achievement);\r
UpdateMaterialHistry();\r
if (_shipListForm.Visible)\r
_shipListForm.UpdateList();\r
return;\r
panelBattleInfo.BringToFront();\r
var battle = _sniffer.Battle;\r
- var color = new[] { DefaultForeColor, DefaultForeColor, Color.Blue, Color.Green, Color.Orange, Color.Red };\r
+ var color = new[] {DefaultForeColor, DefaultForeColor, Color.Blue, Color.Green, Color.Orange, Color.Red};\r
labelFormation.Text = battle.Formation;\r
labelEnemyFighterPower.Text = battle.EnemyFighterPower.ToString("D");\r
labelFighterPower.ForeColor = color[battle.AirControlLevel + 1];\r
\r
private void ShowResultRank()\r
{\r
- var result = new[] { "完全S", "勝利S", "勝利A", "勝利B", "敗北C", "敗北D", "敗北E" };\r
+ var result = new[] {"完全S", "勝利S", "勝利A", "勝利B", "敗北C", "敗北D", "敗北E"};\r
labelResultRank.Text = result[(int)_sniffer.Battle.ResultRank];\r
}\r
\r
{\r
var category = new[]\r
{\r
- labelQuestColor1, labelQuestColor2, labelQuestColor3, labelQuestColor4, labelQuestColor5, labelQuestColor6\r
+ labelQuestColor1, labelQuestColor2, labelQuestColor3, labelQuestColor4, labelQuestColor5,\r
+ labelQuestColor6\r
};\r
var name = new[] {labelQuest1, labelQuest2, labelQuest3, labelQuest4, labelQuest5, labelQuest6};\r
- var progress = new[] {labelProgress1, labelProgress2, labelProgress3, labelProgress4, labelProgress5, labelProgress6};\r
+ var progress = new[]\r
+ {labelProgress1, labelProgress2, labelProgress3, labelProgress4, labelProgress5, labelProgress6};\r
var color = new[]\r
{\r
Color.FromArgb(60, 141, 76), Color.FromArgb(232, 57, 41), Color.FromArgb(136, 204, 120),\r
// along with this program; if not, see <http://www.gnu.org/licenses/>.\r
\r
using System;\r
+using System.Collections.Generic;\r
using System.Linq;\r
\r
namespace KancolleSniffer\r
private readonly Achievement _achievement = new Achievement();\r
private readonly BattleInfo _battleInfo;\r
private readonly Logger _logger;\r
+ private readonly ExMapInfo _exMapInfo = new ExMapInfo();\r
private readonly Status _status = new Status();\r
private bool _saveState;\r
+ private readonly List<IHaveState> _haveState;\r
\r
[Flags]\r
public enum Update\r
_akashiTimer = new AkashiTimer(_shipInfo, _itemInfo, _dockInfo);\r
_battleInfo = new BattleInfo(_shipMaster, _shipInfo, _itemInfo);\r
_logger = new Logger(_shipMaster, _shipInfo, _itemInfo);\r
+ _haveState = new List<IHaveState> {_achievement, _itemInfo, _conditionTimer, _exMapInfo};\r
}\r
\r
private void SaveState()\r
{\r
if (!_saveState)\r
return;\r
- if (!_achievement.NeedSave && !_itemInfo.NeedSave && !_conditionTimer.NeedSave)\r
+ if (!_haveState.Any(x=>x.NeedSave))\r
return;\r
- _achievement.SaveState(_status);\r
- _itemInfo.SaveState(_status);\r
- _conditionTimer.SaveState(_status);\r
+ foreach (var x in _haveState)\r
+ x.SaveState(_status);\r
_status.Save();\r
}\r
\r
public void LoadState()\r
{\r
_status.Load();\r
- _achievement.LoadState(_status);\r
- _itemInfo.LoadSate(_status);\r
- _conditionTimer.LoadState(_status);\r
+ foreach (var x in _haveState)\r
+ x.LoadState(_status);\r
_saveState = true;\r
}\r
\r
_shipMaster.Inspect(data);\r
_missionInfo.InspectMaster(data.api_mst_mission);\r
_itemInfo.InspectMaster(data);\r
+ _exMapInfo.ResetIfNeeded();\r
return Update.Start;\r
}\r
if (!_start)\r
if (url.EndsWith("api_req_sortie/battleresult"))\r
{\r
_battleInfo.InspectBattleResult(json);\r
+ _exMapInfo.InspectBattleResult(data);\r
_logger.InspectBattleResult(data);\r
return Update.Ship;\r
}\r
{\r
_shipInfo.StartSortie(request);\r
_conditionTimer.InvalidateCond();\r
+ _exMapInfo.InspectMapStart(data);\r
_logger.InspectMapStart(data);\r
return Update.Timer;\r
}\r
if (url.EndsWith("api_req_map/next"))\r
{\r
+ _exMapInfo.InspectMapNext(data);\r
_logger.InspectMapNext(data);\r
return Update.None;\r
}\r
_logger.InspectMissionResult(data);\r
return Update.Item;\r
}\r
+ if (url.EndsWith("api_get_member/mapinfo"))\r
+ {\r
+ _exMapInfo.InspectMapInfo(data);\r
+ return Update.None;\r
+ }\r
return Update.None;\r
}\r
\r
get { return _battleInfo; }\r
}\r
\r
+ public ExMapInfo ExMap\r
+ {\r
+ get { return _exMapInfo; }\r
+ }\r
+\r
public void SetLogWriter(Action<string, string, string> writer, Func<DateTime> nowFunc)\r
{\r
_logger.SetWriter(writer, nowFunc);\r
\r
namespace KancolleSniffer\r
{\r
+ public interface IHaveState\r
+ {\r
+ bool NeedSave { get; }\r
+ void SaveState(Status status);\r
+ void LoadState(Status status);\r
+ }\r
+\r
public class Status\r
{\r
// ReSharper disable once AssignNullToNotNullAttribute\r
public Achievement Achievement { get; set; }\r
public MaterialCount[] MatreialHistory { get; set; }\r
public double CondRegenTime { get; set; }\r
+ public ExMapInfo.ExMapState ExMapState { get; set; }\r
\r
public Status()\r
{\r