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 activeRows; private int[] activeIds; private EnhancedUI.SmallList 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().text = LocalizationText.GetText("skill_title"); btnTabs = trfcanvas.Find("tabWrapTop").GetComponentsInChildren(true); btnTabs[0].transform.Find("txt").GetComponent().text = LocalizationText.GetText("skill_active"); btnTabs[1].transform.Find("txt").GetComponent().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(); imgTabLineRights[i] = btnTabs[i].transform.Find("lineright").GetComponent(); } rtrfSvSkill = trfcanvas.Find("SvSkill").GetComponent(); Transform trfefc = trfcanvas.Find("groupTotalEffect"); trfefc.Find("txtTotalLvT").GetComponent().text = LocalizationText.GetText("skill_totallv"); txtTotalEfcT = trfefc.Find("txtTotalEfcT").GetComponent(); txtTotalLv = trfefc.Find("txtTotalLv").GetComponent(); txtTotalEfc = trfefc.Find("txtTotalEfc").GetComponent(); Transform trfpreset = trfcanvas.Find("groupPreset"); groupPreset = trfpreset.gameObject; trfpreset.Find("btnSave").Find("txt").GetComponent().text = LocalizationText.GetText("all_save"); btnPresetTabs = new ButtonIV[6]; btnPresetTabs[0] = trfpreset.Find("tab0").GetComponent(); btnPresetTabs[1] = trfpreset.Find("tab1").GetComponent(); btnPresetTabs[2] = trfpreset.Find("tab2").GetComponent(); btnPresetTabs[3] = trfpreset.Find("tab3").GetComponent(); btnPresetTabs[4] = trfpreset.Find("tab4").GetComponent(); btnPresetTabs[5] = trfpreset.Find("tab5").GetComponent(); goodsPresets = trfpreset.GetComponentsInChildren(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().text = LocalizationText.GetText("skill_info"); goodsInfo = trfleft.Find("GoodsItem").GetComponent(); goBtnInfoHelp = trfleft.Find("btnInfo").gameObject; txtInfoUnlockLv = trfleft.Find("txtUnlockLv").GetComponent(); txtInfoName = trfleft.Find("txtName").GetComponent(); txtInfoNameColorSetter = txtInfoName.GetComponent(); txtInfoLv = trfleft.Find("txtLv").GetComponent(); btnInfoEnhance = trfleft.Find("btnEnhance").GetComponent(); imgBtnInfoEnhance = btnInfoEnhance.GetComponent(); txtInfoEnhance = btnInfoEnhance.transform.Find("txtPrice").GetComponent(); btnInfoEnhance.transform.Find("txt").GetComponent().text = LocalizationText.GetText("all_enhance"); btnInfoAwaken = trfleft.Find("btnAwaken").GetComponent(); btnInfoAwaken.transform.Find("txt").GetComponent().text = LocalizationText.GetText("all_awaken"); goInfoMax = trfleft.Find("goMax").gameObject; goInfoMax.transform.Find("txt").GetComponent().text = LocalizationText.GetText(Global.STR_MAX); goBtnInfoEfcAddLock = trfleft.Find("goEffectAddLock").gameObject; imgTabInfoLineRight = trfleft.Find("tabSubLine2").GetComponent(); btnTabInfoEffect = trfleft.Find("tabEffect").GetComponent(); btnTabInfoEffect.transform.Find("txt").GetComponent().text = LocalizationText.GetText("skill_efcuse"); btnTabInfoEffectAdd = trfleft.Find("tabEffectAdd").GetComponent(); btnTabInfoEffectAdd.transform.Find("txt").GetComponent().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(); 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 datas = DataHandler.GetSkillActives(); activeRows = new EnhancedUI.SmallList(); 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 datas = DataHandler.GetSkillPassives(); passiveRows = new EnhancedUI.SmallList(); 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); } }