Exemple #1
0
        /// <summary>
        /// DBデータの文字列項目
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="values">読み込み結果</param>
        private void ReadDbDataStringValues(FileReadStatus status, out IReadOnlyList <DBItemValue> values)
        {
            // 数値項目数
            var length = status.ReadInt();

            status.IncreaseIntOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(DBDataFileReader),
                                                   "文字列項目数", length));

            var result = new List <DBItemValue>();

            for (var i = 0; i < length; i++)
            {
                var value = status.ReadString();
                status.AddOffset(value.ByteLength);

                Logger.Debug(FileIOMessage.SuccessRead(typeof(DBDataFileReader),
                                                       $"  文字列項目{i,2}", value));

                DBValueString dbValueString = value.String;
                result.Add(dbValueString);
            }

            values = result;
        }
        /// <summary>
        /// メモ前の文字列
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="commonEvent">結果格納インスタンス</param>
        private void ReadBeforeMemoString(FileReadStatus status, CommonEvent commonEvent)
        {
            var str = status.ReadString();

            commonEvent.Description = str.String;
            status.AddOffset(str.ByteLength);

            Logger.Debug(FileIOMessage.SuccessRead(typeof(CommonEventReader),
                                                   "メモ前の文字列", commonEvent.Description));
        }
        /// <summary>
        /// コモンイベント名
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="commonEvent">結果格納インスタンス</param>
        private void ReadCommonEventName(FileReadStatus status, CommonEvent commonEvent)
        {
            var commonEventName = status.ReadString();

            commonEvent.Name = commonEventName.String;
            status.AddOffset(commonEventName.ByteLength);

            Logger.Debug(FileIOMessage.SuccessRead(typeof(CommonEventReader),
                                                   "コモンイベント名", commonEvent.Name));
        }
Exemple #4
0
        /// <summary>
        /// ヘッダ文字列
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="mapData">データ格納マップデータインスタンス</param>
        private void ReadHeaderMemo(FileReadStatus status, MapData mapData)
        {
            var woditorString = status.ReadString();

            mapData.Memo = woditorString.String;
            status.AddOffset(woditorString.ByteLength);

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "ヘッダ文字列", mapData.Memo));
        }
        /// <summary>
        /// メモ
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="commonEvent">結果格納インスタンス</param>
        private void ReadMemo(FileReadStatus status, CommonEvent commonEvent)
        {
            var str = status.ReadString();

            commonEvent.Memo = str.String;
            status.AddOffset(str.ByteLength);

            Logger.Debug(FileIOMessage.SuccessRead(typeof(CommonEventReader),
                                                   "メモ", commonEvent.Memo));
        }
        /// <summary>
        /// 返戻値の意味
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="commonEvent">結果格納インスタンス</param>
        private void ReadReturnValueDescription(FileReadStatus status, CommonEvent commonEvent)
        {
            var description = status.ReadString();

            status.AddOffset(description.ByteLength);

            commonEvent.ReturnValueDescription = description.String;

            Logger.Debug(FileIOMessage.SuccessRead(typeof(CommonEventReader),
                                                   "返戻値の意味", commonEvent.ReturnValueDescription));
        }
        /// <summary>
        /// フッタ文字列
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="commonEvent">結果格納インスタンス</param>
        private void ReadFooterString(FileReadStatus status, CommonEvent commonEvent)
        {
            var footerString = status.ReadString();

            status.AddOffset(footerString.ByteLength);

            commonEvent.FooterString = footerString.String;

            Logger.Debug(FileIOMessage.SuccessRead(typeof(CommonEventReader),
                                                   "フッタ文字列", commonEvent.FooterString));
        }
Exemple #8
0
        /// <summary>
        /// 基本タイルセットファイル名
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="fileName">結果格納インスタンス</param>
        private void ReadBaseTileSetFileName(FileReadStatus status, out BaseTileSetFileName fileName)
        {
            var read = status.ReadString();

            fileName = read.String;

            status.AddOffset(read.ByteLength);

            Logger.Debug(FileIOMessage.SuccessRead(typeof(TileSetSettingReader),
                                                   "基本タイルセットファイル名", fileName));
        }
