public override void LoadFromResponse( string apiname, dynamic data ) {
			base.LoadFromResponse( apiname, (object)data );

			BaseAirAttack = new PhaseBaseAirAttack( this );
			AirBattle = new PhaseAirBattle( this );
			Support = new PhaseSupport( this );
			OpeningASW = new PhaseOpeningASW( this, true );
			OpeningTorpedo = new PhaseTorpedo( this, 0 );
			Shelling1 = new PhaseShelling( this, 1, "1", false );
			Shelling2 = new PhaseShelling( this, 2, "2", false );
			Shelling3 = new PhaseShelling( this, 3, "3", true );
			Torpedo = new PhaseTorpedo( this, 4 );


			BaseAirAttack.EmulateBattle( _resultHPs, _attackDamages );
			AirBattle.EmulateBattle( _resultHPs, _attackDamages );
			Support.EmulateBattle( _resultHPs, _attackDamages );
			OpeningASW.EmulateBattle( _resultHPs, _attackDamages );
			OpeningTorpedo.EmulateBattle( _resultHPs, _attackDamages );
			Shelling1.EmulateBattle( _resultHPs, _attackDamages );
			Shelling2.EmulateBattle( _resultHPs, _attackDamages );
			Shelling3.EmulateBattle( _resultHPs, _attackDamages );
			Torpedo.EmulateBattle( _resultHPs, _attackDamages );
			
		}
        public override void LoadFromResponse( string apiname, dynamic data )
        {
            base.LoadFromResponse( apiname, (object)data );

            AirBattle = new PhaseAirBattle( this );
            // 支援はないものとする

            AirBattle.EmulateBattle( _resultHPs, _attackDamages );
        }
		public override void LoadFromResponse( string apiname, dynamic data ) {
			base.LoadFromResponse( apiname, (object)data );

			AirBattle = new PhaseAirBattle( this );
			Support = new PhaseSupport( this );
			AirBattle2 = new PhaseAirBattle( this, "2" );

			AirBattle.EmulateBattle( _resultHPs, _attackDamages );
			Support.EmulateBattle( _resultHPs, _attackDamages );
			AirBattle2.EmulateBattle( _resultHPs, _attackDamages );

		}
        /// <summary>
        /// 航空戦情報(航空戦)を設定します。
        /// 通常艦隊・連合艦隊両用です。
        /// </summary>
        private void SetAerialWarfareAirBattle( PhaseAirBattle pd1, PhaseAirBattle pd2 )
        {
            //空対空戦闘
            if ( pd1.IsStage1Available ) {

                //二回目の空戦が存在するか
                bool isBattle2Enabled = pd2.IsStage1Available;

                AirSuperiority.Text = Constants.GetAirSuperiority( pd1.AirSuperiority );
                if ( isBattle2Enabled ) {
                    ToolTipInfo.SetToolTip( AirSuperiority, "第2次: " + Constants.GetAirSuperiority( pd2.AirSuperiority ) );
                } else {
                    ToolTipInfo.SetToolTip( AirSuperiority, null );
                }

                int[] planeFriend = {
                    pd1.AircraftLostStage1Friend,
                    pd1.AircraftTotalStage1Friend,
                    ( isBattle2Enabled ? pd2.AircraftLostStage1Friend : 0 ),
                    ( isBattle2Enabled ? pd2.AircraftTotalStage1Friend : 0 ),
                };
                AirStage1Friend.Text = string.Format( "-{0}/{1}", planeFriend[0] + planeFriend[2], planeFriend[1] );
                ToolTipInfo.SetToolTip( AirStage1Friend, string.Format( "第1次: -{0}/{1}\r\n第2次: -{2}/{3}\r\n",
                    planeFriend[0], planeFriend[1], planeFriend[2], planeFriend[3] ) );

                if ( ( planeFriend[1] > 0 && planeFriend[0] == planeFriend[1] ) ||
                     ( planeFriend[3] > 0 && planeFriend[2] == planeFriend[3] ) )
                    AirStage1Friend.ForeColor = Color.Red;
                else
                    AirStage1Friend.ForeColor = SystemColors.ControlText;

                int[] planeEnemy = {
                    pd1.AircraftLostStage1Enemy,
                    pd1.AircraftTotalStage1Enemy,
                    ( isBattle2Enabled ? pd2.AircraftLostStage1Enemy : 0 ),
                    ( isBattle2Enabled ? pd2.AircraftTotalStage1Enemy : 0 ),
                };
                AirStage1Enemy.Text = string.Format( "-{0}/{1}", planeEnemy[0] + planeEnemy[2], planeEnemy[1] );
                ToolTipInfo.SetToolTip( AirStage1Enemy, string.Format( "第1次: -{0}/{1}\r\n第2次: -{2}/{3}\r\n",
                    planeEnemy[0], planeEnemy[1], planeEnemy[2], planeEnemy[3] ) );

                if ( ( planeEnemy[1] > 0 && planeEnemy[0] == planeEnemy[1] ) ||
                     ( planeEnemy[3] > 0 && planeEnemy[2] == planeEnemy[3] ) )
                    AirStage1Enemy.ForeColor = Color.Red;
                else
                    AirStage1Enemy.ForeColor = SystemColors.ControlText;

                //触接
                int[] touchFriend = {
                    pd1.TouchAircraftFriend,
                    isBattle2Enabled ? pd2.TouchAircraftFriend : -1
                    };
                if ( touchFriend[0] != -1 || touchFriend[1] != -1 ) {
                    AirStage1Friend.ImageAlign = ContentAlignment.MiddleLeft;
                    AirStage1Friend.ImageIndex = (int)ResourceManager.EquipmentContent.Seaplane;

                    EquipmentDataMaster[] planes = { KCDatabase.Instance.MasterEquipments[touchFriend[0]], KCDatabase.Instance.MasterEquipments[touchFriend[1]] };
                    ToolTipInfo.SetToolTip( AirStage1Friend, string.Format(
                        "{0}触接中\r\n第1次: {1}\r\n第2次: {2}",
                        ToolTipInfo.GetToolTip( AirStage1Friend ) ?? "",
                        planes[0] != null ? planes[0].Name : "(なし)",
                        planes[1] != null ? planes[1].Name : "(なし)"
                        ) );
                } else {
                    AirStage1Friend.ImageAlign = ContentAlignment.MiddleCenter;
                    AirStage1Friend.ImageIndex = -1;
                    //ToolTipInfo.SetToolTip( AirStage1Friend, null );
                }

                int[] touchEnemy = {
                    pd1.TouchAircraftEnemy,
                    isBattle2Enabled ? pd2.TouchAircraftEnemy : -1
                    };
                if ( touchEnemy[0] != -1 || touchEnemy[1] != -1 ) {
                    AirStage1Enemy.ImageAlign = ContentAlignment.MiddleLeft;
                    AirStage1Enemy.ImageIndex = (int)ResourceManager.EquipmentContent.Seaplane;

                    EquipmentDataMaster[] planes = { KCDatabase.Instance.MasterEquipments[touchEnemy[0]], KCDatabase.Instance.MasterEquipments[touchEnemy[1]] };
                    ToolTipInfo.SetToolTip( AirStage1Enemy, string.Format(
                        "{0}触接中\r\n第1次: {1}\r\n第2次: {2}",
                        ToolTipInfo.GetToolTip( AirStage1Enemy ) ?? "",
                        planes[0] != null ? planes[0].Name : "(なし)",
                        planes[1] != null ? planes[1].Name : "(なし)"
                        ) );
                } else {
                    AirStage1Enemy.ImageAlign = ContentAlignment.MiddleCenter;
                    AirStage1Enemy.ImageIndex = -1;
                    //ToolTipInfo.SetToolTip( AirStage1Enemy, null );
                }

            } else {	//空対空戦闘発生せず(!?)
                AirSuperiority.Text = Constants.GetAirSuperiority( -1 );
                ToolTipInfo.SetToolTip( AirSuperiority, null );
                AirStage1Friend.Text = "-";
                AirStage1Friend.ForeColor = SystemColors.ControlText;
                ToolTipInfo.SetToolTip( AirStage1Friend, null );
                AirStage1Enemy.Text = "-";
                AirStage1Enemy.ForeColor = SystemColors.ControlText;
                ToolTipInfo.SetToolTip( AirStage1Enemy, null );
            }

            //艦対空戦闘
            if ( pd1.IsStage2Available ) {

                //二回目の空戦が存在するか
                bool isBattle2Enabled = pd2.IsStage2Available;

                int[] planeFriend = {
                    pd1.AircraftLostStage2Friend,
                    pd1.AircraftTotalStage2Friend,
                    ( isBattle2Enabled ? pd2.AircraftLostStage2Friend : 0 ),
                    ( isBattle2Enabled ? pd2.AircraftTotalStage2Friend : 0 ),
                };
                AirStage2Friend.Text = string.Format( "-{0}/{1}", planeFriend[0] + planeFriend[2], planeFriend[1] );
                ToolTipInfo.SetToolTip( AirStage2Friend, string.Format( "第1次: -{0}/{1}\r\n第2次: -{2}/{3}\r\n",
                    planeFriend[0], planeFriend[1], planeFriend[2], planeFriend[3] ) );

                if ( ( planeFriend[1] > 0 && planeFriend[0] == planeFriend[1] ) ||
                     ( planeFriend[3] > 0 && planeFriend[2] == planeFriend[3] ) )
                    AirStage2Friend.ForeColor = Color.Red;
                else
                    AirStage2Friend.ForeColor = SystemColors.ControlText;

                int[] planeEnemy = {
                    pd1.AircraftLostStage2Enemy,
                    pd1.AircraftTotalStage2Enemy,
                    ( isBattle2Enabled ? pd2.AircraftLostStage2Enemy : 0 ),
                    ( isBattle2Enabled ? pd2.AircraftTotalStage2Enemy : 0 ),
                };
                AirStage2Enemy.Text = string.Format( "-{0}/{1}", planeEnemy[0] + planeEnemy[2], planeEnemy[1] );
                ToolTipInfo.SetToolTip( AirStage2Enemy, string.Format( "第1次: -{0}/{1}\r\n第2次: -{2}/{3}\r\n{4}",
                    planeEnemy[0], planeEnemy[1], planeEnemy[2], planeEnemy[3],
                    isBattle2Enabled ? "" : "(第二次戦発生せず)" ) );			//DEBUG

                if ( ( planeEnemy[1] > 0 && planeEnemy[0] == planeEnemy[1] ) ||
                     ( planeEnemy[3] > 0 && planeEnemy[2] == planeEnemy[3] ) )
                    AirStage2Enemy.ForeColor = Color.Red;
                else
                    AirStage2Enemy.ForeColor = SystemColors.ControlText;

                //対空カットイン
                {
                    bool[] fire = new bool[] { pd1.IsAACutinAvailable, isBattle2Enabled && pd2.IsAACutinAvailable };
                    int[] cutinID = new int[] {
                        fire[0] ? pd1.AACutInKind : -1,
                        fire[1] ? pd2.AACutInKind : -1,
                    };
                    int[] cutinIndex = new int[] {
                        fire[0] ? pd1.AACutInIndex : -1,
                        fire[1] ? pd2.AACutInIndex : -1,
                    };

                    if ( fire[0] || fire[1] ) {

                        AACutin.Text = string.Format( "#{0}/{1}", fire[0] ? ( cutinIndex[0] + 1 ).ToString() : "-", fire[1] ? ( cutinIndex[1] + 1 ).ToString() : "-" );
                        AACutin.ImageAlign = ContentAlignment.MiddleLeft;
                        AACutin.ImageIndex = (int)ResourceManager.EquipmentContent.HighAngleGun;

                        StringBuilder sb = new StringBuilder();
                        sb.AppendLine( "対空カットイン" );
                        for ( int i = 0; i < 2; i++ ) {
                            if ( fire[i] ) {
                                sb.AppendFormat( "第{0}次: {1}\r\nカットイン種別: {2} ({3})\r\n",
                                    i + 1,
                                    ( i == 0 ? pd1 : pd2 ).AACutInShip.NameWithLevel,
                                    cutinID[i],
                                    Constants.GetAACutinKind( cutinID[i] ) );
                            } else {
                                sb.AppendFormat( "第{0}次: (発動せず)\r\n",
                                    i + 1 );
                            }
                        }
                        ToolTipInfo.SetToolTip( AACutin, sb.ToString() );

                    } else {
                        AACutin.Text = "対空砲火";
                        AACutin.ImageAlign = ContentAlignment.MiddleCenter;
                        AACutin.ImageIndex = -1;
                        ToolTipInfo.SetToolTip( AACutin, null );
                    }
                }

            } else {	//艦対空戦闘発生せず
                AirStage2Friend.Text = "-";
                AirStage2Friend.ForeColor = SystemColors.ControlText;
                ToolTipInfo.SetToolTip( AirStage2Friend, null );
                AirStage2Enemy.Text = "-";
                AirStage2Enemy.ForeColor = SystemColors.ControlText;
                ToolTipInfo.SetToolTip( AirStage2Enemy, null );
                AACutin.Text = "対空砲火";
                AACutin.ImageAlign = ContentAlignment.MiddleCenter;
                AACutin.ImageIndex = -1;
                ToolTipInfo.SetToolTip( AACutin, null );
            }

            AirStage2Friend.ImageAlign = ContentAlignment.MiddleCenter;
            AirStage2Friend.ImageIndex = -1;
            AirStage2Enemy.ImageAlign = ContentAlignment.MiddleCenter;
            AirStage2Enemy.ImageIndex = -1;
        }
        /// <summary>
        /// 航空戦情報を設定します。
        /// </summary>
        private void SetAerialWarfare( PhaseAirBattle pd )
        {
            //空対空戦闘
            if ( pd.IsStage1Available ) {

                AirSuperiority.Text = Constants.GetAirSuperiority( pd.AirSuperiority );

                int[] planeFriend = { pd.AircraftLostStage1Friend, pd.AircraftTotalStage1Friend };
                AirStage1Friend.Text = string.Format( "-{0}/{1}", planeFriend[0], planeFriend[1] );

                if ( planeFriend[1] > 0 && planeFriend[0] == planeFriend[1] )
                    AirStage1Friend.ForeColor = Color.Red;
                else
                    AirStage1Friend.ForeColor = SystemColors.ControlText;

                int[] planeEnemy = { pd.AircraftLostStage1Enemy, pd.AircraftTotalStage1Enemy };
                AirStage1Enemy.Text = string.Format( "-{0}/{1}", planeEnemy[0], planeEnemy[1] );

                if ( planeEnemy[1] > 0 && planeEnemy[0] == planeEnemy[1] )
                    AirStage1Enemy.ForeColor = Color.Red;
                else
                    AirStage1Enemy.ForeColor = SystemColors.ControlText;

                //触接
                int touchFriend = pd.TouchAircraftFriend;
                if ( touchFriend != -1 ) {
                    AirStage1Friend.ImageAlign = ContentAlignment.MiddleLeft;
                    AirStage1Friend.ImageIndex = (int)ResourceManager.EquipmentContent.Seaplane;
                    ToolTipInfo.SetToolTip( AirStage1Friend, "触接中: " + KCDatabase.Instance.MasterEquipments[touchFriend].Name );
                } else {
                    AirStage1Friend.ImageAlign = ContentAlignment.MiddleCenter;
                    AirStage1Friend.ImageIndex = -1;
                    ToolTipInfo.SetToolTip( AirStage1Friend, null );
                }

                int touchEnemy = pd.TouchAircraftEnemy;
                if ( touchEnemy != -1 ) {
                    AirStage1Enemy.ImageAlign = ContentAlignment.MiddleLeft;
                    AirStage1Enemy.ImageIndex = (int)ResourceManager.EquipmentContent.Seaplane;
                    ToolTipInfo.SetToolTip( AirStage1Enemy, "触接中: " + KCDatabase.Instance.MasterEquipments[touchEnemy].Name );
                } else {
                    AirStage1Enemy.ImageAlign = ContentAlignment.MiddleCenter;
                    AirStage1Enemy.ImageIndex = -1;
                    ToolTipInfo.SetToolTip( AirStage1Enemy, null );
                }

            } else {		//空対空戦闘発生せず

                AirSuperiority.Text = Constants.GetAirSuperiority( -1 );

                AirStage1Friend.Text = "-";
                AirStage1Friend.ForeColor = SystemColors.ControlText;
                AirStage1Friend.ImageAlign = ContentAlignment.MiddleCenter;
                AirStage1Friend.ImageIndex = -1;
                ToolTipInfo.SetToolTip( AirStage1Friend, null );

                AirStage1Enemy.Text = "-";
                AirStage1Enemy.ForeColor = SystemColors.ControlText;
                AirStage1Enemy.ImageAlign = ContentAlignment.MiddleCenter;
                AirStage1Enemy.ImageIndex = -1;
                ToolTipInfo.SetToolTip( AirStage1Enemy, null );
            }

            //艦対空戦闘
            if ( pd.IsStage2Available ) {

                int[] planeFriend = { pd.AircraftLostStage2Friend, pd.AircraftTotalStage2Friend };
                AirStage2Friend.Text = string.Format( "-{0}/{1}", planeFriend[0], planeFriend[1] );

                if ( planeFriend[1] > 0 && planeFriend[0] == planeFriend[1] )
                    AirStage2Friend.ForeColor = Color.Red;
                else
                    AirStage2Friend.ForeColor = SystemColors.ControlText;

                int[] planeEnemy = { pd.AircraftLostStage2Enemy, pd.AircraftTotalStage2Enemy };
                AirStage2Enemy.Text = string.Format( "-{0}/{1}", planeEnemy[0], planeEnemy[1] );

                if ( planeEnemy[1] > 0 && planeEnemy[0] == planeEnemy[1] )
                    AirStage2Enemy.ForeColor = Color.Red;
                else
                    AirStage2Enemy.ForeColor = SystemColors.ControlText;

                //対空カットイン
                if ( pd.IsAACutinAvailable ) {
                    int cutinID = pd.AACutInKind;
                    int cutinIndex = pd.AACutInIndex;

                    AACutin.Text = "#" + ( cutinIndex + 1 );
                    AACutin.ImageAlign = ContentAlignment.MiddleLeft;
                    AACutin.ImageIndex = (int)ResourceManager.EquipmentContent.HighAngleGun;
                    ToolTipInfo.SetToolTip( AACutin, string.Format(
                        "対空カットイン: {0}\r\nカットイン種別: {1} ({2})",
                        pd.AACutInShip.NameWithLevel,
                        cutinID,
                        Constants.GetAACutinKind( cutinID ) ) );

                } else {
                    AACutin.Text = "対空砲火";
                    AACutin.ImageAlign = ContentAlignment.MiddleCenter;
                    AACutin.ImageIndex = -1;
                    ToolTipInfo.SetToolTip( AACutin, null );
                }

            } else {	//艦対空戦闘発生せず
                AirStage2Friend.Text = "-";
                AirStage2Friend.ForeColor = SystemColors.ControlText;
                AirStage2Enemy.Text = "-";
                AirStage2Enemy.ForeColor = SystemColors.ControlText;
                AACutin.Text = "対空砲火";
                AACutin.ImageAlign = ContentAlignment.MiddleCenter;
                AACutin.ImageIndex = -1;
                ToolTipInfo.SetToolTip( AACutin, null );
            }

            AirStage2Friend.ImageAlign = ContentAlignment.MiddleCenter;
            AirStage2Friend.ImageIndex = -1;
            ToolTipInfo.SetToolTip( AirStage2Friend, null );
            AirStage2Enemy.ImageAlign = ContentAlignment.MiddleCenter;
            AirStage2Enemy.ImageIndex = -1;
            ToolTipInfo.SetToolTip( AirStage2Enemy, null );
        }