public void Unserialize(UndertaleReader reader) { FolderName = reader.ReadUndertaleString(); Name = reader.ReadUndertaleString(); ClassName = reader.ReadUndertaleString(); Files = reader.ReadUndertaleObject <UndertalePointerList <UndertaleExtensionFile> >(); }
public void Unserialize(UndertaleReader reader) { Filename = reader.ReadUndertaleString(); CleanupScript = reader.ReadUndertaleString(); InitScript = reader.ReadUndertaleString(); Kind = (UndertaleExtensionKind)reader.ReadUInt32(); Functions = reader.ReadUndertaleObject <UndertalePointerList <UndertaleExtensionFunction> >(); }
public void Unserialize(UndertaleReader reader) { Tags = new UndertaleSimpleListString(); Tags.Unserialize(reader); UndertalePointerList <TempAssetTags> temp = reader.ReadUndertaleObject <UndertalePointerList <TempAssetTags> >(); AssetTags = new Dictionary <int, UndertaleSimpleListString>(); foreach (TempAssetTags t in temp) { AssetTags[t.ID] = t.Tags; } }
public void Serialize(UndertaleWriter writer) { Tags.Serialize(writer); UndertalePointerList <TempAssetTags> temp = new UndertalePointerList <TempAssetTags>(); foreach (var kvp in AssetTags) { temp.Add(new TempAssetTags() { ID = kvp.Key, Tags = kvp.Value }); } temp.Serialize(writer); }
/// <inheritdoc/> public void Dispose() { GC.SuppressFinalize(this); foreach (UndertaleExtensionFile file in Files) { file?.Dispose(); } Files = new(); FolderName = null; Name = null; ClassName = null; Files = new(); }
/// <inheritdoc/> public void Dispose() { GC.SuppressFinalize(this); if (Functions is not null) { foreach (UndertaleExtensionFunction func in Functions) { func?.Dispose(); } } Filename = null; CleanupScript = null; InitScript = null; Functions = new(); }
void ImportCode(string codeName, string gmlCode, bool IsGML = true, bool doParse = true, bool destroyASM = true, bool CheckDecompiler = false) { bool SkipPortions = false; UndertaleCode code = Data.Code.ByName(codeName); if (Data.Code.ByName(codeName) == null) { code = new UndertaleCode(); code.Name = Data.Strings.MakeString(codeName); Data.Code.Add(code); } if (Data?.GeneralInfo.BytecodeVersion > 14 && Data.CodeLocals.ByName(codeName) == null) { UndertaleCodeLocals locals = new UndertaleCodeLocals(); locals.Name = code.Name; UndertaleCodeLocals.LocalVar argsLocal = new UndertaleCodeLocals.LocalVar(); argsLocal.Name = Data.Strings.MakeString("arguments"); argsLocal.Index = 0; locals.Locals.Add(argsLocal); code.LocalsCount = 1; code.GenerateLocalVarDefinitions(code.FindReferencedLocalVars(), locals); // Dunno if we actually need this line, but it seems to work? Data.CodeLocals.Add(locals); } if (doParse) { // This portion links code. if (codeName.Substring(0, 10).Equals("gml_Script")) { // Add code to scripts section. if (Data.Scripts.ByName(codeName.Substring(11)) == null) { UndertaleScript scr = new UndertaleScript(); scr.Name = Data.Strings.MakeString(codeName.Substring(11)); scr.Code = code; Data.Scripts.Add(scr); } else { UndertaleScript scr = Data.Scripts.ByName(codeName.Substring(11)); scr.Code = code; } } else if (codeName.Substring(0, 16).Equals("gml_GlobalScript")) { // Add code to global init section. UndertaleGlobalInit init_entry = null; // This doesn't work, have to do it the hard way: UndertaleGlobalInit init_entry = Data.GlobalInitScripts.ByName(scr_dup_code_name_con); foreach (UndertaleGlobalInit globalInit in Data.GlobalInitScripts) { if (globalInit.Code.Name.Content == codeName) { init_entry = globalInit; break; } } if (init_entry == null) { UndertaleGlobalInit NewInit = new UndertaleGlobalInit(); NewInit.Code = code; Data.GlobalInitScripts.Add(NewInit); } else { UndertaleGlobalInit NewInit = init_entry; NewInit.Code = code; } } else if (codeName.Substring(0, 10).Equals("gml_Object")) { string afterPrefix = codeName.Substring(11); int underCount = 0; string methodNumberStr = "", methodName = "", objName = ""; for (int i = afterPrefix.Length - 1; i >= 0; i--) { if (afterPrefix[i] == '_') { underCount++; if (underCount == 1) { methodNumberStr = afterPrefix.Substring(i + 1); } else if (underCount == 2) { objName = afterPrefix.Substring(0, i); methodName = afterPrefix.Substring(i + 1, afterPrefix.Length - objName.Length - methodNumberStr.Length - 2); break; } } } int methodNumber = 0; try { methodNumber = int.Parse(methodNumberStr); if (methodName == "Collision" && (methodNumber >= Data.GameObjects.Count || methodNumber < 0)) { bool doNewObj = ScriptQuestion("Object of ID " + methodNumber.ToString() + " was not found.\nAdd new object?"); if (doNewObj) { UndertaleGameObject gameObj = new UndertaleGameObject(); gameObj.Name = Data.Strings.MakeString(SimpleTextInput("Enter object name", "Enter object name", "This is a single text line input box test.", false)); Data.GameObjects.Add(gameObj); } else { // It *needs* to have a valid value, make the user specify one. List <uint> possible_values = new List <uint>(); possible_values.Add(uint.MaxValue); methodNumber = (int)ReduceCollisionValue(possible_values); } } } catch { if (afterPrefix.LastIndexOf("_Collision_") != -1) { string s2 = "_Collision_"; objName = afterPrefix.Substring(0, (afterPrefix.LastIndexOf("_Collision_"))); methodNumberStr = afterPrefix.Substring(afterPrefix.LastIndexOf("_Collision_") + s2.Length, afterPrefix.Length - (afterPrefix.LastIndexOf("_Collision_") + s2.Length)); methodName = "Collision"; // GMS 2.3+ use the object name for the one colliding, which is rather useful. if (Data.GMS2_3) { if (Data.GameObjects.ByName(methodNumberStr) != null) { for (var i = 0; i < Data.GameObjects.Count; i++) { if (Data.GameObjects[i].Name.Content == methodNumberStr) { methodNumber = i; break; } } } else { bool doNewObj = ScriptQuestion("Object " + objName + " was not found.\nAdd new object called " + objName + "?"); if (doNewObj) { UndertaleGameObject gameObj = new UndertaleGameObject(); gameObj.Name = Data.Strings.MakeString(objName); Data.GameObjects.Add(gameObj); } } if (Data.GameObjects.ByName(methodNumberStr) != null) { // It *needs* to have a valid value, make the user specify one, silly. List <uint> possible_values = new List <uint>(); possible_values.Add(uint.MaxValue); ReassignGUIDs(methodNumberStr, ReduceCollisionValue(possible_values)); } } else { // Let's try to get this going methodNumber = (int)ReduceCollisionValue(GetCollisionValueFromCodeNameGUID(codeName)); ReassignGUIDs(methodNumberStr, ReduceCollisionValue(GetCollisionValueFromCodeNameGUID(codeName))); } } } UndertaleGameObject obj = Data.GameObjects.ByName(objName); if (obj == null) { bool doNewObj = ScriptQuestion("Object " + objName + " was not found.\nAdd new object called " + objName + "?"); if (doNewObj) { UndertaleGameObject gameObj = new UndertaleGameObject(); gameObj.Name = Data.Strings.MakeString(objName); Data.GameObjects.Add(gameObj); } else { SkipPortions = true; } } if (!(SkipPortions)) { obj = Data.GameObjects.ByName(objName); int eventIdx = (int)Enum.Parse(typeof(EventTypes), methodName); bool duplicate = false; try { foreach (UndertaleGameObject.Event evnt in obj.Events[eventIdx]) { foreach (UndertaleGameObject.EventAction action in evnt.Actions) { if (action.CodeId?.Name?.Content == codeName) { duplicate = true; } } } } catch { // Something went wrong, but probably because it's trying to check something non-existent // Just keep going } if (duplicate == false) { UndertalePointerList <UndertaleGameObject.Event> eventList = obj.Events[eventIdx]; UndertaleGameObject.EventAction action = new UndertaleGameObject.EventAction(); UndertaleGameObject.Event evnt = new UndertaleGameObject.Event(); action.ActionName = code.Name; action.CodeId = code; evnt.EventSubtype = (uint)methodNumber; evnt.Actions.Add(action); eventList.Add(evnt); } } } } SafeImport(codeName, gmlCode, IsGML, destroyASM, CheckDecompiler); }
/// <summary> /// Initializes a new instance of the <see cref="UndertaleTimelineMoment"/> with the specified step time and event action list. /// </summary> /// <param name="step">After how many steps the moment shall be executed.</param> /// <param name="events">A list of events that shall be executed.</param> public UndertaleTimelineMoment(uint step, UndertalePointerList <UndertaleGameObject.EventAction> events) { Step = step; Event = events; }
/// <inheritdoc/> public void Dispose() { GC.SuppressFinalize(this); Event = null; }