using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using System;
|
|
namespace Snxxz.UI
|
{
|
|
|
public class SkyTowerModel : Model, IPlayerLoginOk, ISwitchAccount
|
{
|
public const int DATA_MAPID = 31370;
|
readonly static int REDPOINTID_01 = 21501;
|
readonly static int REDPOINTID_02 = 215;
|
readonly static int REDPOINTID_03 = 21503;
|
readonly static int FUNCTIONID = 164;
|
readonly static int REDPOINTID_04 = 21508; //天星塔挑战全服奖励
|
|
public bool allPassed {
|
get {
|
return IsTopFloor(highestPassFloor);
|
}
|
}
|
|
public int highestPassFloor { get; private set; }
|
public int currentFloor {
|
get {
|
if (IsTopFloor(highestPassFloor))
|
{
|
return highestPassFloor;
|
}
|
else
|
{
|
return highestPassFloor + 1;
|
}
|
}
|
}
|
|
bool redpointConfirm_01 = false;
|
bool redpointConfirm_02 = false;
|
bool redpointConfirm_03 = false;
|
|
public Redpoint redpoint01 = new Redpoint(REDPOINTID_01);
|
Redpoint redpoint02 = new Redpoint(REDPOINTID_02);
|
public Redpoint redpoint03 = new Redpoint(REDPOINTID_03);
|
public Redpoint redpoint04 = new Redpoint(REDPOINTID_01, REDPOINTID_04);
|
|
List<int> sortedFloors = new List<int>();
|
public List<int> ChallengeFloors = new List<int>();
|
public Dictionary<int, ChallengeInfo> ChallengeInfoFloors = new Dictionary<int, ChallengeInfo>();
|
public int challengeRewardRecord = 0;
|
public event Action OnChallengeState;
|
|
DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
|
|
|
public override void Init()
|
{
|
ParseConfig();
|
DTCA003_tagUniversalGameRecInfo.onGetUniversalGameInfo += OnGetUniversalGameInfo;
|
}
|
|
public override void UnInit()
|
{
|
ChallengeInfoFloors.Clear();
|
DTCA003_tagUniversalGameRecInfo.onGetUniversalGameInfo -= OnGetUniversalGameInfo;
|
}
|
|
public void RequestChallenge()
|
{
|
var error = GetErrorOfChallenge();
|
if (error == 0)
|
{
|
dungeonModel.RequestChallangeDungeon(DATA_MAPID, 0);
|
}
|
else
|
{
|
switch (error)
|
{
|
case 1:
|
break;
|
case 3:
|
SysNotifyMgr.Instance.ShowTip("FbLV", DATA_MAPID);
|
break;
|
default:
|
break;
|
}
|
}
|
}
|
|
public bool IsChallengable()
|
{
|
return GetErrorOfChallenge() == 0;
|
}
|
|
private int GetErrorOfChallenge()
|
{
|
if (!FuncOpen.Instance.IsFuncOpen(FUNCTIONID))
|
{
|
return 1;
|
}
|
|
if (allPassed)
|
{
|
return 2;
|
}
|
|
var config = SkyTowerConfig.Get(currentFloor);
|
if (PlayerDatas.Instance.baseData.LV < config.levelLimit)
|
{
|
return 3;
|
}
|
|
return 0;
|
}
|
|
public void RequestRefreshMonster()
|
{
|
var sendInfo = new CA508_tagCMDoFBAction();
|
sendInfo.ActionType = 0;
|
sendInfo.ActionInfo = (uint)currentFloor;
|
GameNetSystem.Instance.SendInfo(sendInfo);
|
}
|
|
public List<int> GetShowFloors()
|
{
|
var currentIndex = sortedFloors.IndexOf(currentFloor);
|
var floors = new List<int>();
|
|
if (currentIndex < 2)
|
{
|
for (var i = 0; i <= 4; i++)
|
{
|
floors.Add(sortedFloors[i]);
|
}
|
}
|
else if (currentIndex >= sortedFloors.Count - 2)
|
{
|
for (var i = sortedFloors.Count - 3; i <= sortedFloors.Count - 1; i++)
|
{
|
floors.Add(sortedFloors[i]);
|
}
|
}
|
else
|
{
|
for (var i = currentIndex - 2; i <= currentIndex + 2; i++)
|
{
|
floors.Add(sortedFloors[i]);
|
}
|
}
|
|
return floors;
|
}
|
|
public bool IsTopFloor(int floor)
|
{
|
return floor == sortedFloors[sortedFloors.Count - 1];
|
}
|
|
public bool IsBottomFloor(int floor)
|
{
|
return floor == sortedFloors[0];
|
}
|
|
public void UpdateHighestPassFloor(HB213_tagMCSkyTowerInfo info)
|
{
|
highestPassFloor = (int)info.Floor;
|
challengeRewardRecord = (int)info.ServerRewardRecord;
|
UpateRedpoint();
|
if (OnChallengeState != null)
|
OnChallengeState();
|
}
|
|
public void ConfirmRedpoint01()
|
{
|
redpointConfirm_01 = true;
|
UpateRedpoint();
|
}
|
|
public void ConfirmRedpoint02()
|
{
|
redpointConfirm_02 = true;
|
UpateRedpoint();
|
}
|
|
public void ConfirmRedpoint03()
|
{
|
redpointConfirm_03 = true;
|
UpateRedpoint();
|
}
|
|
public void OnPlayerLoginOk()
|
{
|
UpateRedpoint();
|
}
|
|
public void OnSwitchAccount()
|
{
|
redpointConfirm_01 = false;
|
redpointConfirm_02 = false;
|
redpointConfirm_03 = false;
|
}
|
|
private void UpateRedpoint()
|
{
|
var config = SkyTowerConfig.Get(currentFloor);
|
var challengable = IsChallengable() && PlayerDatas.Instance.baseData.FightPoint >= (ulong)NPCExConfig.Get(config.bossId).SuppressFightPower;
|
|
if (!redpointConfirm_01)
|
{
|
redpoint01.state = challengable ? RedPointState.Simple : RedPointState.None;
|
}
|
else
|
{
|
redpoint01.state = RedPointState.None;
|
}
|
|
if (!redpointConfirm_02)
|
{
|
redpoint02.state = challengable ? RedPointState.Simple : RedPointState.None;
|
}
|
else
|
{
|
redpoint02.state = RedPointState.None;
|
}
|
|
if (!redpointConfirm_03)
|
{
|
redpoint03.state = challengable ? RedPointState.Simple : RedPointState.None;
|
}
|
else
|
{
|
redpoint03.state = RedPointState.None;
|
}
|
|
UpdateChallengeInfoRedPoint();
|
}
|
|
private void ParseConfig()
|
{
|
var configs = SkyTowerConfig.GetKeys();
|
foreach (var item in configs)
|
{
|
sortedFloors.Add(int.Parse(item));
|
}
|
|
var challengeConfig = SkyTowerServerChallengeConfig.GetKeys();
|
foreach (var floorID in challengeConfig)
|
{
|
ChallengeFloors.Add(int.Parse(floorID));
|
}
|
ChallengeFloors.Sort();
|
}
|
|
public bool IsRecommendNextLevel()
|
{
|
if (!IsChallengable())
|
{
|
return false;
|
}
|
|
var config = SkyTowerConfig.Get(currentFloor);
|
if (PlayerDatas.Instance.baseData.FightPoint < (ulong)NPCExConfig.Get(config.bossId).SuppressFightPower)
|
{
|
return false;
|
}
|
|
return true;
|
}
|
|
private void UpdateChallengeInfoRedPoint()
|
{
|
redpoint04.state = RedPointState.None;
|
//challengeRewardRecord 和 ChallengeInfoFloors 红点,打开挑战最低一层
|
foreach (var floorInfo in ChallengeInfoFloors)
|
{
|
var config = SkyTowerServerChallengeConfig.Get(floorInfo.Key);
|
if (config == null)
|
continue;
|
if (((int)Mathf.Pow(2, config.rewardRecordIndex) & challengeRewardRecord) == 0)
|
{
|
//可领取
|
redpoint04.state = RedPointState.Simple;
|
return;
|
}
|
|
}
|
}
|
|
private void OnGetUniversalGameInfo(HA003_tagUniversalGameRecInfo package)
|
{
|
if (package.Type == 10)
|
{
|
for (int i = 0; i < package.Count; i++)
|
{
|
|
int floorID = (int)package.UniversalGameRec[i].Value1;
|
ChallengeInfoFloors[floorID] = new ChallengeInfo() {
|
Name = package.UniversalGameRec[i].StrValue1,
|
PlayerID = (int)package.UniversalGameRec[i].Value2,
|
LV = (int)package.UniversalGameRec[i].Value3,
|
Job = (int)package.UniversalGameRec[i].Value4,
|
Realm = (int)package.UniversalGameRec[i].Value5,
|
};
|
};
|
|
UpateRedpoint();
|
if (OnChallengeState != null)
|
OnChallengeState();
|
}
|
|
}
|
|
|
//指定层挑战记录
|
public ChallengeInfo GetChallengeFloorInfo(int floorID)
|
{
|
if (ChallengeInfoFloors.ContainsKey(floorID))
|
{
|
return ChallengeInfoFloors[floorID];
|
}
|
return new ChallengeInfo();
|
}
|
|
public struct ChallengeInfo
|
{
|
public string Name;
|
public int PlayerID;
|
public int LV;
|
public int Job;
|
public int Realm;
|
}
|
}
|
}
|