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

327 lines
9.5 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using GameCore;
using asap.core;
using System.Linq;
public class EventGatherCoreData : IHasChainPack
{
/// <summary>
/// How many stages has been played.
/// </summary>
private int _ticketCount, _stageCount, _eventId, _chainProgress;
public int StageCount => _stageCount;
public int TicketCount => _ticketCount;
public int EventId => _eventId;
public EventGatherCoreStageData StageData;
public EventGatherCoreData() { }
public static EventGatherCoreData CreateNew(cfg.FishingEvent e)
{
var res = new EventGatherCoreData();
res._stageCount = 0;
res.StageData = EventGatherCoreStageData.CreateNew();
res._eventId = e.ID;
return res;
}
public void InitNew(int eventId)
{
_stageCount = 0;
_ticketCount = EventGatherCoreAct.Ctx.GetWelcomeGift();
_eventId = eventId;
StageData = EventGatherCoreStageData.CreateNew();
StageData.MoveToStage(0);
_chainProgress = 0;
}
public void LoadData(EventGatherCorePlayfabData data)
{
_eventId = data.EventId;
_ticketCount = data.TicketCount;
_stageCount = data.StageCount;
StageData = EventGatherCoreStageData.CreateNew();
StageData.Init(data.StageCount, data.RewardClaimStateFlag, data.TriggerItemStateFlag);
_chainProgress = data.ChainProgress;
}
public void MoveToNextStage()
{
_stageCount++;
StageData.MoveToStage(StageCount);
ToPlayfabData().Save();
}
public void AddTicket(int n)
{
_ticketCount += n;
if (_ticketCount < 0)
{
_ticketCount -= n;
}
ToPlayfabData().Save();
GContext.container.Resolve<FishingEventData>().SaveTransitionData(_eventId, _ticketCount);
GContext.Publish(new EventTicketUpdate());
}
public EventGatherCorePlayfabData ToPlayfabData()
{
var res = new EventGatherCorePlayfabData
{
EventId = _eventId,
TicketCount = _ticketCount,
StageCount = _stageCount,
RewardClaimStateFlag = StageData.RewardClaimStateFlag,
TriggerItemStateFlag = StageData.TriggerItemStateFlag,
ChainProgress = _chainProgress
};
return res;
}
public EventBingoEntranceData ToEntranceData()
{
var res = new EventBingoEntranceData();
var ctx = EventGatherCoreAct.Ctx;
var t = ctx.GetEventStartTimeAndEndTime();
res.StartTime = t.Item1;
res.ExpiryTime = t.Item2;
res.Icon = ctx.GetEntranceIcon();
res.NeedRedPoint = GContext.container.Resolve<EventGatherCoreData>().TicketCount >= ctx.GetRedPointThreshold();
return res;
}
#region ChainPack
public void SetChainProgress(int p)
{
_chainProgress = p;
}
public int GetChainProgress()
{
return _chainProgress;
}
public void Save()
{
ToPlayfabData().Save();
}
public GenericChainPackData<EventGatherCoreData> ToChainPackData()
{
return GenericChainPackData<EventGatherCoreData>.Create(this, EventGatherCoreAct.Ctx.GetChainPackInfo());
}
#endregion
public TimerContext ToTimerContext(System.Action onExpire)
{
var ctx = EventGatherCoreAct.Ctx;
var t = ctx.GetEventStartTimeAndEndTime();
var res = new TimerContext
{
ExpiryTime = t.Item2,
StartTime = t.Item1,
OnExpire = onExpire
};
return res;
}
}
public class EventGatherCoreStageData
{
public List<int> RewardIdList = new List<int>();
public long RewardClaimStateFlag, TriggerItemStateFlag;
public int StageId;
// public int CoreItemReceivedCount => RewardIdList.Count((id, idx) => EventGatherCoreTableContext.CoreItemIndicator == id && IsRewardClaimed(idx));
public int CoreItemReceivedCount
{
get
{
int result = 0;
if (RewardIdList == null)
return result;
result = RewardIdList.Where((id, idx) => EventGatherCoreAct.Ctx.IsCoreItem(id) && IsRewardClaimed(idx)).Count();
// Debug.Log($"[EventGatherCore] CoreItemReceivedCount: {result}");
return result;
}
}
private EventGatherCoreStageData() { }
public static EventGatherCoreStageData CreateNew()
{
var res = new EventGatherCoreStageData();
res.MoveToStage(0);
return res;
}
public int PlayCount
{
get
{
int res = 0;
long flag = RewardClaimStateFlag;
while (flag > 0)
{
if ((flag & 1) != 0)
{
res++;
}
flag >>= 1;
}
return res;
}
}
public void Init(int roundCount, long rewardClaimStateFlag = 0L, long triggerItemStateFlag = 0L)
{
// Debug.Log($"[EventGatherCore]Move to stage {roundCount}");
RewardClaimStateFlag = rewardClaimStateFlag;
TriggerItemStateFlag = triggerItemStateFlag;
StageId = EventGatherCoreAct.Ctx.GetStageId(roundCount);
RewardIdList = EventGatherCoreAct.Ctx.GetRewardIdList(StageId);
}
public void MoveToStage(int roundCount)
{
// Debug.Log($"[EventGatherCore]Move to stage {roundCount}");
var ctx = EventGatherCoreAct.Ctx;
StageId = ctx.GetStageId(roundCount);
RewardIdList = ctx.GetStageInfo(StageId);
RewardClaimStateFlag = 0L;
TriggerItemStateFlag = 0L;
}
public bool IsRewardClaimed(int rewardIdx)
{
return (RewardClaimStateFlag & (1L << rewardIdx)) != 0;
}
public bool IsTriggerUsed(int triggerIdx)
{
return (TriggerItemStateFlag & (1L << triggerIdx)) != 0;
}
public bool IsEarlyTry(EventGatherCoreTableContext ctx)
{
return PlayCount < ctx.GetStageMinAttemptCount(StageId) - 1;
}
public bool IsCloseToFinish(EventGatherCoreTableContext ctx)
{
return CoreItemReceivedCount == ctx.GetCoreItemTargetCount(StageId) - 1;
}
public void SetRewardClaimed(int rewardIdx)
{
RewardClaimStateFlag |= 1L << rewardIdx;
}
public void SetTriggerUsed(int triggerIdx)
{
TriggerItemStateFlag |= 1L << triggerIdx;
}
// public void AddCoreItem(int num = 1)
// {
// CoreItemReceivedCount += num;
// }
public bool IsStageCleared(EventGatherCoreTableContext ctx)
{
long fullFlag = (1L << ctx.GetStageInfo(StageId).Count) - 1;
return CoreItemReceivedCount >= ctx.GetCoreItemTargetCount(StageId) || (RewardClaimStateFlag & fullFlag) == fullFlag;
}
public List<int> GetRemainingRewardIds()
{
return RewardIdList.Where((id, idx) => ((1 << idx) & RewardClaimStateFlag) == 0).ToList();
}
}
public class EventGatherCoreTriggerTaken
{
public bool Succeeded;
public int RewardIdx;
public int RewardId;
public Vector2 Position;
}
public class EventGatherCoreRewardInfo
{
public int Idx;
public ItemData ItemData;
public bool IsSpecial = false;
public bool IsClaimed;
}
public class EventGatherCorePlayfabData
{
public int EventId { get; set; }
public int TicketCount { get; set; }
public int StageCount { get; set; }
public long RewardClaimStateFlag { get; set; }
public long TriggerItemStateFlag { get; set; }
public int ChainProgress { get; set; }
public static readonly string Key = "EventGatherCoreData";
private readonly char Splitter = '|';
private readonly int TokenCount = 6;
private string Serialize()
{
var sb = new System.Text.StringBuilder();
sb.Append(EventId).Append(Splitter);
sb.Append(TicketCount).Append(Splitter);
sb.Append(StageCount).Append(Splitter);
sb.Append(RewardClaimStateFlag).Append(Splitter);
sb.Append(TriggerItemStateFlag).Append(Splitter);
sb.Append(ChainProgress);
return sb.ToString();
}
private void Deserialize(string data)
{
var tokens = data.Trim(Splitter).Split(Splitter);
if (tokens.Length != TokenCount)
throw new System.Exception($"[EventGatherCore]Wrong amount of parameters. Expect {TokenCount}, but got {tokens.Length} in \"{data}\".");
EventId = int.Parse(tokens[0]);
TicketCount = int.Parse(tokens[1]);
StageCount = int.Parse(tokens[2]);
RewardClaimStateFlag = long.Parse(tokens[3]);
TriggerItemStateFlag = long.Parse(tokens[4]);
ChainProgress = int.Parse(tokens[5]);
}
public void Save()
{
PlayFabMgr.Instance.UpdateUserDataValue(Key, Serialize());
}
public static EventGatherCorePlayfabData Load()
{
var s = PlayFabMgr.Instance.GetLocalData(Key);
var res = new EventGatherCorePlayfabData();
try
{
res.Deserialize(s);
}
catch (System.Exception e)
{
Debug.LogWarning($"[EventGatherCore]Error when deserializing EventGatherCoreData: {e}");
return null;
}
return res;
}
}
public class EventGatherCoreUiData
{
public string MainPanelUrl { get; set; }
public string InfoPanelUrl { get; set; }
public string ChainPackPanelUrl { get; set; }
public string NormalPackPanelUrl { get; set; }
public string RewardPopupPanelUrl { get; set; }
}
public class EventGatherCoreRewardPopupPanelClose
{
public ItemData Reward{ get; set; }
}