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

namespace CommonAI.Zone.ZoneEditor.EventTrigger
{


    [DescAttribute("", "设置 - 临时变量")]
    public abstract class SetLocalVar<T> : AbstractAction
    {
        abstract public AbstractValue<T> TValue { get; }
        abstract public string TKey { get; }
        public override string ToString()
        {
            return string.Format("设置临时变量\"{0}\"={1}", TKey, TValue);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            T value = TValue.GetValue(api, args);
            api.SetLocalVar(TKey, value);
        }
    }
    [DescAttribute("设置字符串型", "设置 - 临时变量")]
    public class SetLocalString : SetLocalVar<string>
    {
        [LocalVarIDAttribute(typeof(StringValue))]
        [DescAttribute("变量名")]
        public string Key = "VarName";
        [DescAttribute("变量值")]
        public StringValue Value = new StringValue.VALUE("text");
        override public AbstractValue<string> TValue { get { return Value; } }
        override public string TKey { get { return Key; } }
    }
    [DescAttribute("设置整数型", "设置 - 临时变量")]
    public class SetLocalInteger : SetLocalVar<Int32>
    {
        [LocalVarIDAttribute(typeof(IntegerValue))]
        [DescAttribute("变量名")]
        public string Key = "VarName";
        [DescAttribute("变量值")]
        public IntegerValue Value = new IntegerValue.VALUE();
        override public AbstractValue<Int32> TValue { get { return Value; } }
        override public string TKey { get { return Key; } }
    }
    [DescAttribute("设置小数型", "设置 - 临时变量")]
    public class SetLocalReal : SetLocalVar<Single>
    {
        [LocalVarIDAttribute(typeof(RealValue))]
        [DescAttribute("变量名")]
        public string Key = "VarName";
        [DescAttribute("变量值")]
        public RealValue Value = new RealValue.VALUE();
        override public AbstractValue<Single> TValue { get { return Value; } }
        override public string TKey { get { return Key; } }
    }
    [DescAttribute("设置布尔型", "设置 - 临时变量")]
    public class SetLocalBool : SetLocalVar<Boolean>
    {
        [LocalVarIDAttribute(typeof(BooleanValue))]
        [DescAttribute("变量名")]
        public string Key = "VarName";
        [DescAttribute("变量值")]
        public BooleanValue Value = new BooleanValue.VALUE();
        override public AbstractValue<Boolean> TValue { get { return Value; } }
        override public string TKey { get { return Key; } }
    }
    [DescAttribute("设置单位", "设置 - 临时变量")]
    public class SetLocalUnit : SetLocalVar<InstanceUnit>
    {
        [LocalVarIDAttribute(typeof(UnitValue))]
        [DescAttribute("变量名")]
        public string Key = "VarName";
        [DescAttribute("变量值")]
        public UnitValue Value = new UnitValue.NA();
        override public AbstractValue<InstanceUnit> TValue { get { return Value; } }
        override public string TKey { get { return Key; } }
    }
    [DescAttribute("设置Flag", "设置 - 临时变量")]
    public class SetLocalFlag : SetLocalVar<InstanceFlag>
    {
        [LocalVarIDAttribute(typeof(FlagValue))]
        [DescAttribute("变量名")]
        public string Key = "VarName";
        [DescAttribute("变量值")]
        public FlagValue Value = new FlagValue.NA();
        override public AbstractValue<InstanceFlag> TValue { get { return Value; } }
        override public string TKey { get { return Key; } }
    }
    [DescAttribute("设置物品", "设置 - 临时变量")]
    public class SetLocalItem : SetLocalVar<InstanceItem>
    {
        [LocalVarIDAttribute(typeof(ItemValue))]
        [DescAttribute("变量名")]
        public string Key = "VarName";
        [DescAttribute("变量值")]
        public ItemValue Value = new ItemValue.NA();
        override public AbstractValue<InstanceItem> TValue { get { return Value; } }
        override public string TKey { get { return Key; } }
    }
    [DescAttribute("设置位置坐标", "设置 - 临时变量")]
    public class SetLocalPosition : SetLocalVar<Vector2>
    {
        [LocalVarIDAttribute(typeof(PositionValue))]
        [DescAttribute("变量名")]
        public string Key = "VarName";
        [DescAttribute("变量值")]
        public PositionValue Value = new PositionValue.VALUE();
        override public AbstractValue<Vector2> TValue { get { return Value; } }
        override public string TKey { get { return Key; } }
    }

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


