| Line 245: |
Line 245: |
| | end | | end |
| | | | |
| − | function ShipCapabilities:_attack_power_cap(attack_power, cap)
| + | -- Basic attack power for shelling and carrier shelling. |
| − | --if attack_power > cap then
| |
| − | -- return math.floor(cap + math.sqrt(attack_power - cap))
| |
| − | --end
| |
| − | return math.floor(attack_power)
| |
| − | end
| |
| − | | |
| | function ShipCapabilities:day_battle() | | function ShipCapabilities:day_battle() |
| | if not self:_is_submarine() then | | if not self:_is_submarine() then |
| Line 270: |
Line 264: |
| | end | | end |
| | end | | end |
| − | return 1, self:_attack_power_cap(firepower + 5, 150) | + | return 1, 5 + firepower |
| | end | | end |
| | else | | else |
| Line 301: |
Line 295: |
| | end | | end |
| | if has_planes then | | if has_planes then |
| − | return is_installation and 3 or 2, self:_attack_power_cap(1.5 * (firepower + torpedo) + bombing * 2 + 55, 150) | + | return is_installation and 3 or 2, 55 + math.floor(1.5 * (firepower + torpedo + math.floor(1.3 * bombing))) |
| | end | | end |
| | end | | end |
| Line 311: |
Line 305: |
| | function ShipCapabilities:format_day_battle(mode, attack_power) | | function ShipCapabilities:format_day_battle(mode, attack_power) |
| | if mode then | | if mode then |
| − | return format{self._attack_template, mode = self._day_battle_modes[mode], attack_power = attack_power} | + | return format{self._attack_template, mode = self._day_battle_modes[mode], attack_power = math.floor(attack_power)} |
| | elseif mode == false then | | elseif mode == false then |
| | return "No Action" | | return "No Action" |
| Line 318: |
Line 312: |
| | end | | end |
| | | | |
| | + | -- Basic attack power for closing torpedo. |
| | function ShipCapabilities:closing_torpedo() | | function ShipCapabilities:closing_torpedo() |
| | local torpedo = self._ship:torpedo_leveled() | | local torpedo = self._ship:torpedo_leveled() |
| Line 330: |
Line 325: |
| | end | | end |
| | end | | end |
| − | return self:_attack_power_cap(torpedo + 5, 150) | + | return 5 + torpedo |
| | end | | end |
| | return false | | return false |
| Line 337: |
Line 332: |
| | function ShipCapabilities:format_torpedo(attack_power) | | function ShipCapabilities:format_torpedo(attack_power) |
| | if attack_power then | | if attack_power then |
| − | return tostring(attack_power) | + | return tostring(math.floor(attack_power)) |
| | end | | end |
| | return "No" | | return "No" |
| Line 344: |
Line 339: |
| | ShipCapabilities.format_closing_torpedo = ShipCapabilities.format_torpedo | | ShipCapabilities.format_closing_torpedo = ShipCapabilities.format_torpedo |
| | | | |
| | + | -- Detect possible day time special attack modifiers (post-cap). |
| | function ShipCapabilities:artillery_spotting() | | function ShipCapabilities:artillery_spotting() |
| | local total_space = self._ship:total_space() | | local total_space = self._ship:total_space() |
| Line 393: |
Line 389: |
| | end | | end |
| | | | |
| | + | -- Basic attack power for night battle carrier shelling. |
| | + | -- Or basic attack power for night battle attack * detected night special attack modifier (pre-cap). |
| | function ShipCapabilities:night_battle() | | function ShipCapabilities:night_battle() |
| | local main_guns, secondary_guns, torpedoes, has_planes, firepower, torpedo = 0, 0, 0, false, self._ship:firepower_leveled(), self._ship:torpedo_leveled() | | local main_guns, secondary_guns, torpedoes, has_planes, firepower, torpedo = 0, 0, 0, false, self._ship:firepower_leveled(), self._ship:torpedo_leveled() |
| Line 426: |
Line 424: |
| | if self:_is_carrier() then | | if self:_is_carrier() then |
| | if has_planes and self._ship:night_bombing() then | | if has_planes and self._ship:night_bombing() then |
| − | return 8, self:_attack_power_cap(firepower + torpedo, 300) | + | return 8, firepower + torpedo |
| | end | | end |
| | return false | | return false |
| | else | | else |
| | if torpedoes >= 2 and torpedo > 0 then | | if torpedoes >= 2 and torpedo > 0 then |
| − | return 7, self:_attack_power_cap((firepower + torpedo) * 1.5, 300) | + | return 7, (firepower + torpedo) * 1.5 |
| | elseif main_guns >= 3 and firepower > 0 then | | elseif main_guns >= 3 and firepower > 0 then |
| − | return 4, self:_attack_power_cap((firepower + torpedo) * 2, 300) | + | return 4, (firepower + torpedo) * 2 |
| | elseif main_guns >= 2 and secondary_guns >= 1 and firepower > 0 then | | elseif main_guns >= 2 and secondary_guns >= 1 and firepower > 0 then |
| − | return 5, self:_attack_power_cap((firepower + torpedo) * 1.75, 300) | + | return 5, (firepower + torpedo) * 1.75 |
| | elseif main_guns >= 1 and torpedoes == 1 and firepower > 0 and torpedo > 0 then | | elseif main_guns >= 1 and torpedoes == 1 and firepower > 0 and torpedo > 0 then |
| − | return 6, self:_attack_power_cap((firepower + torpedo) * 1.3, 300) | + | return 6, (firepower + torpedo) * 1.3 |
| | elseif main_guns + secondary_guns >= 2 and firepower > 0 then | | elseif main_guns + secondary_guns >= 2 and firepower > 0 then |
| − | return 3, self:_attack_power_cap((firepower + torpedo) * 1.2, 300) | + | return 3, (firepower + torpedo) * 1.2 |
| | elseif torpedoes > 0 and torpedo > 0 then | | elseif torpedoes > 0 and torpedo > 0 then |
| − | return 2, self:_attack_power_cap(firepower + torpedo, 300) | + | return 2, firepower + torpedo |
| | elseif firepower > 0 then | | elseif firepower > 0 then |
| − | return 1, self:_attack_power_cap(firepower + torpedo, 300) | + | return 1, firepower + torpedo |
| | else | | else |
| | return false | | return false |
| Line 454: |
Line 452: |
| | local multiplier = self._night_battle_attack_counts[mode] | | local multiplier = self._night_battle_attack_counts[mode] |
| | if multiplier then | | if multiplier then |
| − | attack_power = tostring(attack_power) .. " " .. multiplier | + | attack_power = tostring(math.floor(attack_power)) .. " " .. multiplier |
| | end | | end |
| | return format{self._attack_template, mode = self._night_battle_modes[mode], attack_power = attack_power} | | return format{self._attack_template, mode = self._night_battle_modes[mode], attack_power = attack_power} |
| Line 463: |
Line 461: |
| | end | | end |
| | | | |
| | + | -- Basic attack power for opening torpedo. |
| | function ShipCapabilities:opening_torpedo() | | function ShipCapabilities:opening_torpedo() |
| | local torpedo = self._ship:torpedo_leveled() | | local torpedo = self._ship:torpedo_leveled() |
| Line 488: |
Line 487: |
| | end | | end |
| | if opening_torpedo then | | if opening_torpedo then |
| − | return self:_attack_power_cap(torpedo + 5, 150) | + | return 5 + torpedo |
| | end | | end |
| | return false | | return false |
| Line 495: |
Line 494: |
| | ShipCapabilities.format_opening_torpedo = ShipCapabilities.format_torpedo | | ShipCapabilities.format_opening_torpedo = ShipCapabilities.format_torpedo |
| | | | |
| | + | -- Basic attack power for ASW attack * sonar w/ depth charge modifier (pre-cap). |
| | function ShipCapabilities:asw_attack() | | function ShipCapabilities:asw_attack() |
| | local base_asw | | local base_asw |
| Line 501: |
Line 501: |
| | return false | | return false |
| | elseif self:_is_asw_surface_ship() then | | elseif self:_is_asw_surface_ship() then |
| − | base_asw = 25 | + | base_asw = 13 |
| | elseif self:_is_asw_aviation_ship() then | | elseif self:_is_asw_aviation_ship() then |
| − | base_asw = 10 | + | base_asw = 8 |
| | if not self._ship:night_bombing() then | | if not self._ship:night_bombing() then |
| | night = false | | night = false |
| Line 511: |
Line 511: |
| | end | | end |
| | local asw_leveled = self._ship:asw_leveled() | | local asw_leveled = self._ship:asw_leveled() |
| − | local ship_asw, equipment_asw, depth_charge, sonar, bomber = (asw_leveled or 0) / 5, 0, false, false, false | + | local ship_asw, equipment_asw, depth_charge, sonar, bomber = (asw_leveled or 0), 0, false, false, false |
| | for i = 1, self._ship:slots() or 0 do | | for i = 1, self._ship:slots() or 0 do |
| | local equipment, size = self._ship:slot(i) | | local equipment, size = self._ship:slot(i) |
| Line 534: |
Line 534: |
| | depth_charge_sonar_boost = 1.15 | | depth_charge_sonar_boost = 1.15 |
| | end | | end |
| − | return self:_attack_power_cap(depth_charge_sonar_boost * (base_asw + 2 * equipment_asw + ship_asw / 5), 100), day, night, not asw_leveled | + | return depth_charge_sonar_boost * (base_asw + 1.5 * equipment_asw + 2 * math.sqrt(ship_asw)), day, night, not asw_leveled |
| | end | | end |
| | | | |
| | function ShipCapabilities:format_asw_attack(attack_power, day, night, uncertain) | | function ShipCapabilities:format_asw_attack(attack_power, day, night, uncertain) |
| | if attack_power then | | if attack_power then |
| | + | attack_power = math.floor(attack_power) |
| | local phases = {} | | local phases = {} |
| | if day then | | if day then |
| Line 557: |
Line 558: |
| | end | | end |
| | | | |
| | + | -- Basic attack power for opening airstrike (returns an array with attack values per each bomber). |
| | function ShipCapabilities:opening_airstrike() | | function ShipCapabilities:opening_airstrike() |
| | if not self:_is_aviation_ship() then | | if not self:_is_aviation_ship() then |
| Line 566: |
Line 568: |
| | if size and size > 0 and equipment and self:_is_bomber(equipment) then | | if size and size > 0 and equipment and self:_is_bomber(equipment) then |
| | local equipment_torpedo, equipment_bombing = equipment:torpedo() or 0, equipment:bombing() or 0 | | local equipment_torpedo, equipment_bombing = equipment:torpedo() or 0, equipment:bombing() or 0 |
| − | local attack_power = (equipment_torpedo + equipment_bombing) * math.sqrt(size) + 25
| |
| | if self:_is_torpedo_bomber(equipment) then | | if self:_is_torpedo_bomber(equipment) then |
| − | table.insert(airstrikes, self:_attack_power_cap(attack_power * 1.5, 150)) | + | table.insert(airstrikes, 1.5 * (25 + equipment_torpedo * math.sqrt(size))) -- 0.8 is also possible |
| | else | | else |
| − | table.insert(airstrikes, self:_attack_power_cap(attack_power, 150)) | + | table.insert(airstrikes, 25 + equipment_bombing * math.sqrt(size)) |
| | end | | end |
| | end | | end |
| Line 584: |
Line 585: |
| | local result = {} | | local result = {} |
| | for _, attack in ipairs(attacks) do | | for _, attack in ipairs(attacks) do |
| − | table.insert(result, tostring(attack)) | + | table.insert(result, tostring(math.floor(attack))) |
| | end | | end |
| | return table.concat(result, ",") | | return table.concat(result, ",") |