wowsunpack 0.37.1

Utility for interacting with World of Warships game assets
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
//! GENERATED by scripts/gen_skill_grid_rs.py from scripts/skill_grids.json.
//! Do not edit by hand. Modern (>=0.10) captain skill grid layout, per build
//! threshold and ship species, reverse-engineered from the client's
//! SKILLS_BY_SHIP_TYPE table. Pre-0.10 builds carry tier+column in GameParams
//! instead and are not covered here. Regenerate after adding game versions.
#![allow(dead_code)]

use std::collections::HashMap;
use std::collections::HashSet;

use super::provider::GameMetadataProvider;
use super::types::Crew;
use super::types::CrewSkill;
use super::types::CrewSkillName;
use super::types::CrewSkillType;
use super::types::SkillPointCost;
use super::types::Species;
use crate::data::Version;

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SkillGroup {
    Attack,
    Defence,
    Support,
    Acumen,
}

#[derive(Clone, Copy, Debug)]
pub struct GridSlot {
    /// Skill internal name (matches `CrewSkill::internal_name`).
    pub skill: &'static str,
    /// 0-based tier (row); point cost is `tier + 1`.
    pub tier: u8,
    /// 1-based column within the tier.
    pub column: u8,
    pub group: SkillGroup,
}

struct Layout {
    min_build: u32,
    air_carrier: &'static [GridSlot],
    battleship: &'static [GridSlot],
    cruiser: &'static [GridSlot],
    destroyer: &'static [GridSlot],
    submarine: &'static [GridSlot],
    auxiliary: &'static [GridSlot],
}

impl Layout {
    fn species(&self, s: Species) -> &'static [GridSlot] {
        match s {
            Species::AirCarrier => self.air_carrier,
            Species::Battleship => self.battleship,
            Species::Cruiser => self.cruiser,
            Species::Destroyer => self.destroyer,
            Species::Submarine => self.submarine,
            Species::Auxiliary => self.auxiliary,
            _ => &[],
        }
    }
}

/// The captain skill grid for a ship `species` at game build `build`, as rows of
/// `GridSlot` ordered by tier then column. Returns the modern per-species layout
/// for >=0.10 builds and the shared pre-rework layout for older ones. `None` when
/// no grid is known: `species` has no captain grid, or `build` predates the
/// oldest extracted layout.
pub fn skill_grid(build: u32, species: Species) -> Option<&'static [GridSlot]> {
    modern_grid(build, species).or_else(|| old_grid(build))
}

/// One skill in a SkillGridRow, translated and flagged learned. Carries the
/// stable CrewSkillName as its identity. `point_cost` is `None` when the cost
/// for this ship species is unknown (event ships not enumerated by CrewSkillTiers).
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct SkillGridSkill {
    pub internal_name: CrewSkillName,
    pub skill_type: CrewSkillType,
    pub name: Option<String>,
    pub description: Option<String>,
    /// Cost is `None` when the skill's cost for this ship species is not known
    /// (event ship species not enumerated by `CrewSkillTiers`); never defaulted.
    pub point_cost: Option<SkillPointCost>,
    pub learned: bool,
}

/// A row of the captain skill grid: all skills sharing one point cost, or `None` for species with no cost table.
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct SkillGridRow {
    pub point_cost: Option<SkillPointCost>,
    pub skills: Vec<SkillGridSkill>,
}

/// Group a tier-ordered list of skills into rows by point cost. The input must
/// already be ordered so equal-cost skills are adjacent.
fn group_into_rows(skills: Vec<SkillGridSkill>) -> Vec<SkillGridRow> {
    let mut rows: Vec<SkillGridRow> = Vec::new();
    for skill in skills {
        match rows.last_mut() {
            Some(row) if row.point_cost == skill.point_cost => row.skills.push(skill),
            _ => rows.push(SkillGridRow { point_cost: skill.point_cost, skills: vec![skill] }),
        }
    }
    rows
}

