| | |
| | | |
| | | 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() |
| | |
| | | |
| | | 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() |
| | |
| | | |
| | | 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) |
| | |
| | | } |
| | | |
| | | |
| | | 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(); |
| | | } |
| | | |
| | |
| | | { |
| | | var pak = new CA541_tagCMGetInvestReward(); |
| | | pak.InvestType = (byte)type; |
| | | pak.RewardIndex = (byte)(id % 100); |
| | | pak.RewardIndex = (byte)id; |
| | | GameNetSystem.Instance.SendInfo(pak); |
| | | } |
| | | |
| | |
| | | RechargeManager.Instance.CTG(GetOrderInfoId(type)); |
| | | } |
| | | |
| | | public void UpdateInvestInfo(HA338_tagMCInvestInfo package) |
| | | public void UpdateInvestInfo(HA338_tagSCInvestInfo package) |
| | | { |
| | | if (!investTypes.Contains(package.InvestType)) |
| | | { |
| | |
| | | |
| | | 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) |
| | |
| | | |
| | | 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; // 今日是否已领取奖励 |
| | | } |
| | | } |
| | | |