/// <summary> /// 戦闘開始時の情報から敵艦の情報を読み込みます。 /// </summary> private void BattleStart(string apiname, dynamic data) { int[] efleet = (int[])data.api_ship_ke; int[] hpMax = (int[])data.api_maxhps; //[0]はダミー(-1) for (int i = 1; i < efleet.Length; i++) { if (efleet[i] == -1) { continue; } var param = this[efleet[i]]; if (param == null) { param = new ShipParameterElement(); param.ShipID = efleet[i]; Utility.Logger.Add(2, KCDatabase.Instance.MasterShips[param.ShipID].NameWithClass + "のパラメータを記録しました。"); } int[] baseparam = (int[])data.api_eParam[i - 1]; param.HPMin = param.HPMax = hpMax[i + 6]; param.FirepowerMin = param.FirepowerMax = baseparam[0]; param.TorpedoMin = param.TorpedoMax = baseparam[1]; param.AAMin = param.AAMax = baseparam[2]; param.ArmorMin = param.ArmorMax = baseparam[3]; param.DefaultSlot = (int[])data.api_eSlot[i - 1]; Update(param); } }
/// <summary> /// 戦闘開始時の情報から敵艦の情報を読み込みます。 /// </summary> private void BattleStart(string apiname, dynamic data) { int[] efleet = (int[])data.api_ship_ke; int[] hpMax = (int[])data.api_maxhps; //[0]はダミー(-1) for (int i = 1; i < efleet.Length; i++) { if (efleet[i] == -1) { continue; } var param = this[efleet[i]]; if (param == null) { param = new ShipParameterElement(); param.ShipID = efleet[i]; } int[] baseparam = (int[])data.api_eParam[i - 1]; param.HPMin = param.HPMax = hpMax[i + 6]; param.FirepowerMin = param.FirepowerMax = baseparam[0]; param.TorpedoMin = param.TorpedoMax = baseparam[1]; param.AAMin = param.AAMax = baseparam[2]; param.ArmorMin = param.ArmorMax = baseparam[3]; param.DefaultSlot = (int[])data.api_eSlot[i - 1]; } }
/// <summary> /// パラメータを更新します。 /// </summary> public void UpdateParameter(int shipID, int level, int aswMin, int aswMax, int evasionMin, int evasionMax, int losMin, int losMax) { ShipParameterElement e = this[shipID]; if (e == null) { e = new ShipParameterElement { ShipID = shipID }; Utility.Logger.Add(2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "のパラメータを記録しました。"); } if (e.ASW.SetEstParameter(level, aswMin, aswMax)) { Utility.Logger.Add(1, string.Format("ShipParameter: {0} の対潜値が予測範囲から外れました( [{1} ~ {2}] ~ {3} )。", KCDatabase.Instance.MasterShips[e.ShipID].NameWithClass, e.ASW.MinimumEstMin, e.ASW.MinimumEstMax, e.ASW.Maximum)); } if (e.Evasion.SetEstParameter(level, evasionMin, evasionMax)) { Utility.Logger.Add(1, string.Format("ShipParameter: {0} の回避値が予測範囲から外れました( [{1} ~ {2}] ~ {3} )。", KCDatabase.Instance.MasterShips[e.ShipID].NameWithClass, e.Evasion.MinimumEstMin, e.Evasion.MinimumEstMax, e.Evasion.Maximum)); } if (e.LOS.SetEstParameter(level, losMin, losMax)) { Utility.Logger.Add(1, string.Format("ShipParameter: {0} の索敵値が予測範囲から外れました( [{1} ~ {2}] ~ {3} )。", KCDatabase.Instance.MasterShips[e.ShipID].NameWithClass, e.LOS.MinimumEstMin, e.LOS.MinimumEstMax, e.LOS.Maximum)); } Update(e); }
/// <summary> /// パラメータを更新します。 /// </summary> public void UpdateParameter(int shipID, int level, int aswMin, int aswMax, int evasionMin, int evasionMax, int losMin, int losMax) { ShipParameterElement e = this[shipID]; if (e == null) { e = new ShipParameterElement(); e.ShipID = shipID; Utility.Logger.Add(2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + LoggerRes.RegisteredParameters); } if (e.ASW.SetEstParameter(level, aswMin, aswMax)) { Utility.Logger.Add(1, string.Format("ShipParameter: ASW value of {0} is out of the predicted range( [{1} ~ {2}] ~ {3} ).", KCDatabase.Instance.MasterShips[e.ShipID].NameWithClass, e.ASW.MinimumEstMin, e.ASW.MinimumEstMax, e.ASW.Maximum)); } if (e.Evasion.SetEstParameter(level, evasionMin, evasionMax)) { Utility.Logger.Add(1, string.Format("ShipParameter: Evasion value of {0} is out of the predicted range( [{1} ~ {2}] ~ {3} ).", KCDatabase.Instance.MasterShips[e.ShipID].NameWithClass, e.Evasion.MinimumEstMin, e.Evasion.MinimumEstMax, e.Evasion.Maximum)); } if (e.LOS.SetEstParameter(level, losMin, losMax)) { Utility.Logger.Add(1, string.Format("ShipParameter: LOS value of {0} is out of the predicted range( [{1} ~ {2}] ~ {3} ).", KCDatabase.Instance.MasterShips[e.ShipID].NameWithClass, e.LOS.MinimumEstMin, e.LOS.MinimumEstMax, e.LOS.Maximum)); } Update(e); }
/// <summary> /// ゲーム開始時にパラメータ読み込みフラグを解除、初回読み込みの準備をします。 /// </summary> private void GameStart(string apiname, dynamic data) { ParameterLoadFlag = true; foreach (var elem in data.api_mst_ship) { var param = this[(int)elem.api_id]; if (param == null) { param = new ShipParameterElement(); param.ShipID = (int)elem.api_id; } if (elem.api_taik()) { param.HPMin = (int)elem.api_taik[0]; param.HPMax = (int)elem.api_taik[1]; } if (elem.api_houg()) { param.FirepowerMin = (int)elem.api_houg[0]; param.FirepowerMax = (int)elem.api_houg[1]; } if (elem.api_raig()) { param.TorpedoMin = (int)elem.api_raig[0]; param.TorpedoMax = (int)elem.api_raig[1]; } if (elem.api_tyku()) { param.AAMin = (int)elem.api_tyku[0]; param.AAMax = (int)elem.api_tyku[1]; } if (elem.api_souk()) { param.ArmorMin = (int)elem.api_souk[0]; param.ArmorMax = (int)elem.api_souk[1]; } if (elem.api_luck()) { param.LuckMin = (int)elem.api_luck[0]; param.LuckMax = (int)elem.api_luck[1]; } if (elem.api_leng()) { param.Range = (int)elem.api_leng; } if (elem.api_maxeq()) { param.Aircraft = (int[])elem.api_maxeq; } if (elem.api_getmes()) { param.MessageGet = elem.api_getmes; } } }
/// <summary> /// 艦娘図鑑から回避・対潜の初期値及び説明文を読み込みます。 /// </summary> private void AlbumOpened(string apiname, dynamic data) { if (data == null || !data.api_list()) //空のページ { return; } foreach (dynamic elem in data.api_list) { if (!elem.api_yomi()) { break; //装備図鑑だった場合終了 } int shipID = (int)elem.api_table_id[0]; ShipParameterElement e = this[shipID]; if (e == null) { e = new ShipParameterElement(); e.ShipID = shipID; Utility.Logger.Add(2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "のパラメータを記録しました。"); } e.ASW.SetEstParameter(1, (int)elem.api_tais, Parameter.MaximumDefault); e.Evasion.SetEstParameter(1, (int)elem.api_kaih, Parameter.MaximumDefault); { //図鑑説明文登録(図鑑に載っていない改装艦に関してはその改装前の艦の説明文を設定する) e.MessageAlbum = elem.api_sinfo; LinkedList <int> processedIDs = new LinkedList <int>(); ShipDataMaster ship = KCDatabase.Instance.MasterShips[shipID]; while (ship != null && !processedIDs.Contains(ship.ShipID) && ship.RemodelAfterShipID > 0) { processedIDs.AddLast(ship.ID); ShipParameterElement e2 = this[ship.RemodelAfterShipID]; if (e2 == null) { e2 = new ShipParameterElement(); e2.ShipID = ship.RemodelAfterShipID; } if (e2.MessageAlbum == null) { e2.MessageAlbum = e.MessageAlbum; Update(e2); } ship = KCDatabase.Instance.MasterShips[ship.RemodelAfterShipID]; } } Update(e); Utility.Logger.Add(1, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "のパラメータを更新しました。"); } }
/// <summary> /// 戦闘開始時の情報から敵艦の情報を読み込みます。 /// </summary> private void BattleStart(string apiname, dynamic data) { var battle = KCDatabase.Instance.Battle.FirstBattle; void UpdateParams(int id, int maxhp, int[] status, int[] slot) { var param = this[id]; if (param == null) { param = new ShipParameterElement { ShipID = id }; Utility.Logger.Add(2, KCDatabase.Instance.MasterShips[id].NameWithClass + LoggerRes.RegisteredParameters); } param.HPMin = param.HPMax = maxhp; param.FirepowerMin = param.FirepowerMax = status[0]; param.TorpedoMin = param.TorpedoMax = status[1]; param.AAMin = param.AAMax = status[2]; param.ArmorMin = param.ArmorMax = status[3]; param.DefaultSlot = slot; Update(param); } for (int i = 0; i < battle.Initial.EnemyMembers.Length; i++) { int id = battle.Initial.EnemyMembers[i]; if (id <= 0) { continue; } UpdateParams(id, battle.Initial.EnemyMaxHPs[i], battle.Initial.EnemyParameters[i], battle.Initial.EnemySlots[i]); } if (battle.IsEnemyCombined) { for (int i = 0; i < battle.Initial.EnemyMembersEscort.Length; i++) { int id = battle.Initial.EnemyMembersEscort[i]; if (id <= 0) { continue; } UpdateParams(id, battle.Initial.EnemyMaxHPsEscort[i], battle.Initial.EnemyParametersEscort[i], battle.Initial.EnemySlotsEscort[i]); } } }
/// <summary> /// 初期装備を更新します。 /// </summary> /// <param name="shipID">艦船ID。</param> /// <param name="slot">装備スロット配列。</param> public void UpdateDefaultSlot(int shipID, int[] slot) { ShipParameterElement e = this[shipID]; if (e == null) { e = new ShipParameterElement(); e.ShipID = shipID; Utility.Logger.Add(2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "の初期装備を記録しました。"); } e.DefaultSlot = slot; Update(e); }
/// <summary> /// パラメータを更新します。 /// </summary> public void UpdateParameter(int shipID, int level, int aswMin, int aswMax, int evasionMin, int evasionMax, int losMin, int losMax) { ShipParameterElement e = this[shipID]; if (e == null) { e = new ShipParameterElement(); e.ShipID = shipID; Utility.Logger.Add(2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "のパラメータを記録しました。"); } e.ASW.SetEstParameter(level, aswMin, aswMax); e.Evasion.SetEstParameter(level, evasionMin, evasionMax); e.LOS.SetEstParameter(level, losMin, losMax); Update(e); }
/// <summary> /// パラメータを更新します。(対潜/回避/索敵最大値のみ) /// </summary> public void UpdateMaxParameter(ShipData ship) { ShipParameterElement e = this[ship.ShipID]; if (e == null) { e = new ShipParameterElement { ShipID = ship.ShipID }; } e.ASW.Maximum = ship.ASWMax; e.Evasion.Maximum = ship.EvasionMax; e.LOS.Maximum = ship.LOSMax; Update(e); }
/// <summary> /// 初期装備を更新します。 /// </summary> /// <param name="shipID">艦船ID。</param> /// <param name="slot">装備スロット配列。</param> public void UpdateDefaultSlot(int shipID, int[] slot) { ShipParameterElement e = this[shipID]; if (e == null) { e = new ShipParameterElement(); e.ShipID = shipID; Utility.Logger.Add(2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + LoggerRes.InitialEquipRegistered); } if (e.DefaultSlot == null || !e.DefaultSlot.SequenceEqual(slot)) { Utility.Logger.Add(2, "Stock equipment of " + KCDatabase.Instance.MasterShips[shipID].NameWithClass + " has been updated."); } e.DefaultSlot = slot; Update(e); }
/// <summary> /// 初期装備を更新します。 /// </summary> /// <param name="shipID">艦船ID。</param> /// <param name="slot">装備スロット配列。</param> public void UpdateDefaultSlot(int shipID, int[] slot) { ShipParameterElement e = this[shipID]; if (e == null) { e = new ShipParameterElement { ShipID = shipID }; } if (e.DefaultSlot == null || !e.DefaultSlot.SequenceEqual(slot)) { Utility.Logger.Add(2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + " の初期装備が更新されました。"); } e.DefaultSlot = slot; Update(e); }
public bool Merge(string line) { try { var elem = new ShipParameterElement(line); if (!Record.ContainsKey(elem.ShipID)) { Record.Add(elem.ShipID, elem); return(true); } else { return(Record[elem.ShipID].Merge(elem)); } } catch (Exception) { return(false); } }
/// <summary> /// 艦娘図鑑から回避・対潜の初期値及び説明文を読み込みます。 /// </summary> private void AlbumOpened(string apiname, dynamic data) { if (data == null || !data.api_list()) //空のページ { return; } foreach (dynamic elem in data.api_list) { if (!elem.api_yomi()) { break; //装備図鑑だった場合終了 } int shipID = (int)elem.api_table_id[0]; var ship = KCDatabase.Instance.MasterShips[shipID]; ShipParameterElement e = this[shipID]; if (e == null) { e = new ShipParameterElement { ShipID = shipID }; Utility.Logger.Add(2, ship.NameWithClass + LoggerRes.RegisteredParameters); } if (e.ASW.SetEstParameter(1, (int)elem.api_tais, Parameter.MaximumDefault)) { Utility.Logger.Add(1, string.Format("ShipParameter: {0} の対潜値が予測範囲から外れました( [{1} ~ {2}] ~ {3} )。", ship.NameWithClass, e.ASW.MinimumEstMin, e.ASW.MinimumEstMax, e.ASW.Maximum)); } if (e.Evasion.SetEstParameter(1, (int)elem.api_kaih, Parameter.MaximumDefault)) { Utility.Logger.Add(1, string.Format("ShipParameter: {0} の回避値が予測範囲から外れました( [{1} ~ {2}] ~ {3} )。", ship.NameWithClass, e.Evasion.MinimumEstMin, e.Evasion.MinimumEstMax, e.Evasion.Maximum)); } { //図鑑説明文登録(図鑑に載っていない改装艦に関してはその改装前の艦の説明文を設定する) e.MessageAlbum = elem.api_sinfo; LinkedList <int> processedIDs = new LinkedList <int>(); while (ship != null && !processedIDs.Contains(ship.ShipID) && ship.RemodelAfterShipID > 0) { processedIDs.AddLast(ship.ID); ShipParameterElement e2 = this[ship.RemodelAfterShipID]; if (e2 == null) { e2 = new ShipParameterElement { ShipID = ship.RemodelAfterShipID }; } ship = KCDatabase.Instance.MasterShips[ship.RemodelAfterShipID]; if (ship != null && ship.IsListedInAlbum) { break; } e2.MessageAlbum = e.MessageAlbum; Update(e2); } } { var costumeIDs = (int[])elem.api_table_id; foreach (var id in costumeIDs) { if (id == shipID) { continue; } var e2 = this[id]; if (e2 == null) { e2 = new ShipParameterElement { ShipID = id }; } e2.OriginalCostumeShipID = shipID; Update(e2); } } Update(e); //Utility.Logger.Add( 1, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "のパラメータを更新しました。" ); } }
/// <summary> /// ゲーム開始時にパラメータ読み込みフラグを解除、初回読み込みの準備をします。 /// </summary> private void GameStart(string apiname, dynamic data) { ParameterLoadFlag = true; foreach (var elem in data.api_mst_ship) { var param = this[(int)elem.api_id]; if (param == null) { param = new ShipParameterElement { ShipID = (int)elem.api_id }; } if (elem.api_taik()) { param.HPMin = (int)elem.api_taik[0]; param.HPMax = (int)elem.api_taik[1]; } if (elem.api_houg()) { param.FirepowerMin = (int)elem.api_houg[0]; param.FirepowerMax = (int)elem.api_houg[1]; } if (elem.api_raig()) { param.TorpedoMin = (int)elem.api_raig[0]; param.TorpedoMax = (int)elem.api_raig[1]; } if (elem.api_tyku()) { param.AAMin = (int)elem.api_tyku[0]; param.AAMax = (int)elem.api_tyku[1]; } if (elem.api_souk()) { param.ArmorMin = (int)elem.api_souk[0]; param.ArmorMax = (int)elem.api_souk[1]; } if (elem.api_tais()) { int[] api_tais = elem.api_tais; // Length = 1 の場合がある param.ASW.SetEstParameter(1, api_tais[0], api_tais.Length >= 2 ? api_tais[1] : Parameter.MaximumDefault); } if (elem.api_luck()) { param.LuckMin = (int)elem.api_luck[0]; param.LuckMax = (int)elem.api_luck[1]; } if (elem.api_leng()) { param.Range = (int)elem.api_leng; } if (elem.api_maxeq()) { param.Aircraft = (int[])elem.api_maxeq; } if (elem.api_getmes()) { string mes = elem.api_getmes; if (!string.IsNullOrWhiteSpace(mes.Replace("<br>", "\r\n"))) { param.MessageGet = mes; } } Update(param); } foreach (var elem in data.api_mst_shipgraph) { var param = this[(int)elem.api_id]; if (param == null) { param = new ShipParameterElement { ShipID = (int)elem.api_id }; } if (elem.api_filename()) { param.ResourceName = elem.api_filename; } if (elem.api_version()) { var values = (string[])elem.api_version; param.ResourceGraphicVersion = values[0]; param.ResourceVoiceVersion = values[1]; param.ResourcePortVoiceVersion = values[2]; } Update(param); } // validation foreach (var record in Record.Values) { // 無効な装備を持っていた場合、初期装備データを初期化 if (record.DefaultSlot != null) { var keys = KCDatabase.Instance.MasterEquipments.Keys; foreach (int eq in record.DefaultSlot.ToArray()) { if (eq != -1 && !keys.Contains(eq)) { record.DefaultSlot = null; break; } } } } }
/// <summary> /// このデータに不足している情報があった場合、other のデータで補完します。 /// </summary> public bool Merge(ShipParameterElement other) { if (ShipID != other.ShipID) { throw new ArgumentException("ShipID が異なるデータはマージできません"); } bool isChanged = false; void TryToUpdate(Func <ShipParameterElement, int> getter, Action <ShipParameterElement, int> setter) { if (getter(this) == 0 && getter(other) != 0) { setter(this, getter(other)); isChanged = true; } } TryToUpdate(e => e.HPMin, (e, i) => e.HPMin = i); TryToUpdate(e => e.HPMax, (e, i) => e.HPMax = i); TryToUpdate(e => e.FirepowerMin, (e, i) => e.FirepowerMin = i); TryToUpdate(e => e.FirepowerMax, (e, i) => e.FirepowerMax = i); TryToUpdate(e => e.TorpedoMin, (e, i) => e.TorpedoMin = i); TryToUpdate(e => e.TorpedoMax, (e, i) => e.TorpedoMax = i); TryToUpdate(e => e.AAMin, (e, i) => e.AAMin = i); TryToUpdate(e => e.AAMax, (e, i) => e.AAMax = i); TryToUpdate(e => e.ArmorMin, (e, i) => e.ArmorMin = i); TryToUpdate(e => e.ArmorMax, (e, i) => e.ArmorMax = i); void TryToUpdateParameter(Func <ShipParameterElement, Parameter> getter) { var from = getter(other); var to = getter(this); if (!from.IsMinimumDefault) { if (to.MinimumEstMin < from.MinimumEstMin) { to.MinimumEstMin = from.MinimumEstMin; isChanged = true; } if (to.MinimumEstMax > from.MinimumEstMax) { to.MinimumEstMax = from.MinimumEstMax; isChanged = true; } } if (!from.IsMaximumDefault && from.Maximum != to.Maximum) { to.Maximum = from.Maximum; isChanged = true; } } TryToUpdateParameter(e => e.ASW); TryToUpdateParameter(e => e.Evasion); TryToUpdateParameter(e => e.LOS); TryToUpdate(e => e.LuckMin, (e, i) => e.LuckMin = i); TryToUpdate(e => e.LuckMax, (e, i) => e.LuckMax = i); TryToUpdate(e => e.Range, (e, i) => e.Range = i); if (DefaultSlot == null && other.DefaultSlot != null) { DefaultSlot = other.DefaultSlot.ToArray(); isChanged = true; } if (Aircraft == null && other.Aircraft != null) { Aircraft = other.Aircraft.ToArray(); isChanged = true; } void TryToUpdateString(Func <ShipParameterElement, string> getter, Action <ShipParameterElement, string> setter) { if (string.IsNullOrEmpty(getter(this)) && !string.IsNullOrEmpty(getter(other))) { setter(this, getter(other)); isChanged = true; } } TryToUpdateString(e => e.MessageAlbum, (e, s) => e.MessageAlbum = s); TryToUpdateString(e => e.MessageGet, (e, s) => e.MessageGet = s); TryToUpdateString(e => e.ResourceName, (e, s) => e.ResourceName = s); TryToUpdateString(e => e.ResourceGraphicVersion, (e, s) => e.ResourceGraphicVersion = s); TryToUpdateString(e => e.ResourceVoiceVersion, (e, s) => e.ResourceVoiceVersion = s); TryToUpdateString(e => e.ResourcePortVoiceVersion, (e, s) => e.ResourcePortVoiceVersion = s); if (OriginalCostumeShipID == -1 && other.OriginalCostumeShipID != -1) { OriginalCostumeShipID = other.OriginalCostumeShipID; isChanged = true; } return(isChanged); }
/// <summary> /// 艦娘図鑑から回避・対潜の初期値及び説明文を読み込みます。 /// </summary> private void AlbumOpened( string apiname, dynamic data ) { if ( data == null || !data.api_list() ) //空のページ return; foreach ( dynamic elem in data.api_list ) { if ( !elem.api_yomi() ) break; //装備図鑑だった場合終了 int shipID = (int)elem.api_table_id[0]; ShipParameterElement e = this[shipID]; if ( e == null ) { e = new ShipParameterElement(); e.ShipID = shipID; Utility.Logger.Add( 2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "のパラメータを記録しました。" ); } e.ASW.SetEstParameter( 1, (int)elem.api_tais, Parameter.MaximumDefault ); e.Evasion.SetEstParameter( 1, (int)elem.api_kaih, Parameter.MaximumDefault ); { //図鑑説明文登録(図鑑に載っていない改装艦に関してはその改装前の艦の説明文を設定する) e.MessageAlbum = elem.api_sinfo; ShipDataMaster ship = KCDatabase.Instance.MasterShips[shipID]; while ( ship != null && ship.RemodelAfterShipID > 0 ) { ShipParameterElement e2 = this[ship.RemodelAfterShipID]; if ( e2 == null ) { e2 = new ShipParameterElement(); e2.ShipID = ship.RemodelAfterShipID; } if ( e2.MessageAlbum == null ) { e2.MessageAlbum = e.MessageAlbum; Update( e2 ); } ship = KCDatabase.Instance.MasterShips[ship.RemodelAfterShipID]; } } Update( e ); Utility.Logger.Add( 1, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "のパラメータを更新しました。" ); } }
/// <summary> /// 初期装備を更新します。 /// </summary> /// <param name="shipID">艦船ID。</param> /// <param name="slot">装備スロット配列。</param> public void UpdateDefaultSlot( int shipID, int[] slot ) { ShipParameterElement e = this[shipID]; if ( e == null ) { e = new ShipParameterElement(); e.ShipID = shipID; Utility.Logger.Add( 2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + LoggerRes.InitialEquipRegistered ); } e.DefaultSlot = slot; Update( e ); }
/// <summary> /// 初期装備を更新します。 /// </summary> /// <param name="shipID">艦船ID。</param> /// <param name="slot">装備スロット配列。</param> public void UpdateDefaultSlot( int shipID, int[] slot ) { ShipParameterElement e = this[shipID]; if ( e == null ) { e = new ShipParameterElement(); e.ShipID = shipID; Utility.Logger.Add( 2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "の初期装備を記録しました。" ); } e.DefaultSlot = slot; Update( e ); Utility.Logger.Add( 1, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "の初期装備を更新しました。" ); }
/// <summary> /// ゲーム開始時にパラメータ読み込みフラグを解除、初回読み込みの準備をします。 /// </summary> private void GameStart( string apiname, dynamic data ) { ParameterLoadFlag = true; foreach ( var elem in data.api_mst_ship ) { var param = this[(int)elem.api_id]; if ( param == null ) { param = new ShipParameterElement(); param.ShipID = (int)elem.api_id; } if ( elem.api_taik() ) { param.HPMin = (int)elem.api_taik[0]; param.HPMax = (int)elem.api_taik[1]; } if ( elem.api_houg() ) { param.FirepowerMin = (int)elem.api_houg[0]; param.FirepowerMax = (int)elem.api_houg[1]; } if ( elem.api_raig() ) { param.TorpedoMin = (int)elem.api_raig[0]; param.TorpedoMax = (int)elem.api_raig[1]; } if ( elem.api_tyku() ) { param.AAMin = (int)elem.api_tyku[0]; param.AAMax = (int)elem.api_tyku[1]; } if ( elem.api_souk() ) { param.ArmorMin = (int)elem.api_souk[0]; param.ArmorMax = (int)elem.api_souk[1]; } if ( elem.api_luck() ) { param.LuckMin = (int)elem.api_luck[0]; param.LuckMax = (int)elem.api_luck[1]; } if ( elem.api_leng() ) { param.Range = (int)elem.api_leng; } if ( elem.api_maxeq() ) { param.Aircraft = (int[])elem.api_maxeq; } if ( elem.api_getmes() ) { param.MessageGet = elem.api_getmes; } } }
/// <summary> /// 戦闘開始時の情報から敵艦の情報を読み込みます。 /// </summary> private void BattleStart(string apiname, dynamic data) { var battle = KCDatabase.Instance.Battle.FirstBattle; var binit = battle.Initial; void UpdateParams(int id, int maxhp, int[] status, int[] slot) { var param = this[id]; if (param == null) { param = new ShipParameterElement { ShipID = id }; } param.HPMin = param.HPMax = maxhp; if (status != null) { param.FirepowerMin = param.FirepowerMax = status[0]; param.TorpedoMin = param.TorpedoMax = status[1]; param.AAMin = param.AAMax = status[2]; param.ArmorMin = param.ArmorMax = status[3]; } param.DefaultSlot = slot; Update(param); } for (int i = 0; i < binit.EnemyMembers.Length; i++) { int id = binit.EnemyMembers[i]; if (id <= 0) { continue; } UpdateParams(id, binit.EnemyMaxHPs[i], binit.EnemyParameters?[i], binit.EnemySlots[i]); } if (battle.IsEnemyCombined) { for (int i = 0; i < binit.EnemyMembersEscort.Length; i++) { int id = binit.EnemyMembersEscort[i]; if (id <= 0) { continue; } UpdateParams(id, binit.EnemyMaxHPsEscort[i], binit.EnemyParametersEscort?[i], binit.EnemySlotsEscort[i]); } } void EstimateUnknownAircraftSlot() { var db = KCDatabase.Instance; // 航空戦が存在するときだけ処理する if (!(battle is BattleDay battleDay)) { return; } IEnumerable <int> members = binit.EnemyMembers; if (battleDay.IsEnemyCombined) { members = members.Concat(binit.EnemyMembersEscort); } void checkNoAircraft(int id, int[] eqs) { if (id <= 0 || this[id].Aircraft != null) { return; } if (eqs.Select(eqid => db.MasterEquipments[eqid]).All(eq => !eq?.IsAircraft ?? true)) { Utility.Logger.Add(1, $"搭載チェック:ID{id} {db.MasterShips[id].NameWithClass} は航空機を装備していません。搭載数 0 と推定します。"); this[id].Aircraft = new int[5]; } } for (int i = 0; i < binit.EnemyMembers.Length; i++) { checkNoAircraft(binit.EnemyMembers[i], binit.EnemySlots[i]); } if (battleDay.IsEnemyCombined) { for (int i = 0; i < binit.EnemyMembersEscort.Length; i++) { checkNoAircraft(binit.EnemyMembersEscort[i], binit.EnemySlotsEscort[i]); } } // 搭載不明艦が 1 種類 && 航空機搭載スロットが 1 つだけの場合、搭載数推定を行う var unknowns = members.Where(id => this[id] != null && this[id].Aircraft == null); if (unknowns.Distinct().Count() == 1) { int unknownShipID = unknowns.First(); int[] unknownShipEquipment; { int unknownShipIndex = Array.IndexOf(binit.EnemyMembers, unknownShipID); if (unknownShipIndex != -1) { unknownShipEquipment = binit.EnemySlots[unknownShipIndex]; } else { unknownShipIndex = Array.IndexOf(binit.EnemyMembersEscort, unknownShipID); unknownShipEquipment = binit.EnemySlotsEscort[unknownShipIndex]; } } void estimate(int actualAircraftCount, Func <EquipmentDataMaster, bool> isAircraft) { if (unknownShipEquipment.Select(id => db.MasterEquipments[id]).Count(isAircraft) != 1) { return; } int getAircraftCount(int shipID, int[] equipmentIDs, int[] aircraft) { int aircount = 0; if (shipID <= 0 || aircraft == null) { return(0); } for (int i = 0; i < Math.Min(equipmentIDs.Length, aircraft.Length); i++) { if (isAircraft(db.MasterEquipments[equipmentIDs[i]])) { aircount += aircraft[i]; } } return(aircount); } int knownAircraftCount = 0; for (int i = 0; i < binit.EnemyMembers.Length; i++) { knownAircraftCount += getAircraftCount(binit.EnemyMembers[i], binit.EnemySlots[i], this[binit.EnemyMembers[i]]?.Aircraft); } if (battleDay.IsEnemyCombined) { for (int i = 0; i < binit.EnemyMembersEscort.Length; i++) { knownAircraftCount += getAircraftCount(binit.EnemyMembersEscort[i], binit.EnemySlotsEscort[i], this[binit.EnemyMembersEscort[i]]?.Aircraft); } } int estimatedAircraftCount = (actualAircraftCount - knownAircraftCount) / unknowns.Count(); { var p = this[unknownShipID]; var aircraft = new int[5]; aircraft[Array.FindIndex(unknownShipEquipment, id => isAircraft(db.MasterEquipments[id]))] = estimatedAircraftCount; p.Aircraft = aircraft; Update(p); Utility.Logger.Add(1, $"搭載チェック:ID{unknownShipID} {db.MasterShips[unknownShipID].NameWithClass} の搭載数を [{string.Join(", ", aircraft)}] と推定しました。"); } } if (battleDay.BaseAirAttack?.IsAvailable ?? false) { var firstUnit = battleDay.BaseAirAttack.AirAttackUnits.FirstOrDefault(); if (!firstUnit?.IsStage1Available ?? false) { return; } estimate(firstUnit.AircraftTotalStage1Enemy, eq => eq?.IsAircraft ?? false); } else if (battleDay.AirBattle?.IsStage1Available ?? false) { estimate(battleDay.AirBattle.AircraftTotalStage1Enemy, eq => eq?.IsCombatAircraft ?? false); } else if (battleDay is BattleBaseAirRaid battleAirRaid && (battleAirRaid.BaseAirRaid?.IsStage1Available ?? false)) { estimate(battleAirRaid.BaseAirRaid.AircraftTotalStage1Enemy, eq => eq?.IsCombatAircraft ?? false); } } } EstimateUnknownAircraftSlot(); }
/// <summary> /// 艦娘図鑑から回避・対潜の初期値及び説明文を読み込みます。 /// </summary> private void AlbumOpened( string apiname, dynamic data ) { if ( data == null || !data.api_list() ) //空のページ return; foreach ( dynamic elem in data.api_list ) { if ( !elem.api_yomi() ) break; //装備図鑑だった場合終了 int shipID = (int)elem.api_table_id[0]; var ship = KCDatabase.Instance.MasterShips[shipID]; ShipParameterElement e = this[shipID]; if ( e == null ) { e = new ShipParameterElement(); e.ShipID = shipID; Utility.Logger.Add( 2, ship.NameWithClass + LoggerRes.RegisteredParameters ); } if ( e.ASW.SetEstParameter( 1, (int)elem.api_tais, Parameter.MaximumDefault ) ) Utility.Logger.Add( 1, string.Format( "ShipParameter: {0} の対潜値が予測範囲から外れました( [{1} ~ {2}] ~ {3} )。", ship.NameWithClass, e.ASW.MinimumEstMin, e.ASW.MinimumEstMax, e.ASW.Maximum ) ); if ( e.Evasion.SetEstParameter( 1, (int)elem.api_kaih, Parameter.MaximumDefault ) ) Utility.Logger.Add( 1, string.Format( "ShipParameter: {0} の回避値が予測範囲から外れました( [{1} ~ {2}] ~ {3} )。", ship.NameWithClass, e.Evasion.MinimumEstMin, e.Evasion.MinimumEstMax, e.Evasion.Maximum ) ); { //図鑑説明文登録(図鑑に載っていない改装艦に関してはその改装前の艦の説明文を設定する) e.MessageAlbum = elem.api_sinfo; LinkedList<int> processedIDs = new LinkedList<int>(); while ( ship != null && !processedIDs.Contains( ship.ShipID ) && ship.RemodelAfterShipID > 0 ) { processedIDs.AddLast( ship.ID ); ShipParameterElement e2 = this[ship.RemodelAfterShipID]; if ( e2 == null ) { e2 = new ShipParameterElement(); e2.ShipID = ship.RemodelAfterShipID; } if ( e2.MessageAlbum == null ) { e2.MessageAlbum = e.MessageAlbum; Update( e2 ); } ship = KCDatabase.Instance.MasterShips[ship.RemodelAfterShipID]; } } Update( e ); //Utility.Logger.Add( 1, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "のパラメータを更新しました。" ); } }
/// <summary> /// ゲーム開始時にパラメータ読み込みフラグを解除、初回読み込みの準備をします。 /// </summary> private void GameStart( string apiname, dynamic data ) { ParameterLoadFlag = true; foreach ( var elem in data.api_mst_ship ) { var param = this[(int)elem.api_id]; if ( param == null ) { param = new ShipParameterElement(); param.ShipID = (int)elem.api_id; } if ( elem.api_taik() ) { param.HPMin = (int)elem.api_taik[0]; param.HPMax = (int)elem.api_taik[1]; } if ( elem.api_houg() ) { param.FirepowerMin = (int)elem.api_houg[0]; param.FirepowerMax = (int)elem.api_houg[1]; } if ( elem.api_raig() ) { param.TorpedoMin = (int)elem.api_raig[0]; param.TorpedoMax = (int)elem.api_raig[1]; } if ( elem.api_tyku() ) { param.AAMin = (int)elem.api_tyku[0]; param.AAMax = (int)elem.api_tyku[1]; } if ( elem.api_souk() ) { param.ArmorMin = (int)elem.api_souk[0]; param.ArmorMax = (int)elem.api_souk[1]; } if ( elem.api_luck() ) { param.LuckMin = (int)elem.api_luck[0]; param.LuckMax = (int)elem.api_luck[1]; } if ( elem.api_leng() ) { param.Range = (int)elem.api_leng; } if ( elem.api_maxeq() ) { param.Aircraft = (int[])elem.api_maxeq; } if ( elem.api_getmes() ) { param.MessageGet = elem.api_getmes; } Update( param ); } // validation foreach ( var record in Record.Values ) { // 無効な装備を持っていた場合、初期装備データを初期化 if ( record.DefaultSlot != null ) { var keys = KCDatabase.Instance.MasterEquipments.Keys; foreach ( int eq in record.DefaultSlot.ToArray() ) { if ( eq != -1 && !keys.Contains( eq ) ) { record.DefaultSlot = null; break; } } } } }
/// <summary> /// パラメータを更新します。 /// </summary> public void UpdateParameter( int shipID, int level, int aswMin, int aswMax, int evasionMin, int evasionMax, int losMin, int losMax ) { ShipParameterElement e = this[shipID]; if ( e == null ) { e = new ShipParameterElement(); e.ShipID = shipID; Utility.Logger.Add( 2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "のパラメータを記録しました。" ); } e.ASW.SetEstParameter( level, aswMin, aswMax ); e.Evasion.SetEstParameter( level, evasionMin, evasionMax ); e.LOS.SetEstParameter( level, losMin, losMax ); Update( e ); Utility.Logger.Add( 1, KCDatabase.Instance.MasterShips[shipID].NameWithClass + "のパラメータを更新しました。" ); }
/// <summary> /// 戦闘開始時の情報から敵艦の情報を読み込みます。 /// </summary> private void BattleStart( string apiname, dynamic data ) { int[] efleet = (int[])data.api_ship_ke; int[] hpMax = (int[])data.api_maxhps; //[0]はダミー(-1) for ( int i = 1; i < efleet.Length; i++ ) { if ( efleet[i] == -1 ) continue; var param = this[efleet[i]]; if ( param == null ) { param = new ShipParameterElement(); param.ShipID = efleet[i]; Utility.Logger.Add( 2, KCDatabase.Instance.MasterShips[param.ShipID].NameWithClass + "のパラメータを記録しました。" ); } int[] baseparam = (int[])data.api_eParam[i - 1]; param.HPMin = param.HPMax = hpMax[i + 6]; param.FirepowerMin = param.FirepowerMax = baseparam[0]; param.TorpedoMin = param.TorpedoMax = baseparam[1]; param.AAMin = param.AAMax = baseparam[2]; param.ArmorMin = param.ArmorMax = baseparam[3]; param.DefaultSlot = (int[])data.api_eSlot[i - 1]; Update( param ); } }
/// <summary> /// パラメータを更新します。 /// </summary> public void UpdateParameter( int shipID, int level, int aswMin, int aswMax, int evasionMin, int evasionMax, int losMin, int losMax ) { ShipParameterElement e = this[shipID]; if ( e == null ) { e = new ShipParameterElement(); e.ShipID = shipID; Utility.Logger.Add( 2, KCDatabase.Instance.MasterShips[shipID].NameWithClass + LoggerRes.RegisteredParameters ); } if ( e.ASW.SetEstParameter( level, aswMin, aswMax ) ) Utility.Logger.Add( 1, string.Format( "ShipParameter: {0} の対潜値が予測範囲から外れました( [{1} ~ {2}] ~ {3} )。", KCDatabase.Instance.MasterShips[e.ShipID].NameWithClass, e.ASW.MinimumEstMin, e.ASW.MinimumEstMax, e.ASW.Maximum ) ); if ( e.Evasion.SetEstParameter( level, evasionMin, evasionMax ) ) Utility.Logger.Add( 1, string.Format( "ShipParameter: {0} の回避値が予測範囲から外れました( [{1} ~ {2}] ~ {3} )。", KCDatabase.Instance.MasterShips[e.ShipID].NameWithClass, e.Evasion.MinimumEstMin, e.Evasion.MinimumEstMax, e.Evasion.Maximum ) ); if ( e.LOS.SetEstParameter( level, losMin, losMax ) ) Utility.Logger.Add( 1, string.Format( "ShipParameter: {0} の索敵値が予測範囲から外れました( [{1} ~ {2}] ~ {3} )。", KCDatabase.Instance.MasterShips[e.ShipID].NameWithClass, e.LOS.MinimumEstMin, e.LOS.MinimumEstMax, e.LOS.Maximum ) ); Update( e ); }
/// <summary> /// ゲーム開始時にパラメータ読み込みフラグを解除、初回読み込みの準備をします。 /// </summary> private void GameStart(string apiname, dynamic data) { ParameterLoadFlag = true; foreach (var elem in data.api_mst_ship) { var param = this[(int)elem.api_id]; if (param == null) { param = new ShipParameterElement(); param.ShipID = (int)elem.api_id; } if (elem.api_taik()) { param.HPMin = (int)elem.api_taik[0]; param.HPMax = (int)elem.api_taik[1]; } if (elem.api_houg()) { param.FirepowerMin = (int)elem.api_houg[0]; param.FirepowerMax = (int)elem.api_houg[1]; } if (elem.api_raig()) { param.TorpedoMin = (int)elem.api_raig[0]; param.TorpedoMax = (int)elem.api_raig[1]; } if (elem.api_tyku()) { param.AAMin = (int)elem.api_tyku[0]; param.AAMax = (int)elem.api_tyku[1]; } if (elem.api_souk()) { param.ArmorMin = (int)elem.api_souk[0]; param.ArmorMax = (int)elem.api_souk[1]; } if (elem.api_luck()) { param.LuckMin = (int)elem.api_luck[0]; param.LuckMax = (int)elem.api_luck[1]; } if (elem.api_leng()) { param.Range = (int)elem.api_leng; } if (elem.api_maxeq()) { param.Aircraft = (int[])elem.api_maxeq; } if (elem.api_getmes()) { param.MessageGet = elem.api_getmes; } Update(param); } // validation foreach (var record in Record.Values) { // 無効な装備を持っていた場合、初期装備データを初期化 if (record.DefaultSlot != null) { var keys = KCDatabase.Instance.MasterEquipments.Keys; foreach (int eq in record.DefaultSlot.ToArray()) { if (eq != -1 && !keys.Contains(eq)) { record.DefaultSlot = null; break; } } } } }
/// <summary> /// レコードの要素を更新します。 /// </summary> /// <param name="elem">更新する要素。</param> public void Update( ShipParameterElement elem ) { this[elem.ShipID] = elem; }
/// <summary> /// レコードの要素を更新します。 /// </summary> /// <param name="elem">更新する要素。</param> public void Update(ShipParameterElement elem) { this[elem.ShipID] = elem; }
/// <summary> /// 戦闘開始時の情報から敵艦の情報を読み込みます。 /// </summary> private void BattleStart( string apiname, dynamic data ) { int[] efleet = (int[])data.api_ship_ke; int[] hpMax = (int[])data.api_maxhps; //[0]はダミー(-1) for ( int i = 1; i < efleet.Length; i++ ) { if ( efleet[i] == -1 ) continue; var param = this[efleet[i]]; if ( param == null ) { param = new ShipParameterElement(); param.ShipID = efleet[i]; } int[] baseparam = (int[])data.api_eParam[i - 1]; param.HPMin = param.HPMax = hpMax[i + 6]; param.FirepowerMin = param.FirepowerMax = baseparam[0]; param.TorpedoMin = param.TorpedoMax = baseparam[1]; param.AAMin = param.AAMax = baseparam[2]; param.ArmorMin = param.ArmorMax = baseparam[3]; param.DefaultSlot = (int[])data.api_eSlot[i - 1]; } }