Exemple #9
0
        /// <summary>
        /// タイプ名
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="name">結果格納インスタンス</param>
        private void ReadName(FileReadStatus status, out TileSetName name)
        {
            var read = status.ReadString();

            name = read.String;

            status.AddOffset(read.ByteLength);

            Logger.Debug(FileIOMessage.SuccessRead(typeof(TileSetSettingReader),
                                                   "設定名", name));
        }
        /// <summary>
        /// タイプ名
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="setting">結果格納インスタンス</param>
        private void ReadTypeName(FileReadStatus status, DBTypeSetting setting)
        {
            var typeName = status.ReadString();

            setting.TypeName = typeName.String;

            status.AddOffset(typeName.ByteLength);

            Logger.Debug(FileIOMessage.SuccessRead(typeof(DBTypeSettingReader),
                                                   "タイプ名", setting.TypeName));
        }
        /// <summary>
        /// メモ
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="setting">結果格納インスタンス</param>
        private void ReadMemo(FileReadStatus status, DBTypeSetting setting)
        {
            var memo = status.ReadString();

            setting.Memo = memo.String;

            status.AddOffset(memo.ByteLength);

            Logger.Debug(FileIOMessage.SuccessRead(typeof(DBTypeSettingReader),
                                                   "メモ", memo.String));
        }
Exemple #12
0
        /// <summary>
        /// オートタイルファイル名
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="listLength">オートタイルファイル名数</param>
        /// <param name="list">結果格納インスタンス</param>
        private void ReadAutoTileSetFileNameList(FileReadStatus status, int listLength,
                                                 out List <AutoTileFileName> list)
        {
            list = new List <AutoTileFileName>();

            for (var i = 0; i < listLength; i++)
            {
                var read = status.ReadString();
                AutoTileFileName fileName = read.String;
                list.Add(fileName);

                status.AddOffset(read.ByteLength);

                Logger.Debug(FileIOMessage.SuccessRead(typeof(TileSetSettingReader),
                                                       $"オートタイル{i}ファイル名", fileName));
            }
        }
        /// <summary>
        /// 変数名
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="commonEvent">結果格納インスタンス</param>
        private void ReadSelfVarName(FileReadStatus status, CommonEvent commonEvent)
        {
            const int varNameLength = 100;

            var varNameList = new List <CommonEventSelfVariableName>();

            for (var i = 0; i < varNameLength; i++)
            {
                var varName = status.ReadString();
                status.AddOffset(varName.ByteLength);

                varNameList.Add(varName.String);

                Logger.Debug(FileIOMessage.SuccessRead(typeof(CommonEventReader),
                                                       $"セルフ変数{i}名", varName.String));
            }

            commonEvent.SelfVariableNameList = new CommonEventSelfVariableNameList(varNameList);
        }
        /// <summary>
        /// 数値特殊指定文字列パラメータ
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <returns>数値特殊指定文字列パラメータリスト</returns>
        private List <List <string> > ReadSpecialStringArgList(FileReadStatus status)
        {
            Logger.Debug(FileIOMessage.StartCommonRead(typeof(SpecialArgDescReader),
                                                       "数値特殊指定文字列パラメータ"));

            var result = new List <List <string> >();

            var length = status.ReadInt();

            status.IncreaseIntOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(SpecialArgDescReader),
                                                   "特殊文字列引数の数", length));

            for (var i = 0; i < length; i++)
            {
                var caseLength = status.ReadInt();
                status.IncreaseIntOffset();

                Logger.Debug(FileIOMessage.SuccessRead(typeof(SpecialArgDescReader),
                                                       $"引数{i}の文字列選択可能数", caseLength));

                var caseDescriptionList = new List <string>();

                for (var j = 0; j < caseLength; j++)
                {
                    var caseDescription = status.ReadString();
                    status.AddOffset(caseDescription.ByteLength);
                    caseDescriptionList.Add(caseDescription.String);

                    Logger.Debug(FileIOMessage.SuccessRead(typeof(SpecialArgDescReader),
                                                           $"引数{i} {j}番目の文字列", caseDescription.String));
                }

                result.Add(caseDescriptionList);
            }

            Logger.Debug(FileIOMessage.EndCommonRead(typeof(SpecialArgDescReader),
                                                     "数値特殊指定文字列パラメータ"));

            return(result);
        }
