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 = 119;
|
|
|
//投资对应奖励
|
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;
|
}
|
}
|