275 lines
8.8 KiB
C#
275 lines
8.8 KiB
C#
using asap.core;
|
|
using cfg;
|
|
using GameCore;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using DG.Tweening;
|
|
using UniRx;
|
|
using game;
|
|
using System;
|
|
|
|
public class EventSignupPopupPanel_2 : BasePanel
|
|
{
|
|
List<SignupDayItem> signupDayItems = new List<SignupDayItem>();
|
|
Button btn_close;
|
|
Tables tables;
|
|
SigninData signupData;
|
|
[SerializeField] private Image[] bars;
|
|
[SerializeField] private RewardFlyBatchController rewardFlyController;
|
|
RectTransform icon_done;
|
|
GameObject effect_HomePanel;
|
|
GameObject clickMask;
|
|
Transform reward;
|
|
List<SignupRewardItem> rewardItems = new List<SignupRewardItem>();
|
|
|
|
List<int> drops = new List<int>();
|
|
List<MonthlySign> monthlySign;
|
|
GameObject rewardPanel;
|
|
Button reward_button;
|
|
|
|
int curIndex;
|
|
private void Awake()
|
|
{
|
|
tables = GContext.container.Resolve<Tables>();
|
|
monthlySign = tables.TbMonthlySign.DataList;
|
|
signupData = GContext.container.Resolve<SigninData>();
|
|
for (int i = 1; i < 8; i++)
|
|
{
|
|
signupDayItems.Add(transform.Find("root/day" + i).GetComponent<SignupDayItem>());
|
|
}
|
|
btn_close = transform.Find("btn_close").GetComponent<Button>();
|
|
|
|
icon_done = transform.Find("root/bg_bar/icon_done").GetComponent<RectTransform>();
|
|
effect_HomePanel = transform.Find("root/bg_bar/effect_HomePanel").gameObject;
|
|
reward = transform.Find("root/reward");
|
|
for (int i = 0; i < reward.childCount; i++)
|
|
{
|
|
rewardItems.Add(reward.GetChild(i).GetComponent<SignupRewardItem>());
|
|
}
|
|
|
|
rewardPanel = transform.Find("reward").gameObject;
|
|
reward_button = transform.Find("reward/btn_play/btn_green").GetComponent<Button>();
|
|
clickMask = transform.Find("clickMask").gameObject;
|
|
}
|
|
protected override void Start()
|
|
{
|
|
clickMask.SetActive(false);
|
|
oldPanelName = panelName;
|
|
base.Start();
|
|
btn_close.onClick.AddListener(OnClose);
|
|
reward_button.onClick.AddListener(OnClickReward);
|
|
|
|
int DropID;
|
|
|
|
for (int i = 0; i < signupDayItems.Count; i++)
|
|
{
|
|
DailySign dailySign = tables.TbDailySign.DataList[i];
|
|
DropID = dailySign.DropID;
|
|
signupDayItems[i].ShowData(i, DropID);
|
|
}
|
|
SetData();
|
|
GContext.OnEvent<OnSignEvent>().Subscribe(OnSignEvent).AddTo(disposables);
|
|
}
|
|
void SetData()
|
|
{
|
|
for (int i = 0; i < rewardItems.Count; i++)
|
|
{
|
|
rewardItems[i].gameObject.SetActive(false);
|
|
}
|
|
int count = monthlySign.Count;
|
|
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
int index = i;
|
|
drops.Add(monthlySign[i].DropID);
|
|
rewardItems[i].gameObject.SetActive(true);
|
|
rewardItems[i].SetData(() => OnClickReward(index, rewardItems[index].transform.position), monthlySign[i].SignDayAccount.ToString());
|
|
}
|
|
var (stage, percentage) = GetFillAmounts();
|
|
SetFillAmounts(stage, percentage);
|
|
RefreshPanel();
|
|
}
|
|
void RefreshPanel()
|
|
{
|
|
ShowRewardPanel();
|
|
|
|
(int stage, float percentage) = GetFillAmounts();
|
|
SetFillAmounts(stage, percentage);
|
|
int count = monthlySign.Count;
|
|
int id;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
id = monthlySign[i].SignDayAccount;
|
|
rewardItems[i].SetReceived(signupData.monthlySignEvent.index >= id);
|
|
}
|
|
}
|
|
|
|
async void FlyReward(List<ItemData> itemDatas)
|
|
{
|
|
var rewardFlyRequest = new BatchedRewardFlyRequest
|
|
{
|
|
Icon = new BatchedRewardFlyRequestIcon { icon = icon_done.GetComponent<Image>().sprite },
|
|
StartPoint = new BatchedRewardFlyStartPoint(signupDayItems[signupData.dailySignEvent.index - 1].icon_done.transform.position),
|
|
EndPoint = new BatchedRewardFlyEndPoint(icon_done),
|
|
IsDestinationRewardStash = false,
|
|
AnimationParamIndex = 0
|
|
};
|
|
await rewardFlyController.OnRewardFlyRequestAsync(rewardFlyRequest);
|
|
|
|
(int stage, float percentage) = GetFillAmounts();
|
|
await Fill(stage, percentage, 0.5f);
|
|
int count = monthlySign.Count;
|
|
int id;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
id = monthlySign[i].SignDayAccount;
|
|
rewardItems[i].SetReceived(signupData.monthlySignEvent.index >= id);
|
|
}
|
|
if (itemDatas != null && itemDatas.Count > 0)
|
|
{
|
|
GContext.Publish(new ShowData(itemDatas));
|
|
GContext.Publish(new ShowData());
|
|
}
|
|
CurRewardQCount curRewardQCount = new CurRewardQCount();
|
|
GContext.Publish(curRewardQCount);
|
|
if (FishingEventData.Condition_NoRechargeDay(15))
|
|
{
|
|
if (curRewardQCount.count <= 0)
|
|
{
|
|
OnClickAds();
|
|
}
|
|
else
|
|
{
|
|
GContext.OnEvent<RewardPanelClose>().First().Subscribe((e) =>
|
|
{
|
|
OnClickAds();
|
|
}).AddTo(disposables);
|
|
}
|
|
}
|
|
clickMask.SetActive(false);
|
|
}
|
|
|
|
AdvertPopupType curOpenAdType = AdvertPopupType.SignInAdvert;
|
|
IDisposable ads;
|
|
void OnClickAds()
|
|
{
|
|
Debug.Log("OnClickAds SignInAdvert");
|
|
//拉起广告
|
|
AdsDispose();
|
|
ads = GContext.OnEvent<AdsInterstitialResult>().Subscribe(SetResult);
|
|
GContext.container.Resolve<IAdsService>().ShowInterstitial(curOpenAdType);
|
|
}
|
|
void SetResult(AdsInterstitialResult adsResult)
|
|
{
|
|
AdsDispose();
|
|
if (adsResult.Type == curOpenAdType)
|
|
{
|
|
|
|
}
|
|
}
|
|
void AdsDispose()
|
|
{
|
|
ads?.Dispose();
|
|
ads = null;
|
|
}
|
|
async void OnSignEvent(OnSignEvent onSignEvent)
|
|
{
|
|
clickMask.SetActive(true);
|
|
ShowRewardPanel();
|
|
await Awaiters.Seconds(1.5f);
|
|
GContext.Publish(new ShowData());
|
|
CurRewardQCount curRewardQCount = new CurRewardQCount();
|
|
GContext.Publish(curRewardQCount);
|
|
if (curRewardQCount.count <= 0)
|
|
{
|
|
FlyReward(onSignEvent.itemDataList);
|
|
}
|
|
else
|
|
{
|
|
GContext.OnEvent<RewardPanelClose>().First().Subscribe((e) =>
|
|
{
|
|
FlyReward(onSignEvent.itemDataList);
|
|
}).AddTo(disposables);
|
|
}
|
|
}
|
|
|
|
void ShowRewardPanel()
|
|
{
|
|
var dailySignEvent = signupData.dailySignEvent;
|
|
bool isReward = dailySignEvent.lastID != ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear && dailySignEvent.index < 7;
|
|
rewardPanel.SetActive(isReward);
|
|
btn_close.gameObject.SetActive(!isReward);
|
|
}
|
|
void OnClickReward()
|
|
{
|
|
if (signupData.dailySignEvent.index < signupDayItems.Count)
|
|
{
|
|
signupDayItems[signupData.dailySignEvent.index].OnClaimBtnClick();
|
|
}
|
|
}
|
|
void OnClose()
|
|
{
|
|
UIManager.Instance.DestroyUI(gameObject.name);
|
|
}
|
|
void OnClickReward(int index, Vector3 pos)
|
|
{
|
|
item_sanddig_tips.Show(pos, drops[index], GContext.container.Resolve<PlayerData>().InflationRate);
|
|
}
|
|
|
|
private (int stage, float percentage) GetFillAmounts()
|
|
{
|
|
int stage = int.MaxValue;
|
|
float percentage = 1;
|
|
int doneCount = 0;
|
|
for (int i = 0; i < monthlySign.Count; i++)
|
|
{
|
|
if (monthlySign[i].SignDayAccount >= signupData.monthlySignEvent.index)
|
|
{
|
|
stage = i;
|
|
percentage = (float)(signupData.monthlySignEvent.index - doneCount) / (monthlySign[i].SignDayAccount - doneCount);
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
doneCount = monthlySign[i].SignDayAccount;
|
|
}
|
|
}
|
|
return (stage, percentage);
|
|
}
|
|
|
|
private void SetFillAmounts(int stage, float percentage)
|
|
{
|
|
for (int i = 0; i < bars.Length; i++)
|
|
{
|
|
if (i < stage)
|
|
bars[i].fillAmount = 1;
|
|
else if (i == stage)
|
|
bars[i].fillAmount = percentage;
|
|
else
|
|
bars[i].fillAmount = 0;
|
|
}
|
|
}
|
|
|
|
private async System.Threading.Tasks.Task Fill(int stage, float percentage, float totalDuration)
|
|
{
|
|
foreach (var bar in bars)
|
|
bar.DOKill();
|
|
Dictionary<int, float> fillSchedule = new Dictionary<int, float>();
|
|
for (int i = 0; i < bars.Length; i++)
|
|
{
|
|
if (bars[i].fillAmount >= 1)
|
|
continue;
|
|
if (i < stage)
|
|
fillSchedule.Add(i, 1);
|
|
else if (i == stage)
|
|
fillSchedule.Add(i, percentage);
|
|
}
|
|
if (fillSchedule.Count == 0)
|
|
return;
|
|
var duration = totalDuration / fillSchedule.Count;
|
|
foreach (var kv in fillSchedule)
|
|
await bars[kv.Key].DOFillAmount(kv.Value, duration).AsyncWaitForCompletion();
|
|
}
|
|
}
|