hch
1 天以前 b5cdc4acce06b4e9d21b4cc56e99591fe0381564
Main/System/Invest/InvestModel.cs
@@ -6,36 +6,24 @@
public class InvestModel : GameSystemManager<InvestModel>
{
    // public ILOpenServerActivityProxy activity;
    public const int FuncID = 25;
    public const int monthCardType = 1; // 月卡
    public const int foreverCardType = 2; //永久卡 权限
    //投资对应奖励
    Dictionary<int, Dictionary<int, List<Item>>> m_InvestItems = new Dictionary<int, Dictionary<int, List<Item>>>();
    Dictionary<int, int[][]> m_InvestItems = new Dictionary<int, int[][]>();
    //投资对应充值ID
    Dictionary<int, int[]> m_InvestRechargeIds = new Dictionary<int, int[]>();
    //投资对应购买情况
    Dictionary<int, InvestInfo> m_InvestInfos = new Dictionary<int, InvestInfo>();
    //{投资类型:[领取天,当前天]} 天从1开始
    Dictionary<int, List<List<int>>> m_InvestSingleInfos = new Dictionary<int, List<List<int>>>();
    //投资对应的红点
    Dictionary<int, Redpoint> m_Redpoints = new Dictionary<int, Redpoint>();
    //投资类型
    public List<int> investTypes = new List<int>();
    //永久卡 权限
    public const int foreverCardType = 12; //投资类型
    public const int monthCardType = 7; // 月卡7
    public event Action onSelectUpdate;
    public event Action<int> onInvestUpdate;
    public const int redpointID = 20931;
    public Redpoint redpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, redpointID);
    public Redpoint redpoint = new Redpoint(redpointID);
    public override void Init()
@@ -60,14 +48,13 @@
    public bool IsOpen()
    {
        return FuncOpen.Instance.IsFuncOpen(FuncID);
        return FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.PrivilegeCard);
    }
    
    public void OnBeforePlayerDataInitialize()
    {
        m_InvestInfos.Clear();
        m_InvestSingleInfos.Clear();
    }
    public void OnPlayerLoginOk()
@@ -78,49 +65,16 @@
    void ParseConfig()
    {
        investTypes.Clear();
        var funcConfig = FuncConfigConfig.Get("InvestCost");
        m_InvestRechargeIds = ConfigParse.ParseIntArrayDict(funcConfig.Numerical3);
        //m_Redpoints
        m_InvestRechargeIds = ConfigParse.ParseIntArrayDict(funcConfig.Numerical1);
        funcConfig = FuncConfigConfig.Get("InvestDay");
        m_InvestItems = ConfigParse.ParseIntArray2Dict(funcConfig.Numerical3);
        investTypes = m_InvestRechargeIds.Keys.ToList();
        investTypes.Sort();
        var configs = InvestConfig.GetValues();
        for (int i = 0; i < configs.Count; i++)
        {
            var config = configs[i];
            if (!investTypes.Contains(config.type))
            {
                continue;
            }
            Dictionary<int, List<Item>> dict;
            if (!m_InvestItems.TryGetValue(config.type, out dict))
            {
                dict = new Dictionary<int, List<Item>>();
                m_InvestItems.Add(config.type, dict);
            }
            List<Item> items;
            if (!dict.TryGetValue(config.id, out items))
            {
                items = new List<Item>();
                dict.Add(config.id, items);
            }
            var itemArray = config.award[1];    //1暂时约定月卡 永久卡,其他的自定义后续再定
            for (int j = 0; j < itemArray.Length; j++)
            {
                items.Add(new Item()
                {
                    id = itemArray[j][0],
                    countEx = itemArray[j][1],
                    bind = itemArray[j][2],
                });
            }
        }
    }
    public OrderInfoConfig GetOrderInfoId(int type)
