private static void DecompileDialog(StreamWriter writer, BMDDialog dlg) { bool lastLineWasNoNewlineFunc = false; bool lastLineWasText = false; foreach (BMDDialogToken token in dlg.Tokens) { switch (token.Type) { case BMDDialogTokenType.Text: { if (!lastLineWasText) { lastLineWasText = true; } writer.Write(token.ToString()); } break; case BMDDialogTokenType.Function: { string funcName = GetFuncString((BMDFunctionToken)token); if (lastLineWasText) { writer.Write("<{0}>", funcName); lastLineWasText = false; lastLineWasNoNewlineFunc = true; } else { if (lastLineWasNoNewlineFunc) { writer.WriteLine("\n" + "<{0}>", funcName); lastLineWasNoNewlineFunc = false; } else { writer.WriteLine("<{0}>", funcName); } } } break; default: throw new InvalidDataException("Unexpected page token type!"); } } }
private void InternalRead(BinaryReader reader, int fp) { name = reader.ReadCString(NAME_LENGTH); ushort numDialogs = reader.ReadUInt16(); _actorIndex = (reader.ReadInt16()); if (_actorIndex != -1) { // High bit is a special flag? _actorIndex = (short)(_actorIndex & 0x7FFF); } int[] pagePointerTable = reader.ReadInt32Array(numDialogs); int pageDataLength = reader.ReadInt32(); dialogs = new BMDDialog[numDialogs]; for (int i = 0; i < numDialogs; i++) { reader.BaseStream.Seek(fp + BMDFile.DATA_START_ADDRESS + pagePointerTable[i], SeekOrigin.Begin); dialogs[i] = new BMDDialog(reader); } }
private void InternalRead(BinaryReader reader, int fp) { name = reader.ReadCString(NAME_LENGTH); _field18 = reader.ReadUInt16(); ushort numChoices = reader.ReadUInt16(); if (_field18 != 0) { throw new NotImplementedException("_unk0x18 is not zero!"); } // unknown zero 4 bytesz reader.BaseStream.Seek(4, SeekOrigin.Current); int[] pagePointerTable = reader.ReadInt32Array(numChoices); int pageDataLength = reader.ReadInt32(); dialogs = new BMDDialog[numChoices]; for (int i = 0; i < numChoices; i++) { reader.BaseStream.Seek(fp + BMDFile.DATA_START_ADDRESS + pagePointerTable[i], SeekOrigin.Begin); dialogs[i] = new BMDDialog(reader); } }
private static BMDDialog ParseDlg() { BMDDialog dlg = new BMDDialog(); ReadLines("[end]"); StringBuilder strBuilder = new StringBuilder(); bool textWasRead = false; for (int i = 0; i < curStringBuffer.Count; i++) { for (int j = 0; j < curStringBuffer[i].Length; j++) { if (curStringBuffer[i][j] == '<') { if (textWasRead) { dlg.Tokens.Add(new BMDTextToken(strBuilder.ToString())); strBuilder.Clear(); textWasRead = false; } int funcOpenIdx = j; int funcCloseIdx = -1; for (int k = j; k < curStringBuffer[i].Length-j; k++) { if (curStringBuffer[i][k] == '>') { funcCloseIdx = k; j += (k - j); break; } } if (funcCloseIdx != -1) { string funcString = curStringBuffer[i].Substring(funcOpenIdx + 1, funcCloseIdx - funcOpenIdx - 1); dlg.Tokens.Add(ParseFunction(funcString)); j = funcCloseIdx; } } else { if (!textWasRead) textWasRead = true; strBuilder.Append(curStringBuffer[i][j]); } } } return dlg; }