8[
WorkbenchPluginAttribute(name:
"AI Script Generator", description:
"Generates scripted Behavior Tree node classes", wbModules: {
"ScriptEditor" })]
9class SCR_AiScriptGeneratorPlugin : WorkbenchPlugin
11 [
Attribute(defvalue:
"{6741D2D6C8EFBFF9}Configs/AI/AIScriptGeneratorConfig.conf",
params:
"conf class=SCR_AIScriptGeneratorConfig")]
15 protected override void Run()
17 Workbench.ScriptDialog(
"AI Script Generator Plugin",
"",
this);
22 protected void RunButton()
30 _print(
string.Format(
"Failed to open config file: %1", m_sConfig),
LogLevel.ERROR);
34 int nGeneratedClasses = 0;
35 int nGeneratedLines = 0;
36 SCR_AiScriptGenerator_Parser parser =
new SCR_AiScriptGenerator_Parser();
37 SCR_AiScriptGenerator_OutputFormatBuffer bufferSendGoalMessage =
new SCR_AiScriptGenerator_OutputFormatBuffer();
38 SCR_AiScriptGenerator_OutputFormatBuffer bufferSendInfoMessage =
new SCR_AiScriptGenerator_OutputFormatBuffer();
39 SCR_AiScriptGenerator_OutputFormatBuffer bufferSendOrder =
new SCR_AiScriptGenerator_OutputFormatBuffer();
42 array<string> fileLines;
43 foreach (
string inputFilePath : config.m_aInputFiles)
48 _print(
string.Format(
"Failed to open input file: %1", inputFilePath),
LogLevel.ERROR);
55 while (fHandle.ReadLine(fLine) != -1)
57 fileLines.Insert(fLine);
62 parser.ParseLines(fileLines, inputFilePath);
66 parser.FindRelatedClasses();
67 parser.PrintListing();
70 foreach (SCR_AiScriptGenerator_Class parsedClass : parser.GetParsedClasses())
72 foreach (SCR_AiScriptGenerator_ClassGeneratorBase generator : parsedClass.m_aGenerators)
74 if (SCR_AiScriptGenerator_SendGoalMessageGenerator.Cast(generator))
75 generator.Generate(bufferSendGoalMessage);
76 else if (SCR_AiScriptGenerator_SendInfoMessageGenerator.Cast(generator))
77 generator.Generate(bufferSendInfoMessage);
78 else if (SCR_AiScriptGenerator_SendOrderGenerator.Cast(generator))
79 generator.Generate(bufferSendOrder);
86 WriteLinesToFile(config.m_sSendGoalMessageOutputFile, bufferSendGoalMessage.GetLines());
87 WriteLinesToFile(config.m_sSendInfoMessageOutputFile, bufferSendInfoMessage.GetLines());
88 WriteLinesToFile(config.m_sSendOrderOutputFile, bufferSendOrder.GetLines());
91 nGeneratedLines += bufferSendGoalMessage.GetLines().Count();
92 nGeneratedLines += bufferSendInfoMessage.GetLines().Count();
93 nGeneratedLines += bufferSendOrder.GetLines().Count();
94 _print(
string.Format(
"Generated %1 classes, %2 lines", nGeneratedClasses, nGeneratedLines));
98 protected void WriteLinesToFile(
string fileName, array<string> lines)
103 _print(
string.Format(
"Error opening output file: %1", fileName));
107 foreach (
string line : lines)
109 fHandleOut.WriteLine(line);
112 _print(
string.Format(
"Saved generated scripts to file: %1 (%2 lines)", fileName, lines.Count()));
122 Print(
string.Format(
"[AI Script Generator]: %1", str), logLevel);
126class SCR_AiScriptGenerator_Parser
129 const string CLASS =
"class";
131 const string MACRO_VARIABLE =
"VARIABLE";
132 const string NODE_PORT =
"NodePort";
133 const string NODE_PROPERTY =
"NodeProperty";
134 const string NODE_PROPERTY_ENUM =
"NodePropertyEnum";
136 const string MACRO_MESSAGE_CLASS =
"MESSAGE_CLASS";
137 const string GENERATE_SEND_GOAL_MESSAGE =
"GenerateSendGoalMessage";
138 const string GENERATE_SEND_INFO_MESSAGE =
"GenerateSendInfoMessage";
139 const string GENERATE_SEND_ORDER =
"GenerateSendOrder";
142 protected int m_iCurrentLineId;
143 protected string m_sCurrentLine;
144 protected string m_sCurrentFile;
147 protected ref SCR_AiScriptGenerator_Class m_CurrentClass;
149 protected ref array<ref SCR_AiScriptGenerator_Class> m_aParsedClasses = {};
152 protected void ResetContext(
string currentFile)
154 m_iCurrentLineId = 0;
155 m_sCurrentLine =
string.Empty;
156 m_sCurrentFile = currentFile;
161 array<ref SCR_AiScriptGenerator_Class> GetParsedClasses()
163 return m_aParsedClasses;
170 void ParseLines(array<string> lines,
string fileName)
172 ResetContext(fileName);
173 m_CurrentClass = null;
175 foreach (
int lineId,
string line : lines)
177 ParseLine(line, lineId);
182 m_aParsedClasses.Insert(m_CurrentClass);
188 void FindRelatedClasses()
191 foreach (SCR_AiScriptGenerator_Class _class : m_aParsedClasses)
193 string parentClassName = _class.m_sParentClassName;
194 if (parentClassName.IsEmpty())
198 foreach (SCR_AiScriptGenerator_Class c : m_aParsedClasses)
200 if (c.m_sName == parentClassName)
202 _class.m_ParentClass = c;
213 _print(
"-----------------------------------------------------------------------------", printContext :
false);
214 _print(
"Listing of parsed classes:", printContext :
false);
215 foreach (SCR_AiScriptGenerator_Class _class : m_aParsedClasses)
217 _print(_class.GetListing(), printContext:
false);
218 foreach (SCR_AiScriptGenerator_Variable _variable : _class.m_aVariables)
220 _print(
" " + _variable.GetListing(), printContext:
false);
222 _print(
"", printContext:
false);
224 _print(
"-----------------------------------------------------------------------------", printContext :
false);
225 _print(
"", printContext :
false);
229 protected void ParseLine(inout
string line,
int lineId)
234 m_iCurrentLineId = lineId;
235 m_sCurrentLine = line;
237 string comment = ExtractComment(line);
238 array<string> macroArgs = {};
239 if (ExtractMacro(comment, MACRO_MESSAGE_CLASS, macroArgs))
245 m_aParsedClasses.Insert(m_CurrentClass);
246 m_CurrentClass = null;
248 if (!VerifyMacro_MessageClass(macroArgs))
251 string className, parentClassName;
252 if (!ExtractClass(line, className, parentClassName))
256 m_CurrentClass =
new SCR_AiScriptGenerator_Class();
257 m_CurrentClass.m_sLine = m_sCurrentLine;
258 m_CurrentClass.m_sName = className;
259 m_CurrentClass.m_sParentClassName = parentClassName;
261 if (!macroArgs.IsEmpty())
263 switch (macroArgs[0])
265 case GENERATE_SEND_GOAL_MESSAGE:
267 SCR_AiScriptGenerator_SendGoalMessageGenerator generator =
new SCR_AiScriptGenerator_SendGoalMessageGenerator(m_CurrentClass);
268 generator.m_sGeneratedClassName = macroArgs[1];
269 m_CurrentClass.m_aGenerators.Insert(generator);
272 case GENERATE_SEND_INFO_MESSAGE:
274 SCR_AiScriptGenerator_SendInfoMessageGenerator generator =
new SCR_AiScriptGenerator_SendInfoMessageGenerator(m_CurrentClass);
275 generator.m_sGeneratedClassName = macroArgs[1];
276 m_CurrentClass.m_aGenerators.Insert(generator);
279 case GENERATE_SEND_ORDER:
281 SCR_AiScriptGenerator_SendOrderGenerator generator =
new SCR_AiScriptGenerator_SendOrderGenerator(m_CurrentClass);
282 generator.m_sGeneratedClassName = macroArgs[1];
283 m_CurrentClass.m_aGenerators.Insert(generator);
289 else if (ExtractMacro(comment, MACRO_VARIABLE, macroArgs))
295 if (!VerifyMacro_Variable(macroArgs))
298 string varType, varName;
299 if (!ExtractVariable(line, varType, varName))
302 SCR_AiScriptGenerator_Variable v =
new SCR_AiScriptGenerator_Variable();
303 v.m_sLine = m_sCurrentLine;
306 array<int> _a = { 0, 2 };
309 if (!macroArgs.IsIndexValid(i+ 1))
312 string arg = macroArgs[i];
314 if (arg == NODE_PORT)
315 v.m_sBindPortName = macroArgs[i+ 1];
316 else if (arg == NODE_PROPERTY)
317 v.m_sBindPropertyName = macroArgs[i+ 1];
318 else if (arg == NODE_PROPERTY_ENUM)
320 v.m_sBindPropertyName = macroArgs[i+ 1];
321 v.m_bBindPropertyIsEnum =
true;
324 m_CurrentClass.m_aVariables.Insert(v);
335 protected string ExtractComment(
string str)
337 int commentId = str.IndexOf(
COMMENT);
340 int strlen = str.Length();
341 int substrStart = commentId +
COMMENT.Length();
342 int substrLen = strlen - substrStart;
343 string commentContent = str.Substring(substrStart, substrLen);
344 return commentContent;
350 protected bool ExtractMacro(
string str,
string macroName, array<string> outMacroArguments)
352 int macroStartId = str.IndexOf(macroName);
353 if (macroStartId == -1)
356 int startBracketSearchId = macroStartId + macroName.Length();
357 int openBracketId = str.IndexOfFrom(startBracketSearchId,
"(");
358 int closeBracketId = str.IndexOfFrom(startBracketSearchId,
")");
360 if (openBracketId == -1 || closeBracketId == -1 || openBracketId > closeBracketId)
362 _print(
string.Format(
"ExtractMacro: failed to parse macro %1", macroName));
366 string strMacroArgs = str.Substring(openBracketId + 1, closeBracketId - openBracketId - 1);
367 if (strMacroArgs.IsEmpty())
370 outMacroArguments.Clear();
373 if (!strMacroArgs.Contains(
","))
376 strMacroArgs.TrimInPlace();
377 outMacroArguments.Clear();
378 outMacroArguments.Insert(strMacroArgs);
383 outMacroArguments.Clear();
384 strMacroArgs.Split(
",", outMacroArguments,
true);
385 int nMacroArgs = outMacroArguments.Count();
386 for (
int i = 0; i < nMacroArgs; i++)
388 outMacroArguments[i] = outMacroArguments[i].Trim();
397 protected bool ExtractVariable(
string str, out
string varType, out
string varName)
406 int idDotComma = str.IndexOf(
";");
407 if (idDotComma != -1)
408 str = str.Substring(0, idDotComma);
411 int idEquals = str.IndexOf(
"=");
413 str = str.Substring(0, idEquals);
416 array<string> tokens = {};
417 str.Split(
" ", tokens,
true);
419 int nTokens = tokens.Count();
426 varType = tokens[nTokens - 2].Trim();
427 varName = tokens[nTokens - 1].Trim();
434 protected bool ExtractClass(
string str, out
string className, out
string parentClassName)
436 className =
string.Empty;
437 parentClassName =
string.Empty;
440 array<string> tokens = {};
441 str.Split(
" ", tokens,
true);
444 int idClassToken = tokens.Find(CLASS);
445 if (idClassToken == -1)
449 for (
int i = idClassToken + 1; i < tokens.Count(); i++)
451 string s = tokens[i];
452 if (s ==
":" || s ==
"extends")
455 if (s.StartsWith(
"/"))
457 else if (className.IsEmpty())
459 else if (parentClassName.IsEmpty())
467 bool success = !className.IsEmpty();
478 protected string Unquote(
string str)
480 return str.Substring(1, str.Length() - 2);
488 SCR_AiScriptGeneratorPlugin._print(str, logLevel);
493 SCR_AiScriptGeneratorPlugin._print(
string.Format(
" File: %1", m_sCurrentFile), logLevel);
494 SCR_AiScriptGeneratorPlugin._print(
string.Format(
" Line %1: %2", m_iCurrentLineId + 1, m_sCurrentLine), logLevel);
502 protected bool VerifyMacro_MessageClass(array<string> args)
507 if (args.Count() != 2)
509 _print(
string.Format(
"Wrong argument count for macro %1", MACRO_MESSAGE_CLASS), logLevel:
LogLevel.ERROR);
515 case GENERATE_SEND_GOAL_MESSAGE:
516 case GENERATE_SEND_INFO_MESSAGE:
517 case GENERATE_SEND_ORDER:
522 _print(
string.Format(
"Unknown macro argument \"%1\"", args[0]), logLevel:
LogLevel.ERROR);
526 return VerifyMacroArgumentCount(MACRO_MESSAGE_CLASS, args, 1);
530 protected bool VerifyMacro_Variable(array<string> args)
532 int nArgs = args.Count();
533 if (nArgs != 0 && nArgs != 2 && nArgs != 4)
535 _print(
string.Format(
"Wrong argument count for macro: %1", MACRO_VARIABLE), logLevel:
LogLevel.ERROR);
539 if (args.IsIndexValid(0) && args[0] != NODE_PORT && args[0] != NODE_PROPERTY && args[0] != NODE_PROPERTY_ENUM)
541 _print(
string.Format(
"Unknown macro argument \"%1\"", args[0]), logLevel:
LogLevel.ERROR);
545 if (args.IsIndexValid(2) && args[2] != NODE_PORT && args[2] != NODE_PROPERTY && args[2] != NODE_PROPERTY_ENUM)
547 _print(
string.Format(
"Unknown macro argument \"%1\"", args[0]), logLevel:
LogLevel.ERROR);
551 return VerifyMacroArgumentCount(MACRO_VARIABLE, args, 1);
555 protected bool VerifyMacroArgumentCount(
string macroName, array<string> args,
int n)
557 if (args.Count() < n)
559 _print(
string.Format(
"Expected at least %1 arguments for macro: %2", n, macroName), logLevel:
LogLevel.ERROR);
569class SCR_AiScriptGenerator_OutputFormatBuffer
571 protected int m_iIndentCount = 0;
572 protected ref array<string> m_aGeneratedLines = {};
576 array<string> GetLines() {
return m_aGeneratedLines; }
583 if (line.StartsWith(
"}"))
587 for (
int i = 0; i < m_iIndentCount; i++)
589 strIndent = strIndent +
"\t";
591 m_aGeneratedLines.Insert(strIndent + line);
594 if (line.StartsWith(
"{"))
600class SCR_AiScriptGenerator_ClassGeneratorBase
602 SCR_AiScriptGenerator_Class m_Class;
603 string m_sGeneratedClassName;
608 void Generate(SCR_AiScriptGenerator_OutputFormatBuffer ctx);
615 void GenerateGetVariablesIn(SCR_AiScriptGenerator_OutputFormatBuffer ctx, array<string> extraPortNames, array<SCR_AiScriptGenerator_Variable> variables)
618 array<string> aPortNames = {};
619 aPortNames.Copy(extraPortNames);
620 foreach (SCR_AiScriptGenerator_Variable v : variables)
622 if (!v.m_sBindPortName.IsEmpty())
623 aPortNames.Insert(
string.Format(
"\"%1\"", v.m_sBindPortName));
626 ctx.AddLine(
"protected static ref TStringArray _s_aVarsIn =");
628 int nPorts = aPortNames.Count();
629 foreach (
int varId,
string portName : aPortNames)
631 string strPortName = portName;
632 if (varId != nPorts-1)
633 strPortName = strPortName +
",";
634 ctx.AddLine(strPortName);
637 ctx.AddLine(
"override TStringArray GetVariablesIn() { return _s_aVarsIn; }");
645 void GenerateVariablesWithAttributes(SCR_AiScriptGenerator_OutputFormatBuffer ctx, array<SCR_AiScriptGenerator_Variable> variables)
647 foreach (SCR_AiScriptGenerator_Variable v : variables)
649 if (v.m_sBindPropertyName.IsEmpty())
652 if (!v.m_bBindPropertyIsEnum)
653 ctx.AddLine(
"[Attribute(\"" +
"\")]");
655 ctx.AddLine(
string.Format(
"[Attribute(\"" +
"\", UIWidgets.ComboBox, enumType: %1)]", v.m_sType));
657 ctx.AddLine(
string.Format(
"%1 %2;", v.m_sType, v.m_sBindPropertyName));
666 void GenerateSetMessageVariables(SCR_AiScriptGenerator_OutputFormatBuffer ctx, array<SCR_AiScriptGenerator_Variable> variables)
668 ctx.AddLine(
string.Format(
"msg.SetText(m_sText);"));
671 foreach (SCR_AiScriptGenerator_Variable v : variables)
673 if (!v.m_sBindPortName.IsEmpty() && !v.m_sBindPropertyName.IsEmpty())
676 ctx.AddLine(
string.Format(
"if(!GetVariableIn(\"%1\", msg.%2))", v.m_sBindPortName, v.m_sName));
677 ctx.AddLine(
string.Format(
"\tmsg.%1 = %2;", v.m_sName, v.m_sBindPropertyName));
680 else if (!v.m_sBindPortName.IsEmpty())
683 ctx.AddLine(
string.Format(
"GetVariableIn(\"%1\", msg.%2);", v.m_sBindPortName, v.m_sName));
686 else if (!v.m_sBindPropertyName.IsEmpty())
689 ctx.AddLine(
string.Format(
"msg.%1 = %2;", v.m_sName, v.m_sBindPropertyName));
699 void GenerateGetNodeMiddleText(SCR_AiScriptGenerator_OutputFormatBuffer ctx, array<SCR_AiScriptGenerator_Variable> variables)
701 array<SCR_AiScriptGenerator_Variable> properties = {};
702 foreach (SCR_AiScriptGenerator_Variable v : variables)
704 if (v.m_sBindPropertyName)
705 properties.Insert(v);
708 if (properties.IsEmpty())
711 ctx.AddLine(
"override string GetNodeMiddleText()");
713 ctx.AddLine(
"string s;");
714 foreach (SCR_AiScriptGenerator_Variable v : properties)
716 if (v.m_bBindPropertyIsEnum)
717 ctx.AddLine(
string.Format(
"s = s + string.Format(\"%1: %2\\n\", typename.EnumToString(%3, %4));", v.m_sBindPropertyName,
"%1", v.m_sType, v.m_sBindPropertyName));
719 ctx.AddLine(
string.Format(
"s = s + string.Format(\"%1: %2\\n\", %3);", v.m_sBindPropertyName,
"%1", v.m_sBindPropertyName));
721 ctx.AddLine(
"return s;");
728 void GenerateCommentSeparator(SCR_AiScriptGenerator_OutputFormatBuffer ctx)
730 ctx.AddLine(
"//---------------------------------------------------------------------------------------");
737 array<SCR_AiScriptGenerator_Variable> GetClassVariables(SCR_AiScriptGenerator_Class _class)
740 array<SCR_AiScriptGenerator_Class> parentClasses = {};
741 SCR_AiScriptGenerator_Class parentClass = _class;
744 parentClasses.Insert(parentClass);
745 parentClass = parentClass.m_ParentClass;
749 array<SCR_AiScriptGenerator_Variable> variables = {};
750 for (
int classId = parentClasses.Count() - 1; classId >= 0; classId--)
752 SCR_AiScriptGenerator_Class c = parentClasses[classId];
753 foreach (SCR_AiScriptGenerator_Variable v : c.m_aVariables)
764 void SCR_AiScriptGenerator_ClassGeneratorBase(SCR_AiScriptGenerator_Class attachedToClass)
766 m_Class = attachedToClass;
770class SCR_AiScriptGenerator_SendInfoMessageGenerator : SCR_AiScriptGenerator_ClassGeneratorBase
773 override void Generate(SCR_AiScriptGenerator_OutputFormatBuffer ctx)
776 array<SCR_AiScriptGenerator_Variable> variables = GetClassVariables(m_Class);
778 GenerateCommentSeparator(ctx);
779 ctx.AddLine(
string.Format(
"// Generated from class: %1", m_Class.m_sName));
780 ctx.AddLine(
string.Format(
"class %1 : SCR_AISendMessageGenerated", m_sGeneratedClassName));
784 GenerateVariablesWithAttributes(ctx, variables);
787 GenerateGetVariablesIn(ctx, {
"SCR_AISendMessageGenerated.PORT_RECEIVER" }, variables);
790 ctx.AddLine(
"override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)");
792 ctx.AddLine(
"AIAgent receiver = GetReceiverAgent(owner);");
793 ctx.AddLine(
string.Format(
"%1 msg = new %1();", m_Class.m_sName));
797 GenerateSetMessageVariables(ctx, variables);
799 ctx.AddLine(
string.Format(
"if (SendMessage(owner, receiver, msg))"));
800 ctx.AddLine(
"\treturn ENodeResult.SUCCESS;");
802 ctx.AddLine(
"\treturn ENodeResult.FAIL;");
806 GenerateGetNodeMiddleText(ctx, variables);
808 ctx.AddLine(
"static override bool VisibleInPalette() { return true; }");
815class SCR_AiScriptGenerator_SendGoalMessageGenerator : SCR_AiScriptGenerator_ClassGeneratorBase
818 override void Generate(SCR_AiScriptGenerator_OutputFormatBuffer ctx)
821 array<SCR_AiScriptGenerator_Variable> variables = GetClassVariables(m_Class);
823 GenerateCommentSeparator(ctx);
824 ctx.AddLine(
string.Format(
"// Generated from class: %1", m_Class.m_sName));
825 ctx.AddLine(
string.Format(
"class %1 : SCR_AISendMessageGenerated", m_sGeneratedClassName));
829 GenerateVariablesWithAttributes(ctx, variables);
832 GenerateGetVariablesIn(ctx, {
"SCR_AISendMessageGenerated.PORT_RECEIVER" }, variables);
835 ctx.AddLine(
"override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)");
837 ctx.AddLine(
"AIAgent receiver = GetReceiverAgent(owner);");
838 ctx.AddLine(
string.Format(
"%1 msg = new %1();", m_Class.m_sName));
842 ctx.AddLine(
string.Format(
"msg.m_RelatedGroupActivity = GetRelatedActivity(owner);"));
846 GenerateSetMessageVariables(ctx, variables);
849 ctx.AddLine(
"if (msg.m_bIsWaypointRelated)");
850 ctx.AddLine(
"\tmsg.m_RelatedWaypoint = GetRelatedWaypoint(owner);");
853 ctx.AddLine(
string.Format(
"if (SendMessage(owner, receiver, msg))"));
854 ctx.AddLine(
"\treturn ENodeResult.SUCCESS;");
856 ctx.AddLine(
"\treturn ENodeResult.FAIL;");
860 GenerateGetNodeMiddleText(ctx, variables);
862 ctx.AddLine(
"static override bool VisibleInPalette() { return true; }");
869class SCR_AiScriptGenerator_SendOrderGenerator : SCR_AiScriptGenerator_ClassGeneratorBase
872 override void Generate(SCR_AiScriptGenerator_OutputFormatBuffer ctx)
875 array<SCR_AiScriptGenerator_Variable> variables = GetClassVariables(m_Class);
877 GenerateCommentSeparator(ctx);
878 ctx.AddLine(
string.Format(
"// Generated from class: %1", m_Class.m_sName));
879 ctx.AddLine(
string.Format(
"class %1 : SCR_AISendMessageGenerated", m_sGeneratedClassName));
883 GenerateVariablesWithAttributes(ctx, variables);
886 GenerateGetVariablesIn(ctx, {
"SCR_AISendOrderGenerated.PORT_RECEIVER" }, variables);
889 ctx.AddLine(
"override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)");
891 ctx.AddLine(
"AIAgent receiver = GetReceiverAgent(owner);");
892 ctx.AddLine(
string.Format(
"%1 msg = new %1();", m_Class.m_sName));
896 GenerateSetMessageVariables(ctx, variables);
898 ctx.AddLine(
string.Format(
"if (SendMessage(owner, receiver, msg))"));
899 ctx.AddLine(
"\treturn ENodeResult.SUCCESS;");
901 ctx.AddLine(
"\treturn ENodeResult.FAIL;");
905 GenerateGetNodeMiddleText(ctx, variables);
907 ctx.AddLine(
"static override bool VisibleInPalette() { return true; }");
914class SCR_AiScriptGenerator_Class
918 string m_sParentClassName;
919 SCR_AiScriptGenerator_Class m_ParentClass;
920 ref array<ref SCR_AiScriptGenerator_Variable> m_aVariables = {};
923 ref array<ref SCR_AiScriptGenerator_ClassGeneratorBase>
m_aGenerators = {};
929 string strParentClassWarning;
931 strParentClassWarning =
"(Not found!)";
933 return string.Format(
"Class: %1 : %2%3",
m_sName, m_sParentClassName, strParentClassWarning);
937class SCR_AiScriptGenerator_Variable
943 string m_sBindPortName;
945 string m_sBindPropertyName;
946 bool m_bBindPropertyIsEnum;
952 return string.Format(
"Variable: %1 %2 -> %3", m_sType,
m_sName, m_sBindPortName);
void AddLine(string text)
ref array< ref SCR_ResourceGenerator > m_aGenerators
Refer to SCR_ResourceGenerator for documentation.
class WorkbenchDialog_AbortRetryIgnore ButtonAttribute("OK", true)
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
SCR_FieldOfViewSettings Attribute
@ COMMENT
Comment visible only in the editor.
FileMode
Mode for opening file. See FileSystem::Open.