You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
978 lines
37 KiB
978 lines
37 KiB
using IVDataFormat;
|
|
using IVServerFormat;
|
|
using System.CodeDom;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Security.Policy;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
public class AdBuffMgr : MonoBehaviour
|
|
{
|
|
#region Const
|
|
private static AdBuffMgr curMgr = null;
|
|
#endregion Const
|
|
|
|
#region Button
|
|
[SerializeField]
|
|
GameObject buttonWrap;
|
|
[SerializeField]
|
|
GameObject adbuffBadge;
|
|
ButtonIV btnAtk;
|
|
ButtonIV btnGold;
|
|
ButtonIV btnExp;
|
|
TextMeshProUGUI txtTimerAtk;
|
|
TextMeshProUGUI txtTimerGold;
|
|
TextMeshProUGUI txtTimerExp;
|
|
Transform atkOn, goldOn, expOn;
|
|
#endregion
|
|
|
|
#region Buff Window
|
|
[SerializeField]
|
|
Canvas canvasUI;
|
|
[SerializeField]
|
|
GameObject bg;
|
|
[SerializeField]
|
|
GameObject imgAd;
|
|
TextMeshProUGUI buffTitle;
|
|
GameObject[] buffTabSet = new GameObject[3];
|
|
GameObject[] buffIconOn = new GameObject[3];
|
|
GameObject[] buffIconOff = new GameObject[3];
|
|
TextMeshProUGUI[] txtBuffLevel = new TextMeshProUGUI[3];
|
|
TextMeshProUGUI[] txtBuffTitle = new TextMeshProUGUI[3];
|
|
TextMeshProUGUI[] txtBuffDesc = new TextMeshProUGUI[3];
|
|
ButtonIV[] btnBuffAd = new ButtonIV[3];
|
|
TextMeshProUGUI[] txtBuffOn = new TextMeshProUGUI[3];
|
|
TextMeshProUGUI[] txtTimer = new TextMeshProUGUI[3];
|
|
//GameObject[] buffInf = new GameObject[3];
|
|
TextMeshProUGUI[] txtBuffExpNum = new TextMeshProUGUI[3];
|
|
Slider[] sldBuffExp = new Slider[3];
|
|
ButtonIV[] btnBuffLvUp = new ButtonIV[3];
|
|
ParticleSystem[] ptcLevelUp = new ParticleSystem[3];
|
|
GameObject[] btnLevelBedge = new GameObject[3];
|
|
TextMeshProUGUI[] txtBuffLvUp = new TextMeshProUGUI[3];
|
|
GameObject[] badge = new GameObject[3];
|
|
TextMeshProUGUI txtBuffInfo;
|
|
|
|
GameObject[] timerInf = new GameObject[3];
|
|
GameObject[] buffMax = new GameObject[3];
|
|
|
|
|
|
#endregion
|
|
|
|
#region Variables
|
|
public enum AdNumber
|
|
{
|
|
atk=0,
|
|
gold=1,
|
|
exp=2
|
|
}
|
|
AdNumber adNumber;
|
|
|
|
private int iLoading = 1;
|
|
private bool bReLocalize = true;
|
|
|
|
int[] adTimer = new int[3] { -1, -1, -1 };
|
|
public static int[] GetAdTImer()
|
|
{
|
|
return curMgr.adTimer;
|
|
}
|
|
int adTime = 1800;//광고로 인한 추가시간
|
|
|
|
int atkBuff = 1000000;
|
|
int goldDrop = 500000;
|
|
int expDrop = 500000;
|
|
|
|
bool isNoAd = false;
|
|
#endregion Variables
|
|
|
|
#region Base
|
|
public static void SLocalize(bool bmain) => curMgr?.Localize(bmain);
|
|
|
|
private void Localize(bool bmain)
|
|
{
|
|
if (bmain)
|
|
{
|
|
btnAtk = buttonWrap.transform.Find("buffatk").GetComponent<ButtonIV>();
|
|
btnGold = buttonWrap.transform.Find("buffgold").GetComponent<ButtonIV>();
|
|
btnExp = buttonWrap.transform.Find("buffexp").GetComponent<ButtonIV>();
|
|
txtTimerAtk = btnAtk.transform.Find("timer").GetComponent<TextMeshProUGUI>();
|
|
txtTimerGold = btnGold.transform.Find("timer").GetComponent<TextMeshProUGUI>();
|
|
txtTimerExp = btnExp.transform.Find("timer").GetComponent<TextMeshProUGUI>();
|
|
|
|
atkOn = btnAtk.transform.Find("On");
|
|
goldOn = btnGold.transform.Find("On");
|
|
expOn = btnExp.transform.Find("On");
|
|
|
|
for(int i = 0; i < badge.Length; i++)
|
|
{
|
|
badge[i] = new GameObject();
|
|
}
|
|
|
|
badge[(int)AdNumber.atk] = btnAtk.transform.Find("badge").gameObject;
|
|
badge[(int)AdNumber.gold] = btnGold.transform.Find("badge").gameObject;
|
|
badge[(int)AdNumber.exp] = btnExp.transform.Find("badge").gameObject;
|
|
|
|
BadgeActive();
|
|
}
|
|
else
|
|
{
|
|
bReLocalize = false;
|
|
|
|
buffTabSet[(int)AdNumber.atk] = bg.transform.Find("BuffTabSetAtk").gameObject;
|
|
buffTabSet[(int)AdNumber.gold] = bg.transform.Find("BuffTabSetGold").gameObject;
|
|
buffTabSet[(int)AdNumber.exp] = bg.transform.Find("BuffTabSetExp").gameObject;
|
|
|
|
buffTitle = bg.transform.Find("txtT").GetComponent<TextMeshProUGUI>();
|
|
bg.transform.Find("txtB").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("adbuff_adbuff_effect");
|
|
imgAd.transform.Find("imgAd").transform.Find("txtAdTitle").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("adbuff_img_title");
|
|
imgAd.transform.Find("imgAd").transform.Find("txtAdDescribe").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("adbuff_img_describe");
|
|
imgAd.transform.Find("imgAd").transform.Find("txtAdPurchase").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("adbuff_img_purchase");
|
|
|
|
buffTitle.text = LocalizationText.GetText("adbuff_title");
|
|
|
|
for (int i = 0; i < buffTabSet.Length; i++)
|
|
{
|
|
txtBuffLevel[i] = buffTabSet[i].transform.Find("txtBuffLv").GetComponent<TextMeshProUGUI>();
|
|
txtBuffTitle[i] = buffTabSet[i].transform.Find("txtBuffLabel").GetComponent<TextMeshProUGUI>();
|
|
txtBuffDesc[i] = buffTabSet[i].transform.Find("txtBuffDesc").GetComponent<TextMeshProUGUI>();
|
|
btnBuffAd[i] = buffTabSet[i].transform.Find("btnBuffAd").GetComponent<ButtonIV>();
|
|
txtBuffOn[i] = btnBuffAd[i].transform.GetChild(0).GetComponent<TextMeshProUGUI>();
|
|
txtTimer[i] = buffTabSet[i].transform.Find("txtTimer").GetComponent<TextMeshProUGUI>();
|
|
txtBuffExpNum[i] = buffTabSet[i].transform.Find("txtExpNum").GetComponent<TextMeshProUGUI>();
|
|
sldBuffExp[i] = buffTabSet[i].transform.Find("sldExp").GetComponent<Slider>();
|
|
btnBuffLvUp[i] = buffTabSet[i].transform.Find("btnBuffLvUp").GetComponent<ButtonIV>();
|
|
btnLevelBedge[i] = btnBuffLvUp[i].transform.Find("badge").gameObject;
|
|
txtBuffLvUp[i] = buffTabSet[i].transform.Find("txtBuffLvUp").GetComponent<TextMeshProUGUI>();
|
|
buffIconOn[i] = buffTabSet[i].transform.Find("imgOnBufficon").gameObject;
|
|
buffIconOff[i] = buffTabSet[i].transform.Find("imgOffBufficon").gameObject;
|
|
|
|
ptcLevelUp[i] = buffTabSet[i].transform.Find("ptcLevelUp").GetComponent<ParticleSystem>();
|
|
timerInf[i] = buffTabSet[i].transform.Find("imgTimerInf").gameObject;
|
|
buffMax[i] = buffTabSet[i].transform.Find("btnBuffMax").gameObject;
|
|
}
|
|
|
|
for (int i = 0; i < buffTabSet.Length; i++)
|
|
{
|
|
txtBuffOn[i].text = LocalizationText.GetText("adbuff_playad");
|
|
txtBuffLvUp[i].text = LocalizationText.GetText("adbuff_levelup");
|
|
|
|
switch (i)
|
|
{
|
|
case (int)AdNumber.atk:
|
|
txtBuffTitle[i].text = LocalizationText.GetText("adbuff_atk_buff");
|
|
txtBuffDesc[i].text = FormatString.StringFormat("{0} + {1} %", LocalizationText.GetText("adbuff_atk_buff_per"), 100);
|
|
break;
|
|
|
|
case (int)AdNumber.gold:
|
|
txtBuffTitle[i].text = LocalizationText.GetText("adbuff_gold_buff");
|
|
txtBuffDesc[i].text = FormatString.StringFormat("{0} + {1} %", LocalizationText.GetText("adbuff_gold_buff_per"), 100);
|
|
break;
|
|
|
|
case (int)AdNumber.exp:
|
|
txtBuffTitle[i].text = LocalizationText.GetText("adbuff_exp_buff");
|
|
txtBuffDesc[i].text = FormatString.StringFormat("{0} + {1} %", LocalizationText.GetText("adbuff_exp_buff_per"), 100);
|
|
break;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 설정에서 언어 변경 시 처리.
|
|
public static void SReLocalize()
|
|
{
|
|
curMgr.Localize(true);
|
|
curMgr.bReLocalize = true;
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
curMgr = this;
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
iLoading--;
|
|
}
|
|
|
|
//게임을 시작할떄 광고버프가 광고제거가 되어있는지 아닌지를 판별한다.
|
|
public static void InitRemainBuff()
|
|
{
|
|
if (curMgr.bReLocalize)
|
|
curMgr.Localize(false);
|
|
|
|
//광고버프가 구매된 상태라면 게임 시작할때 버프를 바로 틀어준다.
|
|
const int removeAdShopID = 1;
|
|
if (DataHandler.GetShop(removeAdShopID).buyCnt >= 1)
|
|
{
|
|
curMgr.AdBuffNoAd();
|
|
return;
|
|
}
|
|
|
|
//광고버프가 구매되지 않은 상태라면 현재 지속시간을 불러와서 지속시간이 남아있는 버프를 켠다.
|
|
curMgr.adTimer = DataHandler.PlayBuff.adTimer;
|
|
|
|
if (curMgr.adTimer[(int)AdNumber.atk] > 0)
|
|
{
|
|
StartOnAdBuffAttack();
|
|
}
|
|
if (curMgr.adTimer[(int)AdNumber.exp] > 0)
|
|
{
|
|
StartOnAdBuffExp();
|
|
}
|
|
if (curMgr.adTimer[(int)AdNumber.gold] > 0)
|
|
{
|
|
StartOnAdBuffGold();
|
|
}
|
|
}
|
|
#endregion Base
|
|
|
|
#region BuffWindow OnOff
|
|
public static void SMoveAdbuff()
|
|
{
|
|
curMgr.BuffWindowOn();
|
|
}
|
|
|
|
public void BuffWindowOn()//버프 버튼을 눌러서 버프 창을 열음
|
|
{
|
|
for (int i = 0; i < buffIconOn.Length; i++)
|
|
buffIconOn[i].SetActive(!buffIconOff[i].activeSelf);
|
|
canvasUI.enabled = true;
|
|
BattleMgr.CloseFailScroll();
|
|
if (bReLocalize)
|
|
Localize(false);
|
|
|
|
atkBuff = DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.atkLv).atkValue;
|
|
goldDrop = DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.goldLv).goldValue; ;
|
|
expDrop = DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.expLv).expValue;
|
|
|
|
//imgAd.SetActive(!isNoAd);
|
|
|
|
BuffLevelSet(AdNumber.atk);
|
|
BuffLevelSet(AdNumber.gold);
|
|
BuffLevelSet(AdNumber.exp);
|
|
BuffExpSet(AdNumber.atk);
|
|
BuffExpSet(AdNumber.gold);
|
|
BuffExpSet(AdNumber.exp);
|
|
|
|
//SampleAdsMgr.LoadRewardedAd();
|
|
|
|
if (DataHandler.GetShop(1).buyCnt == 1)
|
|
{
|
|
AdBuffNoAd();
|
|
}
|
|
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
|
|
ButtonActive();
|
|
}
|
|
|
|
public void BuffWindowOff()//열린 창을 닫음
|
|
{
|
|
MissionMgr.SRefreshMission();
|
|
canvasUI.enabled = false;
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
|
|
for (int i = 0; i < buffIconOn.Length; i++)
|
|
buffIconOn[i].SetActive(false);
|
|
}
|
|
|
|
public void ButtonActive()//레벨업 버튼 활성화 여부를 판별한다.
|
|
{
|
|
if (DataHandler.PlayBuff.atkExp >= DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.atkLv + 1).exp)
|
|
{
|
|
btnBuffLvUp[(int)AdNumber.atk].interactable = true;
|
|
btnLevelBedge[(int)AdNumber.atk].SetActive(true);
|
|
|
|
if (buffMax[(int)AdNumber.atk].activeSelf)
|
|
{
|
|
btnLevelBedge[(int)AdNumber.atk].SetActive(false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
btnBuffLvUp[(int)AdNumber.atk].interactable = false;
|
|
btnLevelBedge[(int)AdNumber.atk].SetActive(false);
|
|
}
|
|
|
|
if (DataHandler.PlayBuff.goldExp >= DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.goldLv + 1).exp)
|
|
{
|
|
btnBuffLvUp[(int)AdNumber.gold].interactable = true;
|
|
btnLevelBedge[(int)AdNumber.gold].SetActive(true);
|
|
|
|
if (buffMax[(int)AdNumber.gold].activeSelf)
|
|
{
|
|
btnLevelBedge[(int)AdNumber.gold].SetActive(false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
btnBuffLvUp[(int)AdNumber.gold].interactable = false;
|
|
btnLevelBedge[(int)AdNumber.gold].SetActive(false);
|
|
}
|
|
|
|
if (DataHandler.PlayBuff.expExp >= DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.expLv + 1).exp)
|
|
{
|
|
btnBuffLvUp[(int)AdNumber.exp].interactable = true;
|
|
btnLevelBedge[(int)AdNumber.exp].SetActive(true);
|
|
|
|
if (buffMax[(int)AdNumber.exp].activeSelf)
|
|
{
|
|
btnLevelBedge[(int)AdNumber.exp].SetActive(false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
btnBuffLvUp[(int)AdNumber.exp].interactable = false;
|
|
btnLevelBedge[(int)AdNumber.exp].SetActive(false);
|
|
}
|
|
}
|
|
|
|
int activeBadge = 0;
|
|
|
|
public void BadgeActive()//메인메뉴의 뱃지 활성화 여부를 판별한다.
|
|
{
|
|
if (DataHandler.PlayBuff.atkExp >= DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.atkLv + 1).exp)
|
|
{
|
|
//badge[(int)AdNumber.atk].SetActive(true);
|
|
activeBadge++;
|
|
|
|
if (DataHandler.PlayBuff.atkLv >= DataHandler.GetSysAdBuffs().Length)
|
|
{
|
|
//badge[(int)AdNumber.atk].SetActive(false);
|
|
activeBadge--;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//badge[(int)AdNumber.atk].SetActive(false);
|
|
}
|
|
|
|
if (DataHandler.PlayBuff.goldExp >= DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.goldLv + 1).exp)
|
|
{
|
|
//badge[(int)AdNumber.gold].SetActive(true);
|
|
activeBadge++;
|
|
|
|
if (DataHandler.PlayBuff.goldLv >= DataHandler.GetSysAdBuffs().Length)
|
|
{
|
|
//badge[(int)AdNumber.gold].SetActive(false);
|
|
activeBadge--;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//badge[(int)AdNumber.gold].SetActive(false);
|
|
}
|
|
|
|
if (DataHandler.PlayBuff.expExp >= DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.expLv + 1).exp)
|
|
{
|
|
//badge[(int)AdNumber.exp].SetActive(true);
|
|
activeBadge++;
|
|
|
|
if (DataHandler.PlayBuff.expLv >= DataHandler.GetSysAdBuffs().Length)
|
|
{
|
|
//badge[(int)AdNumber.exp].SetActive(false);
|
|
activeBadge--;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//badge[(int)AdNumber.exp].SetActive(false);
|
|
}
|
|
|
|
if (activeBadge > 0)//메인메뉴의 광고버프 뱃지는 하나이므로 한개 이상 조건을 만족하면 뱃지를 틀어준다.
|
|
{
|
|
adbuffBadge.SetActive(true);
|
|
activeBadge = 0;
|
|
}
|
|
else
|
|
{
|
|
adbuffBadge.SetActive(false);
|
|
activeBadge = 0;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region BuffStartOn
|
|
public static void StartOnAdBuffAttack()//공격 벼프를 틀고 타이머를 세팅하며 버프아이콘을 교체하고 스텟을 재계산한다. 하위 3개는 게임 시작할때 조건에 따라 작동된다.
|
|
{
|
|
BuffMgr.Instance.OnAdBuff(eEffectType.AtkBuff, curMgr.atkBuff, true);
|
|
curMgr.btnAtk.interactable = false;
|
|
curMgr.btnBuffAd[(int)AdNumber.atk].interactable = false;
|
|
curMgr.txtBuffOn[(int)AdNumber.atk].gameObject.SetActive(false);
|
|
curMgr.atkOn.gameObject.SetActive(true);
|
|
curMgr.txtTimerAtk.gameObject.SetActive(true);
|
|
//curMgr.adTimer[(int)AdNumber.atk] = curMgr.adTime;
|
|
curMgr.SetTimer((int)AdNumber.atk);
|
|
curMgr.SwitchBuffIcon((int)AdNumber.atk, true);
|
|
BattleMgr.StatRecalc();
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
}
|
|
|
|
public static void StartOnAdBuffGold()//골드 벼프를 틀고 타이머를 세팅하며 버프아이콘을 교체하고 스텟을 재계산한다.
|
|
{
|
|
BuffMgr.Instance.OnAdBuff(eEffectType.GoldDropRate, curMgr.goldDrop, true);
|
|
curMgr.btnGold.interactable = false;
|
|
curMgr.btnBuffAd[(int)AdNumber.gold].interactable = false;
|
|
curMgr.txtBuffOn[(int)AdNumber.gold].gameObject.SetActive(false);
|
|
curMgr.goldOn.gameObject.SetActive(true);
|
|
curMgr.txtTimerGold.gameObject.SetActive(true);
|
|
//curMgr.adTimer[(int)AdNumber.gold] = curMgr.adTime;
|
|
curMgr.SetTimer((int)AdNumber.gold);
|
|
curMgr.SwitchBuffIcon((int)AdNumber.gold, true);
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
}
|
|
|
|
public static void StartOnAdBuffExp()//경험치 벼프를 틀고 타이머를 세팅하며 버프아이콘을 교체하고 스텟을 재계산한다.
|
|
{
|
|
BuffMgr.Instance.OnAdBuff(eEffectType.ExpDropRate, curMgr.expDrop, true);
|
|
curMgr.btnExp.interactable = false;
|
|
curMgr.btnBuffAd[(int)AdNumber.exp].interactable = false;
|
|
curMgr.txtBuffOn[(int)AdNumber.exp].gameObject.SetActive(false);
|
|
curMgr.expOn.gameObject.SetActive(true);
|
|
curMgr.txtTimerExp.gameObject.SetActive(true);
|
|
//curMgr.adTimer[(int)AdNumber.exp] = curMgr.adTime;
|
|
curMgr.SetTimer((int)AdNumber.exp);
|
|
curMgr.SwitchBuffIcon((int)AdNumber.exp, true);
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
}
|
|
#endregion
|
|
|
|
#region Buff OnOff
|
|
public static void btnOnAdBuffAttack()//광고를 틀고 광고가 전부 봐졌다면 버프를 실행한다. 광고제거가 있다면 계속 유지되므로 여기서는 구매여부를 점검하지 않는다.
|
|
{
|
|
//SampleAdsMgr.ShowAds();
|
|
SampleAdsMgr.ShowRewardedAd(SampleAdsMgr.ADRewardType.AdAtkBuff);
|
|
//OnAdBuffAttack();
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
public static void SOnAdBuffAttack()
|
|
{
|
|
curMgr.OnAdBuffAttack();
|
|
}
|
|
|
|
private void OnAdBuffAttack()//광고를 보고나서 실행하는 부분. 하위 3개 묶음씩은 각 경험치와 골드를 보는 곳이다.
|
|
{
|
|
BuffMgr.Instance.OnAdBuff(eEffectType.AtkBuff, curMgr.atkBuff, true);
|
|
curMgr.btnAtk.interactable = false;
|
|
curMgr.btnBuffAd[(int)AdNumber.atk].interactable = false;
|
|
curMgr.txtBuffOn[(int)AdNumber.atk].gameObject.SetActive(false);
|
|
curMgr.atkOn.gameObject.SetActive(true);
|
|
curMgr.txtTimerAtk.gameObject.SetActive(true);
|
|
curMgr.adTimer[(int)AdNumber.atk] = curMgr.adTime;
|
|
curMgr.SetTimer((int)AdNumber.atk);
|
|
curMgr.SwitchBuffIcon((int)AdNumber.atk, true);
|
|
BattleMgr.StatRecalc();
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
}
|
|
|
|
public static void btnOnAdBuffGold()//골드
|
|
{
|
|
SampleAdsMgr.ShowRewardedAd(SampleAdsMgr.ADRewardType.AdGoldBuff);
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
public static void SOnAdBuffGold()
|
|
{
|
|
curMgr.OnAdBuffGold();
|
|
}
|
|
|
|
private void OnAdBuffGold()
|
|
{
|
|
BuffMgr.Instance.OnAdBuff(eEffectType.GoldDropRate, curMgr.goldDrop, true);
|
|
curMgr.btnGold.interactable = false;
|
|
curMgr.btnBuffAd[(int)AdNumber.gold].interactable = false;
|
|
curMgr.txtBuffOn[(int)AdNumber.gold].gameObject.SetActive(false);
|
|
curMgr.goldOn.gameObject.SetActive(true);
|
|
curMgr.txtTimerGold.gameObject.SetActive(true);
|
|
curMgr.adTimer[(int)AdNumber.gold] = curMgr.adTime;
|
|
curMgr.SetTimer((int)AdNumber.gold);
|
|
curMgr.SwitchBuffIcon((int)AdNumber.gold, true);
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
}
|
|
|
|
public static void btnOnAdBuffExp()//경험치
|
|
{
|
|
SampleAdsMgr.ShowRewardedAd(SampleAdsMgr.ADRewardType.AdExpBuff);
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
public static void SOnAdBuffExp()
|
|
{
|
|
curMgr.OnAdBuffExp();
|
|
}
|
|
|
|
private void OnAdBuffExp()
|
|
{
|
|
BuffMgr.Instance.OnAdBuff(eEffectType.ExpDropRate, curMgr.expDrop, true);
|
|
curMgr.btnExp.interactable = false;
|
|
curMgr.btnBuffAd[(int)AdNumber.exp].interactable = false;
|
|
curMgr.txtBuffOn[(int)AdNumber.exp].gameObject.SetActive(false);
|
|
curMgr.expOn.gameObject.SetActive(true);
|
|
curMgr.txtTimerExp.gameObject.SetActive(true);
|
|
curMgr.adTimer[(int)AdNumber.exp] = curMgr.adTime;
|
|
curMgr.SetTimer((int)AdNumber.exp);
|
|
curMgr.SwitchBuffIcon((int)AdNumber.exp, true);
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
}
|
|
|
|
public static void btnOffAdBuffAttack()//광고제거가 없고 타이머가 다 되었을때 버프를 종료한다.
|
|
{
|
|
BuffMgr.Instance.OffAdBuff(eEffectType.AtkBuff, true);
|
|
curMgr.btnAtk.interactable = true;
|
|
curMgr.btnBuffAd[(int)AdNumber.atk].interactable = true;
|
|
curMgr.txtBuffOn[(int)AdNumber.atk].gameObject.SetActive(true);
|
|
curMgr.atkOn.gameObject.SetActive(false);
|
|
curMgr.txtTimerAtk.gameObject.SetActive(false);
|
|
curMgr.SwitchBuffIcon((int)AdNumber.atk, false);
|
|
BattleMgr.StatRecalc();
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
curMgr.txtBuffOn[(int)AdNumber.atk].text = LocalizationText.GetText("adbuff_playad");
|
|
}
|
|
|
|
public static void btnOffAdBuffGold()
|
|
{
|
|
BuffMgr.Instance.OffAdBuff(eEffectType.GoldDropRate, true);
|
|
curMgr.btnGold.interactable = true;
|
|
curMgr.btnBuffAd[(int)AdNumber.gold].interactable = true;
|
|
curMgr.txtBuffOn[(int)AdNumber.gold].gameObject.SetActive(true);
|
|
curMgr.goldOn.gameObject.SetActive(false);
|
|
curMgr.txtTimerGold.gameObject.SetActive(false);
|
|
curMgr.SwitchBuffIcon((int)AdNumber.gold, false);
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
curMgr.txtBuffOn[(int)AdNumber.gold].text = LocalizationText.GetText("adbuff_playad");
|
|
}
|
|
|
|
public static void btnOffAdBuffExp()
|
|
{
|
|
BuffMgr.Instance.OffAdBuff(eEffectType.ExpDropRate, true);
|
|
curMgr.btnExp.interactable = true;
|
|
curMgr.btnBuffAd[(int)AdNumber.exp].interactable = true;
|
|
curMgr.txtBuffOn[(int)AdNumber.exp].gameObject.SetActive(true);
|
|
curMgr.expOn.gameObject.SetActive(false);
|
|
curMgr.txtTimerExp.gameObject.SetActive(false);
|
|
curMgr.SwitchBuffIcon((int)AdNumber.exp, false);
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
curMgr.txtBuffOn[(int)AdNumber.exp].text = LocalizationText.GetText("adbuff_playad");
|
|
}
|
|
|
|
private void SwitchBuffIcon(int inum, bool bOn)//버프 여부에 따른 아이콘 교체
|
|
{
|
|
switch (inum)
|
|
{
|
|
case (int)AdNumber.atk:
|
|
if (canvasUI.enabled)
|
|
buffIconOn[(int)AdNumber.atk].gameObject.SetActive(bOn);
|
|
buffIconOff[(int)AdNumber.atk].gameObject.SetActive(!bOn);
|
|
break;
|
|
case (int)AdNumber.gold:
|
|
if (canvasUI.enabled)
|
|
buffIconOn[(int)AdNumber.gold].gameObject.SetActive(bOn);
|
|
buffIconOff[(int)AdNumber.gold].gameObject.SetActive(!bOn);
|
|
break;
|
|
case (int)AdNumber.exp:
|
|
if (canvasUI.enabled)
|
|
buffIconOn[(int)AdNumber.exp].gameObject.SetActive(bOn);
|
|
buffIconOff[(int)AdNumber.exp].gameObject.SetActive(!bOn);
|
|
break;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Time
|
|
public static void SUpdateOneSec()
|
|
{
|
|
if (curMgr != null)
|
|
curMgr.UpdateOneSec();
|
|
}
|
|
|
|
// 매초마다 실행. SingleMgr에서 호출.
|
|
private void UpdateOneSec()
|
|
{
|
|
if (BattleMgr.Instance.BattlePause) return;
|
|
|
|
for (int i = 0; i < adTimer.Length; i++)
|
|
{
|
|
if (adTimer[i] < 0)
|
|
continue;
|
|
if (adTimer[i] >= 0 || isNoAd == true)//타이머가 남아있거나 광고제거가 구매되어있다면 진입한다.
|
|
{
|
|
if(adTimer[i] >= 0 && isNoAd == false)//타이머가 남아있는데 광고제거가 없다면 타이머가 줄어든다.
|
|
adTimer[i] -= 1;//초당 시간 줄어드는 양
|
|
|
|
switch (i)//1초당 경험치 1을 추가한다.
|
|
{
|
|
case (int)AdNumber.atk:
|
|
if (DataHandler.GetSysAdBuffLevel(DataHandler.GetSysAdBuffMaxLevel()).exp > DataHandler.PlayBuff.atkExp)
|
|
{
|
|
DataHandler.PlayBuff.atkExp += 1;//초당 경험치량
|
|
if((DataHandler.GetSysAdBuffLevel(DataHandler.GetSysAdBuffMaxLevel()).exp < DataHandler.PlayBuff.atkExp))
|
|
{
|
|
DataHandler.PlayBuff.atkExp = DataHandler.GetSysAdBuffLevel(DataHandler.GetSysAdBuffMaxLevel()).exp;
|
|
}
|
|
|
|
BuffExpSet(AdNumber.atk);
|
|
BadgeActive();
|
|
}
|
|
break;
|
|
case (int)AdNumber.gold:
|
|
if (DataHandler.GetSysAdBuffLevel(DataHandler.GetSysAdBuffMaxLevel()).exp > DataHandler.PlayBuff.goldExp)
|
|
{
|
|
DataHandler.PlayBuff.goldExp += 1;//초당 경험치량
|
|
if ((DataHandler.GetSysAdBuffLevel(DataHandler.GetSysAdBuffMaxLevel()).exp < DataHandler.PlayBuff.goldExp))
|
|
{
|
|
DataHandler.PlayBuff.goldExp = DataHandler.GetSysAdBuffLevel(DataHandler.GetSysAdBuffMaxLevel()).exp;
|
|
}
|
|
|
|
BuffExpSet(AdNumber.gold);
|
|
BadgeActive();
|
|
}
|
|
break;
|
|
case (int)AdNumber.exp:
|
|
if (DataHandler.GetSysAdBuffLevel(DataHandler.GetSysAdBuffMaxLevel()).exp > DataHandler.PlayBuff.expExp)
|
|
{
|
|
DataHandler.PlayBuff.expExp += 1;//초당 경험치량
|
|
if ((DataHandler.GetSysAdBuffLevel(DataHandler.GetSysAdBuffMaxLevel()).exp < DataHandler.PlayBuff.expExp))
|
|
{
|
|
DataHandler.PlayBuff.expExp = DataHandler.GetSysAdBuffLevel(DataHandler.GetSysAdBuffMaxLevel()).exp;
|
|
}
|
|
|
|
BuffExpSet(AdNumber.exp);
|
|
BadgeActive();
|
|
}
|
|
break;
|
|
}
|
|
|
|
DataHandler.PlayBuff.Save(DataHandler.PlayData.server);
|
|
|
|
if (adTimer[i] <= 0)
|
|
{
|
|
switch ((AdNumber)i)
|
|
{
|
|
case AdNumber.atk:
|
|
btnOffAdBuffAttack();
|
|
break;
|
|
case AdNumber.gold:
|
|
btnOffAdBuffGold();
|
|
break;
|
|
case AdNumber.exp:
|
|
btnOffAdBuffExp();
|
|
break;
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetTimer(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(canvasUI.isActiveAndEnabled)
|
|
{
|
|
ButtonActive();
|
|
}
|
|
|
|
}
|
|
|
|
private void SetTimer(int i)//1분 이상 남았을때와 이하로 남았을때 표시하는 방식을 다르게 해준다.
|
|
{
|
|
if (adTimer[i] < 60)
|
|
{
|
|
switch ((AdNumber)i)
|
|
{
|
|
case AdNumber.atk:
|
|
txtTimerAtk.text = FormatString.StringFormat("{0}s", adTimer[i]);
|
|
txtTimer[(int)AdNumber.atk].text = FormatString.StringFormat("{0} : {1}", adTimer[i] / 60, adTimer[i] % 60);
|
|
break;
|
|
case AdNumber.gold:
|
|
txtTimerGold.text = FormatString.StringFormat("{0}s", adTimer[i]);
|
|
txtTimer[(int)AdNumber.gold].text = FormatString.StringFormat("{0} : {1}", adTimer[i] / 60, adTimer[i] % 60);
|
|
break;
|
|
case AdNumber.exp:
|
|
txtTimerExp.text = FormatString.StringFormat("{0}s", adTimer[i]);
|
|
txtTimer[(int)AdNumber.exp].text = FormatString.StringFormat("{0} : {1}", adTimer[i] / 60, adTimer[i] % 60);
|
|
break;
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch ((AdNumber)i)
|
|
{
|
|
case AdNumber.atk:
|
|
txtTimerAtk.text = FormatString.StringFormat("{0:0}m", adTimer[i]/60);
|
|
txtTimer[(int)AdNumber.atk].text = FormatString.StringFormat("{0} : {1}", adTimer[i] / 60, adTimer[i] % 60);
|
|
break;
|
|
case AdNumber.gold:
|
|
txtTimerGold.text = FormatString.StringFormat("{0:0}m", adTimer[i]/60);
|
|
txtTimer[(int)AdNumber.gold].text = FormatString.StringFormat("{0} : {1}", adTimer[i] / 60, adTimer[i] % 60);
|
|
break;
|
|
case AdNumber.exp:
|
|
txtTimerExp.text = FormatString.StringFormat("{0:0}m", adTimer[i]/60);
|
|
txtTimer[(int)AdNumber.exp].text = FormatString.StringFormat("{0} : {1}", adTimer[i] / 60, adTimer[i] % 60);
|
|
break;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion Time
|
|
|
|
#region AdFree
|
|
public static void SAdBUffNoAd()
|
|
{
|
|
curMgr.AdBuffNoAd();
|
|
}
|
|
|
|
//광고제거가 구매되었다면 타이머를 제거하고 무제한 표시를 활성화한다.
|
|
public void AdBuffNoAd()
|
|
{
|
|
SOnAdBuffAttack();
|
|
SOnAdBuffGold();
|
|
SOnAdBuffExp();
|
|
|
|
imgAd.SetActive(false);
|
|
|
|
txtTimerAtk.gameObject.SetActive(false);
|
|
txtTimerGold.gameObject.SetActive(false);
|
|
txtTimerExp.gameObject.SetActive(false);
|
|
|
|
for (int i = 0; i < btnBuffAd.Length; i++)
|
|
{
|
|
isNoAd = true;
|
|
btnBuffAd[i].gameObject.SetActive(false);
|
|
txtTimer[i].gameObject.SetActive(false);
|
|
timerInf[i].SetActive(true);
|
|
}
|
|
}
|
|
|
|
public void GoAdFreeShop()//광고제거 배너를 누르면 바로 광고제거를 구매하는 창으로 넘어간다.
|
|
{
|
|
//ShopMgr.SOpenShopSpecial();
|
|
|
|
ShopMgr.STryBuy(ShopMgr.SSGetSpecialGetPackKey());
|
|
|
|
BuffWindowOff();
|
|
}
|
|
#endregion
|
|
|
|
#region BuffLvExp
|
|
public void BuffLevelSet(AdNumber iadnum)//버프레벨과 버프효과 퍼센트를 표기한다.
|
|
{
|
|
switch (iadnum)
|
|
{
|
|
case AdNumber.atk:
|
|
txtBuffLevel[(int)iadnum].text = FormatString.StringFormat("Lv. {0}", DataHandler.PlayBuff.atkLv);
|
|
txtBuffDesc[(int)iadnum].text = FormatString.StringFormat("{0} + {1}", LocalizationText.GetText("adbuff_atk_buff_per"),
|
|
FormatString.TextIntPer0(DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.atkLv).atkValue));
|
|
break;
|
|
case AdNumber.gold:
|
|
txtBuffLevel[(int)iadnum].text = FormatString.StringFormat("Lv. {0}", DataHandler.PlayBuff.goldLv);
|
|
txtBuffDesc[(int)iadnum].text = FormatString.StringFormat("{0} + {1}", LocalizationText.GetText("adbuff_gold_buff_per"),
|
|
FormatString.TextIntPer0(DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.goldLv).goldValue));
|
|
break;
|
|
case AdNumber.exp:
|
|
txtBuffLevel[(int)iadnum].text = FormatString.StringFormat("Lv. {0}", DataHandler.PlayBuff.expLv);
|
|
txtBuffDesc[(int)iadnum].text = FormatString.StringFormat("{0} + {1}", LocalizationText.GetText("adbuff_exp_buff_per"),
|
|
FormatString.TextIntPer0(DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.expLv).expValue));
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void BuffExpSet(AdNumber iadnum)//경험치를 세팅한다.
|
|
{
|
|
dAdBuff bufflvnext;
|
|
dAdBuff bufflvcurrent;
|
|
|
|
float fexpmax = 0;
|
|
float fprevmax = 0;
|
|
float maxlvexp = DataHandler.GetSysAdBuffLevel(DataHandler.GetSysAdBuffs().Length).exp - DataHandler.GetSysAdBuffLevel(DataHandler.GetSysAdBuffs().Length - 1).exp;
|
|
switch (iadnum)
|
|
{
|
|
case AdNumber.atk:
|
|
bufflvnext = DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.atkLv + 1);
|
|
bufflvcurrent = DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.atkLv);
|
|
|
|
fexpmax = bufflvnext.exp;
|
|
fprevmax = bufflvcurrent.exp;
|
|
|
|
txtBuffExpNum[(int)iadnum].text = FormatString.TextCntPer((DataHandler.PlayBuff.atkExp - fprevmax).ToString(), (fexpmax - fprevmax).ToString());
|
|
if (DataHandler.PlayBuff.atkLv >= DataHandler.GetSysAdBuffs().Length)
|
|
{
|
|
txtBuffExpNum[(int)iadnum].text = "MAX";
|
|
txtBuffExpNum[(int)iadnum].color = Global.CLR_TextYellow;
|
|
sldBuffExp[(int)iadnum].value = 1;
|
|
buffMax[(int)iadnum].SetActive(true);
|
|
}
|
|
else
|
|
{
|
|
sldBuffExp[(int)iadnum].value = (DataHandler.PlayBuff.atkExp - fprevmax) / (fexpmax - fprevmax);
|
|
}
|
|
break;
|
|
case AdNumber.gold:
|
|
bufflvnext = DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.goldLv + 1);
|
|
bufflvcurrent = DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.goldLv);
|
|
|
|
fexpmax = bufflvnext.exp;
|
|
fprevmax = bufflvcurrent.exp;
|
|
|
|
txtBuffExpNum[(int)iadnum].text = FormatString.TextCntPer((DataHandler.PlayBuff.goldExp - fprevmax).ToString(), (fexpmax - fprevmax).ToString());
|
|
if (DataHandler.PlayBuff.goldLv >= DataHandler.GetSysAdBuffs().Length)
|
|
{
|
|
txtBuffExpNum[(int)iadnum].text = "MAX";
|
|
txtBuffExpNum[(int)iadnum].color = Global.CLR_TextYellow;
|
|
sldBuffExp[(int)iadnum].value = 1;
|
|
buffMax[(int)iadnum].SetActive(true);
|
|
}
|
|
else
|
|
{
|
|
sldBuffExp[(int)iadnum].value = (DataHandler.PlayBuff.goldExp - fprevmax) / (fexpmax - fprevmax);
|
|
}
|
|
break;
|
|
case AdNumber.exp:
|
|
bufflvnext = DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.expLv + 1);
|
|
bufflvcurrent = DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.expLv);
|
|
|
|
fexpmax = bufflvnext.exp;
|
|
fprevmax = bufflvcurrent.exp;
|
|
|
|
txtBuffExpNum[(int)iadnum].text = FormatString.TextCntPer((DataHandler.PlayBuff.expExp - fprevmax).ToString(), (fexpmax - fprevmax).ToString());
|
|
if (DataHandler.PlayBuff.expLv >= DataHandler.GetSysAdBuffs().Length)
|
|
{
|
|
txtBuffExpNum[(int)iadnum].text = "MAX";
|
|
txtBuffExpNum[(int)iadnum].color = Global.CLR_TextYellow;
|
|
sldBuffExp[(int)iadnum].value = 1;
|
|
buffMax[(int)iadnum].SetActive(true);
|
|
}
|
|
else
|
|
{
|
|
sldBuffExp[(int)iadnum].value = (DataHandler.PlayBuff.expExp - fprevmax) / (fexpmax - fprevmax);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void BuffAtkLevelUp()//레벨업 버튼을 누르면 광고버프레벨이 올라간다.
|
|
{
|
|
if (DataHandler.GetSysAdBuffs().Length > DataHandler.PlayBuff.atkLv)
|
|
{
|
|
if (DataHandler.PlayBuff.atkExp >= DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.atkLv + 1).exp)
|
|
{
|
|
ptcLevelUp[0].Play();
|
|
DataHandler.PlayBuff.atkLv++;
|
|
BuffLevelSet(AdNumber.atk);
|
|
BuffExpSet(AdNumber.atk);
|
|
|
|
BuffMgr.Instance.OnAdBuff(eEffectType.AtkBuff, DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.atkLv).atkValue, true);
|
|
BattleMgr.StatRecalc();
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
|
|
SoundMgr.PlaySfx(SoundName.ReinforceSuccess);
|
|
|
|
TrySvPlayBuffSave(DataHandler.PlayBuff);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void BuffGoldLevelUp()
|
|
{
|
|
if (DataHandler.GetSysAdBuffs().Length > DataHandler.PlayBuff.goldLv)
|
|
{
|
|
if (DataHandler.PlayBuff.goldExp >= DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.goldLv + 1).exp)
|
|
{
|
|
ptcLevelUp[1].Play();
|
|
DataHandler.PlayBuff.goldLv++;
|
|
BuffLevelSet(AdNumber.gold);
|
|
BuffExpSet(AdNumber.gold);
|
|
|
|
BuffMgr.Instance.OnAdBuff(eEffectType.GoldDropRate, DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.goldLv).goldValue, true);
|
|
BattleMgr.StatRecalc();
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
|
|
SoundMgr.PlaySfx(SoundName.ReinforceSuccess);
|
|
|
|
TrySvPlayBuffSave(DataHandler.PlayBuff);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void BuffExpLevelUp()
|
|
{
|
|
if (DataHandler.GetSysAdBuffs().Length > DataHandler.PlayBuff.expLv)
|
|
{
|
|
if (DataHandler.PlayBuff.expExp >= DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.expLv + 1).exp)
|
|
{
|
|
ptcLevelUp[2].Play();
|
|
DataHandler.PlayBuff.expLv++;
|
|
BuffLevelSet(AdNumber.exp);
|
|
BuffExpSet(AdNumber.exp);
|
|
|
|
BuffMgr.Instance.OnAdBuff(eEffectType.ExpDropRate, DataHandler.GetSysAdBuffLevel(DataHandler.PlayBuff.expLv).expValue, true);
|
|
BattleMgr.StatRecalc();
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
|
|
SoundMgr.PlaySfx(SoundName.ReinforceSuccess);
|
|
|
|
TrySvPlayBuffSave(DataHandler.PlayBuff);
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region SVConnect
|
|
|
|
nAdBuffReturn adBuffData = null;
|
|
|
|
public static void TrySvPlayBuffSave(cAdBuffLevel data)
|
|
{
|
|
curMgr.adBuffData = new nAdBuffReturn();
|
|
|
|
curMgr.adBuffData.playBuff = data;
|
|
|
|
curMgr.APlayBuffSave();
|
|
}
|
|
|
|
private void APlayBuffSave()//버프레벨업을 할때 저장한다. 버프 경험치는 로컬에 저장된다(서버에는 1초마다 저장을 할 수는 없으므로)
|
|
{
|
|
CoverCamera.Hold();
|
|
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.SaveAdBuffLevel), typeof(nAdBuffReturn), APlayBuffSaveSucc, APlayBuffSaveFail, adBuffData, true);
|
|
}
|
|
|
|
private void APlayBuffSaveFail(SvError error, object request)
|
|
{
|
|
CoverCamera.Release();
|
|
adBuffData = null;
|
|
}
|
|
|
|
private void APlayBuffSaveSucc(object result, object request)
|
|
{
|
|
nAdBuffReturn data = result as nAdBuffReturn;
|
|
if (data == null)
|
|
{
|
|
APlayBuffSaveFail(new SvError(eErrorCode.NULL_OR_EMPTY), request);
|
|
return;
|
|
}
|
|
|
|
DataHandler.PlayBuff.Save(DataHandler.PlayData.server);
|
|
|
|
ButtonActive();
|
|
BadgeActive();
|
|
|
|
adBuffData = null;
|
|
|
|
CoverCamera.Release();
|
|
}
|
|
#endregion
|
|
|
|
}
|