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.
 
 
 
 
 
 

1375 lines
46 KiB

using IVDataFormat;
using IVServerFormat;
using System.Collections;
using System.Collections.Generic;
using System.Security.Policy;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class SkillMgr : MonoBehaviour
{
#region Const
private static SkillMgr curMgr = null;
#endregion Const
#region UI
[Header("UI")]
[SerializeField]
private TextMeshProUGUI txtMainT;
[SerializeField]
private Canvas canvasUI;
private ButtonIV[] btnTabs;
private Image[] imgTabLineBottoms;
private Image[] imgTabLineRights;
private RectTransform rtrfSvSkill;
// 통합 레벨 효과.
private TextMeshProUGUI txtTotalEfcT, txtTotalLv, txtTotalEfc;
// 프리셋.
private GameObject groupPreset;
private ButtonIV[] btnPresetTabs;
private GoodsItem[] goodsPresets;
private GameObject[] goPresetUnsets, goPresetEmptys;
[SerializeField] float activeSkillScrTopValue = 352f;
[SerializeField] float pasiveSkillScrTopValue = 232f;
[SerializeField] EScrController escrSkill;
// 왼쪽 정보창.
[SerializeField]
Canvas skillLeftInfo;
private GoodsItem goodsInfo;
private GameObject goBtnInfoHelp;
private TextMeshProUGUI txtInfoUnlockLv;
private TextMeshProUGUI txtInfoName;
private GraphicsColorSetter txtInfoNameColorSetter;
private TextMeshProUGUI txtInfoLv;
private GameObject goInfoMax;
private Image imgBtnInfoEnhance;
private ButtonIV btnInfoEnhance, btnInfoAwaken;
private TextMeshProUGUI txtInfoEnhance;
// 스킬 효과 탭.
private GameObject goBtnInfoEfcAddLock;
private Image imgTabInfoLineRight;
private ButtonIV btnTabInfoEffect, btnTabInfoEffectAdd;
private GameObject groupInfoSkillEffect, groupInfoSkillEffectAdd;
private GameObject[] goInfoEfcs;
[SerializeField] TextMeshProUGUI[] txtInfoEfcTs;
[SerializeField] TextMeshProUGUI[] txtInfoEfcCurs;
[SerializeField] GameObject[] InfoEfcArrowObjs;
[SerializeField] TextMeshProUGUI[] txtInfoEfcNexts;
[SerializeField] TextMeshProUGUI txtInfoEfcDesc;
// 스킬 추가 효과.
private EfcAddItem[] efcAddItems;
#endregion UI
#region Variables
private int iLoading = 1;
private bool bReLocalize = true;
private bool bReLocalizeSkill = false;
private bool bInitNeedActive = true;
private bool bInitNeedPassive = true;
private int iSelectedTab = -1;
private int iSelectedPreset = -1;
private int iSvType = -1;
private int iSelectedId = -1;
private int[][] iPresetSkills;
private bool bChangePreset = false;
private EnhancedUI.SmallList<int> activeRows;
private int[] activeIds;
private EnhancedUI.SmallList<int> passiveRows;
private int[] passiveIds;
private bool bClicking = false;
private nIdEnhance dataEnhance = null;
#endregion Variables
#region Base
public static void SLocalize(bool bmain)
{
if (curMgr != null)
curMgr.Localize(bmain);
}
private void Localize(bool bmain)
{
if (bmain)
{
txtMainT.text = LocalizationText.GetText("skill_title");
}
else
{
bReLocalize = false;
Transform trfcanvas = canvasUI.transform;
trfcanvas.Find("txtT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("skill_title");
btnTabs = trfcanvas.Find("tabWrapTop").GetComponentsInChildren<ButtonIV>(true);
btnTabs[0].transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("skill_active");
btnTabs[1].transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("skill_passive");
imgTabLineBottoms = new Image[btnTabs.Length];
imgTabLineRights = new Image[btnTabs.Length];
for (int i = 0; i < btnTabs.Length; i++)
{
imgTabLineBottoms[i] = btnTabs[i].transform.Find("linebottom").GetComponent<Image>();
imgTabLineRights[i] = btnTabs[i].transform.Find("lineright").GetComponent<Image>();
}
rtrfSvSkill = trfcanvas.Find("SvSkill").GetComponent<RectTransform>();
Transform trfefc = trfcanvas.Find("groupTotalEffect");
trfefc.Find("txtTotalLvT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("skill_totallv");
txtTotalEfcT = trfefc.Find("txtTotalEfcT").GetComponent<TextMeshProUGUI>();
txtTotalLv = trfefc.Find("txtTotalLv").GetComponent<TextMeshProUGUI>();
txtTotalEfc = trfefc.Find("txtTotalEfc").GetComponent<TextMeshProUGUI>();
Transform trfpreset = trfcanvas.Find("groupPreset");
groupPreset = trfpreset.gameObject;
trfpreset.Find("btnSave").Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_save");
btnPresetTabs = new ButtonIV[6];
btnPresetTabs[0] = trfpreset.Find("tab0").GetComponent<ButtonIV>();
btnPresetTabs[1] = trfpreset.Find("tab1").GetComponent<ButtonIV>();
btnPresetTabs[2] = trfpreset.Find("tab2").GetComponent<ButtonIV>();
btnPresetTabs[3] = trfpreset.Find("tab3").GetComponent<ButtonIV>();
btnPresetTabs[4] = trfpreset.Find("tab4").GetComponent<ButtonIV>();
btnPresetTabs[5] = trfpreset.Find("tab5").GetComponent<ButtonIV>();
goodsPresets = trfpreset.GetComponentsInChildren<GoodsItem>(true);
goPresetUnsets = new GameObject[goodsPresets.Length];
goPresetEmptys = new GameObject[goodsPresets.Length];
for (int i = 0; i < goodsPresets.Length; i++)
{
goPresetUnsets[i] = goodsPresets[i].transform.Find("unset").gameObject;
goPresetEmptys[i] = goodsPresets[i].transform.Find("empty").gameObject;
}
// 왼쪽 정보창.
Transform trfleft = skillLeftInfo.transform;
trfleft.Find("txtT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("skill_info");
goodsInfo = trfleft.Find("GoodsItem").GetComponent<GoodsItem>();
goBtnInfoHelp = trfleft.Find("btnInfo").gameObject;
txtInfoUnlockLv = trfleft.Find("txtUnlockLv").GetComponent<TextMeshProUGUI>();
txtInfoName = trfleft.Find("txtName").GetComponent<TextMeshProUGUI>();
txtInfoNameColorSetter = txtInfoName.GetComponent<GraphicsColorSetter>();
txtInfoLv = trfleft.Find("txtLv").GetComponent<TextMeshProUGUI>();
btnInfoEnhance = trfleft.Find("btnEnhance").GetComponent<ButtonIV>();
imgBtnInfoEnhance = btnInfoEnhance.GetComponent<Image>();
txtInfoEnhance = btnInfoEnhance.transform.Find("txtPrice").GetComponent<TextMeshProUGUI>();
btnInfoEnhance.transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_enhance");
btnInfoAwaken = trfleft.Find("btnAwaken").GetComponent<ButtonIV>();
btnInfoAwaken.transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_awaken");
goInfoMax = trfleft.Find("goMax").gameObject;
goInfoMax.transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText(Global.STR_MAX);
goBtnInfoEfcAddLock = trfleft.Find("goEffectAddLock").gameObject;
imgTabInfoLineRight = trfleft.Find("tabSubLine2").GetComponent<Image>();
btnTabInfoEffect = trfleft.Find("tabEffect").GetComponent<ButtonIV>();
btnTabInfoEffect.transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("skill_efcuse");
btnTabInfoEffectAdd = trfleft.Find("tabEffectAdd").GetComponent<ButtonIV>();
btnTabInfoEffectAdd.transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_effectadd");
// 스킬 사용 효과.
groupInfoSkillEffect = trfleft.Find("groupEffect").gameObject;
Transform trfinfoefc = groupInfoSkillEffect.transform;
goInfoEfcs = new GameObject[4];
for (int i = 0; i < goInfoEfcs.Length; i++)
goInfoEfcs[i] = trfinfoefc.GetChild(i).gameObject;
// 스킬 추가 효과.
groupInfoSkillEffectAdd = trfleft.Find("groupEffectAdd").gameObject;
efcAddItems = groupInfoSkillEffectAdd.GetComponentsInChildren<EfcAddItem>();
for (int i = 0; i < efcAddItems.Length; i++)
{
efcAddItems[i].Init();
efcAddItems[i].SetCondition(i + 1);
}
}
}
// 설정에서 언어 변경 시 처리.
public static void SReLocalize()
{
curMgr.Localize(true);
curMgr.bReLocalize = true;
curMgr.bReLocalizeSkill = true;
}
// 백버튼 처리.
public static bool SCloseMenu()
{
return curMgr.CloseMenu();
}
private bool CloseMenu()
{
// 게임 시작 후 열린적 없음.
if (iSelectedTab < 0)
return false;
if (canvasUI.enabled)
{
CloseSkill();
return true;
}
return false;
}
private void Awake()
{
curMgr = this;
}
void Start()
{
iLoading--;
}
#endregion Base
#region UI
public static void SMoveSkill(eEventMoveType content)
{
curMgr.OpenSkill();
switch (content)
{
case eEventMoveType.skillActive:
curMgr.TabPress(0);
break;
case eEventMoveType.skillPassive:
curMgr.TabPress(1);
break;
}
}
public void OpenSkill()
{
if (iLoading > 0)
return;
iLoading++;
if (bReLocalize)
Localize(false);
if (iSelectedTab < 0)
{
iPresetSkills = new int[6][];
for (int i = 0; i < iPresetSkills.Length; i++)
{
iPresetSkills[i] = new int[4];
for (int k = 0; k < iPresetSkills[i].Length; k++)
{
iPresetSkills[i][k] = DataHandler.PlayData.skillPresets[i][k];
}
}
TabPreset(DataHandler.PlayData.usePreset);
TabPress(0);
}
else
{
escrSkill.scroller.RefreshActiveCellViews();
SetLeftSkillInfo();
TabLeftEffect();
}
SetTotalLvEfc();
canvasUI.enabled = true;
skillLeftInfo.enabled = true;
GameUIMgr.SRightWindowClose();
GameUIMgr.SOpenLeftPanel(skill : true, awakenskill: true);
GameUIMgr.SSetMainUiOn(false);
BattleMgr.CloseFailScroll();
if (bReLocalizeSkill)
{
bReLocalizeSkill = false;
escrSkill.Localize();
}
SoundMgr.PlaySfx(SoundName.BtnPress);
iLoading--;
}
public void CloseSkill()
{
if (!canvasUI.enabled)
return;
if (iLoading > 0)
return;
iLoading++;
ResetSkillPreset();
MissionMgr.SRefreshMission();
DataHandler.CheckAchivement(eContent.Battle);
canvasUI.enabled = false;
skillLeftInfo.enabled = false;
GameUIMgr.SCloseLeftPanel();
GameUIMgr.SSetMainUiOn(true);
if (isSave > 0)
{
GameUIMgr.SOpenToast(LocalizationText.GetText(Global.STR_Saved));
isSave = 0;
}
SoundMgr.PlaySfx(SoundName.BtnPress);
iLoading--;
}
// 도움말 열기.
public void OpenHelp()
{
SoundMgr.PlaySfx(SoundName.BtnPress);
}
#endregion UI
#region Tab
public void TabPress(int index)
{
if (iSelectedTab == index)
return;
iLoading++;
if (iSelectedTab >= 0)
{
btnTabs[iSelectedTab].interactable = true;
}
iSelectedTab = index;
btnTabs[iSelectedTab].interactable = false;
SoundMgr.PlaySfx(SoundName.BtnPress);
// 액티브.
if (iSelectedTab == 0)
{
Vector2 v2pos = rtrfSvSkill.offsetMax;
v2pos.y = -activeSkillScrTopValue;
rtrfSvSkill.offsetMax = v2pos;
groupPreset.SetActive(true);
iSvType = cGoods.TSkillActive;
escrSkill.SetType(iSvType);
if (bInitNeedActive)
{
bInitNeedActive = false;
// 초기화.
int irowcnt = 4;
Dictionary<int, dSkillActive> datas = DataHandler.GetSkillActives();
activeRows = new EnhancedUI.SmallList<int>();
activeIds = new int[datas.Count];
int itemindex = 0;
foreach (var item in datas)
{
if (itemindex % irowcnt == 0)
activeRows.Add(activeRows.Count);
activeIds[itemindex] = item.Key;
itemindex++;
}
}
int iskill = DataHandler.PlayData.skillPresets[iSelectedPreset][0] - 1;
if (iskill < 0)
SelectSkill(iSvType, 0, 0,true);
else
SelectSkill(iSvType, iskill / 4, iskill % 4,true);
escrSkill.LoadDatas(activeRows);
}
// 패시브.
else
{
Vector2 v2pos = rtrfSvSkill.offsetMax;
v2pos.y = -pasiveSkillScrTopValue;
rtrfSvSkill.offsetMax = v2pos;
groupPreset.SetActive(false);
iSvType = cGoods.TSkillPassive;
escrSkill.SetType(iSvType);
if (bInitNeedPassive)
{
bInitNeedPassive = false;
// 초기화.
int irowcnt = 4;
Dictionary<int, dSkillPassive> datas = DataHandler.GetSkillPassives();
passiveRows = new EnhancedUI.SmallList<int>();
passiveIds = new int[datas.Count];
int itemindex = 0;
foreach (var item in datas)
{
if (itemindex % irowcnt == 0)
passiveRows.Add(passiveRows.Count);
passiveIds[itemindex] = item.Key;
itemindex++;
}
}
SelectSkill(iSvType, 0, 0,true);
escrSkill.LoadDatas(passiveRows);
}
// 선 표시.
for (int i = 0; i < imgTabLineBottoms.Length; i++)
{
imgTabLineBottoms[i].enabled = iSelectedTab != i;
if (i == iSelectedTab)
{
imgTabLineBottoms[i].enabled = false;
imgTabLineRights[i].enabled = true;
}
else
{
imgTabLineBottoms[i].enabled = true;
imgTabLineRights[i].enabled = true;
}
}
iLoading--;
}
// 총합 레벨 효과 표시.
private void SetTotalLvEfc()
{
int[] ilvefcs = DataHandler.GetSkillTotalLevels();
txtTotalLv.text = FormatString.TextLv(ilvefcs[1]);
txtTotalEfc.text = FormatString.TextCntPerBlank(ilvefcs[0].ToString(), ilvefcs[3].ToString());
txtTotalEfcT.text = FormatString.StringFormat(LocalizationText.GetText("skill_addefc"), FormatString.TextEffectValue(eEffectType.SkillDamage, ilvefcs[2]));
}
#endregion Tab
#region Skill
public static int SGetSkillId(int isvtype, int irow, int icolumn)
{
return curMgr.GetSkillId(isvtype, irow, icolumn);
}
// 스킬 번호.
private int GetSkillId(int isvtype, int irow, int icolumn)
{
int index = irow * 4 + icolumn;
if (isvtype == cGoods.TSkillActive)
{
if (index >= activeIds.Length)
return -1;
return activeIds[index];
}
if (index >= passiveIds.Length)
return -1;
return passiveIds[index];
}
public static bool SIsSetSkill(int idx)
{
return curMgr.IsSetSkill(idx);
}
// 프리셋에 장착된 스킬인지.
private bool IsSetSkill(int idx)
{
if (iSelectedPreset < 0)
return false;
int[] ipresets = iPresetSkills[iSelectedPreset];
for (int i = 0; i < ipresets.Length; i++)
{
if (ipresets[i] == idx)
return true;
}
return false;
}
// 선택된 스킬인지.
public static bool SIsSelectSkill(int idx)
{
return idx == curMgr.iSelectedId;
}
public static void SSelectSkill(int isvtype, int irow, int icolumn)
{
if (curMgr.iLoading > 0)
return;
curMgr.SelectSkill(isvtype, irow, icolumn, false);
}
// 스킬 선택.
public void SelectSkill(int isvtype, int irow, int icolumn, bool isOpen)
{
iLoading++;
int key = GetSkillId(isvtype, irow, icolumn);
iSelectedId = key;
SetLeftSkillInfo();
TabLeftEffect();
escrSkill.scroller.RefreshActiveCellViews();
iLoading--;
if (!isOpen)
{
for(int i = 0; i < 4; i++)
{
if (AutoBtnPresetSlot(i))
{
break;
}
}
}
}
#endregion Skill
#region Preset
// 프리셋 버튼 선택.
public void TabPreset(int index)
{
if (iSelectedPreset == index)
return;
if (iSelectedPreset >= 0)
btnPresetTabs[iSelectedPreset].interactable = true;
iSelectedPreset = index;
btnPresetTabs[iSelectedPreset].interactable = false;
SoundMgr.PlaySfx(SoundName.BtnPress);
SetSkillPreset();
escrSkill.scroller.RefreshActiveCellViews();
}
int isSave = 0;
// 프리셋 세팅.
private void SetSkillPreset()
{
for (int k = 0; k < goodsPresets.Length; k++)
{
if (iPresetSkills[iSelectedPreset][k] < 0)
{
goodsPresets[k].ReleaseData();
goPresetUnsets[k].SetActive(false);
goPresetEmptys[k].SetActive(true);
goodsPresets[k].SetActiveContent(star: false, rarity: false, count: false);
}
else
{
goodsPresets[k].SetGoods(cGoods.TSkillActive, iPresetSkills[iSelectedPreset][k], 0L);
goPresetUnsets[k].SetActive(true);
goPresetEmptys[k].SetActive(false);
goodsPresets[k].SetActiveContent(star: false, rarity: true, count: false);
}
}
if (iSelectedTab >= 0)
{
isSave++;
//GameUIMgr.SOpenToast(LocalizationText.GetText(Global.STR_Saved));
}
}
// 프리셋 초기화. 수정한 내용 취소.
private void ResetSkillPreset()
{
if (!bChangePreset)
return;
bChangePreset = false;
for (int i = 0; i < iPresetSkills.Length; i++)
{
for (int k = 0; k < iPresetSkills[i].Length; k++)
{
if (iPresetSkills[i][k] == DataHandler.PlayData.skillPresets[i][k])
continue;
iPresetSkills[i][k] = DataHandler.PlayData.skillPresets[i][k];
if (i == iSelectedPreset)
{
if (iPresetSkills[i][k] < 0)
{
goodsPresets[k].ReleaseData();
goPresetUnsets[k].SetActive(false);
goPresetEmptys[k].SetActive(true);
goodsPresets[k].SetActiveContent(star: false, rarity: false, count: false);
}
else
{
goodsPresets[k].SetGoods(cGoods.TSkillActive, iPresetSkills[i][k], 0L);
goPresetUnsets[k].SetActive(true);
goPresetEmptys[k].SetActive(false);
goodsPresets[k].SetActiveContent(star: false, rarity: true, count: false);
}
}
}
}
}
// 프리셋 저장.
public void ApplySkillPreset()
{
if (iLoading > 0 || !bChangePreset)
return;
iLoading++;
bool[] bchanges = new bool[6];
for (int i = 0; i < iPresetSkills.Length; i++)
{
for (int k = 0; k < iPresetSkills[i].Length; k++)
{
if (iPresetSkills[i][k] != DataHandler.PlayData.skillPresets[i][k])
{
bchanges[i] = true;
DataHandler.EditSkillPreset(i, k, iPresetSkills[i][k]);
}
}
}
BattleMgr.SetDpsSkill();
if (bchanges[0] || bchanges[1] || bchanges[2] || bchanges[3] || bchanges[4] || bchanges[5])
{
DataHandler.PlayData.Save();
isSave++;
//GameUIMgr.SOpenToast(LocalizationText.GetText(Global.STR_Saved));
}
if (bchanges[DataHandler.PlayData.usePreset])
BattleMgr.SResetSkillPreset();
bChangePreset = false;
iLoading--;
}
// 프리셋의 슬롯 자동 선택.
public bool AutoBtnPresetSlot(int islotindex)
{
if (iSelectedTab > 0)
return false;
if (iLoading > 0)
return false;
iLoading++;
// 선택중인 스킬이 없는 경우.
if (iSelectedId < 0)
{
iLoading--;
return false;
}
// 오픈되지 않은 스킬.
if (DataHandler.GetSkillActive(iSelectedId).level <= 0)
{
iLoading--;
return false;
}
// 선택중인 스킬에 있는 스킬이 선택된 슬롯에 이미 장착되어 있으면 아무것도 하지 않음.
if (iPresetSkills[iSelectedPreset][islotindex] == iSelectedId)
{
iLoading--;
return false;
}
// 선택중인 스킬이 해당 프리셋의 다른 슬롯에 있는지 확인.
int iprevslot = -1;
for (int k = 0; k < iPresetSkills[iSelectedPreset].Length; k++)
{
if (iPresetSkills[iSelectedPreset][k] == iSelectedId)
{
iprevslot = k;
iLoading--;
return false;
}
}
// 선택한 슬롯에 다른 스킬 없으면 스킬 세팅.
if (iPresetSkills[iSelectedPreset][islotindex] < 0)
{
//// 선택중인 스킬이 이미 다른 슬롯에 있으면 그 슬롯 해제.
//if (iprevslot >= 0)
//{
// iPresetSkills[iSelectedPreset][iprevslot] = -1;
// goodsPresets[iprevslot].ReleaseData();
// goPresetUnsets[iprevslot].SetActive(false);
// goPresetEmptys[iprevslot].SetActive(true);
//}
// 선택한 슬롯에 스킬 세팅.
iPresetSkills[iSelectedPreset][islotindex] = iSelectedId;
goodsPresets[islotindex].SetGoods(cGoods.TSkillActive, iSelectedId, 0L);
goPresetUnsets[islotindex].SetActive(true);
goPresetEmptys[islotindex].SetActive(false);
goodsPresets[islotindex].SetActiveContent(star: false, rarity: true, count: false);
}
// 선택한 슬롯에 이미 장착된 다른 스킬이 있는 경우 서로 교체.
else
{
iLoading--;
return false;
//// 선택중인 스킬이 이미 다른 슬롯에 있으면 그 슬롯에 선택한 슬롯에 장착중인 스킬을 장착.
//if (iprevslot >= 0)
//{
// iPresetSkills[iSelectedPreset][iprevslot] = iPresetSkills[iSelectedPreset][islotindex];
// goodsPresets[iprevslot].SetGoods(cGoods.TSkillActive, iPresetSkills[iSelectedPreset][iprevslot], 0L);
// goPresetUnsets[iprevslot].SetActive(true);
// goPresetEmptys[iprevslot].SetActive(false);
//}
//
//// 선택한 슬롯에 스킬 세팅.
//iPresetSkills[iSelectedPreset][islotindex] = iSelectedId;
//goodsPresets[islotindex].SetGoods(cGoods.TSkillActive, iSelectedId, 0L);
//goPresetUnsets[islotindex].SetActive(true);
//goPresetEmptys[islotindex].SetActive(false);
}
escrSkill.scroller.RefreshActiveCellViews();
bChangePreset = true;
iLoading--;
ApplySkillPreset();
return true;
}
// 프리셋의 슬롯 선택.
public void BtnPresetSlot(int islotindex)
{
if (iSelectedTab > 0)
return;
if (iLoading > 0)
return;
iLoading++;
// 선택중인 스킬이 없는 경우.
if (iSelectedId < 0)
{
iLoading--;
return;
}
// 오픈되지 않은 스킬.
if (DataHandler.GetSkillActive(iSelectedId).level <= 0)
{
iLoading--;
return;
}
// 선택중인 스킬에 있는 스킬이 선택된 슬롯에 이미 장착되어 있으면 아무것도 하지 않음.
if (iPresetSkills[iSelectedPreset][islotindex] == iSelectedId)
{
iLoading--;
return;
}
// 선택중인 스킬이 해당 프리셋의 다른 슬롯에 있는지 확인.
int iprevslot = -1;
for (int k = 0; k < iPresetSkills[iSelectedPreset].Length; k++)
{
if (iPresetSkills[iSelectedPreset][k] == iSelectedId)
{
iprevslot = k;
break;
}
}
// 선택한 슬롯에 다른 스킬 없으면 스킬 세팅.
if (iPresetSkills[iSelectedPreset][islotindex] < 0)
{
// 선택중인 스킬이 이미 다른 슬롯에 있으면 그 슬롯 해제.
if (iprevslot >= 0)
{
iPresetSkills[iSelectedPreset][iprevslot] = -1;
goodsPresets[iprevslot].ReleaseData();
goPresetUnsets[iprevslot].SetActive(false);
goPresetEmptys[iprevslot].SetActive(true);
goodsPresets[iprevslot].SetActiveContent(star: false, rarity: false, count: false);
}
// 선택한 슬롯에 스킬 세팅.
iPresetSkills[iSelectedPreset][islotindex] = iSelectedId;
goodsPresets[islotindex].SetGoods(cGoods.TSkillActive, iSelectedId, 0L);
goPresetUnsets[islotindex].SetActive(true);
goPresetEmptys[islotindex].SetActive(false);
goodsPresets[islotindex].SetActiveContent(star: false, rarity: true, count: false);
}
// 선택한 슬롯에 이미 장착된 다른 스킬이 있는 경우 서로 교체.
else
{
// 선택중인 스킬이 이미 다른 슬롯에 있으면 그 슬롯에 선택한 슬롯에 장착중인 스킬을 장착.
if (iprevslot >= 0)
{
iPresetSkills[iSelectedPreset][iprevslot] = iPresetSkills[iSelectedPreset][islotindex];
goodsPresets[iprevslot].SetGoods(cGoods.TSkillActive, iPresetSkills[iSelectedPreset][iprevslot], 0L);
goPresetUnsets[iprevslot].SetActive(true);
goPresetEmptys[iprevslot].SetActive(false);
goodsPresets[islotindex].SetActiveContent(star: false, rarity: true, count: false);
}
// 선택한 슬롯에 스킬 세팅.
iPresetSkills[iSelectedPreset][islotindex] = iSelectedId;
goodsPresets[islotindex].SetGoods(cGoods.TSkillActive, iSelectedId, 0L);
goPresetUnsets[islotindex].SetActive(true);
goPresetEmptys[islotindex].SetActive(false);
goodsPresets[islotindex].SetActiveContent(star: false, rarity: true, count: false);
}
escrSkill.scroller.RefreshActiveCellViews();
bChangePreset = true;
iLoading--;
ApplySkillPreset();
}
// 프리셋의 슬롯 해제.
public void BtnPresetRelease(int islotindex)
{
if (iSelectedTab > 0)
return;
if (iLoading > 0)
return;
iLoading++;
// 슬롯에 스킬 없으면 아무것도 하지 않음.
if (iPresetSkills[iSelectedPreset][islotindex] < 0)
{
iLoading--;
return;
}
// 선택한 슬롯에 있는 스킬을 해제.
iPresetSkills[iSelectedPreset][islotindex] = -1;
goodsPresets[islotindex].ReleaseData();
goPresetUnsets[islotindex].SetActive(false);
goPresetEmptys[islotindex].SetActive(true);
goodsPresets[islotindex].SetActiveContent(star: false, rarity: false, count: false);
escrSkill.scroller.RefreshActiveCellViews();
SoundMgr.PlaySfx(SoundName.BtnPress);
bChangePreset = true;
iLoading--;
ApplySkillPreset();
}
#endregion Preset
#region Left Info
// 왼쪽 정보창 스킬 정보 표시.
private void SetLeftSkillInfo()
{
int itype = 0;
bool bhave = false;
int imaxlv = 0;
int iopenlv = 0;
int ilevel = 0;
bool bmaxlv = false;
long iprice = 0L;
int iawaken = 1;
int imaxawaken = 1;
int rarity = 1;
// 액티브.
if (iSvType == cGoods.TSkillActive)
{
dSkillActive skill = DataHandler.GetSkillActive(iSelectedId);
itype = cGoods.TSkillActive;
imaxlv = DataHandler.GetSkillMaxLv(itype, iSelectedId);
iopenlv = skill.openLv;
ilevel = skill.level;
iawaken = skill.awaken;
imaxawaken = skill.maxAwaken;
bhave = DataHandler.PlayData.playerLv >= skill.openLv;
bmaxlv = skill.level >= imaxlv;
iprice = (ilevel - 1) * skill.buyingCntInc + skill.buyingCnt;
int icalclv = ilevel - 1;
if (icalclv < 0)
icalclv = 1;
rarity = skill.rarity;
txtInfoEfcTs[0].text = LocalizationText.GetText("skill_damage");
txtInfoEfcTs[2].text = LocalizationText.GetText("skill_range");
txtInfoEfcTs[3].text = LocalizationText.GetText("skill_cool");
txtInfoEfcCurs[0].text = FormatString.TextIntPer0(icalclv * skill.atkValueInc + skill.atkValue);
txtInfoEfcCurs[2].text = BattleMgr.SGetSkillRange(iSelectedId).ToString();
txtInfoEfcCurs[3].text = FormatString.TextTimeSec(DataHandler.GetSkillCool(iSelectedId));
txtInfoEfcDesc.text = LocalizationText.GetText(FormatString.CombineAllString(FormatString.SkillActiveDesc, iSelectedId.ToString()));
txtInfoEfcDesc.enabled = true;
goInfoEfcs[2].SetActive(true);
goInfoEfcs[3].SetActive(true);
// 상태이상 있음.
if (skill.debuffType != eSkillDebuff.None)
{
txtInfoEfcTs[1].text = FormatString.TextDebuffTitle(skill.debuffType);
txtInfoEfcCurs[1].text = FormatString.TextDebuffValue(skill.debuffType, icalclv * skill.debuffValueInc + skill.debuffValue, skill.debuffTime);
InfoEfcArrowObjs[1].SetActive(false);
txtInfoEfcNexts[1].enabled = false;
goInfoEfcs[1].SetActive(true);
}
// 상태이상 없음.
else
{
goInfoEfcs[1].SetActive(false);
}
// 최고 레벨 또는 미소지.
if (bmaxlv || !bhave)
{
InfoEfcArrowObjs[0].SetActive(false);
txtInfoEfcNexts[0].enabled = false;
InfoEfcArrowObjs[1].SetActive(false);
txtInfoEfcNexts[1].enabled = false;
}
// 최고 레벨 아님.
else
{
txtInfoEfcNexts[0].text = FormatString.TextIntPer0(ilevel * skill.atkValueInc + skill.atkValue);
InfoEfcArrowObjs[0].SetActive(true);
txtInfoEfcNexts[0].enabled = true;
// 상태이상 있음.
if (skill.debuffType != eSkillDebuff.None && skill.debuffValueInc > 0)
{
txtInfoEfcNexts[1].text = FormatString.TextDebuffValue(skill.debuffType, ilevel * skill.debuffValueInc + skill.debuffValue, skill.debuffTime);
InfoEfcArrowObjs[1].SetActive(true);
txtInfoEfcNexts[1].enabled = true;
}
else
{
InfoEfcArrowObjs[1].SetActive(false);
txtInfoEfcNexts[1].enabled = false;
}
}
}
// 패시브.
else
{
dSkillPassive skill = DataHandler.GetSkillPassive(iSelectedId);
itype = cGoods.TSkillPassive;
imaxlv = DataHandler.GetSkillMaxLv(itype, iSelectedId);
iopenlv = skill.openLv;
ilevel = skill.level;
iawaken = 1;
imaxawaken = 1;
bhave = DataHandler.PlayData.playerLv >= skill.openLv;
bmaxlv = skill.level >= imaxlv;
iprice = (ilevel - 1) * skill.buyingCntInc + skill.buyingCnt;
int icalclv = ilevel - 1;
if (icalclv < 0)
icalclv = 1;
rarity = skill.rarity;
txtInfoEfcTs[0].text = FormatString.TextEffectTitle(skill.abilityType);
txtInfoEfcCurs[0].text = FormatString.TextEffectValue(skill.abilityType, icalclv * skill.abilityValueInc + skill.abilityValue, true);
txtInfoEfcDesc.enabled = false;
for (int i = 1; i < goInfoEfcs.Length; i++)
goInfoEfcs[i].SetActive(false);
// 최고 레벨 또는 미소지.
if (bmaxlv || !bhave)
{
InfoEfcArrowObjs[0].SetActive(false);
txtInfoEfcNexts[0].enabled = false;
}
// 최고 레벨 아님.
else
{
txtInfoEfcNexts[0].text = FormatString.TextEffectValue(skill.abilityType, ilevel * skill.abilityValueInc + skill.abilityValue, true);
InfoEfcArrowObjs[0].SetActive(true);
txtInfoEfcNexts[0].enabled = true;
}
}
bool bmaxawaken = iawaken >= imaxawaken;
goodsInfo.SetGoods(itype, iSelectedId, 0L);
txtInfoUnlockLv.text = FormatString.CombineAllString(LocalizationText.GetText("all_openlv"), iopenlv.ToString());
txtInfoName.text = FormatString.GetGoodsName(itype, iSelectedId);
txtInfoNameColorSetter?.SetColor(rarity.ToString());
txtInfoLv.text = FormatString.TextLvPerMax(bhave ? ilevel : 0, imaxlv);
// 최고 레벨이 아니면 강화 버튼 표시.
btnInfoEnhance.gameObject.SetActive(!bmaxlv);
// 최고 레벨에 각성이 가능하면 각성 버튼 표시.
btnInfoAwaken.gameObject.SetActive(bmaxlv && !bmaxawaken);
// 최고 레벨에 각성이 불가능하면 Max 버튼 표시.
goInfoMax.SetActive(bmaxlv && bmaxawaken);
// 각성 가능 스킬은 추가 효과 탭 표시.
imgTabInfoLineRight.enabled = imaxawaken > 1;
btnTabInfoEffectAdd.gameObject.SetActive(imgTabInfoLineRight.enabled);
goBtnInfoEfcAddLock.SetActive(imgTabInfoLineRight.enabled && iawaken <= 1);
//goBtnInfoHelp.SetActive(imgTabInfoLineRight.enabled);
goBtnInfoHelp.SetActive(false);
// 미소지.
if (!bhave)
{
txtInfoEnhance.text = FormatString.S_Hypen;
btnInfoEnhance.interactable = false;
}
// 최고 레벨 아님.
else if (!bmaxlv)
{
txtInfoEnhance.text = FormatString.TextInt(iprice);
btnInfoEnhance.interactable = iprice <= DataHandler.Goods.skillReinStone;
}
imgBtnInfoEnhance.raycastTarget = btnInfoEnhance.interactable;
}
// 추가 효과 표시.
private void SetEfcAddList()
{
dSkillActive skill = DataHandler.GetSkillActive(iSelectedId);
dAwaken[] awakens = DataHandler.GetSkillAwakens();
for (int i = 0; i < efcAddItems.Length; i++)
{
if (i + 1 >= skill.maxAwaken)
{
efcAddItems[i].gameObject.SetActive(false);
continue;
}
efcAddItems[i].gameObject.SetActive(true);
bool bopen = skill.awaken > i + 1;
efcAddItems[i].SetOpen(bopen);
if (bopen)
{
efcAddItems[i].SetEffect(eEffectType.SkillCool, awakens[i + 1].coolTimeDec);
}
}
}
// 왼쪽 정보창 스킬 효과 탭.
public void TabLeftEffect()
{
iLoading++;
btnTabInfoEffect.interactable = false;
btnTabInfoEffectAdd.interactable = true;
groupInfoSkillEffect.SetActive(true);
groupInfoSkillEffectAdd.SetActive(false);
SoundMgr.PlaySfx(SoundName.BtnPress);
iLoading--;
}
// 왼쪽 정보창 추가 효과 탭.
public void TabLeftEffectAdd()
{
if (goBtnInfoEfcAddLock.activeSelf)
{
GameUIMgr.SOpenToast(LocalizationText.GetText("msg_skillawakenneed"));
SoundMgr.PlaySfx(SoundName.BtnPress);
return;
}
iLoading++;
btnTabInfoEffect.interactable = true;
btnTabInfoEffectAdd.interactable = false;
groupInfoSkillEffect.SetActive(false);
groupInfoSkillEffectAdd.SetActive(true);
SoundMgr.PlaySfx(SoundName.BtnPress);
SetEfcAddList();
iLoading--;
}
// 왼쪽 정보창 도움말.
public void OpenInfoHelp()
{
SoundMgr.PlaySfx(SoundName.BtnPress);
}
#endregion Left Info
#region Skill Enhance
// 스킬 강화 시작.
public void OnBtnSkillEnhanceDown()
{
if (iLoading > 0)
return;
if (bClicking)
return;
iLoading++;
bClicking = true;
int ibeflv = 1;
if (iSvType == cGoods.TSkillActive)
ibeflv = DataHandler.GetSkillActive(iSelectedId).level;
else
ibeflv = DataHandler.GetSkillPassive(iSelectedId).level;
dataEnhance = new nIdEnhance(iSelectedId, ibeflv);
StartCoroutine(nameof(CSkillEnhance));
}
// 스킬 강화 진행.
private IEnumerator CSkillEnhance()
{
int imaxlv = DataHandler.GetSkillMaxLv(iSvType, iSelectedId);
int ipricebase = 0;
int ipriceinc = 0;
if (iSvType == cGoods.TSkillActive)
{
dSkillActive skill = DataHandler.GetSkillActive(iSelectedId);
ipricebase = skill.buyingCnt;
ipriceinc = skill.buyingCntInc;
}
else
{
dSkillPassive skill = DataHandler.GetSkillPassive(iSelectedId);
ipricebase = skill.buyingCnt;
ipriceinc = skill.buyingCntInc;
}
int iprice = (dataEnhance.aftLv - 1) * ipriceinc + ipricebase;
if (iprice > DataHandler.Goods.skillReinStone || dataEnhance.aftLv >= imaxlv)
{
OnBtnSkillEnhanceUp();
yield break;
}
dataEnhance.aftLv++;
dataEnhance.tryCount++;
dataEnhance.useGoods += iprice;
DataHandler.SubSkillStone(iprice);
DataHandler.LvUpSkill(iSvType, iSelectedId, dataEnhance.aftLv);
SetLeftSkillInfo();
GameUIMgr.SPlayEfcLeftEnhance();
SoundMgr.PlaySfx(SoundName.BtnPress);
SoundMgr.PlaySfx(SoundName.ReinforceSuccess);
yield return YieldInstructionCache.WaitForSeconds(0.4f);
while (bClicking)
{
isMultiEnhance = true;
iprice = (dataEnhance.aftLv - 1) * ipriceinc + ipricebase;
if (iprice > DataHandler.Goods.skillReinStone || dataEnhance.aftLv >= imaxlv)
{
OnBtnSkillEnhanceUp();
yield break;
}
dataEnhance.aftLv++;
dataEnhance.tryCount++;
dataEnhance.useGoods += iprice;
DataHandler.SubSkillStone(iprice);
DataHandler.LvUpSkill(iSvType, iSelectedId, dataEnhance.aftLv);
SetLeftSkillInfo();
GameUIMgr.SPlayEfcLeftEnhance();
SoundMgr.PlaySfx(SoundName.BtnPress);
SoundMgr.PlaySfx(SoundName.ReinforceSuccess);
yield return YieldInstructionCache.WaitForSeconds(0.1f);
}
}
bool isMultiEnhance = false;
// 스킬 강화 종료.
public void OnBtnSkillEnhanceUp()
{
if (!bClicking)
return;
CoverCamera.Hold();
StopCoroutine(nameof(CSkillEnhance));
bClicking = false;
string url;
if (iSvType == cGoods.TSkillActive)
url = UrlApi.GetUrl(UrlApi.SkillEnhanceActive);
else
url = UrlApi.GetUrl(UrlApi.SkillEnhancePassive);
if (isMultiEnhance==true)
{
isMultiEnhance=false;
StartCoroutine(StartSVSkillEnhance(0.3f, url));
}
else
{
SvConnectManager.Instance.RequestSvPost(true, 0, url, typeof(nSkillReturn), ASkillEnhanceSucc, ASkillEnhanceFail, dataEnhance, false);
}
}
IEnumerator StartSVSkillEnhance(float time,string url)
{
yield return new WaitForSeconds(time);
SvConnectManager.Instance.RequestSvPost(true, 0, url, typeof(nSkillReturn), ASkillEnhanceSucc, ASkillEnhanceFail, dataEnhance, false);
}
// 스킬 강화 통신 실패.
private void ASkillEnhanceFail(SvError error, object request)
{
DataHandler.AddEnhanceStone(dataEnhance.useGoods);
DataHandler.LvUpSkill(iSvType, dataEnhance.sid, dataEnhance.befLv);
escrSkill.scroller.RefreshActiveCellViews();
SetTotalLvEfc();
SetLeftSkillInfo();
dataEnhance = null;
CoverCamera.Release();
iLoading--;
}
// 스킬 강화 통신 성공.
private void ASkillEnhanceSucc(object result, object request)
{
nSkillReturn data = result as nSkillReturn;
if (data == null)
{
ASkillEnhanceFail(new SvError(eErrorCode.NULL_OR_EMPTY), request);
return;
}
DataHandler.SetGoods(data.playCurrency, true);
nIdLvInfo datalv;
if (iSvType == cGoods.TSkillActive)
datalv = data.playCharSkillActive;
else
datalv = data.playCharSkillPassive;
DataHandler.LvUpSkill(iSvType, datalv.sid, datalv.lv);
escrSkill.scroller.RefreshActiveCellViews();
SetTotalLvEfc();
SetLeftSkillInfo();
dataEnhance = null;
CoverCamera.Release();
iLoading--;
}
#endregion Skill Enhance
#region Skill Awaken
// 스킬 각성.
public void BtnSkillAwaken()
{
if (iSelectedId < 0)
return;
if (iLoading > 0)
return;
iLoading++;
// 모자, 망토, 신발
dAwaken awaken = DataHandler.GetSkillAwakenNext(iSvType, iSelectedId);
int[] igearneeds = DataHandler.GetSkillAwakenNeeds(iSvType, iSelectedId);
int[] ihavecounts = new int[4] { DataHandler.GetGearEquip(cGoods.TBagArmorHat, igearneeds[0]).count, DataHandler.GetGearEquip(cGoods.TBagArmorCape, igearneeds[1]).count,
DataHandler.GetGearEquip(cGoods.TBagArmorShoes, igearneeds[2]).count, DataHandler.Goods.gearAwakenStone };
int[] ineedcounts = new int[4] { awaken.buyingCnt1, awaken.buyingCnt2, awaken.buyingCnt3, awaken.AwakenStoneCnt };
nGoods[] goodsneeds = new nGoods[4]
{
new nGoods(cGoods.TBagArmorHat, igearneeds[0], ihavecounts[0]),
new nGoods(cGoods.TBagArmorCape, igearneeds[1], ihavecounts[1]),
new nGoods(cGoods.TBagArmorShoes, igearneeds[2], ihavecounts[2]),
new nGoods(cGoods.TCurrency, cGoods.CAwakenStoneGear, ihavecounts[3])
};
SoundMgr.PlaySfx(SoundName.BtnPress);
GameUIMgr.SOpenPopupItemsUseTo(goodsneeds, new nGoods(iSvType, iSelectedId, -1), ASkillAwaken, null,
LocalizationText.GetText("skill_awaken"), LocalizationText.GetText("skill_awakenmsg"), LocalizationText.GetText("all_awakengo"), LocalizationText.GetText(Global.STR_CANCEL));
GameUIMgr.SSetPopupItemsUseToCount(ihavecounts, ineedcounts);
iLoading--;
}
// 스킬 각성하기.
private void ASkillAwaken()
{
if (iLoading > 0)
return;
iLoading++;
CoverCamera.Hold();
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.SkillAwakenActive), typeof(nSkillReturn), ASkillAwakenSucc, ASkillAwakenFail, new nIdCnt(iSelectedId), false);
}
// 스킬 각성 통신 실패.
private void ASkillAwakenFail(SvError error, object request)
{
CoverCamera.Release();
iLoading--;
}
// 스킬 각성 통신 성공.
private void ASkillAwakenSucc(object result, object request)
{
nSkillReturn data = result as nSkillReturn;
if (data == null)
{
ASkillAwakenFail(new SvError(eErrorCode.NULL_OR_EMPTY), request);
return;
}
DataHandler.SetGoods(data.playCurrency, true);
dAwaken awaken = DataHandler.GetSkillAwakenNext(iSvType, iSelectedId);
int[] igearneeds = DataHandler.GetSkillAwakenNeeds(iSvType, iSelectedId);
// 장비 수량 감소.
DataHandler.SubGearEquip(cGoods.TBagArmorHat, igearneeds[0], awaken.buyingCnt1);
DataHandler.SubGearEquip(cGoods.TBagArmorCape, igearneeds[1], awaken.buyingCnt1);
DataHandler.SubGearEquip(cGoods.TBagArmorShoes, igearneeds[2], awaken.buyingCnt1);
// 스킬 각성.
DataHandler.AwakenSkill(iSvType, iSelectedId, data.playCharSkillActive.awaken);
SetLeftSkillInfo();
if (groupInfoSkillEffectAdd.activeSelf)
{
SetEfcAddList();
}
GameUIMgr.SOpenToast(LocalizationText.GetText("msg_skillawaken"));
BattleMgr.SRecalcSkillCool(iSelectedId);
CoverCamera.Release();
iLoading--;
}
#endregion Skill Awaken
public static void SResetPreset()
{
if (curMgr.iSelectedTab < 0)
{
return;
}
for (int i = 0; i < curMgr.iPresetSkills.Length; i++)
{
for (int k = 0; k < curMgr.iPresetSkills[i].Length; k++)
{
curMgr.iPresetSkills[i][k] = DataHandler.PlayData.skillPresets[i][k];
}
}
curMgr.TabPreset(DataHandler.PlayData.usePreset);
}
}