    [DescAttribute("", "设置 - 临时变量(变量)")]
    public abstract class SetLocalVarSV<T> : AbstractAction
    {
        abstract public AbstractValue<T> TValue { get; }
        abstract public StringValue TKey { get; }
        public override string ToString()
        {
            return string.Format("设置临时变量\"{0}\"={1}", TKey, TValue);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            T value = TValue.GetValue(api, args);
            string key = TKey.GetValue(api, args);
            api.SetLocalVar(key, value);
        }
    }
    [DescAttribute("设置字符串型(变量)", "设置 - 临时变量")]
    public class SetLocalStringSV : SetLocalVarSV<string>
    {
        [DescAttribute("变量名")]
        public StringValue Key = new StringValue.VALUE("VarName");
        [DescAttribute("变量值")]
        public StringValue Value = new StringValue.VALUE("text");
        override public AbstractValue<string> TValue { get { return Value; } }
        override public StringValue TKey { get { return Key; } }
    }
    [DescAttribute("设置整数型(变量)", "设置 - 临时变量")]
    public class SetLocalIntegerSV : SetLocalVarSV<Int32>
    {
        [DescAttribute("变量名")]
        public StringValue Key = new StringValue.VALUE("VarName");
        [DescAttribute("变量值")]
        public IntegerValue Value = new IntegerValue.VALUE();
        override public AbstractValue<Int32> TValue { get { return Value; } }
        override public StringValue TKey { get { return Key; } }
    }
    [DescAttribute("设置小数型(变量)", "设置 - 临时变量")]
    public class SetLocalRealSV : SetLocalVarSV<Single>
    {
        [DescAttribute("变量名")]
        public StringValue Key = new StringValue.VALUE("VarName");
        [DescAttribute("变量值")]
        public RealValue Value = new RealValue.VALUE();
        override public AbstractValue<Single> TValue { get { return Value; } }
        override public StringValue TKey { get { return Key; } }
    }
    [DescAttribute("设置布尔型(变量)", "设置 - 临时变量")]
    public class SetLocalBoolSV : SetLocalVarSV<Boolean>
    {
        [DescAttribute("变量名")]
        public StringValue Key = new StringValue.VALUE("VarName");
        [DescAttribute("变量值")]
        public BooleanValue Value = new BooleanValue.VALUE();
        override public AbstractValue<Boolean> TValue { get { return Value; } }
        override public StringValue TKey { get { return Key; } }
    }
    [DescAttribute("设置单位(变量)", "设置 - 临时变量")]
    public class SetLocalUnitSV : SetLocalVarSV<InstanceUnit>
    {
        [DescAttribute("变量名")]
        public StringValue Key = new StringValue.VALUE("VarName");
        [DescAttribute("变量值")]
        public UnitValue Value = new UnitValue.NA();
        override public AbstractValue<InstanceUnit> TValue { get { return Value; } }
        override public StringValue TKey { get { return Key; } }
    }
    [DescAttribute("设置Flag(变量)", "设置 - 临时变量")]
    public class SetLocalFlagSV : SetLocalVarSV<InstanceFlag>
    {
        [DescAttribute("变量名")]
        public StringValue Key = new StringValue.VALUE("VarName");
        [DescAttribute("变量值")]
        public FlagValue Value = new FlagValue.NA();
        override public AbstractValue<InstanceFlag> TValue { get { return Value; } }
        override public StringValue TKey { get { return Key; } }
    }
    [DescAttribute("设置物品(变量)", "设置 - 临时变量")]
    public class SetLocalItemSV : SetLocalVarSV<InstanceItem>
    {
        [DescAttribute("变量名")]
        public StringValue Key = new StringValue.VALUE("VarName");
        [DescAttribute("变量值")]
        public ItemValue Value = new ItemValue.NA();
        override public AbstractValue<InstanceItem> TValue { get { return Value; } }
        override public StringValue TKey { get { return Key; } }
    }
    [DescAttribute("设置位置坐标(变量)", "设置 - 临时变量")]
    public class SetLocalPositionSV : SetLocalVarSV<Vector2>
    {
        [DescAttribute("变量名")]
        public StringValue Key = new StringValue.VALUE("VarName");
        [DescAttribute("变量值")]
        public PositionValue Value = new PositionValue.VALUE();
        override public AbstractValue<Vector2> TValue { get { return Value; } }
        override public StringValue TKey { get { return Key; } }
    }
}