/// <summary> /// 制空値を計算します /// </summary> /// <param name="itemdata">アイテムのデータ</param> /// <param name="withdrawnArray">護衛退避の情報</param> /// <param name="deckports">艦隊の情報</param> /// <returns>制空値</returns> public AirSupResult GetAirSupValue(Dictionary<int, SlotItem> itemdata, bool[,] withdrawnArray, List<ApiDeckPort> deckports) { lock (_lockObject) { //計算が必要かどうか bool calcrequired = false; if (_airsup == null) calcrequired = true;//キャッシュされていない場合 else if (_lastWithdrawnArray == null || _lastWithdrawnArray != withdrawnArray) calcrequired = true; //再計算が必要な場合 if (calcrequired) { _airsup = new AirSupResult(); //護衛退避しているかどうか bool iswithdrawn = false; foreach (int i in Enumerable.Range(0, deckports.Count)) { var d = deckports[i]; foreach (int j in Enumerable.Range(0, d.api_ship.Count)) { var shipid = d.api_ship[j]; //艦隊リストの中に該当艦を発見した場合 if (shipid == this.api_id) { if (i >= 0 && i < withdrawnArray.GetLength(0) && j >= 0 && j < withdrawnArray.GetLength(1)) { iswithdrawn = withdrawnArray[i, j]; break; } } } if (iswithdrawn) break; } //退避していない場合に限り制空を計算 if (!iswithdrawn) { var oslots = GetOSlotitems(itemdata); var dslots = GetDSlotitems(itemdata); foreach (int i in Enumerable.Range(0, dslots.Count)) { var oequip = oslots[i]; var equip = dslots[i]; //このスロットの制空値 var slot_airsup = AirSupResult.SingleSlotitemAirSup(equip, api_onslot[i], oequip.api_alv); //全体にマージ _airsup = _airsup.Merge(slot_airsup); } } _lastWithdrawnArray = withdrawnArray; } return _airsup; } }
/// <summary> /// 中隊(航空機)あたりの制空値を計算します /// </summary> /// <param name="slotData">装備データ</param> /// <returns>中隊あたりの制空値</returns> public AirSupResult GetPlaneAirSup(Dictionary<int, SlotItem> slotData) { if (_airsup == null) { if (slotData == null) { throw new NullReferenceException("GetPlaneAirSup で slotDataがNullです"); } if (mstSlot == null) { if (oslot == null) { if (!slotData.TryGetValue(_api_slot_id, out oslot)) throw new KeyNotFoundException("GetPlaneAirSup で 対象の装備データを取得できません"); } mstSlot = oslot.DSlotitem; if (mstSlot == null) { throw new KeyNotFoundException("GetPlaneAirSup で 対象のマスターデータを取得できません"); } } _airsup = AirSupResult.SingleSlotitemAirSup(mstSlot, (double)_api_count, oslot.api_alv); } return _airsup; }
/// <summary> /// 基地航空隊の制空値を計算します /// </summary> /// <param name="slotData">装備データ</param> /// <returns>基地航空隊の制空値</returns> public AirSupResult GetBaseAirSup(Dictionary<int, SlotItem> slotData) { var result = new AirSupResult(); if (api_plane_info == null) return result; foreach(var plane in api_plane_info) { result = result.Merge(plane.GetPlaneAirSup(slotData)); } return result; }
public ViewStatus() { SquadronView = new ApiPlaneInfo.ViewStatus[NumOfSquadron]; TotalAirSup = new AirSupResult(); }
public ViewStatus() { AirSup = new AirSupResult(); }