{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "airbase_001");\r
- PAssert.That(() => (int)sniffer.AirBase[0].AirCorps[0].CalcFighterPower().Max.AirCombat == 301);\r
+ PAssert.That(() => sniffer.AirBase[0].AirCorps[0].CalcFighterPower().AirCombat.Max == 301);\r
sniffer.AirBase[0].AirCorps[0].Action = 2; // 防空\r
- PAssert.That(() => (int)sniffer.AirBase[0].AirCorps[0].CalcFighterPower().Max.Interception == 320);\r
+ PAssert.That(() => sniffer.AirBase[0].AirCorps[0].CalcFighterPower().Interception.Max == 320);\r
}\r
\r
/// <summary>\r
{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "airbase_002");\r
- PAssert.That(() => (int)sniffer.AirBase[0].AirCorps[2].CalcFighterPower().Min.Interception == 353);\r
+ PAssert.That(() => sniffer.AirBase[0].AirCorps[2].CalcFighterPower().Interception.Min == 353);\r
}\r
\r
/// <summary>\r
{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "airbase_003");\r
- PAssert.That(() => (int)sniffer.AirBase[1].AirCorps[0].CalcFighterPower().Min.AirCombat == 121);\r
+ PAssert.That(() => sniffer.AirBase[1].AirCorps[0].CalcFighterPower().AirCombat.Min == 121);\r
}\r
\r
/// <summary>\r
{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "airbase_004");\r
- PAssert.That(() => (int)sniffer.AirBase[1].AirCorps[0].CalcFighterPower().Min.AirCombat == 328);\r
+ PAssert.That(() => sniffer.AirBase[1].AirCorps[0].CalcFighterPower().AirCombat.Min == 328);\r
}\r
\r
/// <summary>\r
\r
// 二式陸上偵察機(熟練)\r
var fp1 = sniffer.AirBase[0].AirCorps[0].CalcFighterPower();\r
- PAssert.That(() => (int)fp1.Min.AirCombat == 274);\r
- PAssert.That(() => (int)fp1.Min.Interception == 302);\r
+ PAssert.That(() => fp1.AirCombat.Min == 274);\r
+ PAssert.That(() => fp1.Interception.Min == 302);\r
\r
// 二式陸上偵察機\r
var fp3 = sniffer.AirBase[0].AirCorps[2].CalcFighterPower();\r
- PAssert.That(() => (int)fp3.Min.AirCombat == 206);\r
- PAssert.That(() => (int)fp3.Min.Interception == 310);\r
+ PAssert.That(() => fp3.AirCombat.Min == 206);\r
+ PAssert.That(() => fp3.Interception.Min == 310);\r
}\r
\r
/// <summary>\r
<Reference Include="System.Xml" />\r
</ItemGroup>\r
<ItemGroup>\r
- <Compile Include="Model\AirBaseParams.cs" />\r
+ <Compile Include="Model\AirCorpsFighterPower.cs" />\r
<Compile Include="Model\QuestCounter.cs" />\r
<Compile Include="Model\QuestCountList.cs" />\r
<Compile Include="Model\QuestSpec.cs" />\r
_itemInfo = item;\r
}\r
\r
- public BaseInfo[] AllAirCorps { get; set; }\r
+ public BaseInfo[] AllBase { get; set; }\r
\r
public class BaseInfo\r
{\r
}\r
}\r
\r
- public AirBaseParams.Range CalcFighterPower()\r
+ public AirCorpsFighterPower CalcFighterPower()\r
{\r
- var reconPlaneBonus = Planes.Aggregate(new AirBaseParams(), (max, plane) =>\r
+ var reconPlaneBonus = Planes.Aggregate(new AirCorpsFighterPower.Pair(), (max, plane) =>\r
{\r
var bonus = plane.Slot.Spec.ReconPlaneAirBaseBonus;\r
- return AirBaseParams.Max(max, bonus);\r
+ return AirCorpsFighterPower.Pair.Max(max, bonus);\r
});\r
- return (Planes.Aggregate(new AirBaseParams.Range(), (previous, plane) =>\r
+ var range = (Planes.Aggregate(new AirCorpsFighterPower.Range(), (previous, plane) =>\r
{\r
if (plane.State != 1)\r
return previous;\r
var current = plane.Slot.CalcFighterPowerInBase(plane.Count);\r
return previous + current;\r
}) * reconPlaneBonus).Floor();\r
+ return new AirCorpsFighterPower(range);\r
}\r
\r
public int[] CostForSortie => Planes.Aggregate(new[] {0, 0}, (prev, plane) =>\r
}\r
}\r
\r
- public AirBaseParams.Range FighterPower => Slot.CalcFighterPowerInBase(Count);\r
+ public AirCorpsFighterPower FighterPower => new AirCorpsFighterPower(Slot.CalcFighterPowerInBase(Count));\r
}\r
\r
public void Inspect(dynamic json)\r
{\r
- AllAirCorps = (from entry in (dynamic[])json\r
+ AllBase = (from entry in (dynamic[])json\r
group\r
new AirCorpsInfo\r
{\r
\r
public void InspectSetPlane(string request, dynamic json)\r
{\r
- if (AllAirCorps == null)\r
+ if (AllBase == null)\r
return;\r
var values = HttpUtility.ParseQueryString(request);\r
var airCorps = GetBaseInfo(values).AirCorps[int.Parse(values["api_base_id"]) - 1];\r
\r
public void InspectSetAction(string request)\r
{\r
- if (AllAirCorps == null)\r
+ if (AllBase == null)\r
return;\r
var values = HttpUtility.ParseQueryString(request);\r
var airCorps = GetBaseInfo(values).AirCorps;\r
private BaseInfo GetBaseInfo(NameValueCollection values)\r
{\r
var areaId = int.Parse(values["api_area_id"] ?? "0"); // 古いAPIに対応するため\r
- return AllAirCorps.First(b => b.AreaId == areaId);\r
+ return AllBase.First(b => b.AreaId == areaId);\r
}\r
\r
public void InspectPlaneInfo(dynamic json)\r
\r
public void SetItemHolder()\r
{\r
- if (AllAirCorps == null)\r
+ if (AllBase == null)\r
return;\r
var name = new[] {"第一", "第二", "第三"};\r
- foreach (var baseInfo in AllAirCorps.Select((data, i) => new {data, i}))\r
+ foreach (var baseInfo in AllBase.Select((data, i) => new {data, i}))\r
{\r
var areaName = baseInfo.data.AreaName;\r
foreach (var airCorps in baseInfo.data.AirCorps.Select((data, i) => new {data, i}))\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 KancolleSniffer.Util;\r
-\r
-namespace KancolleSniffer.Model\r
-{\r
- public struct AirBaseParams\r
- {\r
- public double AirCombat { get; }\r
- public double Interception { get; }\r
-\r
- public AirBaseParams(double airCombat, double interception)\r
- {\r
- AirCombat = airCombat;\r
- Interception = interception;\r
- }\r
-\r
- public static AirBaseParams Max(AirBaseParams value1, AirBaseParams value2)\r
- {\r
- return new AirBaseParams(Math.Max(value1.AirCombat, value2.AirCombat),\r
- Math.Max(value1.Interception, value2.Interception));\r
- }\r
-\r
- public static AirBaseParams operator +(AirBaseParams lhs, AirBaseParams rhs)\r
- {\r
- return new AirBaseParams(lhs.AirCombat + rhs.AirCombat, lhs.Interception + rhs.Interception);\r
- }\r
-\r
- public static AirBaseParams operator +(AirBaseParams lhs, double rhs)\r
- {\r
- return new AirBaseParams(lhs.AirCombat + rhs, lhs.Interception + rhs);\r
- }\r
-\r
- public static AirBaseParams operator *(AirBaseParams lhs, AirBaseParams rhs)\r
- {\r
- return new AirBaseParams(lhs.AirCombat * rhs.AirCombat, lhs.Interception * rhs.Interception);\r
- }\r
-\r
- public static AirBaseParams operator *(AirBaseParams lhs, double rhs)\r
- {\r
- return new AirBaseParams(lhs.AirCombat * rhs, lhs.Interception * rhs);\r
- }\r
-\r
- public AirBaseParams Floor()\r
- {\r
- return new AirBaseParams((int)AirCombat, (int)Interception);\r
- }\r
-\r
- public struct Range\r
- {\r
- public AirBaseParams Min { get; }\r
- public AirBaseParams Max { get; }\r
-\r
- public Range(AirBaseParams min, AirBaseParams max)\r
- {\r
- Min = min;\r
- Max = max;\r
- }\r
-\r
- public Range(AirBaseParams base_, RangeD range)\r
- {\r
- Min = (base_ + range.Min).Floor();\r
- Max = (base_ + range.Max).Floor();\r
- }\r
-\r
- public static Range operator +(Range lhs, Range rhs)\r
- {\r
- return new Range(lhs.Min + rhs.Min, lhs.Max + rhs.Max);\r
- }\r
-\r
- public static Range operator *(Range lhs, AirBaseParams rhs)\r
- {\r
- return new Range(lhs.Min * rhs, lhs.Max * rhs);\r
- }\r
-\r
- public Range Floor()\r
- {\r
- return new Range(Min.Floor(), Max.Floor());\r
- }\r
- }\r
- }\r
-}
\ No newline at end of file
--- /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
+\r
+namespace KancolleSniffer.Model\r
+{\r
+ public class AirCorpsFighterPower\r
+ {\r
+ public Model.Range AirCombat;\r
+ public Model.Range Interception;\r
+ public bool Difference;\r
+\r
+ public AirCorpsFighterPower(Range fighterPower)\r
+ {\r
+ AirCombat = new Model.Range(fighterPower.Min.AirCombat, fighterPower.Max.AirCombat);\r
+ Interception = new Model.Range(fighterPower.Min.Interception, fighterPower.Max.Interception);\r
+ Difference = Interception.Min != AirCombat.Min;\r
+ }\r
+\r
+ public struct Pair\r
+ {\r
+ public double AirCombat { get; }\r
+ public double Interception { get; }\r
+\r
+ public Pair(double airCombat, double interception)\r
+ {\r
+ AirCombat = airCombat;\r
+ Interception = interception;\r
+ }\r
+\r
+ public static Pair Max(Pair value1, Pair value2)\r
+ {\r
+ return new Pair(Math.Max(value1.AirCombat, value2.AirCombat),\r
+ Math.Max(value1.Interception, value2.Interception));\r
+ }\r
+\r
+ public static Pair operator +(Pair lhs, Pair rhs)\r
+ {\r
+ return new Pair(lhs.AirCombat + rhs.AirCombat, lhs.Interception + rhs.Interception);\r
+ }\r
+\r
+ public static Pair operator +(Pair lhs, double rhs)\r
+ {\r
+ return new Pair(lhs.AirCombat + rhs, lhs.Interception + rhs);\r
+ }\r
+\r
+ public static Pair operator *(Pair lhs, Pair rhs)\r
+ {\r
+ return new Pair(lhs.AirCombat * rhs.AirCombat, lhs.Interception * rhs.Interception);\r
+ }\r
+\r
+ public static Pair operator *(Pair lhs, double rhs)\r
+ {\r
+ return new Pair(lhs.AirCombat * rhs, lhs.Interception * rhs);\r
+ }\r
+\r
+ public Pair Floor()\r
+ {\r
+ return new Pair((int)AirCombat, (int)Interception);\r
+ }\r
+ }\r
+\r
+ public struct Range\r
+ {\r
+ public Pair Min { get; }\r
+ public Pair Max { get; }\r
+\r
+ public Range(Pair min, Pair max)\r
+ {\r
+ Min = min;\r
+ Max = max;\r
+ }\r
+\r
+ public Range(Pair base_, RangeD range)\r
+ {\r
+ Min = (base_ + range.Min).Floor();\r
+ Max = (base_ + range.Max).Floor();\r
+ }\r
+\r
+ public static Range operator +(Range lhs, Range rhs)\r
+ {\r
+ return new Range(lhs.Min + rhs.Min, lhs.Max + rhs.Max);\r
+ }\r
+\r
+ public static Range operator *(Range lhs, Pair rhs)\r
+ {\r
+ return new Range(lhs.Min * rhs, lhs.Max * rhs);\r
+ }\r
+\r
+ public Range Floor()\r
+ {\r
+ return new Range(Min.Floor(), Max.Floor());\r
+ }\r
+ }\r
+ }\r
+}
\ No newline at end of file
}\r
}\r
\r
- public AirBaseParams ReconPlaneAirBaseBonus\r
+ public AirCorpsFighterPower.Pair ReconPlaneAirBaseBonus\r
{\r
get\r
{\r
switch (Type)\r
{\r
case 9:\r
- return new AirBaseParams(1.0, LoS <= 7 ? 1.2 : 1.3);\r
+ return new AirCorpsFighterPower.Pair(1.0, LoS <= 7 ? 1.2 : 1.3);\r
case 10:\r
case 41:\r
- return new AirBaseParams(1.0, LoS <= 7 ? 1.1 : LoS <= 8 ? 1.13 : 1.16);\r
+ return new AirCorpsFighterPower.Pair(1.0, LoS <= 7 ? 1.1 : LoS <= 8 ? 1.13 : 1.16);\r
case 49:\r
- return new AirBaseParams(LoS <= 8 ? 1.15 : 1.18, LoS <= 8 ? 1.18 : 1.24);\r
+ return new AirCorpsFighterPower.Pair(LoS <= 8 ? 1.15 : 1.18, LoS <= 8 ? 1.18 : 1.24);\r
}\r
- return new AirBaseParams(1.0, 1.0);\r
+ return new AirCorpsFighterPower.Pair(1.0, 1.0);\r
}\r
}\r
\r
}\r
}\r
\r
- public AirBaseParams.Range CalcFighterPowerInBase(int slot)\r
+ public AirCorpsFighterPower.Range CalcFighterPowerInBase(int slot)\r
{\r
if (!Spec.IsAircraft || slot == 0)\r
- return new AirBaseParams.Range();\r
+ return new AirCorpsFighterPower.Range();\r
var withoutAlv =\r
- (new AirBaseParams(Spec.Interception * 1.5, Spec.AntiBomber * 2 + Spec.Interception) +\r
+ (new AirCorpsFighterPower.Pair(Spec.Interception * 1.5, Spec.AntiBomber * 2 + Spec.Interception) +\r
Spec.AntiAir + FighterPowerLevelBonus) * Math.Sqrt(slot);\r
- return new AirBaseParams.Range(withoutAlv, AlvBonusInBase);\r
+ return new AirCorpsFighterPower.Range(withoutAlv, AlvBonusInBase);\r
}\r
\r
private RangeD AlvBonusInBase\r
\r
public string MiscText => _miscTextInfo.Text;\r
\r
- public AirBase.BaseInfo[] AirBase => _airBase.AllAirCorps;\r
+ public AirBase.BaseInfo[] AirBase => _airBase.AllBase;\r
\r
public CellInfo CellInfo => _cellInfo;\r
\r
{\r
public AirCorpsRecord(AirBase.AirCorpsInfo airCorps, int number)\r
{\r
- var corpsFp = new AirCorpsFp(airCorps.CalcFighterPower());\r
+ var corpsFp = airCorps.CalcFighterPower();\r
string spec;\r
string spec2;\r
if (airCorps.Action == 2)\r
{\r
public CorpsPlaneRecord(AirBase.PlaneInfo plane)\r
{\r
- var planeFp = new AirCorpsFp(plane.FighterPower);\r
+ var planeFp = plane.FighterPower;\r
Equip = plane.State != 1 ? plane.StateName : GenEquipString(plane.Slot);\r
Spec = plane.State != 1 ? "" : $"+{plane.Slot.Alv} {plane.Count}/{plane.MaxCount}";\r
AircraftSpec =\r
}\r
}\r
\r
- private class AirCorpsFp\r
- {\r
- public readonly Range AirCombat;\r
- public readonly Range Interception;\r
- public readonly bool Difference;\r
-\r
- public AirCorpsFp(AirBaseParams.Range fighterPower)\r
- {\r
- AirCombat = new Range(fighterPower.Min.AirCombat, fighterPower.Max.AirCombat);\r
- Interception = new Range(fighterPower.Min.Interception, fighterPower.Min.Interception);\r
- Difference = Interception.Min != AirCombat.Min;\r
- }\r
- }\r
-\r
private static string RangeString(Range range) => range.Diff ? range.RangeString : range.Min.ToString();\r
}\r
}\r