Exemplo n.º 1
0
        internal Logger(KanColleProxy proxy)
        {
            this.shipmats = new int[5];

            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_req_kousyou/createitem")
            .Select(x =>
            {
                SvData <kcsapi_createitem> result;
                return(SvData.TryParse(x, out result) ? result : null);
            })
            .Where(x => x != null && x.IsSuccess)
            .Subscribe(x => this.CreateItem(x.Data, x.RequestBody));

            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_req_kousyou/createship")
            .Select(x =>
            {
                SvData <kcsapi_createship> result;
                return(SvData.TryParse(x, out result) ? result : null);
            })
            .Where(x => x != null && x.IsSuccess)
            .Subscribe(x => this.CreateShip(x.RequestBody));

            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_get_member/kdock")
            .TryParse <kcsapi_kdock[]>()
            .Subscribe(this.KDock);

            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_req_sortie/battleresult")
            .TryParse <kcsapi_battleresult>()
            .Subscribe(this.BattleResult);
        }
Exemplo n.º 2
0
        private void UpdateBehavior(SvData data)
        {
            if (data == null || !data.IsSuccess)
            {
                return;
            }

            try
            {
                var fleet     = this.AirFleets[int.Parse(data.Request["api_area_id"])];
                var regiments = data.Request["api_base_id"].Split(',');
                var behaviors = data.Request["api_action_kind"].Split(',');

                for (int i = 0; i < regiments.Length; i++)
                {
                    var regiment = fleet.Regiments[int.Parse(regiments[i])];
                    var behavior = (AirRegimentBehavior)int.Parse(behaviors[i]);

                    regiment.Behavior = behavior;
                }

                fleet.UpdateFleetState();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine($"基地航空隊の挙動の変更に失敗しました。\n{ex}");
            }
        }
Exemplo n.º 3
0
 private void UpdateSortieInfo(SvData <kcsapi_map_start> data)        // kcsapi_map_start/kcsapi_map_next
 {
     try
     {
         if (data == null || !data.IsSuccess)
         {
             return;
         }
         int id;
         if (int.TryParse(data.Request["api_deck_id"], out id))
         {
             this.Fleets[id].UpdateSortieInfo(data.Data);
             if (this.Combined && id == 1)
             {
                 this.Fleets[2].UpdateSortieInfo(data.Data);
             }
         }
         else
         {
             foreach (var fleet in GetFleetsInSortie())
             {
                 fleet.UpdateSortieInfo(data.Data);
             }
         }
     }
     catch { }
 }
Exemplo n.º 4
0
 internal ParsedMessage(string name, NameValueCollection request, SvData response)
 {
     Name           = name;
     Request        = request;
     ResultCode     = response.api_result;
     ResultMesssage = response.api_result_msg;
 }
Exemplo n.º 5
0
        private void ExchangeSlot(SvData <kcsapi_slot_exchange_index> data)
        {
            try
            {
                var ship = this.Ships[int.Parse(data.Request["api_id"])];
                if (ship == null)
                {
                    return;
                }

                ship.RawData.api_slot = data.Data.api_slot;
                ship.UpdateSlots();

                var fleet = this.Fleets.Values.FirstOrDefault(x => x.Ships.Any(y => y.Id == ship.Id));
                if (fleet == null)
                {
                    return;
                }

                fleet.State.Calculate();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("装備の入れ替えに失敗しました: {0}", ex);
            }
        }
