//bool StartAnimation(const TCHAR *tszName);
        //HRESULT PreUpdate(float fElapsedTime );
        //bool ChangeMapChipCollisionChecku(const MCVECTOR2& rMovePos, const MC_AABB2D& rTagetAABB);
        //int MapChipDraw(
        //    const VP_IMAGEFILE &rvpImgFile,
        //    const MC_AABB2D* pBOA,
        //    int nX, int nY
        //);

        //###########################################################################
        //##
        //## 書き込み
        //##
        //###########################################################################
        #region 書き込み
        /// <summary>
        ///
        /// </summary>
        /// <param name="objSave"></param>
        /// <returns></returns>
        internal bool FF_WriteStageFile(SaveState objSave)
        {
            int i, j, k;
            //----------------
            // マップ
            //----------------
            FSquareTileMapHeader map = new FSquareTileMapHeader();

            // マップ
            map.SetString(m_mapName);
            map.tileNumX = m_tileCountX;
            map.tileNumY = m_tileCountY;

            objSave.Write(map);
            //----------------
            // 一つのマップチップ
            //----------------
            objSave.BlockStart(FSquareTileInfoMap.ID);
            {
                for (i = 0; i < m_mapTiles.LengthY; ++i)
                {
                    for (j = 0; j < m_mapTiles.LengthX; ++j)
                    {
                        objSave.Write(m_mapTiles[i, j]);
                    }
                }
            }
            objSave.BlockEnd();

            //----------------
            // イベントRECT
            //----------------
            if (m_eventRect.Count > 0)
            {
                FSquareTileMapRect eRect = new FSquareTileMapRect();
                objSave.BlockStart(FSquareTileMapRect.ID);
                {
                    foreach (KeyValuePair <string, FSquareTileMapRect> kvp in m_eventRect)
                    {
                        objSave.Write(kvp.Value);
                    }
                }
                objSave.BlockEnd();
            }
            //----------------
            // マップ置き換え
            //----------------
            if (m_transPoseTiles.Count > 0)
            {
                objSave.BlockStart(FSquareTilesTransposeHeader.ID);
                {
                    foreach (KeyValuePair <string, SquareTilesTranspose> kvp in m_transPoseTiles)
                    {
                        objSave.Write(kvp.Value);
                        objSave.BlockStart(FSquareTilesTransposeFrame.ID);
                        {
                            for (i = 0; i < kvp.Value.aTCF.Count; ++i)
                            {
                                objSave.Write(kvp.Value.aTCF[i]);
                                // マップチップデータ
                                objSave.BlockStart(FSquareTileInfoMap.ID);
                                {
                                    for (j = 0; j < kvp.Value.aTCF[i].aaMapChip.LengthY; ++j)
                                    {
                                        for (k = 0; k < kvp.Value.aTCF[i].aaMapChip.LengthX; ++k)
                                        {
                                            objSave.Write(kvp.Value.aTCF[i].aaMapChip[j, k]);
                                        }
                                    }
                                }
                                objSave.BlockEnd();
                            }
                        }
                        objSave.BlockEnd();
                    }
                }
                objSave.BlockEnd();
            }
            return(true);
        }
        //###########################################################################
        //##
        //## 読み込み
        //##
        //###########################################################################
        #region 読み込み
        /// <summary>
        /// スクエアタイルマップをファイルから読み込み開始する
        /// </summary>
        /// <param name="rMap"></param>
        /// <param name="lChank"></param>
        /// <returns></returns>
        internal bool FF_LoadStageFile(ref FSquareTileMapHeader rMap, LoadChank lChank)
        {
            FSquareTileInfoMap rMIM;
            LoadChank          lChank02;
            LoadData           lData;
            Chunk chank = new Chunk();
            int   i, j;


            // 名前
            m_mapName = rMap.GetString();

            //
            m_tileCountX = rMap.tileNumX;       // X軸のマップチップ数
            m_tileCountY = rMap.tileNumY;       // Y軸のマップチップ数
            //m_nChipNum	 = m_tileNumX*m_tileNumY;			// チップ数の合計

            // サイズ
            //m_aabbSize.vMin.Init();
            //m_aabbSize.vMax.x =   (float)m_tileNumX * STAGE_CHIPSIZE;
            //m_aabbSize.vMin.y = -((float)m_tileNumY * STAGE_CHIPSIZE);

            m_mapTiles = new D2ArrayObject <FSquareTileInfoMap>(m_tileCountX, m_tileCountY);

            if (lChank != null)
            {
                lChank.GetBlockChank(chank);
                // チャンクブロックチェックしない
                // IDから処理選択
                while ((lData = lChank.FindChank(chank)) != null)
                {
                    if (chank.id == FSquareTileInfoMap.ID)
                    {
                        //----------------------------
                        // MAP上で使う一つのマップチップ
                        //----------------------------
                        FSquareTileInfoMap mapChip = new FSquareTileInfoMap();
                        // チェック
                        if (chank.num == 0)
                        {
                            throw new IOException("チャンク数が以上です。");
                        }
                        m_allTileCount = 0;
                        while ((lChank02 = lData.FindData(mapChip)) != null || !lData.GetFindEnd())
                        {
                            // データ内部部分書き込み
                            i           = m_allTileCount / m_tileCountX;
                            j           = m_allTileCount % m_tileCountX;
                            rMIM        = m_mapTiles[i, j];
                            rMIM.L00._n = mapChip.L00._n;
                            rMIM.L01._n = mapChip.L01._n;
                            // 登録
                            //if ( (rMIM.L00.flags & FSquareTileInfoMap.ANMCHIP) != 0 )
                            //    rAGM.RegistrationChipAnimation(rMIM.L00.anmGroupNo, rMIM.L00.anmTileNo);
                            //if ( (rMIM.L01.flags & FSquareTileInfoMap.ANMCHIP) != 0 )
                            //    rAGM.RegistrationChipAnimation(rMIM.L01.anmGroupNo, rMIM.L01.anmTileNo);
                            // これ以上入れ子は今のところない予定なので入れ子は無視
                            if (lChank02 != null)
                            {
                                throw new IOException("入れ子");
                            }
                            ++m_allTileCount;
                        }
                        break;
                    }
                    else if (chank.id == FSquareTileMapRect.ID)
                    {   //----------------------------
                        // イベントなどに使用する長方形
                        //----------------------------
                        FSquareTileMapRect eRect = new FSquareTileMapRect();
                        while ((lChank02 = lData.FindData(eRect)) != null || !lData.GetFindEnd())
                        {
                            // これ以上入れ子は今のところない予定なので入れ子は無視
                            if (lChank02 != null)
                            {
                                lChank02 = null;
                                throw new IOException("存在してはいけない入れ子を発見");
                            }
                            m_eventRect.Add(eRect.GetString(), eRect);
                            eRect = new FSquareTileMapRect();
                        }
                        break;
                    }
                    else if (chank.id == FSquareTilesTransposeHeader.ID)
                    {   //----------------------------
                        // 置き換えるチップの集まり
                        //----------------------------
                        SquareTilesTranspose stTC = new SquareTilesTranspose();

                        // チェック
                        if (chank.num == 0)
                        {
                            throw new IOException("FSquareTilesTransposeHeader チャンク数が異常です。");
                        }
                        while ((lChank02 = lData.FindData(stTC)) != null || !lData.GetFindEnd())
                        {
                            m_transPoseTiles.Add(stTC.GetString(), stTC);
                            // AABB
                            //m_aabbSize.vMin.Init();
                            //m_aabbSize.vMax.x =   (float)m_tileNumX * STAGE_CHIPSIZE;
                            //m_aabbSize.vMin.y = -((float)m_tileNumY * STAGE_CHIPSIZE);

                            //stTC.aabb.vMin.x = (float)(tChip.tilePosX*STAGE_CHIPSIZE);
                            //stTC.aabb.vMax.x = stTC.aabb.vMin.x+(float)(tChip.tileNumX*STAGE_CHIPSIZE);
                            //stTC.aabb.vMax.y = -(float)(tChip.tilePosY*STAGE_CHIPSIZE);
                            //stTC.aabb.vMin.y = -(float)(tChip.tileNumY*STAGE_CHIPSIZE)+stTC.aabb.vMax.y;
                            if (lChank02 != null)
                            {
                                if (!this.FF_LoadStageFileTC(ref stTC, lChank02))
                                {
                                    throw new IOException("FSquareTilesTransposeHeader が異常です。");
                                }
                                lChank02 = null;
                            }
                            stTC = new SquareTilesTranspose();
                        }
                        break;
                    }
                    else
                    {
                        // FFID_MAPCHIP_INFO以外のIDが今現在存在しないで
                        // 怪しい値を見つけたらエラーをはき出すようにする
                        throw new IOException("未対応のIDが呼ばれた。");
                    }
                }
            }
            return(true);
        }