/// <summary> /// コモンイベント末尾A /// </summary> /// <param name="readStatus">読み込み経過状態</param> /// <returns>あとに返戻値が続く場合true</returns> /// <exception cref="InvalidOperationException">データが仕様と異なる場合</exception> private HasNext ReadFooterA(BinaryReadStatus readStatus) { var b1 = readStatus.ReadByte(); if (b1 == CommonEvent.BeforeReturnValueSummaryBytesBefore[0]) { foreach (var b in CommonEvent.BeforeReturnValueSummaryBytesBefore) { if (readStatus.ReadByte() != b) { throw new InvalidOperationException( $"ファイルデータが仕様と異なります。(offset:{readStatus.Offset})"); } readStatus.IncreaseByteOffset(); } return(HasNext.Yes); } if (b1 == CommonEvent.FooterBytesBeforeVer2_00[0]) { readStatus.IncreaseByteOffset(); return(HasNext.No); } throw new InvalidOperationException( $"ファイルデータが仕様と異なります。(offset:{readStatus.Offset})"); }
private void ReadCharaMoveCommand(BinaryReadStatus readStatus, ICollection <ICharaMoveCommand> commandList) { // 動作指定コード var charaMoveCode = readStatus.ReadByte(); CharaMoveCommandCode commandCode; try { commandCode = CharaMoveCommandCode.FromByte(charaMoveCode); } catch { throw new InvalidOperationException( $"存在しない動作指定コマンドコードが読み込まれました。" + $"(コマンドコード値:{charaMoveCode}, offset:{readStatus.Offset}"); } var charaMoveCommand = CharaMoveCommandFactory.CreateRaw(commandCode); readStatus.IncreaseByteOffset(); // 変数の数 var varLength = readStatus.ReadByte(); readStatus.IncreaseByteOffset(); // 変数 for (var i = 0; i < varLength; i++) { var value = readStatus.ReadInt(); charaMoveCommand.SetNumberValue(i, value); readStatus.IncreaseIntOffset(); } // 終端コードチェック foreach (var b in CharaMoveCommandBase.EndBlockCode) { if (readStatus.ReadByte() != b) { throw new InvalidOperationException( $"動作指定コマンド末尾の値が異なります。(offset: {readStatus.Offset})"); } readStatus.IncreaseByteOffset(); } // 結果 commandList.Add(charaMoveCommand); }
/// <summary> /// 起動条件比較演算子 & 起動条件 /// </summary> /// <param name="readStatus">読み込み経過状態</param> /// <param name="condition">結果格納インスタンス</param> private void ReadBootConditionOperationAndType(BinaryReadStatus readStatus, CommonEventBootCondition condition) { var b = readStatus.ReadByte(); readStatus.IncreaseByteOffset(); condition.Operation = CriteriaOperator.FromByte((byte)(b & 0xF0)); condition.CommonEventBootType = CommonEventBootType.FromByte((byte)(b & 0x0F)); }
/// <summary> /// コモンイベント末尾B /// </summary> /// <param name="readStatus">読み込み経過状態</param> /// <exception cref="InvalidOperationException">データが仕様と異なる場合</exception> private void ReadFooterB(BinaryReadStatus readStatus) { foreach (var b in CommonEvent.FooterBytesAfterVer2_00) { if (readStatus.ReadByte() != b) { throw new InvalidOperationException( $"ファイルデータが仕様と異なります。(offset:{readStatus.Offset})"); } readStatus.IncreaseByteOffset(); } }
/// <summary> /// セルフ変数名の後のチェックディジット /// </summary> /// <param name="readStatus">読み込み経過状態</param> /// <exception cref="InvalidOperationException">データが仕様と異なる場合</exception> private void ReadAfterMemoBytesSelfVariableNamesBytes(BinaryReadStatus readStatus) { foreach (var b in CommonEvent.AfterMemoBytesSelfVariableNamesBytes) { if (readStatus.ReadByte() != b) { throw new InvalidOperationException( $"ファイルデータが仕様と異なります。(offset:{readStatus.Offset})"); } readStatus.IncreaseByteOffset(); } }
/// <summary> /// セパレータ /// </summary> /// <param name="readStatus">読み込み経過状態</param> private void ReadSeparator(BinaryReadStatus readStatus) { var read = readStatus.ReadByte(); if (read != TileSetSetting.DataSeparator) { throw new InvalidOperationException( $"データセパレータが正しく読み込めませんでした。(offset:{readStatus.Offset})"); } readStatus.IncreaseByteOffset(); }
/// <summary> /// コモンイベントヘッダ /// </summary> /// <param name="readStatus">読み込み経過状態</param> /// <exception cref="InvalidOperationException">ヘッダが仕様と異なる場合</exception> private void ReadHeader(BinaryReadStatus readStatus) { foreach (var b in CommonEvent.HeaderBytes) { if (readStatus.ReadByte() != b) { throw new InvalidOperationException( $"ファイルヘッダが仕様と異なります。(offset:{readStatus.Offset})"); } readStatus.IncreaseByteOffset(); } }
/// <summary> /// ヘッダ /// </summary> /// <param name="readStatus">読み込み経過状態</param> /// <exception cref="InvalidOperationException">ファイルヘッダが仕様と異なる場合</exception> private void ReadHeader(BinaryReadStatus readStatus) { foreach (var b in DBDataSetting.Header) { if (readStatus.ReadByte() != b) { throw new InvalidOperationException( $"ファイルヘッダがファイル仕様と異なります(offset:{readStatus.Offset})"); } readStatus.IncreaseByteOffset(); } }
/// <summary> /// イベントコマンドの動作指定コマンド /// </summary> /// <param name="readStatus">読み込み経過状態</param> /// <param name="actionEntry">データ格納先</param> /// <exception cref="InvalidOperationException">ファイル仕様が異なる場合</exception> private void ReadEventActionEntry(BinaryReadStatus readStatus, ActionEntry actionEntry) { // ヘッダチェック foreach (var b in ActionEntry.HeaderBytes) { if (readStatus.ReadByte() != b) { throw new InvalidOperationException( $"イベントコマンド中のイベントコマンドヘッダの値が異なります。(offset: {readStatus.Offset})"); } readStatus.IncreaseByteOffset(); } // 動作フラグ var optionFlag = readStatus.ReadByte(); actionEntry.SetOptionFlag(optionFlag); readStatus.IncreaseByteOffset(); // 動作コマンドリスト actionEntry.CommandList = ReadCharaMoveCommand(readStatus); }
/// <summary> /// タグ番号リスト /// </summary> /// <param name="readStatus">読み込み経過状態</param> /// <param name="list">結果格納インスタンス</param> private void ReadTagNumberList(BinaryReadStatus readStatus, out List <TileTagNumber> list) { var length = readStatus.ReadInt(); readStatus.IncreaseIntOffset(); list = new List <TileTagNumber>(); for (var i = 0; i < length; i++) { var tagNumber = readStatus.ReadByte(); readStatus.IncreaseByteOffset(); list.Add(tagNumber); } }
/// <summary> /// 引数特殊指定 /// </summary> /// <param name="readStatus">読み込み経過状態</param> /// <returns>引数特殊指定リスト</returns> private List <CommonEventArgType> ReadSpecialArgType(BinaryReadStatus readStatus) { var result = new List <CommonEventArgType>(); var length = readStatus.ReadInt(); readStatus.IncreaseIntOffset(); for (var i = 0; i < length; i++) { var b = readStatus.ReadByte(); readStatus.IncreaseByteOffset(); result.Add(CommonEventArgType.FromByte(b)); } return(result); }
/// <summary> /// 特殊引数リストを読み込み、返す。 /// </summary> /// <returns>特殊引数リスト</returns> /// <exception cref="InvalidOperationException">ファイル仕様が異なる場合</exception> public void Read(BinaryReadStatus readStatus) { try { // ヘッダ foreach (var b in CommonEventSpecialArgDescList.Header) { if (readStatus.ReadByte() != b) { throw new InvalidOperationException( $"ファイルデータが仕様と異なります。(offset:{readStatus.Offset})"); } readStatus.IncreaseByteOffset(); } // 引数名 var argNameList = ReadArgNames(readStatus); var argNameListCount = argNameList.Count; NumberArgNameList = argNameList.Take(argNameListCount / 2).ToList(); StringArgNameList = argNameList.Skip(argNameListCount / 2).ToList(); // 引数特殊指定 var argTypeList = ReadSpecialArgType(readStatus); var argTypeListCount = argTypeList.Count; NumberArgTypeList = argTypeList.Take(argTypeListCount / 2).ToList(); StringArgTypeList = argTypeList.Skip(argTypeListCount / 2).ToList(); // 数値特殊指定文字列パラメータ var stringArgLists = ReadSpecialStringArgList(readStatus); var stringArgListsCount = stringArgLists.Count; NumberArgStringParamsList = stringArgLists.Take(stringArgListsCount / 2).ToList(); StringArgStringParamsList = stringArgLists.Skip(stringArgListsCount / 2).ToList(); // 数値特殊指定数値パラメータ var numberArgLists = ReadSpecialNumberArgList(readStatus); var numberArgListsCount = numberArgLists.Count; NumberArgNumberParamsList = numberArgLists.Take(numberArgListsCount / 2).ToList(); StringArgNumberParamsList = numberArgLists.Skip(numberArgListsCount / 2).ToList(); // 数値特殊指定数値初期値 NumberArgInitValueList = ReadInitValue(readStatus); } catch (Exception ex) { throw new InvalidOperationException( $"引数特殊指定データが仕様と異なります。(offset:{readStatus.Offset})", ex); } }
/// <summary> /// 項目特殊指定 /// </summary> /// <param name="readStatus">読み込み経過状態</param> /// <returns>項目項目特殊指定リスト</returns> private List <DBItemSpecialSettingType> ReadItemSpecialSettingType(BinaryReadStatus readStatus) { var length = readStatus.ReadInt(); readStatus.IncreaseIntOffset(); var result = new List <DBItemSpecialSettingType>(); for (var i = 0; i < length; i++) { var value = readStatus.ReadByte(); readStatus.IncreaseByteOffset(); var type = DBItemSpecialSettingType.FromByte(value); result.Add(type); } return(result); }
/// <summary> /// 文字列引数の数 /// </summary> /// <param name="readStatus">読み込み経過状態</param> /// <param name="commonEvent">結果格納インスタンス</param> private void ReadStringArgLength(BinaryReadStatus readStatus, CommonEvent commonEvent) { commonEvent.StrArgsLength = readStatus.ReadByte(); readStatus.IncreaseByteOffset(); }
private void ReadEventCommand(BinaryReadStatus readStatus, ICollection <IEventCommand> commandList) { // 数値変数の数 var numVarLength = readStatus.ReadByte(); readStatus.IncreaseByteOffset(); // 数値変数 var numVarList = new List <int>(); for (var i = 0; i < numVarLength; i++) { var numVar = readStatus.ReadInt(); numVarList.Add(numVar); readStatus.IncreaseIntOffset(); } // インデント var indent = (sbyte)readStatus.ReadByte(); readStatus.IncreaseByteOffset(); // 文字データ数 var strVarLength = readStatus.ReadByte(); readStatus.IncreaseByteOffset(); // 文字列変数 var strVarList = new List <string>(); for (var i = 0; i < strVarLength; i++) { var woditorString = readStatus.ReadString(); strVarList.Add(woditorString.String); readStatus.AddOffset(woditorString.ByteLength); } // 動作指定フラグ var hasMoveCommand = readStatus.ReadByte() != 0; readStatus.IncreaseByteOffset(); // 動作指定コマンド ActionEntry actionEntry = null; if (hasMoveCommand) { actionEntry = new ActionEntry(); ReadEventActionEntry(readStatus, actionEntry); } // 引数の数チェック if (numVarLength != numVarList.Count) { throw new InvalidOperationException( "指定された数値引数の数と実際の数値引数の数が一致しません。"); } if (strVarLength != strVarList.Count) { throw new InvalidOperationException( "指定された文字列引数の数と実際の文字列引数の数が一致しません。"); } // 結果 var eventCommand = EventCommandFactory.CreateRaw( numVarList, indent, strVarList, actionEntry); commandList.Add(eventCommand); }