using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CommonLang.Property;
using CommonAI.Zone.Instance;
using CommonAI.Zone.Attributes;
using CommonAI.Zone.EventTrigger;

namespace CommonAI.Zone.ZoneEditor.EventTrigger
{
    public static class GameFields
    {
        private static Type[] s32_types = new Type[] { typeof(int), typeof(sbyte), typeof(short), typeof(byte), typeof(ushort), typeof(uint), };
        private static Type[] f32_types = new Type[] { typeof(float), typeof(double), };

        private static FieldManager s_Manager;
        public static FieldManager Manager { get { return s_Manager; } }
        internal static void InitFiledManager()
        {
            if (s_Manager == null)
            {
                s_Manager = new FieldManager();

                AddObjectType(typeof(Config));
                AddObjectType(typeof(InstanceUnit));
                AddObjectType(typeof(UnitInfo));
                AddObjectType(typeof(InstanceItem));
                AddObjectType(typeof(ItemTemplate));
                AddObjectType(typeof(SkillTemplate));
                AddObjectType(typeof(SpellTemplate));
                AddObjectType(typeof(BuffTemplate));
                AddObjectType(typeof(EditorScene));
                
                AddObjectType(TemplateManager.Factory.ExtConfigType);
                AddObjectType(TemplateManager.Factory.UnitPropertiesType);
                AddObjectType(TemplateManager.Factory.SkillPropertiesType);
                AddObjectType(TemplateManager.Factory.SpellPropertiesType);
                AddObjectType(TemplateManager.Factory.ItemPropertiesType);
                AddObjectType(TemplateManager.Factory.BuffPropertiesType);
                AddObjectType(TemplateManager.Factory.ScenePropertiesType);
            }
        }
        public static void AddObjectType(Type objType)
        {
            s_Manager.AddFieldsMap(new FieldsMap(objType, typeof(int), s32_types));
            s_Manager.AddFieldsMap(new FieldsMap(objType, typeof(float), f32_types));
            s_Manager.AddFieldsMap(new FieldsMap(objType, typeof(string)));
            s_Manager.AddFieldsMap(new FieldsMap(objType, typeof(bool)));
        }

        public static T GetValue<T>(object owner, Type baseType, string fieldname)
        {
            FieldsMap fm = s_Manager.GetFields(baseType, typeof(T));
            if (fm != null)
            {
                return fm.GetValue<T>(owner, fieldname);
            }
            return default(T);
        }

    }

    public interface IFieldMemberValue
    {
        Type OwnerType { get; }
    }

    //-----------------------------------------------------------------------------------------

    #region __Config__

    [DescAttribute("配置字段(string)", "字段 - 配置")]
    public class ConfigFieldStringValue : StringValue
    {
        [ObjectMemberNameAttribute(typeof(Config), typeof(string))]
        [DescAttribute("字段名")]
        public string FieldName = "";

        public override string ToString()
        {
            return string.Format("({0}).{1}", "配置", FieldName);
        }
        public override string GetValue(IEditorValueAdapter api, EventArguments args)
        {
            return GameFields.GetValue<string>(api.ZoneAPI.Templates.CFG, typeof(Config), FieldName);
        }
    }

    [DescAttribute("配置字段(int)", "字段 - 配置")]
    public class ConfigFieldIntegerValue : IntegerValue
    {
        [ObjectMemberNameAttribute(typeof(Config), typeof(int))]
        [DescAttribute("字段名")]
        public string FieldName = "";

        public override string ToString()
        {
            return string.Format("({0}).{1}", "配置", FieldName);
        }
        public override int GetValue(IEditorValueAdapter api, EventArguments args)
        {
            return GameFields.GetValue<int>(api.ZoneAPI.Templates.CFG, typeof(Config), FieldName);
        }
    }

    [DescAttribute("配置字段(float)", "字段 - 配置")]
    public class ConfigFieldRealValue : RealValue
    {
        [ObjectMemberNameAttribute(typeof(Config), typeof(float))]
        [DescAttribute("字段名")]
        public string FieldName = "";

        public override string ToString()
        {
            return string.Format("({0}).{1}", "配置", FieldName);
        }
        public override float GetValue(IEditorValueAdapter api, EventArguments args)
        {
            return GameFields.GetValue<float>(api.ZoneAPI.Templates.CFG, typeof(Config), FieldName);
        }
    }