Exemplo n.º 6
0
        private void Powerup(SvData <kcsapi_powerup> svd)
        {
            try
            {
                this.Ships[svd.Data.api_ship.api_id]?.Update(svd.Data.api_ship);

                var items = svd.Request["api_id_items"]
                            .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                            .Select(int.Parse)
                            .Where(x => this.Ships.ContainsKey(x))
                            .Select(x => this.Ships[x])
                            .ToArray();

                // (改修に使った艦娘のこと item って呼ぶのどうなの…)

                foreach (var x in items)
                {
                    this.homeport.Itemyard.RemoveFromShip(x);
                    this.Ships.Remove(x);
                }

                this.RaiseShipsChanged();
                this.Update(svd.Data.api_deck);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("近代化改修による更新に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 7
0
        private void Start(SvData data)
        {
            try
            {
                //var dock = this.Docks[int.Parse(data.Request["api_ndock_id"])];
                var ship      = this.homeport.Organization.Ships[int.Parse(data.Request["api_ship_id"])];
                var highspeed = data.Request["api_highspeed"] == "1";

                if (highspeed)
                {
                    ship.Repair();

                    var fleet = this.homeport.Organization.GetFleet(ship.Id);
                    if (fleet != null)
                    {
                        fleet.State.Update();
                    }
                }

                // 高速修復でない場合、別途 ndock が来るので、ここで何かする必要はなさげ
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("入渠開始の解析に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 8
0
        private void Powerup(SvData <kcsapi_powerup> svd)
        {
            try
            {
                var target = this.Ships[svd.Data.api_ship.api_id];
                if (target != null)
                {
                    target.Update(svd.Data.api_ship);
                }

                var items = svd.Request["api_id_items"]
                            .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                            .Select(int.Parse)
                            .Where(x => this.Ships.ContainsKey(x))
                            .Select(x => this.Ships[x]);

                // (改修に使った艦娘のこと item って呼ぶのどうなの…)

                this.Ships = new MemberTable <Ship>(this.Ships.Select(kvp => kvp.Value).Except(items));
                this.Update(svd.Data.api_deck);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("近代化改修による更新に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 9
0
        private void DestoryShip(SvData <kcsapi_destroyship> svd)
        {
            try
            {
                var ships = svd.Request["api_ship_id"]
                            .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                            .Select(x => int.Parse(x))
                            .Select(x => this.Ships[x]);

                var slot_dest = svd.Request["api_slot_dest_flag"] != "0";

                foreach (var ship in ships)
                {
                    if (slot_dest)
                    {
                        this.homeport.Itemyard.RemoveFromShip(ship);
                    }

                    this.Ships.Remove(ship);
                }
                this.RaiseShipsChanged();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("解体による更新に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 10
0
        public static SvData <T> TryParse <T>(this Session x, bool IsSuccess = true)
        {
            SvData <T> result;

            return(SvData.TryParse(x, out result)
                                ? ((!IsSuccess || result.IsSuccess) ? result : null)
                                : null);
        }
Exemplo n.º 11
0
 /// <summary>
 /// FiddlerCore でフックした <see cref="Session" /> オブジェクトの <see cref="Session.ResponseBody" /> データを
 /// <see cref="SvData" /> 型にパースします。
 /// </summary>
 public static IObservable <SvData> TryParse(this IObservable <Session> source)
 {
     return(source.Select(x =>
     {
         SvData result;
         return SvData.TryParse(x, out result) ? result : null;
     }));
 }
 public void OnNext(SvData <kcsapi_combined_battle_battleresult> value)
 {
     if (_onBattleResult == null)
     {
         return;
     }
     _onBattleResult(new BattleResult(value.Data));
 }
Exemplo n.º 13
0
        private void Sortie(SvData <kcsapi_battle> battle)
        {
            var target = this.Fleets[battle.Data.api_dock_id];

            if (target != null)
            {
                target.Sortie();
            }
        }
Exemplo n.º 14
0
        internal Homeport(KanColleProxy proxy)
        {
            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_get_member/basic")
            .TryParse <kcsapi_basic>()
            .Subscribe(x => this.Admiral = new Admiral(x));

            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_get_member/material")
            .TryParse <kcsapi_material[]>()
            .Subscribe(x => this.Materials = new Materials(x.Select(m => new Material(m)).ToArray()));

            this.Ships  = new MemberTable <Ship>();
            this.Fleets = new MemberTable <Fleet>();
            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_get_member/ship")
            .Select(x => { SvData <kcsapi_ship2[]> result; return(SvData.TryParse(x, out result) ? result : null); })
            .Where(x => x != null && x.IsSuccess)
            .Subscribe(x => this.Ships = new MemberTable <Ship>(x.Data.Select(s => new Ship(this, s))));

            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_get_member/ship2")
            .Select(x => { SvData <kcsapi_ship2[]> result; return(SvData.TryParse(x, out result) ? result : null); })
            .Where(x => x != null && x.IsSuccess)
            .Subscribe(x =>
            {
                this.Ships = new MemberTable <Ship>(x.Data.Select(s => new Ship(this, s)));
                this.UpdateFleets(x.Fleets);
            });
            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_get_member/ship3")
            .TryParse <kcsapi_ship3>()
            .Subscribe(x =>
            {
                this.Ships = new MemberTable <Ship>(x.api_ship_data.Select(s => new Ship(this, s)));
                this.UpdateFleets(x.api_deck_data);
            });

            this.SlotItems = new MemberTable <SlotItem>();
            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_get_member/slotitem")
            .TryParse <kcsapi_slotitem[]>()
            .Subscribe(x => this.SlotItems = new MemberTable <SlotItem>(x.Select(s => new SlotItem(s))));

            this.UseItems = new MemberTable <UseItem>();
            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_get_member/useitem")
            .TryParse <kcsapi_useitem[]>()
            .Subscribe(x => this.UseItems = new MemberTable <UseItem>(x.Select(s => new UseItem(s))));

            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_get_member/deck")
            .TryParse <kcsapi_deck[]>()
            .Subscribe(this.UpdateFleets);

            proxy.ApiSessionSource.Where(x => x.PathAndQuery == "/kcsapi/api_get_member/deck_port")
            .TryParse <kcsapi_deck[]>()
            .Subscribe(this.UpdateFleets);

            this.Dockyard   = new Dockyard(proxy);
            this.Repairyard = new Repairyard(this, proxy);
            this.Quests     = new Quests(proxy);
            this.Logger     = new Logger(proxy);
        }
Exemplo n.º 15
0
        /// <summary>
        /// FiddlerCore でフックした <see cref="Session" /> オブジェクトの <see cref="Session.ResponseBody" /> データを
        /// <see cref="SvData" /> 型にパースします。
        /// </summary>
        public static IObservable <SvData> TryParse(this IObservable <Session> source)
        {
            Func <Session, SvData> converter = session =>
            {
                SvData result;
                return(SvData.TryParse(session, out result) ? result : null);
            };

            return(source.Select(converter).Where(x => x != null && x.IsSuccess));
        }
Exemplo n.º 16
0
 public void OnNext(SvData <kcsapi_ship2[]> value)
 {
     try {
         if (!value.IsSuccess)
         {
             return;
         }
         DataStore.Store.Current.UpdateShips(value.Data);
     } catch (Exception) { }
 }
Exemplo n.º 17
0
        public void Initialieze()
        {
            var proxy = this.Proxy ?? (this.Proxy = new KanColleProxy());

            /*
             * var basic = proxy.api_get_member_basic.TryParse<kcsapi_basic>().FirstAsync().ToTask();
             * var kdock = proxy.api_get_member_kdock.TryParse<kcsapi_kdock[]>().FirstAsync().ToTask();
             * var sitem = proxy.api_get_member_slot_item.TryParse<kcsapi_slotitem[]>().FirstAsync().ToTask();
             */
            var requireInfo = proxy.api_get_member_require_info.TryParse <kcsapi_require_info>().FirstAsync().ToTask();


            this.Updater      = new Updater();
            this.Translations = new Translations();

            proxy.api_start2.FirstAsync().Subscribe(async session =>
            {
                var timeout = Task.Delay(TimeSpan.FromSeconds(20));
                //var canInitialize = await Task.WhenAny(new Task[] { basic, kdock, sitem }.WhenAll(), timeout) != timeout;
                var canInitialize = await Task.WhenAny(new Task[] { requireInfo }.WhenAll(), timeout) != timeout;

                // タイムアウト仕掛けてるのは、今後のアップデートで basic, kdock, slot_item のいずれかが来なくなったときに
                // 起動できなくなる (IsStarted を true にできなくなる) のを防ぐため
                // -----
                // ま、そんな規模の変更があったらそもそもまともに動作せんだろうがな ☝(◞‸◟)☝ 野良ツールはつらいよ

                SvData <kcsapi_start2> svd;
                if (!SvData.TryParse(session, out svd))
                {
                    return;
                }

                this.Master = new Master(svd.Data);
                if (this.Homeport == null)
                {
                    this.Homeport = new Homeport(proxy);
                }

                if (canInitialize)
                {
                    /*
                     * this.Homeport.UpdateAdmiral((await basic).Data);
                     * this.Homeport.Itemyard.Update((await sitem).Data);
                     * this.Homeport.Dockyard.Update((await kdock).Data);
                     */
                    var data = await requireInfo;
                    this.Homeport.UpdateAdmiral(data.Data.api_basic);
                    this.Homeport.Itemyard.Update(data.Data.api_slot_item);
                    this.Homeport.Dockyard.Update(data.Data.api_kdock);
                }

                this.IsStarted = true;
            });
        }
Exemplo n.º 18
0
        public void OnNext(SvData <kcsapi_createship> value)
        {
            var data = value.Request;

            _waitDockId = int.Parse(data["api_kdock_id"]);
            fuel        = int.Parse(data["api_item1"]);
            ammo        = int.Parse(data["api_item2"]);
            steel       = int.Parse(data["api_item3"]);
            bauxite     = int.Parse(data["api_item4"]);
            mat         = int.Parse(data["api_item5"]);
        }
Exemplo n.º 19
0
        private void Change(SvData data)
        {
            if (data == null || !data.IsSuccess)
            {
                return;
            }

            try
            {
                var fleet = this.Fleets[int.Parse(data.Request["api_id"])];

                var index  = int.Parse(data.Request["api_ship_idx"]);
                var shipId = int.Parse(data.Request["api_ship_id"]);
                if (index == 0 && shipId == -2)
                {
                    // 旗艦以外をすべて外すケース
                    fleet.UnsetAll();
                    fleet.RaiseShipsUpdated();
                    return;
                }

                var ship = this.Ships[int.Parse(data.Request["api_ship_id"])];
                if (ship == null)
                {
                    // 艦を外すケース
                    fleet.Unset(index);
                    fleet.RaiseShipsUpdated();
                    return;
                }

                var currentFleet = this.GetFleet(ship.Id);
                if (currentFleet == null)
                {
                    // ship が、現状どの艦隊にも所属していないケース
                    fleet.Change(index, ship);
                    fleet.RaiseShipsUpdated();
                    return;
                }

                // ship が、現状いずれかの艦隊に所属しているケース
                var currentIndex = Array.IndexOf(currentFleet.Ships, ship);
                var old          = fleet.Change(index, ship);

                // Fleet.Change(int, Ship) は、変更前の艦を返す (= old) ので、
                // ship の移動元 (currentFleet + currentIndex) に old を書き込みにいく
                currentFleet.Change(currentIndex, old);
                fleet.RaiseShipsUpdated();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("編成の変更に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 20
0
		private void UpdateComment(SvData data)
		{
			if (data == null || !data.IsSuccess) return;

			try
			{
				this.Admiral.Comment = data.Request["api_cmt"];
			}
			catch (Exception ex)
			{
				System.Diagnostics.Debug.WriteLine("艦隊名の変更に失敗しました: {0}", ex);
			}
		}
        public void OnNext(SvData <kcsapi_createitem> value)
        {
            if (_onItemCreate == null)
            {
                return;
            }

            var req = value.Request;
            var res = value.Data;

            _onItemCreate(new ItemCreate(int.Parse(req["api_item1"]), int.Parse(req["api_item2"]), int.Parse(req["api_item3"]), int.Parse(req["api_item4"]),
                                         res.api_slot_item?.api_slotitem_id ?? int.Parse(res.api_fdata.Substring(res.api_fdata.IndexOf(',') + 1)),
                                         res.api_create_flag == 1 ? 1 : 0));
        }
Exemplo n.º 22
0
        private void ChangeSpeed(SvData svd)
        {
            try
            {
                var dock = this.Docks[int.Parse(svd.Request["api_kdock_id"])];
                var highspeed = svd.Request["api_highspeed"] == "1";

                if (highspeed) dock.Finish();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("高速建造材使用の解析に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 23
0
        public void Update(SvData <map_start_next> start)
        {
            var mapArea = int.Parse(start.Request["api_maparea_id"]);
            var mapNo   = int.Parse(start.Request["api_mapinfo_no"]);
            var infoId  = this.MapAreas[mapArea][mapNo].Id;

            var cells = start.Data.api_cell_data
                        .Select(cell => new MapCell(cell, mapArea, mapNo, infoId))
                        .ToDictionary(x => x.Id, x => x);

            this.MapCells = this.MapCells.Merge(cells);
            Debug.WriteLine(this.MapCells.Values.Count(c => c.MapAreaId == 36 && c.MapInfoId == 361));
            this.Serialize(this.filePath);
        }
Exemplo n.º 24
0
        public void OnNext(SvData <kcsapi_kdock[]> value)
        {
            var waitDockId = _waitDockId;

            if (waitDockId < 0)
            {
                return;
            }
            _waitDockId = -1;

            if (_onShipCreate != null)
            {
                _onShipCreate(new ShipCreate(fuel, ammo, steel, bauxite, mat, waitDockId, value.Data[waitDockId - 1].api_created_ship_id));
            }
        }
Exemplo n.º 25
0
 private void DestoryShip(SvData <kcsapi_destroyship> svd)
 {
     try
     {
         var ship = this.Ships[int.Parse(svd.Request["api_ship_id"])];
         if (ship != null)
         {
             this.Ships = new MemberTable <Ship>(this.Ships.Select(kvp => kvp.Value).Except(new[] { ship }));
         }
     }
     catch (Exception ex)
     {
         System.Diagnostics.Debug.WriteLine("解体による更新に失敗しました: {0}", ex);
     }
 }
Exemplo n.º 26
0
 private void UpdateSortieInfo(SvData <kcsapi_combined_battle_battleresult> data)
 {
     try
     {
         if (data == null || !data.IsSuccess)
         {
             return;
         }
         foreach (var fleet in GetFleetsInSortie())
         {
             fleet.UpdateSortieInfo(data.Data);
         }
     }
     catch { }
 }
Exemplo n.º 27
0
        private void ChangeSpeed(SvData svd)
        {
            try
            {
                var dock      = this.Docks[int.Parse(svd.Request["api_kdock_id"])];
                var highspeed = svd.Request["api_highspeed"] == "1";

                if (highspeed)
                {
                    dock.Finish();
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("고속수복제 사용 해석 실패: {0}", ex);
            }
        }
Exemplo n.º 28
0
        private void ChangeSpeed(SvData data)
        {
            try
            {
                var dock = this.Docks[int.Parse(data.Request["api_ndock_id"])];
                var ship = dock.Ship;

                dock.Finish();
                ship.Repair();

                this.homeport.Organization.GetFleet(ship.Id)?.State.Update();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("高速修復材の解析に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 29
0
        private void UpdateSquadrons(SvData <kcsapi_air_base> data)
        {
            if (data == null || !data.IsSuccess)
            {
                return;
            }

            var raw = data.Data;

            try
            {
                var fleet    = this.AirFleets[int.Parse(data.Request["api_area_id"])];
                var regiment = fleet.Regiments[int.Parse(data.Request["api_base_id"])];

                if (int.Parse(data.Request["api_item_id"]) == -1)
                {
                    var info = raw.api_plane_info[0];
                    var prev = regiment.UnsetSquadron(info.api_squadron_id, (SquadronState)info.api_state);

                    this.RelocateSquadron(prev);
                }
                else if (raw.api_plane_info.Length == 1)
                {
                    var info = raw.api_plane_info[0];
                    var prev = regiment.SetOrReplaceSquadron(info);

                    if (prev != null)
                    {
                        this.RelocateSquadron(prev);
                    }
                }
                else
                {
                    regiment.ExchangeSquadrons(raw.api_plane_info);
                }

                regiment.Distance = raw.api_distance.api_base + raw.api_distance.api_bonus;

                fleet.UpdateFleetState();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine($"基地航空隊の航空機の変更に失敗しました。\n{ex}");
            }
        }
Exemplo n.º 30
0
        private void DestoryShip(SvData <kcsapi_destroyship> svd)
        {
            try
            {
                var ship = this.Ships[int.Parse(svd.Request["api_ship_id"])];
                if (ship != null)
                {
                    this.homeport.Itemyard.RemoveFromShip(ship);

                    this.Ships.Remove(ship);
                    this.RaiseShipsChanged();
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("解体による更新に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 31
0
        private void Start(SvData data)
        {
            try
            {
                var ship      = this.homeport.Organization.Ships[int.Parse(data.Request["api_ship_id"])];
                var highspeed = data.Request["api_highspeed"] == "1";

                if (highspeed)
                {
                    ship.Repair();
                    this.homeport.Organization.GetFleet(ship.Id)?.State.Update();
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("입거 개시 해석 실패: {0}", ex);
            }
        }
Exemplo n.º 32
0
        private void ChangeSpeed(SvData data)
        {
            try
            {
                var dock = this.Docks[int.Parse(data.Request["api_ndock_id"])];
                var ship = dock.Ship;

                dock.Finish();
                ship.Repair();

                var fleet = this.homeport.Organization.GetFleet(ship.Id);
                if (fleet != null) fleet.State.Update();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("高速修復材の解析に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 33
0
        private void Powerup(SvData<kcsapi_powerup> svd)
        {
            try
            {
                var target = this.Ships[svd.Data.api_ship.api_id];
                if (target != null)
                {
                    target.Update(svd.Data.api_ship);
                }

                var items = svd.Request["api_id_items"]
                    .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                    .Select(int.Parse)
                    .Where(x => this.Ships.ContainsKey(x))
                    .Select(x => this.Ships[x])
                    .ToArray();

                // (改修に使った艦娘のこと item って呼ぶのどうなの…)

                foreach (var x in items)
                {
                    this.homeport.Itemyard.RemoveFromShip(x);
                    this.Ships.Remove(x);
                }

                this.RaiseShipsChanged();
                this.Update(svd.Data.api_deck);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("近代化改修による更新に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 34
0
        private void DestoryShip(SvData<kcsapi_destroyship> svd)
        {
            try
            {
                var ship = this.Ships[int.Parse(svd.Request["api_ship_id"])];
                if (ship != null)
                {
                    this.homeport.Itemyard.RemoveFromShip(ship);

                    this.Ships.Remove(ship);
                    this.RaiseShipsChanged();
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("解体による更新に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 35
0
        private void Change(SvData data)
        {
            if (data == null || !data.IsSuccess) return;

            try
            {
                var fleet = this.Fleets[int.Parse(data.Request["api_id"])];
                var index = int.Parse(data.Request["api_ship_idx"]);
                if (index == -1)
                {
                    // 旗艦以外をすべて外すケース
                    fleet.UnsetAll();
                    return;
                }

                var ship = this.Ships[int.Parse(data.Request["api_ship_id"])];
                if (ship == null)
                {
                    // 艦を外すケース
                    fleet.Unset(index);
                    return;
                }

                var currentFleet = this.GetFleet(ship.Id);
                if (currentFleet == null)
                {
                    // ship が、現状どの艦隊にも所属していないケース
                    fleet.Change(index, ship);
                    return;
                }

                // ship が、現状いずれかの艦隊に所属しているケース
                var currentIndex = Array.IndexOf(currentFleet.Ships, ship);
                var old = fleet.Change(index, ship);

                // Fleet.Change(int, Ship) は、変更前の艦を返す (= old) ので、
                // ship の移動元 (currentFleet + currentIndex) に old を書き込みにいく
                currentFleet.Change(currentIndex, old);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("編成の変更に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 36
0
 private void CreateSlotItem(SvData<kcsapi_createitem> svd)
 {
     this.CreatedSlotItem = new CreatedSlotItem(svd.Data);
 }
Exemplo n.º 37
0
		private void UpdateSortieInfo(SvData<kcsapi_map_start> data) // kcsapi_map_start/kcsapi_map_next
		{
			try
			{
				if (data == null || !data.IsSuccess) return;
				int id;
				if (int.TryParse(data.Request["api_deck_id"], out id))
				{
					this.Fleets[id].UpdateSortieInfo(data.Data);
					if (this.Combined && id == 1) this.Fleets[2].UpdateSortieInfo(data.Data);
				}
				else
				{
					foreach (var fleet in GetFleetsInSortie())
					{
						fleet.UpdateSortieInfo(data.Data);
					}
				}
			}
			catch { }
		}
Exemplo n.º 38
0
        public void Update(SvData<map_start_next> start)
        {
            var mapArea = int.Parse(start.Request["api_maparea_id"]);
            var mapNo = int.Parse(start.Request["api_mapinfo_no"]);
            var infoId = this.MapAreas[mapArea][mapNo].Id;

            var cells = start.Data.api_cell_data
                .Select(cell => new MapCell(cell, mapArea, mapNo, infoId))
                .ToDictionary(x => x.Id, x => x);

            this.MapCells = this.MapCells.Merge(cells);
            Debug.WriteLine(this.MapCells.Values.Count(c => c.MapAreaId == 36 && c.MapInfoId == 361));
            this.Serialize(this.filePath);
        }
Exemplo n.º 39
0
        private void DestroyItem(SvData<kcsapi_destroyitem2> data)
        {
            if (data == null || !data.IsSuccess) return;

            try
            {
                foreach (var x in data.Request["api_slotitem_ids"].Split(',').Select(int.Parse))
                {
                    this.SlotItems.Remove(x);
                }
                this.RaiseSlotItemsChanged();
            }
            catch (Exception ex)
            {
                Debug.WriteLine("装備の破棄に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 40
0
        private void ExchangeSlot(SvData<kcsapi_slot_exchange_index> data)
        {
            try
            {
                var ship = this.Ships[int.Parse(data.Request["api_id"])];
                if (ship == null) return;

                ship.RawData.api_slot = data.Data.api_slot;
                ship.UpdateSlots();

                var fleet = this.Fleets.Values.FirstOrDefault(x => x.Ships.Any(y => y.Id == ship.Id));
                if (fleet == null) return;

                fleet.State.Calculate();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("装備の入れ替えに失敗しました: {0}", ex);
            }
        }
Exemplo n.º 41
0
 private void Sortie(SvData<kcsapi_battle> battle)
 {
     var target = this.Fleets[battle.Data.api_dock_id];
     if (target != null)
     {
         target.Sortie();
     }
 }
Exemplo n.º 42
0
        private MapData[] UpdateRank(SvData<map_select_eventmap_rank> data)
        {
            var rank = 0;
            int.TryParse(data.Request["api_rank"], out rank);
            var areaId = data.Request["api_maparea_id"];
            var mapNo = data.Request["api_map_no"];

            var list = this.Maps.MapList;
            var targetMap = list.FirstOrDefault(m => m.Id.ToString() == areaId + mapNo);
            if (targetMap?.Eventmap == null) return list;

            targetMap.Eventmap.SelectedRank = rank;
            targetMap.Eventmap.MaxMapHp = null;
            targetMap.Eventmap.NowMapHp = null;
            return list;
        }
Exemplo n.º 43
0
        private void Sortie(SvData data)
        {
            if (data == null || !data.IsSuccess) return;

            try
            {
                var id = int.Parse(data.Request["api_deck_id"]);
                var fleet = this.Fleets[id];
                fleet.Sortie();

                if (this.Combined && id == 1) this.Fleets[2].Sortie();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("艦隊の出撃を検知できませんでした: {0}", ex);
            }
        }
Exemplo n.º 44
0
        private void UpdateFleetName(SvData data)
        {
            if (data == null || !data.IsSuccess) return;

            try
            {
                var fleet = this.Fleets[int.Parse(data.Request["api_deck_id"])];
                var name = data.Request["api_name"];

                fleet.Name = name;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("艦隊名の変更に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 45
0
        private void Start(SvData data)
        {
            try
            {
                //var dock = this.Docks[int.Parse(data.Request["api_ndock_id"])];
                var ship = this.homeport.Organization.Ships[int.Parse(data.Request["api_ship_id"])];
                var highspeed = data.Request["api_highspeed"] == "1";

                if (highspeed)
                {
                    ship.Repair();
                    this.homeport.Organization.GetFleet(ship.Id)?.State.Update();
                }

                // 高速修復でない場合、別途 ndock が来るので、ここで何かする必要はなさげ
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("入渠開始の解析に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 46
0
        private void UpdateComment(SvData data)
        {
            if (data == null || !data.IsSuccess) return;

            try
            {
                this.Admiral.Comment = data.Request["api_cmt"];
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("艦隊名の変更に失敗しました: {0}", ex);
            }
        }
Exemplo n.º 47
0
		private void UpdateSortieInfo(SvData<kcsapi_combined_battle_battleresult> data)
		{
			try
			{
				if (data == null || !data.IsSuccess) return;
				foreach (var fleet in GetFleetsInSortie())
				{
					fleet.UpdateSortieInfo(data.Data);
				}
			}
			catch { }
		}