Example #1
0
        public ValueType Invoke(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result)
        {
            var res = InvokeInternal(SRC, etype, @params, pcount, is_term, out str_result, out num_result);

            SRC.LogTrace("Invoked",
                         res.ToString().Substring(0, 1),
                         GetType().Name + "(" + string.Join(",", Enumerable.Range(1, pcount).Select(x => @params[x])) + ")",
                         str_result,
                         num_result.ToString()
                         );
            return(res);
        }
Example #2
0
        protected override int ExecInternal()
        {
            if (ArgNum != 2)
            {
                throw new EventErrorException(this, "Switchコマンドの引数の数が違います");
            }

            var a = GetArgAsString(2);

            SRC.LogTrace("Switch", a);
            var depth = 1;

            foreach (var i in this.AfterEventIdRange())
            {
                var cmd = Event.EventCmd[i];
                switch (cmd.Name)
                {
                case CmdType.CaseCmd:
                    if (depth == 1)
                    {
                        for (var j = 2; j <= cmd.ArgNum; j++)
                        {
                            var    arg = cmd.GetArgRaw(j);
                            string b;
                            if (arg.argType == Expressions.ValueType.UndefinedType)
                            {
                                // 未識別のパラメータは式として処理する
                                b = cmd.GetArgAsString(j);
                                if ((b ?? "") == (cmd.GetArg(j) ?? ""))
                                {
                                    // 文字列として識別済みにする
                                    cmd.GetArgRaw(j).argType = Expressions.ValueType.StringType;
                                }
                            }
                            else
                            {
                                // 識別済みのパラメータは文字列としてそのまま参照する
                                b = cmd.GetArg(j);
                            }

                            if (a == b)
                            {
                                return(i + 1);
                            }
                        }
                    }

                    break;

                case CmdType.CaseElseCmd:
                    if (depth == 1)
                    {
                        return(i + 1);
                    }

                    break;

                case CmdType.EndSwCmd:
                    if (depth == 1)
                    {
                        return(i + 1);
                    }
                    else
                    {
                        depth = depth - 1;
                    }

                    break;

                case CmdType.SwitchCmd:
                    depth = depth + 1;
                    break;
                }
            }

            throw new EventErrorException(this, "SwitchとEndSwが対応していません");
        }
