Пример #1
0
        public override void SetSafetyStringVariable(int index, string value)
        {
            if (index < 0 || StringVariableCount < index)
            {
                throw new ArgumentOutOfRangeException(
                          ErrorMessage.OutOfRange(nameof(index), 0, StringVariableCount, index));
            }
            if (value is null)
            {
                throw new ArgumentNullException(ErrorMessage.NotNull(nameof(value)));
            }

            if (index == 0)
            {
                // コモンイベント名
                EventIdOrName.Merge(value);
                return;
            }

            var tmpIndex = index - 1;

            // 引数タイプが数値なら何もしない
            if (StrArgList[tmpIndex].InstanceIntOrStrType == IntOrStrType.Int)
            {
                return;
            }
            StrArgList[tmpIndex] = value;
        }
Пример #2
0
        public override string GetSafetyStringVariable(int index)
        {
            if (index < 0 || StringVariableCount < index)
            {
                throw new ArgumentOutOfRangeException(
                          ErrorMessage.OutOfRange(nameof(index), 0, StringVariableCount, index));
            }
            if (index == 0)
            {
                // コモンイベント名
                return(EventIdOrName.HasStr ? EventIdOrName.ToStr() : "");
            }

            var tmpIndex = index - 1;

            var val = StrArgList[tmpIndex];

            if (val.InstanceIntOrStrType == IntOrStrType.Int)
            {
                return("");
            }
            return(val.ToStr());
        }
Пример #3
0
        public override int GetSafetyNumberVariable(int index)
        {
            if (index > NumberVariableCount || index < 0)
            {
                throw new ArgumentOutOfRangeException(
                          ErrorMessage.OutOfRange(nameof(index), 0, NumberVariableCount, index));
            }

            switch (index)
            {
            case 0:
                return(EventCommandCode.Code);

            case 1:
                if (!IsOrderByString)
                {
                    return(EventIdOrName.ToInt());
                }
                return(0);

            case 2:
                if (!IsOrderByString &&
                    (EventIdOrName.ToInt().IsMapEventId() ||
                     EventIdOrName.ToInt().IsVariableAddress()))
                {
                    // マップイベントID指定呼び出しの場合
                    return(Page - 1);
                }

                // コモンイベントID指定呼び出しの場合
                var bytes = new byte[4];
                bytes[0] = (byte)((StrArgValue << 4) + IntArgValue);
                bytes[1] = StrArgList.ReferenceFlg;
                bytes[2] = 0;
                bytes[3] = (byte)(IsGetReturnValue ? 1 : 0);
                return(bytes.ToInt32(Endian.Little));

            default:
                // ここから可変長引数パターン

                // 数値引数の設定値を指すかどうかを確認する。
                var tmpIndex = index - 3;
                if (tmpIndex < IntArgValue)
                {
                    // 数値引数の設定値を返す
                    return(IntArgList[tmpIndex]);
                }

                // 文字列引数の設定値を指すかどうかを確認する。
                tmpIndex -= IntArgValue;
                if (tmpIndex < StrArgValue)
                {
                    // 文字列引数の設定値を返す
                    //   ただし文字列直接指定ならば 0 を返す
                    var strArg = StrArgList[tmpIndex];
                    if (strArg.InstanceIntOrStrType != IntOrStrType.Int)
                    {
                        return(0);
                    }

                    return(strArg.ToInt());
                }

                // 残るは戻り値格納アドレスのみ
                tmpIndex -= StrArgValue;
                if (tmpIndex != 0 || !IsGetReturnValue)
                {
                    // おかしい(通常来ないはず)
                    throw new InvalidOperationException();
                }

                return(ResultOutputAddress);
            }
        }