using Snxxz.UI;
|
using System;
|
using System.Collections.Generic;
|
|
using LitJson;
|
using UnityEngine;
|
using System.Collections;
|
using System.Linq;
|
|
[XLua.LuaCallCSharp]
|
public class HeavenBattleModel : Model,IBeforePlayerDataInitialize,IAfterPlayerDataInitialize,IPlayerLoginOk
|
{
|
public const int HEAVEBATTLE_MAPID = 31010;
|
public const int HEAVEBATTLE_TargetID = 38;
|
public const int HeavenBattleDailyId = 14;
|
DailyQuestConfig dailyConfig;
|
public Dictionary<int,List<XMZZVictoryRewardInfo>> heavenAwardDict { get; private set; }
|
public Dictionary<int, ItemCellModel> campVicRewardDict { get; private set; }
|
public Dictionary<int, ItemCellModel> campFailRewardDict { get; private set; }
|
public event Action<int> RefreshGameRecInfoAct;
|
|
DungeonModel m_DungeonModel;
|
DungeonModel dungeonModel
|
{
|
get
|
{
|
return m_DungeonModel ?? (m_DungeonModel = ModelCenter.Instance.GetModel<DungeonModel>());
|
}
|
}
|
|
DailyQuestModel dailyQuestModel { get { return ModelCenter.Instance.GetModel<DailyQuestModel>(); } }
|
public float battlePrepareTime { get; private set; }
|
public string[] heavenBattleTargets;
|
public bool IsBattlePrepare { get;set;}
|
private List<XMZZAchievementConfig> achieveConfiglist;
|
|
|
AchievementModel _achieveModel;
|
public AchievementModel AchieveModel
|
{
|
get
|
{
|
return _achieveModel ?? (_achieveModel = ModelCenter.Instance.GetModel<AchievementModel>());
|
}
|
}
|
|
public override void Init()
|
{
|
FuncConfigConfig heavenAwardConfig = FuncConfigConfig.Get("XMZZAward");
|
JsonData xmzzVicRewardData = JsonMapper.ToObject(heavenAwardConfig.Numerical1);
|
heavenAwardDict = new Dictionary<int, List<XMZZVictoryRewardInfo>>();
|
foreach(var key in xmzzVicRewardData.Keys)
|
{
|
List<XMZZVictoryRewardInfo> infolist = new List<XMZZVictoryRewardInfo>();
|
heavenAwardDict.Add(int.Parse(key),infolist);
|
if (xmzzVicRewardData[key].IsArray)
|
{
|
for(int i = 0; i < xmzzVicRewardData[key].Count; i++)
|
{
|
JsonData rewardInfo = xmzzVicRewardData[key][i];
|
if(rewardInfo.IsArray)
|
{
|
for(int j = 0; j < rewardInfo.Count;j++)
|
{
|
XMZZVictoryRewardInfo info = new XMZZVictoryRewardInfo(int.Parse(rewardInfo[0].ToString()),
|
int.Parse(rewardInfo[1].ToString()),int.Parse(rewardInfo[2].ToString()));
|
infolist.Add(info);
|
|
}
|
}
|
}
|
}
|
}
|
JsonData campAwardData = JsonMapper.ToObject(heavenAwardConfig.Numerical3);
|
campVicRewardDict = new Dictionary<int, ItemCellModel>();
|
if(campAwardData.IsArray)
|
{
|
for (int i = 0;i < campAwardData.Count;i++)
|
{
|
if (campAwardData[i].IsArray)
|
{
|
JsonData campData = campAwardData[i];
|
int itemId = int.Parse(campAwardData[i][0].ToString());
|
int itemCnt = int.Parse(campAwardData[i][1].ToString());
|
int isBind = int.Parse(campAwardData[i][2].ToString());
|
ItemCellModel cellModel = new ItemCellModel(itemId, true, (ulong)itemCnt);
|
campVicRewardDict.Add(itemId,cellModel);
|
|
}
|
}
|
}
|
|
|
JsonData campfailAwardData = JsonMapper.ToObject(heavenAwardConfig.Numerical4);
|
campFailRewardDict = new Dictionary<int, ItemCellModel>();
|
if (campfailAwardData.IsArray)
|
{
|
for (int i = 0; i < campfailAwardData.Count; i++)
|
{
|
if (campfailAwardData[i].IsArray)
|
{
|
JsonData campData = campfailAwardData[i];
|
int itemId = int.Parse(campfailAwardData[i][0].ToString());
|
int itemCnt = int.Parse(campfailAwardData[i][1].ToString());
|
int isBind = int.Parse(campfailAwardData[i][2].ToString());
|
ItemCellModel cellModel = new ItemCellModel(itemId, true, (ulong)itemCnt);
|
campFailRewardDict.Add(itemId, cellModel);
|
|
}
|
}
|
}
|
|
dailyConfig = DailyQuestConfig.Get("14");
|
|
DungeonHintConfig hintConfig = DungeonHintConfig.Get(HEAVEBATTLE_TargetID);
|
heavenBattleTargets = hintConfig.targetDescription1;
|
|
achieveConfiglist = XMZZAchievementConfig.GetValues();
|
SetAchieveRedPoint();
|
|
WindowCenter.Instance.windowAfterCloseEvent += ClosePrepareCool;
|
}
|
|
private void SetBetTime(string betTime,List<int> timelist)
|
{
|
string[] betTimeArray = betTime.Split(':');
|
for(int i = 0; i < betTimeArray.Length; i++)
|
{
|
timelist.Add(int.Parse(betTimeArray[i]));
|
}
|
}
|
|
public void OnBeforePlayerDataInitialize()
|
{
|
PlayerPrefs.DeleteKey(DTCA127_tagMCStartChangeMap.RECORDPREMAPID_KEY);
|
IsBattlePrepare = false;
|
HeavenBattleInfo.Instance.ResetModel();
|
GameRecInfoDict.Clear();
|
AchieveModel.achievementAwardableEvent -= RefreshAchieveState;
|
AchieveModel.achievementCompletedEvent -= RefreshAchieveState;
|
StageLoad.Instance.onStageLoadFinish -= OnLoadMapFinish;
|
}
|
|
public void OnAfterPlayerDataInitialize()
|
{
|
|
}
|
|
|
public void OnPlayerLoginOk()
|
{
|
AchieveModel.achievementProgressUpdateEvent += RefreshAchieveState;
|
AchieveModel.achievementCompletedEvent += RefreshAchieveState;
|
StageLoad.Instance.onStageLoadFinish += OnLoadMapFinish;
|
AchieveRedPointCtrl();
|
}
|
public override void UnInit()
|
{
|
WindowCenter.Instance.windowAfterCloseEvent -= ClosePrepareCool;
|
}
|
|
private void OnLoadMapFinish()
|
{
|
bool isHasKey = PlayerPrefs.HasKey(DTCA127_tagMCStartChangeMap.RECORDPREMAPID_KEY);
|
if (!isHasKey) return;
|
|
if(LocalSave.GetInt(DTCA127_tagMCStartChangeMap.RECORDPREMAPID_KEY) == HEAVEBATTLE_MAPID)
|
{
|
if(dailyQuestModel.GetQuestState(dailyConfig.ID) != DailyQuestModel.DailyQuestState.OutTime)
|
{
|
if (!WindowCenter.Instance.IsOpen<HeavenBattleWin>() && GetActivityRemainTime() > 0)
|
{
|
var config = DailyQuestConfig.Get(dailyConfig.ID);
|
dungeonModel.currentDungeon = new Dungeon(config.RelatedID, 0);
|
WindowCenter.Instance.Open<HeavenBattleWin>();
|
}
|
}
|
PlayerPrefs.DeleteKey(DTCA127_tagMCStartChangeMap.RECORDPREMAPID_KEY);
|
}
|
}
|
|
#region 处理服务端数据
|
|
public event Action RefreshBattleInfoAct;
|
public event Action RefreshPlayerBattleInfoAct;
|
|
public void SetHeavenBattleModel(HAC02_tagGCXMZZInfo info)
|
{
|
HeavenBattleInfo.Instance.SetHeavenBattleInfo(info);
|
if(RefreshBattleInfoAct != null)
|
{
|
RefreshBattleInfoAct();
|
}
|
}
|
|
public void SetHeavenBattlePlayerModel(HAC03_tagGCXMZZSelfInfo info)
|
{
|
HeavenBattleInfo.Instance.SetHeavenBattlePlayerInfo(info);
|
if (RefreshPlayerBattleInfoAct != null)
|
{
|
RefreshPlayerBattleInfoAct();
|
}
|
}
|
|
public void SetBattleStart()
|
{
|
battlePrepareTime = 3;
|
IsBattlePrepare = true;
|
}
|
|
public event Action<int> RefreshBattlePrepareTimeAct;
|
|
private void ClosePrepareCool(Window win)
|
{
|
if (win.name != "BattlePrepareCoolDownWin") return;
|
|
IsBattlePrepare = false;
|
}
|
|
/// <summary>
|
/// 发送报名请求
|
/// </summary>
|
public void SendSignQuest()
|
{
|
CAC01_tagCGJoinXMZZ join = new CAC01_tagCGJoinXMZZ();
|
GameNetSystem.Instance.SendInfo(join);
|
}
|
|
/// <summary>
|
/// 发送押注请求
|
/// </summary>
|
public void SendBettingQuest(int betIndex,int camp)
|
{
|
CAB03_tagCMXMZZBet bet = new CAB03_tagCMXMZZBet();
|
bet.BetIndex = (byte)betIndex;
|
bet.BetResult = (byte)camp;
|
GameNetSystem.Instance.SendInfo(bet);
|
}
|
|
public void SendGetAwardQuest(int victoryCnt)
|
{
|
CA504_tagCMPlayerGetReward getReward = new CA504_tagCMPlayerGetReward();
|
getReward.RewardType = (byte)GotServerRewardType.Def_RewardType_XMZZWinCnt;
|
getReward.DataEx = (uint)victoryCnt;
|
getReward.DataExStrLen = 0;
|
getReward.DataExStr = string.Empty;
|
GameNetSystem.Instance.SendInfo(getReward);
|
}
|
|
/// <summary>
|
/// 获取仙魔之争阵营积分
|
/// </summary>
|
public void SendCampSoreQuest()
|
{
|
CAC03_tagCGXMZZInfoQuery infoQuery = new CAC03_tagCGXMZZInfoQuery();
|
GameNetSystem.Instance.SendInfo(infoQuery);
|
}
|
|
public void SendBattleInfoQuest()
|
{
|
CA001_tagViewUniversalGameRec gameRec = new CA001_tagViewUniversalGameRec();
|
gameRec.ViewType = 0;
|
GameNetSystem.Instance.SendInfo(gameRec);
|
}
|
|
public void RefreshBattleInfo(HA003_tagUniversalGameRecInfo info)
|
{
|
SetBatterInfoList(info);
|
if(RefreshGameRecInfoAct != null)
|
{
|
RefreshGameRecInfoAct(info.Type);
|
}
|
}
|
|
private Dictionary<int, List<GameRecInfo>> GameRecInfoDict = new Dictionary<int, List<GameRecInfo>>();
|
|
private void SetBatterInfoList(HA003_tagUniversalGameRecInfo info)
|
{
|
GameRecInfoDict.Clear();
|
if (!GameRecInfoDict.ContainsKey(info.Type))
|
{
|
List<GameRecInfo> list = new List<GameRecInfo>();
|
GameRecInfoDict.Add(info.Type, list);
|
}
|
|
for (int i = 0; i < info.Count; i++)
|
{
|
GameRecInfo recInfo = new GameRecInfo((int)info.UniversalGameRec[i].Time, info.UniversalGameRec[i].StrValue1,
|
info.UniversalGameRec[i].StrValue2, info.UniversalGameRec[i].StrValue3, (int)info.UniversalGameRec[i].Value1,
|
(int)info.UniversalGameRec[i].Value2, (int)info.UniversalGameRec[i].Value3, (int)info.UniversalGameRec[i].Value4,
|
(int)info.UniversalGameRec[i].Value5);
|
|
GameRecInfoDict[info.Type].Add(recInfo);
|
}
|
|
}
|
|
public List<GameRecInfo> GetBatterInfoListByType(int type)
|
{
|
List<GameRecInfo> recInfo = null;
|
GameRecInfoDict.TryGetValue(type,out recInfo);
|
return recInfo;
|
}
|
|
#endregion
|
|
public int GetActivityRemainTime()
|
{
|
DailyQuestOpenTime openTime = null;
|
bool isActivity = dailyQuestModel.TryGetOpenTime(HeavenBattleDailyId,out openTime);
|
if(isActivity)
|
{
|
List<HourMinute> hourMinutes = openTime.GetHourMinuteByWeek((int)TimeUtility.ServerNow.DayOfWeek);
|
if(hourMinutes != null && hourMinutes.Count > 0)
|
{
|
HourMinute hourMinute = hourMinutes[0];
|
DateTime endTime = new DateTime(TimeUtility.ServerNow.Year,TimeUtility.ServerNow.Month, TimeUtility.ServerNow.Day,
|
hourMinute.hourEnd,hourMinute.minuteEnd,0);
|
DateTime startTime = new DateTime(TimeUtility.ServerNow.Year, TimeUtility.ServerNow.Month, TimeUtility.ServerNow.Day,
|
hourMinute.hourBegin, hourMinute.minuteBegin, 0);
|
int advanceSec = Mathf.CeilToInt((float)(startTime - TimeUtility.ServerNow).TotalSeconds);
|
int endSec = Mathf.CeilToInt((float)(endTime - TimeUtility.ServerNow).TotalSeconds);
|
if(advanceSec > 0)
|
{
|
return 0;
|
}
|
else if(endSec <= 0)
|
{
|
return 0;
|
}
|
else
|
{
|
return endSec;
|
}
|
|
}
|
|
}
|
return 0;
|
}
|
|
#region 仙魔之争成就
|
|
private List<XMZZAchievementConfig> orderlist = new List<XMZZAchievementConfig>();
|
public List<XMZZAchievementConfig> GetAchievelist()
|
{
|
orderlist.Clear();
|
orderlist.AddRange(achieveConfiglist);
|
orderlist.Sort(CompareTaskState);
|
return orderlist;
|
}
|
|
private int CompareTaskState(XMZZAchievementConfig start, XMZZAchievementConfig next)
|
{
|
Achievement startAchieve = null;
|
SetAchievement(start.AchieveID, out startAchieve);
|
Achievement nextAchieve = null;
|
SetAchievement(next.AchieveID, out nextAchieve);
|
|
bool x = IsReachAchieve(startAchieve);
|
bool y = IsReachAchieve(nextAchieve);
|
if (x.CompareTo(y) != 0) return -x.CompareTo(y);
|
|
x = startAchieve.completed ? true:false;
|
y = nextAchieve.completed ? true: false;
|
if (x.CompareTo(y) != 0) return x.CompareTo(y);
|
|
int orderx = achieveConfiglist.IndexOf(start);
|
int ordery = achieveConfiglist.IndexOf(next);
|
if (orderx.CompareTo(ordery) != 0) return orderx.CompareTo(ordery);
|
|
return 0;
|
}
|
|
public int SetAchievement(int[] idlist, out Achievement achieve)
|
{
|
achieve = null;
|
int k = 0;
|
for (k = 0; k < idlist.Length; k++)
|
{
|
if (AchieveModel.TryGetAchievement(idlist[k], out achieve))
|
{
|
if (!achieve.completed)
|
{
|
return k;
|
}
|
else
|
{
|
if (idlist[idlist.Length - 1] == achieve.id)
|
{
|
return idlist.Length;
|
}
|
}
|
}
|
}
|
return -1;
|
|
}
|
|
public bool IsReachAchieve(Achievement achieve)
|
{
|
if (achieve == null) return false;
|
bool isReach = false;
|
|
if (!achieve.completed)
|
{
|
if (Achievement.IsReach(achieve.id, achieve.progress))
|
{
|
isReach = true;
|
}
|
}
|
return isReach;
|
}
|
|
#region 红点逻辑
|
public const int RedPoint_XMZZAchieve_Key = 500001;
|
public Redpoint XMZZAchieveRed = new Redpoint(RedPoint_XMZZAchieve_Key);
|
|
private Dictionary<int, Redpoint> achieveRedPointDict = new Dictionary<int, Redpoint>(); //id 流水号
|
private void SetAchieveRedPoint()
|
{
|
achieveRedPointDict.Clear();
|
if (achieveConfiglist == null) return;
|
|
for (int i = 0; i < achieveConfiglist.Count; i++)
|
{
|
int id = RedPoint_XMZZAchieve_Key * 1000 + i;
|
Redpoint redpoint = new Redpoint(RedPoint_XMZZAchieve_Key, id);
|
achieveRedPointDict.Add(achieveConfiglist[i].ID, redpoint);
|
}
|
}
|
|
private void SetAchieveRedParent()
|
{
|
if (dailyQuestModel.GetQuestState(dailyConfig.ID) != DailyQuestModel.DailyQuestState.Normal) return;
|
}
|
|
public void AchieveRedPointCtrl()
|
{
|
if (achieveConfiglist == null || !FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.TouchSky)) return;
|
|
if (dailyQuestModel.GetQuestState(dailyConfig.ID) != DailyQuestModel.DailyQuestState.Normal) return;
|
|
for (int i = 0; i < achieveConfiglist.Count; i++)
|
{
|
Achievement achieve = null;
|
SetAchievement(achieveConfiglist[i].AchieveID, out achieve);
|
|
if (IsReachAchieve(achieve))
|
{
|
achieveRedPointDict[achieveConfiglist[i].ID].state = RedPointState.Simple;
|
}
|
else
|
{
|
achieveRedPointDict[achieveConfiglist[i].ID].state = RedPointState.None;
|
}
|
}
|
SetHeavenBattleDailyRed();
|
}
|
|
public void RefreshAchieveState(int id)
|
{
|
if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.TouchSky)) return;
|
|
if (dailyQuestModel.GetQuestState(dailyConfig.ID) != DailyQuestModel.DailyQuestState.Normal) return;
|
|
if (achieveConfiglist != null)
|
{
|
for (int i = 0; i < achieveConfiglist.Count; i++)
|
{
|
if (achieveConfiglist[i].AchieveID.Contains(id))
|
{
|
Achievement achieve = null;
|
SetAchievement(achieveConfiglist[i].AchieveID, out achieve);
|
|
if (IsReachAchieve(achieve))
|
{
|
achieveRedPointDict[achieveConfiglist[i].ID].state = RedPointState.Simple;
|
}
|
else
|
{
|
achieveRedPointDict[achieveConfiglist[i].ID].state = RedPointState.None;
|
}
|
SetHeavenBattleDailyRed();
|
}
|
}
|
}
|
}
|
|
public void SetHeavenBattleDailyRed()
|
{
|
DailyQuestData questData = null;
|
dailyQuestModel.TryGetDailyQuest(dailyConfig.ID, out questData);
|
var completedTimes = dailyQuestModel.GetDailyQuestCompletedTimes(questData.id);
|
var totalTimes = dailyQuestModel.GetDailyQuestTotalTimes(questData.id);
|
if (completedTimes >= totalTimes)
|
{
|
questData.redpoint.state = XMZZAchieveRed.state;
|
}
|
}
|
#endregion
|
|
#endregion
|
}
|
|
public struct WeekTime
|
{
|
public int dayOfWeek { get; private set; }
|
public int startHour { get; private set; }
|
public int startMinute { get; private set; }
|
public int startSeconds { get; private set; }
|
public int endHour { get; private set; }
|
public int endMinute { get; private set; }
|
|
public WeekTime(int _weekDay, int _startHour, int _startMinute, int _endHour, int _endMinute, int _startSeconds = 0)
|
{
|
dayOfWeek = _weekDay;
|
startHour = _startHour;
|
startMinute = _startMinute;
|
startSeconds = _startSeconds;
|
endHour = _endHour;
|
endMinute = _endMinute;
|
}
|
public static TimeSpan operator -(WeekTime y, WeekTime x)
|
{
|
var _totalSeconds = 0;
|
int i = x.dayOfWeek;
|
for (i = x.dayOfWeek; i != y.dayOfWeek; i = i == 7 ? 1 : i + 1)
|
{
|
if (i == x.dayOfWeek)
|
{
|
_totalSeconds += (23 - x.startHour) * 3600 + (59 - x.startMinute) * 60 + 60 - x.startSeconds;
|
}
|
else
|
{
|
_totalSeconds += 24 * 3600;
|
}
|
}
|
if (i == y.dayOfWeek)
|
{
|
if (x.dayOfWeek == i)
|
{
|
var _timeSpany = new TimeSpan(y.startHour, y.startMinute, y.startSeconds);
|
var _timeSpanx = new TimeSpan(x.startHour, x.startMinute, x.startSeconds);
|
_totalSeconds += (int)(_timeSpany.TotalSeconds - _timeSpanx.TotalSeconds);
|
}
|
else
|
{
|
_totalSeconds += y.startHour * 3600;
|
}
|
}
|
return new TimeSpan(_totalSeconds * TimeSpan.TicksPerSecond);
|
}
|
|
private static WeekTime s_Now = new WeekTime();
|
public static WeekTime Now
|
{
|
get
|
{
|
var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
|
s_Now.dayOfWeek = _dayOfWeek;
|
s_Now.startHour = TimeUtility.Hour;
|
s_Now.startMinute = TimeUtility.Minute;
|
s_Now.startSeconds = TimeUtility.Second;
|
return s_Now;
|
}
|
}
|
}
|
|
public enum HeavenBattleState
|
{
|
None,
|
BettingStart, //前往投注
|
BattleStart, //活动开始
|
BattleEnd, //活动结束
|
}
|
|
public class GameRecInfo
|
{
|
public int Time { get; private set; } //时间
|
public string StrValue1 { get; private set; }
|
public string StrValue2 { get; private set; }
|
public string StrValue3 { get; private set; }
|
public int Value1 { get; private set; } //数值1
|
public int Value2 { get; private set; } //数值1
|
public int Value3 { get; private set; } //数值1
|
public int Value4 { get; private set; } //数值1
|
public int Value5 { get; private set; } //数值1
|
public ArrayList value3list;
|
|
public GameRecInfo(int time,string str1,string str2,string str3,int value1,int value2,int value3,int value4,int value5)
|
{
|
this.Time = time;
|
this.StrValue1 = str1;
|
this.StrValue2 = str2;
|
this.StrValue3 = str3;
|
this.Value1 = value1;
|
this.Value2 = value2;
|
this.Value3 = value3;
|
this.Value4 = value4;
|
this.Value5 = value5;
|
value3list = SetArrayList(str3);
|
}
|
|
private ArrayList SetArrayList(string s)
|
{
|
string[] array = ConfigParse.GetMultipleStr(s);
|
ArrayList arrayList = new ArrayList();
|
if(array != null)
|
{
|
for (int i = 0; i < array.Length; i++)
|
{
|
arrayList.Add(array[i]);
|
}
|
}
|
|
return arrayList;
|
}
|
}
|
|
public struct XMZZVictoryRewardInfo
|
{
|
public int itemId { get; private set;}
|
public int itemCnt { get; private set; }
|
public int isBind { get; private set; }
|
|
public XMZZVictoryRewardInfo(int id,int count,int isBind)
|
{
|
this.itemId = id;
|
this.itemCnt = count;
|
this.isBind = isBind;
|
}
|
}
|