Exemple #15
0
        private void ReadDbData(FileReadStatus status, DBData data)
        {
            // データ数
            var length = status.ReadInt();

            status.IncreaseIntOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(DBDataFileReader),
                                                   "データ数数", length));

            // DBデータ
            var dataDescList = new DatabaseDataDescList();

            for (var i = 0; i < length; i++)
            {
                var desc = new DatabaseDataDesc();

                // データ名
                var dataName = status.ReadString();
                status.AddOffset(dataName.ByteLength);

                Logger.Debug(FileIOMessage.SuccessRead(typeof(DBDataFileReader),
                                                       "データ名", dataName.String));

                desc.DataName = dataName.String;

                // 数値項目
                ReadDbDataIntValues(status, out var intValues);
                desc.ItemValueList.AddRange(intValues);

                // 文字列項目
                ReadDbDataStringValues(status, out var stringValues);
                desc.ItemValueList.AddRange(stringValues);

                dataDescList.Overwrite(i, new List <DatabaseDataDesc> {
                    desc
                });
            }

            data.DataDescList.Overwrite(0, dataDescList);
        }
        /// <summary>
        /// 引数名
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <returns>引数名リスト</returns>
        private List <string> ReadArgNames(FileReadStatus status)
        {
            Logger.Debug(FileIOMessage.StartCommonRead(typeof(SpecialArgDescReader),
                                                       "引数名"));

            var result = new List <string>();

            var length = status.ReadInt();

            status.IncreaseIntOffset();

            for (var i = 0; i < length; i++)
            {
                var argName = status.ReadString();
                status.AddOffset(argName.ByteLength);
                result.Add(argName.String);
            }

            Logger.Debug(FileIOMessage.EndCommonRead(typeof(SpecialArgDescReader),
                                                     "引数名"));

            return(result);
        }
        /// <summary>
        /// 特殊指定文字列パラメータ
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <returns>特殊指定文字列パラメータリスト</returns>
        private List <List <DatabaseValueCaseDescription> > ReadSpecialStringValue(FileReadStatus status)
        {
            var length = status.ReadInt();

            status.IncreaseIntOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(DBTypeSettingReader),
                                                   "特殊指定文字列パラメータ数", length));

            var result = new List <List <DatabaseValueCaseDescription> >();

            for (var i = 0; i < length; i++)
            {
                var descriptionLength = status.ReadInt();
                status.IncreaseIntOffset();

                Logger.Debug(FileIOMessage.SuccessRead(typeof(DBTypeSettingReader),
                                                       $"  項目{i,2}のパラメータ数", descriptionLength));

                var paramList = new List <DatabaseValueCaseDescription>();
                for (var j = 0; j < descriptionLength; j++)
                {
                    var value = status.ReadString();
                    status.AddOffset(value.ByteLength);

                    Logger.Debug(FileIOMessage.SuccessRead(typeof(DBTypeSettingReader),
                                                           $"    パラメータ{j,2}", value.String));

                    paramList.Add(value.String);
                }

                result.Add(paramList);
            }

            return(result);
        }
        /// <summary>
        /// 項目メモ
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <returns>項目名リスト</returns>
        private List <ItemMemo> ReadItemMemo(FileReadStatus status)
        {
            var length = status.ReadInt();

            status.IncreaseIntOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(DBTypeSettingReader),
                                                   "項目メモ数", length));

            var result = new List <ItemMemo>();

            for (var i = 0; i < length; i++)
            {
                var value = status.ReadString();
                status.AddOffset(value.ByteLength);

                Logger.Debug(FileIOMessage.SuccessRead(typeof(DBTypeSettingReader),
                                                       $"  項目メモ{i,2}", value.String));

                result.Add(value.String);
            }

            return(result);
        }
        /// <summary>
        /// データ名
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="setting">結果格納インスタンス</param>
        private void ReadDataName(FileReadStatus status, DBTypeSetting setting)
        {
            var length = status.ReadInt();

            status.IncreaseIntOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(DBTypeSettingReader),
                                                   "データ数", length));

            var dataNameList = new List <DataName>();

            for (var i = 0; i < length; i++)
            {
                var name = status.ReadString();
                status.AddOffset(name.ByteLength);

                Logger.Debug(FileIOMessage.SuccessRead(typeof(DBTypeSettingReader),
                                                       $"  データ名{i,4}", name.String));

                dataNameList.Add(name.ToString());
            }

            setting.DataNameList = new DataNameList(dataNameList);
        }
        /// <summary>
        /// イベントコマンド
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="commandList">データ格納先</param>
        /// <exception cref="InvalidOperationException">ファイル仕様が異なる場合</exception>
        private void ReadEventCommand(FileReadStatus status, ICollection <IEventCommand> commandList)
        {
            // 数値変数の数
            var numVarLength = status.ReadByte();

            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(EventCommandListReader),
                                                   "数値変数の数", numVarLength));

            // 数値変数
            var numVarList = new List <int>();

            for (var i = 0; i < numVarLength; i++)
            {
                var numVar = status.ReadInt();
                numVarList.Add(numVar);
                status.IncreaseIntOffset();

                Logger.Debug(FileIOMessage.SuccessRead(typeof(EventCommandListReader),
                                                       $"数値変数{i}", numVar));
            }

            // インデント
            var indent = (sbyte)status.ReadByte();

            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(EventCommandListReader),
                                                   "インデント", indent));

            // 文字データ数
            var strVarLength = status.ReadByte();

            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(EventCommandListReader),
                                                   "文字列変数の数", strVarLength));

            // 文字列変数
            var strVarList = new List <string>();

            for (var i = 0; i < strVarLength; i++)
            {
                var woditorString = status.ReadString();
                strVarList.Add(woditorString.String);
                status.AddOffset(woditorString.ByteLength);

                Logger.Debug(FileIOMessage.SuccessRead(typeof(EventCommandListReader),
                                                       $"文字列変数{i}", woditorString.String));
            }

            // 動作指定フラグ
            var hasMoveCommand = status.ReadByte() != 0;

            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(EventCommandListReader),
                                                   "動作指定フラグ", hasMoveCommand));

            // 動作指定コマンド
            ActionEntry actionEntry = null;

            if (hasMoveCommand)
            {
                actionEntry = new ActionEntry();
                ReadEventActionEntry(status, actionEntry);
            }

            // 引数の数チェック
            if (numVarLength != numVarList.Count)
            {
                throw new InvalidOperationException(
                          "指定された数値引数の数と実際の数値引数の数が一致しません。");
            }
            if (strVarLength != strVarList.Count)
            {
                throw new InvalidOperationException(
                          "指定された文字列引数の数と実際の文字列引数の数が一致しません。");
            }

            // 結果
            var eventCommand = EventCommandFactory.CreateRaw(
                numVarList,
                indent,
                strVarList,
                actionEntry);

            Logger.Debug("イベントコマンド生成成功");

            commandList.Add(eventCommand);
        }
