Files
ft/Client/Assets/Scripts/EventOfferJourney/EventOfferJourneyData.cs
2026-06-29 21:18:33 +08:00

352 lines
12 KiB
C#

using System.Text;
using asap.core;
using GameCore;
using UnityEngine;
using System;
using System.Collections.Generic;
public class EventOfferJourneyData : AEventOfferJourneyData
{
private int _progress, _eventId, _ticketCount, _vipLvlOnTrigger, _roundCount;
private float _inflationRate;
private EventOfferJourneyTableContext _ctx;
public override int Progress => _progress;
public override int TicketCount => _ticketCount;
public override int EventId => _eventId;
public override float InflationRate => _inflationRate;
public override ShopBuyType BuyType => ShopBuyType.EventPack;
public int VipLvlOnTrigger => _vipLvlOnTrigger;
public void Init(int eventId, int vipLvl)
{
_progress = 0;
_eventId = eventId;
_ticketCount = 0;
_vipLvlOnTrigger = vipLvl;
_roundCount = 0;
_ctx = EventOfferJourneyTableContext.CreateNew(eventId);
_inflationRate = GContext.container.Resolve<PlayerData>().InflationRate;
}
public void InitTest()
{
_progress = 0;
_eventId = 90500001;
_ticketCount = 114514;
_vipLvlOnTrigger = GContext.container.Resolve<PlayerData>().PriceLv;
_roundCount = 0;
_ctx = EventOfferJourneyTableContext.GetTestSample();
}
private EventOfferJourneyPlayfabData ToPlayfabData()
{
return new EventOfferJourneyPlayfabData(_eventId, _progress, _ticketCount, _vipLvlOnTrigger, _roundCount, _inflationRate);
}
public override bool AddTicket(int n)
{
_ticketCount += n;
if (_ticketCount < 0)
{
_ticketCount -= n;
return false;
}
SaveData();
// GContext.container.Resolve<FishingEventData>().SaveTransitionData(_eventId, _ticketCount);
GContext.Publish(new EventTicketUpdate());
return true;
}
public override void OnBuySuccess()
{
if (_ctx == null)
{
Debug.LogError($"[EventOfferJourney]Trying to buy pack but there is no context.");
return;
}
if (_progress >= _ctx.GetRewardList(_vipLvlOnTrigger).Count)
{
Debug.LogError($"[EventOfferJourney]Trying to buy pack no.{_progress} but there are only {_ctx.GetRewardList(_vipLvlOnTrigger).Count} rewards.");
return;
}
_progress++;
SaveData();
}
public override void ProgressUp()
{
if (_ctx == null)
{
Debug.LogError($"[EventOfferJourney]Trying to progress pack but there is no context.");
return;
}
_progress++;
if (_progress >= _ctx.GetRewardList(_vipLvlOnTrigger).Count)
{
_progress = 0;
_roundCount++;
Debug.Log($"[EventOfferJourney] Update vip level from {_vipLvlOnTrigger}");
_vipLvlOnTrigger = GContext.container.Resolve<PlayerData>().PriceLv;
Debug.Log($"[EventOfferJourney] to {_vipLvlOnTrigger}");
}
SaveData();
}
public override void SaveData()
{
ToPlayfabData().Save();
}
public override bool LoadDataFromPlayfab()
{
var pfData = EventOfferJourneyPlayfabData.Load();
if (pfData == null)
return false;
_eventId = pfData.EventId;
_inflationRate = pfData.InflationRate;
_progress = pfData.Progress;
_ticketCount = pfData.TicketCount;
_vipLvlOnTrigger = pfData.VipLvlOnTrigger;
_roundCount = pfData.RoundCount;
_ctx = EventOfferJourneyTableContext.CreateNew(_eventId);
return true;
}
public override EventOfferJourneyEntranceData ToEntranceData()
{
if (_ctx == null)
{
return new EventOfferJourneyEntranceData(false, TimeSpan.Zero, "", false);
}
(var startTime, var endTime) = _ctx.GetEventStartTimeAndEndTime();
var isActive = ZZTimeHelper.UtcNow() >= startTime && ZZTimeHelper.UtcNow() < endTime && _roundCount < _ctx.MaxRoundCount;
var remainingTime = endTime - ZZTimeHelper.UtcNow();
var iconUrl = _ctx.EntranceIconUrl;
var cost = _ctx.GetTicketCostByProgress(_progress, _vipLvlOnTrigger);
var doNeedRedPoint = cost > 0 && cost <= _ticketCount;
var res = new EventOfferJourneyEntranceData(isActive, remainingTime, iconUrl, doNeedRedPoint);
return res;
}
public override List<EventOfferJourneyBlockData> GetRewardList()
{
if (_ctx == null)
return new List<EventOfferJourneyBlockData>();
return _ctx.GetRewardList(_vipLvlOnTrigger);
}
public override ITimerContext ToTimerData(Action OnExpire)
{
if (_ctx == null)
{
Debug.LogError($"[EventOfferJourney]Trying to get timer data but there is no context.");
return new TimerContext();
}
var res = new TimerContext
{
StartTime = _ctx.GetEventStartTimeAndEndTime().Item1,
ExpiryTime = _ctx.GetEventStartTimeAndEndTime().Item2,
OnExpire = OnExpire
};
return res;
}
public override EventOfferJourneyUiData GetUiData()
{
return _ctx.GetUiData();
}
public override int[] GetTicketRewardArray()
{
return _ctx.GetTicketRewardArray();
}
public override string GetTicketName()
{
return _ctx.GetTicketName();
}
public override void OnRaid(int multiplier = 1)
{
int rewardCount = _ctx.GetTicketRewardArray()[0] * multiplier;
GContext.Publish(new game.TargetAddData(_ctx.GetTicketId(), TicketCount, rewardCount));
AddTicket(rewardCount);
}
public override void OnBomb(int multiplier = 1)
{
int rewardCount = _ctx.GetTicketRewardArray()[1] * multiplier;
GContext.Publish(new game.TargetAddData(_ctx.GetTicketId(), TicketCount, rewardCount));
AddTicket(rewardCount);
}
public override int GetStartPosParam()
{
return _ctx.GetStartPosParam();
}
}
public abstract class AEventOfferJourneyData : IEventOfferJourneyData
{
public abstract int Progress { get; }
public abstract int TicketCount { get; }
public abstract int EventId { get; }
public abstract float InflationRate { get; }
public abstract ShopBuyType BuyType { get; }
public string RedPointKey => "event_offer_journey.entrance";
public abstract bool AddTicket(int n);
public abstract List<EventOfferJourneyBlockData> GetRewardList();
public abstract int GetStartPosParam();
public abstract string GetTicketName();
public abstract int[] GetTicketRewardArray();
public abstract EventOfferJourneyUiData GetUiData();
public abstract bool LoadDataFromPlayfab();
public abstract void OnBomb(int multiplier = 1);
public abstract void OnBuySuccess();
public abstract void OnRaid(int multiplier = 1);
public abstract void ProgressUp();
public abstract void SaveData();
public abstract EventOfferJourneyEntranceData ToEntranceData();
public abstract ITimerContext ToTimerData(Action OnExpire);
}
public interface IEventOfferJourneyData
{
public int Progress { get; }
public int TicketCount { get; }
public int EventId { get; }
public float InflationRate { get; }
public ShopBuyType BuyType { get; }
public bool AddTicket(int n);
public bool LoadDataFromPlayfab();
public void SaveData();
public void ProgressUp();
public void OnBuySuccess();
public List<EventOfferJourneyBlockData> GetRewardList();
public EventOfferJourneyEntranceData ToEntranceData();
public EventOfferJourneyUiData GetUiData();
public ITimerContext ToTimerData(Action OnExpire);
public int[] GetTicketRewardArray();
public string GetTicketName();
public void OnRaid(int multiplier = 1);
public void OnBomb(int multiplier = 1);
public int GetStartPosParam();
public string RedPointKey { get; }
}
public class EventOfferJourneyBlockData
{
public enum EType { IAP, Ticket }
public EType Type;
public int Price, DropId;
private EventOfferJourneyBlockData() { }
public static EventOfferJourneyBlockData CreateIapData(int iapId, int dropId)
{
var data = new EventOfferJourneyBlockData();
data.Type = EType.IAP;
data.Price = iapId;
data.DropId = dropId;
return data;
}
public static EventOfferJourneyBlockData CreateTicketData(int ticketCost, int dropId)
{
var data = new EventOfferJourneyBlockData();
data.Type = EType.Ticket;
data.Price = ticketCost;
data.DropId = dropId;
return data;
}
}
public class EventOfferJourneyPlayfabData
{
public int EventId, Progress, TicketCount, VipLvlOnTrigger, RoundCount;
public float InflationRate;
private const string Key = "EventOfferJourneyData";
private const int TokenCount = 6;
private const char Splitter = '|', Comma = ',';
public EventOfferJourneyPlayfabData(int eventId, int progress, int ticketCount, int vipLvlOnTrigger, int roundCount, float inflationRate)
{
EventId = eventId;
Progress = progress;
TicketCount = ticketCount;
VipLvlOnTrigger = vipLvlOnTrigger;
RoundCount = roundCount;
InflationRate = inflationRate;
}
private string Serialize()
{
var res = new StringBuilder();
res.Append(EventId).Append(Splitter)
.Append(Progress).Append(Splitter)
.Append(TicketCount).Append(Splitter)
.Append(VipLvlOnTrigger).Append(Splitter)
.Append(RoundCount).Append(Splitter)
.Append(InflationRate);
return res.ToString();
}
private static EventOfferJourneyPlayfabData Deserialize(string s)
{
if (s == null || s == "")
return null;
var tokens = s.Trim(Splitter).Split(Splitter);
if (tokens.Length != TokenCount && tokens.Length != TokenCount - 1)
{
Debug.LogError($"[EventOfferJourney]Wrong amount of parameters. Expect {TokenCount}, but got {tokens.Length} in \"{s}\".");
return null;
}
var eventId = int.Parse(tokens[0]);
var progress = int.Parse(tokens[1]);
var ticketCount = int.Parse(tokens[2]);
var vipLvlOnTrigger = int.Parse(tokens[3]);
var roundCount = int.Parse(tokens[4]);
float inflationRate = 0;
if (tokens.Length == TokenCount)
{
inflationRate = float.Parse(tokens[5]);
}
else
{
Debug.LogError($"Old data detected, missing inflation rate. Setting to 0.");
}
return new EventOfferJourneyPlayfabData(eventId, progress, ticketCount, vipLvlOnTrigger, roundCount, inflationRate);
}
public static EventOfferJourneyPlayfabData Load()
{
var s = PlayFabMgr.Instance.GetLocalData(Key);
return Deserialize(s);
}
public void Save()
{
var s = Serialize();
PlayFabMgr.Instance.UpdateUserDataValue(Key, s);
}
}
public class EventOfferJourneyEntranceData
{
public bool IsActive { get; }
public TimeSpan RemainingTime { get; }
public string IconUrl { get; }
public bool DoNeedRedPoint { get; }
public EventOfferJourneyEntranceData(bool isActive, TimeSpan remainingTime, string iconUrl, bool doNeedRedPoint)
{
IsActive = isActive;
RemainingTime = remainingTime;
IconUrl = iconUrl;
DoNeedRedPoint = doNeedRedPoint;
}
}
public class EventOfferJourneyUiData
{
public string PanelUrl { get; set; }
public string InfoPanelUrl { get; set; }
}