public static void Macro(EngineState s, CodeCommand cmd) { CodeInfo_Macro info = cmd.Info.Cast <CodeInfo_Macro>(); bool isGlobal; CodeCommand macroCmd; if (s.Macro.GlobalDict.ContainsKey(info.MacroType)) { macroCmd = s.Macro.GlobalDict[info.MacroType]; macroCmd.RawCode = cmd.RawCode; isGlobal = true; } else if (s.Macro.LocalDict.ContainsKey(info.MacroType)) { macroCmd = s.Macro.LocalDict[info.MacroType]; macroCmd.RawCode = cmd.RawCode; isGlobal = false; } else { s.Logger.BuildWrite(s, new LogInfo(LogState.Error, $"Invalid Command [{info.MacroType}]", cmd, s.CurDepth)); return; } Dictionary <int, string> paramDict = new Dictionary <int, string>(); for (int i = 0; i < info.Args.Count; i++) { paramDict[i + 1] = StringEscaper.ExpandSectionParams(s, info.Args[i]); } s.CurSectionInParams = paramDict; s.Logger.BuildWrite(s, new LogInfo(LogState.Info, $"Executing Command [{info.MacroType}]", cmd, s.CurDepth)); // Backup and set EngineState values int realScriptIdBackup = s.RefScriptId; if (isGlobal) { s.RefScriptId = s.Logger.BuildRefScriptWrite(s, macroCmd.Section.Script); } s.InMacro = true; CommandBranch.RunExec(s, macroCmd, true); // Restore and reset EngineState values s.RefScriptId = realScriptIdBackup; s.InMacro = false; }
public static void Macro(EngineState s, CodeCommand cmd) { CodeInfo_Macro info = cmd.Info.Cast <CodeInfo_Macro>(); CodeCommand macroCmd; if (s.Macro.GlobalDict.ContainsKey(info.MacroType)) { macroCmd = s.Macro.GlobalDict[info.MacroType]; } else if (s.Macro.LocalDict.ContainsKey(info.MacroType)) { macroCmd = s.Macro.LocalDict[info.MacroType]; } else { throw new ExecuteException($"Invalid command [{info.MacroType}]"); } Dictionary <int, string> paramDict = new Dictionary <int, string>(); for (int i = 0; i < info.Args.Count; i++) { paramDict[i + 1] = StringEscaper.Preprocess(s, info.Args[i]); } s.CurSectionInParams = paramDict; s.Logger.BuildWrite(s, new LogInfo(LogState.Info, $"Executing command [{info.MacroType}]", cmd, s.PeekDepth)); if (macroCmd.Type == CodeType.Run || macroCmd.Type == CodeType.RunEx || macroCmd.Type == CodeType.Exec) { CommandBranch.RunExec(s, macroCmd, new CommandBranch.RunExecOptions { PreserveCurrentParams = true, IsMacro = true, }); } else { s.PushLocalState(true, s.Logger.BuildRefScriptWrite(s, macroCmd.Section.Script, true)); Engine.ExecuteCommand(s, macroCmd); s.PopLocalState(); } }