public override void Read(Iff iff, Stream stream) { using (var io = IoBuffer.FromStream(stream, ByteOrder.LITTLE_ENDIAN)) { var formatCode = io.ReadInt16(); if (!io.HasMore) { return; } if (formatCode == 0) { var numStrings = io.ReadUInt16(); Strings = new STRItem[numStrings]; for (var i = 0; i < numStrings; i++) { Strings[i] = new STRItem { Value = io.ReadPascalString() }; } } //This format changed 00 00 to use C strings rather than Pascal strings. else if (formatCode == -1) { var numStrings = io.ReadUInt16(); Strings = new STRItem[numStrings]; for (var i = 0; i < numStrings; i++) { Strings[i] = new STRItem { Value = io.ReadNullTerminatedString() }; } } //This format changed FF FF to use string pairs rather than single strings. else if (formatCode == -2) { var numStrings = io.ReadUInt16(); Strings = new STRItem[numStrings]; for (var i = 0; i < numStrings; i++) { Strings[i] = new STRItem { Value = io.ReadNullTerminatedString(), Comment = io.ReadNullTerminatedString() }; } } //This format changed FD FF to use a language code. else if (formatCode == -3) { var numStrings = io.ReadUInt16(); Strings = new STRItem[numStrings]; for (var i = 0; i < numStrings; i++) { Strings[i] = new STRItem { LanguageCode = (byte)(io.ReadByte() + 1), Value = io.ReadNullTerminatedString(), Comment = io.ReadNullTerminatedString() }; } } //This format is only used in The Sims Online. The format is essentially a performance improvement: //it counteracts both the short string limit of 255 characters found in 00 00 and the inherent slowness //of null-terminated strings in the other formats (which requires two passes over each string), and it //also provides a string pair count for each language set which eliminates the need for two passes over //each language set. else if (formatCode == -4) { var numLanguageSets = io.ReadByte(); this.LanguageSets = new STRLanguageSet[numLanguageSets]; for (var i = 0; i < numLanguageSets; i++) { var item = new STRLanguageSet(); var numStringPairs = io.ReadUInt16(); item.Strings = new STRItem[numStringPairs]; for (var x = 0; x < numStringPairs; x++) { item.Strings[x] = new STRItem { LanguageCode = (byte)(io.ReadByte() + 1), Value = io.ReadVariableLengthPascalString(), Comment = io.ReadVariableLengthPascalString() }; } this.LanguageSets[i] = item; } } } }
public override void Read(Iff iff, Stream stream) { using (var io = IoBuffer.FromStream(stream, ByteOrder.LITTLE_ENDIAN)) { var formatCode = io.ReadInt16(); if (!io.HasMore){ return; } if (formatCode == 0) { var numStrings = io.ReadUInt16(); Strings = new STRItem[numStrings]; for (var i = 0; i < numStrings; i++) { Strings[i] = new STRItem { Value = io.ReadPascalString() }; } } //This format changed 00 00 to use C strings rather than Pascal strings. else if (formatCode == -1) { var numStrings = io.ReadUInt16(); Strings = new STRItem[numStrings]; for (var i = 0; i < numStrings; i++) { Strings[i] = new STRItem { Value = io.ReadNullTerminatedString() }; } } //This format changed FF FF to use string pairs rather than single strings. else if (formatCode == -2) { var numStrings = io.ReadUInt16(); Strings = new STRItem[numStrings]; for (var i = 0; i < numStrings; i++) { Strings[i] = new STRItem { Value = io.ReadNullTerminatedString(), Comment = io.ReadNullTerminatedString() }; } } //This format changed FD FF to use a language code. else if (formatCode == -3) { var numStrings = io.ReadUInt16(); Strings = new STRItem[numStrings]; for (var i = 0; i < numStrings; i++) { Strings[i] = new STRItem { LanguageCode = (byte)(io.ReadByte() + 1), Value = io.ReadNullTerminatedString(), Comment = io.ReadNullTerminatedString() }; } } //This format is only used in The Sims Online. The format is essentially a performance improvement: //it counteracts both the short string limit of 255 characters found in 00 00 and the inherent slowness //of null-terminated strings in the other formats (which requires two passes over each string), and it //also provides a string pair count for each language set which eliminates the need for two passes over //each language set. else if (formatCode == -4) { var numLanguageSets = io.ReadByte(); this.LanguageSets = new STRLanguageSet[numLanguageSets]; for(var i=0; i < numLanguageSets; i++){ var item = new STRLanguageSet(); var numStringPairs = io.ReadUInt16(); item.Strings = new STRItem[numStringPairs]; for (var x = 0; x < numStringPairs; x++){ item.Strings[x] = new STRItem { LanguageCode = (byte)(io.ReadByte() + 1), Value = io.ReadVariableLengthPascalString(), Comment = io.ReadVariableLengthPascalString() }; } this.LanguageSets[i] = item; } } } }