Example #3
0
        protected override int ExecInternal()
        {
            if (ArgNum < 4)
            {
                throw new EventErrorException(this, "PaintPictureコマンドの引数の数が違います");
            }

            var buf     = "";
            var options = "";
            var tcolor  = Color.White;
            var i       = 5;
            var opt_n   = 4;

            while (i <= ArgNum)
            {
                buf = GetArgAsString(i);
                switch (buf ?? "")
                {
                case "透過":
                case "背景":
                case "白黒":
                case "セピア":
                case "明":
                case "暗":
                case "上下反転":
                case "左右反転":
                case "上半分":
                case "下半分":
                case "右半分":
                case "左半分":
                case "右上":
                case "左上":
                case "右下":
                case "左下":
                case "ネガポジ反転":
                case "シルエット":
                case "夕焼け":
                case "水中":
                case "保持":
                case "フィルタ":
                {
                    options = options + buf + " ";
                    break;
                }

                case "右回転":
                {
                    i       = (i + 1);
                    options = options + "右回転 " + GetArgAsString(i) + " ";
                    break;
                }

                case "左回転":
                {
                    i       = (i + 1);
                    options = options + "左回転 " + GetArgAsString(i) + " ";
                    break;
                }

                case "-":
                {
                    // スキップ
                    // スキップ
                    opt_n = i;
                    break;
                }

                case var @case when @case == "":
                {
                    break;
                }

                default:
                {
                    if (Strings.Asc(buf) == 35 && Strings.Len(buf) == 7)
                    {
                        Color filterColor = ColorExtension.FromHexString(buf);
                        if (!filterColor.IsEmpty)
                        {
                            if (GetArgAsString((i - 1)) == "フィルタ")
                            {
                                options = options + filterColor.ToHexString() + " ";
                            }
                        }
                    }
                    else if (Information.IsNumeric(buf))
                    {
                        // スキップ
                        opt_n = i;
                    }
                    else if (Strings.InStr(buf, " ") > 0)
                    {
                        options = options + buf + " ";
                    }
                    else if (Strings.Right(buf, 1) == "%" && Information.IsNumeric(Strings.Left(buf, Strings.Len(buf) - 1)))
                    {
                        options = options + buf + " ";
                    }
                    else
                    {
                        throw new EventErrorException(this, "PaintPictureコマンドの" + i + "番目のパラメータ「" + buf + "」が不正です");
                    }

                    break;
                }
                }

                i = (i + 1);
            }

            var fname = GetArgAsString(2);

            switch (Strings.Right(Strings.LCase(fname), 4) ?? "")
            {
            // 正しい画像ファイル名
            case ".bmp":
            case ".jpg":
            case ".gif":
            case ".png":
                break;

            default:
                if (SRC.PDList.IsDefined(fname))
                {
                    fname = @"Pilot\" + SRC.PDList.Item(fname).Bitmap;
                }
                else if (SRC.NPDList.IsDefined(fname))
                {
                    fname = @"Pilot\" + SRC.NPDList.Item(fname).Bitmap;
                }
                else if (SRC.UDList.IsDefined(fname))
                {
                    fname = @"Unit\" + SRC.UDList.Item(fname).Bitmap;
                }
                else
                {
                    throw new EventErrorException(this, "不正な画像ファイル名「" + fname + "」が指定されています");
                }

                break;
            }

            // 描画先の画像
            int dx, dy, dw, dh;

            buf = GetArgAsString(3);
            if (buf == "-")
            {
                dx = Constants.DEFAULT_LEVEL;
            }
            else
            {
                dx = GeneralLib.StrToLng(buf) + Event.BaseX;
            }

            buf = GetArgAsString(4);
            if (buf == "-")
            {
                dy = Constants.DEFAULT_LEVEL;
            }
            else
            {
                dy = GeneralLib.StrToLng(buf) + Event.BaseY;
            }

            // 描画サイズ
            if (opt_n >= 6)
            {
                buf = GetArgAsString(5);
                if (buf == "-")
                {
                    dw = Constants.DEFAULT_LEVEL;
                }
                else
                {
                    dw = GeneralLib.StrToLng(buf);
                    if (dw <= 0)
                    {
                        return(EventData.NextID);
                    }
                }

                buf = GetArgAsString(6);
                if (buf == "-")
                {
                    dh = Constants.DEFAULT_LEVEL;
                }
                else
                {
                    dh = GeneralLib.StrToLng(buf);
                    if (dh <= 0)
                    {
                        return(EventData.NextID);
                    }
                }
            }
            else
            {
                dw = Constants.DEFAULT_LEVEL;
                dh = Constants.DEFAULT_LEVEL;
            }

            // 原画像における転送元座標&サイズ
            int sx, sy, sw, sh;

            if (opt_n == 10)
            {
                buf = GetArgAsString(7);
                if (buf == "-")
                {
                    sx = Constants.DEFAULT_LEVEL;
                }
                else
                {
                    sx = GeneralLib.StrToLng(buf);
                }

                buf = GetArgAsString(8);
                if (buf == "-")
                {
                    sy = Constants.DEFAULT_LEVEL;
                }
                else
                {
                    sy = GeneralLib.StrToLng(buf);
                }

                sw = GetArgAsLong(9);
                sh = GetArgAsLong(10);
            }
            else
            {
                sx = 0;
                sy = 0;
                sw = 0;
                sh = 0;
            }

            GUI.DrawPicture(fname, dx, dy, dw, dh, sx, sy, sw, sh, options);
            SRC.LogTrace($"DrawPicture({fname}, {dx}, {dy}, {dw}, {dh}, {sx}, {sy}, {sw}, {sh}, {options})");

            return(EventData.NextID);
        }