    [DescAttribute("配置字段(bool)", "字段 - 配置")]
    public class ConfigFieldBoolValue : BooleanValue
    {
        [ObjectMemberNameAttribute(typeof(Config), typeof(bool))]
        [DescAttribute("字段名")]
        public string FieldName = "";

        public override string ToString()
        {
            return string.Format("({0}).{1}", "配置", FieldName);
        }
        public override bool GetValue(IEditorValueAdapter api, EventArguments args)
        {
            return GameFields.GetValue<bool>(api.ZoneAPI.Templates.CFG, typeof(Config), FieldName);
        }
    }

    #endregion

    //-----------------------------------------------------------------------------------------

    #region __场景实体__

    [DescAttribute("场景字段(string)", "字段 - 场景")]
    public class ZoneFieldStringValue : StringValue
    {
        [ObjectMemberNameAttribute(typeof(EditorScene), typeof(string))]
        [DescAttribute("字段名")]
        public string FieldName = "";

        public override string ToString()
        {
            return string.Format("({0}).{1}", "场景", FieldName);
        }
        public override string GetValue(IEditorValueAdapter api, EventArguments args)
        {
            return GameFields.GetValue<string>(api.ZoneAPI, typeof(EditorScene), FieldName);
        }
    }

    [DescAttribute("场景字段(int)", "字段 - 场景")]
    public class ZoneFieldIntegerValue : IntegerValue
    {
        [ObjectMemberNameAttribute(typeof(EditorScene), typeof(int))]
        [DescAttribute("字段名")]
        public string FieldName = "";

        public override string ToString()
        {
            return string.Format("({0}).{1}", "场景", FieldName);
        }
        public override int GetValue(IEditorValueAdapter api, EventArguments args)
        {
            return GameFields.GetValue<int>(api.ZoneAPI, typeof(EditorScene), FieldName);
        }
    }

    [DescAttribute("场景字段(float)", "字段 - 场景")]
    public class ZoneFieldRealValue : RealValue
    {
        [ObjectMemberNameAttribute(typeof(EditorScene), typeof(float))]
        [DescAttribute("字段名")]
        public string FieldName = "";

        public override string ToString()
        {
            return string.Format("({0}).{1}", "场景", FieldName);
        }
        public override float GetValue(IEditorValueAdapter api, EventArguments args)
        {
            return GameFields.GetValue<float>(api.ZoneAPI, typeof(EditorScene), FieldName);
        }
    }

    [DescAttribute("场景字段(bool)", "字段 - 场景")]
    public class ZoneFieldBoolValue : BooleanValue
    {
        [ObjectMemberNameAttribute(typeof(EditorScene), typeof(bool))]
        [DescAttribute("字段名")]
        public string FieldName = "";

        public override string ToString()
        {
            return string.Format("({0}).{1}", "场景", FieldName);
        }
        public override bool GetValue(IEditorValueAdapter api, EventArguments args)
        {
            return GameFields.GetValue<bool>(api.ZoneAPI, typeof(EditorScene), FieldName);
        }
    }

    #endregion

    //-----------------------------------------------------------------------------------------

    #region __单位实体__

