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); }
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が対応していません"); }
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); }
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); }