OSDN Git Service

陸奥改二の一斉射に対応する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Model / PracticeExp.cs
1 using System.Collections.Generic;\r
2 using System.Linq;\r
3 using static System.Math;\r
4 \r
5 namespace KancolleSniffer.Model\r
6 {\r
7     public static class PracticeExp\r
8     {\r
9         private static readonly int[] ExpTable =\r
10         {\r
11             0, 100, 300, 600, 1000, 1500, 2100, 2800, 3600, 4500,\r
12             5500, 6600, 7800, 9100, 10500, 12000, 13600, 15300, 17100, 19000,\r
13             21000, 23100, 25300, 27600, 30000, 32500, 35100, 37800, 40600, 43500,\r
14             46500, 49600, 52800, 56100, 59500, 63000, 66600, 70300, 74100, 78000,\r
15             82000, 86100, 90300, 94600, 99000, 103500, 108100, 112800, 117600, 122500,\r
16             127500, 132700, 138100, 143700, 149500, 155500, 161700, 168100, 174700, 181500,\r
17             188500, 195800, 203400, 211300, 219500, 228000, 236800, 245900, 255300, 265000,\r
18             275000, 285400, 296200, 307400, 319000, 331000, 343400, 356200, 369400, 383000,\r
19             397000, 411500, 426500, 442000, 458000, 474500, 491500, 509000, 527000, 545500,\r
20             564500, 584500, 606500, 631500, 661500, 701500, 761500, 851500, 1000000, 1000000,\r
21             1010000, 1011000, 1013000, 1016000, 1020000, 1025000, 1031000, 1038000, 1046000, 1055000,\r
22             1065000, 1077000, 1091000, 1107000, 1125000, 1145000, 1168000, 1194000, 1223000, 1255000,\r
23             1290000, 1329000, 1372000, 1419000, 1470000, 1525000, 1584000, 1647000, 1714000, 1785000,\r
24             1860000, 1940000, 2025000, 2115000, 2210000, 2310000, 2415000, 2525000, 2640000, 2760000,\r
25             2887000, 3021000, 3162000, 3310000, 3465000, 3628000, 3799000, 3978000, 4165000, 4360000,\r
26             4564000, 4777000, 4999000, 5230000, 5470000, 5720000, 5780000, 5860000, 5970000, 6120000,\r
27             6320000, 6580000, 6910000, 7320000, 7820000, 7920000, 8033000, 8172000, 8350000, 8580000,\r
28             8875000, 9248000, 9705000, 10266000, 10950000\r
29         };\r
30 \r
31         public static double GetExp(int ship1Lv, int ship2Lv)\r
32         {\r
33             var raw = ExpTable[Min(ship1Lv, ExpTable.Length) - 1] / 100.0 +\r
34                       ExpTable[Min(ship2Lv, ExpTable.Length) - 1] / 300.0;\r
35             return raw >= 500 ? 500 + (int)Sqrt(raw - 500) : (int)raw;\r
36         }\r
37 \r
38         public static double TrainingCruiserBonus(IReadOnlyList<ShipStatus> fleet) =>\r
39             1.0 + TrainingCruiserBonusRate(fleet);\r
40 \r
41         private static double TrainingCruiserBonusRate(IReadOnlyList<ShipStatus> fleet)\r
42         {\r
43             if (fleet[0].Spec.IsTrainingCruiser)\r
44             {\r
45                 var fsLevel = fleet[0].Level;\r
46                 if (fleet.Skip(1).Any(s => s.Spec.IsTrainingCruiser))\r
47                 {\r
48                     if (fsLevel < 10)\r
49                         return 0.10;\r
50                     if (fsLevel < 30)\r
51                         return 0.13;\r
52                     if (fsLevel < 60)\r
53                         return 0.16;\r
54                     if (fsLevel < 100)\r
55                         return 0.20;\r
56                     return 0.25;\r
57                 }\r
58                 if (fsLevel < 10)\r
59                     return 0.05;\r
60                 if (fsLevel < 30)\r
61                     return 0.08;\r
62                 if (fsLevel < 60)\r
63                     return 0.12;\r
64                 if (fsLevel < 100)\r
65                     return 0.15;\r
66                 return 0.20;\r
67             }\r
68             var tc = fleet.Count(s => s.Spec.IsTrainingCruiser);\r
69             if (tc == 0)\r
70                 return 0;\r
71             var level = fleet.Where(s => s.Spec.IsTrainingCruiser).Max(s => s.Level);\r
72             if (tc == 1)\r
73             {\r
74                 if (level < 10)\r
75                     return 0.03;\r
76                 if (level < 30)\r
77                     return 0.05;\r
78                 if (level < 60)\r
79                     return 0.07;\r
80                 if (level < 100)\r
81                     return 0.10;\r
82                 return 0.15;\r
83             }\r
84             if (level < 10)\r
85                 return 0.04;\r
86             if (level < 30)\r
87                 return 0.06;\r
88             if (level < 60)\r
89                 return 0.08;\r
90             if (level < 100)\r
91                 return 0.12;\r
92             return 0.175;\r
93         }\r
94     }\r
95 }