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: //時計表示