/// <summary> /// イベントコマンド /// </summary> /// <param name="status">読み込み経過状態</param> /// <param name="commonEvent">結果格納インスタンス</param> private void ReadEventCommand(FileReadStatus status, CommonEvent commonEvent) { var length = status.ReadInt(); status.IncreaseIntOffset(); Logger.Debug(FileIOMessage.SuccessRead(typeof(CommonEventReader), "イベントコマンド数", length)); var reader = new EventCommandListReader(status, length); commonEvent.EventCommands = reader.Read(); }
/// <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); }