/// A skill's point cost for a species, or `None` for a species with no captain
/// grid (e.g. event ships) rather than panicking. Avoids
/// `CrewSkillTiers::get_for_species`, which panics on such species.
fn point_cost_for_species(skill: &CrewSkill, species: Species) -> Option<SkillPointCost> {
    let tiers = skill.tier();
    match species {
        Species::AirCarrier => Some(tiers.aircraft_carrier()),
        Species::Battleship => Some(tiers.battleship()),
        Species::Cruiser => Some(tiers.cruiser()),
        Species::Destroyer => Some(tiers.destroyer()),
        Species::Submarine => Some(tiers.submarine()),
        Species::Auxiliary => Some(tiers.auxiliary()),
        _ => None,
    }
}

/// Lay out a captain's full per-species skill grid as rows ordered by point
/// cost, flagging the skills in `learned`. Modern builds (>=0.10) use the
/// reverse-engineered grid table; older builds fall back to listing only the
/// learned skills. Returns an empty vec when `crew` is absent or no skills apply.
pub fn build_skill_grid(
    crew: Option<&Crew>,
    learned: &HashSet<CrewSkillType>,
    species: Species,
    build: u32,
    metadata: &GameMetadataProvider,
    version: &Version,
) -> Vec<SkillGridRow> {
    let Some(crew) = crew else {
        return Vec::new();
    };

    let grid = skill_grid(build, species);

    if let Some(grid) = grid {
        let by_name: HashMap<&str, &CrewSkill> =
            crew.skills().into_iter().flatten().map(|s| (s.internal_name().as_str(), s)).collect();
        let mut skills: Vec<SkillGridSkill> = Vec::new();
        for slot in grid {
            // Skip a layout entry whose skill this build's params do not define.
            let Some(skill) = by_name.get(slot.skill).copied() else {
                continue;
            };
            skills.push(SkillGridSkill {
                internal_name: skill.internal_name().clone(),
                skill_type: skill.skill_type(),
                name: skill.translated_name(metadata, version),
                description: skill.description(species, metadata, version),
                point_cost: Some(SkillPointCost::from_grid_row(slot.tier)),
                learned: learned.contains(&skill.skill_type()),
            });
        }
        group_into_rows(skills)
    } else {
        let mut all: Vec<SkillGridSkill> = learned
            .iter()
            .filter_map(|st| crew.skill_by_type(*st))
            .map(|skill| SkillGridSkill {
                internal_name: skill.internal_name().clone(),
                skill_type: skill.skill_type(),
                name: skill.translated_name(metadata, version),
                description: skill.description(species, metadata, version),
                point_cost: point_cost_for_species(skill, species),
                learned: true,
            })
            .collect();
        all.sort_by_key(|s| (s.point_cost, s.skill_type));
        group_into_rows(all)
    }
}

/// Modern (>=0.10) per-species layout. Picks the layout with the largest
/// `min_build <= build`; `None` if no layout applies or the species is gridless.
fn modern_grid(build: u32, species: Species) -> Option<&'static [GridSlot]> {
    let mut chosen: Option<&Layout> = None;
    for layout in LAYOUTS {
        if layout.min_build <= build {
            chosen = Some(layout);
        } else {
            break;
        }
    }
    match chosen?.species(species) {
        [] => None,
        slots => Some(slots),
    }
}

/// Pre-rework (<0.10) shared grid from GameParams (tier+column per skill).
/// `group` is unset (Attack) -- pre-rework skills carry no group and the UI
/// orders by tier+column only. `None` if `build` predates the oldest layout.
fn old_grid(build: u32) -> Option<&'static [GridSlot]> {
    let mut chosen: Option<&'static [GridSlot]> = None;
    for (min_build, slots) in OLD_LAYOUTS {
        if *min_build <= build {
            chosen = Some(slots);
        } else {
            break;
        }
    }
    chosen
}

