public override void Save(ExtendedBinaryWriter writer) { var strings = new List <string>(); writer.WriteSignature("STSC"); writer.AddOffset("EntryPosition"); writer.Write(0x07); // Version writer.WriteSignature(ScriptName); writer.WriteNulls((uint)(0x20 - ScriptName.Length)); // Pad Script Name writer.Write(0x000507E3); writer.Write((short)0x09); writer.Write((short)0x0D); writer.Write((short)0x19); writer.Write((short)0x0D); writer.Write(ScriptID); writer.FillInOffset("EntryPosition"); foreach (var instruction in Instructions) { writer.Write((byte)STSCInstructions.DALRRInstructions.FindIndex(t => t?.Name == instruction.Name)); instruction.Write(writer, ref ManualCount, strings); } // Write String Table for (int i = 0; i < strings.Count; ++i) { if (!writer.HasOffset($"Strings_{i}")) { continue; } writer.FillInOffset($"Strings_{i}"); writer.WriteNullTerminatedString(strings[i]); } writer.FixPadding(0x10); }
public override void Save(ExtendedBinaryWriter writer) { var strings = new List <string>(); writer.WriteSignature("STSC"); writer.AddOffset("EntryPosition"); writer.Write(Version); switch (Version) { case 4: // Date A Live: Twin Edition Rio Reincarnation (PSV) writer.Write((ushort)ScriptID); break; case 7: // Date A Live: Rio Reincarnation (PC) writer.WriteSignature(ScriptName); writer.WriteNulls((uint)(0x20 - ScriptName.Length)); // Pad Script Name writer.Write(0x000507E3); writer.Write((short)0x09); writer.Write((short)0x0D); writer.Write((short)0x19); writer.Write((short)0x0D); writer.Write(ScriptID); break; } writer.FillInOffset("EntryPosition"); foreach (var instruction in Instructions) { writer.Write((byte)STSCInstructions.DALRRInstructions.FindIndex(t => t?.Name == instruction.Name)); instruction.Write(writer, ref ManualCount, strings); } // Write String Table Dictionary <string, uint> writtenStrings = new Dictionary <string, uint>(); for (int i = 0; i < strings.Count; ++i) { if (!writer.HasOffset($"Strings_{i}")) { continue; } if (writtenStrings.ContainsKey(strings[i])) { writer.FillInOffset($"Strings_{i}", writtenStrings[strings[i]]); continue; } writer.FillInOffset($"Strings_{i}"); writtenStrings.Add(strings[i], (uint)writer.BaseStream.Position); writer.WriteNullTerminatedString(strings[i]); } writer.FixPadding(0x10); }