// ***********************************************************************
// Assembly : Game
// Author : Kimch
// Created : 2021-03-10
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
//
//
// ***********************************************************************
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace G
{
///
/// 类功能描述
///
public class RedPointProxy : F.GameProxy
{
public delegate void OnRedpointBroadcast(int num);
#region Field
// 红点树Root节点
readonly Dictionary _rootNodeDic = new Dictionary();
readonly Dictionary _nodeSplitNames = new Dictionary();
int _stagger;
#endregion
#region Method
private void InitRedPointTreeNode()
{
var tmpTreeList = F.ListPool.Get();
tmpTreeList.Add(RedPointConst.Cha);
tmpTreeList.Add(RedPointConst.ChaFull);
var rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.ChaPanel, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.Home);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.Home, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.World);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.World, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.Kungfu);
tmpTreeList.Add(RedPointConst.KungfuBook);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.KungfuPanel, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.Pet);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.Pet, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.Title);
tmpTreeList.Add(RedPointConst.TitleStudy);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.Title, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.Shop);
tmpTreeList.Add(RedPointConst.ShopCollect);
tmpTreeList.Add(RedPointConst.ShopRefresh);
tmpTreeList.Add(RedPointConst.ShopSpeedUp);
tmpTreeList.Add(RedPointConst.ShopCommon);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.ShopPanel, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.Activity);
tmpTreeList.Add(RedPointConst.ActivityFreeEnery);
tmpTreeList.Add(RedPointConst.ActivitySevenSign);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.Activity, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.Mission);
tmpTreeList.Add(RedPointConst.MissionAch);
tmpTreeList.Add(RedPointConst.MissionDay);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.Mission, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.BattlePass);
tmpTreeList.Add(RedPointConst.BattlePassActivation);
tmpTreeList.Add(RedPointConst.BattlePassMission);
tmpTreeList.Add(RedPointConst.BattlePassReward);
tmpTreeList.Add(RedPointConst.BattlePassMissionAndReward);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.BattlePass, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.Mail);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.Mail, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.Vip);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.Vip, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.FirstPay);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.FirstPay, rootNode);
tmpTreeList.Clear();
tmpTreeList.Add(RedPointConst.Extend);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.Extend, rootNode);
//tmpTreeList.Clear(); //女神节
//tmpTreeList.Add(RedPointConst.Woman);
//tmpTreeList.Add(RedPointConst.WomanSign);
//tmpTreeList.Add(RedPointConst.WomanExchange);
//tmpTreeList.Add(RedPointConst.WomanGift);
//tmpTreeList.Add(RedPointConst.WomanMission);
//rootNode = CreateNodes(tmpTreeList);
//_rootNodeDic.Add(RedPointType.Woman, rootNode);
tmpTreeList.Clear(); //清明节
tmpTreeList.Add(RedPointConst.QingMing);
tmpTreeList.Add(RedPointConst.QingMingSign);
tmpTreeList.Add(RedPointConst.QingMingExchange);
//tmpTreeList.Add(RedPointConst.QingMingGift);
//tmpTreeList.Add(RedPointConst.QingMingRecharge);
tmpTreeList.Add(RedPointConst.QingMingMission);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.QingMing, rootNode);
tmpTreeList.Clear();//功能解锁
tmpTreeList.Add(RedPointConst.Function);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.Function, rootNode);
tmpTreeList.Clear();//活动框
tmpTreeList.Add(RedPointConst.ActivityBox);
rootNode = CreateNodes(tmpTreeList);
_rootNodeDic.Add(RedPointType.ActivityBox, rootNode);
F.ListPool.Release(tmpTreeList);
}
private void UpdateRedPointTreeNode()
{
_stagger++;
int state = BusinessProxy.Instance.GetRedPoint();
SetRpNum(RedPointType.Home, RedPointConst.Home, state);
state = CityProxy.Instance.GetRedPoint();
SetRpNum(RedPointType.World, RedPointConst.World, state);
state = BagProxy.Instance.GetRedPoint();
SetRpNum(RedPointType.ChaPanel, RedPointConst.ChaFull, state);
state = KungfuProxy.Instance.GetRedPoint();
SetRpNum(RedPointType.KungfuPanel, RedPointConst.Kungfu, state);
state = BookProxy.Instance.GetRedPoint();
SetRpNum(RedPointType.KungfuPanel, RedPointConst.KungfuBook, state);
state = SwordProxy.Instance.GetTitleRedPoint();
SetRpNum(RedPointType.Title, RedPointConst.TitleStudy, state);
//state = AffairProxy.Instance.GetTitleStudyRedPoint();
//SetRpNum(RedPointType.Title, RedPointConst.TitleStudy, state);
//
//state =ShopProxy.Instance.GetRedPoint1();
//SetRpNum(RedPointType.ShopPanel, RedPointConst.ShopCollect, state);
state = ShopProxy.Instance.GetRedPoint2();
SetRpNum(RedPointType.ShopPanel, RedPointConst.ShopRefresh, state);
state = ShopProxy.Instance.GetRedPoint3();
SetRpNum(RedPointType.ShopPanel, RedPointConst.ShopSpeedUp, state);
//state = ShopProxy.Instance.GetRedPoint4();
//SetRpNum(RedPointType.ShopPanel, RedPointConst.ShopCommon, state);
if (_stagger % 2 == 0)
{
state = PetProxy.Instance.GetRedPoint();
SetRpNum(RedPointType.Pet, RedPointConst.Pet, state);
var bpProxy = BattlePassProxy.Instance;
if (bpProxy)
{
state = bpProxy.GetRedPoint1();
SetRpNum(RedPointType.BattlePass, RedPointConst.BattlePassActivation, state);
state = bpProxy.GetRedPoint2();
SetRpNum(RedPointType.BattlePass, RedPointConst.BattlePassMission, state);
state = bpProxy.GetRedPoint3();
SetRpNum(RedPointType.BattlePass, RedPointConst.BattlePassReward, state);
state = bpProxy.GetRedPoint4();
SetRpNum(RedPointType.BattlePass, RedPointConst.BattlePassMissionAndReward, state);
}
state = VipProxy.Instance.GetRedPoint();
SetRpNum(RedPointType.Vip, RedPointConst.Vip, state);
state = FunctionProxy.Instance.GetRedPoint();
SetRpNum(RedPointType.Function, RedPointConst.Function, state);
}
if (_stagger % 2 == 1)
{
int extend = 0;
state = MissionProxy.Instance.GetRedPointDay();
//extend += state;
SetRpNum(RedPointType.Mission, RedPointConst.MissionDay, state);
state = MissionProxy.Instance.GetRedPointAch();
//extend += state;
SetRpNum(RedPointType.Mission, RedPointConst.MissionAch, state);
if (FunctionProxy.Instance.GetFunctionUnlock(FunctionProxy.FunctionId.解锁客栈功能))
{
state = ActivityProxy.Instance.GetRedPoint1();
extend += state;
SetRpNum(RedPointType.Activity, RedPointConst.ActivityFreeEnery, state);
state = ActivityProxy.Instance.GetRedPoint2();
extend += state;
SetRpNum(RedPointType.Activity, RedPointConst.ActivitySevenSign, state);
}
state = MailProxy.Instance.GetRedPoint1();
extend += state;
SetRpNum(RedPointType.Mail, RedPointConst.Mail, state);
SetRpNum(RedPointType.Extend, RedPointConst.Extend, extend);
}
if (_stagger % 3 == 1)
{
int extend = 0;
state = FirstPayProxy.Instance.GetRedPoint();
extend += state;
SetRpNum(RedPointType.FirstPay, RedPointConst.FirstPay, state);
//state = WomenActivity.Instance.GetRedPointSign();
//extend += state;
//SetRpNum(RedPointType.Woman, RedPointConst.WomanSign, state);
//state = WomenActivity.Instance.GetRedPointExchange();
//extend += state;
//SetRpNum(RedPointType.Woman, RedPointConst.WomanExchange, state);
//state = WomenActivity.Instance.GetRedPointGift();
//extend += state;
//SetRpNum(RedPointType.Woman, RedPointConst.WomanGift, state);
//state = WomenActivity.Instance.GetRedPointMission();
//extend += state;
//SetRpNum(RedPointType.Woman, RedPointConst.WomanMission, state);
state = QingMingActivity.Instance.GetRedPointSign();
extend += state;
SetRpNum(RedPointType.QingMing, RedPointConst.QingMingSign, state);
state = QingMingActivity.Instance.GetRedPointExchange();
extend += state;
SetRpNum(RedPointType.QingMing, RedPointConst.QingMingExchange, state);
//state = QingMingActivity.Instance.GetRedPointGift();
//extend += state;
//SetRpNum(RedPointType.QingMing, RedPointConst.QingMingGift, state);
//state = QingMingActivity.Instance.GetRedPointRecharge();
//extend += state;
//SetRpNum(RedPointType.QingMing, RedPointConst.QingMingRecharge, state);
state = QingMingActivity.Instance.GetRedPointMission();
extend += state;
SetRpNum(RedPointType.QingMing, RedPointConst.QingMingMission, state);
SetRpNum(RedPointType.ActivityBox, RedPointConst.ActivityBox, extend);
}
//公告
if (_stagger % 10 == 1)
{
state = KRemoteConfig.Instance.newNotice ? 1 : 0;
SetRpNum(RedPointType.Notice, RedPointConst.Notice, state);
}
}
private string[] GetNodeSplitNames(string nodeName)
{
if (_nodeSplitNames.TryGetValue(nodeName, out var result))
return result;
result = nodeName.Split('.');
_nodeSplitNames.Add(nodeName, result);
return result;
}
public void SetRpNum(RedPointType type, string nodeName, int rpNum)
{
var nodeList = GetNodeSplitNames(nodeName);
if (nodeList == null || nodeList.Length == 0)
return;
if (_rootNodeDic.TryGetValue(type, out RedPointNode node))
{
if (nodeList[0] != node.nodeName)
{
throw new Exception(string.Format("RedpointType和NodeName不对应,RedpointType:{0},NodeName:{1}", type, node.nodeName));
}
if (nodeList.Length == 1)
{
node.SetRedPointNum(rpNum);
return;
}
for (int i = 1; i < nodeList.Length; i++)
{
var subNodeName = nodeList[i];
if (!node.childs.ContainsKey(subNodeName))
{
Debug.Log("Does Not Contains Child Node :" + nodeList[i]);
return;
}
node = node.childs[subNodeName];
if (i == nodeList.Length - 1)
{
node.SetRedPointNum(rpNum);
}
}
}
}
public void AddListener(RedPointType type, string nodeName, OnRedpointBroadcast callback)
{
var nodeList = GetNodeSplitNames(nodeName);
if (_rootNodeDic.TryGetValue(type, out RedPointNode node))
{
if (nodeList.Length == 1 && node.nodeName == nodeList[0])
{
node.numChangeFunc = callback;
node.SyncRedPoint();
return;
}
else if (nodeList[0] != node.nodeName)
{
throw new Exception(string.Format("RedpointType和NodeName不对应,RedpointType:{0},NodeName:{1}", type, nodeName));
}
for (int i = 1; i < nodeList.Length; i++)
{
var subNodeName = nodeList[i];
if (!node.childs.ContainsKey(subNodeName))
{
Debug.Log("Does Not Contains Child Node :" + nodeList[i]);
return;
}
node = node.childs[subNodeName];
if (i == nodeList.Length - 1)
{
node.numChangeFunc = callback;
node.SyncRedPoint();
}
}
}
}
public void RemoveLisnener(RedPointType type, string nodeName)
{
var nodeList = GetNodeSplitNames(nodeName);
if (_rootNodeDic.TryGetValue(type, out RedPointNode node))
{
if (nodeList.Length == 1 && node.nodeName == nodeList[0])
{
if (node.numChangeFunc != null) node.numChangeFunc = null;
return;
}
else if (nodeList[0] != node.nodeName)
{
throw new Exception(string.Format("RedpointType和NodeName不对应,RedpointType:{0},NodeName:{1}", type, nodeName));
}
for (int i = 1; i < nodeList.Length; i++)
{
var subNodeName = nodeList[i];
if (!node.childs.ContainsKey(subNodeName))
{
Debug.Log("Does Not Contains Child Node :" + nodeList[i]);
return;
}
node = node.childs[subNodeName];
if (i == nodeList.Length - 1)
{
if (node.numChangeFunc != null) node.numChangeFunc = null;
}
}
}
}
private RedPointNode CreateNodes(IList treeList)
{
if (treeList == null || treeList.Count == 0)
return null;
var rootNode = new RedPointNode
{
nodeName = treeList[0],
};
for (int i = 1; i < treeList.Count; i++)
{
var tree = treeList[i];
var node = rootNode;
var treeSplit = GetNodeSplitNames(tree);
if (treeSplit[0] != rootNode.nodeName)
{
Debug.Log("RedPointTree Root Node Error:" + treeSplit[0]);
continue;
}
for (int j = 1; j < treeSplit.Length; j++)
{
var treeName = treeSplit[j];
if (!node.childs.TryGetValue(treeName, out var tmpNode))
{
tmpNode = new RedPointNode
{
nodeName = treeName,
parentNode = node,
};
node.childs.Add(treeName, tmpNode);
}
node = tmpNode;
}
}
return rootNode;
}
#endregion
#region Unity
public static RedPointProxy Instance;
// Use this for initialization
private void Start()
{
Instance = this;
InitRedPointTreeNode();
}
bool _loadCompleted;
public override void ReadArchive()
{
_loadCompleted = true;
}
public override void UpdatePerSecond()
{
if (_loadCompleted && !GlobalVar.IsBattling)
UpdateRedPointTreeNode();
}
#endregion
}
}