Exemple #21
0
        /// <summary>
        /// マップイベント
        /// </summary>
        /// <param name="size">マップイベント数</param>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="mapData">読み込み経過状態</param>
        /// <exception cref="InvalidOperationException">ファイル仕様が異なる場合</exception>
        private void ReadMapEvent(int size, FileReadStatus status, MapData mapData)
        {
            Logger.Debug(FileIOMessage.StartCommonRead(typeof(MpsFileReader),
                                                       "マップイベント"));

            var mapEvents = new List <MapEvent>();
            var count     = 0;

            while (true)
            {
                Logger.Debug(FileIOMessage.StartCommonRead(typeof(MpsFileReader),
                                                           $"マップイベント{count}"));

                // ヘッダチェック
                var validatedHeader = status.ReadByte() == MapEvent.Header[0];
                if (!validatedHeader)
                {
                    break;
                }


                Logger.Debug(FileIOMessage.CheckOk(typeof(MpsFileReader),
                                                   "ヘッダ"));

                // ヘッダ分オフセット加算
                status.AddOffset(MapEvent.Header.Length);

                var mapEvent = new MapEvent();

                // マップイベントID
                mapEvent.MapEventId = status.ReadInt();
                status.IncreaseIntOffset();

                Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                       "マップイベントID", mapEvent.MapEventId));

                // イベント名
                var woditorString = status.ReadString();
                mapEvent.EventName = woditorString.String;
                status.AddOffset(woditorString.ByteLength);

                Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                       "イベント名", mapEvent.EventName));

                // X座標
                var posX = status.ReadInt();
                status.IncreaseIntOffset();

                Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                       "X座標", posX));

                // Y座標
                var posY = status.ReadInt();
                status.IncreaseIntOffset();

                Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                       "Y座標", posY));

                mapEvent.Position = (posX, posY);

                // イベントページ数
                var pageLength = status.ReadInt();
                status.IncreaseIntOffset();

                Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                       "イベントページ数", pageLength));

                // 0パディングチェック
                var padding = status.ReadInt();
                status.IncreaseIntOffset();
                var isCorrectPadding = padding == 0;
                if (!isCorrectPadding)
                {
                    throw new InvalidOperationException(
                              $"マップイベントのパディングが異なります。(offset:{status.Offset})");
                }

                Logger.Debug(FileIOMessage.CheckOk(typeof(MpsFileReader),
                                                   "0パディング"));

                // マップイベントページ
                var mapEventPageList = new List <MapEventPage>();
                for (var i = 0; i < pageLength; i++)
                {
                    Logger.Debug(FileIOMessage.StartCommonRead(typeof(MpsFileReader),
                                                               $"マップイベントページ{i}"));

                    ReadMapEventOnePage(status, mapEventPageList);

                    Logger.Debug(FileIOMessage.EndCommonRead(typeof(MpsFileReader),
                                                             $"マップイベントページ{i}"));
                }

                mapEvent.MapEventPageList = new MapEventPageList(mapEventPageList);

                // イベントページ末尾チェック
                foreach (var b in MapEvent.Footer)
                {
                    if (status.ReadByte() != b)
                    {
                        throw new InvalidOperationException(
                                  $"マップイベント末尾の値が異なります。(offset: {status.Offset})");
                    }

                    status.IncreaseByteOffset();
                }

                Logger.Debug(FileIOMessage.CheckOk(typeof(MpsFileReader),
                                                   "イベントページ末尾"));

                mapEvents.Add(mapEvent);

                Logger.Debug(FileIOMessage.EndCommonRead(typeof(MpsFileReader),
                                                         $"マップイベント{count}"));

                count++;
            }

            if (count != size)
            {
                throw new InvalidOperationException(
                          $"マップイベントデータの数が期待する数と異なります。(期待する数:{size}, 実際のイベント数:{count})");
            }

            Logger.Debug(FileIOMessage.EndCommonRead(typeof(MpsFileReader),
                                                     "マップイベント"));

            mapData.MapEvents = new MapEventList(mapEvents);
        }
