Skip to content

Commit

Permalink
艦隊:内部熟練度を考慮して制空値を範囲表示する設定を追加
Browse files Browse the repository at this point in the history
* 水上戦闘機の改修による制空値ボーナスに対応
  • Loading branch information
andanteyk committed Apr 17, 2017
1 parent 1d8d97e commit 4f22cd1
Show file tree
Hide file tree
Showing 8 changed files with 224 additions and 162 deletions.
20 changes: 20 additions & 0 deletions ElectronicObserver/Data/FleetData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,26 @@ public FleetData()
}
}

/// <summary>
/// 現在の設定に応じて、制空戦力を表す文字列を取得します。
/// </summary>
/// <returns></returns>
public string GetAirSuperiorityString() {
switch ( Utility.Configuration.Config.FormFleet.AirSuperiorityMethod ) {
case 0:
default:
return Calculator.GetAirSuperiorityIgnoreLevel( this ).ToString();
case 1: {
int min = Calculator.GetAirSuperiority( this, false );
int max = Calculator.GetAirSuperiority( this, true );

if ( Utility.Configuration.Config.FormFleet.ShowAirSuperiorityRange && min < max )
return string.Format( "{0} ~ {1}", min, max );
else
return min.ToString();
}
}
}

/// <summary>
/// 現在の設定に応じて、索敵能力を取得します。
Expand Down
6 changes: 6 additions & 0 deletions ElectronicObserver/Utility/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -647,6 +647,11 @@ public class ConfigFormFleet : ConfigPartBase {
/// </summary>
public int FixedShipNameWidth { get; set; }

/// <summary>
/// 制空戦力を範囲表示するか
/// </summary>
public bool ShowAirSuperiorityRange { get; set; }

public ConfigFormFleet() {
ShowAircraft = true;
SearchingAbilityMethod = 4;
Expand All @@ -661,6 +666,7 @@ public class ConfigFormFleet : ConfigPartBase {
BlinkAtCompletion = true;
ShowConditionIcon = true;
FixedShipNameWidth = 40;
ShowAirSuperiorityRange = false;
}
}
/// <summary>[艦隊]ウィンドウ</summary>
Expand Down
53 changes: 28 additions & 25 deletions ElectronicObserver/Utility/Data/Calculator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public static class Calculator {
private static readonly Dictionary<int, double> LevelBonus = new Dictionary<int, double>() {
{ 6, 0.2 }, // 艦上戦闘機
{ 7, 0.25 }, // 艦上爆撃機
{ 45, 0.2 }, // 水上戦闘機
};


Expand All @@ -69,8 +70,9 @@ public static class Calculator {
/// <param name="aircraftLevel">艦載機熟練度。既定値は 0 です。</param>
/// <param name="level">改修レベル。既定値は 0 です。</param>
/// <param name="isAirDefense">基地航空隊による防空戦かどうか。</param>
/// <param name="isAircraftExpMaximum">艦載機の内部熟練度が当該レベルで最大値であるとして計算するか。falseなら最小値として計算します。</param>
/// <returns></returns>
public static int GetAirSuperiority( int equipmentID, int count, int aircraftLevel = 0, int level = 0, bool isAirDefense = false ) {
public static int GetAirSuperiority( int equipmentID, int count, int aircraftLevel = 0, int level = 0, bool isAirDefense = false, bool isAircraftExpMaximum = false ) {

if ( count <= 0 )
return 0;
Expand All @@ -92,8 +94,18 @@ public static class Calculator {
interceptorBonus = eq.Evasion * 1.5;
}

int aircraftExp;
if ( isAircraftExpMaximum ) {
if ( aircraftLevel < 7 )
aircraftExp = AircraftExpTable[aircraftLevel + 1] - 1;
else
aircraftExp = AircraftExpTable.Last();
} else {
aircraftExp = AircraftExpTable[aircraftLevel];
}

return (int)( ( eq.AA + levelBonus * level + interceptorBonus ) * Math.Sqrt( count )
+ Math.Sqrt( AircraftExpTable[aircraftLevel] / 10.0 )
+ Math.Sqrt( aircraftExp / 10.0 )
+ ( AircraftLevelBonus.ContainsKey( category ) ? AircraftLevelBonus[category][aircraftLevel] : 0 ) );
}

Expand All @@ -109,17 +121,6 @@ public static class Calculator {
return slot.Select( ( eq, i ) => GetAirSuperiority( eq, aircraft[i] ) ).Sum();
}

/// <summary>
/// 制空戦力を求めます。
/// </summary>
/// <param name="slot">各スロットの装備IDリスト。</param>
/// <param name="aircraft">艦載機搭載量。</param>
/// <param name="level">各スロットの艦載機熟練度。</param>
/// <returns></returns>
public static int GetAirSuperiority( int[] slot, int[] aircraft, int[] level ) {

return slot.Select( ( eq, i ) => GetAirSuperiority( eq, aircraft[i], level[i] ) ).Sum();
}


/// <summary>
Expand Down Expand Up @@ -158,11 +159,12 @@ public static class Calculator {
/// 制空戦力を求めます。
/// </summary>
/// <param name="ship">対象の艦船。</param>
public static int GetAirSuperiority( ShipData ship ) {
public static int GetAirSuperiority( ShipData ship, bool isAircraftLevelMaximum = false ) {

if ( ship == null ) return 0;

return ship.SlotInstance.Select( ( eq, i ) => eq == null ? 0 : GetAirSuperiority( eq.EquipmentID, ship.Aircraft[i], eq.AircraftLevel, eq.Level ) ).Sum();
return ship.SlotInstance.Select( ( eq, i ) => eq == null ? 0 :
GetAirSuperiority( eq.EquipmentID, ship.Aircraft[i], eq.AircraftLevel, eq.Level, false, isAircraftLevelMaximum ) ).Sum();
}

/// <summary>
Expand All @@ -180,18 +182,18 @@ public static class Calculator {
/// 制空戦力を求めます。
/// </summary>
/// <param name="fleet">対象の艦隊。</param>
public static int GetAirSuperiority( FleetData fleet ) {
public static int GetAirSuperiority( FleetData fleet, bool isAircraftLevelMaximum = false ) {
if ( fleet == null )
return 0;
return fleet.MembersWithoutEscaped.Select( ship => GetAirSuperiority( ship ) ).Sum();
return fleet.MembersWithoutEscaped.Select( ship => GetAirSuperiority( ship, isAircraftLevelMaximum ) ).Sum();
}


/// <summary>
/// 基地航空隊の制空戦力を求めます。
/// </summary>
/// <param name="aircorps">対象の基地航空隊。</param>
public static int GetAirSuperiority( BaseAirCorpsData aircorps ) {
public static int GetAirSuperiority( BaseAirCorpsData aircorps, bool isAircraftLevelMaximum = false ) {
if ( aircorps == null )
return 0;

Expand All @@ -202,7 +204,7 @@ public static class Calculator {
if ( sq == null || sq.State != 1 )
continue;

air += GetAirSuperiority( sq, aircorps.ActionKind == 2 );
air += GetAirSuperiority( sq, aircorps.ActionKind == 2, isAircraftLevelMaximum );

if ( aircorps.ActionKind != 2 )
continue;
Expand Down Expand Up @@ -230,15 +232,15 @@ public static class Calculator {
/// 基地航空中隊の制空戦力を求めます。
/// </summary>
/// <param name="squadron">対象の基地航空中隊。</param>
public static int GetAirSuperiority( BaseAirCorpsSquadron squadron, bool isAirDefense = false ) {
public static int GetAirSuperiority( BaseAirCorpsSquadron squadron, bool isAirDefense = false, bool isAircraftLevelMaximum = false ) {
if ( squadron == null || squadron.State != 1 )
return 0;

var eq = squadron.EquipmentInstance;
if ( eq == null )
return 0;

return GetAirSuperiority( eq.EquipmentID, squadron.AircraftCurrent, eq.AircraftLevel, eq.Level, isAirDefense );
return GetAirSuperiority( eq.EquipmentID, squadron.AircraftCurrent, eq.AircraftLevel, eq.Level, isAirDefense, isAircraftLevelMaximum );
}


Expand All @@ -250,12 +252,13 @@ public static class Calculator {
/// <returns></returns>
public static int GetAirSuperiorityAtMaxLevel( int[] fleet, int[][] slot ) {
return fleet.Select( id => KCDatabase.Instance.MasterShips[id] )
.Select( ( ship, i ) => ship == null ? 0 : GetAirSuperiority( slot[i], ship.Aircraft.ToArray(), new int[] { 8, 8, 8, 8, 8 } ) ).Sum();
.Select( ( ship, i ) => ship == null ? 0 :
slot[i].Select( ( eqid, k ) => GetAirSuperiority( eqid, ship.Aircraft[k], 7, 10, false, true ) ).Sum() ).Sum();
}


/// <summary>
/// 艦載機熟練度を無視した制空戦力を求めます
/// 艦載機熟練度・改修レベルを無視した制空戦力を求めます
/// </summary>
/// <param name="ship">対象の艦船。</param>
public static int GetAirSuperiorityIgnoreLevel( ShipData ship ) {
Expand All @@ -265,7 +268,7 @@ public static class Calculator {
}

/// <summary>
/// 艦載機熟練度を無視した制空戦力を求めます
/// 艦載機熟練度・改修レベルを無視した制空戦力を求めます
/// </summary>
/// <param name="fleet">対象の艦隊。</param>
public static int GetAirSuperiorityIgnoreLevel( FleetData fleet ) {
Expand Down Expand Up @@ -922,7 +925,7 @@ public static class Calculator {
mainguncnt++;
break;
case 4: //副砲
subguncnt++;
subguncnt++;
break;
case 5:
case 32: //魚雷
Expand Down

0 comments on commit 4f22cd1

Please sign in to comment.