using vnxbqy.UI;
|
using System;
|
using System.Collections.Generic;
|
using UnityEngine.UI;
|
using System.Linq;
|
using LitJson;
|
|
public class TTLBattlePassModel : ILModel<TTLBattlePassModel>
|
{
|
public byte TTLBuyState; //通天令是否已购买
|
public byte TTLLV; //通天令等级,从0开始
|
public uint CurPoint; //通天令当前等级经验积分点
|
public byte AwardStateCount; //等级领奖记录值数,每个值存31个记录 0-30, 31-61, ...
|
public uint[] CommAwardStateList = new uint[] { 0 }; //常规奖励领奖记录,按等级二进制位存储是否领奖
|
public uint[] XianAwardStateList = new uint[] { 0 }; //仙品奖励领奖记录,按等级二进制位存储是否领奖
|
public DateTime endDay; //本轮结束日
|
|
public int ttlScoreItemID = 720; //通天令积分物品ID
|
public event Action OnTTLInfoEvent;
|
public event Action OnTaskState;
|
public event Action SelectEvent;
|
|
private int m_SelectType;
|
public int selectType
|
{
|
get { return m_SelectType; }
|
set
|
{
|
m_SelectType = value;
|
SelectEvent?.Invoke();
|
}
|
|
}
|
protected override void Init()
|
{
|
GameEvent.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
|
ParseConfig();
|
}
|
|
protected override void UnInit()
|
{
|
GameEvent.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
|
}
|
|
public bool IsOpen()
|
{
|
if (!FuncOpen.Instance.IsFuncOpen(206))
|
return false;
|
|
//全部已领取后隐藏
|
if (GetAwardState(ILTongTianLVConfig.GetKeys().Count - 1, true))
|
{
|
return false;
|
}
|
|
return true;
|
}
|
|
public int scoreMoneyType; //购买积分
|
public int scoreMoneyValue;
|
public int ttlMoneyType; //购买通天令
|
public int ttlMoneyValue;
|
public int ttlCTGID; //通天令的CTGID, 由仙玉激活改成直购
|
public int dayScoreLimit; //日常的积分上限
|
public int roundDay; //x天重置通天令
|
|
void ParseConfig()
|
{
|
var config = FuncConfigConfig.Get("TongTianLing");
|
var arr = config.Numerical1.Split('|');
|
scoreMoneyType = int.Parse(arr[0]);
|
scoreMoneyValue = int.Parse(arr[1]);
|
|
var arr1 = JsonMapper.ToObject<int[]>(config.Numerical5);
|
if (arr1.Length != 0) ttlCTGID = arr1[0];
|
//arr = config.Numerical5.Split('|');
|
//ttlMoneyType = int.Parse(arr[0]);
|
//ttlMoneyValue = int.Parse(arr[1]);
|
|
dayScoreLimit = int.Parse(config.Numerical3);
|
roundDay = int.Parse(config.Numerical4);
|
ParseTask();
|
}
|
|
Redpoint redpoint = new Redpoint(MainRedPoint.TTLRedPoint);
|
Redpoint redpoint0 = new Redpoint(MainRedPoint.TTLRedPoint, MainRedPoint.TTLRedPoint * 10);
|
Redpoint redpoint1 = new Redpoint(MainRedPoint.TTLRedPoint, MainRedPoint.TTLRedPoint * 10 + 1);
|
Redpoint redpoint2 = new Redpoint(MainRedPoint.TTLRedPoint, MainRedPoint.TTLRedPoint * 10 + 2);
|
|
public void UpdateRedpoint()
|
{
|
redpoint0.state = RedPointState.None;
|
redpoint1.state = RedPointState.None;
|
redpoint2.state = RedPointState.None;
|
if (TTLBuyState == 1 && !GetAwardState(TTLLV, true))
|
{
|
redpoint0.state = RedPointState.Simple;
|
}
|
else if (!GetAwardState(TTLLV, false))
|
{
|
redpoint0.state = RedPointState.Simple;
|
}
|
|
if (dayScore < dayScoreLimit && normalTaskList.Count > 0 && IsTaskFinish(normalTaskList[0]) && !GetTaskState(normalTaskList[0]))
|
{
|
redpoint1.state = RedPointState.Simple;
|
}
|
|
if (hardTaskList.Count > 0 && IsTaskFinish(hardTaskList[0]) && !GetTaskState(hardTaskList[0]))
|
{
|
redpoint2.state = RedPointState.Simple;
|
}
|
}
|
|
void OnBeforePlayerDataInitialize()
|
{
|
taskProcess.Clear();
|
dayScore = 0;
|
}
|
|
public void UpdateTTLInfo(IL_HA356_tagMCTongTianLingInfo netPack)
|
{
|
TTLBuyState = netPack.TTLBuyState;
|
TTLLV = netPack.TTLLV;
|
CurPoint = netPack.CurPoint;
|
CommAwardStateList = netPack.CommAwardStateList;
|
XianAwardStateList = netPack.XianAwardStateList;
|
var startDay = TimeUtility.GetTime(netPack.StartTime);
|
endDay = TimeUtility.GetDayStartTime(startDay.Year, startDay.Month, startDay.Day).AddDays(roundDay);
|
UpdateRedpoint();
|
OnTTLInfoEvent?.Invoke();
|
}
|
|
//通天令奖励的领取情况
|
public bool GetAwardState(int lv, bool ishard)
|
{
|
var listIndex = lv / 31;
|
var bitIndex = lv % 31;
|
if (listIndex >= XianAwardStateList.Length || listIndex >= CommAwardStateList.Length)
|
return false;
|
if (ishard)
|
{
|
return ((int)Math.Pow(2, bitIndex) & (int)XianAwardStateList[listIndex]) != 0;
|
}
|
return ((int)Math.Pow(2, bitIndex) & (int)CommAwardStateList[listIndex]) != 0;
|
}
|
|
//按难度分组,此处任务的处理逻辑为,相同类型的任务为一组只显示最新的一个
|
//按类型和是否每日任务分字典(type*10 + daily):id
|
Dictionary<int, List<int>> normalTask = new Dictionary<int, List<int>>();
|
Dictionary<int, List<int>> hardTask = new Dictionary<int, List<int>>();
|
List<int> allNormalTaskList = new List<int>(); //包含堆叠不显示的
|
|
public Dictionary<int, int> taskProcess = new Dictionary<int, int>();
|
public uint[] taskAwardState;
|
public List<int> normalTaskList = new List<int>(); //用于显示
|
public List<int> hardTaskList = new List<int>();
|
public int dayScore = 0;
|
public void ParseTask()
|
{
|
normalTask.Clear();
|
hardTask.Clear();
|
allNormalTaskList.Clear();
|
var taskKeys = ILTongTianTaskConfig.GetKeys();
|
for (int i = 0; i < taskKeys.Count; i++)
|
{
|
var config = ILTongTianTaskConfig.Get(taskKeys[i]);
|
var key = config.TTTaskType * 10 + config.IsDailyTask;
|
if (config.IsHard == 0)
|
{
|
if (!normalTask.ContainsKey(key))
|
{
|
normalTask[key] = new List<int>();
|
}
|
normalTask[key].Add(config.TTTaskID);
|
}
|
else
|
{
|
if (!hardTask.ContainsKey(key))
|
{
|
hardTask[key] = new List<int>();
|
}
|
hardTask[key].Add(config.TTTaskID);
|
}
|
allNormalTaskList.Add(config.TTTaskID);
|
}
|
}
|
|
//1.筛选出一个正在进行的任务(未领取),或者全部已完成的最后一个
|
//内层:进行中/可领取的 值从小到大,已领取的从大到小
|
//外层:待领取的 进行中的 已领取的
|
//任务排序
|
void RefreshTask()
|
{
|
var keys = normalTask.Keys.ToList();
|
for (int i = 0; i < keys.Count; i++)
|
{
|
normalTask[keys[i]].Sort(SortTask);
|
}
|
|
keys = hardTask.Keys.ToList();
|
for (int i = 0; i < keys.Count; i++)
|
{
|
hardTask[keys[i]].Sort(SortTask);
|
}
|
|
normalTaskList.Clear();
|
keys = normalTask.Keys.ToList();
|
for (int i = 0; i < keys.Count; i++)
|
{
|
normalTaskList.Add(normalTask[keys[i]][0]);
|
}
|
normalTaskList.Sort(SortTaskEx);
|
|
hardTaskList.Clear();
|
keys = hardTask.Keys.ToList();
|
for (int i = 0; i < keys.Count; i++)
|
{
|
hardTaskList.Add(hardTask[keys[i]][0]);
|
}
|
hardTaskList.Sort(SortTaskEx);
|
|
UpdateRedpoint();
|
OnTaskState?.Invoke();
|
}
|
|
//相同类型任务组内的分类 进行中/可领取的 值从小到大,已领取的从大到小
|
int SortTask(int id1, int id2)
|
{
|
var config1 = ILTongTianTaskConfig.Get(id1);
|
var config2 = ILTongTianTaskConfig.Get(id2);
|
|
bool state1 = GetTaskState(id1);
|
bool state2 = GetTaskState(id2);
|
|
if (state1 != state2)
|
{
|
return state1.CompareTo(state2);
|
}
|
if (state1)
|
{
|
return config2.FinishNeedValue.CompareTo(config1.FinishNeedValue);
|
}
|
|
//可领取
|
return config1.FinishNeedValue.CompareTo(config2.FinishNeedValue);
|
|
}
|
|
//不同类型的任务 待领取的 进行中的 已领取的
|
int SortTaskEx(int id1, int id2)
|
{
|
bool state1 = GetTaskState(id1);
|
bool state2 = GetTaskState(id2);
|
|
if (state1 != state2)
|
{
|
return state1.CompareTo(state2);
|
}
|
|
if (!state1)
|
{
|
bool isFinish1 = IsTaskFinish(id1);
|
bool isFinish2 = IsTaskFinish(id2);
|
if (isFinish1 != isFinish2)
|
{
|
return isFinish2.CompareTo(isFinish1);
|
}
|
}
|
|
return id1.CompareTo(id2);
|
}
|
|
//任务积分是否已领取
|
public bool GetTaskState(int id)
|
{
|
var listIndex = id / 31;
|
var bitIndex = id % 31;
|
|
if (taskAwardState == null || listIndex >= taskAwardState.Length)
|
return false;
|
|
return ((int)Math.Pow(2, bitIndex) & (int)taskAwardState[listIndex]) != 0;
|
}
|
|
public int GetTaskProcess(int key)
|
{
|
if (taskProcess.ContainsKey(key))
|
{
|
return taskProcess[key];
|
}
|
|
return 0;
|
}
|
|
// 进度是否完成, 无关是否领取任务奖励
|
public bool IsTaskFinish(int id)
|
{
|
var config = ILTongTianTaskConfig.Get(id);
|
var key = config.TTTaskType * 10 + config.IsDailyTask;
|
return GetTaskProcess(key) >= config.FinishNeedValue;
|
}
|
|
public void UpdateTaskProcess(IL_HA357_tagMCTongTianLingTaskValueInfo netPack)
|
{
|
for (int i = 0; i < netPack.TaskValueList.Length; i++)
|
{
|
var key = netPack.TaskValueList[i].TaskType * 10 + netPack.TaskValueList[i].IsDaily;
|
taskProcess[key] = (int)netPack.TaskValueList[i].TaskValue;
|
}
|
RefreshTask();
|
}
|
|
public void UpdateTaskAwardState(IL_HA358_tagMCTongTianLingTaskAwardInfo netPack)
|
{
|
taskAwardState = netPack.TaskAwardStateList;
|
CalcDayScore();
|
RefreshTask();
|
}
|
|
//每日日常获得总积分
|
void CalcDayScore()
|
{
|
dayScore = 0;
|
for (int i = 0; i < allNormalTaskList.Count; i++)
|
{
|
var taskID = allNormalTaskList[i];
|
var config = ILTongTianTaskConfig.Get(taskID);
|
if (config.IsHard == 1)
|
continue;
|
if (GetTaskState(taskID))
|
{
|
dayScore += config.TaskPoint;
|
}
|
}
|
}
|
|
public List<ItemEx> buyItems = new List<ItemEx>();
|
|
//未激活仙品的显示锁, 购买等级内的不显示锁
|
public void GetItemsByBuyScore(int buylv)
|
{
|
buyItems.Clear();
|
//先显示仙品
|
for (int i = buylv; i > TTLLV; i--)
|
{
|
var config = ILTongTianLVConfig.Get(i);
|
var xitems = JsonMapper.ToObject<int[][]>(config.XianAwardItemList);
|
for (int j = 0; j < xitems.Length; j++)
|
{
|
buyItems.Add(new ItemEx()
|
{
|
id = xitems[j][0],
|
count = xitems[j][1],
|
bind = TTLBuyState == 1 ? 0 : 1, //用于显示锁
|
});
|
}
|
}
|
|
for (int i = buylv; i > TTLLV; i--)
|
{
|
var config = ILTongTianLVConfig.Get(i);
|
var nitems = JsonMapper.ToObject<int[][]>(config.CommAwardItemList);
|
for (int j = 0; j < nitems.Length; j++)
|
{
|
buyItems.Add(new ItemEx()
|
{
|
id = nitems[j][0],
|
count = nitems[j][1],
|
bind = 0, //用于显示锁
|
});
|
}
|
}
|
|
}
|
|
//等级不足的显示锁
|
public void GetItemsByBuyTTL()
|
{
|
buyItems.Clear();
|
for (int i = ILTongTianLVConfig.GetKeys().Count - 1; i >= 0; i--)
|
{
|
var config = ILTongTianLVConfig.Get(i);
|
var xitems = JsonMapper.ToObject<int[][]>(config.XianAwardItemList);
|
for (int j = 0; j < xitems.Length; j++)
|
{
|
buyItems.Add(new ItemEx()
|
{
|
id = xitems[j][0],
|
count = xitems[j][1],
|
bind = i > TTLLV ? 1:0, //用于显示锁
|
});
|
}
|
}
|
|
for (int i = ILTongTianLVConfig.GetKeys().Count - 1; i > TTLLV; i--)
|
{
|
var config = ILTongTianLVConfig.Get(i);
|
var nitems = JsonMapper.ToObject<int[][]>(config.CommAwardItemList);
|
for (int j = 0; j < nitems.Length; j++)
|
{
|
buyItems.Add(new ItemEx()
|
{
|
id = nitems[j][0],
|
count = nitems[j][1],
|
bind = i > TTLLV ? 1 : 0, //用于显示锁
|
});
|
}
|
}
|
}
|
|
}
|