#![allow(dead_code)]
use std::collections::HashMap;
use std::collections::HashSet;
use std::num::NonZeroU32;
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 {
pub skill: &'static str,
pub tier: u8,
pub column: u8,
pub group: SkillGroup,
}
struct Layout {
min_build: NonZeroU32,
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,
_ => &[],
}
}
}
pub fn skill_grid(version: &Version, species: Species) -> Option<&'static [GridSlot]> {
modern_grid(version, species).or_else(|| old_grid(version))
}
#[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>,
pub point_cost: Option<SkillPointCost>,
pub learned: bool,
}
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct SkillGridRow {
pub point_cost: Option<SkillPointCost>,
pub skills: Vec<SkillGridSkill>,
}
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
}
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,
}
}
pub fn build_skill_grid(
crew: Option<&Crew>,
learned: &HashSet<CrewSkillType>,
species: Species,
metadata: &GameMetadataProvider,
version: &Version,
) -> Vec<SkillGridRow> {
let Some(crew) = crew else {
return Vec::new();
};
let grid = skill_grid(version, 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 {
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)
}
}
fn modern_grid(version: &Version, species: Species) -> Option<&'static [GridSlot]> {
let chosen = match version.build_number() {
Some(build) => {
let mut chosen: Option<&Layout> = None;
for layout in LAYOUTS {
if layout.min_build.get() <= build {
chosen = Some(layout);
} else {
break;
}
}
chosen
}
None => LAYOUTS.last(),
};
match chosen?.species(species) {
[] => None,
slots => Some(slots),
}
}
fn old_grid(version: &Version) -> Option<&'static [GridSlot]> {
match version.build_number() {
Some(build) => {
let mut chosen: Option<&'static [GridSlot]> = None;
for (min_build, slots) in OLD_LAYOUTS {
if min_build.get() <= build {
chosen = Some(slots);
} else {
break;
}
}
chosen
}
None => OLD_LAYOUTS.last().map(|(_, slots)| *slots),
}
}
static LAYOUTS: &[Layout] = &[
Layout {
min_build: NonZeroU32::new(3343484).unwrap(),
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 },
],
},
Layout {
min_build: NonZeroU32::new(3912232).unwrap(),
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 },
],
},
Layout {
min_build: NonZeroU32::new(4365481).unwrap(),
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 },
],
},
Layout {
min_build: NonZeroU32::new(6359964).unwrap(),
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 },
],
},
Layout {
min_build: NonZeroU32::new(12116141).unwrap(),
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: &[(NonZeroU32, &[GridSlot])] = &[
(
NonZeroU32::new(296659).unwrap(),
&[
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 },
],
),
(
NonZeroU32::new(1325581).unwrap(),
&[
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);
}
fn version_with_build(major: u32, minor: u32, patch: u32, build: u32) -> Version {
Version { major, minor, patch, build: NonZeroU32::new(build) }
}
#[test]
fn modern_grid_selects_previous_layout_just_below_threshold() {
let below = version_with_build(10, 3, 0, 3912231);
let at = version_with_build(10, 4, 0, 3912232);
assert_eq!(
modern_grid(&below, Species::Battleship).map(|s| s.as_ptr()),
modern_grid(&version_with_build(10, 0, 0, 3343484), Species::Battleship).map(|s| s.as_ptr())
);
assert_ne!(
modern_grid(&below, Species::Battleship).map(|s| s.as_ptr()),
modern_grid(&at, Species::Battleship).map(|s| s.as_ptr())
);
}
#[test]
fn modern_grid_at_or_above_threshold_picks_that_layout() {
let at = version_with_build(10, 7, 2, 4365481);
let above = version_with_build(11, 0, 0, 5045210);
assert_eq!(
modern_grid(&at, Species::Battleship).map(|s| s.as_ptr()),
modern_grid(&above, Species::Battleship).map(|s| s.as_ptr())
);
}
#[test]
fn modern_grid_newer_than_newest_threshold_fails_open_to_latest() {
let future = version_with_build(16, 0, 0, 99_999_999);
let newest = LAYOUTS.last().unwrap().species(Species::Battleship);
assert_eq!(modern_grid(&future, Species::Battleship).unwrap().as_ptr(), newest.as_ptr());
}
#[test]
fn modern_grid_unknown_build_fails_open_to_latest() {
let no_build = Version::base(16, 0, 0);
let newest = LAYOUTS.last().unwrap().species(Species::Battleship);
assert_eq!(modern_grid(&no_build, Species::Battleship).unwrap().as_ptr(), newest.as_ptr());
}
#[test]
fn old_grid_selected_for_pre_rework_build() {
let old = version_with_build(8, 0, 2, 1325581);
assert!(modern_grid(&old, Species::Battleship).is_none());
assert!(old_grid(&old).is_some());
assert!(skill_grid(&old, Species::Battleship).is_some());
}
#[test]
fn skill_grid_none_before_oldest_layout() {
let ancient = version_with_build(0, 6, 12, 200000);
assert!(skill_grid(&ancient, Species::Battleship).is_none());
}
#[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();
assert_eq!(point_cost_for_species(&skill, Species::Battleship), Some(SkillPointCost::new(1)));
assert_eq!(point_cost_for_species(&skill, Species::Airship), None);
}
}