示例#1
0
        public static ScriptTable Read(Script script, ScorpioReader reader, string tableName, bool hasSign)
        {
            ScriptTable table     = script.CreateTable();
            ScriptArray layout    = (ScriptArray)script.GetValue(tableName);
            bool        isInvalid = true;
            int         sign      = hasSign ? reader.ReadInt32() : 0;

            for (int i = 0; i < layout.Count(); ++i)
            {
                ScriptObject config = layout.GetValue(i);
                if (!hasSign || ScorpioUtil.HasSign(sign, ScorpioUtil.ToInt32(config.GetValue(Index).ObjectValue)))
                {
                    string  name    = (string)config.GetValue(Name).ObjectValue;
                    string  type    = (string)config.GetValue(Type).ObjectValue;
                    bool    array   = (bool)config.GetValue(Array).ObjectValue;
                    Invalid invalid = new Invalid();
                    if (array)
                    {
                        int         count = reader.ReadInt32();
                        ScriptArray value = script.CreateArray();
                        for (int j = 0; j < count; ++j)
                        {
                            value.Add(ReadObject(script, reader, type, hasSign, invalid));
                        }
                        table.SetValue(name, value);
                        if (count > 0)
                        {
                            isInvalid = false;
                        }
                    }
                    else
                    {
                        table.SetValue(name, ReadObject(script, reader, type, hasSign, invalid));
                        if (!invalid.value)
                        {
                            isInvalid = false;
                        }
                    }
                }
            }
            table.SetValue("IsInvalid", script.CreateBool(isInvalid));
            return(table);
        }
示例#2
0
        /// <summary>
        /// 读取一个网络协议或者一行table数据
        /// </summary>
        /// <param name="script">脚本引擎对象</param>
        /// <param name="reader">读取类</param>
        /// <param name="tableManager">tableManager类</param>
        /// <param name="fileName">table用文件名字</param>
        /// <param name="layoutTableName">结构名字</param>
        /// <param name="message">是否是网络协议</param>
        private static ScriptTable Read(Script script, ScorpioReader reader, ScriptTable tableManager, string fileName, string layoutTableName, bool message)
        {
            ScriptTable table     = script.CreateTable();
            ScriptArray layout    = (ScriptArray)script.GetValue(layoutTableName);
            int         sign      = message ? reader.ReadInt32() : 0;
            bool        isInvalid = true;
            string      id        = null;

            for (int i = 0; i < layout.Count(); ++i)
            {
                ScriptObject config = layout.GetValue(i);
                if (message && !ScorpioUtil.HasSign(sign, ScorpioUtil.ToInt32(config.GetValue(Index).ObjectValue)))
                {
                    continue;
                }
                string  name    = config.GetValue(Name).ToString();         //字段名字
                string  type    = config.GetValue(Type).ToString();         //字段类型
                bool    array   = config.GetValue(Array).LogicOperation();  //是否是数组
                Invalid invalid = new Invalid();                            //本行是否是无效行
                if (array)
                {
                    int         count = reader.ReadInt32();     //读取元素个数
                    ScriptArray value = script.CreateArray();
                    for (int j = 0; j < count; ++j)
                    {
                        value.Add(ReadObject(script, reader, tableManager, fileName, type, message, invalid));
                    }
                    table.SetValue(name, value);
                    if (count > 0)
                    {
                        isInvalid = false;
                    }
                }
                else
                {
                    if (message)
                    {
                        table.SetValue(name, ReadObject(script, reader, tableManager, fileName, type, message, invalid));
                    }
                    else
                    {
                        ScriptTable attribute = config.GetValue(Attribute) as ScriptTable;
                        if (attribute.Count() == 0)
                        {
                            var obj = ReadObject(script, reader, tableManager, fileName, type, message, invalid);
                            table.SetValue(name, obj);
                            if (!invalid.value)
                            {
                                isInvalid = false;
                            }
                            if (string.IsNullOrEmpty(id))
                            {
                                id = ScorpioUtil.ToInt32(obj.ObjectValue).ToString();
                            }
                        }
                        else
                        {
                            ReadObject(script, reader, tableManager, fileName, type, message, invalid);     //先读取一个值  如果是多国语言 生成数据的时候会写入一个空字符串
                            table.SetValue(name, script.CreateObject(tableManager.GetValue("getValue").call(attribute, fileName, name, id)));
                        }
                    }
                }
            }
            if (!message)
            {
                table.SetValue("IsInvalid", script.CreateBool(isInvalid));
            }
            return(table);
        }