public void WriteScripts(AsmCollection asmCollection) { ArchiveFileEntry jsmEntry = (ArchiveFileEntry)_locationDirectory.Childs.TryGetValue(_name + ".jsm"); if (jsmEntry == null) { return; } JsmHeader header = new JsmHeader(); List <JsmGroup> groups = new List <JsmGroup>(8); List <JsmScript> scripts = new List <JsmScript>(32); List <JsmOperation> operations = new List <JsmOperation>(512); foreach (AsmModule module in asmCollection.GetOrderedModules()) { JsmGroup group = new JsmGroup(module.ExecutionOrder, module.Label, (byte)module.Count, (JsmModuleType)module.Type); header.IncrementCount(group.Type); groups.Add(group); } foreach (AsmModule module in asmCollection.GetOrderedModulesByIndex()) { foreach (AsmEvent evt in module.GetOrderedEvents()) { JsmScript script = new JsmScript((ushort)operations.Count, evt.Flag); scripts.Add(script); foreach (JsmOperation command in evt) { operations.Add(command); } } } scripts.Add(new JsmScript((ushort)operations.Count, false)); header.ScriptsOffset = (ushort)(8 + groups.Count * 2); header.OperationsOffset = (ushort)(header.ScriptsOffset + scripts.Count * 2); using (JsmFileWriter jsmWriter = new JsmFileWriter(jsmEntry.OpenWritableCapacityStream())) jsmWriter.WriteScripts(header, groups, scripts, operations); //ArchiveFileEntry symEntry = (ArchiveFileEntry)_locationDirectory.Childs.TryGetValue(_name + ".sym"); //if (symEntry == null) // return; //using (SymFileWriter symWriter = new SymFileWriter(symEntry.OpenWritableCapacityStream())) //{ //} }
public bool ReadScripts(Location location) { ArchiveFileEntry jsmEntry = (ArchiveFileEntry)_locationDirectory.Childs.TryGetValue(_name + ".jsm"); if (jsmEntry == null) { return(true); } AsmCollection result; using (JsmFileReader jsmReader = new JsmFileReader(jsmEntry.OpenReadableContentStream())) { AsmModule previousModule = null; result = new AsmCollection(jsmReader.Groups.Length); for (ushort g = 0, s = 0, o = 0; g < jsmReader.Groups.Length; g++) { JsmGroup jsmGroup = jsmReader.Groups[g]; AsmModule asmGroup = AsmModuleFactory.Create(jsmGroup.Type); asmGroup.Index = g; asmGroup.ExecutionOrder = jsmGroup.ExecutionOrder; asmGroup.Label = jsmGroup.Label; asmGroup.Title = jsmGroup.Label.ToString("D3"); asmGroup.PreviousModule = previousModule; if (previousModule != null) { previousModule.NextModule = asmGroup; } previousModule = asmGroup; result.Add(asmGroup.Label, asmGroup); for (int i = 0; i < jsmGroup.ScriptsCount; i++) { JsmScript jsmScript = jsmReader.Scripts[s++]; AsmEvent asmScript = new AsmEvent(asmGroup, jsmScript.OperationsCount) { Flag = jsmScript.Flag, Label = (ushort)(asmGroup.Label + i) }; asmGroup.SetEventByIndex(i, asmScript); for (int k = 0; k < jsmScript.OperationsCount; k++) { JsmOperation jsmOperation = jsmReader.Opertations[o++]; asmScript.Add(jsmOperation); } } } } ArchiveFileEntry symEntry = (ArchiveFileEntry)_locationDirectory.Childs.TryGetValue(_name + ".sym"); if (symEntry == null) { location.Scripts = result; return(true); } using (SymFileReader symReader = new SymFileReader(symEntry.OpenReadableContentStream())) { foreach (AsmModule module in result.GetOrderedModules()) { module.Title = symReader.Labels[module.Label]; foreach (AsmEvent evt in module.GetOrderedEvents()) { evt.Title = symReader.Labels[evt.Label]; } } } location.Scripts = result; location.SaveRequest &= ~LocationProperty.Scripts; location.Importable &= ~LocationProperty.Scripts; return(true); }