Exemple #22
0
        /// <summary>
        /// マップイベントページ
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="mapEventPages">格納先リスト</param>
        /// <exception cref="InvalidOperationException">ファイル仕様が異なる場合</exception>
        private void ReadMapEventOnePage(FileReadStatus status, ICollection <MapEventPage> mapEventPages)
        {
            var result = new MapEventPage();

            // ヘッダチェック
            foreach (var b in MapEventPage.Header)
            {
                if (status.ReadByte() != b)
                {
                    throw new InvalidOperationException(
                              $"マップイベントページのヘッダが異なります。(offset: {status.Offset})");
                }

                status.IncreaseByteOffset();
            }

            Logger.Debug(FileIOMessage.CheckOk(typeof(MpsFileReader),
                                               "マップイベントページヘッダ"));

            var graphicInfo = new MapEventPageGraphicInfo();

            // タイル画像ID
            var graphicTileId = (MapEventTileId)status.ReadInt();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページタイル画像ID", graphicTileId));

            if (graphicTileId != MapEventTileId.NotUse)
            {
                graphicInfo.IsGraphicTileChip = true;
                graphicInfo.GraphicTileId     = graphicTileId;
            }

            status.IncreaseIntOffset();

            // キャラチップ名
            var charaChipString = status.ReadString();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページキャラチップ名", charaChipString.String));

            if (!graphicInfo.IsGraphicTileChip)
            {
                graphicInfo.CharaChipFilePath = charaChipString.String;
            }

            status.AddOffset(charaChipString.ByteLength);

            // 初期キャラ向き
            var initDirection = status.ReadByte();

            graphicInfo.InitDirection = CharaChipDirection.FromByte(initDirection);
            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページ初期キャラ向き", graphicInfo.InitDirection));

            // 初期アニメーション番号
            graphicInfo.InitAnimationId = status.ReadByte();
            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページ初期アニメーション番号", graphicInfo.InitAnimationId));

            // キャラチップ透過度
            graphicInfo.CharaChipOpacity = status.ReadByte();
            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページキャラチップ透過度", graphicInfo.CharaChipOpacity));

            // キャラチップ表示形式
            graphicInfo.CharaChipDrawType = PictureDrawType.FromByte(status.ReadByte());
            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページキャラチップ表示形式", graphicInfo.CharaChipDrawType));

            result.GraphicInfo = graphicInfo;

            var bootInfo = new MapEventPageBootInfo();

            // 起動条件
            bootInfo.MapEventBootType = MapEventBootType.FromByte(status.ReadByte());
            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページ起動条件", bootInfo.MapEventBootType));

            // 条件1~4演算子 & 使用フラグ
            var conditions = new List <MapEventBootCondition>
            {
                new MapEventBootCondition(),
                new MapEventBootCondition(),
                new MapEventBootCondition(),
                new MapEventBootCondition(),
            };

            for (var i = 0; i < 4; i++)
            {
                conditions[i].Operation    = CriteriaOperator.FromByte((byte)(status.ReadByte() & 0xF0));
                conditions[i].UseCondition = (byte)(status.ReadByte() & 0x0F) != 0;
                status.IncreaseByteOffset();

                Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                       $"マップイベントページ起動条件{i}演算子", conditions[i].Operation));
                Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                       $"マップイベントページ起動条件{i}使用フラグ", conditions[i].UseCondition));
            }

            // 条件1~4左辺
            for (var i = 0; i < 4; i++)
            {
                conditions[i].LeftSide = status.ReadInt();
                status.IncreaseIntOffset();

                Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                       $"マップイベントページ起動条件{i}左辺", conditions[i].LeftSide));
            }

            // 条件1~4右辺
            for (var i = 0; i < 4; i++)
            {
                conditions[i].RightSide = status.ReadInt();
                status.IncreaseIntOffset();
                bootInfo.SetEventBootCondition(i, conditions[i]);

                Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                       $"マップイベントページ起動条件{i}右辺", conditions[i].RightSide));
            }

            result.BootInfo = bootInfo;

            var moveRouteInfo = new MapEventPageMoveRouteInfo();

            // アニメ速度
            moveRouteInfo.AnimateSpeed = AnimateSpeed.FromByte(status.ReadByte());
            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページアニメ速度", moveRouteInfo.AnimateSpeed));

            // 移動速度
            moveRouteInfo.MoveSpeed = MoveSpeed.FromByte(status.ReadByte());
            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページ移動速度", moveRouteInfo.MoveSpeed));

            // 移動頻度
            moveRouteInfo.MoveFrequency = MoveFrequency.FromByte(status.ReadByte());
            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページ移動頻度", moveRouteInfo.MoveFrequency));

            // 移動ルート
            moveRouteInfo.MoveType = MoveType.FromByte(status.ReadByte());
            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページ移動ルート種別", moveRouteInfo.MoveType));

            var option = new MapEventPageOption();

            // オプション
            var optionByte = status.ReadByte();

            option.SetOptionFlag(optionByte);
            status.IncreaseByteOffset();

            result.Option = option;

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページオプション", optionByte));

            // カスタム移動ルートフラグ
            var actionEntry         = new ActionEntry();
            var customMoveRouteFlag = status.ReadByte();

            actionEntry.SetOptionFlag(customMoveRouteFlag);
            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページカスタム移動ルートフラグ", customMoveRouteFlag));

            // 動作指定コマンド数
            actionEntry.CommandList = ReadCharaMoveCommand(status);

            moveRouteInfo.CustomMoveRoute = actionEntry;
            result.MoveRouteInfo          = moveRouteInfo;

            // イベント行数
            var eventLength = status.ReadInt();

            status.IncreaseIntOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページイベント行数", eventLength));

            // イベントコマンド
            var eventCommandListReader = new EventCommandListReader(status, eventLength);

            result.EventCommands = eventCommandListReader.Read();

            // イベントコマンド終端チェック
            foreach (var b in EventCommandList.EndEventCommand)
            {
                if (status.ReadByte() != b)
                {
                    throw new InvalidOperationException(
                              $"イベントコマンド後の値が異なります。(offset: {status.Offset})");
                }

                status.IncreaseByteOffset();
            }

            Logger.Debug(FileIOMessage.CheckOk(typeof(MpsFileReader),
                                               "マップイベントページイベントコマンド終端"));

            // 影グラフィック番号
            result.ShadowGraphicId = status.ReadByte();
            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページ影グラフィック番号", result.ShadowGraphicId));

            // 接触範囲拡張X
            var rangeWidth = status.ReadByte();

            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページ接触範囲拡張X", rangeWidth));

            // 接触範囲拡張Y
            var rangeHeight = status.ReadByte();

            status.IncreaseByteOffset();

            Logger.Debug(FileIOMessage.SuccessRead(typeof(MpsFileReader),
                                                   "マップイベントページ接触範囲拡張Y", rangeHeight));

            result.HitExtendRange = (rangeWidth, rangeHeight);

            // イベントページ末尾チェック
            foreach (var b in MapEventPage.Footer)
            {
                if (status.ReadByte() != b)
                {
                    throw new InvalidOperationException(
                              $"イベントページ末尾の値が異なります。(offset: {status.Offset})");
                }

                status.IncreaseByteOffset();
            }

            Logger.Debug(FileIOMessage.CheckOk(typeof(MpsFileReader),
                                               "マップイベントページ末尾チェック"));

            // 完了
            mapEventPages.Add(result);
        }
        /// <summary>
        /// DBデータ設定値ひとつ分
        /// </summary>
        /// <param name="status">読み込み経過状態</param>
        /// <param name="result">結果格納インスタンス</param>
        /// <param name="itemTypes">項目種別リスト</param>
        /// <param name="numberItemCount">数値項目数</param>
        /// <param name="stringItemCount">文字列項目数</param>
        /// <returns></returns>
        /// <exception cref="InvalidOperationException"></exception>
        private void ReadOneDataSettingValue(FileReadStatus status, List <List <DBItemValue> > result,
                                             IEnumerable <DBItemType> itemTypes, int numberItemCount, int stringItemCount)
        {
            Logger.Debug(FileIOMessage.StartCommonRead(typeof(DBDataSettingReader),
                                                       "データ設定値"));

            var numberItems = new List <DBValueInt>();
            var stringItems = new List <DBValueString>();

            for (var i = 0; i < numberItemCount; i++)
            {
                var numberItem = status.ReadInt();
                status.IncreaseIntOffset();

                Logger.Debug(FileIOMessage.SuccessRead(typeof(DBDataSettingReader),
                                                       $"  数値項目{i,2}", numberItem));

                numberItems.Add(numberItem);
            }

            for (var i = 0; i < stringItemCount; i++)
            {
                var stringItem = status.ReadString();
                status.AddOffset(stringItem.ByteLength);

                Logger.Debug(FileIOMessage.SuccessRead(typeof(DBDataSettingReader),
                                                       $"  文字列項目{i,2}", stringItem));

                stringItems.Add(stringItem.String);
            }

            var valueList = new List <DBItemValue>();

            var numberIndex = 0;
            var stringIndex = 0;

            foreach (var itemType in itemTypes)
            {
                if (itemType == DBItemType.Int)
                {
                    valueList.Add(numberItems[numberIndex]);
                    numberIndex++;
                }
                else if (itemType == DBItemType.String)
                {
                    valueList.Add(stringItems[stringIndex]);
                    stringIndex++;
                }
                else
                {
                    // 通常ここへは来ない
                    throw new InvalidOperationException(
                              "未対応のデータ種別です。");
                }
            }

            result.Add(valueList);

            Logger.Debug(FileIOMessage.EndCommonRead(typeof(DBDataSettingReader),
                                                     "データ設定値"));
        }