| using System; | 
| using System.Collections.Generic; | 
| using UnityEngine.UI; | 
| using System.Linq; | 
| using LitJson; | 
|   | 
| public class InvestModel : GameSystemManager<InvestModel> | 
| { | 
|     // public ILOpenServerActivityProxy activity; | 
|   | 
|     public const int FuncID = 25; | 
|   | 
|   | 
|     //投资对应奖励 | 
|     Dictionary<int, Dictionary<int, List<Item>>> m_InvestItems = new Dictionary<int, Dictionary<int, List<Item>>>(); | 
|     //投资对应充值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 override void Init() | 
|     { | 
|         FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; | 
|         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; | 
|         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk; | 
|   | 
|         //通过配置决定是否有此投资项,如港台没有登录投资 | 
|         ParseConfig(); | 
|   | 
|     } | 
|   | 
|   | 
|   | 
|     public override void Release() | 
|     { | 
|         FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent; | 
|         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; | 
|         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk; | 
|     } | 
|   | 
|     public bool IsOpen() | 
|     { | 
|         return FuncOpen.Instance.IsFuncOpen(FuncID); | 
|     } | 
|   | 
|      | 
|     public void OnBeforePlayerDataInitialize() | 
|     { | 
|         m_InvestInfos.Clear(); | 
|         m_InvestSingleInfos.Clear(); | 
|     } | 
|   | 
|     public void OnPlayerLoginOk() | 
|     { | 
|         UpdateRedpoint(); | 
|     } | 
|   | 
|   | 
|     void ParseConfig() | 
|     { | 
|         investTypes.Clear(); | 
|         var funcConfig = FuncConfigConfig.Get("InvestCost"); | 
|         m_InvestRechargeIds = ConfigParse.ParseIntArrayDict(funcConfig.Numerical3); | 
|         //m_Redpoints | 
|   | 
|         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) | 
|     { | 
|         var ids = m_InvestRechargeIds[type]; | 
|         for (int i = 0; i < ids.Length; i++) | 
|         { | 
|             OrderInfoConfig config; | 
|             if (RechargeManager.Instance.TryGetOrderInfo(ids[i], out config)) | 
|             { | 
|                 return config; | 
|             } | 
|         } | 
|         return null; | 
|     } | 
|   | 
|   | 
|     public bool hasInvestType(int type) | 
|     { | 
|         return investTypes.Contains(type); | 
|     } | 
|   | 
|   | 
|     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 (!m_InvestSingleInfos.ContainsKey(type)) | 
|                 { | 
|                     return 0; | 
|                 } | 
|   | 
|                 var index = id % 100; | 
|                 //每个数按位存31个激活索引 | 
|                 var listIndex = index / 31; | 
|                 var bitIndex = index % 31; | 
|   | 
|   | 
|                 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; | 
|     } | 
|   | 
|     //奖励是否已领取 | 
|     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) | 
|         { | 
|             // activity.StateUpdate(id); | 
|             UpdateRedpoint(); | 
|         } | 
|   | 
|     } | 
|   | 
|      | 
|   | 
|     public void SendGetReward(int type, int id) | 
|     { | 
|         var pak = new CA541_tagCMGetInvestReward(); | 
|         pak.InvestType = (byte)type; | 
|         pak.RewardIndex = (byte)(id % 100); | 
|         GameNetSystem.Instance.SendInfo(pak); | 
|     } | 
|   | 
|     //购买投资 | 
|     public void BuyInvest(int type) | 
|     { | 
|         RechargeManager.Instance.CTG(GetOrderInfoId(type)); | 
|     } | 
|   | 
|     public void UpdateInvestInfo(HA338_tagMCInvestInfo package) | 
|     { | 
|         if (!investTypes.Contains(package.InvestType)) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         m_InvestInfos[package.InvestType] = new InvestInfo() | 
|         { | 
|             days = (int)package.CurDay, | 
|             money = package.CurDay >= 1 ? 1 : 0, | 
|         }; | 
|   | 
|         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) | 
|         { | 
|             onInvestUpdate(package.InvestType); | 
|         } | 
|     } | 
|   | 
|     void UpdateRedpoint() | 
|     { | 
|         List<int> redpointTypes = new List<int>(); | 
|         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; | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|   | 
|         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; | 
|     } | 
| } |