    [DescAttribute("单位字段(string)", "字段 - 单位")]
    public class UnitFieldStringValue : StringValue
    {
        [ObjectMemberNameAttribute(typeof(InstanceUnit), typeof(string))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Unit, FieldName);
        }
        public override string GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceUnit o = Unit.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<string>(o, typeof(InstanceUnit), FieldName);
            }
            return null;
        }
    }

    [DescAttribute("单位字段(int)", "字段 - 单位")]
    public class UnitFieldIntegerValue : IntegerValue
    {
        [ObjectMemberNameAttribute(typeof(InstanceUnit), typeof(int))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Unit, FieldName);
        }
        public override int GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceUnit o = Unit.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<int>(o, typeof(InstanceUnit), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("单位字段(float)", "字段 - 单位")]
    public class UnitFieldRealValue : RealValue
    {
        [ObjectMemberNameAttribute(typeof(InstanceUnit), typeof(float))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Unit, FieldName);
        }
        public override float GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceUnit o = Unit.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<float>(o, typeof(InstanceUnit), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("单位字段(bool)", "字段 - 单位")]
    public class UnitFieldBoolValue : BooleanValue
    {
        [ObjectMemberNameAttribute(typeof(InstanceUnit), typeof(bool))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Unit, FieldName);
        }
        public override bool GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceUnit o = Unit.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<bool>(o, typeof(InstanceUnit), FieldName);
            }
            return false;
        }
    }

    #endregion

    //-----------------------------------------------------------------------------------------

    #region __单位模板__

    [DescAttribute("单位模板字段(string)", "字段 - 单位模板")]
    public class UnitTemplateFieldStringValue : StringValue
    {
        [ObjectMemberNameAttribute(typeof(UnitInfo), typeof(string))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        public override string ToString()
        {
            return string.Format("({0}).模板.{1}", Unit, FieldName);
        }
        public override string GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceUnit o = Unit.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<string>(o.Info, typeof(UnitInfo), FieldName);
            }
            return null;
        }
    }

    [DescAttribute("单位模板字段(int)", "字段 - 单位模板")]
    public class UnitTemplateFieldIntegerValue : IntegerValue
    {
        [ObjectMemberNameAttribute(typeof(UnitInfo), typeof(int))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        public override string ToString()
        {
            return string.Format("({0}).模板.{1}", Unit, FieldName);
        }
        public override int GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceUnit o = Unit.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<int>(o.Info, typeof(UnitInfo), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("单位模板字段(float)", "字段 - 单位模板")]
    public class UnitTemplateFieldRealValue : RealValue
    {
        [ObjectMemberNameAttribute(typeof(UnitInfo), typeof(float))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        public override string ToString()
        {
            return string.Format("({0}).模板.{1}", Unit, FieldName);
        }
        public override float GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceUnit o = Unit.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<float>(o.Info, typeof(UnitInfo), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("单位模板字段(bool)", "字段 - 单位模板")]
    public class UnitTemplateFieldBoolValue : BooleanValue
    {
        [ObjectMemberNameAttribute(typeof(UnitInfo), typeof(bool))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        public override string ToString()
        {
            return string.Format("({0}).模板.{1}", Unit, FieldName);
        }
        public override bool GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceUnit o = Unit.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<bool>(o.Info, typeof(UnitInfo), FieldName);
            }
            return false;
        }
    }

    #endregion

    //-----------------------------------------------------------------------------------------

    #region __物品实体__

    [DescAttribute("物品字段(string)", "字段 - 物品")]
    public class ItemFieldStringValue : StringValue
    {
        [ObjectMemberNameAttribute(typeof(InstanceItem), typeof(string))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("物品")]
        public ItemValue Item = new ItemValue.NA();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Item, FieldName);
        }
        public override string GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceItem o = Item.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<string>(o, typeof(InstanceItem), FieldName);
            }
            return null;
        }
    }

    [DescAttribute("物品字段(int)", "字段 - 物品")]
    public class ItemFieldIntegerValue : IntegerValue
    {
        [ObjectMemberNameAttribute(typeof(InstanceItem), typeof(int))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("物品")]
        public ItemValue Item = new ItemValue.NA();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Item, FieldName);
        }
        public override int GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceItem o = Item.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<int>(o, typeof(InstanceItem), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("物品字段(float)", "字段 - 物品")]
    public class ItemFieldRealValue : RealValue
    {
        [ObjectMemberNameAttribute(typeof(InstanceItem), typeof(float))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("物品")]
        public ItemValue Item = new ItemValue.NA();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Item, FieldName);
        }
        public override float GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceItem o = Item.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<float>(o, typeof(InstanceItem), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("物品字段(bool)", "字段 - 物品")]
    public class ItemFieldBoolValue : BooleanValue
    {
        [ObjectMemberNameAttribute(typeof(InstanceItem), typeof(bool))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("物品")]
        public ItemValue Item = new ItemValue.NA();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Item, FieldName);
        }
        public override bool GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstanceItem o = Item.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<bool>(o, typeof(InstanceItem), FieldName);
            }
            return false;
        }
    }

    #endregion

    //-----------------------------------------------------------------------------------------

    #region __物品模板__

    [DescAttribute("物品模板字段(string)", "字段 - 物品模板")]
    public class ItemTemplateFieldStringValue : StringValue
    {
        [ObjectMemberNameAttribute(typeof(ItemTemplate), typeof(string))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("物品")]
        public ItemTemplateValue Item = new ItemTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Item, FieldName);
        }
        public override string GetValue(IEditorValueAdapter api, EventArguments args)
        {
            ItemTemplate o = Item.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<string>(o, typeof(ItemTemplate), FieldName);
            }
            return null;
        }
    }

    [DescAttribute("物品模板字段(int)", "字段 - 物品模板")]
    public class ItemTemplateFieldIntegerValue : IntegerValue
    {
        [ObjectMemberNameAttribute(typeof(ItemTemplate), typeof(int))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("物品")]
        public ItemTemplateValue Item = new ItemTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Item, FieldName);
        }
        public override int GetValue(IEditorValueAdapter api, EventArguments args)
        {
            ItemTemplate o = Item.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<int>(o, typeof(ItemTemplate), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("物品模板字段(float)", "字段 - 物品模板")]
    public class ItemTemplateFieldRealValue : RealValue
    {
        [ObjectMemberNameAttribute(typeof(ItemTemplate), typeof(float))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("物品")]
        public ItemTemplateValue Item = new ItemTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Item, FieldName);
        }
        public override float GetValue(IEditorValueAdapter api, EventArguments args)
        {
            ItemTemplate o = Item.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<float>(o, typeof(ItemTemplate), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("物品模板字段(bool)", "字段 - 物品模板")]
    public class ItemTemplateFieldBoolValue : BooleanValue
    {
        [ObjectMemberNameAttribute(typeof(ItemTemplate), typeof(bool))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("物品")]
        public ItemTemplateValue Item = new ItemTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Item, FieldName);
        }
        public override bool GetValue(IEditorValueAdapter api, EventArguments args)
        {
            ItemTemplate o = Item.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<bool>(o, typeof(ItemTemplate), FieldName);
            }
            return false;
        }
    }

    #endregion
    
    //-----------------------------------------------------------------------------------------

    #region __技能模板__

    [DescAttribute("技能模板字段(string)", "字段 - 技能模板")]
    public class SkillTemplateFieldStringValue : StringValue
    {
        [ObjectMemberNameAttribute(typeof(SkillTemplate), typeof(string))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("技能")]
        public SkillTemplateValue Skill = new SkillTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Skill, FieldName);
        }
        public override string GetValue(IEditorValueAdapter api, EventArguments args)
        {
            SkillTemplate o = Skill.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<string>(o, typeof(SkillTemplate), FieldName);
            }
            return null;
        }
    }

    [DescAttribute("技能模板字段(int)", "字段 - 技能模板")]
    public class SkillTemplateFieldIntegerValue : IntegerValue
    {
        [ObjectMemberNameAttribute(typeof(SkillTemplate), typeof(int))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("技能")]
        public SkillTemplateValue Skill = new SkillTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Skill, FieldName);
        }
        public override int GetValue(IEditorValueAdapter api, EventArguments args)
        {
            SkillTemplate o = Skill.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<int>(o, typeof(SkillTemplate), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("技能模板字段(float)", "字段 - 技能模板")]
    public class SkillTemplateFieldRealValue : RealValue
    {
        [ObjectMemberNameAttribute(typeof(SkillTemplate), typeof(float))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("技能")]
        public SkillTemplateValue Skill = new SkillTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Skill, FieldName);
        }
        public override float GetValue(IEditorValueAdapter api, EventArguments args)
        {
            SkillTemplate o = Skill.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<float>(o, typeof(SkillTemplate), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("技能模板字段(bool)", "字段 - 技能模板")]
    public class SkillTemplateFieldBoolValue : BooleanValue
    {
        [ObjectMemberNameAttribute(typeof(SkillTemplate), typeof(bool))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("技能")]
        public SkillTemplateValue Skill = new SkillTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Skill, FieldName);
        }
        public override bool GetValue(IEditorValueAdapter api, EventArguments args)
        {
            SkillTemplate o = Skill.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<bool>(o, typeof(SkillTemplate), FieldName);
            }
            return false;
        }
    }

    #endregion

    //-----------------------------------------------------------------------------------------

    #region __法术模板__

    [DescAttribute("法术模板字段(string)", "字段 - 法术模板")]
    public class SpellTemplateFieldStringValue : StringValue
    {
        [ObjectMemberNameAttribute(typeof(SpellTemplate), typeof(string))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("法术")]
        public SpellTemplateValue Spell = new SpellTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Spell, FieldName);
        }
        public override string GetValue(IEditorValueAdapter api, EventArguments args)
        {
            SpellTemplate o = Spell.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<string>(o, typeof(SpellTemplate), FieldName);
            }
            return null;
        }
    }

    [DescAttribute("法术模板字段(int)", "字段 - 法术模板")]
    public class SpellTemplateFieldIntegerValue : IntegerValue
    {
        [ObjectMemberNameAttribute(typeof(SpellTemplate), typeof(int))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("法术")]
        public SpellTemplateValue Spell = new SpellTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Spell, FieldName);
        }
        public override int GetValue(IEditorValueAdapter api, EventArguments args)
        {
            SpellTemplate o = Spell.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<int>(o, typeof(SpellTemplate), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("法术模板字段(float)", "字段 - 法术模板")]
    public class SpellTemplateFieldRealValue : RealValue
    {
        [ObjectMemberNameAttribute(typeof(SpellTemplate), typeof(float))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("法术")]
        public SpellTemplateValue Spell = new SpellTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Spell, FieldName);
        }
        public override float GetValue(IEditorValueAdapter api, EventArguments args)
        {
            SpellTemplate o = Spell.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<float>(o, typeof(SpellTemplate), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("法术模板字段(bool)", "字段 - 法术模板")]
    public class SpellTemplateFieldBoolValue : BooleanValue
    {
        [ObjectMemberNameAttribute(typeof(SpellTemplate), typeof(bool))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("法术")]
        public SpellTemplateValue Spell = new SpellTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Spell, FieldName);
        }
        public override bool GetValue(IEditorValueAdapter api, EventArguments args)
        {
            SpellTemplate o = Spell.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<bool>(o, typeof(SpellTemplate), FieldName);
            }
            return false;
        }
    }


    #endregion

    //-----------------------------------------------------------------------------------------

    #region __BUFF模板__

    [DescAttribute("BUFF模板字段(string)", "字段 - BUFF模板")]
    public class BuffTemplateFieldStringValue : StringValue
    {
        [ObjectMemberNameAttribute(typeof(BuffTemplate), typeof(string))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("BUFF")]
        public BuffTemplateValue Buff = new BuffTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Buff, FieldName);
        }
        public override string GetValue(IEditorValueAdapter api, EventArguments args)
        {
            BuffTemplate o = Buff.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<string>(o, typeof(BuffTemplate), FieldName);
            }
            return null;
        }
    }

    [DescAttribute("BUFF模板字段(int)", "字段 - BUFF模板")]
    public class BuffTemplateFieldIntegerValue : IntegerValue
    {
        [ObjectMemberNameAttribute(typeof(BuffTemplate), typeof(int))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("BUFF")]
        public BuffTemplateValue Buff = new BuffTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Buff, FieldName);
        }
        public override int GetValue(IEditorValueAdapter api, EventArguments args)
        {
            BuffTemplate o = Buff.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<int>(o, typeof(BuffTemplate), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("BUFF模板字段(float)", "字段 - BUFF模板")]
    public class BuffTemplateFieldRealValue : RealValue
    {
        [ObjectMemberNameAttribute(typeof(BuffTemplate), typeof(float))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("BUFF")]
        public BuffTemplateValue Buff = new BuffTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Buff, FieldName);
        }
        public override float GetValue(IEditorValueAdapter api, EventArguments args)
        {
            BuffTemplate o = Buff.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<float>(o, typeof(BuffTemplate), FieldName);
            }
            return 0;
        }
    }

    [DescAttribute("BUFF模板字段(bool)", "字段 - BUFF模板")]
    public class BuffTemplateFieldBoolValue : BooleanValue
    {
        [ObjectMemberNameAttribute(typeof(BuffTemplate), typeof(bool))]
        [DescAttribute("字段名")]
        public string FieldName = "";
        [DescAttribute("BUFF")]
        public BuffTemplateValue Buff = new BuffTemplateValue.Template();
        public override string ToString()
        {
            return string.Format("({0}).{1}", Buff, FieldName);
        }
        public override bool GetValue(IEditorValueAdapter api, EventArguments args)
        {
            BuffTemplate o = Buff.GetValue(api, args);
            if (o != null)
            {
                return GameFields.GetValue<bool>(o, typeof(BuffTemplate), FieldName);
            }
            return false;
        }
    }


    #endregion

    //-----------------------------------------------------------------------------------------

}