Files
back_cantanBuilding/Assets/Scripts/DataCenter/RodSelectionPackData.cs
2026-05-26 16:15:54 +08:00

237 lines
9.4 KiB
C#

using UnityEngine;
using asap.core;
using cfg;
using GameCore;
using System;
using System.Collections.Generic;
using UnityEngine.Assertions;
public class RodSelectionPackData
{
private GeneralEventPackData _data;
private readonly TbEventPackManager _epm = GContext.container.Resolve<Tables>().TbEventPackManager;
private readonly Tables _tables = GContext.container.Resolve<Tables>();
private readonly PlayerFishData _pfd = GContext.container.Resolve<PlayerFishData>();
private TbRodData _rodData = GContext.container.Resolve<Tables>().TbRodData;
private TbRodLevelup _rodLvlUp = GContext.container.Resolve<Tables>().TbRodLevelup;
private readonly TbRodAscend _rodAscend = GContext.container.Resolve<Tables>().TbRodAscend;
private readonly TbSpecialPack _spp = GContext.container.Resolve<Tables>().TbSpecialPack;
private readonly PlayerItemData _pid = GContext.container.Resolve<PlayerItemData>();
private readonly TbDrop _drop = GContext.container.Resolve<Tables>().TbDrop;
private readonly TbItem _item = GContext.container.Resolve<Tables>().TbItem;
public int CurrentEventID => _data.currentEventID;
public TimeSpan RemainingTime =>
DateTime.Parse((_tables.TbFishingEvent[_data.currentEventID].TimeDefinition as LimitedTime).EndTime) -
ZZTimeHelper.UtcNow();
public bool IsWithinEventTime
{
get
{
if (CurrentEventID == 0) return false;
return RemainingTime.TotalSeconds > 0;
}
}
public bool IsPackActivated
{
get
{
bool res = _tables.TbFishingEvent.DataMap.ContainsKey(_data.currentEventID)
&& _epm.DataMap.ContainsKey(_data.redirectID)
&& _epm[_data.redirectID].PackType == 4
&& IsWithinEventTime
&& _data.purchaseCount < _epm[_data.redirectID].MaxCount;
/*Debug.Log(_tables.TbFishingEvent.DataMap.ContainsKey(_data.currentEventID));
Debug.Log(_epm.DataMap.ContainsKey(_data.redirectID));
Debug.Log(_epm[_data.redirectID].PackType == 3);
Debug.Log(IsWithinEventTime);
Debug.Log(_data.isTriggered);
Debug.Log(_data.purchaseCount < _epm[_data.redirectID].MaxCount);*/
return res;
}
}
public int RedirectID => _data.redirectID;
private List<int> PackList => _epm[_data.redirectID].VIPPackList[0];
public List<int> PackRodList =>
_drop[_item[_drop[_epm[_data.redirectID].VIPPackList[0][0]].DropList.DropIDList[0]].RedirectID].DropList
.DropIDList;
public List<ItemData> RewardList
{
get
{
Assert.AreNotEqual(_data.rodID, -1, "Default rod not found. Maybe loot pool is empty.");
var rewards = _pid.GetItemDataByDropId(_spp[_data.packID].DropID[0]);
rewards[0] = new ItemData(_data.rodID, (int)rewards[0].count);
return rewards;
}
}
public int DropID => _spp[_data.packID].DropID[0];
public int PurchaseCount => _data.purchaseCount;
public int MaxPurchaseCount => _epm[RedirectID].MaxCount;
public int IAPID => _spp[_data.packID].IAPID[0];
public int RodID { get => _data.rodID; set => _data.rodID = value; }
public int FragmentID => _rodAscend[_item[RodID].RedirectID].FragmentID;
public void SaveData()
{
//Debug.LogError("Testing, data not saved for debug purpose.");
PlayFabMgr.Instance.UpdateUserDataValue("GeneralEventPackData",
Newtonsoft.Json.JsonConvert.SerializeObject(_data));
}
public void LoadData(GeneralEventPackData data)
{
_data = data;
if (IsPackActivated)
{
GContext.container.Resolve<IFaceUIService>().AddGiftFaceUI(_data.currentEventID,
UITypes.GiftRodSelectionPopupPanel, _epm[RedirectID].PackType, true);
}
}
public bool UpdateData(FishingEvent e)
{
if (_epm[_tables.TbFishingEvent[e.ID].RedirectID].PackType != 4)
{
Debug.LogError($"Fishing event ID {e.ID} is not a rod-select pack event");
return false;
}
if (_data.currentEventID != e.ID)
{
GeneralEventPackData oldData = _data;
int r = GetDefaultRodID(e);
_data = new GeneralEventPackData(
eventID: e.ID,
redirectID: e.RedirectID,
rodID: r,
lastPackIDBought: oldData.lastPackIDBought,
packID: GetPackID(oldData.lastPackIDBought, r, e),
purchaseCount: 0);
SaveData();
return true;
}
return false;
}
int star, fragCount, lvl;
private int GetDefaultRodID(FishingEvent e)
{
int defaultRodID, rid;
List<int> rodsInPack =
_drop[_item[_drop[_epm[e.RedirectID].VIPPackList[0][0]].DropList.DropIDList[0]].RedirectID].DropList.DropIDList;
defaultRodID = rodsInPack[0];
foreach (var rod in rodsInPack)
{
rid = _item[rod].RedirectID;
GetRodActualStats(rod, out star, out fragCount, out lvl);
//bool a = !_pfd.NotRod(rid);
//int b = _pfd.GetRodPiece(rid);
//int c = _rodAscend[rid].MaxAscent;
if (!_pfd.NotRod(rid) && star < _rodAscend[rid].MaxAscent)
{
defaultRodID = rod;
break;
}
}
GetRodActualStats(defaultRodID, out star, out fragCount, out lvl);
foreach (var rod in rodsInPack)
{
int currentStar, currentFragCount, currentLvl;
//if (defaultRodID == rodsInPack[0])
// defaultRodID = rod;
rid = _item[rod].RedirectID;
GetRodActualStats(rod, out currentStar, out currentFragCount, out currentLvl);
//Debug.Log($"{rod} debug!!!!!!!!!!!!!");
//Debug.Log(!_pfd.NotRod(rid));
//Debug.Log(_pfd.GetRodPiece(rid) < _rodAscend[rid].MaxAscent);
//Debug.Log(_pfd.GetRodPiece(rid) > _pfd.GetRodPiece(GetRodRedirectID(defaultRodID)));
if (!_pfd.NotRod(rid)//if player has this rod, its not fully enhanced and has higher stars than current
&& currentStar < _rodAscend[rid].MaxAscent
&& currentLvl > lvl)
{
defaultRodID = rod;
GetRodActualStats(defaultRodID, out star, out fragCount, out lvl);
}
}
return defaultRodID;
}
private int GetPackID(int lastPack, int defaultRodID, FishingEvent e = null)
{
List<int> packList;
if (e != null)
packList = _epm[e.RedirectID].VIPPackList[0];
else
packList = PackList;
GetRodActualStats(defaultRodID, out star, out fragCount, out lvl);
if (_pfd.NotRod(GetRodRedirectID(defaultRodID))
|| star >= _rodAscend[GetRodRedirectID(defaultRodID)].MaxAscent)
{
return packList[0] > lastPack - 1 ? packList[0] : lastPack - 1;
}
//int starLvl = _pfd.GetRodPiece(GetRodRedirectID(defaultRodID));
int fragmentID = _rodAscend[GetRodRedirectID(defaultRodID)].FragmentID;
//int fragCount = _pfd.GetRodPiece(fragmentID);
//int nextLvlStarPieces =
// _rodAscend[GetRodRedirectID(defaultRodID)].AscentTransformed[star + 1] - fragCount;
foreach (int packID in packList)
{
if (fragCount <= _spp[packID].EventItemRequire[0])
{
return packID > lastPack - 1 ? packID : lastPack - 1;
}
}
Debug.LogWarning($"Get Pack ID error. Rod {defaultRodID} is neither owned nor needing enhancement.");
return packList[0] > lastPack - 1 ? packList[0] : lastPack - 1;
}
public void AddPurchase()
{
_data.purchaseCount++;
_data.lastPackIDBought = _data.packID;
SaveData();
}
private int GetRodRedirectID(int rodItemID)
{
return _item[rodItemID].RedirectID;
}
/// <summary>
/// Get potential level and frags needed for next level of a rod.
/// </summary>
/// <param name="rodID">Rod id in Item table</param>
/// <param name="actualStar">The potential star after spending all the fragments</param>
/// <param name="actualNextStarFrag">Fragments needed for next level. Means nothing
/// if actualStar reaches maximum enhancement</param>
/// <param name="level">Get Actual rod level</param>
private void GetRodActualStats(int rodID, out int actualStar, out int actualNextStarFrag, out int level)
{
Assert.IsTrue(_item.DataMap.ContainsKey(rodID));
int rid = _item[rodID].RedirectID;
int star = _pfd.GetRodPiece(rid);
int lvl = _pfd.GetRodLevel(rid);
if (star >= _rodAscend[rid].MaxAscent)
{
actualStar = star;
actualNextStarFrag = 0;
level = lvl;
return;
}
int fragID = _rodAscend[rid].FragmentID;
int fragCount = _pfd.GetRodPiece(fragID);
int nextStarFrag = _rodAscend[rid].AscentTransformed[star + 1];
while (fragCount >= nextStarFrag)
{
fragCount -= nextStarFrag;
star++;
if (star >= _rodAscend[rid].MaxAscent)
{
//nextStarFrag = 0;
break;
}
nextStarFrag = _rodAscend[rid].AscentTransformed[star + 1];
}
actualStar = star;
actualNextStarFrag = nextStarFrag - fragCount;
level = lvl;
return;
}
}