예제 #1
0
        public int Write(char[] chars, ref int offset)
        {
            StringBuilder sb = new StringBuilder(MaxTagLength);

            sb.Append('{');
            if (EnumCache <FFXIIITextTagCode> .IsDefined(Code))
            {
                sb.Append(Code);
            }
            else
            {
                sb.Append("Var").AppendFormat(((byte)Code).ToString("X2"));
            }
            if (Param != null)
            {
                sb.Append(' ');
                sb.Append(Param);
            }
            sb.Append('}');

            if (sb.Length > MaxTagLength)
            {
                throw Exceptions.CreateException(Lang.Error.Text.TooLongTagNameFormat, sb.ToString());
            }

            for (int i = 0; i < sb.Length; i++)
            {
                chars[offset++] = sb[i];
            }

            return(sb.Length);
        }
예제 #2
0
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder(MaxTagLength);

            sb.Append('{');
            if (EnumCache <FFXIIITextTagCode> .IsDefined(Code))
            {
                sb.Append(Code);
            }
            else
            {
                sb.Append("Var").AppendFormat(((byte)Code).ToString("X2"));
            }

            if (Param != null)
            {
                sb.Append(' ');
                sb.Append(Param);
            }
            sb.Append('}');
            return(sb.ToString());
        }
예제 #3
0
        public static FFXIIITextTag TryRead(char[] chars, ref int offset, ref int left)
        {
            int oldOffset = offset;
            int oldleft   = left;

            string tag, par;

            if (chars[offset++] != '{' || !TryGetTag(chars, ref offset, ref left, out tag, out par))
            {
                offset = oldOffset;
                left   = oldleft;
                return(null);
            }

            FFXIIITextTagCode?code = EnumCache <FFXIIITextTagCode> .TryParse(tag);

            if (code == null)
            {
                byte varCode, numArg;
                if (tag.Length == 5 &&
                    byte.TryParse(tag.Substring(3, 2), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out varCode) &&
                    byte.TryParse(par, NumberStyles.Integer, CultureInfo.InvariantCulture, out numArg))
                {
                    return(new FFXIIITextTag((FFXIIITextTagCode)varCode, (FFXIIITextTagParam)numArg));
                }
            }

            if (code == null)
            {
                offset = oldOffset;
                left   = oldleft;
                return(null);
            }

            switch (code.Value)
            {
            case FFXIIITextTagCode.End:
            case FFXIIITextTagCode.Escape:
            case FFXIIITextTagCode.Italic:
            case FFXIIITextTagCode.Many:
            case FFXIIITextTagCode.Article:
            case FFXIIITextTagCode.ArticleMany:
                return(new FFXIIITextTag(code.Value));

            case FFXIIITextTagCode.VarF4:
            case FFXIIITextTagCode.VarF6:
            case FFXIIITextTagCode.VarF7:
            {
                byte numArg;
                if (byte.TryParse(par, NumberStyles.Integer, CultureInfo.InvariantCulture, out numArg))
                {
                    return(new FFXIIITextTag(code.Value, (FFXIIITextTagParam)numArg));
                }
                break;
            }

            case FFXIIITextTagCode.Icon:
            {
                byte numArg;
                FFXIIITextTagIcon?arg = EnumCache <FFXIIITextTagIcon> .TryParse(par);

                if (arg == null && byte.TryParse(par, NumberStyles.Integer, CultureInfo.InvariantCulture, out numArg))
                {
                    arg = (FFXIIITextTagIcon)numArg;
                }
                if (arg != null)
                {
                    return(new FFXIIITextTag(code.Value, arg.Value));
                }
                break;
            }

            case FFXIIITextTagCode.Text:
            {
                byte numArg;
                FFXIIITextTagText?arg = EnumCache <FFXIIITextTagText> .TryParse(par);

                if (arg == null && byte.TryParse(par, NumberStyles.Integer, CultureInfo.InvariantCulture, out numArg))
                {
                    arg = (FFXIIITextTagText)numArg;
                }
                if (arg != null)
                {
                    return(new FFXIIITextTag(code.Value, arg.Value));
                }
                break;
            }

            case FFXIIITextTagCode.Key:
            {
                byte             numArg;
                FFXIIITextTagKey?arg = EnumCache <FFXIIITextTagKey> .TryParse(par);

                if (arg == null && byte.TryParse(par, NumberStyles.Integer, CultureInfo.InvariantCulture, out numArg))
                {
                    arg = (FFXIIITextTagKey)numArg;
                }
                if (arg != null)
                {
                    return(new FFXIIITextTag(code.Value, arg.Value));
                }
                break;
            }

            case FFXIIITextTagCode.Color:
            {
                byte numArg;
                FFXIIITextTagColor?arg = EnumCache <FFXIIITextTagColor> .TryParse(par);

                if (arg == null && byte.TryParse(par, NumberStyles.Integer, CultureInfo.InvariantCulture, out numArg))
                {
                    arg = (FFXIIITextTagColor)numArg;
                }
                if (arg != null)
                {
                    return(new FFXIIITextTag(code.Value, arg.Value));
                }
                break;
            }
            }

            offset = oldOffset;
            left   = oldleft;
            return(null);
        }