Example #4
0
File: Call.cs Project: 7474/SRC
        protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result)
        {
            var CallFunctionRet = ValueType.UndefinedType;

            str_result = "";
            num_result = 0d;

            try
            {
                // サブルーチンの場所は?
                // まずはサブルーチン名が式でないと仮定して検索
                var ret = SRC.Event.FindNormalLabel(@params[1]);
                if (ret < 0)
                {
                    // 式で指定されている?
                    ret = SRC.Event.FindNormalLabel(SRC.Expression.GetValueAsString(@params[1], is_term[1]));
                    if (ret < 0)
                    {
                        SRC.Event.DisplayEventErrorMessage(SRC.Event.CurrentLineNum, "指定されたサブルーチン「" + @params[1] + "」が見つかりません");
                        return(CallFunctionRet);
                    }
                }

                ret = ret + 1;

                // 呼び出し階層をチェック
                if (SRC.Event.CallDepth >= Event.MaxCallDepth)
                {
                    SRC.Event.CallDepth = Event.MaxCallDepth;
                    SRC.Event.DisplayEventErrorMessage(SRC.Event.CurrentLineNum, Event.MaxCallDepth + "階層を越えるサブルーチンの呼び出しは出来ません");
                    return(CallFunctionRet);
                }

                // 引数用スタックが溢れないかチェック
                if ((SRC.Event.ArgIndex + pcount) >= Event.MaxArgIndex)
                {
                    SRC.Event.DisplayEventErrorMessage(SRC.Event.CurrentLineNum, "サブルーチンの引数の総数が" + Event.MaxArgIndex + "個を超えています");
                    return(CallFunctionRet);
                }

                // 引数を評価しておく
                for (var i = 2; i <= pcount; i++)
                {
                    @params[i] = SRC.Expression.GetValueAsString(@params[i], is_term[i]);
                }

                // 現在の状態を保存
                SRC.Event.CallStack[SRC.Event.CallDepth]     = SRC.Event.CurrentLineNum;
                SRC.Event.ArgIndexStack[SRC.Event.CallDepth] = SRC.Event.ArgIndex;
                SRC.Event.VarIndexStack[SRC.Event.CallDepth] = SRC.Event.VarIndex;
                SRC.Event.ForIndexStack[SRC.Event.CallDepth] = SRC.Event.ForIndex;

                // UpVarが実行された場合、UpVar実行数は累計する
                if (SRC.Event.UpVarLevel > 0)
                {
                    SRC.Event.UpVarLevelStack[SRC.Event.CallDepth] = (SRC.Event.UpVarLevel + SRC.Event.UpVarLevelStack[SRC.Event.CallDepth - 1]);
                }
                else
                {
                    SRC.Event.UpVarLevelStack[SRC.Event.CallDepth] = 0;
                }

                // UpVarの階層数を初期化
                SRC.Event.UpVarLevel = 0;

                // 呼び出し階層数をインクリメント
                SRC.Event.CallDepth = (SRC.Event.CallDepth + 1);
                var cur_depth = SRC.Event.CallDepth;

                // 引数をスタックに積む
                SRC.Event.ArgIndex = (SRC.Event.ArgIndex + pcount);
                for (var i = 1; i <= pcount; i++)
                {
                    SRC.Event.ArgStack[SRC.Event.ArgIndex - i + 1] = @params[i];
                }

                // サブルーチン本体を実行
                do
                {
                    SRC.Event.CurrentLineNum = ret;
                    if (SRC.Event.CurrentLineNum >= SRC.Event.EventCmd.Count)
                    {
                        break;
                    }

                    var cmd = SRC.Event.EventCmd[SRC.Event.CurrentLineNum];
                    if (cur_depth == SRC.Event.CallDepth && cmd.Name == Events.CmdType.ReturnCmd)
                    {
                        break;
                    }

                    ret = cmd.Exec();
                }while (ret >= 0);

                // 返り値
                {
                    var withBlock1 = SRC.Event.EventCmd[SRC.Event.CurrentLineNum];
                    if (withBlock1.ArgNum == 2)
                    {
                        str_result = withBlock1.GetArgAsString(2);
                    }
                    else
                    {
                        str_result = "";
                    }
                }

                // 呼び出し階層数をデクリメント
                SRC.Event.CallDepth = (SRC.Event.CallDepth - 1);

                // サブルーチン実行前の状態に復帰
                SRC.Event.CurrentLineNum = SRC.Event.CallStack[SRC.Event.CallDepth];
                SRC.Event.ArgIndex       = SRC.Event.ArgIndexStack[SRC.Event.CallDepth];
                SRC.Event.VarIndex       = SRC.Event.VarIndexStack[SRC.Event.CallDepth];
                SRC.Event.ForIndex       = SRC.Event.ForIndexStack[SRC.Event.CallDepth];
                SRC.Event.UpVarLevel     = SRC.Event.UpVarLevelStack[SRC.Event.CallDepth];
                if (etype == ValueType.NumericType)
                {
                    num_result      = GeneralLib.StrToDbl(str_result);
                    CallFunctionRet = ValueType.NumericType;
                }
                else
                {
                    CallFunctionRet = ValueType.StringType;
                }
            }
            finally
            {
                SRC.LogTrace("Called",
                             etype.ToString().Substring(0, 1),
                             @params[1] + "(" + string.Join(",", Enumerable.Range(2, pcount - 1).Select(x => @params[x])) + ")",
                             str_result,
                             num_result.ToString()
                             );
            }

            return(CallFunctionRet);
        }