@@ -144,113 +98,70 @@
    }
    public int GetInvestPassDays(int type)
    {
        return m_InvestInfos.ContainsKey(type) ? m_InvestInfos[type].days : 0;
    }
    // public int GetInvestPassDays(int type)
    // {
    //     return m_InvestInfos.ContainsKey(type) ? m_InvestInfos[type].days : 0;
    // }
    //获得单投资的总收益
    public long GetTotalIncome(int type)
    {
        long income = 0;
        if (m_InvestItems.ContainsKey(type))
        {
            var keyList = m_InvestItems[type].Keys.ToList();
            for (int i = 0; i < keyList.Count; i++)
            {
                var items = m_InvestItems[type][keyList[i]];
                for (var j = 0; j < items.Count; j++)
                {
                    var item = items[j];
                    if (item.id == 20 || item.id == 30)
                        income += item.countEx;
                }
            }
        }
        return income;
    }
    //id 为表里的ID
    //0-未投资 1-未达成 2-可领取 3-已领取
    public int GetSingleInvestState(int type, int id)
    {
        if (IsInvested(type))
        {
            var day = GetInvestPassDays(type);
            if (m_InvestItems.ContainsKey(type)
                && m_InvestItems[type].ContainsKey(id))
            {
                if (IsRewardGot(type, id))
                {
                    return 3;
                }
                var config = InvestConfig.Get(id);
        // if (IsInvested(type))
        // {
        //     var day = GetInvestPassDays(type);
        //     if (m_InvestItems.ContainsKey(type)
        //         && m_InvestItems[type].ContainsKey(id))
        //     {
        //         if (IsRewardGot(type, id))
        //         {
        //             return 3;
        //         }
        //         var config = InvestConfig.Get(id);
                if (!m_InvestSingleInfos.ContainsKey(type))
                {
                    return 0;
                }
        //         if (!m_InvestSingleInfos.ContainsKey(type))
        //         {
        //             return 0;
        //         }
                var index = id % 100;
                //每个数按位存31个激活索引
                var listIndex = index / 31;
                var bitIndex = index % 31;
        //         var index = id % 100;
        //         //每个数按位存31个激活索引
        //         var listIndex = index / 31;
        //         var bitIndex = index % 31;
                return day < config.needDay ? 1 : 2;
            }
        }
        //         return day < config.needDay ? 1 : 2;
        //     }
        // }
        return 0;
    }
    public bool TryGetItems(int type, int id, out List<Item> items)
    {
        items = null;
        if (m_InvestItems.ContainsKey(type))
        {
            return m_InvestItems[type].TryGetValue(id, out items);
        }
        return false;
    }
    public List<int> GetIdsByType(int type)
    {
        if (m_InvestItems.ContainsKey(type))
        {
            return m_InvestItems[type].Keys.ToList();
        }
        return null;
    }
    //判断是否购买了投资
    public bool IsInvested(int type)
    {
        return m_InvestInfos.ContainsKey(type) && m_InvestInfos[type].money > 0;
        if (!m_InvestInfos.ContainsKey(type))
        {
            return false;
        }
        if (type == 1)
        {
            //月卡 限时类型的投资 未到期就算投资
            return m_InvestInfos[type].InvestEndTime > 0 && m_InvestInfos[type].InvestEndTime < TimeUtility.AllSeconds;
        }
        //永久类型的投资 只要购买了就算投资
        return m_InvestInfos[type].InvestBuyTime > 0;
    }
    //奖励是否已领取
    public bool IsRewardGot(int type, int id)
    {
        if (m_InvestSingleInfos.ContainsKey(type))
        {
            var index = id % 100;
            //每个数按位存31个激活索引
            var listIndex = index / 31;
            var bitIndex = index % 31;
            return ((int)Math.Pow(2, bitIndex) & m_InvestSingleInfos[type][1][listIndex]) != 0;
        }
        return false;
    }
    private void OnFuncStateChangeEvent(int id)
    {
        if (id == FuncID)
        if (id == (int)FuncOpenEnum.PrivilegeCard)
        {
            // activity.StateUpdate(id);
            UpdateRedpoint();
        }
@@ -262,7 +173,7 @@
    {
        var pak = new CA541_tagCMGetInvestReward();
        pak.InvestType = (byte)type;
        pak.RewardIndex = (byte)(id % 100);
        pak.RewardIndex = (byte)id;
        GameNetSystem.Instance.SendInfo(pak);
    }
@@ -272,7 +183,7 @@
        RechargeManager.Instance.CTG(GetOrderInfoId(type));
    }
    public void UpdateInvestInfo(HA338_tagMCInvestInfo package)
    public void UpdateInvestInfo(HA338_tagSCInvestInfo package)
    {
        if (!investTypes.Contains(package.InvestType))
        {
@@ -281,26 +192,12 @@
        m_InvestInfos[package.InvestType] = new InvestInfo()
        {
            days = (int)package.CurDay,
            money = package.CurDay >= 1 ? 1 : 0,
            InvestBuyTime = (int)package.InvestBuyTime,
            InvestEndTime = (int)package.InvestEndTime,
            AwardState = package.AwardState
        };
        List<List<int>> singleInfos;
        if (!m_InvestSingleInfos.TryGetValue(package.InvestType, out singleInfos))
        {
            singleInfos = new List<List<int>>();
            m_InvestSingleInfos.Add(package.InvestType, singleInfos);
        }
        singleInfos.Clear();
        singleInfos.Add(new List<int>());
        singleInfos.Add(new List<int>());
        singleInfos.Add(new List<int>());
        singleInfos[0].Add((int)package.CurDay);
        for (int i = 0; i < package.ValueCount; i++)
        {
            singleInfos[1].Add((int)package.RewardValue[i]);
            singleInfos[2].Add((int)package.ProgressValue[i]);
        }
        UpdateRedpoint();
        if (onInvestUpdate != null)
@@ -311,67 +208,20 @@
    void UpdateRedpoint()
    {
        List<int> redpointTypes = new List<int>();
        if (IsOpen())
        if (!IsOpen())
        {
            for (var i = 0; i < investTypes.Count; i++)
            {
                var type = investTypes[i];
                if (!IsInvested(type))
                {
                    continue;
                }
                var keyList = m_InvestItems[type].Keys.ToList();
                for (int j = 0; j < keyList.Count; j++)
                {
                    var id = keyList[j];
                    if (GetSingleInvestState(type, id) == 2)
                    {
                        redpointTypes.Add(type);
                        break;
                    }
                }
            }
            return;
        }
        var redList = m_Redpoints.Keys.ToList();
        for (int j = 0; j < redList.Count; j++)
        {
            var type = redList[j];
            m_Redpoints[type].state = redpointTypes.Contains(type) ? RedPointState.Simple : RedPointState.None;
        }
    }
    
    //已经购买并领取所有物品
    public bool IsFinish()
    {
        for (int i = 0; i < investTypes.Count; i++)
        {
            int type = investTypes[i];
            //忽略永久卡
            if (type == foreverCardType)
                continue;
            var idsList = GetIdsByType(type);
            if (idsList.IsNullOrEmpty())
                continue;
            for (int j = 0; j < idsList.Count; j++)
            {
                int id = idsList[j];
                if (GetSingleInvestState(type, id) != 3)
                {
                    return false;
                }
            }
        }
        return true;
    }
    public struct InvestInfo
    {
        public int money;
        public int days;
        public int InvestBuyTime;    // 投资购买时间戳,永久的通过该时间判断是否有效或已过天数,任意类型均有该值,过期没有重置,前端自己判断
        public int InvestEndTime;    // 投资到期时间戳,非永久的通过该时间判断到期时间,有天数限制的才有值
        public int AwardState;    // 今日是否已领取奖励
    }
}