public LogData.CreateItemInfo CreateLogData(string responseJson, IDictionary <string, string> queryParam, MasterData.Item itemData, MemberData.Deck deckDat, MemberData.Ship shipDat, MemberData.Basic basicDat) { // var json = DynamicJson.Parse(oSession.ResponseJSON); var json = JsonConvert.DeserializeObject <KCB.api_req_kousyou.CreateItem>(responseJson); if ((int)json.api_result != 1) { return(null); } var info = new LogData.CreateItemInfo(queryParam, json.api_data); info.OfficeLv = basicDat.Level; var secretary = shipDat.GetShip(deckDat.Secretary); info.SecretaryShip = string.Format("{0}(Lv{1})", secretary.ShipName, secretary.Level); info.MemberID = basicDat.MemberID; if (info.Succeess) { var it = itemData.GetItemParam(info.ItemNameID); info.ItemName = it.Name; info.ItemType = it.Type; } return(info); }
/// <summary> /// /kcsapi/api_req_nyukyo/start /// 入渠に伴う資材消費を反映させる /// </summary> /// <param name="api_highspeed"></param> public void UpdateOnNDockStart(IDictionary <string, string> queryParam, MemberData.Ship _memberShip) { string ship_id = queryParam["api_ship_id"]; string highspeed = queryParam["api_highspeed"]; var ship = _memberShip.GetShip(ship_id); if (highspeed == "1") { Debug.WriteLine("Using FastRepair"); FastRepair--; } //修理に要した資材を引く Fuel -= ship.RepairFuel; Steel -= ship.RepairSteel; }
/// <summary> /// /kcsapi/api_req_battle_midnight/sp_midnight /// 開幕夜戦 /// </summary> /// <param name="JSON"></param> /// <param name="_memberShip"></param> /// <param name="_memberDeck"></param> /// <param name="_masterShip"></param> public void ProcessNightBattle(string JSON, MemberData.Ship _memberShip, MemberData.Deck _memberDeck, MasterData.Ship _masterShip, MasterData.Item _masterItem) { var json = JsonConvert.DeserializeObject <KCB.api_req_sortie.Battle>(JSON); if (json == null) { return; } if (json.api_result != 1) { return; } var deck_info = _memberDeck.GetFleet(json.api_data.api_deck_id); initializeShipData(json.api_data, deck_info, _memberShip, _masterShip); getHougekiDamage(json.api_data.api_hougeki, _battleResult, _masterItem); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="fleet">艦隊情報</param> /// <param name="shipData">艦娘情報</param> public Deck(MemberData.Deck.Fleet fleet, MemberData.Ship shipData) { Name = fleet.Name; MissionNum = fleet.MissionNum; Member = new List <MemberData.Ship.Info>(); Num = fleet.Num; ShipDataLastUpdated = shipData.LastUpdated; foreach (var it in fleet.Member) { var ship = shipData.GetShip(it); if (ship == null) { continue; } Member.Add(ship); } }
/// <summary> /// 遠征一覧を更新 /// </summary> /// <param name="deckList"></param> public void UpdateMissionList(IEnumerable <MemberData.Deck.Fleet> deckList, MemberData.Ship shipData) { Mission[] mission = new Mission[] { new Mission(), new Mission(), new Mission() }; if (deckList == null) { return; } lock (deckList) { foreach (var it in deckList) { switch (it.Num) { case 1: continue; case 2: case 3: case 4: mission[it.Num - 2].Name = it.Mission; mission[it.Num - 2].Detail = it.MissionDetail; mission[it.Num - 2].Finish = it.MissionFinish; mission[it.Num - 2].DeckName = it.Name; mission[it.Num - 2].Num = it.MissionNum; mission[it.Num - 2].SupplyStatus = CheckFleetStatus(it.Member, shipData); break; default: return; } } } if (InvokeRequired) { BeginInvoke((MethodInvoker)(() => updateMissionView(mission))); } else { updateMissionView(mission); } }
/// <summary> /// 情報更新 /// </summary> /// <param name="shipData">艦隊情報</param> /// <param name="deckList">編成情報</param> public void UpdateDeck(IEnumerable <MemberData.Deck.Fleet> deckList, MemberData.Ship shipData) { List <FleetList.Deck> deck = new List <FleetList.Deck>(); lock (deckList) { foreach (var it in deckList) { deck.Add(new FleetList.Deck(it, shipData)); } } if (InvokeRequired) { BeginInvoke((MethodInvoker)(() => updateDeckView(deck))); } else { updateDeckView(deck); } }
/// <summary> /// /kcsapi/api_req_kaisou/slot_deprive /// </summary> /// <param name="queryParam"></param> /// <param name="responseJson"></param> /// <param name="_memberShip"></param> /// <param name="_memberItem"></param> void PullOutSlotItem(IDictionary <string, string> queryParam, string responseJson, MemberData.Ship _memberShip, MemberData.Item _memberItem) { int srcShipId, dstShipId; if (!int.TryParse(queryParam["api_unset_ship"], out srcShipId) || !int.TryParse(queryParam["api_set_ship"], out dstShipId)) { return; } var json = JsonConvert.DeserializeObject <KCB.api_req_kaisou.SlotDeprive>(responseJson); if (json.api_result != 1) { return; } // 装備装着先変更 _memberShip.LoadShipInfo(new List <KCB.api_get_member.ApiDataShip>() { json.api_data.api_ship_data.api_unset_ship } , _masterShip, json.api_data.api_ship_data.api_unset_ship.api_id); _memberShip.LoadShipInfo(new List <KCB.api_get_member.ApiDataShip>() { json.api_data.api_ship_data.api_set_ship } , _masterShip, json.api_data.api_ship_data.api_set_ship.api_id); _memberItem.UpdateItemOwnerShip(_memberShip); _memberShip.ApplySlotItemData(_memberItem); _memberShip.UpdateDeckInfo(_memberDeck); UpdateDetailStatus("装備を引き抜き装着しました"); _parent.UpdateSlotItemInfo(json.api_data.api_ship_data.api_unset_ship.api_id); _parent.UpdateSlotItemInfo(json.api_data.api_ship_data.api_set_ship.api_id); }
/// <summary> /// 艦隊の燃料と弾薬の補給状況を調べる /// </summary> /// <param name="fleetMember">艦隊メンバー</param> /// <param name="shipData">艦娘ステート一覧</param> /// <returns>どの燃料が消費されているか</returns> SupplyStatusFlags CheckFleetStatus(IEnumerable <int> fleetMember, MemberData.Ship shipData) { SupplyStatusFlags status = SupplyStatusFlags.None; foreach (var ship_id in fleetMember) { var dat = shipData.GetShip(ship_id); if (!dat.Fuel.Full) { Debug.WriteLine("Fuel not filled"); status |= SupplyStatusFlags.Fuel; } if (!dat.Bullet.Full) { Debug.WriteLine("Bullet not filled"); status |= SupplyStatusFlags.Bullet; } } return(status); }
/// <summary> /// /kcsapi/api_req_kaisou/slot_exchange_index /// </summary> /// <param name="queryParam"></param> /// <param name="responseJson"></param> /// <param name="_memberShip"></param> void ChangeSlotItemIndex(string shipId_s, string responseJson, MemberData.Ship _memberShip) { // 装備順番入れ替え後のスロット情報 var json = JsonConvert.DeserializeObject <KCB.api_req_kaisou.SlotExchangeIndex>(responseJson); if (json.api_result != 1) { return; } // スロット入れ替えを反映 var ship_id = _memberShip.UpdateSlotItemOrder(shipId_s, json.api_data.api_slot); if (ship_id < 0) { return; } UpdateDetailStatus("スロット入れ替えを反映しました"); _parent.UpdateSlotItemInfo(ship_id); }
/// <summary> /// 戦闘終了 /kcsapi/api_req_sortie/battleresult /// </summary> /// <param name="JSON"></param> public LogData.BattleResultInfo Finish(string JSON, MemberData.Ship shipData, MemberData.Deck deckData, MasterData.Ship shipMaster, MemberData.Basic basicData) { // var json = DynamicJson.Parse(JSON); var json = JsonConvert.DeserializeObject <KCB.api_req_sortie.BattleResult>(JSON); if ((int)json.api_result != 1) { return(null); } var data = json.api_data; LogData.BattleResultInfo result = new LogData.BattleResultInfo(); result.MemberID = basicData.MemberID; result.Date = DateTime.Now; result.AreaName = data.api_quest_name; result.Rank = data.api_win_rank; //敵情報 result.Foe.DeckName = data.api_enemy_info.api_deck_name; Debug.WriteLine("FoeDeckName:" + result.Foe.DeckName); // double[] enemylist = (double[])data.api_ship_id; // for (int i = 1; i < enemylist.Count(); i++) for (int i = 1; i < data.api_ship_id.Count(); i++) { int enemyID = data.api_ship_id[i]; if (enemyID <= 0) { result.Foe.ShipList[i - 1] = ""; continue; } //何故かeliteとかflagの文字は読みに入ってる var t = shipMaster.LookupShipMaster(enemyID); if (t.Yomi.Length == 1) { result.Foe.ShipList[i - 1] = t.Name; } else { result.Foe.ShipList[i - 1] = string.Format("{0}({1})", t.Name, t.Yomi); } Debug.WriteLine(string.Format("ShipList({0})={1}", i - 1, result.Foe.ShipList[i - 1])); } //自軍情報 var fleet = deckData.GetFleet(battleFleetID); result.Friend.DeckName = fleet.Name; Debug.WriteLine("FriendDeckName:" + result.Friend.DeckName); for (int i = 0; i < fleet.Member.Count(); i++) { if (fleet.Member[i] <= 0) { result.Friend.ShipList[i] = ""; continue; } string header = ""; ///ロスト艦艇 if (data.api_lost_flag != null && (int)data.api_lost_flag[i + 1] != 0) { header = "x"; } //MVPは1オリジン if ((int)data.api_mvp == i + 1) { header = "*"; } var t = shipData.GetShip(fleet.Member[i]); result.Friend.ShipList[i] = string.Format("{0}{1}(Lv{2} HP{3})", header, t.ShipName, t.Level, t.HP); Debug.WriteLine(string.Format("ShipList({0})={1}", i, result.Friend.ShipList[i])); } ///ドロップ // if (data.IsDefined("api_get_ship")) if (data.api_get_ship != null) { result.ShipDropped = string.Format("{0}({1})", data.api_get_ship.api_ship_name, data.api_get_ship.api_ship_type); } Debug.WriteLine("GetShip:" + result.ShipDropped); return(result); }
// /// <summary> /// 建造記録を生成 /// /kcsapi/api_get_member/kdock /// </summary> /// <param name="dockDat"></param> /// <param name="basicDat"></param> /// <param name="deckDat"></param> /// <param name="shipDat"></param> /// <returns></returns> public IEnumerable <LogData.CreateShipInfo> CreateLogData(MemberData.Dock dockDat, MemberData.Basic basicDat, MemberData.Deck deckDat, MemberData.Ship shipDat) { List <LogData.CreateShipInfo> retList = new List <LogData.CreateShipInfo>(); for (int n = 0; n < kdock_build.Count(); n++) { ///既に建造記録を生成しているか、建造していないドックを飛ばす if (!kdock_build[n]) { continue; } var secretary = shipDat.GetShip(deckDat.Secretary); var info = new LogData.CreateShipInfo(); lock (dockDat.KDockLock) { var kdock = dockDat.GetKDock(n + 1); info.Resource = new LogData.Material(kdock); info.ShipType = kdock.Type; info.ShipName = kdock.Name; info.OfficeLv = basicDat.Level; info.SecretaryShip = string.Format("{0}(Lv{1})", secretary.ShipName, secretary.Level); info.Date = DateTime.Now; info.MemberID = basicDat.MemberID; } retList.Add(info); Debug.WriteLine("KDockLog:" + info.ToString()); kdock_build[n] = false; } if (retList.Count == 0) { return(null); } return(retList); }
/// <summary> /// 遠征結果のログ情報を生成 /// </summary> /// <param name="JSON"></param> /// <param name="shipList"></param> /// <returns></returns> public LogData.MissionResultInfo CreateResult(string JSON, MemberData.Ship shipList, MemberData.Basic basicData) { // var json = DynamicJson.Parse(JSON); var json = JsonConvert.DeserializeObject <KCB.api_req_mission.Result>(JSON); if ((int)json.api_result != 1) { return(null); } var result = json.api_data; if (result == null) { return(null); } LogData.MissionResultInfo res = new LogData.MissionResultInfo(); res.MemberID = basicData.MemberID; res.AreaName = result.api_maparea_name; res.QuestName = result.api_quest_name; res.Date = DateTime.Now; res.Succeeded = (int)result.api_clear_result; //失敗したとき、api_get_material = -1で帰ってくる // Type typMaterial = result.api_get_material.GetType(); // if (typMaterial != typeof(Codeplex.Data.DynamicJson)) // if(result.api_get_material is Codeplex.Data.DynamicJson) // res.Material = new LogData.Material((double[])result.api_get_material); if (result.api_get_material is Newtonsoft.Json.Linq.JArray) { res.Material = new LogData.Material((Newtonsoft.Json.Linq.JArray)result.api_get_material); } else { res.Material = new LogData.Material(); } if (result.api_useitem_flag[0] != 0) { res.Item.Add( string.Format("{0}x{1}", itemName((int)result.api_useitem_flag[0] , result.api_get_item1.api_useitem_name), (int)result.api_get_item1.api_useitem_count) ); } if (result.api_useitem_flag[1] != 0) { res.Item.Add( string.Format("{0}x{1}", itemName((int)result.api_useitem_flag[1] , result.api_get_item2.api_useitem_name), (int)result.api_get_item2.api_useitem_count) ); } // double[] ships = (double[]) result.api_ship_id; // for (int n = 1; n < ships.Count(); n++) for (int n = 1; n < result.api_ship_id.Count(); n++) { var it = shipList.GetShip(result.api_ship_id[n]); res.Member.Add(string.Format("{0}({1}Lv{2})", it.ShipName, it.ShipType, it.Level)); Debug.WriteLine("Member:" + res.Member.Last()); } Debug.WriteLine("result:" + res.ToString()); return(res); }
/// <summary> /// /kcsapi/api_req_sortie/battle /// 戦闘開始 /// </summary> /// <param name="JSON"></param> /// <param name="practice">演習の時true</param> /// <param name="_memberShip"></param> /// <param name="_memberDeck"></param> /// <param name="_masterShip"></param> public int ProcessBattle(string JSON, bool practice, MemberData.Ship _memberShip, MemberData.Deck _memberDeck, MasterData.Ship _masterShip, MasterData.Item _masterItem) { var json = JsonConvert.DeserializeObject <KCB.api_req_sortie.Battle>(JSON); if (json == null) { return(0); } if (json.api_result != 1) { return(0); } _practice = practice; var result = json.api_data; var deck_info = _memberDeck.GetFleet(result.api_dock_id); int estimatedBattleTime = InitialPhase; initializeShipData(result, deck_info, _memberShip, _masterShip); //索敵フェイズ if (_battleResult.Friend.SearchResult != Result.FleetState.SearchResultType.索敵なし) { estimatedBattleTime += SearchPhase; } //支援艦隊が来た if (result.api_support_flag > 0 && result.api_support_info != null) { //航空支援(flag=1) if (result.api_support_info.api_support_airatack != null) { Debug.WriteLine("航空支援(味方から敵へ)"); getRaiDamage(result.api_support_info.api_support_airatack.api_stage3.api_edam, _battleResult.Enemy.Ships); estimatedBattleTime += SupportTime; } //砲雷撃支援(flag=2/雷撃,3/砲撃) if (result.api_support_info.api_support_hourai != null) { Debug.WriteLine("砲雷支援(味方から敵へ)"); getRaiDamage(result.api_support_info.api_support_hourai.api_damage, _battleResult.Enemy.Ships); estimatedBattleTime += SupportTime; } } //開幕対潜 if (result.api_opening_taisen_flag == 1 && result.api_opening_taisen != null) { Debug.WriteLine("開幕対潜攻撃"); estimatedBattleTime += getHougekiDamage(result.api_opening_taisen, _battleResult, _masterItem); } // 開幕雷撃 if (result.api_opening_flag == 1 && result.api_opening_atack != null) { Debug.WriteLine("開幕雷撃(敵から味方へ)"); estimatedBattleTime += getRaiDamage(result.api_opening_atack.api_fdam, _battleResult.Friend.Ships); Debug.WriteLine("開幕雷撃(味方から敵へ)"); getRaiDamage(result.api_opening_atack.api_edam, _battleResult.Enemy.Ships); } estimatedBattleTime += Torpedo; // 航空戦 if (result.api_stage_flag[2] == 1 && result.api_kouku.api_stage3 != null) { Debug.WriteLine("航空戦(敵から味方へ)"); estimatedBattleTime += getRaiDamage(result.api_kouku.api_stage3.api_fdam, _battleResult.Friend.Ships); Debug.WriteLine("航空戦(味方から敵へ)"); getRaiDamage(result.api_kouku.api_stage3.api_edam, _battleResult.Enemy.Ships); } estimatedBattleTime += AirBattle; // 砲撃1順目 if (result.api_hourai_flag[0] == 1 && result.api_hougeki1 != null) { Debug.WriteLine("砲撃1順目"); estimatedBattleTime += getHougekiDamage(result.api_hougeki1, _battleResult, _masterItem); } // 砲撃2順目 if (result.api_hourai_flag[1] == 1 && result.api_hougeki2 != null) { Debug.WriteLine("砲撃2順目"); estimatedBattleTime += getHougekiDamage(result.api_hougeki2, _battleResult, _masterItem); } // 砲撃3順目 if (result.api_hourai_flag[2] == 1 && result.api_hougeki3 != null) { Debug.WriteLine("砲撃3順目"); estimatedBattleTime += getHougekiDamage(result.api_hougeki3, _battleResult, _masterItem); } // 雷撃 if (result.api_hourai_flag[3] == 1 && result.api_raigeki != null) { Debug.WriteLine("雷撃(敵から味方へ)"); estimatedBattleTime += getRaiDamage(result.api_raigeki.api_fdam, _battleResult.Friend.Ships); Debug.WriteLine("雷撃(味方から敵へ)"); getRaiDamage(result.api_raigeki.api_edam, _battleResult.Enemy.Ships); } estimatedBattleTime += Torpedo; //夜戦の場合は待つ必要がないから0を返す。 return(result.api_midnight_flag != 0 ? estimatedBattleTime : 0); }
/// <summary> /// 内部状態の初期化 /// </summary> /// <param name="result">戦闘結果</param> /// <param name="_memberShip"></param> /// <param name="fleetInfo">艦隊情報</param> /// <param name="_masterShip"></param> private void initializeShipData(KCB.api_req_sortie.Battle.ApiData result, MemberData.Deck.Fleet fleetInfo, MemberData.Ship _memberShip, MasterData.Ship _masterShip) { Debug.WriteLine("戦闘開始/艦隊番号:" + fleetInfo.Num.ToString()); _battleResult = new Result(result.api_midnight_flag == 1, _practice); //戦闘形態を取得する _battleResult.Friend.Formation = (Result.FleetState.FormationType)result.api_formation[0]; _battleResult.Enemy.Formation = (Result.FleetState.FormationType)result.api_formation[1]; if (result.api_search != null) { _battleResult.Friend.SearchResult = (Result.FleetState.SearchResultType)result.api_search[0]; _battleResult.Enemy.SearchResult = (Result.FleetState.SearchResultType)result.api_search[1]; } else { _battleResult.Friend.SearchResult = Result.FleetState.SearchResultType.索敵なし; _battleResult.Enemy.SearchResult = Result.FleetState.SearchResultType.索敵なし; } _battleResult.MatchState = (Result.MatchType)result.api_formation[2]; Debug.WriteLine(string.Format("自陣形:{0} {1}\n敵陣形:{2} {3}\n交戦形態:{4}\n夜戦:{5}", _battleResult.Friend.Formation, _battleResult.Friend.SearchResult, _battleResult.Enemy.Formation, _battleResult.Enemy.SearchResult, _battleResult.MatchState, _battleResult.HasNightBattle)); ///味方艦隊の情報を取得する for (int i = 0; i < fleetInfo.Member.Count; i++) { var ship_id = fleetInfo.Member[i]; var ship = _memberShip.GetShip(ship_id); var info = _battleResult.Friend.Ships[i]; info.Initialize(ship_id, ship.ShipNameId, ship.ShipName, ship.ShipTypeId, result.api_maxhps[i + 1], result.api_nowhps[i + 1]); Debug.WriteLine(string.Format("No.{0} ID:{1} Name:{2} HP:{3}", i + 1, ship_id, ship.ShipName, ship.HP.ToString())); } ///敵艦隊の情報を取得する for (int i = 0; i < 6; i++) { int ship_id = result.api_ship_ke[i + 1]; if (ship_id < 0) { continue; } var ship = _masterShip.LookupShipMaster(ship_id); var info = _battleResult.Enemy.Ships[i]; string shipName; if (_practice) { shipName = ship.Name; } else { shipName = string.Format("{0}{1}", ship.Name, ship.Yomi); } info.Initialize(-1, ship_id, shipName, ship.ShipTypeId, result.api_maxhps[i + 7], result.api_nowhps[i + 7]); Debug.WriteLine(string.Format("No.{0} Name:{1} HP:{2}/{3}", i + 1, shipName, result.api_maxhps[i + 7], result.api_nowhps[i + 7])); } }