﻿namespace JLGames.RocketDriver.Games.RpgMaterial.Service
{
    public interface ITriggerRegister
    {
        /// <summary>
        /// Register trigger
        /// 注册一个触发器
        /// Note: Ignore if duplicate registration or trigger=null
        /// 注意：重复注册或trigger=null时忽略
        /// </summary>
        /// <param name="trigger"></param>
        void RegisterTrigger(ITriggerEntity trigger);

        /// <summary>
        /// Register a comparison trigger
        /// 注册一个比较触发器
        /// </summary>
        /// <param name="tType">trigger value type</param>
        /// <param name="mType">material type</param>
        /// <param name="eId">user material element id</param>
        /// <param name="cType">compare type</param>
        /// <param name="cValue">compare value</param>
        /// <param name="invokeFunc">trigger function</param>
        /// <param name="post">whether it is post-triggered</param>
        /// <param name="times">trigger times, -1 means permanent</param>
        /// <returns></returns>
        int RegisterTrigger(Trigger.TrackingType tType, int mType, int eId, Trigger.CompareType cType, int cValue, Trigger.TriggerInvoke invokeFunc
            , bool post = true, int times = -1);

        /// <summary>
        /// Register a value offset comparison trigger
        /// 注册一个数值偏移比较触发器
        /// </summary>
        /// <param name="mType">material type</param>
        /// <param name="eId">user material element id</param>
        /// <param name="cType">compare type</param>
        /// <param name="cValue">compare value</param>
        /// <param name="invokeFunc">trigger function</param>
        /// <param name="post">whether it is post-triggered</param>
        /// <param name="times">trigger times, -1 means permanent</param>
        /// <returns></returns>
        int RegisterOffsetTrigger(int mType, int eId, Trigger.CompareType cType, int cValue, Trigger.TriggerInvoke invokeFunc
            , bool post = true, int times = -1);

        /// <summary>
        /// Register a value comparison trigger
        /// 注册一个数值比较触发器
        /// </summary>
        /// <param name="mType">material type</param>
        /// <param name="eId">user material element id</param>
        /// <param name="cType">compare type</param>
        /// <param name="cValue">compare value</param>
        /// <param name="invokeFunc">trigger function</param>
        /// <param name="post">whether it is post-triggered</param>
        /// <param name="times">trigger times, -1 means permanent</param>
        /// <returns></returns>
        int RegisterValueTrigger(int mType, int eId, Trigger.CompareType cType, int cValue, Trigger.TriggerInvoke invokeFunc
            , bool post = true, int times = -1);

        /// <summary>
        /// Unregistering trigger
        /// 取消触发器的注册
        /// </summary>
        /// <param name="trigger"></param>
        void UnregisterTrigger(ITriggerEntity trigger);

        /// <summary>
        /// Unregistering trigger
        /// 取消触发器的注册
        /// </summary>
        /// <param name="triggerId"></param>
        void UnregisterTrigger(int triggerId);
    }
}