Line 16: |
Line 16: |
| -- http://wikiwiki.jp/kancolle/?%BB%D9%B1%E7%B4%CF%C2%E2 | | -- http://wikiwiki.jp/kancolle/?%BB%D9%B1%E7%B4%CF%C2%E2 |
| -- | | -- |
| + | |
| + | local engagement_modifiers = { |
| + | green_t = 1.2, |
| + | parallel = 1.0, |
| + | head_on = 0.8, |
| + | red_t = 0.6 |
| + | } |
| + | |
| + | local spotting_modifiers = { |
| + | cut_in = { |
| + | main_second = 1.1, |
| + | main_radar = 1.2, |
| + | main_ap = 1.3, |
| + | main_main = 1.5, |
| + | }, |
| + | double = 1.2 |
| + | } |
| + | |
| + | local comined_fp = { |
| + | ctf_first = 0, |
| + | ctf_second = 10, |
| + | stf_first = 10, |
| + | stf_second = -5 |
| + | } |
| + | |
| + | local comined_torp = -5 |
| + | |
| + | local formation_modifiers = { |
| + | line_ahead = 1.0, |
| + | double_line = 0.8, |
| + | diamond = 0.7, |
| + | echelon = 0.6, |
| + | line_abreast = 0.6, |
| + | combined = { |
| + | line_ahead = 1.1, |
| + | diamond = 0.7, |
| + | double_line = 1.0, |
| + | line_abreast = 0.8, |
| + | } |
| + | } |
| + | |
| + | local health_modifiers = { |
| + | normal = 1.0, |
| + | chuuha = 0.7, |
| + | taiha = 0.4 |
| + | } |
| + | |
| + | function ammo_modifier(ammo) |
| + | return ammo >= 5 and 1 or ammo / 5 |
| + | end |
| + | |
| + | local ap_modifiers = { |
| + | main_ap = 1.08, |
| + | main_ap_radar = 1.1, |
| + | main_second_ap = 1.15, |
| + | main_second_ap_radar = 1.15 |
| + | } |
| + | |
| + | local critical_modifier = 1.5 |
| + | |
| + | local anti_ground_modifier = 2.5 |
| + | local anti_ground_wg_bonus = 75 |
| + | |
| + | local db_cap = 150 |
| + | local nb_cap = 300 |
| + | |
| + | local equip_coeffs = { |
| + | small_gun = 1, |
| + | medium_gun = 1, |
| + | main_gun = 1.5, |
| + | ap = 1, |
| + | torpedo = 1.2, |
| + | } |
| + | |
| + | function default_modifiers(critical) |
| + | return { |
| + | combined_fp = 0, |
| + | combined_torp = 0, |
| + | anti_ground_bonus = 0, |
| + | engagement = engagement_modifiers.parallel, |
| + | formation = formation_modifiers.line_ahead, |
| + | health = health_modifiers.normal, |
| + | anti_ground = 1, |
| + | anti_sub = 1, |
| + | night = 1, |
| + | cap = db_cap, |
| + | spotting = 1, |
| + | contact = 1, |
| + | expert = 1, |
| + | critical = critical and critical_modifier or 1, |
| + | ap = 1, |
| + | ammo = 1, |
| + | } |
| + | end |
| + | |
| + | function shelling_attack_power(fp, equip_bonus, modifiers) |
| + | return 5 + fp + equip_bonus + modifiers.combined_fp + modifiers.anti_ground_bonus |
| + | end |
| + | |
| + | function torpedo_attack_power(torp, equip_bonus, modifiers) |
| + | return 5 + torp + equip_bonus + modifiers.combined_torp |
| + | end |
| + | |
| + | function damage_pre_cap(attack_power, modifiers) |
| + | return |
| + | modifiers.engagement * modifiers.formation * modifiers.health * |
| + | modifiers.anti_ground * modifiers.anti_sub * |
| + | modifiers.night * |
| + | attack_power |
| + | end |
| + | |
| + | function damage_cap(attack_power, modifiers) |
| + | if attack_power > modifiers.cap then |
| + | attack_power = modifiers.cap + math.sqrt(attack_power - modifiers.cap) |
| + | end |
| + | return math.floor(attack_power) |
| + | end |
| + | |
| + | function damage_post_cap(attack_power, modifiers, armor) |
| + | attack_power = |
| + | modifiers.spotting * modifiers.contact * |
| + | math.floor(modifiers.expert * modifiers.critical * |
| + | math.floor(modifiers.ap * attack_power)) |
| + | if armor then |
| + | local min_armor = armor * 0.7 |
| + | local max_armor = armor * 0.7 + math.max(armor - 1, 0) * 0.6 |
| + | local min = math.floor((attack_power - max_armor) * modifiers.ammo) |
| + | local max = math.floor((attack_power - min_armor) * modifiers.ammo) |
| + | return { min, max } |
| + | else |
| + | return math.floor(attack_power * modifiers.ammo) |
| + | end |
| + | end |
| + | |
| + | function damage(attack_power, modifiers, armor) |
| + | return damage_post_cap(damage_cap(damage_pre_cap(attack_power, modifiers), modifiers), modifiers, armor) |
| + | end |
| | | |
| -- * CI rate formula. | | -- * CI rate formula. |