示例#1
0
        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);
        }
示例#2
0
        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);
        }