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.
1757 lines
56 KiB
1757 lines
56 KiB
using IVDataFormat;
|
|
using Spine;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Numerics;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using Vector3 = UnityEngine.Vector3;
|
|
|
|
public class EnhanceMgr : MonoSingleton<EnhanceMgr>
|
|
{
|
|
#region UI
|
|
[Header("UI")]
|
|
[SerializeField]
|
|
private TextMeshProUGUI txtMainT;
|
|
[SerializeField]
|
|
GameObject mainEnhanceBedge;
|
|
[SerializeField]
|
|
GameObject goldEnhanceBedge;
|
|
[SerializeField]
|
|
GameObject pointEnhanceBedge;
|
|
|
|
[SerializeField]
|
|
private Canvas canvasUI;
|
|
[SerializeField]
|
|
private Canvas leftWindow;
|
|
private ButtonIV[] btnTabs;
|
|
|
|
private GameObject[] groupTabs;
|
|
|
|
[SerializeField]
|
|
EScrController escrCharGoldEnhance;
|
|
[SerializeField]
|
|
EScrController escrCharLvPointEnhance;
|
|
[SerializeField]
|
|
EScrController escrAutoRerollConfig;
|
|
[SerializeField]
|
|
EScrController escrAwakenDungeon;
|
|
|
|
GameObject goldMulti;
|
|
GameObject lvPointMulti;
|
|
GameObject AwakenImage;
|
|
GameObject AwakenBottom;
|
|
|
|
[SerializeField]
|
|
ButtonIV[] goldMultiButton;
|
|
[SerializeField]
|
|
ButtonIV[] lvPointMultiButton;
|
|
|
|
[SerializeField] ViewGroup tabGoldViewGroup;
|
|
[SerializeField] ViewGroup tabLvPointViewGroup;
|
|
[SerializeField] ViewGroup tabAwakenViewGroup;
|
|
#endregion UI
|
|
|
|
private int iLoading = 1;
|
|
private bool bReLocalize = true;
|
|
private bool bReLocalizeGold, bReLocalizeLvPoint, bReLocalizeAwaken = false;
|
|
private bool bInitNeed = true;
|
|
private bool bInitNeedGold = true;
|
|
private bool bInitNeedLvPoint = true;
|
|
private bool blnitNeedAwaken = true;
|
|
private int iSelectedTab = -1;
|
|
|
|
private Texture2D tx2dSelectedCloth = null;
|
|
|
|
#region LeftWindow
|
|
TextMeshProUGUI txtLeftWindow;
|
|
GameObject myInfo;
|
|
GameObject myAwaken;
|
|
GameObject ChangeButtonSet;
|
|
GameObject AutoChanging;
|
|
GameObject AutoConfig;
|
|
TextMeshProUGUI txtInfo;
|
|
TextMeshProUGUI txtProgress;
|
|
TextMeshProUGUI txtRareity;
|
|
RareityAutoReroll[] rareityAutos;
|
|
GameObject SelectConfig;
|
|
ButtonIV btnAutoSpend;
|
|
TextMeshProUGUI txtSelectConfig;
|
|
[SerializeField]
|
|
ButtonIV btnStoneSpend;
|
|
TextMeshProUGUI txtChange;
|
|
TextMeshProUGUI txtChangeCost;
|
|
[SerializeField]
|
|
ButtonIV btnStoneSpendAuto;
|
|
TextMeshProUGUI txtChangeAuto;
|
|
TextMeshProUGUI txtChangeCostAuto;
|
|
|
|
GameObject goLeftBtnInfo;
|
|
GameObject goLeftBack;
|
|
#endregion
|
|
|
|
#region PlayerInfo
|
|
GameObject playerLevelInfo;
|
|
TextMeshProUGUI lvTxt;
|
|
TextMeshProUGUI lvPercentTxt;
|
|
Slider ExpFill;
|
|
ButtonIV btnReset;
|
|
TextMeshProUGUI txtReset;
|
|
TextMeshProUGUI txtPrice;
|
|
Image imgPicon;
|
|
#endregion
|
|
|
|
#region Awaken
|
|
[SerializeField]
|
|
GameObject awakenLock;
|
|
[SerializeField]
|
|
GameObject awakenVerticalList;
|
|
[SerializeField]
|
|
GameObject awakenButtonPrefab;
|
|
AwakenEffectItem[] awakenButton;
|
|
int rerollCost;
|
|
[SerializeField]
|
|
TextMeshProUGUI txtRewardList;
|
|
[SerializeField]
|
|
TextMeshProUGUI txtRewardDia;
|
|
[SerializeField]
|
|
GameObject awakenAutoButton;
|
|
|
|
[SerializeField]
|
|
ButtonIV[] btnAbilityPreset;
|
|
[SerializeField]
|
|
TextMeshProUGUI txtSave;
|
|
[SerializeField]
|
|
TextMeshProUGUI txtEffect, txtValue;
|
|
|
|
private eEffectType[] efcOptions;
|
|
private bool[] bSelectedOptions;
|
|
#endregion
|
|
|
|
#region MyInfo
|
|
|
|
[SerializeField]
|
|
private IVCharSimple ivChar;
|
|
|
|
[SerializeField]
|
|
GameObject StatInfoT;
|
|
TextMeshProUGUI[] charInfoNameT;
|
|
TextMeshProUGUI[] charInfoNumberT;
|
|
|
|
[SerializeField]
|
|
GameObject StatInfoB;
|
|
TextMeshProUGUI[] charInfoNameB;
|
|
TextMeshProUGUI[] charInfoNumberB;
|
|
#endregion
|
|
|
|
#region Base
|
|
public static void SLocalize(bool bmain)
|
|
{
|
|
if (Instance != null)
|
|
Instance.Localize(bmain);
|
|
}
|
|
|
|
// 번역.
|
|
private void Localize(bool bmain)
|
|
{
|
|
if (bmain)
|
|
{
|
|
txtMainT.text = LocalizationText.GetText("enhance_title");
|
|
}
|
|
else
|
|
{
|
|
bReLocalize = false;
|
|
canvasUI.transform.Find("txtT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("enhance_title");
|
|
|
|
btnTabs[0].transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("enhance_gold");
|
|
btnTabs[1].transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("enhance_lvpoint");
|
|
btnTabs[2].transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("enhance_awaken");
|
|
|
|
txtInfo.text = LocalizationText.GetText("awaken_auto_info");
|
|
txtRareity.text = LocalizationText.GetText("awaken_grade_kind");
|
|
for (int i = 0; i < rareityAutos.Length; i++)
|
|
rareityAutos[i].Localize();
|
|
|
|
txtSelectConfig.text = LocalizationText.GetText("awaken_ability_kind");
|
|
txtProgress.text = LocalizationText.GetText("all_autoprocessing");
|
|
|
|
txtChange.text = LocalizationText.GetText("all_changego");
|
|
txtChangeAuto.text = LocalizationText.GetText("all_changego");
|
|
|
|
txtRewardList.text = LocalizationText.GetText("reward_list");
|
|
txtSave.text = LocalizationText.GetText("all_save");
|
|
|
|
for (int i = 0; i < charInfoNameT.Length; i++)
|
|
{
|
|
charInfoNameT[i].text = LocalizationText.GetText(FormatString.CombineAllString("stat_kind_top", (i + 1).ToString()));
|
|
}
|
|
for (int i = 0; i < charInfoNameB.Length; i++)
|
|
{
|
|
charInfoNameB[i].text = LocalizationText.GetText(FormatString.CombineAllString("stat_kind_bottom", (i + 1).ToString()));
|
|
}
|
|
}
|
|
}
|
|
|
|
// 설정에서 언어 변경 시 처리.
|
|
public static void SReLocalize()
|
|
{
|
|
Instance.Localize(true);
|
|
Instance.bReLocalize = true;
|
|
Instance.bReLocalizeGold = true;
|
|
Instance.bReLocalizeLvPoint = true;
|
|
Instance.bReLocalizeAwaken = true;
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
CheckBedge();
|
|
StartSetAwakenPreset();
|
|
iLoading--;
|
|
}
|
|
|
|
private void Init()
|
|
{
|
|
bInitNeed = false;
|
|
btnTabs = canvasUI.transform.Find("tabWrapTop").GetComponentsInChildren<ButtonIV>(true);
|
|
|
|
goldEnhanceBedge = btnTabs[0].transform.Find("badge").gameObject;
|
|
pointEnhanceBedge = btnTabs[1].transform.Find("badge").gameObject;
|
|
|
|
groupTabs = new GameObject[btnTabs.Length];
|
|
groupTabs[0] = canvasUI.transform.Find("SvGold").gameObject;
|
|
groupTabs[1] = canvasUI.transform.Find("SvLvPoint").gameObject;
|
|
groupTabs[2] = canvasUI.transform.Find("SvAwaken").gameObject;
|
|
|
|
goldMulti = canvasUI.transform.Find("MultiGoldGroup").gameObject;
|
|
lvPointMulti = canvasUI.transform.Find("LvPointGroup").gameObject;
|
|
playerLevelInfo = lvPointMulti.transform.Find("PlayerLvInfo").gameObject;
|
|
AwakenImage = canvasUI.transform.Find("AwakenImage").gameObject;
|
|
AwakenBottom = canvasUI.transform.Find("AwakenBottom").gameObject;
|
|
|
|
lvTxt = playerLevelInfo.transform.Find("Lvtxt").GetComponent<TextMeshProUGUI>();
|
|
lvPercentTxt = playerLevelInfo.transform.Find("LvPercenttxt").GetComponent<TextMeshProUGUI>();
|
|
ExpFill = playerLevelInfo.transform.Find("sliderBg").GetComponent<Slider>();
|
|
btnReset = playerLevelInfo.transform.Find("btnReset").GetComponent<ButtonIV>();
|
|
imgPicon = playerLevelInfo.transform.Find("picon").GetComponent<Image>();
|
|
imgPicon.sprite = AddressableMgr.GetPlayerIcon(DataHandler.PlayData.playerIcon);
|
|
txtReset = btnReset.transform.Find("txtReset").GetComponent<TextMeshProUGUI>();
|
|
txtPrice = btnReset.transform.Find("txtPrice").GetComponent<TextMeshProUGUI>();
|
|
|
|
awakenButton = new AwakenEffectItem[6];
|
|
|
|
txtLeftWindow = leftWindow.transform.Find("txtT").GetComponent<TextMeshProUGUI>();
|
|
myInfo = leftWindow.transform.Find("MyInfo").gameObject;
|
|
myAwaken = leftWindow.transform.Find("MyAwaken").gameObject;
|
|
AutoConfig = leftWindow.transform.Find("AutoConfig").gameObject;
|
|
txtInfo = AutoConfig.transform.Find("txtInfo").GetComponent<TextMeshProUGUI>();
|
|
txtRareity = AutoConfig.transform.Find("RareitySet").Find("txtRareity").GetComponent<TextMeshProUGUI>();
|
|
rareityAutos = AutoConfig.transform.Find("RareitySet").Find("rareitySelect").GetComponentsInChildren<RareityAutoReroll>(true);
|
|
for (int i = 0; i < rareityAutos.Length; i++)
|
|
rareityAutos[i].Init();
|
|
|
|
SelectConfig = AutoConfig.transform.Find("SelectConfig").gameObject;
|
|
btnAutoSpend = SelectConfig.transform.Find("btnStoneSpend (1)").GetComponent<ButtonIV>();
|
|
txtSelectConfig = SelectConfig.transform.Find("txtSelectConfig").GetComponent<TextMeshProUGUI>();
|
|
goLeftBack = leftWindow.transform.Find("back").gameObject;
|
|
goLeftBtnInfo = myAwaken.transform.Find("btnInfo").gameObject;
|
|
ChangeButtonSet = myAwaken.transform.Find("ChangeButtonSet").gameObject;
|
|
AutoChanging = myAwaken.transform.Find("AutoChanging").gameObject;
|
|
txtProgress = AutoChanging.transform.Find("txtProgress").GetComponent<TextMeshProUGUI>();
|
|
|
|
txtChange = btnStoneSpend.transform.Find("txtChange").GetComponent<TextMeshProUGUI>();
|
|
txtChangeCost = btnStoneSpend.transform.Find("txtPrice").GetComponent<TextMeshProUGUI>();
|
|
|
|
txtChangeAuto = btnStoneSpendAuto.transform.Find("txtChange").GetComponent<TextMeshProUGUI>();
|
|
txtChangeCostAuto = btnStoneSpendAuto.transform.Find("txtPrice").GetComponent<TextMeshProUGUI>();
|
|
|
|
charInfoNameT = new TextMeshProUGUI[2];
|
|
charInfoNumberT = new TextMeshProUGUI[2];
|
|
TextMeshProUGUI[] objListT = StatInfoT.GetComponentsInChildren<TextMeshProUGUI>(true);
|
|
|
|
for (int i = 0; i < objListT.Length; i += 2)
|
|
{
|
|
charInfoNameT[i / 2] = objListT[i];
|
|
charInfoNumberT[i / 2] = objListT[i + 1];
|
|
}
|
|
|
|
charInfoNameB = new TextMeshProUGUI[15];
|
|
charInfoNumberB = new TextMeshProUGUI[15];
|
|
TextMeshProUGUI[] objListB = StatInfoB.GetComponentsInChildren<TextMeshProUGUI>(true);
|
|
|
|
for (int i = 0; i < objListB.Length; i += 2)
|
|
{
|
|
charInfoNameB[i / 2] = objListB[i];
|
|
charInfoNumberB[i / 2] = objListB[i + 1];
|
|
}
|
|
|
|
awakenAutoButton.transform.Find("txtAuto").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_changeauto");
|
|
}
|
|
|
|
public static bool SCloseMenu()
|
|
{
|
|
return Instance.CloseMenu();
|
|
}
|
|
|
|
private bool CloseMenu()
|
|
{
|
|
// 게임 시작 후 열린적 없음.
|
|
if (iSelectedTab < 0)
|
|
return false;
|
|
|
|
// 추가 효과 자동 변경 설정.
|
|
if (AutoConfig.activeSelf)
|
|
{
|
|
ExitAutoRerollConfig();
|
|
return true;
|
|
}
|
|
|
|
// 추가 효과 자동 변경 진행중.
|
|
if (autoReroll)
|
|
{
|
|
ForceAutoStop();
|
|
return true;
|
|
}
|
|
|
|
if (canvasUI.enabled)
|
|
{
|
|
CloseEnhance();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
#endregion Base
|
|
|
|
#region UI
|
|
public void MoveEnhance(eEventMoveType content)
|
|
{
|
|
OpenEnhance();
|
|
switch (content)
|
|
{
|
|
case eEventMoveType.EnhnaceGold: TabGold(); break;
|
|
case eEventMoveType.EnhancePoint: TabLvPoint(); break;
|
|
case eEventMoveType.EnhanceAwakne: TabTrain(); break;
|
|
}
|
|
}
|
|
|
|
// 강화창 열기.
|
|
public void OpenEnhance()
|
|
{
|
|
if (iLoading > 0) return;
|
|
|
|
GameModDataGroup.Instance.TryGetModData(TrainDgProp.CodeName, out TrainDgData modData);
|
|
Debug.Assert(modData != null, "invalid dungeon data");
|
|
|
|
iLoading++;
|
|
|
|
canvasUI.enabled = true;
|
|
leftWindow.enabled = true;
|
|
GameUIMgr.SRightWindowClose();
|
|
GameUIMgr.SOpenLeftPanel(gold : true, dia : true, lvpoint : true , change : true);
|
|
GameUIMgr.SSetMainUiOn(false);
|
|
BattleMgr.CloseFailScroll();
|
|
|
|
if (bInitNeed)
|
|
{
|
|
Init();
|
|
ivChar.Init();
|
|
for (int i = 0; i < awakenButton.Length; i++)
|
|
{
|
|
awakenButton[i] = Instantiate(awakenButtonPrefab, awakenVerticalList.transform).GetComponent<AwakenEffectItem>();
|
|
awakenButton[i].SetIndex(i);
|
|
}
|
|
SetAwakenLockSlot(DataHandler.PlayAwaken.awakenUnlock[DataHandler.PlayAwaken.usePreset]);
|
|
}
|
|
|
|
StartCoroutine(nameof(LoadCostume));
|
|
|
|
if (bReLocalize)
|
|
{
|
|
int tab = 0;
|
|
if (iSelectedTab >= 0)
|
|
{
|
|
tab = iSelectedTab;
|
|
btnTabs[iSelectedTab].interactable = true;
|
|
iSelectedTab = -1;
|
|
}
|
|
|
|
Localize(false);
|
|
|
|
if (tab == 0)
|
|
TabGold();
|
|
else if (tab == 1)
|
|
TabLvPoint();
|
|
else if (tab == 2)
|
|
TabTrain();
|
|
}
|
|
|
|
//경험치 재계산과 스텟 재계산
|
|
RefreshPlayerExpInfo();
|
|
CalcPlayerInfoStat();
|
|
|
|
//각 항목의 Escr 새로고침
|
|
if (iSelectedTab == 0)
|
|
{
|
|
bReLocalizeGold = false;
|
|
escrCharGoldEnhance.scroller.RefreshActiveCellViews();
|
|
|
|
myInfo.SetActive(true);
|
|
myAwaken.SetActive(false);
|
|
}
|
|
else if (iSelectedTab == 1)
|
|
{
|
|
bReLocalizeLvPoint = false;
|
|
escrCharLvPointEnhance.scroller.RefreshActiveCellViews();
|
|
|
|
myInfo.SetActive(true);
|
|
myAwaken.SetActive(false);
|
|
}
|
|
else if (iSelectedTab == 2)
|
|
{
|
|
for (int i = 0; i < awakenButton.Length; i++)
|
|
{
|
|
if(bReLocalizeAwaken)
|
|
{
|
|
awakenButton[i].Localize();
|
|
}
|
|
|
|
awakenButton[i].RefreshLockState();
|
|
}
|
|
bReLocalizeAwaken = false;
|
|
|
|
selectedTrainLevel = (int)modData.Level;
|
|
txtEffect.text = FormatString.StringFormat("{0} {1}", LocalizationText.GetText("efc11"), FormatString.TextIntPer0CommaBi(DataHandler.SysAwakenRewards[selectedTrainLevel].awakenInc));
|
|
|
|
float scrollPosition = 0;
|
|
if (modData.Level >= 2)
|
|
scrollPosition = escrAwakenDungeon.scroller.GetScrollPositionForCellViewIndex((int)modData.Level - 2, EnhancedUI.EnhancedScroller.EnhancedScroller.CellViewPositionEnum.Before);
|
|
|
|
escrAwakenDungeon.scroller.SetScrollPositionImmediately(scrollPosition);
|
|
escrAwakenDungeon.scroller.RefreshActiveCellViews();
|
|
|
|
myInfo.SetActive(false);
|
|
myAwaken.SetActive(true);
|
|
|
|
RecalculateRerollCost();
|
|
}
|
|
|
|
iLoading--;
|
|
|
|
imgPicon.sprite = AddressableMgr.GetPlayerIcon(DataHandler.PlayData.playerIcon);
|
|
|
|
//뱃지 확인
|
|
CheckBedge();
|
|
awakenLock.SetActive(!DataHandler.IsClearStage(modData.OpenStage));
|
|
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
//전투 창의 강화버튼 뱃지 체크. 체크는 골드를 정산받을때 한다.
|
|
public static bool IsMainEnhanceBedgeOn()
|
|
{
|
|
return Instance.mainEnhanceBedge.activeSelf;
|
|
}
|
|
|
|
//골드와 포인트쪽 뱃지 체크. 두개가 끝나면 전투창 뱃지를 체크한다.
|
|
public static void CheckBedge()
|
|
{
|
|
CalcGoldEnhance();
|
|
CalcPointEnhance();
|
|
Instance.EnhanceBedgeSetActive();
|
|
}
|
|
|
|
//골드 escr 새로고침
|
|
public static void RefreshGoldAll()
|
|
{
|
|
Instance.escrCharGoldEnhance.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
// 강화창 닫기.
|
|
public static void CloseEnhance()
|
|
{
|
|
if (Instance.bInitNeed)
|
|
return;
|
|
if (!Instance.canvasUI.enabled)
|
|
return;
|
|
if (!Instance.autoReroll)
|
|
{
|
|
Instance.ivChar.gameObject.SetActive(false);
|
|
|
|
if (Instance.iLoading > 0)
|
|
return;
|
|
Instance.iLoading++;
|
|
|
|
DataHandler.CheckAchivement(eContent.Battle);
|
|
Instance.canvasUI.enabled = false;
|
|
Instance.leftWindow.enabled = false;
|
|
Instance.myInfo.SetActive(false);
|
|
GameUIMgr.SCloseLeftPanel();
|
|
GameUIMgr.SSetMainUiOn(true);
|
|
MissionMgr.SRefreshMission();
|
|
|
|
if (Instance.iSelectedTab == 2)
|
|
{
|
|
Instance.ExitAutoRerollConfig();
|
|
Instance.CancelAwakenPresetSet();
|
|
}
|
|
|
|
Instance.iLoading--;
|
|
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
}
|
|
#endregion UI
|
|
|
|
//내 정보에 표기되는 플레이어 애니메이션.
|
|
#region Costume
|
|
|
|
// 창을 열 때 창의 의상/무기 세팅.
|
|
private IEnumerator LoadCostume()
|
|
{
|
|
ivChar.gameObject.SetActive(true);
|
|
RectTransform rtrfchar = ivChar.GetComponent<RectTransform>();
|
|
Vector3 v3pos = rtrfchar.anchoredPosition3D;
|
|
v3pos.z = -10000f;
|
|
rtrfchar.anchoredPosition3D = v3pos;
|
|
|
|
ivChar.SetSkin(DataHandler.PlayEquipCostume.outfitId, DataHandler.PlayEquipCostume.weaponId);
|
|
|
|
yield return null;
|
|
|
|
v3pos.z = -0f;
|
|
rtrfchar.anchoredPosition3D = v3pos;
|
|
}
|
|
#endregion Costume
|
|
|
|
#region Tab
|
|
//골드 탭을 눌렀을때
|
|
public void TabGold()
|
|
{
|
|
if (!Instance.autoReroll)
|
|
{
|
|
if (iSelectedTab == 0)
|
|
return;
|
|
|
|
if (iSelectedTab >= 0)
|
|
{
|
|
btnTabs[iSelectedTab].interactable = true;
|
|
groupTabs[iSelectedTab].SetActive(false);
|
|
AllEnhanceActiveFalse();
|
|
}
|
|
|
|
iSelectedTab = 0;
|
|
btnTabs[iSelectedTab].interactable = false;
|
|
groupTabs[iSelectedTab].SetActive(true);
|
|
goldMulti.SetActive(true);
|
|
myInfo.SetActive(true);
|
|
myAwaken.SetActive(false);
|
|
AutoConfig.SetActive(false);
|
|
txtLeftWindow.text = LocalizationText.GetText("left_myinfo");
|
|
|
|
if (bInitNeedGold)
|
|
{
|
|
bInitNeedGold = false;
|
|
bReLocalizeGold = false;
|
|
|
|
Dictionary<int, dCharStat> datas = DataHandler.GetCharStats();
|
|
EnhancedUI.SmallList<int> goldEnhance = new EnhancedUI.SmallList<int>();
|
|
|
|
for (int i = 0; i < datas.Count; i++)
|
|
{
|
|
if (datas[i + 1].abilityType != eEffectType.CrtRate || datas[i + 1].level != datas[i + 1].maxLv)
|
|
goldEnhance.Add(datas[i + 1].id);
|
|
}
|
|
for (int i = 0; i < datas.Count; i++)
|
|
{
|
|
if (datas[i + 1].level == datas[i + 1].maxLv && datas[i + 1].abilityType == eEffectType.CrtRate)
|
|
goldEnhance.Add(datas[i + 1].id);
|
|
}
|
|
|
|
escrCharGoldEnhance.LoadDatas(goldEnhance);
|
|
}
|
|
else
|
|
{
|
|
bReLocalizeGold = false;
|
|
escrCharGoldEnhance.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
tabGoldViewGroup.Active();
|
|
tabLvPointViewGroup.Deactive();
|
|
tabAwakenViewGroup.Deactive();
|
|
|
|
EnhanceMgr.Instance.CalcPlayerInfoStat();
|
|
CancelAwakenPresetSet();
|
|
EnhanceBedgeSetActive();
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
}
|
|
//포인트 탭을 눌렀을때
|
|
public void TabLvPoint()
|
|
{
|
|
if (!Instance.autoReroll)
|
|
{
|
|
if (iSelectedTab == 1)
|
|
return;
|
|
|
|
if (iSelectedTab >= 0)
|
|
{
|
|
btnTabs[iSelectedTab].interactable = true;
|
|
groupTabs[iSelectedTab].SetActive(false);
|
|
AllEnhanceActiveFalse();
|
|
}
|
|
|
|
iSelectedTab = 1;
|
|
btnTabs[iSelectedTab].interactable = false;
|
|
groupTabs[iSelectedTab].SetActive(true);
|
|
lvPointMulti.SetActive(true);
|
|
myInfo.SetActive(true);
|
|
myAwaken.SetActive(false);
|
|
AutoConfig.SetActive(false);
|
|
txtLeftWindow.text = LocalizationText.GetText("left_myinfo");
|
|
|
|
if (bInitNeedLvPoint)
|
|
{
|
|
Dictionary<int, dCharStat> datas = DataHandler.GetCharLvPoints();
|
|
|
|
bInitNeedLvPoint = false;
|
|
bReLocalizeLvPoint = false;
|
|
EnhancedUI.SmallList<int> lvPointEnhance = new EnhancedUI.SmallList<int>();
|
|
|
|
for (int i = 0; i < datas.Count; i++)
|
|
{
|
|
lvPointEnhance.Add(datas[i + 1].id);
|
|
}
|
|
|
|
escrCharLvPointEnhance.LoadDatas(lvPointEnhance);
|
|
}
|
|
else
|
|
{
|
|
bReLocalizeLvPoint = false;
|
|
escrCharLvPointEnhance.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
tabGoldViewGroup.Deactive();
|
|
tabLvPointViewGroup.Active();
|
|
tabAwakenViewGroup.Deactive();
|
|
|
|
EnhanceMgr.Instance.CalcPlayerInfoStat();
|
|
CancelAwakenPresetSet();
|
|
EnhanceBedgeSetActive();
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
//레벨포인트의 플레이어 정보 갱신
|
|
txtReset.text = FormatString.StringFormat(LocalizationText.GetText("all_reset"));
|
|
txtPrice.text = DataHandler.Const.lvPointResetPrice.ToString();
|
|
}
|
|
}
|
|
|
|
//각성 탭을 눌렀을때
|
|
public void TabTrain()
|
|
{
|
|
GameModDataGroup.Instance.TryGetModData(TrainDgProp.CodeName, out TrainDgData modData);
|
|
|
|
if (awakenLock.activeSelf)
|
|
{
|
|
GameUIMgr.SOpenToast(FormatString.TextOpenStageClear(modData.OpenStage));
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
return;
|
|
}
|
|
|
|
if (iSelectedTab >= 0)
|
|
{
|
|
btnTabs[iSelectedTab].interactable = true;
|
|
groupTabs[iSelectedTab].SetActive(false);
|
|
AllEnhanceActiveFalse();
|
|
}
|
|
|
|
iSelectedTab = 2;
|
|
btnTabs[iSelectedTab].interactable = false;
|
|
groupTabs[iSelectedTab].SetActive(true);
|
|
AwakenImage.SetActive(true);
|
|
AwakenBottom.SetActive(true);
|
|
myInfo.SetActive(false);
|
|
myAwaken.SetActive(true);
|
|
AutoConfig.SetActive(false);
|
|
goLeftBack.SetActive(false);
|
|
goLeftBtnInfo.SetActive(true);
|
|
txtLeftWindow.text = LocalizationText.GetText("left_hiddenpower");
|
|
RecalculateRerollCost();
|
|
ChangeButtonSetOnoff(true);
|
|
|
|
if (blnitNeedAwaken)
|
|
{
|
|
blnitNeedAwaken = false;
|
|
|
|
AutoConfig.SetActive(true);
|
|
|
|
for (int i = 0; i < awakenButton.Length; i++)
|
|
{
|
|
if (bReLocalizeAwaken)
|
|
awakenButton[i].Localize();
|
|
|
|
if (i + 1 < modData.Level)
|
|
awakenButton[i].UnlockSlot();
|
|
}
|
|
bReLocalizeAwaken = false;
|
|
|
|
var dicdatas = DataHandler.GetExtraAbilityIds()[0];
|
|
var datas = new EnhancedUI.SmallList<int>();
|
|
bSelectedOptions = new bool[dicdatas.Count];
|
|
efcOptions = new eEffectType[dicdatas.Count];
|
|
|
|
int index = 0;
|
|
foreach (var item in dicdatas)
|
|
{
|
|
bSelectedOptions[index] = true;
|
|
efcOptions[index] = DataHandler.GetExtraAbility(item.Value).abilityType;
|
|
datas.Add(index);
|
|
index++;
|
|
}
|
|
escrAutoRerollConfig.LoadDatas(datas);
|
|
AutoConfig.SetActive(false);
|
|
|
|
var awakenDungeon = new EnhancedUI.SmallList<int>();
|
|
for (int i = 0; i < modData.MaxLevel; i++)
|
|
{
|
|
awakenDungeon.Add(i + 1);
|
|
}
|
|
|
|
escrAwakenDungeon.LoadDatas(awakenDungeon);
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < awakenButton.Length; i++)
|
|
{
|
|
if (bReLocalizeAwaken)
|
|
awakenButton[i].Localize();
|
|
|
|
if (i + 1 < modData.Level)
|
|
awakenButton[i].UnlockSlot();
|
|
}
|
|
bReLocalizeAwaken = false;
|
|
|
|
escrAutoRerollConfig.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
tabGoldViewGroup.Deactive();
|
|
tabLvPointViewGroup.Deactive();
|
|
tabAwakenViewGroup.Active();
|
|
|
|
selectedTrainLevel = (int)modData.Level;
|
|
txtEffect.text = FormatString.StringFormat("{0} {1}", LocalizationText.GetText("efc11"), FormatString.TextIntPer0CommaBi(DataHandler.SysAwakenRewards[selectedTrainLevel].awakenInc));
|
|
|
|
float scrollPosition = 0;
|
|
if (modData.Level >= 2)
|
|
scrollPosition = escrAwakenDungeon.scroller.GetScrollPositionForCellViewIndex((int)modData.Level - 2, EnhancedUI.EnhancedScroller.EnhancedScroller.CellViewPositionEnum.Before);
|
|
|
|
escrAwakenDungeon.scroller.SetScrollPositionImmediately(scrollPosition);
|
|
escrAwakenDungeon.scroller.RefreshActiveCellViews();
|
|
|
|
for (int i = 0; i < btnAbilityPreset.Length; i++)
|
|
{
|
|
btnAbilityPreset[i].interactable = DataHandler.PlayAwaken.usePreset != i;
|
|
}
|
|
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
//각성의 자동변경 버튼을 눌렀을때
|
|
public void TabAutoRerollConfig()
|
|
{
|
|
myAwaken.SetActive(false);
|
|
AutoConfig.SetActive(true);
|
|
goLeftBack.SetActive(true);
|
|
goLeftBtnInfo.SetActive(false);
|
|
txtChangeCostAuto.text = rerollCost.ToString();
|
|
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
//각성의 자동변경을 닫았을때
|
|
public void ExitAutoRerollConfig()
|
|
{
|
|
myAwaken.SetActive(true);
|
|
AutoConfig.SetActive(false);
|
|
goLeftBack.SetActive(false);
|
|
goLeftBtnInfo.SetActive(true);
|
|
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
//모든 탭창 비활성화. 다른 탭을 눌렀을때 겹치지 않도록 하기 위해 실행한다.
|
|
void AllEnhanceActiveFalse()
|
|
{
|
|
goldMulti.SetActive(false);
|
|
lvPointMulti.SetActive(false);
|
|
AwakenImage.SetActive(false);
|
|
AwakenBottom.SetActive(false);
|
|
}
|
|
|
|
void ChangeButtonSetOnoff(bool onoff)
|
|
{
|
|
ChangeButtonSet.SetActive(onoff);
|
|
AutoChanging.SetActive(!onoff);
|
|
}
|
|
#endregion Tab
|
|
|
|
Dictionary<int, BigInteger> goldEnhancePrice = new Dictionary<int, BigInteger>();
|
|
|
|
int iupgradeMulti = 1;//강화 횟수
|
|
|
|
int abilityValue = 0;
|
|
int abilityValueInc = 1;
|
|
BigInteger buyingCnt = 0L;
|
|
int buyingCntInc = 1;
|
|
int level = 1;
|
|
int iMaxLv = 100;
|
|
|
|
bool isUnlock = false;
|
|
|
|
BigInteger calcmultiply = 0;
|
|
BigInteger calcdivide = 0;
|
|
BigInteger iprice = 0;
|
|
long icurValue = 0;
|
|
BigInteger inextValue = 0;
|
|
#region GoldMath
|
|
|
|
int iresetValue = 0;
|
|
|
|
public static BigInteger SSingleRecalcGoldPrice(int enhenceId)
|
|
{
|
|
return Instance.SingleRecalcGoldPrice(enhenceId);
|
|
}
|
|
|
|
public BigInteger SingleRecalcGoldPrice(int enhenceId)
|
|
{
|
|
dCharStat charData = DataHandler.GetCharStat(enhenceId);
|
|
|
|
iupgradeMulti = GetMultifulGoldEnhance();//강화 횟수
|
|
|
|
abilityValue = 0;
|
|
abilityValueInc = 1;
|
|
buyingCnt = 0L;
|
|
buyingCntInc = 1;
|
|
level = 1;
|
|
|
|
isUnlock = false;
|
|
|
|
abilityValue = charData.abilityValue;
|
|
abilityValueInc = charData.abilityValueInc;
|
|
buyingCnt = charData.buyingCount;
|
|
buyingCntInc = charData.buyingCntInc;
|
|
iMaxLv = charData.maxLv;
|
|
level = charData.level;
|
|
|
|
// 현재레벨 + 강화횟수가 만렙보다 높으면
|
|
if (charData.level + iupgradeMulti > iMaxLv)
|
|
{
|
|
iupgradeMulti = iMaxLv - level;//만렙 제한
|
|
}
|
|
|
|
iprice = 0L;
|
|
if (enhenceId == 1)
|
|
{
|
|
iprice = CalcCharLvUpPriceAccum1(level % 1000, iupgradeMulti, (double)buyingCntInc / dConst.RateMax, DataHandler.GetGoldLevelInterval(level));
|
|
}
|
|
else if (enhenceId == 2)
|
|
{
|
|
iprice = CalcCharLvUpPriceAccum1(level % 1000, iupgradeMulti, (double)buyingCntInc / dConst.RateMax, DataHandler.GetHpLevelInterval(level));
|
|
}
|
|
else
|
|
{
|
|
iprice = CalcCharLvUpPriceAccum1(level, iupgradeMulti, (double)buyingCntInc / dConst.RateMax, buyingCnt);
|
|
}
|
|
|
|
inextValue = abilityValue + (abilityValueInc * (level + iupgradeMulti));
|
|
|
|
iresetValue = abilityValue + (abilityValueInc * level);
|
|
|
|
return iprice;
|
|
}
|
|
|
|
public BigInteger CalcCharLvUpPriceAccum1(int curlevel, int addlevel, double buyingCntInc, BigInteger buyingCnt)
|
|
{
|
|
if (addlevel < 1)
|
|
return buyingCnt;
|
|
double ftargetlv = curlevel + addlevel - 1d;
|
|
ftargetlv = System.Math.Pow(buyingCntInc, ftargetlv) - 1d;
|
|
double fcurlv = curlevel - 1d;
|
|
fcurlv = System.Math.Pow(buyingCntInc, fcurlv) - 1d;
|
|
ftargetlv -= fcurlv;
|
|
ftargetlv *= buyingCntInc;
|
|
ftargetlv /= (buyingCntInc - 1d);
|
|
|
|
|
|
return buyingCnt * (BigInteger)(ftargetlv * 100) / 100;
|
|
}
|
|
#endregion
|
|
|
|
public static void RefreshPlayerExpInfo()
|
|
{
|
|
if (!Instance.canvasUI.isActiveAndEnabled)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Instance.lvTxt.text = FormatString.TextLv(DataHandler.PlayData.playerLv);
|
|
Instance.lvPercentTxt.text = FormatString.StringFormat("{0:N0}%", DataHandler.GetPlayerExpRate() * 100);
|
|
Instance.ExpFill.value = DataHandler.GetPlayerExpRate();
|
|
if (DataHandler.Goods.Dia >= DataHandler.Const.lvPointResetPrice)
|
|
{
|
|
Instance.btnReset.interactable = true;
|
|
}
|
|
else
|
|
{
|
|
Instance.btnReset.interactable = false;
|
|
}
|
|
}
|
|
|
|
public void ResetLvPointConfirm()
|
|
{
|
|
if (DataHandler.Goods.point >= DataHandler.PlayData.playerLv - 1)
|
|
{
|
|
GameUIMgr.SOpenToast(LocalizationText.GetText("reset_level_no"));
|
|
return;
|
|
}
|
|
|
|
GameUIMgr.SOpenPopup2Button(LocalizationText.GetText("reset_level_q"), ResetLvPoint);
|
|
}
|
|
|
|
//주석은 옛날 서버연동 없을 적 코드라서 삭제해도 무방. 서버와 통신해서 레벨포인트를 리셋한다. 단, 레벨포인트가 레벨 -1 만큼 남아있으면 리셋 금지.
|
|
public void ResetLvPoint()
|
|
{
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, IVServerFormat.UrlApi.GetUrl(IVServerFormat.UrlApi.PointReset), typeof(nCharEnhancePointReturn), APointResetSucc, APointResetFail, null, true);
|
|
}
|
|
|
|
private void APointResetFail(IVServerFormat.SvError error, object request)
|
|
{
|
|
CoverCamera.Release();
|
|
iLoading--;
|
|
}
|
|
|
|
// 레벨 리셋 통신 성공.
|
|
private void APointResetSucc(object result, object request)
|
|
{
|
|
nCharEnhancePointReturn data = result as nCharEnhancePointReturn;
|
|
if (data == null)
|
|
{
|
|
APointEnhanceFail(new IVServerFormat.SvError(IVServerFormat.eErrorCode.NULL_OR_EMPTY), request);
|
|
return;
|
|
}
|
|
|
|
DataHandler.AllResetLvPoint();
|
|
DataHandler.SetGoods(data.playCurrency, false);
|
|
|
|
EnhanceMgr.Instance.CalcPlayerInfoStat();
|
|
Instance.escrCharLvPointEnhance.scroller.RefreshActiveCellViews();
|
|
|
|
if (DataHandler.Goods.Dia >= DataHandler.Const.lvPointResetPrice)
|
|
{
|
|
Instance.btnReset.interactable = true;
|
|
}
|
|
else
|
|
{
|
|
Instance.btnReset.interactable = false;
|
|
}
|
|
GameUIMgr.SOpenToast(LocalizationText.GetText("reset_level_confirm"));
|
|
|
|
CoverCamera.Release();
|
|
iLoading--;
|
|
}
|
|
|
|
int goldMultiful = 1;
|
|
int lvPointMultiful = 1;
|
|
|
|
//골드 쪽 한번에 강화. x10 x100.
|
|
public static void MultifulGoldEnhance(int multi)
|
|
{
|
|
Instance.goldMultiful = multi;
|
|
|
|
ResetMultifulGold();
|
|
switch (multi)
|
|
{
|
|
case 1:
|
|
Instance.goldMultiButton[0].interactable = false;
|
|
break;
|
|
case 10:
|
|
Instance.goldMultiButton[1].interactable = false;
|
|
break;
|
|
case 100:
|
|
Instance.goldMultiButton[2].interactable = false;
|
|
break;
|
|
}
|
|
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
|
|
Instance.escrCharGoldEnhance.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
public static void ResetMultifulGold()
|
|
{
|
|
Instance.goldMultiButton[0].interactable = true;
|
|
Instance.goldMultiButton[1].interactable = true;
|
|
Instance.goldMultiButton[2].interactable = true;
|
|
}
|
|
|
|
public static int GetMultifulGoldEnhance()
|
|
{
|
|
return Instance.goldMultiful;
|
|
}
|
|
|
|
//레벨포인트 한번에 강화.
|
|
public static void MultifulLvPointEnhance(int multi)
|
|
{
|
|
Instance.lvPointMultiful = multi;
|
|
|
|
ResetMultifulLvPoint();
|
|
switch (multi)
|
|
{
|
|
case 1:
|
|
Instance.lvPointMultiButton[0].interactable = false;
|
|
break;
|
|
case 10:
|
|
Instance.lvPointMultiButton[1].interactable = false;
|
|
break;
|
|
case 100:
|
|
Instance.lvPointMultiButton[2].interactable = false;
|
|
break;
|
|
}
|
|
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
|
|
Instance.escrCharLvPointEnhance.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
public static void ResetMultifulLvPoint()
|
|
{
|
|
Instance.lvPointMultiButton[0].interactable = true;
|
|
Instance.lvPointMultiButton[1].interactable = true;
|
|
Instance.lvPointMultiButton[2].interactable = true;
|
|
}
|
|
|
|
public static int GetMultifulLvPointEnhance()
|
|
{
|
|
return Instance.lvPointMultiful;
|
|
}
|
|
|
|
#region Enhance
|
|
// 골드 강화.
|
|
|
|
//안 쓰이는 코드. 서버연결 없을 적.
|
|
public static void SLevelUpCharStatMulti(int key, int upLevel, int cost, int nextStat)
|
|
{
|
|
int level = DataHandler.GetCharStatLevel(key) + upLevel;
|
|
|
|
if (DataHandler.LvUpCharStatMulti(key, level, cost, nextStat))
|
|
{
|
|
Instance.escrCharGoldEnhance.scroller.RefreshActiveCellViews();
|
|
}
|
|
}
|
|
//안 쓰이는 코드. 서버연결 없을 적.
|
|
public static void SLevelUpCharLvPointMulti(int key,int upLevel,int cost, int nextStat)
|
|
{
|
|
int level = DataHandler.GetCharLvPointLevel(key) + upLevel;
|
|
|
|
if (DataHandler.LvUpCharLvPointMulti(key, level, cost, nextStat))
|
|
{
|
|
Instance.escrCharLvPointEnhance.scroller.RefreshActiveCellViews();
|
|
}
|
|
}
|
|
|
|
//서버연결이 있는 골드강화.
|
|
public static void SLevelUpCharStatServer(int key, int upLevel, BigInteger biprice, int nextStat)
|
|
{
|
|
int level = DataHandler.GetCharStatLevel(key) + upLevel;
|
|
|
|
DataHandler.LvUpCharStatServer(key, level, biprice, nextStat);
|
|
//curMgr.escrCharGoldEnhance.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
//서버연결이 있는 포인트강화.
|
|
public static void SLevelUpCharPointServer(int key, int upLevel, int iprice, int nextStat)
|
|
{
|
|
int level = DataHandler.GetCharLvPointLevel(key) + upLevel;
|
|
|
|
DataHandler.LvUpCharPointServer(key, level, iprice, nextStat);
|
|
Instance.escrCharLvPointEnhance.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
nIdEnhance dataEnhance = null;
|
|
|
|
public static bool IsILoadingSetOne()
|
|
{
|
|
if (Instance.iLoading > 0)
|
|
{
|
|
return true;
|
|
}
|
|
Instance.iLoading++;
|
|
return false;
|
|
}
|
|
|
|
public static void MinusILoading()
|
|
{
|
|
Instance.iLoading--;
|
|
}
|
|
|
|
//레벨 포인트를 강화하기전에 서버 저장 상태랄ㅇ 다르면 저장을 한번 한다.
|
|
//그리고 통신을 시도한다.
|
|
public static void TrySVPointEnhance(nIdEnhance data)
|
|
{
|
|
Instance.dataEnhance = data;
|
|
|
|
if (DataHandler.IsNeedDataSave)
|
|
{
|
|
SingleMgr.SaveDataPointEnhanceConsume();
|
|
}
|
|
else
|
|
{
|
|
Instance.APointEnhance();
|
|
}
|
|
}
|
|
|
|
public static void SAPointEnhance()
|
|
{
|
|
Instance.APointEnhance();
|
|
}
|
|
|
|
int coverCameraCount = 0;
|
|
private void APointEnhance()
|
|
{
|
|
CoverCamera.Hold();
|
|
coverCameraCount++;
|
|
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, IVServerFormat.UrlApi.GetUrl(IVServerFormat.UrlApi.PointEnhance), typeof(nCharEnhancePointReturn), APointEnhanceSucc, APointEnhanceFail, dataEnhance, true);
|
|
}
|
|
|
|
private void APointEnhanceFail(IVServerFormat.SvError error, object request)
|
|
{
|
|
CoverCamera.Release();
|
|
DataHandler.AddLvPoint(dataEnhance.useGoods);
|
|
SLevelUpCharPointServer(dataEnhance.sid, -(dataEnhance.aftLv - dataEnhance.befLv), dataEnhance.useGoods, 0);
|
|
Instance.escrCharLvPointEnhance.scroller.RefreshActiveCellViews();
|
|
dataEnhance = null;
|
|
iLoading--;
|
|
}
|
|
|
|
// 레벨 강화 통신 성공.
|
|
private void APointEnhanceSucc(object result, object request)
|
|
{
|
|
nCharEnhancePointReturn data = result as nCharEnhancePointReturn;
|
|
if (data == null)
|
|
{
|
|
APointEnhanceFail(new IVServerFormat.SvError(IVServerFormat.eErrorCode.NULL_OR_EMPTY), request);
|
|
return;
|
|
}
|
|
nIdLv datalv;
|
|
datalv = data.playCharEnhancePoint;
|
|
EnhanceMgr.Instance.CalcPlayerInfoStat();
|
|
CheckBedge();
|
|
BattleMgr.StatRecalc();
|
|
Instance.escrCharLvPointEnhance.scroller.RefreshActiveCellViews();
|
|
|
|
BattleMgr.EnhanceHeal((dataEnhance.aftLv - dataEnhance.befLv) * DataHandler.GetCharStats()[2].abilityValueInc);
|
|
|
|
dataEnhance = null;
|
|
|
|
while (coverCameraCount > 0)
|
|
{
|
|
CoverCamera.Release();
|
|
coverCameraCount--;
|
|
}
|
|
while (iLoading > 0)
|
|
{
|
|
iLoading--;
|
|
}
|
|
|
|
}
|
|
#endregion Enhance
|
|
|
|
#region Awaken
|
|
bool autoReroll = false;
|
|
int selectedTrainLevel = 1;
|
|
public int GetSelected()
|
|
{
|
|
return selectedTrainLevel;
|
|
}
|
|
|
|
public void SetSelected(int key)
|
|
{
|
|
selectedTrainLevel = key;
|
|
txtEffect.text = FormatString.StringFormat("{0} {1}" ,LocalizationText.GetText("efc11"), FormatString.TextIntPer0CommaBi(DataHandler.SysAwakenRewards[key].awakenInc));
|
|
escrAwakenDungeon.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
int prevPreset = -1;
|
|
//각성 잠재능력 프리셋 선택
|
|
public void btnAwakenPresetSet(int preset)
|
|
{
|
|
if (prevPreset == -1)
|
|
{
|
|
prevPreset = DataHandler.PlayAwaken.usePreset;
|
|
}
|
|
DataHandler.btnAwakenPresetSet(preset,false);
|
|
SetAwakenLockSlot(DataHandler.PlayAwaken.awakenUnlock[DataHandler.PlayAwaken.usePreset]);
|
|
AwakenButtonRefresh();
|
|
|
|
for (int i = 0; i < btnAbilityPreset.Length; i++)
|
|
btnAbilityPreset[i].interactable = DataHandler.PlayAwaken.usePreset != i;
|
|
|
|
SaveAwakenPresetSet();
|
|
}
|
|
|
|
//사용 프리셋 저장.
|
|
public void SaveAwakenPresetSet()
|
|
{
|
|
prevPreset = -1;
|
|
StartSetAwakenPreset();
|
|
|
|
GameUIMgr.SOpenToast(LocalizationText.GetText(Global.STR_Saved));
|
|
}
|
|
|
|
//프리셋 취소. 저장 버튼이 있었을 적에 사용됨.
|
|
void CancelAwakenPresetSet()
|
|
{
|
|
if (prevPreset != -1)
|
|
{
|
|
btnAwakenPresetSet(prevPreset);
|
|
StartSetAwakenPreset();
|
|
|
|
prevPreset = -1;
|
|
}
|
|
}
|
|
|
|
//잠재능력 스텟을 토대로 스텟 계산
|
|
public static void StartSetAwakenPreset()
|
|
{
|
|
BuffMgr.Instance.AwakenReset();
|
|
for (int i = 0; i < 6; i++)
|
|
{
|
|
if (DataHandler.PlayAwaken.extras[DataHandler.PlayAwaken.usePreset][i] >= 0)
|
|
{
|
|
BuffMgr.Instance.ChangeAwakenStat(DataHandler.GetExtraAbility(DataHandler.PlayAwaken.extras[DataHandler.PlayAwaken.usePreset][i]).abilityType, DataHandler.GetExtraAbility(DataHandler.PlayAwaken.extras[DataHandler.PlayAwaken.usePreset][i]).abilityValue, false);
|
|
}
|
|
}
|
|
|
|
DataHandler.PlayAwaken.Save();
|
|
}
|
|
|
|
//잠재능력 슬롯 새로고침
|
|
public void AwakenButtonRefresh()
|
|
{
|
|
for (int i = 0; i < 6; i++)
|
|
{
|
|
awakenButton[i].RefreshView();
|
|
}
|
|
}
|
|
|
|
//잠재능력 슬롯 해금
|
|
public void UnlockSlot(int key)
|
|
{
|
|
awakenButton[key - 1].UnlockSlot();
|
|
}
|
|
|
|
public bool GetAutoReroll() => autoReroll;
|
|
|
|
eRarity autoRareity = eRarity.Hero;
|
|
public static void SetAutoRareity(eRarity rareity)
|
|
{
|
|
Instance.autoRareity = rareity;
|
|
}
|
|
|
|
//잠재능력 돌리기 비용 재계산
|
|
public void RecalculateRerollCost()
|
|
{
|
|
int awaken = Mathf.Min(DataHandler.PlayAwaken.awaken, 6);
|
|
|
|
rerollCost = 10;
|
|
int slotLock = 0;
|
|
int slotUnlock = 6;
|
|
for(int i = 0; i < awakenButton.Length; i++)
|
|
{
|
|
if (awakenButton[i].GetIsAbilityLock())
|
|
{
|
|
slotLock++;
|
|
slotUnlock--;
|
|
}
|
|
awakenButton[i].RefreshView();
|
|
}
|
|
rerollCost = DataHandler.Const.awakenChangeStonePrice * (slotUnlock - (6 - awaken));
|
|
if(slotUnlock - (6 - awaken) == 0)
|
|
{
|
|
rerollCost = DataHandler.Const.awakenChangeStonePrice;
|
|
}
|
|
|
|
txtChangeCost.text = rerollCost.ToString();
|
|
btnStoneSpend.interactable = rerollCost <= DataHandler.Goods.changeStone && slotUnlock - (6 - awaken) > 0;
|
|
btnStoneSpendAuto.interactable = rerollCost <= DataHandler.Goods.changeStone;
|
|
btnAutoSpend.interactable = rerollCost <= DataHandler.Goods.changeStone;
|
|
}
|
|
|
|
//잠재능력 슬롯 잠금여부 판별
|
|
public void SetAwakenLockSlot(bool[] lockset)
|
|
{
|
|
for(int i = 0; i < 6; i++)
|
|
{
|
|
awakenButton[i].SetIsUnlock(lockset[i]);
|
|
}
|
|
}
|
|
|
|
//잠재능력 돌리기 전에 확인하는 용도.
|
|
public void RerollCheckAbility()
|
|
{
|
|
int serverSlot = 0b00111111;
|
|
|
|
if (rerollCost <= DataHandler.Goods.changeStone)
|
|
{
|
|
for (int i = 0; i < awakenButton.Length; i++)
|
|
{
|
|
if (!awakenButton[i].IsUnlock())
|
|
{
|
|
serverSlot -= 1 << i;
|
|
}
|
|
else if (awakenButton[i].GetIsAbilityLock())
|
|
{
|
|
serverSlot -= 1 << i;
|
|
}
|
|
else
|
|
{
|
|
awakenButton[i].RefreshView();
|
|
|
|
dExtraAbility ability = DataHandler.GetExtraAbility(DataHandler.PlayAwaken.extras[DataHandler.PlayAwaken.usePreset][i]);
|
|
if (ability != null)
|
|
{
|
|
if (ability.rarity >= (int)eRarity.Legend)
|
|
{
|
|
GameUIMgr.SOpenPopup2Button(LocalizationText.GetText("msg_highgrade"), RerollAwakenAbility);
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (serverSlot == 0)
|
|
{
|
|
GameUIMgr.SOpenToast(LocalizationText.GetText("msg_noslotchange"));
|
|
return;
|
|
}
|
|
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
RerollServerAwakenAbility(DataHandler.PlayAwaken.usePreset + 1, serverSlot);
|
|
}
|
|
}
|
|
|
|
public void RerollServerAwakenAbility(int preset, int slot)
|
|
{
|
|
var dataSlot = new nAwakenPresetSlot(preset, slot);
|
|
|
|
CoverCamera.Hold();
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, IVServerFormat.UrlApi.GetUrl(IVServerFormat.UrlApi.AwakenEnhance), typeof(nCharAwakenReturn), AAwakenEnhanceSucc, AAwakenEnhanceFail, dataSlot, true);
|
|
}
|
|
|
|
// 각성 강화 통신 성공.
|
|
private void AAwakenEnhanceSucc(object result, object request)
|
|
{
|
|
var data = result as nCharAwakenReturn;
|
|
if (data == null)
|
|
{
|
|
AAwakenEnhanceFail(new IVServerFormat.SvError(IVServerFormat.eErrorCode.NULL_OR_EMPTY), request);
|
|
return;
|
|
}
|
|
|
|
BuffMgr.Instance.AwakenReset();
|
|
|
|
DataHandler.SetServerAwakenSlot(data.playAwaken,DataHandler.PlayAwaken.usePreset);
|
|
DataHandler.SubChangeStone(DataHandler.Goods.changeStone - data.playCurrency.changeStone);
|
|
|
|
DataHandler.PlayAwaken.OnAfterDeserialize();
|
|
|
|
for (int i = 0; i < 6; i++)
|
|
{
|
|
if (data.playAwaken.extras[DataHandler.PlayAwaken.usePreset][i] >= 0)
|
|
{
|
|
BuffMgr.Instance.ChangeAwakenStat(DataHandler.GetExtraAbility(data.playAwaken.extras[DataHandler.PlayAwaken.usePreset][i]).abilityType, DataHandler.GetExtraAbility(data.playAwaken.extras[DataHandler.PlayAwaken.usePreset][i]).abilityValue, false);
|
|
awakenButton[i].RefreshView();
|
|
}
|
|
}
|
|
|
|
BuffMgr.Instance.CalcAllStat();
|
|
EnhanceMgr.Instance.CalcPlayerInfoStat();
|
|
|
|
CoverCamera.Release();
|
|
}
|
|
|
|
//각성 강화 통신 실패
|
|
private void AAwakenEnhanceFail(IVServerFormat.SvError error, object request)
|
|
{
|
|
CoverCamera.Release();
|
|
}
|
|
|
|
//잠재능력 돌리기
|
|
public void RerollAwakenAbility()
|
|
{
|
|
int serverSlot = 0b00111111;
|
|
|
|
if (rerollCost > DataHandler.Goods.changeStone) return;
|
|
|
|
for (int i = 0; i < awakenButton.Length; i++)
|
|
{
|
|
if (!awakenButton[i].IsUnlock())
|
|
{
|
|
serverSlot -= 1 << i;
|
|
}
|
|
else if (awakenButton[i].GetIsAbilityLock())
|
|
{
|
|
serverSlot -= 1 << i;
|
|
}
|
|
else
|
|
{
|
|
awakenButton[i].UnlockLockButton();
|
|
awakenButton[i].RefreshView();
|
|
}
|
|
}
|
|
|
|
BuffMgr.Instance.CalcAllStat();
|
|
|
|
if (serverSlot == 0)
|
|
{
|
|
GameUIMgr.SOpenToast(LocalizationText.GetText("msg_noslotchange"));
|
|
return;
|
|
}
|
|
|
|
RerollServerAwakenAbility(DataHandler.PlayAwaken.usePreset + 1, serverSlot);
|
|
|
|
btnStoneSpend.interactable = rerollCost <= DataHandler.Goods.changeStone;
|
|
btnStoneSpendAuto.interactable = rerollCost <= DataHandler.Goods.changeStone;
|
|
}
|
|
|
|
//자동돌리기 시작.
|
|
public void AutoRerollStart()
|
|
{
|
|
if (rerollCost <= DataHandler.Goods.changeStone)
|
|
{
|
|
autoReroll = true;
|
|
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
StartCoroutine(nameof(AutoRerollAbility));
|
|
}
|
|
}
|
|
|
|
IEnumerator AutoRerollAbility()
|
|
{
|
|
ExitAutoRerollConfig();
|
|
ChangeButtonSetOnoff(false);
|
|
|
|
bool alreadyHave = false;
|
|
|
|
for (int i = 0; i < awakenButton.Length; i++)
|
|
{
|
|
if (!awakenButton[i].IsUnlock())
|
|
{
|
|
continue;
|
|
}
|
|
else if (awakenButton[i].GetIsAbilityLock())
|
|
{
|
|
continue;
|
|
}
|
|
|
|
dExtraAbility ability = DataHandler.GetExtraAbility(DataHandler.PlayAwaken.extras[DataHandler.PlayAwaken.usePreset][i]);
|
|
if (ability == null)
|
|
{
|
|
ability = new dExtraAbility();
|
|
ability.rarity = 0;
|
|
}
|
|
if (ability.rarity >= (int)autoRareity)
|
|
{
|
|
//트루일때
|
|
for (int j = 0; j < efcOptions.Length; j++)
|
|
{
|
|
if (bSelectedOptions[j])
|
|
{
|
|
if (ability.abilityType == efcOptions[j])
|
|
{
|
|
alreadyHave = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//원하는 조건에 걸릴때 중단.
|
|
if (alreadyHave)
|
|
{
|
|
autoReroll = false;
|
|
|
|
GameUIMgr.SOpenToast(LocalizationText.GetText("awaken_waning_already_have"));
|
|
ChangeButtonSetOnoff(true);
|
|
}
|
|
|
|
while (autoReroll)
|
|
{
|
|
int serverSlot = 0b00111111;
|
|
bool conditionOK = false;
|
|
|
|
if (Instance.rerollCost > DataHandler.Goods.changeStone)
|
|
{
|
|
GameUIMgr.SOpenToast(LocalizationText.GetText("msg_nodice"));
|
|
ChangeButtonSetOnoff(true);
|
|
|
|
autoReroll = false;
|
|
yield break;
|
|
}
|
|
|
|
for (int i = 0; i < awakenButton.Length; i++)
|
|
{
|
|
if (!awakenButton[i].IsUnlock())
|
|
{
|
|
serverSlot -= 1 << i;
|
|
|
|
continue;
|
|
}
|
|
else if (awakenButton[i].GetIsAbilityLock())
|
|
{
|
|
serverSlot -= 1 << i;
|
|
|
|
continue;
|
|
}
|
|
|
|
awakenButton[i].UnlockLockButton();
|
|
awakenButton[i].RefreshView();
|
|
|
|
dExtraAbility ability = DataHandler.GetExtraAbility(DataHandler.PlayAwaken.extras[DataHandler.PlayAwaken.usePreset][i]);
|
|
if (ability == null)
|
|
{
|
|
ability = new dExtraAbility();
|
|
ability.rarity = 0;
|
|
}
|
|
if (ability.rarity >= (int)autoRareity)
|
|
{
|
|
for (int j = 0; j < efcOptions.Length; j++)
|
|
{
|
|
if (bSelectedOptions[j])
|
|
{
|
|
if (ability.abilityType == efcOptions[j])
|
|
{
|
|
conditionOK = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
if (serverSlot == 0)
|
|
{
|
|
GameUIMgr.SOpenToast(LocalizationText.GetText("msg_noslotchange"));
|
|
ChangeButtonSetOnoff(true);
|
|
|
|
autoReroll = false;
|
|
yield break;
|
|
}
|
|
|
|
Instance.btnStoneSpend.interactable = Instance.rerollCost <= DataHandler.Goods.changeStone;
|
|
Instance.btnStoneSpendAuto.interactable = Instance.rerollCost <= DataHandler.Goods.changeStone;
|
|
|
|
if (conditionOK)
|
|
{
|
|
GameUIMgr.SOpenToast(LocalizationText.GetText("awaken_waning_already_have"));
|
|
ChangeButtonSetOnoff(true);
|
|
|
|
autoReroll = false;
|
|
yield break;
|
|
}
|
|
else
|
|
{
|
|
RerollServerAwakenAbility(DataHandler.PlayAwaken.usePreset + 1, serverSlot);
|
|
}
|
|
|
|
yield return new WaitForSeconds(0.5f);
|
|
}
|
|
}
|
|
|
|
//돌리는 도중 강제중단.
|
|
public void ForceAutoStop()
|
|
{
|
|
autoReroll = false;
|
|
ChangeButtonSetOnoff(true);
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
// 아이템 효과 종류.
|
|
public static eEffectType SGetEfcAddAutoType(int index)
|
|
{
|
|
if (index < 0)
|
|
return eEffectType.None;
|
|
return Instance.efcOptions[index];
|
|
}
|
|
|
|
// 아이템 선택 상태.
|
|
public bool SGetEfcAddAutoSelect(int index)
|
|
{
|
|
if (index < 0)
|
|
return false;
|
|
return bSelectedOptions[index];
|
|
}
|
|
|
|
// 추가 효과 잠금상태 변경.
|
|
public static void SToggleSelect(int itemid, bool bselect)
|
|
{
|
|
if (itemid < 0)
|
|
{
|
|
if (bselect)
|
|
{
|
|
}
|
|
return;
|
|
}
|
|
Instance.bSelectedOptions[itemid] = bselect;
|
|
for(int i = 0; i < Instance.bSelectedOptions.Length; i++)
|
|
{
|
|
if (Instance.bSelectedOptions[i])
|
|
{
|
|
Instance.btnAutoSpend.interactable = true;
|
|
break;
|
|
}
|
|
Instance.btnAutoSpend.interactable = false;
|
|
}
|
|
|
|
Instance.btnAutoSpend.interactable = Instance.rerollCost <= DataHandler.Goods.changeStone;
|
|
Instance.escrAutoRerollConfig.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
public void OpenInfoHelp()
|
|
{
|
|
SoundMgr.Instance.PlaySfx(SoundName.BtnPress);
|
|
GameUIMgr.SOpenPopupRarityRate();
|
|
}
|
|
#endregion
|
|
|
|
#region MyInfo
|
|
|
|
public void CalcPlayerInfoStat()
|
|
{
|
|
if (iSelectedTab < 0) return;
|
|
|
|
BuffMgr.Instance.CalcBattlePower();
|
|
|
|
charInfoNumberT[0].text = DataHandler.PlayData.playerLv.ToString();
|
|
charInfoNumberT[1].text = FormatString.BigIntString1(BuffMgr.Instance.GetBattlePower());
|
|
charInfoNumberB[0].text = FormatString.BigIntString1(BuffMgr.Instance.GetCharAtk());
|
|
charInfoNumberB[1].text = FormatString.BigIntString1(BuffMgr.Instance.GetCharHp());
|
|
charInfoNumberB[3].text = FormatString.TextEffectValue(eEffectType.Spd, BuffMgr.Instance.GetCharSpd());
|
|
charInfoNumberB[4].text = FormatString.TextEffectValue(eEffectType.Mov, BuffMgr.Instance.GetCharMov());
|
|
charInfoNumberB[5].text = FormatString.TextEffectValue(eEffectType.GoldDropRate, BuffMgr.Instance.GetGoldDropRate());
|
|
charInfoNumberB[6].text = FormatString.TextEffectValue(eEffectType.ExpDropRate, BuffMgr.Instance.GetExpDropRate());
|
|
charInfoNumberB[7].text = FormatString.TextEffectValue(eEffectType.ChestDropRate, BuffMgr.Instance.GetChestDropRate());
|
|
charInfoNumberB[8].text = FormatString.TextEffectValue(eEffectType.SkillDamage, BuffMgr.Instance.GetSkillDamage());
|
|
charInfoNumberB[9].text = FormatString.TextEffectValue(eEffectType.SkillCool, BuffMgr.Instance.GetSkillCooldownReduce());
|
|
charInfoNumberB[10].text = FormatString.TextEffectValue(eEffectType.HealPerSec, BuffMgr.Instance.GetHpHealPerSec());
|
|
charInfoNumberB[11].text = FormatString.TextEffectValue(eEffectType.DeepCaveDgBonus, BuffMgr.Instance.GetDeepCaveDgBonus());
|
|
charInfoNumberB[12].text = FormatString.TextEffectValue(eEffectType.AtlantisDgBonus, BuffMgr.Instance.GetAtlantisDgBonus());
|
|
charInfoNumberB[13].text = FormatString.TextEffectValue(eEffectType.ProtectTheMerchantDgBonus, BuffMgr.Instance.GetProptectTheMerchantBonus());
|
|
charInfoNumberB[14].text = FormatString.TextEffectValue(eEffectType.DevelopTheJungleDgBonus, BuffMgr.Instance.GetDevelopTheJungleBonus());
|
|
|
|
int icrtrate = BuffMgr.Instance.GetCharCrtRate();
|
|
int icrtmul = icrtrate / dConst.RateMax + 1;
|
|
int irate = icrtrate % dConst.RateMax;
|
|
charInfoNameB[2].text = FormatString.StringFormat(LocalizationText.GetText("stat_kind_bottom3"), icrtmul.ToString());
|
|
charInfoNumberB[2].text = FormatString.TextEffectValue(eEffectType.CrtRate, irate);
|
|
}
|
|
#endregion
|
|
|
|
//골드 계산. 뱃지 확인용으로도 사용됨
|
|
public static void CalcGoldEnhance()
|
|
{
|
|
int iMaxLv = 1000;
|
|
BigInteger buyingCnt = 0L;
|
|
int buyingCntInc = 1;
|
|
BigInteger iprice = 0L;
|
|
|
|
for (int i = 0; i < DataHandler.GetCharStats().Count; i++)
|
|
{
|
|
if (DataHandler.GetCharStat(i + 1).condType != 0 &&
|
|
DataHandler.GetCharStatLevel(DataHandler.GetCharStat(i + 1).condType) < DataHandler.GetCharStat(i + 1).condValue)
|
|
{
|
|
Instance.goldEnhanceBedge.SetActive(false);
|
|
continue;
|
|
}
|
|
|
|
int ilevel = DataHandler.GetCharStat(i + 1).level;
|
|
iMaxLv = DataHandler.GetCharStat(i + 1).maxLv;
|
|
buyingCnt = DataHandler.GetCharStat(i + 1).buyingCount;
|
|
buyingCntInc = DataHandler.GetCharStat(i + 1).buyingCntInc;
|
|
|
|
|
|
iprice = SSingleRecalcGoldPrice(i + 1);
|
|
|
|
//iprice = buyingCnt + (buyingCntInc * (intervalUpLevel));
|
|
|
|
if (iprice <= DataHandler.Goods.gold && DataHandler.GetCharStat(i + 1).level <iMaxLv)
|
|
{
|
|
Instance.mainEnhanceBedge.SetActive(true);
|
|
Instance.goldEnhanceBedge.SetActive(true);
|
|
|
|
return;
|
|
}
|
|
|
|
}
|
|
Instance.goldEnhanceBedge.SetActive(false);
|
|
}
|
|
|
|
//포인트 계산. 뱃지 확인용으로 사용됨.
|
|
public static void CalcPointEnhance()
|
|
{
|
|
int iMaxLv = 1000;
|
|
BigInteger buyingCnt = 0L;
|
|
int iprice = 0;
|
|
|
|
for (int i = 0; i < DataHandler.GetCharLvPoints().Count; i++)
|
|
{
|
|
int ilevel = DataHandler.GetCharLvPoint(i + 1).level;
|
|
iMaxLv = DataHandler.GetCharLvPoint(i + 1).maxLv;
|
|
buyingCnt = DataHandler.GetCharLvPoint(i + 1).buyingCount;
|
|
iprice = 1;
|
|
|
|
if (iprice <= DataHandler.Goods.point && DataHandler.GetCharLvPoint(i + 1).level < iMaxLv)
|
|
{
|
|
Instance.mainEnhanceBedge.SetActive(true);
|
|
Instance.pointEnhanceBedge.SetActive(true);
|
|
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
Instance.pointEnhanceBedge.SetActive(false);
|
|
}
|
|
public void EnhanceBedgeSetActive()
|
|
{
|
|
mainEnhanceBedge.SetActive(goldEnhanceBedge.activeSelf || pointEnhanceBedge.activeSelf);
|
|
}
|
|
|
|
public static void levelUpScrolRefresh()
|
|
{
|
|
Instance.escrCharLvPointEnhance.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
public static void SResetAwakenPreset()
|
|
{
|
|
if (Instance.iSelectedTab < 0)
|
|
{
|
|
return;
|
|
}
|
|
Instance.btnAwakenPresetSet(DataHandler.PlayAwaken.usePreset);
|
|
|
|
StartSetAwakenPreset();
|
|
}
|
|
|
|
public static void TestSettingAwakenBtnTrue()
|
|
{
|
|
if (DataHandler.PlayAwaken.awaken > 0)
|
|
{
|
|
Instance.btnStoneSpend.interactable = true;
|
|
}
|
|
|
|
}
|
|
}
|
|
|