static LAYOUTS: &[Layout] = &[
    // 10.0.0
    Layout {
        min_build: 3343484,
        air_carrier: &[
            GridSlot { skill: "PlanesForsageRenewal", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesForsageDuration", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesConsumablesSpeedboosterReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesReload", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "ConsumablesFighterAdditional", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesConsumablesCallfightersRange", tier: 0, column: 6, group: SkillGroup::Support },
            GridSlot { skill: "PlanesTorpedoArmingrange", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesTorpedoSpeed", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesSpeed", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot {
                skill: "PlanesConsumablesRegeneratehealthUpgrade",
                tier: 1,
                column: 4,
                group: SkillGroup::Defence,
            },
            GridSlot { skill: "AaDamageConstantBubblesCv", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot {
                skill: "PlanesConsumablesCallfightersAdditional",
                tier: 1,
                column: 6,
                group: SkillGroup::Support,
            },
            GridSlot { skill: "PlanesAimingBoost", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesApDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "HeFireProbabilityCv", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesDefenseDamageConstant", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesHp", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesConsumablesCallfightersUpgrade", tier: 2, column: 6, group: SkillGroup::Support },
            GridSlot { skill: "PlanesDivebomberSpeed", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesTorpedoUwReduced", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaUpgrade", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesDefenseDamageBubbles", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionVisibilityCrashcrew", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot {
                skill: "PlanesConsumablesCallfightersPreparationtime",
                tier: 3,
                column: 6,
                group: SkillGroup::Support,
            },
        ],
        battleship: &[
            GridSlot { skill: "GmShellReload", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "HeFireProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesCrashcrewRegencrewReload", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseCritProbability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmTurn", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionTorpedoRange", tier: 1, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "ApDamageBb", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaRange", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DefenceCritFireFlooding", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DefenceUw", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAccuracy", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerGmAtbaReloadBb", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesCrashcrewRegencrewUpgrade", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenceFireProbability", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        cruiser: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        destroyer: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoFloodingProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseCritProbability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageDd", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmReloadAaDamageConstant", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmRangeAaDamageBubbles", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeed", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerGmReload", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerSpreading", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        submarine: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        auxiliary: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
    },
    // 10.4.0
    Layout {
        min_build: 3912232,
        air_carrier: &[
            GridSlot { skill: "PlanesForsageRenewal", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesForsageDuration", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesConsumablesSpeedboosterReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesReload", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "ConsumablesFighterAdditional", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesConsumablesCallfightersRange", tier: 0, column: 6, group: SkillGroup::Support },
            GridSlot { skill: "PlanesTorpedoArmingrange", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesTorpedoSpeed", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesSpeed", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot {
                skill: "PlanesConsumablesRegeneratehealthUpgrade",
                tier: 1,
                column: 4,
                group: SkillGroup::Defence,
            },
            GridSlot { skill: "AaDamageConstantBubblesCv", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot {
                skill: "PlanesConsumablesCallfightersAdditional",
                tier: 1,
                column: 6,
                group: SkillGroup::Support,
            },
            GridSlot { skill: "PlanesAimingBoost", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesApDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "HeFireProbabilityCv", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesDefenseDamageConstant", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesHp", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesConsumablesCallfightersUpgrade", tier: 2, column: 6, group: SkillGroup::Support },
            GridSlot { skill: "PlanesDivebomberSpeed", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesTorpedoUwReduced", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaUpgrade", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesDefenseDamageBubbles", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionVisibilityCrashcrew", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot {
                skill: "PlanesConsumablesCallfightersPreparationtime",
                tier: 3,
                column: 6,
                group: SkillGroup::Support,
            },
        ],
        battleship: &[
            GridSlot { skill: "GmShellReload", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "HeFireProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesCrashcrewRegencrewReload", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseCritProbability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmTurn", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionTorpedoRange", tier: 1, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "ApDamageBb", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaRange", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DefenceCritFireFlooding", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DefenceUw", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerSpeedBb", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerGmAtbaReloadBb", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesCrashcrewRegencrewUpgrade", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenceFireProbability", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        cruiser: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        destroyer: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoFloodingProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseCritProbability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageDd", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmReloadAaDamageConstant", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmRangeAaDamageBubbles", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeed", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerGmReload", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerSpreading", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        submarine: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        auxiliary: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
    },
    // 10.7.2
    Layout {
        min_build: 4365481,
        air_carrier: &[
            GridSlot { skill: "PlanesForsageRenewal", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesForsageDuration", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesConsumablesSpeedboosterReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesReload", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "ConsumablesFighterAdditional", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesConsumablesCallfightersRange", tier: 0, column: 6, group: SkillGroup::Support },
            GridSlot { skill: "PlanesTorpedoArmingrange", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesTorpedoSpeed", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesSpeed", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot {
                skill: "PlanesConsumablesRegeneratehealthUpgrade",
                tier: 1,
                column: 4,
                group: SkillGroup::Defence,
            },
            GridSlot { skill: "AaDamageConstantBubblesCv", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot {
                skill: "PlanesConsumablesCallfightersAdditional",
                tier: 1,
                column: 6,
                group: SkillGroup::Support,
            },
            GridSlot { skill: "PlanesAimingBoost", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesApDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "HeFireProbabilityCv", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesDefenseDamageConstant", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesHp", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesConsumablesCallfightersUpgrade", tier: 2, column: 6, group: SkillGroup::Support },
            GridSlot { skill: "PlanesDivebomberSpeed", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesTorpedoUwReduced", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaUpgrade", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesDefenseDamageBubbles", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionVisibilityCrashcrew", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot {
                skill: "PlanesConsumablesCallfightersPreparationtime",
                tier: 3,
                column: 6,
                group: SkillGroup::Support,
            },
        ],
        battleship: &[
            GridSlot { skill: "GmShellReload", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "HeFireProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesCrashcrewRegencrewReload", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseCritProbability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmTurn", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedBb", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionTorpedoRange", tier: 1, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "ApDamageBb", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaRange", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DefenceCritFireFlooding", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DefenceUw", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerBurnGmReload", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerGmAtbaReloadBb", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesCrashcrewRegencrewUpgrade", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenceFireProbability", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        cruiser: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        destroyer: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoFloodingProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseCritProbability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageDd", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmReloadAaDamageConstant", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmRangeAaDamageBubbles", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeed", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerGmReload", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerSpreading", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        submarine: &[
            GridSlot { skill: "TriggerPingerReloadBuff", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoFloodingProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "SubmarineBatteryCapacity", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSeenTorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerConsRudderTimeCoeff", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DefenseCritProbability", tier: 1, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerPingerSpeedBuff", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineHoldSectors", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineConsumablesDuration", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineDangerAlert", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "ArmamentReloadSubmarine", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineTorpedoPingDamage", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerConsSonarTimeCoeff", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineBatteryBurnDown", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "SubmarineSpeed", tier: 3, column: 5, group: SkillGroup::Defence },
        ],
        auxiliary: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
    },
    // 0.11.9
    Layout {
        min_build: 6359964,
        air_carrier: &[
            GridSlot { skill: "PlanesForsageRenewal", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesForsageDuration", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesConsumablesSpeedboosterReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesReload", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "ConsumablesFighterAdditional", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesConsumablesCallfightersRange", tier: 0, column: 6, group: SkillGroup::Support },
            GridSlot { skill: "PlanesTorpedoArmingrange", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesTorpedoSpeed", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesSpeed", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot {
                skill: "PlanesConsumablesRegeneratehealthUpgrade",
                tier: 1,
                column: 4,
                group: SkillGroup::Defence,
            },
            GridSlot { skill: "AaDamageConstantBubblesCv", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot {
                skill: "PlanesConsumablesCallfightersAdditional",
                tier: 1,
                column: 6,
                group: SkillGroup::Support,
            },
            GridSlot { skill: "PlanesAimingBoost", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesApDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "HeFireProbabilityCv", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesDefenseDamageConstant", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesHp", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesConsumablesCallfightersUpgrade", tier: 2, column: 6, group: SkillGroup::Support },
            GridSlot { skill: "PlanesDivebomberSpeed", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesTorpedoUwReduced", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaUpgrade", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesDefenseDamageBubbles", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionVisibilityCrashcrew", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot {
                skill: "PlanesConsumablesCallfightersPreparationtime",
                tier: 3,
                column: 6,
                group: SkillGroup::Support,
            },
        ],
        battleship: &[
            GridSlot { skill: "GmShellReload", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "HeFireProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesCrashcrewRegencrewReload", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseCritProbability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmTurn", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedBb", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionTorpedoRange", tier: 1, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "ApDamageBb", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaRange", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DefenceCritFireFlooding", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DefenceUw", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerBurnGmReload", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerGmAtbaReloadBb", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesCrashcrewRegencrewUpgrade", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenceFireProbability", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        cruiser: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        destroyer: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoFloodingProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseCritProbability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageDd", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmReloadAaDamageConstant", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmRangeAaDamageBubbles", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeed", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerGmReload", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerSpreading", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        submarine: &[
            GridSlot { skill: "TriggerPingerReloadBuff", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoFloodingProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerConsRudderTimeCoeff", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "SubmarineBatteryCapacity", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSeenTorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DefenseCritProbability", tier: 1, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerPingerSpeedBuff", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineHoldSectors", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineConsumablesReload", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineDangerAlert", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "ArmamentReloadSubmarine", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineTorpedoPingDamage", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerConsSonarTimeCoeff", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineBatteryBurnDown", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "SubmarineSpeed", tier: 3, column: 5, group: SkillGroup::Defence },
        ],
        auxiliary: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
    },
    // 15.2.0
    Layout {
        min_build: 12116141,
        air_carrier: &[
            GridSlot { skill: "PlanesForsageRenewal", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesForsageDuration", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesConsumablesSpeedboosterReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesReload", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "ConsumablesFighterAdditional", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesConsumablesCallfightersRange", tier: 0, column: 6, group: SkillGroup::Support },
            GridSlot { skill: "PlanesTorpedoArmingrange", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesTorpedoSpeed", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesSpeed", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot {
                skill: "PlanesConsumablesActiveManeuveringUpgrade",
                tier: 1,
                column: 4,
                group: SkillGroup::Defence,
            },
            GridSlot { skill: "AaDamageConstantBubblesCv", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot {
                skill: "PlanesConsumablesCallfightersAdditional",
                tier: 1,
                column: 6,
                group: SkillGroup::Support,
            },
            GridSlot { skill: "PlanesAimingBoost", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesApDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "HeFireProbabilityCv", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesDefenseDamageConstant", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesHp", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "PlanesConsumablesCallfightersUpgrade", tier: 2, column: 6, group: SkillGroup::Support },
            GridSlot { skill: "PlanesDivebomberSpeed", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesTorpedoUwReduced", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaUpgrade", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "PlanesDefenseDamageBubbles", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionVisibilityCrashcrew", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot {
                skill: "PlanesConsumablesCallfightersPreparationtime",
                tier: 3,
                column: 6,
                group: SkillGroup::Support,
            },
        ],
        battleship: &[
            GridSlot { skill: "GmShellReload", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "HeFireProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesCrashcrewRegencrewReload", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseCritProbability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmTurn", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedBb", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionTorpedoRange", tier: 1, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "ApDamageBb", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaRange", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DefenceCritFireFlooding", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DefenceUw", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerBurnGmReload", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "AtbaAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerGmAtbaReloadBb", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesCrashcrewRegencrewUpgrade", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenceFireProbability", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        cruiser: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        destroyer: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoFloodingProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseCritProbability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageDd", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmReloadAaDamageConstant", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "GmRangeAaDamageBubbles", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeed", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerGmReload", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerSpreading", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
        submarine: &[
            GridSlot { skill: "TriggerPingerReloadBuff", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoFloodingProbability", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerConsRudderTimeCoeff", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 0, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "SubmarineBatteryCapacity", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSeenTorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "DefenseCritProbability", tier: 1, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerPingerSpeedBuff", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineHoldSectors", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineConsumablesReload", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineDangerAlert", tier: 2, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "ArmamentReloadSubmarine", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineTorpedoPingDamage", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerConsSonarTimeCoeff", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "SubmarineBatteryBurnDown", tier: 3, column: 4, group: SkillGroup::Defence },
            GridSlot { skill: "SubmarineSpeed", tier: 3, column: 5, group: SkillGroup::Defence },
        ],
        auxiliary: &[
            GridSlot { skill: "GmTurn", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoSpeed", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesReload", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "GmShellReload", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAlert", tier: 0, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "Maneuverability", tier: 0, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeFireProbability", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReload", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesDuration", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesSpotterUpgrade", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionAiming", tier: 1, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaPrioritysectorDamageConstant", tier: 1, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "HeSapDamage", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoDamage", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ArmamentReloadAaDamage", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "ApDamageCa", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ConsumablesAdditional", tier: 2, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "DefenseHp", tier: 2, column: 6, group: SkillGroup::Defence },
            GridSlot { skill: "TriggerGmAtbaReloadCa", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TriggerSpeedAccuracy", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionDirection", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "HePenetration", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "DetectionVisibilityRange", tier: 3, column: 5, group: SkillGroup::Defence },
            GridSlot { skill: "AaDamageConstantBubbles", tier: 3, column: 6, group: SkillGroup::Defence },
        ],
    },
];

static OLD_LAYOUTS: &[(u32, &[GridSlot])] = &[
    // 0.6.13
    (
        296659,
        &[
            GridSlot { skill: "PriorityTargetModifier", tier: 0, column: 0, group: SkillGroup::Attack },
            GridSlot { skill: "MeticulousPreventionModifier", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "IntuitionModifier", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "PlanePreparingModifier", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "AimingFightersPointModifier", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "FighterEfficiencyModifier", tier: 0, column: 5, group: SkillGroup::Attack },
            GridSlot { skill: "ArtilleryAlertModifier", tier: 0, column: 6, group: SkillGroup::Attack },
            GridSlot { skill: "OutOfAttackModifier", tier: 0, column: 7, group: SkillGroup::Attack },
            GridSlot { skill: "EmergencyTeamCooldownModifier", tier: 1, column: 0, group: SkillGroup::Attack },
            GridSlot { skill: "AllSkillsCooldownModifier", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "MainGunsRotationModifier", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoAcceleratorModifier", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "AdditionalSmokescreensModifier", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "PreparingOnboardShootersModifier", tier: 1, column: 5, group: SkillGroup::Attack },
            GridSlot { skill: "LastChanceModifier", tier: 1, column: 6, group: SkillGroup::Attack },
            GridSlot { skill: "LastEffortModifier", tier: 1, column: 7, group: SkillGroup::Attack },
            GridSlot { skill: "AutoRepairModifier", tier: 2, column: 0, group: SkillGroup::Attack },
            GridSlot { skill: "SurvivalModifier", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReloadModifier", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "ParkingDeckModifier", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "AIGunsEfficiencyModifier", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "SuperintendentModifier", tier: 2, column: 5, group: SkillGroup::Attack },
            GridSlot { skill: "FireProbabilityModifier", tier: 2, column: 6, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoAlertnessModifier", tier: 2, column: 7, group: SkillGroup::Attack },
            GridSlot { skill: "CentralATBAModifier", tier: 3, column: 0, group: SkillGroup::Attack },
            GridSlot { skill: "FireResistanceModifier", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "LandmineExploderModifier", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "AdditionalPlanesInSquadModifier", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "AIGunsRangeModifier", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "CentralAirDefenceModifier", tier: 3, column: 5, group: SkillGroup::Attack },
            GridSlot { skill: "NearEnemyIntuitionModifier", tier: 3, column: 6, group: SkillGroup::Attack },
            GridSlot { skill: "VisibilityModifier", tier: 3, column: 7, group: SkillGroup::Attack },
        ],
    ),
    // 8.0.2
    (
        1325581,
        &[
            GridSlot { skill: "PriorityTargetModifier", tier: 0, column: 0, group: SkillGroup::Attack },
            GridSlot { skill: "MeticulousPreventionModifier", tier: 0, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "IntuitionModifier", tier: 0, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "AirSupremacyModifier", tier: 0, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "AimingFightersPointModifier", tier: 0, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "ForsageDurationModifier", tier: 0, column: 5, group: SkillGroup::Attack },
            GridSlot { skill: "ArtilleryAlertModifier", tier: 0, column: 6, group: SkillGroup::Attack },
            GridSlot { skill: "ForsageRestorationModifier", tier: 0, column: 7, group: SkillGroup::Attack },
            GridSlot { skill: "EmergencyTeamCooldownModifier", tier: 1, column: 0, group: SkillGroup::Attack },
            GridSlot { skill: "AllSkillsCooldownModifier", tier: 1, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "MainGunsRotationModifier", tier: 1, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoAcceleratorModifier", tier: 1, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "AdditionalSmokescreensModifier", tier: 1, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "FlightSpeedModifier", tier: 1, column: 5, group: SkillGroup::Attack },
            GridSlot { skill: "LastChanceModifier", tier: 1, column: 6, group: SkillGroup::Attack },
            GridSlot { skill: "LastEffortModifier", tier: 1, column: 7, group: SkillGroup::Attack },
            GridSlot { skill: "AutoRepairModifier", tier: 2, column: 0, group: SkillGroup::Attack },
            GridSlot { skill: "SurvivalModifier", tier: 2, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoReloadModifier", tier: 2, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "NearAuraDamageTakenModifier", tier: 2, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "AIGunsEfficiencyModifier", tier: 2, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "SuperintendentModifier", tier: 2, column: 5, group: SkillGroup::Attack },
            GridSlot { skill: "FireProbabilityModifier", tier: 2, column: 6, group: SkillGroup::Attack },
            GridSlot { skill: "TorpedoAlertnessModifier", tier: 2, column: 7, group: SkillGroup::Attack },
            GridSlot { skill: "CentralATBAModifier", tier: 3, column: 0, group: SkillGroup::Attack },
            GridSlot { skill: "FireResistanceModifier", tier: 3, column: 1, group: SkillGroup::Attack },
            GridSlot { skill: "LandmineExploderModifier", tier: 3, column: 2, group: SkillGroup::Attack },
            GridSlot { skill: "AccuracyIncreaseRateModifier", tier: 3, column: 3, group: SkillGroup::Attack },
            GridSlot { skill: "AIGunsRangeModifier", tier: 3, column: 4, group: SkillGroup::Attack },
            GridSlot { skill: "CentralAirDefenceModifier", tier: 3, column: 5, group: SkillGroup::Attack },
            GridSlot { skill: "NearEnemyIntuitionModifier", tier: 3, column: 6, group: SkillGroup::Attack },
            GridSlot { skill: "VisibilityModifier", tier: 3, column: 7, group: SkillGroup::Attack },
        ],
    ),
];

#[cfg(test)]
mod build_skill_grid_tests {
    use super::*;
    use crate::game_params::types::CrewSkillType;
    use crate::game_params::types::SkillPointCost;

    #[test]
    fn rows_are_grouped_by_point_cost() {
        let a = SkillGridSkill {
            internal_name: "A".into(),
            skill_type: CrewSkillType::new(1),
            name: None,
            description: None,
            point_cost: Some(SkillPointCost::new(1)),
            learned: false,
        };
        let b = SkillGridSkill { point_cost: Some(SkillPointCost::new(1)), ..a.clone() };
        let c = SkillGridSkill { point_cost: Some(SkillPointCost::new(2)), ..a.clone() };
        let rows = group_into_rows(vec![a, b, c]);
        assert_eq!(rows.len(), 2);
        assert_eq!(rows[0].point_cost, Some(SkillPointCost::new(1)));
        assert_eq!(rows[0].skills.len(), 2);
        assert_eq!(rows[1].point_cost, Some(SkillPointCost::new(2)));
        assert_eq!(rows[1].skills.len(), 1);
    }

    #[test]
    fn point_cost_is_none_for_ungridded_species() {
        use crate::game_params::types::CrewSkill;
        use crate::game_params::types::CrewSkillTiers;
        let tiers = CrewSkillTiers::builder()
            .aircraft_carrier(SkillPointCost::new(1))
            .auxiliary(SkillPointCost::new(1))
            .battleship(SkillPointCost::new(1))
            .cruiser(SkillPointCost::new(1))
            .destroyer(SkillPointCost::new(1))
            .submarine(SkillPointCost::new(1))
            .build();
        let skill = CrewSkill::builder()
            .internal_name("Test".into())
            .can_be_learned(true)
            .is_epic(false)
            .skill_type(CrewSkillType::new(1))
            .tier(tiers)
            .ui_treat_as_trigger(false)
            .build();
        // gridded species resolve to a cost
        assert_eq!(point_cost_for_species(&skill, Species::Battleship), Some(SkillPointCost::new(1)));
        // event-ship species (e.g. Airship) have no entry in CrewSkillTiers
        assert_eq!(point_cost_for_species(&skill, Species::Airship), None);
    }
}