Example #1
0
        public SCXString(SCXReader reader)
        {
            while (!reader.EOF)
            {
                var type = (TokenType)reader.ReadByte();
                switch (type)
                {
                case TokenType.CharacterName:
                case TokenType.DialogueLine:
                case TokenType.Present:
                case TokenType.Present_ResetAlignment:
                case TokenType.RubyBase:
                case TokenType.RubyTextStart:
                case TokenType.RubyTextEnd:
                case TokenType.WTFToken:
                case TokenType.WTFToken2:
                case TokenType.SetAlignment_Center:
                    Tokens.Add(new Token(type));
                    break;

                case TokenType.SetFontSize:
                case TokenType.SetTopMargin:
                case TokenType.SetLeftMargin:
                case TokenType.WTFShort:
                    Tokens.Add(new ShortToken(type, reader.ReadInt16()));
                    break;

                case TokenType.SetColor:
                case TokenType.EvaluateExpression:
                    Tokens.Add(new ExpressionToken(type, reader));
                    break;

                case TokenType.Terminator:
                    return;

                case TokenType.LineBreak:
                    goto CREATE_TEXT;

                default:
                    if ((type & TokenType.TextMask) == 0)
                    {
                        throw new Exception("Unexpected token");
                    }
CREATE_TEXT:
                    reader.BaseStream.Position--;
                    Tokens.Add(new TextToken(reader));
                    break;
                }
            }
        }
Example #2
0
        public static bool ApplyPatch(IList <object> data, SCXReader reader, SCXWriter writer, StringBuilder logger = null)
        {
            long pos = reader.BaseStream.Position;

            reader.BaseStream.Position = 0;
            reader.BaseStream.CopyTo(writer.BaseStream);
            reader.BaseStream.Position = pos;

            int i      = 0;
            var offset = new List <uint?>();

            foreach (IList <object> transform in data)
            {
                SCXString str = reader.ReadString(i++);
                while (str.IsEmpty)
                {
                    offset.Add(null);
                    logger?.AppendLine(i + ":").AppendLine(str.ToString()).AppendLine("------(Skipped)");
                    str = reader.ReadString(i++);
                }
                if (transform == null)
                {
                    offset.Add(null);
                    logger?.AppendLine(i + ":").AppendLine(str.ToString()).AppendLine("------(Null Transform)");
                    continue;
                }
                if (logger != null)
                {
                    logger.AppendLine(i + ":");
                    foreach (var t in transform)
                    {
                        logger.Append('"').Append(t.ToString()).Append("\" ");
                    }
                    logger.AppendLine().AppendLine(str.ToString());
                }
                int j = 0;
                foreach (var t in str.Tokens)
                {
                    if (t is TextToken txt)
                    {
                        if (transform.Count == j)
                        {
                            logger?.AppendLine("---------- Conflict: Transform < Data ----------");
                            return(false);
                        }
                        txt.Value = (string)transform[j++];
                    }
                }
                if (transform.Count != j)
                {
                    logger?.AppendLine("---------- Conflict: Transform > Data ----------");
                    return(false);
                }
                offset.Add((uint)writer.BaseStream.Position);
                str.Encode(writer);
                logger?.AppendLine("------");
            }
            writer.BaseStream.Position = reader.StringTable;
            foreach (var o in offset)
            {
                if (o == null)
                {
                    writer.BaseStream.Seek(4, System.IO.SeekOrigin.Current);
                }
                else
                {
                    writer.Write(o.Value);
                }
            }
            return(true);
        }