diff --git a/ElectronicObserver/Data/ShipData.cs b/ElectronicObserver/Data/ShipData.cs
index d61baf87e..a9efc9c9c 100644
--- a/ElectronicObserver/Data/ShipData.cs
+++ b/ElectronicObserver/Data/ShipData.cs
@@ -1198,11 +1198,11 @@ private int CalculateNightBattlePower()
basepower = FirepowerBase +
airs.Where(p => p.master.IsNightAircraft)
- .Sum(p => p.master.Firepower + p.master.Torpedo +
+ .Sum(p => p.master.Firepower + p.master.Torpedo + p.master.Bomber +
3 * p.count +
0.45 * (p.master.Firepower + p.master.Torpedo + p.master.Bomber + p.master.ASW) * Math.Sqrt(p.count) + Math.Sqrt(p.eq.Level)) +
- airs.Where(p => p.master.IsSwordfish || p.master.EquipmentID == 154) // 零戦62型(爆戦/岩井隊)
- .Sum(p => p.master.Firepower + p.master.Torpedo +
+ airs.Where(p => p.master.IsSwordfish || p.master.EquipmentID == 154 || p.master.EquipmentID == 320) // 零戦62型(爆戦/岩井隊)、彗星一二型(三一号光電管爆弾搭載機)
+ .Sum(p => p.master.Firepower + p.master.Torpedo + p.master.Bomber +
0.3 * (p.master.Firepower + p.master.Torpedo + p.master.Bomber + p.master.ASW) * Math.Sqrt(p.count) + Math.Sqrt(p.eq.Level));
}
@@ -1261,9 +1261,12 @@ private int CalculateNightBattlePower()
{
int nightFighter = SlotInstanceMaster.Count(eq => eq?.IsNightFighter ?? false);
int nightAttacker = SlotInstanceMaster.Count(eq => eq?.IsNightAttacker ?? false);
+ int nightBomber = SlotInstanceMaster.Count(eq => eq?.EquipmentID == 320); // 彗星一二型(三一号光電管爆弾搭載機)
if (nightFighter >= 2 && nightAttacker >= 1)
basepower *= 1.25;
+ else if (nightBomber >= 1 && nightFighter + nightAttacker >= 1)
+ basepower *= 1.2;
else if (nightFighter >= 1 && nightAttacker >= 1)
basepower *= 1.2;
else
diff --git a/ElectronicObserver/Utility/Data/Calculator.cs b/ElectronicObserver/Utility/Data/Calculator.cs
index e80ca47d7..9aff96c4e 100644
--- a/ElectronicObserver/Utility/Data/Calculator.cs
+++ b/ElectronicObserver/Utility/Data/Calculator.cs
@@ -895,6 +895,7 @@ public static NightAttackKind GetNightAttackKind(int[] slot, int attackerShipID,
int nightFighterCount = 0;
int nightAttackerCount = 0;
int swordfishCount = 0;
+ int nightCapableBomberCount = 0;
int nightBomberCount = 0;
int nightPersonnelCount = 0;
int surfaceRadarCount = 0;
@@ -945,6 +946,8 @@ public static NightAttackKind GetNightAttackKind(int[] slot, int attackerShipID,
// (夜間)爆撃機
case EquipmentTypes.CarrierBasedBomber:
if (eq.EquipmentID == 154) // 零戦62型(爆戦/岩井隊)
+ nightCapableBomberCount++;
+ else if (eq.EquipmentID == 320) // 彗星一二型(三一号光電管爆弾搭載機)
nightBomberCount++;
break;
@@ -1023,12 +1026,13 @@ public static NightAttackKind GetNightAttackKind(int[] slot, int attackerShipID,
(subGunCount >= 2 && torpedoCount <= 1))
return NightAttackKind.DoubleShelling;
-
// 空母カットイン
- if (nightPersonnelCount > 0 && nightFighterCount > 0)
+ if (nightPersonnelCount > 0)
{
- if (nightAttackerCount > 0 ||
- (nightFighterCount + swordfishCount + nightBomberCount) >= 3)
+ if (nightFighterCount > 0 &&
+ (nightAttackerCount > 0 || (nightFighterCount + swordfishCount + nightCapableBomberCount) >= 3))
+ return NightAttackKind.CutinAirAttack;
+ else if (nightBomberCount > 0 && (nightFighterCount + nightAttackerCount > 0))
return NightAttackKind.CutinAirAttack;
}
diff --git a/ElectronicObserver/Utility/Mathematics/DateTimeHelper.cs b/ElectronicObserver/Utility/Mathematics/DateTimeHelper.cs
index d32a924fe..5a63289a9 100644
--- a/ElectronicObserver/Utility/Mathematics/DateTimeHelper.cs
+++ b/ElectronicObserver/Utility/Mathematics/DateTimeHelper.cs
@@ -126,7 +126,7 @@ public static bool IsCrossedHour(DateTime prev)
///
/// 指定した日時をまたいでいるかを取得します。日単位で処理されます。
///
- /// 前回処理した時の日時。
+ /// 前回処理した時の(現地)日時。
/// 指定した日時の時間。
/// 指定した日時の分。
/// 指定した日時の秒。
@@ -134,19 +134,19 @@ public static bool IsCrossedHour(DateTime prev)
public static bool IsCrossedDay(DateTime prev, int hours, int minutes, int seconds)
{
- DateTime now = DateTime.Now;
+ DateTime now = GetJapanStandardTimeNow();
TimeSpan nowtime = now.TimeOfDay;
- TimeSpan bordertime = new TimeSpan(hours, minutes, seconds) + GetTimeDifference();
+ TimeSpan bordertime = new TimeSpan(hours, minutes, seconds);
- return IsCrossed(prev, now.Subtract(new TimeSpan(nowtime < bordertime ? 1 : 0, nowtime.Hours, nowtime.Minutes, nowtime.Seconds)).Add(bordertime));
+ return IsCrossed(GetJapanStandardTime(prev), now.Subtract(new TimeSpan(nowtime < bordertime ? 1 : 0, nowtime.Hours, nowtime.Minutes, nowtime.Seconds)).Add(bordertime));
}
///
/// 指定した日時をまたいでいるかを取得します。週単位で処理されます。
///
- /// 前回処理した時の日時。
+ /// 前回処理した時の(現地)日時。
/// 指定した日時の曜日。
/// 指定した日時の時間。
/// 指定した日時の分。
@@ -155,10 +155,10 @@ public static bool IsCrossedDay(DateTime prev, int hours, int minutes, int secon
public static bool IsCrossedWeek(DateTime prev, DayOfWeek dayOfWeek, int hours, int minutes, int seconds)
{
- DateTime now = DateTime.Now;
+ DateTime now = GetJapanStandardTimeNow();
TimeSpan nowtime = now.TimeOfDay;
- TimeSpan bordertime = new TimeSpan(hours, minutes, seconds) + GetTimeDifference();
+ TimeSpan bordertime = new TimeSpan(hours, minutes, seconds);
int dayshift = now.DayOfWeek - dayOfWeek;
if (dayshift < 0)
@@ -168,14 +168,14 @@ public static bool IsCrossedWeek(DateTime prev, DayOfWeek dayOfWeek, int hours,
DateTime border = now.Subtract(new TimeSpan(dayshift, nowtime.Hours, nowtime.Minutes, nowtime.Seconds)).Add(bordertime);
- return IsCrossed(prev, border);
+ return IsCrossed(GetJapanStandardTime(prev), border);
}
///
/// 指定した日時をまたいでいるかを取得します。月単位で処理されます。
///
- /// 前回処理した時の日時。
+ /// 前回処理した時の(現地)日時。
/// 指定した日時の日付。
/// 指定した日時の時間。
/// 指定した日時の分。
@@ -184,20 +184,20 @@ public static bool IsCrossedWeek(DateTime prev, DayOfWeek dayOfWeek, int hours,
public static bool IsCrossedMonth(DateTime prev, int days, int hours, int minutes, int seconds)
{
- DateTime now = DateTime.Now;
+ DateTime now = GetJapanStandardTimeNow();
- DateTime border = now.Subtract(new TimeSpan(now.Day, now.Hour, now.Minute, now.Second)).Add(new TimeSpan(days, hours, minutes, seconds) + GetTimeDifference());
+ DateTime border = now.Subtract(new TimeSpan(now.Day, now.Hour, now.Minute, now.Second)).Add(new TimeSpan(days, hours, minutes, seconds));
if (now < border)
border = border.AddMonths(-1);
- return IsCrossed(prev, border);
+ return IsCrossed(GetJapanStandardTime(prev), border);
}
///
/// 指定した日時をまたいでいるかを取得します。3ヵ月単位で処理されます。
///
- /// 前回処理した時の日時。
+ /// 前回処理した時の(現地)日時。
/// 指定した日時の月部分のオフセット[0-2]。0なら3,6,9,12月を示します。
/// 指定した日時の日付。
/// 指定した日時の時間。
@@ -205,13 +205,13 @@ public static bool IsCrossedMonth(DateTime prev, int days, int hours, int minute
/// 指定した日時の秒。
public static bool IsCrossedQuarter(DateTime prev, int monthes, int days, int hours, int minutes, int seconds)
{
- DateTime now = DateTime.Now;
+ DateTime now = GetJapanStandardTimeNow();
int targetMonth = now.Month / 3 * 3 + monthes;
- DateTime border = new DateTime(now.Year - (targetMonth < 1 ? 1 : 0), targetMonth < 1 ? targetMonth + 12 : targetMonth, days, hours, minutes, seconds) + GetTimeDifference();
+ DateTime border = new DateTime(now.Year - (targetMonth < 1 ? 1 : 0), targetMonth < 1 ? targetMonth + 12 : targetMonth, days, hours, minutes, seconds);
if (now < border)
border = border.AddMonths(-3);
- return IsCrossed(prev, border);
+ return IsCrossed(GetJapanStandardTime(prev), border);
}
@@ -257,17 +257,30 @@ public static DateTime CSVStringToTime(string str)
elem.Length > 5 ? int.Parse(elem[5]) : 0);
}
-
///
- /// 現在地点と東京標準時(艦これ時間)との時差を取得します。
+ /// 現在の東京標準時を取得します。
///
- public static TimeSpan GetTimeDifference()
+ public static DateTime GetJapanStandardTimeNow()
{
- return TimeZoneInfo.Local.BaseUtcOffset - new TimeSpan(9, 0, 0);
+ return DateTime.UtcNow + new TimeSpan(9, 0, 0);
}
+ ///
+ /// 指定した日時の東京標準時を取得します。
+ ///
+ public static DateTime GetJapanStandardTime(DateTime time)
+ {
+ return time - TimeZoneInfo.Local.BaseUtcOffset + new TimeSpan(9, 0, 0);
+ }
- }
+ ///
+ /// 現在地点と東京標準時(艦これ時間)との時差を取得します。
+ ///
+ public static TimeSpan GetTimeDifference()
+ {
+ return TimeZoneInfo.Local.BaseUtcOffset - new TimeSpan(9, 0, 0);
+ }
+ }
}
diff --git a/ElectronicObserver/Window/FormMain.cs b/ElectronicObserver/Window/FormMain.cs
index a0de6ce95..39a2f1f80 100644
--- a/ElectronicObserver/Window/FormMain.cs
+++ b/ElectronicObserver/Window/FormMain.cs
@@ -381,8 +381,8 @@ private void UIUpdateTimer_Tick(object sender, EventArgs e)
SystemEvents.OnUpdateTimerTick();
- // 東京標準時
- var now = DateTime.UtcNow + new TimeSpan(9, 0, 0);
+ // 東京標準時
+ DateTime now = Utility.Mathematics.DateTimeHelper.GetJapanStandardTimeNow();
switch ( ClockFormat ) {
case 0: //時計表示