private bool _lastCell;\r
\r
public BattleState BattleState { get; set; }\r
- public string Formation { get; private set; }\r
+ public int[] Formation { get; private set; }\r
+ public int[] FighterPower { get; private set; }\r
public EnemyFighterPower EnemyFighterPower { get; private set; }\r
public int AirControlLevel { get; private set; }\r
public BattleResultRank ResultRank { get; private set; }\r
\r
public void InspectBattle(string url, string request, dynamic json)\r
{\r
- Formation = FormationName(json);\r
+ if (json.api_formation())\r
+ Formation = ((dynamic[])json.api_formation).Select(f => f is string ? (int)int.Parse(f) : (int)f).ToArray();\r
AirControlLevel = CheckAirControlLevel(json);\r
ShowResult(false); // 昼戦の結果を夜戦のときに表示する\r
SetupResult(request, json);\r
+ FighterPower = CalcFighterPower();\r
EnemyFighterPower = CalcEnemyFighterPower(json);\r
BattleState = IsNightBattle(json) ? BattleState.Night : BattleState.Day;\r
CalcDamage(json);\r
return (int)json.api_deck_id - 1;\r
}\r
\r
- private string FormationName(dynamic json)\r
- {\r
- if (!json.api_formation()) // 演習の夜戦\r
- return "";\r
- switch ((int)json.api_formation[2])\r
- {\r
- case 1:\r
- return "同航戦";\r
- case 2:\r
- return "反航戦";\r
- case 3:\r
- return "T字有利";\r
- case 4:\r
- return "T字不利";\r
- }\r
- return "";\r
- }\r
-\r
private void SetupResult(string request, dynamic json)\r
{\r
if (_friend != null)\r
return (int)stage1.api_disp_seiku;\r
}\r
\r
+ private int[] CalcFighterPower()\r
+ {\r
+ if (_guard.Length > 0 && _enemyGuard.Length > 0)\r
+ return _shipInfo.GetFighterPower(0).Zip(_shipInfo.GetFighterPower(1), (a, b) => a + b).ToArray();\r
+ return _shipInfo.GetFighterPower(_fleet);\r
+ }\r
+\r
private EnemyFighterPower CalcEnemyFighterPower(dynamic json)\r
{\r
var result = new EnemyFighterPower();\r
private readonly List<ShipLabel> _hpLabels = new List<ShipLabel>();\r
private readonly ToolTip _toolTip = new ToolTip {ShowAlways = true};\r
private readonly BattleInfo.BattleResult[] _result = new BattleInfo.BattleResult[2];\r
- private Label _phaseLabel;\r
+ private Label _phaseLabel, _rankLabel;\r
private BattleState _prevBattleState;\r
+ private readonly BattleResultRank[] _rank = new BattleResultRank[2];\r
+ private readonly InformationPanel _infomationPanel = new InformationPanel();\r
\r
public bool Spoiler { get; set; }\r
\r
\r
public void Update(Sniffer sniffer)\r
{\r
-\r
if (_prevBattleState == BattleState.None)\r
_result[0] = _result[1] = null;\r
var state = _prevBattleState = sniffer.Battle.BattleState;\r
if (Spoiler)\r
{\r
ShowResult(sniffer.Battle.Result);\r
+ ShowResultRank(sniffer.Battle.ResultRank);\r
if (state == BattleState.Day)\r
{\r
_result[0] = sniffer.Battle.Result;\r
+ _rank[0] = sniffer.Battle.ResultRank;\r
SetPhase("昼戦");\r
}\r
else if (state == BattleState.Night)\r
{\r
_result[1] = sniffer.Battle.Result;\r
+ _rank[1] = sniffer.Battle.ResultRank;\r
SetPhase("夜戦");\r
}\r
+ _infomationPanel.Visible = true;\r
}\r
else\r
{\r
ClearResult();\r
- _phaseLabel.Text = "結果";\r
- _phaseLabel.BorderStyle = BorderStyle.FixedSingle;\r
- _phaseLabel.Cursor = Cursors.Hand;\r
+ SetPhase("結果");\r
if (state == BattleState.Day)\r
{\r
_result[0] = sniffer.Battle.Result;\r
+ _rank[0] = sniffer.Battle.ResultRank;\r
}\r
else if (state == BattleState.Night)\r
{\r
_result[1] = sniffer.Battle.Result;\r
+ _rank[1] = sniffer.Battle.ResultRank;\r
}\r
}\r
+ _infomationPanel.SetInformation(sniffer.Battle);\r
}\r
\r
private void PhaseLabelClick(object sender, EventArgs ev)\r
if (_result[0] != null)\r
{\r
ShowResult(_result[0]);\r
+ ShowResultRank(_rank[0]);\r
SetPhase("昼戦");\r
}\r
else if (_result[1] != null)\r
{\r
ShowResult(_result[1]);\r
+ ShowResultRank(_rank[1]);\r
SetPhase("夜戦");\r
}\r
break;\r
if (_result[1] != null)\r
{\r
ShowResult(_result[1]);\r
+ ShowResultRank(_rank[1]);\r
SetPhase("夜戦");\r
}\r
break;\r
if (_result[0] != null)\r
{\r
ShowResult(_result[0]);\r
+ ShowResultRank(_rank[0]);\r
SetPhase("昼戦");\r
}\r
break;\r
private void SetPhase(string phase)\r
{\r
_phaseLabel.Text = phase;\r
- if (_result[0] != null && _result[1] != null)\r
+ if (phase == "結果" || _result[0] != null && _result[1] != null)\r
{\r
_phaseLabel.BorderStyle = BorderStyle.FixedSingle;\r
_phaseLabel.Cursor = Cursors.Hand;\r
{\r
foreach (var panel in _panelList)\r
panel.Visible = false;\r
+ _rankLabel.Visible = _infomationPanel.Visible = false;\r
}\r
\r
private void ShowResult(BattleInfo.BattleResult result)\r
SuspendLayout();\r
var friend = result.Friend;\r
var enemy = result.Enemy;\r
-\r
var fleet = new[] {"第一", "第二", "第三", "第四"};\r
_friendLabels[0][1].Text = fleet[friend.Main[0].Fleet];\r
for (var i = 0; i < friend.Main.Length; i++)\r
}\r
for (var i = lines; i < _panelList.Count; i++)\r
_panelList[i].Visible = false;\r
+ _infomationPanel.Location =\r
+ new Point(35 + AutoScrollPosition.X, lines * LineHeight + 1 + 3 + AutoScrollPosition.Y);\r
+ _infomationPanel.Visible = true;\r
ResumeLayout();\r
}\r
\r
match => match.Value == "(elite)" ? "(e)" : "(f)");\r
}\r
\r
+ private void ShowResultRank(BattleResultRank rank)\r
+ {\r
+ _rankLabel.Visible = true;\r
+ var result = new[] {"完全S", "勝利S", "勝利A", "勝利B", "敗北C", "敗北D", "敗北E"};\r
+ _rankLabel.Text = result[(int)rank];\r
+ }\r
+\r
private void CreateLabels()\r
{\r
SuspendLayout();\r
_phaseLabel = new Label\r
{\r
- Location = new Point(93, 2),\r
+ Location = new Point(78, 2),\r
Size = new Size(31, 14)\r
};\r
_phaseLabel.Click += PhaseLabelClick;\r
Controls.Add(_phaseLabel);\r
+ _rankLabel = new Label\r
+ {\r
+ Location = new Point(110, 2),\r
+ Size = new Size(42, 12)\r
+ };\r
+ Controls.Add(_rankLabel);\r
+ Controls.Add(_infomationPanel);\r
for (var i = 0; i < 14; i++)\r
{\r
var y = 1 + LineHeight * i;\r
}\r
ResumeLayout();\r
}\r
+\r
+ private class InformationPanel : Panel\r
+ {\r
+ private readonly Label[] _formation;\r
+ private readonly Label[] _fighterPower;\r
+ private readonly ToolTip _toolTip = new ToolTip {ShowAlways = true};\r
+\r
+ public InformationPanel()\r
+ {\r
+ Visible = false;\r
+ Size = new Size(152, 32);\r
+ Controls.AddRange(_formation = new[]\r
+ {\r
+ new Label\r
+ {\r
+ Location = new Point(1, 2),\r
+ Size = new Size(53, 12),\r
+ TextAlign = ContentAlignment.MiddleRight\r
+ },\r
+ new Label\r
+ {\r
+ Location = new Point(98, 2),\r
+ Size = new Size(53, 12),\r
+ TextAlign = ContentAlignment.MiddleLeft\r
+ },\r
+ new Label\r
+ {\r
+ Location = new Point(52, 2),\r
+ Size = new Size(48, 12),\r
+ TextAlign = ContentAlignment.MiddleCenter\r
+ }\r
+ });\r
+ Controls.AddRange(_fighterPower = new[]\r
+ {\r
+ new Label\r
+ {\r
+ Location = new Point(28, 17),\r
+ Size = new Size(23, 12),\r
+ TextAlign = ContentAlignment.MiddleRight\r
+ },\r
+ new Label\r
+ {\r
+ Location = new Point(102, 17),\r
+ Size = new Size(23, 12),\r
+ TextAlign = ContentAlignment.MiddleLeft\r
+ },\r
+ new Label\r
+ {\r
+ Location = new Point(50, 17),\r
+ Size = new Size(53, 12),\r
+ TextAlign = ContentAlignment.MiddleCenter\r
+ }\r
+ });\r
+ }\r
+\r
+ public void SetInformation(BattleInfo battleInfo)\r
+ {\r
+ _formation[0].Text = FormationName(battleInfo.Formation[0]);\r
+ _formation[1].Text = FormationName(battleInfo.Formation[1]);\r
+ _formation[2].Text = new[] {"同航戦", "反航戦", "T字有利", "T字不利"}[battleInfo.Formation[2] - 1];\r
+\r
+ if (battleInfo.AirControlLevel == -1)\r
+ {\r
+ if (battleInfo.BattleState == BattleState.Night)\r
+ return;\r
+ foreach (var label in _fighterPower)\r
+ label.Visible = false;\r
+ return;\r
+ }\r
+ var fp = battleInfo.FighterPower;\r
+ _fighterPower[0].Text = fp[0].ToString("D");\r
+ _toolTip.SetToolTip(_fighterPower[0], fp[0] == fp[1] ? "" : $"{fp[0]}~{fp[1]}");\r
+ var efp = battleInfo.EnemyFighterPower;\r
+ _fighterPower[1].Text = efp.AirCombat + efp.UnknownMark;\r
+ _toolTip.SetToolTip(_fighterPower[1],\r
+ efp.AirCombat == efp.Interception ? "" : "防空:" + efp.Interception + efp.UnknownMark);\r
+ _fighterPower[2].Text =\r
+ new[] {"", "制空均衡", "制空確保", "航空優勢", "航空劣勢", "制空喪失"}[battleInfo.AirControlLevel + 1];\r
+ foreach (var label in _fighterPower)\r
+ label.Visible = true;\r
+ }\r
+\r
+ private string FormationName(int formation)\r
+ {\r
+ switch (formation)\r
+ {\r
+ case 1:\r
+ return "単縦陣";\r
+ case 2:\r
+ return "複縦陣";\r
+ case 3:\r
+ return "輪形陣";\r
+ case 4:\r
+ return "梯形陣";\r
+ case 5:\r
+ return "単横陣";\r
+ case 6:\r
+ return "警戒陣";\r
+ case 11:\r
+ return "第一警戒";\r
+ case 12:\r
+ return "第二警戒";\r
+ case 13:\r
+ return "第三警戒";\r
+ case 14:\r
+ return "第四警戒";\r
+ default:\r
+ return "単縦陣";\r
+ }\r
+ }\r
+ }\r
}\r
}
\ No newline at end of file