private void ExportCurrentRoomScript() { SPAGS.ScriptCollection scripts = new SPAGS.ScriptCollection(editor.Version); scripts.SetStandardConstants(editor.CurrentGame.Settings); scripts.AddStandardHeaders(editor); List<SPAGS.Script> globalScripts = GetGlobalScripts(scripts); SPAGS.ValueType.Struct hotspotType, objectType; if (!scripts.GlobalNamespace.TryGetValue2<SPAGS.ValueType.Struct>("Hotspot", out hotspotType)) { throw new Exception("Unable to find \"Hotspot\" type!"); } if (!scripts.GlobalNamespace.TryGetValue2<SPAGS.ValueType.Struct>("Object", out objectType)) { throw new Exception("Unable to find \"Object\" type!"); } StringBuilder roomHeaderSB = new StringBuilder(); foreach (AGS.Types.RoomHotspot hs in editor.RoomController.CurrentRoom.Hotspots) { roomHeaderSB.AppendLine("Hotspot " + hs.Name + ";"); } foreach (AGS.Types.RoomObject obj in editor.RoomController.CurrentRoom.Objects) { roomHeaderSB.AppendLine("Object " + obj.Name + ";"); } SPAGS.Script roomHeader = scripts.AddHeader("___CurrentRoomScript__.ash", roomHeaderSB.ToString()); SPAGS.Script roomScript = null; foreach (AGS.Types.IRoom iroom in editor.CurrentGame.Rooms) { if (iroom.Number == editor.RoomController.CurrentRoom.Number) { roomScript = scripts.CompileScript("___CurrentRoomScript__.asc", iroom.Script.Text); } } if (roomScript == null) { throw new Exception("Room #" + editor.RoomController.CurrentRoom.Number + " not found!"); } JS.SPAGSConverter convert = new JS.SPAGSConverter(); JS.Script script = new JS.Script(); JS.Expression ags = script.GetExternalGlobal("ags"); JS.Expression jQuery = script.GetExternalGlobal("jQuery"); JS.Expression ags_util = ags.Index("util"); JS.Expression ags_games_guid = ags.Index("games", GetCurrentGameGuid()); JS.FunctionDefinition initFunc = new JS.FunctionDefinition(); { JS.Variable initializerParam_jQuery = initFunc.NewParam("$"); JS.FunctionDefinition ctor = new JS.FunctionDefinition(); JS.Expression.ObjectLiteral ctorProto = new JS.Expression.ObjectLiteral(); { JS.Variable ctorParam_engine = ctor.NewParam("engine"); JS.Variable ctorParam_game = ctor.NewParam("game"); JS.Variable ctorParam_room = ctor.NewParam("room"); JS.Variable ctorVar_util = ctor.NewVar("util"); ctorVar_util.InitialValue = ags_util; JS.Variable ctorVar_self = ctor.NewVar("roomScript"); ctorVar_self.InitialValue = ctor.This; JS.Variable ctorVar_globalScripts = ctor.NewVar("globalScripts"); ctorVar_globalScripts.InitialValue = ctorParam_game.Index("globalScripts"); foreach (SPAGS.Function globalFunc in scripts.GlobalNamespace.EachOf<SPAGS.Function>()) { if (globalFunc.OwnerScript == null) { JS.Expression specialExpr; if (convert.GetSpecial(globalFunc, out specialExpr)) { convert.AddReference(globalFunc, specialExpr); } else { string funcName = globalFunc.Name.Replace("::", "$$"); convert.AddReference(globalFunc, ctorParam_engine.Index(funcName)); } } } foreach (SPAGS.Function exportedFunc in scripts.Exported.EachOf<SPAGS.Function>()) { if (exportedFunc.OwnerScript != null && exportedFunc.OwnerScript != roomScript) { convert.AddReference(exportedFunc, ctorVar_globalScripts.Index(exportedFunc.Name.Replace("::", "$$"))); } } foreach (SPAGS.Variable globalVar in scripts.GlobalNamespace.EachOf<SPAGS.Variable>()) { if (globalVar.OwnerScript == null) { convert.AddReference(globalVar, ctorParam_game.Index(globalVar.Name, convert.GetValueTypes(globalVar.Type))); } else { if (globalVar.OwnerScript == roomHeader) { convert.AddReference(globalVar, ctorParam_room.Index(globalVar.Name, convert.GetValueTypes(globalVar.Type))); } else { convert.AddReference(globalVar, ctorVar_globalScripts.Index(globalVar.Name, convert.GetValueTypes(globalVar.Type))); } } } foreach (SPAGS.ValueType.Struct structType in roomScript.DefinedStructs) { if (structType.IsManaged) { continue; } string structName = "t$" + structType.Name; JS.Variable structVar = ctor.NewVar(structName); convert.AddReference(structType, structVar); JS.FunctionDefinition structCtor = new JS.FunctionDefinition(); ctor.Body.Add(structVar.Assign(structCtor)); JS.Expression.ObjectLiteral structProto = new JS.Expression.ObjectLiteral(); foreach (SPAGS.StructMember.Field field in structType.Members.EachOf<SPAGS.StructMember.Field>()) { SPAGS.Expression initValue = field.Type.CreateDefaultValueExpression(); if (initValue.IsConstant()) { structProto.Add(field.Name, convert.FromSPAGS(initValue)); } else { structProto.Add(field.Name, JS.Expression.Null); structCtor.Body.Add(structCtor.This.Index(field.Name).Assign(convert.FromSPAGS(initValue))); } } if (structProto.Entries.Count > 0) { ctor.Body.Add(structVar.Index("prototype").Assign(structProto)); } if (scripts.GlobalNamespace.ContainsKey(structType.Name) && scripts.GlobalNamespace[structType.Name] == structType) { ctor.Body.Add(ctorVar_self.Index(structType.Name).Assign(structVar)); } } foreach (SPAGS.Variable roomVar in roomScript.DefinedVariables) { string varName = "v$" + roomVar.Name; JS.Variable jsVar = ctor.NewVar(varName, convert.GetValueTypes(roomVar.Type)); convert.AddReference(roomVar, jsVar); SPAGS.Expression value = roomVar.InitialValue ?? roomVar.Type.CreateDefaultValueExpression(); if (value.IsConstant()) { jsVar.InitialValue = convert.FromSPAGS(value); } else { ctor.Body.Add(jsVar.Assign(convert.FromSPAGS(value))); } } Dictionary<SPAGS.Function, JS.FunctionDefinition> funcDefs = new Dictionary<SPAGS.Function, JS.FunctionDefinition>(); foreach (SPAGS.Function func in roomScript.DefinedFunctions) { string funcName = "f$" + func.Name.Replace("::","$$"); JS.Variable funcVar = ctor.NewVar(funcName); JS.FunctionDefinition funcDef = new JS.FunctionDefinition(); foreach (SPAGS.Parameter spagsParam in func.ParameterVariables) { string paramName = "p$" + spagsParam.Name; JS.Variable jsParam = funcDef.NewParam(paramName); jsParam.VariableType = convert.GetValueTypes(spagsParam.Type); convert.SetReference(spagsParam, jsParam); } funcDefs[func] = funcDef; ctor.Body.Add(funcVar.Assign(funcDef)); ctor.Body.Add(ctorVar_self.Index(func.Name).Assign(funcVar)); convert.AddReference(func, funcVar); } foreach (SPAGS.Function func in roomScript.DefinedFunctions) { JS.FunctionDefinition funcDef = funcDefs[func]; funcDef.Body = convert.FunctionBodyFromSPAGS(func); } } initFunc.Body.Add(ags_games_guid.Index("Room" + editor.RoomController.CurrentRoom.Number + "Script").Assign(ctor)); if (ctorProto.Entries.Count > 0) { initFunc.Body.Add(ags_games_guid.Index("Room" + editor.RoomController.CurrentRoom.Number + "Script", "prototype").Assign(ctorProto)); } } script.Add((JS.Statement)jQuery.Call(initFunc)); using (JS.Writer output = JS.Writer.Create(InExportFolder(ROOM_SCRIPT_FILENAME, editor.RoomController.CurrentRoom.Number))) { script.WriteTo(output); } }
private void convertButton_Click(object sender, EventArgs e) { string agsScript = agsEditWrapper.Text; SPAGS.ScriptCollection scripts = new SPAGS.ScriptCollection(editor.Version); scripts.SetStandardConstants(editor.CurrentGame.Settings); IList<AGS.Types.Script> allHeaders = editor.GetAllScriptHeaders(); scripts.AddHeader(allHeaders[0].FileName, allHeaders[0].Text); agsTable = new SPAGS.Util.NameDictionary(scripts.GlobalNamespace); for (int i = 1; i < allHeaders.Count; i++) { scripts.AddHeader(allHeaders[i].FileName, allHeaders[i].Text); } SPAGS.Script deconstructed; bool anonFunction = false; try { deconstructed = scripts.CompileScript("ConvertingScript.asc", agsScript); } catch { try { deconstructed = scripts.CompileScript("ConvertingScript.asc", "int __AnonymousFunction__(){" + agsScript + "}"); anonFunction = true; } catch { deconstructed = null; anonFunction = false; } if (deconstructed == null) throw; } StringBuilder luaSB = new StringBuilder(); if (anonFunction) { SPAGS.Function func = deconstructed.DefinedFunctions[0]; AddBlockContent(luaSB, 0, func.Body); } else { foreach (SPAGS.Constant constant in deconstructed.DefinedConstants) { luaSB.AppendLine(); SPAGS.Constant.Expression constantExpr = constant as SPAGS.Constant.Expression; if (constantExpr != null) { luaSB.Append(constant.Name + " = "); AddExpression(luaSB, 0, constantExpr.TheExpression); luaSB.AppendLine(); } else if (((SPAGS.Constant.TokenSequence)constant).Tokens.Count == 0) { luaSB.AppendLine(constant.Name + " = true"); } } foreach (SPAGS.ValueType.Enum enumType in deconstructed.DefinedEnums) { luaSB.AppendLine(); luaSB.AppendLine("-- " + enumType.Name); foreach (SPAGS.EnumValue enumValue in enumType.Entries) { luaSB.AppendLine(enumValue.Name + " = " + enumValue.Value); } } foreach (SPAGS.ValueType.Struct structType in deconstructed.DefinedStructs) { if (structType.IsManaged) continue; luaSB.AppendLine(); luaSB.AppendLine(structType.Name + " = ags.struct{"); foreach (SPAGS.StructMember member in structType.Members.EachOf<SPAGS.StructMember>()) { switch (member.MemberType) { case SPAGS.StructMemberType.Attribute: SPAGS.StructMember.Attribute attr = (SPAGS.StructMember.Attribute)member; luaSB.Append(" -- "); if (attr.IsReadOnly) luaSB.Append("readonly "); if (attr.IsStatic) luaSB.Append("static "); luaSB.Append("attribute " + attr.Name); if (attr.IsArray) luaSB.Append("[]"); luaSB.AppendLine(); break; case SPAGS.StructMemberType.Field: SPAGS.StructMember.Field field = (SPAGS.StructMember.Field)member; luaSB.Append(" " + field.Name + " = "); AddExpression(luaSB, 0, field.Type.CreateDefaultValueExpression()); luaSB.AppendLine(";"); break; case SPAGS.StructMemberType.Method: SPAGS.StructMember.Method method = (SPAGS.StructMember.Method)member; if (!method.IsExtender) { luaSB.Append(" -- "); if (method.IsStatic) luaSB.Append("static "); luaSB.AppendLine(method.Name + "()"); } break; } } luaSB.AppendLine("}"); } foreach (SPAGS.ScriptVariable variable in deconstructed.DefinedVariables) { luaSB.AppendLine(); if (!variable.Exported) { luaSB.Append("local "); } luaSB.Append(variable.Name + " = "); if (variable.InitialValue != null) { AddExpression(luaSB, 0, variable.InitialValue); } else { AddExpression(luaSB, 0, variable.Type.CreateDefaultValueExpression()); } luaSB.AppendLine(); } foreach (SPAGS.Function function in deconstructed.DefinedFunctions) { luaSB.AppendLine(); luaSB.Append("function "); luaSB.Append(function.Name.Replace("::",":")); luaSB.Append("("); for (int i = 0; i < function.ParameterVariables.Count; i++) { if (i > 0) luaSB.Append(", "); luaSB.Append(function.ParameterVariables[i].Name); } luaSB.AppendLine(")"); AddBlockContent(luaSB, 1, function.Body); luaSB.AppendLine("end"); } } luaOutputWrapper.IsReadOnly = false; luaOutputWrapper.Text = luaSB.ToString(); luaOutputWrapper.IsReadOnly = true; agsEditWrapper.Selection.End = agsEditWrapper.Selection.Start = 0; agsEditWrapper.Scrolling.ScrollToCaret(); }