コミットメタ情報

リビジョン6454546695c12f4755985e0250b7d0ce936d7029 (tree)
日時2018-07-29 20:15:01
作者Kazuhiro Fujieda <fujieda@user...>
コミッターKazuhiro Fujieda

ログメッセージ

ShipSpec ItemSpec ItemStatusを別ファイルに分離する

変更サマリ

差分

--- a/KancolleSniffer/KancolleSniffer.csproj
+++ b/KancolleSniffer/KancolleSniffer.csproj
@@ -57,6 +57,9 @@
5757 <Compile Include="Model\Achievement.cs" />
5858 <Compile Include="Model\AkashiTimer.cs" />
5959 <Compile Include="Model\AlarmTimer.cs" />
60+ <Compile Include="Model\ItemSpec.cs" />
61+ <Compile Include="Model\ItemStatus.cs" />
62+ <Compile Include="Model\ShipSpec.cs" />
6063 <Compile Include="View\AntiAirPanel.cs">
6164 <SubType>Component</SubType>
6265 </Compile>
--- a/KancolleSniffer/Model/ItemInfo.cs
+++ b/KancolleSniffer/Model/ItemInfo.cs
@@ -12,599 +12,12 @@
1212 // See the License for the specific language governing permissions and
1313 // limitations under the License.
1414
15-using System;
1615 using System.Collections.Generic;
17-using System.Drawing;
1816 using System.Linq;
1917 using KancolleSniffer.Util;
20-using static System.Math;
2118
2219 namespace KancolleSniffer.Model
2320 {
24- public class ItemSpec
25- {
26- public static bool IncreaceLandPowerTp = false;
27- public int Id;
28- public string Name;
29- public int Type;
30- public string TypeName;
31- public int Firepower;
32- public int IconType;
33- public int AntiAir;
34- public int LoS;
35- public int AntiSubmarine;
36- public int Torpedo;
37- public int Bomber;
38- public int Interception;
39- public int AntiBomber;
40- public int Distance;
41-
42- public ItemSpec()
43- {
44- Id = -1;
45- Name = "";
46- }
47-
48- public bool CanAirCombat
49- {
50- get
51- {
52- switch (Type)
53- {
54- case 6: // 艦戦
55- case 7: // 艦爆
56- case 8: // 艦攻
57- case 11: // 水爆
58- case 45: // 水戦
59- case 56: // 噴式戦闘機
60- case 57: // 噴式戦闘爆撃機
61- case 58: // 噴式攻撃機
62- return true;
63- }
64- return false;
65- }
66- }
67-
68- // http://ja.kancolle.wikia.com/wiki/%E3%83%9E%E3%83%83%E3%83%97%E7%B4%A2%E6%95%B5
69- public double LoSScaleFactor
70- {
71- get
72- {
73- switch (Type)
74- {
75- case 8: // 艦攻
76- return 0.8;
77- case 9: // 艦偵
78- return 1;
79- case 10: // 水偵
80- return 1.2;
81- case 11: // 水爆
82- return 1.1;
83- default:
84- return 0.6;
85- }
86- }
87- }
88-
89- public bool IsAircraft
90- {
91- get
92- {
93- switch (Type)
94- {
95- case 6:
96- case 7:
97- case 8:
98- case 9:
99- case 10:
100- case 11:
101- case 25: // オートジャイロ
102- case 26: // 対潜哨戒機
103- case 41: // 大艇
104- case 45:
105- case 47: // 陸上攻撃機
106- case 48: // 局地戦闘機
107- case 56:
108- case 57:
109- case 58:
110- case 59: // 噴式偵察機
111- return true;
112- }
113- return false;
114- }
115- }
116-
117- public bool IsDiveBomber => Type == 7 || Type == 11 || Type == 57;
118-
119- public bool IsTorpedoBomber => Type == 8 || Type == 58;
120-
121- public int EffectiveAntiSubmarine
122- {
123- get
124- {
125- switch (Type)
126- {
127- case 1: // 小口径(12.7cm連装高角砲(後期型))
128- case 10: // 水偵
129- case 12: // 小型電探(22号対水上電探改四)
130- case 45: // 水戦
131- return 0;
132- default:
133- return AntiSubmarine;
134- }
135- }
136- }
137-
138- public bool IsSonar => Type == 14 || // ソナー
139- Type == 40; // 大型ソナー
140-
141- public bool IsDepthCharge => Type == 15;
142-
143- public bool IsRepairFacility => Type == 31;
144-
145- public bool IsAntiAirGun => Type == 21;
146-
147- public double ContactTriggerRate
148- {
149- get
150- {
151- switch (Type)
152- {
153- case 9: // 艦偵
154- case 10: // 水偵
155- case 41: // 大艇
156- return 0.04;
157- default:
158- return 0;
159- }
160- }
161- }
162-
163- public Func<double> GetItemTp { get; set; }
164-
165- public double TransportPoint
166- {
167- get
168- {
169- var tp = GetItemTp?.Invoke();
170- if (tp >= 0)
171- return (double)tp;
172- switch (Id)
173- {
174- case 75: // ドラム缶(輸送用)
175- return 5.0;
176- case 68: // 大発動艇
177- return 8.0;
178- case 193: // 特大発動艇
179- return 8.0;
180- case 166: // 大発動艇(八九式中戦車&陸戦隊)
181- return 8.0;
182- case 167: // 特二式内火艇
183- return 2.0;
184- case 230: // 特大発動艇+戦車第11連隊
185- return 8.0;
186- case 145: // 戦闘糧食
187- return 1.0;
188- case 150: // 秋刀魚の缶詰
189- return 1.0;
190- case 241: // 戦闘糧食(特別なおにぎり)
191- return 1.0;
192- default:
193- return 0;
194- }
195- }
196- }
197-
198- public double ReconPlaneInterceptionBonus
199- {
200- get
201- {
202- switch (Type)
203- {
204- case 9:
205- return LoS <= 7 ? 1.2 : 1.3;
206- case 10:
207- case 41:
208- return LoS <= 7 ? 1.1 :
209- LoS <= 8 ? 1.13 : 1.16;
210- }
211- return 1;
212- }
213- }
214-
215- public Color Color
216- {
217- get
218- {
219- switch (IconType)
220- {
221- case 1:
222- case 2:
223- case 3: // 主砲
224- case 13: // 徹甲弾
225- return Color.FromArgb(209, 89, 89);
226- case 4: // 副砲
227- return Color.FromArgb(253, 233, 0);
228- case 5: // 魚雷
229- return Color.FromArgb(88, 134, 170);
230- case 6: // 艦戦
231- return Color.FromArgb(93, 179, 108);
232- case 7: // 艦爆
233- return Color.FromArgb(223, 102, 102);
234- case 8: // 艦攻
235- return Color.FromArgb(95, 173, 234);
236- case 9: // 艦偵
237- return Color.FromArgb(254, 191, 0);
238- case 10: // 水上機
239- case 43: // 水上戦闘機
240- return Color.FromArgb(142, 203, 152);
241- case 11: // 電探
242- return Color.FromArgb(231, 153, 53);
243- case 12: // 三式弾
244- return Color.FromArgb(69, 175, 88);
245- case 14: // 応急修理要員
246- return Color.FromArgb(254, 254, 254);
247- case 15: // 機銃
248- case 16: // 高角砲
249- return Color.FromArgb(102, 204, 118);
250- case 17: // 爆雷
251- case 18: // ソナー
252- return Color.FromArgb(126, 203, 215);
253- case 19: // 缶
254- return Color.FromArgb(254, 195, 77);
255- case 20: // 大発
256- case 36: // 特型内火艇
257- return Color.FromArgb(154, 163, 90);
258- case 21: // オートジャイロ
259- return Color.FromArgb(99, 203, 115);
260- case 22: // 対潜哨戒機
261- return Color.FromArgb(125, 205, 217);
262- case 23: // 追加装甲
263- return Color.FromArgb(152, 124, 172);
264- case 24: // 探照灯
265- case 27: // 照明弾
266- return Color.FromArgb(254, 155, 0);
267- case 25: // ドラム缶
268- return Color.FromArgb(161, 161, 160);
269- case 26: // 艦艇修理施設
270- return Color.FromArgb(175, 156, 126);
271- case 28: // 司令部施設
272- return Color.FromArgb(204, 172, 252);
273- case 29: // 航空要員
274- return Color.FromArgb(206, 166, 108);
275- case 30: // 高射装置
276- return Color.FromArgb(137, 153, 77);
277- case 31: // 対地装備
278- return Color.FromArgb(253, 49, 49);
279- case 32: // 水上艦要員
280- return Color.FromArgb(188, 238, 155);
281- case 33: // 大型飛行艇
282- return Color.FromArgb(142, 203, 152);
283- case 34: // 戦闘糧食
284- return Color.FromArgb(254, 254, 254);
285- case 35: // 補給物資
286- return Color.FromArgb(90, 200, 155);
287- case 37: // 陸上攻撃機
288- case 38: // 局地戦闘機
289- case 44: // 陸軍戦闘機
290- return Color.FromArgb(57, 182, 78);
291- case 39: // 噴式景雲改
292- case 40: // 橘花改
293- return Color.FromArgb(72, 178, 141);
294- case 42: // 潜水艦機材
295- return Color.FromArgb(158, 187, 226);
296- case 45: // 夜間戦闘機
297- case 46: // 夜間攻撃機
298- return Color.FromArgb(128, 121, 161);
299- case 47: // 陸上対潜哨戒機
300- return Color.FromArgb(91, 113, 209);
301- default:
302- return SystemColors.Control;
303- }
304- }
305- }
306- }
307-
308- public class ItemStatus
309- {
310- public int Id { get; set; }
311- public ItemSpec Spec { get; set; } = new ItemSpec();
312- public int Level { get; set; }
313- public int Alv { get; set; }
314- public ShipStatus Holder { get; set; }
315-
316- public ItemStatus()
317- {
318- Id = -1;
319- }
320-
321- public ItemStatus(int id)
322- {
323- Id = id;
324- }
325-
326- public int[] CalcFighterPower(int slot)
327- {
328- if (!Spec.CanAirCombat || slot == 0)
329- return new[] {0, 0};
330- var unskilled = (Spec.AntiAir + FighterPowerLevelBonus) * Sqrt(slot);
331- return AlvBonus.Select(bonus => (int)(unskilled + bonus)).ToArray();
332- }
333-
334- public int[] CalcFighterPowerInBase(int slot, bool airDefence)
335- {
336- if (!Spec.IsAircraft || slot == 0)
337- return new[] {0, 0};
338- var airDefenceBonus = airDefence ? Spec.AntiBomber * 2 + Spec.Interception : Spec.Interception * 1.5;
339- var unskilled = (Spec.AntiAir + airDefenceBonus + FighterPowerLevelBonus) * Sqrt(slot);
340- return AlvBonusInBase.Select(bonus => (int)(unskilled + bonus)).ToArray();
341- }
342-
343- private readonly double[] _alvBonusMin =
344- {
345- Sqrt(0.0), Sqrt(1.0), Sqrt(2.5), Sqrt(4.0), Sqrt(5.5), Sqrt(7.0),
346- Sqrt(8.5), Sqrt(10.0)
347- };
348-
349- private readonly double[] _alvBonusMax =
350- {
351- Sqrt(0.9), Sqrt(2.4), Sqrt(3.9), Sqrt(5.4), Sqrt(6.9), Sqrt(8.4),
352- Sqrt(9.9), Sqrt(12.0)
353- };
354-
355- private int[] AlvTypeBonusTable
356- {
357- get
358- {
359- switch (Spec.Type)
360- {
361- case 6: // 艦戦
362- case 45: // 水戦
363- case 48: // 局地戦闘機
364- case 56: // 噴式戦闘機
365- return new[] {0, 0, 2, 5, 9, 14, 14, 22};
366- case 7: // 艦爆
367- case 8: // 艦攻
368- case 47: // 陸攻
369- case 57: // 噴式戦闘爆撃機
370- case 58: // 噴式攻撃機
371- return new[] {0, 0, 0, 0, 0, 0, 0, 0};
372- case 11: // 水爆
373- return new[] {0, 0, 1, 1, 1, 3, 3, 6};
374- default:
375- return null;
376- }
377- }
378- }
379-
380- private double[] AlvBonus
381- {
382- get
383- {
384- var table = AlvTypeBonusTable;
385- if (table == null)
386- return new[] {0.0, 0.0};
387- return new[] {table[Alv] + _alvBonusMin[Alv], table[Alv] + _alvBonusMax[Alv]};
388- }
389- }
390-
391- private double[] AlvBonusInBase
392- {
393- get
394- {
395- switch (Spec.Type)
396- {
397- case 9: // 艦偵
398- case 10: // 水偵
399- case 41: // 大艇
400- return new[] {_alvBonusMin[Alv], _alvBonusMax[Alv]};
401- default:
402- return AlvBonus;
403- }
404- }
405- }
406-
407- private double FighterPowerLevelBonus
408- {
409- get
410- {
411- switch (Spec.Type)
412- {
413- case 6: // 艦戦
414- case 45: // 水戦
415- case 48: // 陸戦・局戦
416- return 0.2 * Level;
417- case 7: // 改修可能なのは爆戦のみ
418- return 0.25 * Level;
419- }
420- return 0;
421- }
422- }
423-
424- public double LoSLevelBonus
425- {
426- get
427- {
428- switch (Spec.Type)
429- {
430- case 10: // 水偵
431- return 1.2 * Sqrt(Level);
432- case 11: // 水爆
433- return 1.15 * Sqrt(Level);
434- case 12: // 小型電探
435- return 1.25 * Sqrt(Level);
436- case 13: // 大型電探
437- return 1.4 * Sqrt(Level);
438- case 94: // 艦上偵察機(II)
439- return 1.2 * Sqrt(Level);
440- default:
441- return 0;
442- }
443- }
444- }
445-
446- public double FirepowerLevelBonus
447- {
448- get
449- {
450- switch (Spec.Type)
451- {
452- case 1: // 小口径
453- case 2: // 中口径
454- case 19: // 徹甲弾
455- case 21: // 対空機銃
456- case 24: // 上陸用舟艇
457- case 29: // 探照灯
458- case 36: // 高射装置
459- case 42: // 大型探照灯
460- case 46: // 特型内火艇
461- return Sqrt(Level);
462- case 3: // 大口径
463- return 1.5 * Sqrt(Level);
464- case 4: // 副砲
465- return SecondaryGunLevelBonus;
466- case 14: // ソナー
467- case 15: // 爆雷
468- return Spec.Id == 226 // 九五式爆雷
469- ? 0
470- : 0.75 * Sqrt(Level);
471- default:
472- return 0;
473- }
474- }
475- }
476-
477- public double SecondaryGunLevelBonus
478- {
479- get
480- {
481- switch (Spec.Id)
482- {
483- case 10: // 12.7cm連装高角砲
484- case 66: // 8cm高角砲
485- case 220: // 8cm高角砲改+増設機銃
486- case 275: // 10cm連装高角砲改+増設機銃
487- return 0.2 * Level;
488- case 12: // 15.5cm三連装副砲
489- case 234: // 15.5cm三連装副砲改
490- case 247: // 15.2cm三連装砲
491- return 0.3 * Level;
492- default:
493- return Sqrt(Level);
494- }
495- }
496- }
497-
498- public double TorpedoLevelBonus
499- {
500- get
501- {
502- switch (Spec.Type)
503- {
504- case 5: // 魚雷
505- case 21: // 機銃
506- return 1.2 * Sqrt(Level);
507- default:
508- return 0;
509- }
510- }
511- }
512-
513- public double AntiSubmarineLevelBonus
514- {
515- get
516- {
517- switch (Spec.Type)
518- {
519- case 14:
520- case 15:
521- return Sqrt(Level);
522- default:
523- return 0;
524- }
525- }
526- }
527-
528- public double BomberLevelBonus => Spec.Type == 11 /* 水爆 */ ? 0.2 * Level : 0;
529-
530- public double NightBattleLevelBonus
531- {
532- get
533- {
534- switch (Spec.Type)
535- {
536- case 1: // 小口径
537- case 2: // 中口径
538- case 3: // 大口径
539- case 5: // 魚雷
540- case 19: // 徹甲弾
541- case 24: // 上陸用舟艇
542- case 29: // 探照灯
543- case 36: // 高射装置
544- case 42: // 大型探照灯
545- case 46: // 特型内火艇
546- return Sqrt(Level);
547- case 4: // 副砲
548- return SecondaryGunLevelBonus;
549- default:
550- return 0;
551- }
552- }
553- }
554-
555- public double EffectiveAntiAirForShip
556- {
557- get
558- {
559- switch (Spec.IconType)
560- {
561- case 15: // 機銃
562- return 6 * Spec.AntiAir + 4 * Sqrt(Level);
563- case 16: // 高角砲
564- return 4 * Spec.AntiAir + (Spec.AntiAir >= 8 ? 3 : 2) * Sqrt(Level);
565- case 11: // 電探
566- return 3 * Spec.AntiAir;
567- case 30: // 高射装置
568- return 4 * Spec.AntiAir + 2 * Sqrt(Level);
569- }
570- return 0;
571- }
572- }
573-
574- public double EffectiveAntiAirForFleet
575- {
576- get
577- {
578- switch (Spec.IconType)
579- {
580- case 1:
581- case 2:
582- case 3: // 主砲
583- case 4: // 副砲
584- case 6: // 艦戦
585- case 7: // 艦爆
586- case 15: // 機銃
587- return 0.2 * Spec.AntiAir;
588- case 11: // 電探
589- return 0.4 * Spec.AntiAir + 1.5 * Sqrt(Level);
590- case 12: // 三式弾
591- return 0.6 * Spec.AntiAir;
592- case 16: // 高角砲
593- return 0.35 * Spec.AntiAir + (Spec.AntiAir >= 8 ? 3 : 2) * Sqrt(Level);
594- case 30: // 高射装置
595- return 0.35 * Spec.AntiAir + 2 * Sqrt(Level);
596- default:
597- if (Spec.Id == 9) // 46cm三連装砲
598- return 0.25 * Spec.AntiAir;
599- if (Spec.Type == 10) // 水偵
600- return 0.2 * Spec.AntiAir;
601- break;
602- }
603- return 0;
604- }
605- }
606- }
607-
60821 public class ItemInfo
60922 {
61023 private int _nowShips, _nowEquips;
--- /dev/null
+++ b/KancolleSniffer/Model/ItemSpec.cs
@@ -0,0 +1,303 @@
1+// Copyright (C) 2018 Kazuhiro Fujieda <fujieda@users.osdn.me>
2+//
3+// Licensed under the Apache License, Version 2.0 (the "License");
4+// you may not use this file except in compliance with the License.
5+// You may obtain a copy of the License at
6+//
7+// http://www.apache.org/licenses/LICENSE-2.0
8+//
9+// Unless required by applicable law or agreed to in writing, software
10+// distributed under the License is distributed on an "AS IS" BASIS,
11+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+// See the License for the specific language governing permissions and
13+// limitations under the License.
14+
15+using System;
16+using System.Drawing;
17+
18+namespace KancolleSniffer.Model
19+{
20+ public class ItemSpec
21+ {
22+ public static bool IncreaceLandPowerTp = false;
23+ public int Id;
24+ public string Name;
25+ public int Type;
26+ public string TypeName;
27+ public int Firepower;
28+ public int IconType;
29+ public int AntiAir;
30+ public int LoS;
31+ public int AntiSubmarine;
32+ public int Torpedo;
33+ public int Bomber;
34+ public int Interception;
35+ public int AntiBomber;
36+ public int Distance;
37+
38+ public ItemSpec()
39+ {
40+ Id = -1;
41+ Name = "";
42+ }
43+
44+ public bool CanAirCombat
45+ {
46+ get
47+ {
48+ switch (Type)
49+ {
50+ case 6: // 艦戦
51+ case 7: // 艦爆
52+ case 8: // 艦攻
53+ case 11: // 水爆
54+ case 45: // 水戦
55+ case 56: // 噴式戦闘機
56+ case 57: // 噴式戦闘爆撃機
57+ case 58: // 噴式攻撃機
58+ return true;
59+ }
60+ return false;
61+ }
62+ }
63+
64+ // http://ja.kancolle.wikia.com/wiki/%E3%83%9E%E3%83%83%E3%83%97%E7%B4%A2%E6%95%B5
65+ public double LoSScaleFactor
66+ {
67+ get
68+ {
69+ switch (Type)
70+ {
71+ case 8: // 艦攻
72+ return 0.8;
73+ case 9: // 艦偵
74+ return 1;
75+ case 10: // 水偵
76+ return 1.2;
77+ case 11: // 水爆
78+ return 1.1;
79+ default:
80+ return 0.6;
81+ }
82+ }
83+ }
84+
85+ public bool IsAircraft
86+ {
87+ get
88+ {
89+ switch (Type)
90+ {
91+ case 6:
92+ case 7:
93+ case 8:
94+ case 9:
95+ case 10:
96+ case 11:
97+ case 25: // オートジャイロ
98+ case 26: // 対潜哨戒機
99+ case 41: // 大艇
100+ case 45:
101+ case 47: // 陸上攻撃機
102+ case 48: // 局地戦闘機
103+ case 56:
104+ case 57:
105+ case 58:
106+ case 59: // 噴式偵察機
107+ return true;
108+ }
109+ return false;
110+ }
111+ }
112+
113+ public bool IsDiveBomber => Type == 7 || Type == 11 || Type == 57;
114+
115+ public bool IsTorpedoBomber => Type == 8 || Type == 58;
116+
117+ public int EffectiveAntiSubmarine
118+ {
119+ get
120+ {
121+ switch (Type)
122+ {
123+ case 1: // 小口径(12.7cm連装高角砲(後期型))
124+ case 10: // 水偵
125+ case 12: // 小型電探(22号対水上電探改四)
126+ case 45: // 水戦
127+ return 0;
128+ default:
129+ return AntiSubmarine;
130+ }
131+ }
132+ }
133+
134+ public bool IsSonar => Type == 14 || // ソナー
135+ Type == 40; // 大型ソナー
136+
137+ public bool IsDepthCharge => Type == 15;
138+
139+ public bool IsRepairFacility => Type == 31;
140+
141+ public bool IsAntiAirGun => Type == 21;
142+
143+ public double ContactTriggerRate
144+ {
145+ get
146+ {
147+ switch (Type)
148+ {
149+ case 9: // 艦偵
150+ case 10: // 水偵
151+ case 41: // 大艇
152+ return 0.04;
153+ default:
154+ return 0;
155+ }
156+ }
157+ }
158+
159+ public Func<double> GetItemTp { get; set; }
160+
161+ public double TransportPoint
162+ {
163+ get
164+ {
165+ var tp = GetItemTp?.Invoke();
166+ if (tp >= 0)
167+ return (double)tp;
168+ switch (Id)
169+ {
170+ case 75: // ドラム缶(輸送用)
171+ return 5.0;
172+ case 68: // 大発動艇
173+ return 8.0;
174+ case 193: // 特大発動艇
175+ return 8.0;
176+ case 166: // 大発動艇(八九式中戦車&陸戦隊)
177+ return 8.0;
178+ case 167: // 特二式内火艇
179+ return 2.0;
180+ case 230: // 特大発動艇+戦車第11連隊
181+ return 8.0;
182+ case 145: // 戦闘糧食
183+ return 1.0;
184+ case 150: // 秋刀魚の缶詰
185+ return 1.0;
186+ case 241: // 戦闘糧食(特別なおにぎり)
187+ return 1.0;
188+ default:
189+ return 0;
190+ }
191+ }
192+ }
193+
194+ public double ReconPlaneInterceptionBonus
195+ {
196+ get
197+ {
198+ switch (Type)
199+ {
200+ case 9:
201+ return LoS <= 7 ? 1.2 : 1.3;
202+ case 10:
203+ case 41:
204+ return LoS <= 7 ? 1.1 :
205+ LoS <= 8 ? 1.13 : 1.16;
206+ }
207+ return 1;
208+ }
209+ }
210+
211+ public Color Color
212+ {
213+ get
214+ {
215+ switch (IconType)
216+ {
217+ case 1:
218+ case 2:
219+ case 3: // 主砲
220+ case 13: // 徹甲弾
221+ return Color.FromArgb(209, 89, 89);
222+ case 4: // 副砲
223+ return Color.FromArgb(253, 233, 0);
224+ case 5: // 魚雷
225+ return Color.FromArgb(88, 134, 170);
226+ case 6: // 艦戦
227+ return Color.FromArgb(93, 179, 108);
228+ case 7: // 艦爆
229+ return Color.FromArgb(223, 102, 102);
230+ case 8: // 艦攻
231+ return Color.FromArgb(95, 173, 234);
232+ case 9: // 艦偵
233+ return Color.FromArgb(254, 191, 0);
234+ case 10: // 水上機
235+ case 43: // 水上戦闘機
236+ return Color.FromArgb(142, 203, 152);
237+ case 11: // 電探
238+ return Color.FromArgb(231, 153, 53);
239+ case 12: // 三式弾
240+ return Color.FromArgb(69, 175, 88);
241+ case 14: // 応急修理要員
242+ return Color.FromArgb(254, 254, 254);
243+ case 15: // 機銃
244+ case 16: // 高角砲
245+ return Color.FromArgb(102, 204, 118);
246+ case 17: // 爆雷
247+ case 18: // ソナー
248+ return Color.FromArgb(126, 203, 215);
249+ case 19: // 缶
250+ return Color.FromArgb(254, 195, 77);
251+ case 20: // 大発
252+ case 36: // 特型内火艇
253+ return Color.FromArgb(154, 163, 90);
254+ case 21: // オートジャイロ
255+ return Color.FromArgb(99, 203, 115);
256+ case 22: // 対潜哨戒機
257+ return Color.FromArgb(125, 205, 217);
258+ case 23: // 追加装甲
259+ return Color.FromArgb(152, 124, 172);
260+ case 24: // 探照灯
261+ case 27: // 照明弾
262+ return Color.FromArgb(254, 155, 0);
263+ case 25: // ドラム缶
264+ return Color.FromArgb(161, 161, 160);
265+ case 26: // 艦艇修理施設
266+ return Color.FromArgb(175, 156, 126);
267+ case 28: // 司令部施設
268+ return Color.FromArgb(204, 172, 252);
269+ case 29: // 航空要員
270+ return Color.FromArgb(206, 166, 108);
271+ case 30: // 高射装置
272+ return Color.FromArgb(137, 153, 77);
273+ case 31: // 対地装備
274+ return Color.FromArgb(253, 49, 49);
275+ case 32: // 水上艦要員
276+ return Color.FromArgb(188, 238, 155);
277+ case 33: // 大型飛行艇
278+ return Color.FromArgb(142, 203, 152);
279+ case 34: // 戦闘糧食
280+ return Color.FromArgb(254, 254, 254);
281+ case 35: // 補給物資
282+ return Color.FromArgb(90, 200, 155);
283+ case 37: // 陸上攻撃機
284+ case 38: // 局地戦闘機
285+ case 44: // 陸軍戦闘機
286+ return Color.FromArgb(57, 182, 78);
287+ case 39: // 噴式景雲改
288+ case 40: // 橘花改
289+ return Color.FromArgb(72, 178, 141);
290+ case 42: // 潜水艦機材
291+ return Color.FromArgb(158, 187, 226);
292+ case 45: // 夜間戦闘機
293+ case 46: // 夜間攻撃機
294+ return Color.FromArgb(128, 121, 161);
295+ case 47: // 陸上対潜哨戒機
296+ return Color.FromArgb(91, 113, 209);
297+ default:
298+ return SystemColors.Control;
299+ }
300+ }
301+ }
302+ }
303+}
\ No newline at end of file
--- /dev/null
+++ b/KancolleSniffer/Model/ItemStatus.cs
@@ -0,0 +1,319 @@
1+// Copyright (C) 2018 Kazuhiro Fujieda <fujieda@users.osdn.me>
2+//
3+// Licensed under the Apache License, Version 2.0 (the "License");
4+// you may not use this file except in compliance with the License.
5+// You may obtain a copy of the License at
6+//
7+// http://www.apache.org/licenses/LICENSE-2.0
8+//
9+// Unless required by applicable law or agreed to in writing, software
10+// distributed under the License is distributed on an "AS IS" BASIS,
11+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+// See the License for the specific language governing permissions and
13+// limitations under the License.
14+
15+using System;
16+using System.Linq;
17+
18+namespace KancolleSniffer.Model
19+{
20+ public class ItemStatus
21+ {
22+ public int Id { get; set; }
23+ public ItemSpec Spec { get; set; } = new ItemSpec();
24+ public int Level { get; set; }
25+ public int Alv { get; set; }
26+ public ShipStatus Holder { get; set; }
27+
28+ public ItemStatus()
29+ {
30+ Id = -1;
31+ }
32+
33+ public ItemStatus(int id)
34+ {
35+ Id = id;
36+ }
37+
38+ public int[] CalcFighterPower(int slot)
39+ {
40+ if (!Spec.CanAirCombat || slot == 0)
41+ return new[] {0, 0};
42+ var unskilled = (Spec.AntiAir + FighterPowerLevelBonus) * Math.Sqrt(slot);
43+ return AlvBonus.Select(bonus => (int)(unskilled + bonus)).ToArray();
44+ }
45+
46+ public int[] CalcFighterPowerInBase(int slot, bool airDefence)
47+ {
48+ if (!Spec.IsAircraft || slot == 0)
49+ return new[] {0, 0};
50+ var airDefenceBonus = airDefence ? Spec.AntiBomber * 2 + Spec.Interception : Spec.Interception * 1.5;
51+ var unskilled = (Spec.AntiAir + airDefenceBonus + FighterPowerLevelBonus) * Math.Sqrt(slot);
52+ return AlvBonusInBase.Select(bonus => (int)(unskilled + bonus)).ToArray();
53+ }
54+
55+ private readonly double[] _alvBonusMin =
56+ {
57+ Math.Sqrt(0.0), Math.Sqrt(1.0), Math.Sqrt(2.5), Math.Sqrt(4.0), Math.Sqrt(5.5), Math.Sqrt(7.0),
58+ Math.Sqrt(8.5), Math.Sqrt(10.0)
59+ };
60+
61+ private readonly double[] _alvBonusMax =
62+ {
63+ Math.Sqrt(0.9), Math.Sqrt(2.4), Math.Sqrt(3.9), Math.Sqrt(5.4), Math.Sqrt(6.9), Math.Sqrt(8.4),
64+ Math.Sqrt(9.9), Math.Sqrt(12.0)
65+ };
66+
67+ private int[] AlvTypeBonusTable
68+ {
69+ get
70+ {
71+ switch (Spec.Type)
72+ {
73+ case 6: // 艦戦
74+ case 45: // 水戦
75+ case 48: // 局地戦闘機
76+ case 56: // 噴式戦闘機
77+ return new[] {0, 0, 2, 5, 9, 14, 14, 22};
78+ case 7: // 艦爆
79+ case 8: // 艦攻
80+ case 47: // 陸攻
81+ case 57: // 噴式戦闘爆撃機
82+ case 58: // 噴式攻撃機
83+ return new[] {0, 0, 0, 0, 0, 0, 0, 0};
84+ case 11: // 水爆
85+ return new[] {0, 0, 1, 1, 1, 3, 3, 6};
86+ default:
87+ return null;
88+ }
89+ }
90+ }
91+
92+ private double[] AlvBonus
93+ {
94+ get
95+ {
96+ var table = AlvTypeBonusTable;
97+ if (table == null)
98+ return new[] {0.0, 0.0};
99+ return new[] {table[Alv] + _alvBonusMin[Alv], table[Alv] + _alvBonusMax[Alv]};
100+ }
101+ }
102+
103+ private double[] AlvBonusInBase
104+ {
105+ get
106+ {
107+ switch (Spec.Type)
108+ {
109+ case 9: // 艦偵
110+ case 10: // 水偵
111+ case 41: // 大艇
112+ return new[] {_alvBonusMin[Alv], _alvBonusMax[Alv]};
113+ default:
114+ return AlvBonus;
115+ }
116+ }
117+ }
118+
119+ private double FighterPowerLevelBonus
120+ {
121+ get
122+ {
123+ switch (Spec.Type)
124+ {
125+ case 6: // 艦戦
126+ case 45: // 水戦
127+ case 48: // 陸戦・局戦
128+ return 0.2 * Level;
129+ case 7: // 改修可能なのは爆戦のみ
130+ return 0.25 * Level;
131+ }
132+ return 0;
133+ }
134+ }
135+
136+ public double LoSLevelBonus
137+ {
138+ get
139+ {
140+ switch (Spec.Type)
141+ {
142+ case 10: // 水偵
143+ return 1.2 * Math.Sqrt(Level);
144+ case 11: // 水爆
145+ return 1.15 * Math.Sqrt(Level);
146+ case 12: // 小型電探
147+ return 1.25 * Math.Sqrt(Level);
148+ case 13: // 大型電探
149+ return 1.4 * Math.Sqrt(Level);
150+ case 94: // 艦上偵察機(II)
151+ return 1.2 * Math.Sqrt(Level);
152+ default:
153+ return 0;
154+ }
155+ }
156+ }
157+
158+ public double FirepowerLevelBonus
159+ {
160+ get
161+ {
162+ switch (Spec.Type)
163+ {
164+ case 1: // 小口径
165+ case 2: // 中口径
166+ case 19: // 徹甲弾
167+ case 21: // 対空機銃
168+ case 24: // 上陸用舟艇
169+ case 29: // 探照灯
170+ case 36: // 高射装置
171+ case 42: // 大型探照灯
172+ case 46: // 特型内火艇
173+ return Math.Sqrt(Level);
174+ case 3: // 大口径
175+ return 1.5 * Math.Sqrt(Level);
176+ case 4: // 副砲
177+ return SecondaryGunLevelBonus;
178+ case 14: // ソナー
179+ case 15: // 爆雷
180+ return Spec.Id == 226 // 九五式爆雷
181+ ? 0
182+ : 0.75 * Math.Sqrt(Level);
183+ default:
184+ return 0;
185+ }
186+ }
187+ }
188+
189+ public double SecondaryGunLevelBonus
190+ {
191+ get
192+ {
193+ switch (Spec.Id)
194+ {
195+ case 10: // 12.7cm連装高角砲
196+ case 66: // 8cm高角砲
197+ case 220: // 8cm高角砲改+増設機銃
198+ case 275: // 10cm連装高角砲改+増設機銃
199+ return 0.2 * Level;
200+ case 12: // 15.5cm三連装副砲
201+ case 234: // 15.5cm三連装副砲改
202+ case 247: // 15.2cm三連装砲
203+ return 0.3 * Level;
204+ default:
205+ return Math.Sqrt(Level);
206+ }
207+ }
208+ }
209+
210+ public double TorpedoLevelBonus
211+ {
212+ get
213+ {
214+ switch (Spec.Type)
215+ {
216+ case 5: // 魚雷
217+ case 21: // 機銃
218+ return 1.2 * Math.Sqrt(Level);
219+ default:
220+ return 0;
221+ }
222+ }
223+ }
224+
225+ public double AntiSubmarineLevelBonus
226+ {
227+ get
228+ {
229+ switch (Spec.Type)
230+ {
231+ case 14:
232+ case 15:
233+ return Math.Sqrt(Level);
234+ default:
235+ return 0;
236+ }
237+ }
238+ }
239+
240+ public double BomberLevelBonus => Spec.Type == 11 /* 水爆 */ ? 0.2 * Level : 0;
241+
242+ public double NightBattleLevelBonus
243+ {
244+ get
245+ {
246+ switch (Spec.Type)
247+ {
248+ case 1: // 小口径
249+ case 2: // 中口径
250+ case 3: // 大口径
251+ case 5: // 魚雷
252+ case 19: // 徹甲弾
253+ case 24: // 上陸用舟艇
254+ case 29: // 探照灯
255+ case 36: // 高射装置
256+ case 42: // 大型探照灯
257+ case 46: // 特型内火艇
258+ return Math.Sqrt(Level);
259+ case 4: // 副砲
260+ return SecondaryGunLevelBonus;
261+ default:
262+ return 0;
263+ }
264+ }
265+ }
266+
267+ public double EffectiveAntiAirForShip
268+ {
269+ get
270+ {
271+ switch (Spec.IconType)
272+ {
273+ case 15: // 機銃
274+ return 6 * Spec.AntiAir + 4 * Math.Sqrt(Level);
275+ case 16: // 高角砲
276+ return 4 * Spec.AntiAir + (Spec.AntiAir >= 8 ? 3 : 2) * Math.Sqrt(Level);
277+ case 11: // 電探
278+ return 3 * Spec.AntiAir;
279+ case 30: // 高射装置
280+ return 4 * Spec.AntiAir + 2 * Math.Sqrt(Level);
281+ }
282+ return 0;
283+ }
284+ }
285+
286+ public double EffectiveAntiAirForFleet
287+ {
288+ get
289+ {
290+ switch (Spec.IconType)
291+ {
292+ case 1:
293+ case 2:
294+ case 3: // 主砲
295+ case 4: // 副砲
296+ case 6: // 艦戦
297+ case 7: // 艦爆
298+ case 15: // 機銃
299+ return 0.2 * Spec.AntiAir;
300+ case 11: // 電探
301+ return 0.4 * Spec.AntiAir + 1.5 * Math.Sqrt(Level);
302+ case 12: // 三式弾
303+ return 0.6 * Spec.AntiAir;
304+ case 16: // 高角砲
305+ return 0.35 * Spec.AntiAir + (Spec.AntiAir >= 8 ? 3 : 2) * Math.Sqrt(Level);
306+ case 30: // 高射装置
307+ return 0.35 * Spec.AntiAir + 2 * Math.Sqrt(Level);
308+ default:
309+ if (Spec.Id == 9) // 46cm三連装砲
310+ return 0.25 * Spec.AntiAir;
311+ if (Spec.Type == 10) // 水偵
312+ return 0.2 * Spec.AntiAir;
313+ break;
314+ }
315+ return 0;
316+ }
317+ }
318+ }
319+}
\ No newline at end of file
--- a/KancolleSniffer/Model/ShipMaster.cs
+++ b/KancolleSniffer/Model/ShipMaster.cs
@@ -108,140 +108,4 @@ namespace KancolleSniffer.Model
108108 /// <param name="id"></param>
109109 public void InjectSpec(int id) => _shipSpecs[id] = new ShipSpec {Id = id};
110110 }
111-
112- public class ShipSpec
113- {
114- public int Id { get; set; }
115- public bool IsEnemy => ShipMaster.IsEnemyId(Id);
116- public int SortNo { get; set; }
117- public string Name { get; set; }
118- public int FuelMax { get; set; }
119- public int BullMax { get; set; }
120- public int SlotNum { get; set; }
121- public Func<int[]> GetMaxEq { get; set; }
122- public int[] MaxEq => GetMaxEq?.Invoke();
123- public Func<int> GetNumEquips { get; set; }
124- public Action<int> SetNumEquips { get; set; }
125-
126- public int NumEquips
127- {
128- get => GetNumEquips();
129- set => SetNumEquips(value);
130- }
131-
132- public int ShipType { get; set; }
133- public int ShipClass { get; set; }
134- public string ShipTypeName { get; set; }
135- public RemodelInfo Remodel { get; } = new RemodelInfo();
136-
137- public class RemodelInfo
138- {
139- public int Level { get; set; }
140- public int After { get; set; }
141- public int Base { get; set; } // 艦隊晒しページ用
142- public int Step { get; set; } // 同上
143- }
144-
145- public ShipSpec()
146- {
147- Id = -1;
148- Name = "";
149- }
150-
151- public double RepairWeight
152- {
153- get
154- {
155- switch (ShipType)
156- {
157- case 1: // 海防艦
158- case 13: // 潜水艦
159- return 0.5;
160- case 2: // 駆逐艦
161- case 3: // 軽巡洋艦
162- case 4: // 重雷装巡洋艦
163- case 14: // 潜水空母
164- case 16: // 水上機母艦
165- case 17: // 揚陸艦
166- case 21: // 練習巡洋艦
167- case 22: // 補給艦
168- return 1.0;
169- case 5: // 重巡洋艦
170- case 6: // 航空巡洋艦
171- case 7: // 軽空母
172- case 8: // 高速戦艦
173- case 20: // 潜水母艦
174- return 1.5;
175- case 9: // 低速戦艦
176- case 10: // 航空戦艦
177- case 11: // 正規空母
178- case 18: // 装甲空母
179- case 19: // 工作艦
180- return 2.0;
181- }
182- return 1.0;
183- }
184- }
185-
186- public double TransportPoint
187- {
188- get
189- {
190- switch (ShipType)
191- {
192- case 2:
193- return 5.0;
194- case 3:
195- return Id == 487 ? 10.0 : 2.0; // 鬼怒改二は大発分を加算
196- case 6:
197- return 4.0;
198- case 10:
199- return 7.0;
200- case 16:
201- return 9.0;
202- case 17:
203- return 12.0;
204- case 20:
205- return 7.0;
206- case 21:
207- return 6.0;
208- case 22:
209- return 15.0;
210- default:
211- return 0;
212- }
213- }
214- }
215-
216- public bool IsSubmarine => ShipType == 13 || ShipType == 14;
217-
218- public bool IsAircraftCarrier => ShipType == 7 || ShipType == 11 || ShipType == 18;
219-
220- public bool IsAntiSubmarine
221- {
222- get
223- {
224- switch (ShipType)
225- {
226- case 1: // 海防艦
227- case 2: // 駆逐
228- case 3: // 軽巡
229- case 4: // 雷巡
230- case 6: // 航巡
231- case 7: // 軽空
232- case 10: // 航戦
233- case 16: // 水母
234- case 17: // 揚陸艦
235- case 21: // 練巡
236- case 22: // 補給艦
237- return true;
238- }
239- return false;
240- }
241- }
242-
243- public bool IsRepairShip => ShipType == 19;
244-
245- public bool IsTrainingCruiser => ShipType == 21;
246- }
247111 }
\ No newline at end of file
--- /dev/null
+++ b/KancolleSniffer/Model/ShipSpec.cs
@@ -0,0 +1,154 @@
1+// Copyright (C) 2018 Kazuhiro Fujieda <fujieda@users.osdn.me>
2+//
3+// Licensed under the Apache License, Version 2.0 (the "License");
4+// you may not use this file except in compliance with the License.
5+// You may obtain a copy of the License at
6+//
7+// http://www.apache.org/licenses/LICENSE-2.0
8+//
9+// Unless required by applicable law or agreed to in writing, software
10+// distributed under the License is distributed on an "AS IS" BASIS,
11+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+// See the License for the specific language governing permissions and
13+// limitations under the License.
14+
15+using System;
16+
17+namespace KancolleSniffer.Model
18+{
19+ public class ShipSpec
20+ {
21+ public int Id { get; set; }
22+ public bool IsEnemy => ShipMaster.IsEnemyId(Id);
23+ public int SortNo { get; set; }
24+ public string Name { get; set; }
25+ public int FuelMax { get; set; }
26+ public int BullMax { get; set; }
27+ public int SlotNum { get; set; }
28+ public Func<int[]> GetMaxEq { get; set; }
29+ public int[] MaxEq => GetMaxEq?.Invoke();
30+ public Func<int> GetNumEquips { get; set; }
31+ public Action<int> SetNumEquips { get; set; }
32+
33+ public int NumEquips
34+ {
35+ get => GetNumEquips();
36+ set => SetNumEquips(value);
37+ }
38+
39+ public int ShipType { get; set; }
40+ public int ShipClass { get; set; }
41+ public string ShipTypeName { get; set; }
42+ public RemodelInfo Remodel { get; } = new RemodelInfo();
43+
44+ public class RemodelInfo
45+ {
46+ public int Level { get; set; }
47+ public int After { get; set; }
48+ public int Base { get; set; } // 艦隊晒しページ用
49+ public int Step { get; set; } // 同上
50+ }
51+
52+ public ShipSpec()
53+ {
54+ Id = -1;
55+ Name = "";
56+ }
57+
58+ public double RepairWeight
59+ {
60+ get
61+ {
62+ switch (ShipType)
63+ {
64+ case 1: // 海防艦
65+ case 13: // 潜水艦
66+ return 0.5;
67+ case 2: // 駆逐艦
68+ case 3: // 軽巡洋艦
69+ case 4: // 重雷装巡洋艦
70+ case 14: // 潜水空母
71+ case 16: // 水上機母艦
72+ case 17: // 揚陸艦
73+ case 21: // 練習巡洋艦
74+ case 22: // 補給艦
75+ return 1.0;
76+ case 5: // 重巡洋艦
77+ case 6: // 航空巡洋艦
78+ case 7: // 軽空母
79+ case 8: // 高速戦艦
80+ case 20: // 潜水母艦
81+ return 1.5;
82+ case 9: // 低速戦艦
83+ case 10: // 航空戦艦
84+ case 11: // 正規空母
85+ case 18: // 装甲空母
86+ case 19: // 工作艦
87+ return 2.0;
88+ }
89+ return 1.0;
90+ }
91+ }
92+
93+ public double TransportPoint
94+ {
95+ get
96+ {
97+ switch (ShipType)
98+ {
99+ case 2:
100+ return 5.0;
101+ case 3:
102+ return Id == 487 ? 10.0 : 2.0; // 鬼怒改二は大発分を加算
103+ case 6:
104+ return 4.0;
105+ case 10:
106+ return 7.0;
107+ case 16:
108+ return 9.0;
109+ case 17:
110+ return 12.0;
111+ case 20:
112+ return 7.0;
113+ case 21:
114+ return 6.0;
115+ case 22:
116+ return 15.0;
117+ default:
118+ return 0;
119+ }
120+ }
121+ }
122+
123+ public bool IsSubmarine => ShipType == 13 || ShipType == 14;
124+
125+ public bool IsAircraftCarrier => ShipType == 7 || ShipType == 11 || ShipType == 18;
126+
127+ public bool IsAntiSubmarine
128+ {
129+ get
130+ {
131+ switch (ShipType)
132+ {
133+ case 1: // 海防艦
134+ case 2: // 駆逐
135+ case 3: // 軽巡
136+ case 4: // 雷巡
137+ case 6: // 航巡
138+ case 7: // 軽空
139+ case 10: // 航戦
140+ case 16: // 水母
141+ case 17: // 揚陸艦
142+ case 21: // 練巡
143+ case 22: // 補給艦
144+ return true;
145+ }
146+ return false;
147+ }
148+ }
149+
150+ public bool IsRepairShip => ShipType == 19;
151+
152+ public bool IsTrainingCruiser => ShipType == 21;
153+ }
154+}
\ No newline at end of file
旧リポジトリブラウザで表示