using vnxbqy.UI;
|
using System;
|
using System.Collections.Generic;
|
using UnityEngine.UI;
|
using System.Linq;
|
using LitJson;
|
|
public class InvestModel : ILModel<InvestModel>
|
{
|
public ILOpenServerActivityProxy activity;
|
|
public const int activityType = (int)OpenServerActivityCenter.ActivityType.AT_JCHD;
|
//精彩活动表中的ID
|
public const int activityID = 31;
|
public const int FuncID = 192;
|
|
//投资类型
|
public const int InvestType_Login = 9;
|
public const int InvestType_Level = 10;
|
public const int InvestType_Boss = 11;
|
|
|
//投资对应奖励
|
Dictionary<int, Dictionary<int, List<ItemEx>>> m_InvestItems = new Dictionary<int, Dictionary<int, List<ItemEx>>>();
|
//投资对应充值ID
|
Dictionary<int, List<int>> m_InvestRechargeIds = new Dictionary<int, List<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 Dictionary<int, int> bossMaxCntDict = new Dictionary<int, int>(); //增加boss最大挑战次数
|
public Dictionary<int, int> fbMaxCntDict = new Dictionary<int, int>(); //增加副本最大挑战次数
|
public List<int> missionQuickFinishType = new List<int>(); //快速完成任务的投资类型
|
|
//登录投资,等级投资,BOSS投资
|
int m_SelectType = 0;
|
public int selectType
|
{
|
get { return m_SelectType; }
|
set
|
{
|
if (m_SelectType != value)
|
{
|
m_SelectType = value;
|
if (onSelectUpdate != null)
|
{
|
onSelectUpdate();
|
}
|
}
|
}
|
}
|
|
public int jumpType { get; set; }
|
|
|
public event Action onSelectUpdate;
|
public event Action onInvestUpdate;
|
|
public const int redpointID = 20931;
|
public Redpoint redpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, redpointID);
|
|
VipModel vipModel { get { return ModelCenter.Instance.GetModelEx<VipModel>(); } }
|
|
|
|
protected override void Init()
|
{
|
FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
|
GameEvent.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
|
GameEvent.playerLoginOkEvent += OnPlayerLoginOk;
|
WindowCenter.Instance.windowAfterOpenEvent += Instance_windowAfterOpenEvent;
|
|
//通过配置决定是否有此投资项,如港台没有登录投资
|
ParseConfig();
|
|
activity = new ILOpenServerActivityProxy(IsOpen, IsAdvance, priorityOpen);
|
OpenServerActivityCenter.Instance.Register(activityID, activity, activityType);
|
}
|
|
private void Instance_windowAfterOpenEvent(Window obj)
|
{
|
if (obj.name == "MainInterfaceWin")
|
{
|
AutoOpenForeverCardWin(1);
|
}
|
}
|
|
protected override void UnInit()
|
{
|
FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
|
GameEvent.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
|
GameEvent.playerLoginOkEvent -= OnPlayerLoginOk;
|
WindowCenter.Instance.windowAfterOpenEvent -= Instance_windowAfterOpenEvent;
|
}
|
|
public bool IsOpen()
|
{
|
return FuncOpen.Instance.IsFuncOpen(FuncID);
|
}
|
|
public bool IsAdvance()
|
{
|
return false;
|
}
|
|
public bool priorityOpen()
|
{
|
//红点
|
return redpoint.state == RedPointState.Simple;
|
}
|
|
|
public void OnBeforePlayerDataInitialize()
|
{
|
m_InvestInfos.Clear();
|
m_InvestSingleInfos.Clear();
|
}
|
|
public void OnPlayerLoginOk()
|
{
|
|
UpdateRedpoint();
|
}
|
|
|
void ParseConfig()
|
{
|
investTypes.Clear();
|
var funcConfig = FuncConfigConfig.Get("InvestCost");
|
var json = JsonMapper.ToObject(funcConfig.Numerical3);
|
var jsonList = json.Keys.ToList();
|
for (int i = 0; i < jsonList.Count; i++)
|
{
|
var typeKey = jsonList[i];
|
var type = int.Parse(typeKey);
|
if (type == InvestType_Login || type == InvestType_Level || type == InvestType_Boss || type == foreverCardType)
|
{
|
m_InvestRechargeIds[type] = new List<int>(JsonMapper.ToObject<int[]>(json[typeKey].ToJson()));
|
if (type == foreverCardType)
|
{
|
m_Redpoints.Add(type, new Redpoint(MainRedDot.ForeverCardRedPoint));
|
}
|
else
|
{
|
//IL 处理新增的投资 type=9之后
|
m_Redpoints.Add(type, new Redpoint(redpointID, redpointID * 100 + type));
|
}
|
}
|
}
|
|
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<ItemEx>> dict;
|
if (!m_InvestItems.TryGetValue(config.type, out dict))
|
{
|
dict = new Dictionary<int, List<ItemEx>>();
|
m_InvestItems.Add(config.type, dict);
|
}
|
|
List<ItemEx> items;
|
if (!dict.TryGetValue(config.id, out items))
|
{
|
items = new List<ItemEx>();
|
dict.Add(config.id, items);
|
}
|
|
var itemJson = JsonMapper.ToObject(config.award);
|
var itemArray = JsonMapper.ToObject<int[][]>(itemJson["1"].ToJson());
|
for (int j = 0; j < itemArray.Length; j++)
|
{
|
items.Add(new ItemEx()
|
{
|
id = itemArray[j][0],
|
count = itemArray[j][1],
|
bind = itemArray[j][2],
|
});
|
}
|
}
|
funcConfig = FuncConfigConfig.Get("InvestPower");
|
json = JsonMapper.ToObject(funcConfig.Numerical1);
|
jsonList = json.Keys.ToList();
|
for (int i = 0; i < jsonList.Count; i++)
|
{
|
var typeKey = jsonList[i];
|
var type = int.Parse(typeKey);
|
var value = int.Parse(json[typeKey].ToJson());
|
bossMaxCntDict.Add(type, value);
|
}
|
json = JsonMapper.ToObject(funcConfig.Numerical2);
|
jsonList = json.Keys.ToList();
|
for (int i = 0; i < jsonList.Count; i++)
|
{
|
var typeKey = jsonList[i];
|
var type = int.Parse(typeKey);
|
var value = int.Parse(json[typeKey].ToJson());
|
fbMaxCntDict.Add(type, value);
|
}
|
missionQuickFinishType = JsonMapper.ToObject<List<int>>(funcConfig.Numerical3);
|
}
|
|
public int GetOrderInfoId(int type)
|
{
|
var ids = m_InvestRechargeIds[type];
|
for (int i = 0; i < ids.Count; i++)
|
{
|
OrderInfoConfig config;
|
if (vipModel.TryGetOrderInfo(ids[i], out config))
|
{
|
return config.id;
|
}
|
}
|
return 0;
|
}
|
|
//底层 windowjump调用
|
public void SetDefaultJumpType(int id)
|
{
|
jumpType = id;
|
}
|
|
//优先指定跳转 后红点
|
public int GetSelectType()
|
{
|
if (jumpType != 0 && investTypes.Contains(jumpType))
|
{
|
var type = jumpType;
|
jumpType = 0;
|
return type;
|
}
|
else
|
{
|
var keyList = m_Redpoints.Keys.ToList();
|
for (int i = 0; i < keyList.Count; i++)
|
{
|
if (m_Redpoints[keyList[i]].state == RedPointState.Simple)
|
{
|
if (keyList[i] == foreverCardType)
|
continue;
|
return keyList[i];
|
}
|
}
|
}
|
return investTypes[0];
|
}
|
|
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 int GetTotalIncome(int type)
|
{
|
var 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.count;
|
}
|
}
|
}
|
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;
|
|
if (type == InvestType_Login)
|
{
|
return m_InvestSingleInfos[type][2][0] < config.needDay ? 1 : 2;
|
}
|
else if (type == InvestType_Level)
|
{
|
return PlayerDatas.Instance.baseData.LV < config.needLV ? 1 : 2;
|
}
|
else if (type == InvestType_Boss)
|
{
|
return ((int)Math.Pow(2, bitIndex) & m_InvestSingleInfos[type][2][listIndex]) == 0 ? 1 : 2;
|
}
|
return day < config.needDay ? 1 : 2;
|
}
|
}
|
return 0;
|
}
|
|
|
|
public bool TryGetItems(int type, int id, out List<ItemEx> 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();
|
}
|
else if (id == 223)
|
{
|
AutoOpenForeverCardWin(0);
|
|
}
|
}
|
|
//0 功能开启 1 非首日 自动打开
|
private void AutoOpenForeverCardWin(int type)
|
{
|
if (!FuncOpen.Instance.IsFuncOpen(223))
|
return;
|
var ids = GetIdsByType(foreverCardType);
|
var state = GetSingleInvestState(foreverCardType, ids[0]);
|
if (state != 0)
|
return;
|
|
int openState = LocalSave.GetInt("ForeverCard" + PlayerDatas.Instance.baseData.PlayerID);
|
if (type == 0)
|
{
|
if ((openState & 1) != 0)
|
return;
|
}
|
|
else if (type == 1)
|
{
|
if ((openState & 2) != 0 || TimeUtility.CreateDays <= 1)
|
return;
|
}
|
|
if (WindowCenter.Instance.IsOpen<MainInterfaceWin>() && !NewBieCenter.Instance.inGuiding
|
&& !WindowCenter.Instance.ExistAnyFullScreenOrMaskWin() && !StageLoad.Instance.isLoading
|
&& !ModelCenter.Instance.GetModel<TreasureModel>().newGotShowing)
|
{
|
WindowCenter.Instance.Open<ForeverCardWin>();
|
openState = openState | (int)Math.Pow(2, type);
|
LocalSave.SetInt("ForeverCard" + PlayerDatas.Instance.baseData.PlayerID, openState);
|
}
|
}
|
|
|
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 SendInvest(int type)
|
{
|
var orderInfoId = GetOrderInfoId(type);
|
var config = OrderInfoConfig.Get(orderInfoId);
|
vipModel.CTG(config);
|
}
|
|
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();
|
}
|
}
|
|
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 int GetBossAddMaxCnt(int type)
|
{
|
var ids = GetIdsByType(foreverCardType);
|
var state = GetSingleInvestState(foreverCardType, ids[0]);
|
if (state == 0)
|
return 0;
|
int value = 0;
|
bossMaxCntDict.TryGetValue(type, out value);
|
return value;
|
}
|
|
public int GetFBAddMaxCnt(int mapID)
|
{
|
var ids = GetIdsByType(foreverCardType);
|
var state = GetSingleInvestState(foreverCardType, ids[0]);
|
if (state == 0)
|
return 0;
|
int value = 0;
|
fbMaxCntDict.TryGetValue(mapID, out value);
|
return value;
|
}
|
|
public bool IsMissionQuickFinish()
|
{
|
var ids = GetIdsByType(foreverCardType);
|
var state = GetSingleInvestState(foreverCardType, ids[0]);
|
if (state == 0)
|
return false;
|
return missionQuickFinishType.Contains(foreverCardType);
|
}
|
|
public bool IsOnHookQuickBuyFree()
|
{
|
var ids = GetIdsByType(foreverCardType);
|
var state = GetSingleInvestState(foreverCardType, ids[0]);
|
if (state == 0)
|
return false;
|
return true;
|
}
|
|
//已经购买并领取所有物品
|
public bool IsFinish()
|
{
|
for (int i = 0; i < investTypes.Count; i++)
|
{
|
int type = investTypes[i];
|
//忽略登陆投资
|
if (type== InvestType_Login)
|
continue;
|
//忽略永久卡
|
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;
|
}
|
}
|