</ItemGroup>\r
<ItemGroup>\r
<Compile Include="Log\BattleLogger.cs" />\r
+ <Compile Include="Model\AirBattleResult.cs" />\r
<Compile Include="Model\AirCorpsFighterPower.cs" />\r
<Compile Include="Model\QuestCounter.cs" />\r
<Compile Include="Model\QuestCountList.cs" />\r
--- /dev/null
+// Copyright (C) 2019 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+\r
+namespace KancolleSniffer.Model\r
+{\r
+ public class AirBattleResult\r
+ {\r
+ public List<AirBattleRecord> Result = new List<AirBattleRecord>();\r
+\r
+ private readonly Func<int, string> _getShipName;\r
+ private readonly Func<int[], string[]> _getItemNames;\r
+\r
+ public AirBattleResult(Func<int, string> getShipName, Func<int[], string[]> getItemNames)\r
+ {\r
+ _getShipName = getShipName;\r
+ _getItemNames = getItemNames;\r
+ }\r
+\r
+ public class AirBattleRecord\r
+ {\r
+ public string PhaseName { get; set; }\r
+ public int AirControlLevel { get; set; }\r
+ public StageResult Stage1 { get; set; }\r
+ public StageResult Stage2 { get; set; }\r
+ public AirFireResult AirFire { get; set; }\r
+ }\r
+\r
+ public void Clear()\r
+ {\r
+ Result.Clear();\r
+ }\r
+\r
+ public class StageResult\r
+ {\r
+ public int FriendCount { get; set; }\r
+ public int FriendLost { get; set; }\r
+ public int EnemyCount { get; set; }\r
+ public int EnemyLost { get; set; }\r
+ }\r
+\r
+ public class AirFireResult\r
+ {\r
+ public string ShipName { get; set; }\r
+ public int Kind { get; set; }\r
+ public string[] Items { get; set; }\r
+ }\r
+\r
+ public void Add(dynamic json, string phaseName)\r
+ {\r
+ var stage1 = json.api_stage1;\r
+ if (stage1 == null || (stage1.api_f_count == 0 && stage1.api_e_count == 0))\r
+ return;\r
+ var result = new AirBattleRecord\r
+ {\r
+ PhaseName = phaseName,\r
+ AirControlLevel = json.api_stage1.api_disp_seiku() ? (int)json.api_stage1.api_disp_seiku : 0,\r
+ Stage1 = CreateStageResult(json.api_stage1),\r
+ Stage2 = json.api_stage2 == null\r
+ ? new StageResult()\r
+ : CreateStageResult(json.api_stage2),\r
+ AirFire = CreateAirFireResult(json)\r
+ };\r
+ Result.Add(result);\r
+ }\r
+\r
+ private StageResult CreateStageResult(dynamic stage)\r
+ {\r
+ return new StageResult\r
+ {\r
+ FriendCount = (int)stage.api_f_count,\r
+ FriendLost = (int)stage.api_f_lostcount,\r
+ EnemyCount = (int)stage.api_e_count,\r
+ EnemyLost = (int)stage.api_e_lostcount\r
+ };\r
+ }\r
+\r
+ private AirFireResult CreateAirFireResult(dynamic json)\r
+ {\r
+ if (json.api_stage2 == null || !json.api_stage2.api_air_fire())\r
+ return null;\r
+ var airFire = json.api_stage2.api_air_fire;\r
+ var idx = (int)airFire.api_idx;\r
+ return new AirFireResult\r
+ {\r
+ ShipName = _getShipName(idx),\r
+ Kind = (int)airFire.api_kind,\r
+ Items = _getItemNames((int[])airFire.api_use_items)\r
+ };\r
+ }\r
+ }\r
+}
\ No newline at end of file
using System.Collections.Generic;\r
using System.Linq;\r
using KancolleSniffer.Util;\r
-using KancolleSniffer.View;\r
using static System.Math;\r
\r
namespace KancolleSniffer.Model\r
public RankPair DisplayedResultRank { get; } = new RankPair();\r
public BattleResult Result { get; set; }\r
public bool EnemyIsCombined => _enemyGuard.Length > 0;\r
- public List<AirBattleResult> AirBattleResults { get; } = new List<AirBattleResult>();\r
+ public AirBattleResult AirBattleResult;\r
public int SupportType { get; private set; }\r
\r
public class RankPair\r
_shipInfo = shipInfo;\r
_itemInfo = itemInfo;\r
_airBase = airBase;\r
+ AirBattleResult = new AirBattleResult(GetAirFireShipName, GetItemNames);\r
+ }\r
+\r
+ private string GetAirFireShipName(int idx)\r
+ {\r
+ return idx < _friend.Length ? _friend[idx].Name : _guard[idx - 6].Name;\r
+ }\r
+\r
+ private string[] GetItemNames(int[] ids)\r
+ {\r
+ return ids.Select(id => _itemInfo.GetSpecByItemId(id).Name).ToArray();\r
}\r
\r
public void Port()\r
SetResult();\r
}\r
\r
-\r
private void SetFormation(dynamic json)\r
{\r
if (json.api_formation())\r
SetupEnemyDamageRecord(json, false);\r
SetEnemyFighterPower();\r
BattleState = BattleState.Day;\r
- AddAirBattleResult(json.api_air_base_attack, "空襲");\r
+ AirBattleResult.Add(json.api_air_base_attack, "空襲");\r
CalcKoukuDamage(json.api_air_base_attack);\r
SetAirRaidResultRank(json);\r
SetResult();\r
\r
private void CalcDamage(dynamic json)\r
{\r
- AirBattleResults.Clear();\r
+ AirBattleResult.Clear();\r
foreach (KeyValuePair<string, dynamic> kv in json)\r
{\r
if (kv.Value == null)\r
switch (kv.Key)\r
{\r
case "api_air_base_injection":\r
- AddAirBattleResult(kv.Value, "AB噴式");\r
+ AirBattleResult.Add(kv.Value, "AB噴式");\r
CalcKoukuDamage(kv.Value);\r
break;\r
case "api_injection_kouku":\r
- AddAirBattleResult(kv.Value, "噴式");\r
+ AirBattleResult.Add(kv.Value, "噴式");\r
CalcKoukuDamage(kv.Value);\r
break;\r
case "api_air_base_attack":\r
CalcDamageByTurn(kv.Value);\r
break;\r
case "api_kouku":\r
- AddAirBattleResult(kv.Value, "航空戦");\r
+ AirBattleResult.Add(kv.Value, "航空戦");\r
CalcKoukuDamage(kv.Value);\r
break;\r
case "api_kouku2":\r
- AddAirBattleResult(kv.Value, "航空戦2");\r
+ AirBattleResult.Add(kv.Value, "航空戦2");\r
CalcKoukuDamage(kv.Value);\r
break;\r
case "api_support_info":\r
var i = 1;\r
foreach (var entry in json)\r
{\r
- AddAirBattleResult(entry, "基地" + i++);\r
+ AirBattleResult.Add(entry, "基地" + i++);\r
CalcKoukuDamage(entry);\r
}\r
}\r
CalcDamageByTurn(json.api_hougeki, true);\r
}\r
\r
- private void AddAirBattleResult(dynamic json, string phaseName)\r
- {\r
- var stage1 = json.api_stage1;\r
- if (stage1 == null || (stage1.api_f_count == 0 && stage1.api_e_count == 0))\r
- return;\r
- var result = new AirBattleResult\r
- {\r
- PhaseName = phaseName,\r
- AirControlLevel = json.api_stage1.api_disp_seiku() ? (int)json.api_stage1.api_disp_seiku : 0,\r
- Stage1 = CreateStageResult(json.api_stage1),\r
- Stage2 = json.api_stage2 == null\r
- ? new AirBattleResult.StageResult()\r
- : CreateStageResult(json.api_stage2),\r
- AirFire = CreateAirFireResult(json)\r
- };\r
- AirBattleResults.Add(result);\r
- }\r
-\r
- private AirBattleResult.StageResult CreateStageResult(dynamic stage)\r
- {\r
- return new AirBattleResult.StageResult\r
- {\r
- FriendCount = (int)stage.api_f_count,\r
- FriendLost = (int)stage.api_f_lostcount,\r
- EnemyCount = (int)stage.api_e_count,\r
- EnemyLost = (int)stage.api_e_lostcount\r
- };\r
- }\r
-\r
- private AirBattleResult.AirFireResult CreateAirFireResult(dynamic json)\r
- {\r
- if (json.api_stage2 == null || !json.api_stage2.api_air_fire())\r
- return null;\r
- var airFire = json.api_stage2.api_air_fire;\r
- var idx = (int)airFire.api_idx;\r
- return new AirBattleResult.AirFireResult\r
- {\r
- ShipName = idx < _friend.Length ? _friend[idx].Name : _guard[idx - 6].Name,\r
- Kind = (int)airFire.api_kind,\r
- Items = ((int[])airFire.api_use_items).Select(id => _itemInfo.GetSpecByItemId(id).Name).ToArray()\r
- };\r
- }\r
-\r
private void CalcKoukuDamage(dynamic json)\r
{\r
if (json.api_stage3() && json.api_stage3 != null)\r
\r
namespace KancolleSniffer.View\r
{\r
- public class AirBattleResult\r
- {\r
- public class StageResult\r
- {\r
- public int FriendCount { get; set; }\r
- public int FriendLost { get; set; }\r
- public int EnemyCount { get; set; }\r
- public int EnemyLost { get; set; }\r
- }\r
-\r
- public class AirFireResult\r
- {\r
- public string ShipName { get; set; }\r
- public int Kind { get; set; }\r
- public string[] Items { get; set; }\r
- }\r
-\r
- public string PhaseName { get; set; }\r
- public int AirControlLevel { get; set; }\r
- public StageResult Stage1 { get; set; }\r
- public StageResult Stage2 { get; set; }\r
- public AirFireResult AirFire { get; set; }\r
- }\r
-\r
[DesignerCategory("Code")]\r
public class AirBattleResultPanel : PanelWithToolTip\r
{\r
private readonly Label _phaseName;\r
private readonly Label _stage1;\r
private readonly Label[][][] _resultLabels = new Label[2][][];\r
- private AirBattleResult[] _resultList;\r
+ private AirBattleResult.AirBattleRecord[] _resultList;\r
private int _resultIndex;\r
private readonly ShipLabel.Name _ciShipName;\r
private readonly Label _ciKind;\r
var state = sniffer.Battle.BattleState;\r
if (state != BattleState.Day && state != BattleState.SpNight)\r
return;\r
- _resultList = sniffer.Battle.AirBattleResults.ToArray();\r
+ _resultList = sniffer.Battle.AirBattleResult.Result.ToArray();\r
if (_resultList.Length == 0)\r
{\r
ResultRemained = false;\r