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.
1374 lines
51 KiB
1374 lines
51 KiB
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using IVDataFormat;
|
|
using IVServerFormat;
|
|
using TMPro;
|
|
using System;
|
|
using EnhancedUI;
|
|
using System.Collections.Generic;
|
|
|
|
public class DungeonMgr : Singleton<DungeonMgr>
|
|
{
|
|
public enum DungeonKind
|
|
{
|
|
DeepCave,
|
|
Atlantis,
|
|
ProtectTheMerchant,
|
|
DevelopTheJungle,
|
|
HuntEagle,
|
|
AwakenDG,
|
|
GuardianDG,
|
|
|
|
Total
|
|
}
|
|
|
|
#region UI
|
|
[SerializeField]
|
|
private Canvas canvasUI;
|
|
[SerializeField]
|
|
TextMeshProUGUI txtMainT;
|
|
[SerializeField]
|
|
Button mainDungeonButton;
|
|
GameObject mainLock;
|
|
|
|
[SerializeField]
|
|
Canvas dungeonLeftPn;
|
|
GameObject leftCanvasUI;
|
|
|
|
GameObject leftPanel;
|
|
Image dungeonImage;
|
|
TextMeshProUGUI dungeonName;
|
|
[SerializeField]
|
|
ButtonIV btnDungeonOut;
|
|
[SerializeField]
|
|
GoodsItem[] rewardItem;
|
|
[SerializeField]
|
|
GameObject[] dungeonPanel;
|
|
GameObject[] objDungeonSelect = new GameObject[5];
|
|
GameObject[] objDungeonLock = new GameObject[5];
|
|
ButtonIV btnDungeonSkip;
|
|
TextMeshProUGUI txtDungeonSkip;
|
|
[SerializeField]
|
|
TextMeshProUGUI txtAutoProgress;
|
|
GameObject PetDungeonAreaSelector;
|
|
TextMeshProUGUI dungeonPetLevel;
|
|
ButtonIV btnPrevLevel, btnNextLevel;
|
|
[SerializeField]
|
|
ButtonIV[] btnTabs;
|
|
#endregion
|
|
|
|
#region Escr
|
|
[SerializeField]
|
|
EScrController escrDungeonSelect;
|
|
#endregion
|
|
|
|
int iSelectArea = -1;
|
|
|
|
Toggle autoProgressToggle;
|
|
[SerializeField]
|
|
bool autoProgress = false;
|
|
|
|
private int iLoading = 1;
|
|
private bool bReLocalize = true;
|
|
private int SelectedTab = -1;
|
|
DungeonKind dungeonKind;
|
|
private int DungeonLevel = 1;
|
|
private float DungeonBonus = 1;
|
|
|
|
//프리셋 배열의 갯수는 스킬의 갯수가 아닌 던전의 갯수.
|
|
int[] dungeonSkillPreset = { 0, 0, 0, 0, 0, 0,0 };
|
|
int[] dungeonPetPreset = { 0, 0, 0, 0, 0, 0,0 };
|
|
int[] dungeonAwakenPreset = { 0, 0, 0, 0, 0, 0,0 };
|
|
|
|
bool isUnlockDungeon = false;
|
|
|
|
public bool GetAutoProgress()
|
|
{
|
|
return autoProgress;
|
|
}
|
|
|
|
public void SetAutoProgress(bool onoff)
|
|
{
|
|
autoProgress = onoff;
|
|
}
|
|
|
|
public static void SetDungeonKind(DungeonKind i)
|
|
{
|
|
Instance.dungeonKind = i;
|
|
}
|
|
|
|
public static DungeonKind GetDungeonKind()
|
|
{
|
|
return Instance.dungeonKind;
|
|
}
|
|
|
|
#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("dg_title");
|
|
}
|
|
else
|
|
{
|
|
bReLocalize = false;
|
|
canvasUI.transform.Find("txtT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("dungeon_title");
|
|
|
|
leftPanel = dungeonLeftPn.gameObject;
|
|
dungeonImage = leftPanel.transform.Find("DungeonImage").GetComponent<Image>();
|
|
dungeonName = dungeonImage.transform.Find("DungeonName").GetComponent<TextMeshProUGUI>();
|
|
|
|
for (int i = 0; i < dungeonPanel.Length; i++)
|
|
{
|
|
objDungeonSelect[i] = dungeonPanel[i].transform.Find("select").gameObject;
|
|
objDungeonLock[i] = dungeonPanel[i].transform.Find("DungeonLock").gameObject;
|
|
}
|
|
|
|
leftCanvasUI = dungeonLeftPn.gameObject;
|
|
leftCanvasUI.transform.Find("txtT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("dungeon_info");
|
|
btnDungeonSkip = leftCanvasUI.transform.Find("btnSkip").GetComponent<ButtonIV>();
|
|
txtDungeonSkip = btnDungeonSkip.transform.Find("txt").GetComponent<TextMeshProUGUI>();
|
|
txtDungeonSkip.text = LocalizationText.GetText("dungeon_skip");
|
|
txtAutoProgress.text = LocalizationText.GetText("auto_progress");
|
|
PetDungeonAreaSelector = leftCanvasUI.transform.Find("PetDungeonSet").gameObject;
|
|
dungeonPetLevel = PetDungeonAreaSelector.transform.Find("PetLevel").GetComponent<TextMeshProUGUI>();
|
|
dungeonPetLevel.text = FormatString.StringFormat(LocalizationText.GetText("dungeon_pet_level"), "1");
|
|
btnPrevLevel = PetDungeonAreaSelector.transform.Find("prevArrow").GetComponent<ButtonIV>();
|
|
btnNextLevel = PetDungeonAreaSelector.transform.Find("nextArrow").GetComponent<ButtonIV>();
|
|
|
|
autoProgressToggle = leftCanvasUI.transform.Find("txtCheckBox").transform.Find("CheckBox").GetComponent<Toggle>();
|
|
}
|
|
}
|
|
|
|
// 설정에서 언어 변경 시 처리.
|
|
public static void SReLocalize()
|
|
{
|
|
Instance.Localize(true);
|
|
Instance.bReLocalize = true;
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
iLoading--;
|
|
}
|
|
|
|
public static bool SCloseMenu()
|
|
{
|
|
return Instance.CloseMenu();
|
|
}
|
|
|
|
private bool CloseMenu()
|
|
{
|
|
// 게임 시작 후 열린적 없음.
|
|
if (SelectedTab < 0) return false;
|
|
|
|
if (canvasUI.enabled)
|
|
{
|
|
CloseDungeon();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
#endregion Base
|
|
|
|
#region UI
|
|
public void MoveDungeon(eEventMoveType content)//다른 곳에서 던전 컨텐츠를 열어야 할 때.
|
|
{
|
|
OpenDungeon();
|
|
switch (content)
|
|
{
|
|
case eEventMoveType.DgGold: TabDeepCave(); break;
|
|
case eEventMoveType.DgStone: TabAtlantis(); break;
|
|
case eEventMoveType.DgPet: TabProtectTheMerchant(); break;
|
|
case eEventMoveType.DgAwaken: TabDevelopTheJungle(); break;
|
|
case eEventMoveType.DgRelic: TabHuntEagle(); break;
|
|
}
|
|
}
|
|
|
|
public void OpenDungeon() //던전 버튼으로 던전을 열 때. 최초 열 때는 골드던전이 활성화된다.
|
|
{
|
|
if (mainLock.activeSelf)
|
|
{
|
|
GameUIMgr.SOpenToast(FormatString.TextOpenStageClear(DataHandler.GetDungeonTypeInfo(DungeonMgr.DungeonKind.DeepCave).openStage));//펫 던전 해금될때 해금됨
|
|
return;
|
|
}
|
|
|
|
if (iLoading > 0) return;
|
|
|
|
iLoading++;
|
|
if (bReLocalize)
|
|
{
|
|
Localize(false);
|
|
}
|
|
|
|
canvasUI.enabled = true;
|
|
dungeonLeftPn.enabled = true;
|
|
|
|
GameUIMgr.SRightWindowClose();
|
|
GameUIMgr.SOpenLeftPanel(dggoldticket: true, dgenhanceticket: true, dgawakenticket: true, dgpetticket: true, dgrelicticket: true);
|
|
GameUIMgr.SSetMainUiOn(false);
|
|
|
|
Debug.Assert(GameModDataGroup.Instance.TryGetModData(DeepCaveDungeonProperty.CodeName, out DeepCaveDungeonData deepCaveDungeonData), "Invalid dungeon data");
|
|
Debug.Assert(GameModDataGroup.Instance.TryGetModData(AtlantisDungeonProperty.CodeName, out AtlantisDungeonData atlantisDungeonData), "Invalid dungeon data");
|
|
Debug.Assert(GameModDataGroup.Instance.TryGetModData(ProtectTheMerchantDgProp.CodeName, out ProtectTheMerchantDgData protectTheMerchantDgData), "Invalid dungeon data");
|
|
Debug.Assert(GameModDataGroup.Instance.TryGetModData(DevelopTheJungleDgProp.CodeName, out DevelopTheJungleDgData developTheJungleDgData), "Invalid dungeon data");
|
|
Debug.Assert(GameModDataGroup.Instance.TryGetModData(HuntEagleDgProp.CodeName, out HuntEagleDgData huntEagleDgData), "Invalid dungeon data");
|
|
|
|
objDungeonLock[0].SetActive(!DataHandler.IsClearStage(deepCaveDungeonData.OpenStage));
|
|
objDungeonLock[1].SetActive(!DataHandler.IsClearStage(atlantisDungeonData.OpenStage));
|
|
objDungeonLock[2].SetActive(!DataHandler.IsClearStage(protectTheMerchantDgData.OpenStage));
|
|
objDungeonLock[3].SetActive(!DataHandler.IsClearStage(developTheJungleDgData.OpenStage));
|
|
objDungeonLock[4].SetActive(!DataHandler.IsClearStage(huntEagleDgData.OpenStage));
|
|
|
|
switch ((DungeonKind)SelectedTab) //수호령이나 훈련을 들렀다가 던전에 재진입했을때 던전 종류 세팅을 다시 해준다.
|
|
{
|
|
case DungeonKind.DeepCave: dungeonKind = DungeonKind.DeepCave; break;
|
|
case DungeonKind.Atlantis: dungeonKind = DungeonKind.Atlantis; break;
|
|
case DungeonKind.ProtectTheMerchant: dungeonKind = DungeonKind.ProtectTheMerchant; break;
|
|
case DungeonKind.DevelopTheJungle: dungeonKind = DungeonKind.DevelopTheJungle; break;
|
|
case DungeonKind.HuntEagle: dungeonKind = DungeonKind.HuntEagle; break;
|
|
};
|
|
|
|
switch ((DungeonKind)SelectedTab) //던전을 격파하고 나서 레벨이 오를때 오른 레벨을 반영해준다.
|
|
{
|
|
case DungeonKind.DeepCave:
|
|
selectDungeonLv = (int)deepCaveDungeonData.Level;
|
|
AutoScrollAtLevel((int)deepCaveDungeonData.Level);
|
|
btnDungeonSkip.interactable = deepCaveDungeonData.EnterTicketCount > 0 && deepCaveDungeonData.Level > 1;
|
|
break;
|
|
case DungeonKind.Atlantis:
|
|
selectDungeonLv = (int)atlantisDungeonData.Level;
|
|
AutoScrollAtLevel((int)atlantisDungeonData.Level);
|
|
btnDungeonSkip.interactable = atlantisDungeonData.EnterTicketCount > 0 && atlantisDungeonData.Level > 1;
|
|
break;
|
|
case DungeonKind.ProtectTheMerchant:
|
|
selectDungeonLv = (int)protectTheMerchantDgData.Level;
|
|
AutoScrollAtLevel((int)protectTheMerchantDgData.Level);
|
|
btnDungeonSkip.interactable = protectTheMerchantDgData.EnterTicketCount > 0 && protectTheMerchantDgData.Level > 1;
|
|
break;
|
|
case DungeonKind.DevelopTheJungle:
|
|
selectDungeonLv = (int)developTheJungleDgData.Level;
|
|
AutoScrollAtLevel((int)developTheJungleDgData.Level);
|
|
btnDungeonSkip.interactable = developTheJungleDgData.EnterTicketCount > 0 && developTheJungleDgData.Level > 1;
|
|
break;
|
|
case DungeonKind.HuntEagle:
|
|
selectDungeonLv = (int)developTheJungleDgData.Level;
|
|
AutoScrollAtLevel((int)developTheJungleDgData.Level);
|
|
btnDungeonSkip.interactable = developTheJungleDgData.EnterTicketCount > 0 && developTheJungleDgData.Level > 1;
|
|
break;
|
|
default:
|
|
TabDeepCave();
|
|
break;
|
|
};
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
autoProgressToggle.isOn = autoProgress;
|
|
|
|
iLoading--;
|
|
}
|
|
|
|
public static void CloseDungeon()//던전을 닫을때
|
|
{
|
|
if (Instance.iLoading > 0) return;
|
|
Instance.iLoading++;
|
|
|
|
Instance.canvasUI.enabled = false;
|
|
Instance.dungeonLeftPn.enabled = false;
|
|
GameUIMgr.SRightWindowClose();
|
|
GameUIMgr.SCloseLeftPanel();
|
|
GameUIMgr.SSetMainUiOn(true);
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
|
|
Instance.iLoading--;
|
|
}
|
|
#endregion
|
|
|
|
public static void IsUnlock()//메인창에서 던전이 해금되었는지의 여부를 분간한다. 해금되어있지 않으면 버튼색을 어둡게 하고 자물쇠를 건다.
|
|
{
|
|
if (Instance.isUnlockDungeon) return;
|
|
|
|
Instance.mainLock = Instance.mainDungeonButton.transform.Find("Image").gameObject;
|
|
|
|
Instance.mainLock.SetActive(!DataHandler.IsClearStage(DataHandler.GetDungeonTypeInfo(DungeonMgr.DungeonKind.DeepCave).openStage));
|
|
|
|
ColorBlock colorBlock = Instance.mainDungeonButton.colors;
|
|
|
|
if (Instance.mainLock.activeSelf)
|
|
{
|
|
colorBlock.normalColor = new Color(0.5f, 0.5f, 0.5f);
|
|
colorBlock.highlightedColor = new Color(0.5f, 0.5f, 0.5f);
|
|
colorBlock.selectedColor = new Color(0.5f, 0.5f, 0.5f);
|
|
colorBlock.pressedColor = new Color(0.5f, 0.5f, 0.5f);
|
|
|
|
Instance.mainDungeonButton.colors = colorBlock;
|
|
}
|
|
else
|
|
{
|
|
Instance.isUnlockDungeon = true;
|
|
|
|
colorBlock.normalColor = new Color(1f, 1f, 1f);
|
|
colorBlock.highlightedColor = new Color(1f, 1f, 1f);
|
|
colorBlock.selectedColor = new Color(1f, 1f, 1f);
|
|
colorBlock.pressedColor = new Color(1f, 1f, 1f);
|
|
|
|
Instance.mainDungeonButton.colors = colorBlock;
|
|
}
|
|
}
|
|
|
|
#region Tab : 던전 항목의 각 탭을 클릭하면 던전의 종류와 레벨을 세팅하고 왼쪽에 있는 스크롤뷰의 정보를 갱신해준다.
|
|
public void TabDeepCave()
|
|
{
|
|
Debug.Assert(GameModDataGroup.Instance.TryGetModData(DeepCaveDungeonProperty.CodeName, out DeepCaveDungeonData modData), "Invalid dungeon data");
|
|
|
|
SelectedTab = 0;
|
|
SetSelectTab(SelectedTab);
|
|
|
|
dungeonKind = DungeonKind.DeepCave;
|
|
|
|
DungeonLevel = (int)modData.Level;
|
|
selectDungeonLv = DungeonLevel;
|
|
|
|
dungeonImage.sprite = AddressableMgr.GetDungeonPanel((int)dungeonKind);
|
|
dungeonName.text = LocalizationText.GetText(modData.NameKey);
|
|
PetDungeonAreaSelector.SetActive(false);
|
|
SetRewardList(modData.DefaultRewards);
|
|
|
|
var stages = new SmallList<int>();
|
|
for (int i = 0; i < modData.MaxLevel; i++)
|
|
{
|
|
stages.Add(i + 1);
|
|
}
|
|
|
|
escrDungeonSelect.LoadDatas(stages, modData);
|
|
AutoScrollAtLevel(selectDungeonLv);
|
|
|
|
btnDungeonSkip.interactable = modData.EnterTicketCount > 0 && DungeonLevel > 1;
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
public void TabAtlantis()
|
|
{
|
|
Debug.Assert(GameModDataGroup.Instance.TryGetModData(AtlantisDungeonProperty.CodeName, out AtlantisDungeonData modData), "Invalid dungeon data");
|
|
|
|
if (objDungeonLock[1].activeSelf)
|
|
{
|
|
GameUIMgr.SOpenToast(FormatString.TextOpenStageClear((int)modData.OpenStage));
|
|
return;
|
|
}
|
|
|
|
SelectedTab = 1;
|
|
SetSelectTab(SelectedTab);
|
|
|
|
dungeonKind = DungeonKind.Atlantis;
|
|
|
|
DungeonLevel = (int)modData.Level;
|
|
selectDungeonLv = DungeonLevel;
|
|
|
|
dungeonImage.sprite = AddressableMgr.GetDungeonPanel((int)dungeonKind);
|
|
dungeonName.text = LocalizationText.GetText(modData.NameKey);
|
|
PetDungeonAreaSelector.SetActive(false);
|
|
SetRewardList(modData.DefaultRewards);
|
|
|
|
var stages = new SmallList<int>();
|
|
for (int i = 0; i < modData.MaxLevel; i++)
|
|
{
|
|
stages.Add(i + 1);
|
|
}
|
|
|
|
escrDungeonSelect.LoadDatas(stages, modData);
|
|
AutoScrollAtLevel(selectDungeonLv);
|
|
|
|
btnDungeonSkip.interactable = modData.EnterTicketCount > 0 && DungeonLevel > 1;
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
public void TabProtectTheMerchant()
|
|
{
|
|
Debug.Assert(GameModDataGroup.Instance.TryGetModData(ProtectTheMerchantDgProp.CodeName, out ProtectTheMerchantDgData modData), "Invalid dungeon data");
|
|
|
|
if (objDungeonLock[2].activeSelf)
|
|
{
|
|
GameUIMgr.SOpenToast(FormatString.TextOpenStageClear(modData.OpenStage));
|
|
return;
|
|
}
|
|
|
|
SelectedTab = 2;
|
|
SetSelectTab(SelectedTab);
|
|
|
|
dungeonKind = DungeonKind.ProtectTheMerchant;
|
|
|
|
DungeonLevel = (int)modData.Level;
|
|
selectDungeonLv = DungeonLevel;
|
|
|
|
dungeonImage.sprite = AddressableMgr.GetDungeonPanel((int)dungeonKind);
|
|
dungeonName.text = LocalizationText.GetText(modData.NameKey);
|
|
PetDungeonAreaSelector.SetActive(false);
|
|
SetRewardList(modData.DefaultRewards);
|
|
|
|
var stages = new SmallList<int>();
|
|
for (int i = 0; i < modData.MaxLevel; i++)
|
|
{
|
|
stages.Add(i + 1);
|
|
}
|
|
|
|
escrDungeonSelect.LoadDatas(stages, modData);
|
|
AutoScrollAtLevel(selectDungeonLv);
|
|
|
|
btnDungeonSkip.interactable = modData.EnterTicketCount > 0 && DungeonLevel > 1;
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
public void TabDevelopTheJungle()
|
|
{
|
|
Debug.Assert(GameModDataGroup.Instance.TryGetModData(DevelopTheJungleDgProp.CodeName, out DevelopTheJungleDgData modData), "Invalid dungeon data");
|
|
|
|
if (objDungeonLock[3].activeSelf)
|
|
{
|
|
GameUIMgr.SOpenToast(FormatString.TextOpenStageClear(modData.OpenStage));
|
|
return;
|
|
}
|
|
|
|
SelectedTab = 3;
|
|
SetSelectTab(SelectedTab);
|
|
|
|
dungeonKind = DungeonKind.DevelopTheJungle;
|
|
|
|
DungeonLevel = (int)modData.Level;
|
|
selectDungeonLv = DungeonLevel;
|
|
|
|
dungeonImage.sprite = AddressableMgr.GetDungeonPanel((int)dungeonKind);
|
|
dungeonName.text = LocalizationText.GetText(modData.NameKey);
|
|
PetDungeonAreaSelector.SetActive(false);
|
|
SetRewardList(modData.DefaultRewards);
|
|
|
|
var stages = new SmallList<int>();
|
|
for (int i = 0; i < modData.MaxLevel; i++)
|
|
{
|
|
stages.Add(i + 1);
|
|
}
|
|
|
|
escrDungeonSelect.LoadDatas(stages, modData);
|
|
AutoScrollAtLevel(selectDungeonLv);
|
|
|
|
btnDungeonSkip.interactable = modData.EnterTicketCount > 0 && DungeonLevel > 1;
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
public void TabHuntEagle()
|
|
{
|
|
Debug.Assert(GameModDataGroup.Instance.TryGetModData(HuntEagleDgProp.CodeName, out HuntEagleDgData modData), "Invalid dungeon data");
|
|
|
|
if (objDungeonLock[4].activeSelf)
|
|
{
|
|
GameUIMgr.SOpenToast(FormatString.TextOpenStageClear(modData.OpenStage));
|
|
return;
|
|
}
|
|
|
|
SelectedTab = 4;
|
|
SetSelectTab(SelectedTab);
|
|
|
|
dungeonKind = DungeonKind.HuntEagle;
|
|
|
|
DungeonLevel = (int)modData.Level;
|
|
selectDungeonLv = DungeonLevel;
|
|
|
|
dungeonImage.sprite = AddressableMgr.GetDungeonPanel((int)dungeonKind);
|
|
dungeonName.text = LocalizationText.GetText(modData.NameKey);
|
|
PetDungeonAreaSelector.SetActive(false);
|
|
SetRewardList(modData.DefaultRewards);
|
|
|
|
var stages = new SmallList<int>();
|
|
for (int i = 0; i < modData.MaxLevel; i++)
|
|
{
|
|
stages.Add(i + 1);
|
|
}
|
|
|
|
escrDungeonSelect.LoadDatas(stages, modData);
|
|
AutoScrollAtLevel(selectDungeonLv);
|
|
|
|
btnDungeonSkip.interactable = modData.EnterTicketCount > 0 && DungeonLevel > 1;
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
ButtonIV prevSettedTabButton;
|
|
GameObject prevSettedTabSelectIndicator;
|
|
void SetSelectTab(int idx)
|
|
{
|
|
if (prevSettedTabButton != null)
|
|
{
|
|
prevSettedTabButton.interactable = true;
|
|
prevSettedTabSelectIndicator.SetActive(false);
|
|
}
|
|
|
|
prevSettedTabButton = btnTabs[idx];
|
|
prevSettedTabSelectIndicator = objDungeonSelect[idx];
|
|
|
|
// 선택되어있는 항목 재선택을 막음(한 항목을 연속으로 터치하면 스크롤뷰 자동 옮기는 부분에서 문제가 발생함)
|
|
prevSettedTabButton.interactable = false;
|
|
prevSettedTabSelectIndicator.SetActive(true);
|
|
}
|
|
|
|
public void AutoScrollAtLevel(int targetLevel)
|
|
{
|
|
float scrollPosition = 0;
|
|
if(targetLevel >= 2)
|
|
scrollPosition = escrDungeonSelect.scroller.GetScrollPositionForCellViewIndex(targetLevel - 2, EnhancedUI.EnhancedScroller.EnhancedScroller.CellViewPositionEnum.Before);
|
|
|
|
escrDungeonSelect.scroller.SetScrollPositionImmediately(scrollPosition);
|
|
escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
}
|
|
#endregion
|
|
|
|
#region Dungeon
|
|
public void SetDungeonLevel(int DGLevel)
|
|
{
|
|
DungeonLevel = DGLevel;
|
|
}
|
|
|
|
public int GetDungeonLevel()
|
|
{
|
|
return DungeonLevel;
|
|
}
|
|
|
|
public static void GetSuccessOrFail(bool success)//던전 성공과 실패여부를 서버에 통신함(주석은 먼 옛날 서버가 없었을 적 코드)
|
|
{
|
|
if (success) //성공했을때. 소탕시에는 여기를 거치지 않음
|
|
{
|
|
Instance.ADungeonTrySv(Instance.DungeonLevel, true, false, 1, Instance.DungeonBonus);
|
|
}
|
|
else //실패했을때
|
|
{
|
|
Instance.ADungeonTrySv(Instance.DungeonLevel, false, false, 1, Instance.DungeonBonus);
|
|
}
|
|
|
|
if (!Instance.autoProgress || DataHandler.GetPlayerDungeonInfoKind(GetDungeonKind()).ticket <= 1) //자동진행중이 아닐때와 티켓 갯수가 1개 이하일때는 자동진행이 풀림
|
|
{
|
|
GameUIMgr.SCloseMenu();
|
|
GameUIMgr.SOnOffDungeonButton(true);
|
|
}
|
|
|
|
GameUIMgr.SReturnToPreservePreset();
|
|
MissionMgr.SOpenMission();
|
|
}
|
|
#endregion
|
|
|
|
public void PresetSetting()//던전별 프리셋 저장.
|
|
{
|
|
int dgtype = (int)dungeonKind;
|
|
|
|
bool isDirty = false;
|
|
if (dgtype >= DataHandler.PlayDgPreset.dgPetPreset.Length)
|
|
{
|
|
Array.Resize(ref DataHandler.PlayDgPreset.dgPetPreset, (int)DungeonKind.Total);
|
|
isDirty = true;
|
|
}
|
|
|
|
if (dgtype >= DataHandler.PlayDgPreset.dgSkillPreset.Length)
|
|
{
|
|
Array.Resize(ref DataHandler.PlayDgPreset.dgSkillPreset, (int)DungeonKind.Total);
|
|
isDirty = true;
|
|
}
|
|
|
|
if (dgtype >= DataHandler.PlayDgPreset.dgAwakenPreset.Length)
|
|
{
|
|
Array.Resize(ref DataHandler.PlayDgPreset.dgAwakenPreset, (int)DungeonKind.Total);
|
|
isDirty = true;
|
|
}
|
|
|
|
if(isDirty)
|
|
DataHandler.PlayDgPreset.Save();
|
|
|
|
dungeonSkillPreset = DataHandler.PlayDgPreset.dgSkillPreset;
|
|
dungeonPetPreset = DataHandler.PlayDgPreset.dgPetPreset;
|
|
dungeonAwakenPreset = DataHandler.PlayDgPreset.dgAwakenPreset;
|
|
|
|
GameUIMgr.SOpenPopupPreset(dungeonSkillPreset[dgtype], dungeonPetPreset[dgtype], dungeonAwakenPreset[dgtype], DungeonStart);
|
|
}
|
|
|
|
private void DungeonStart()//던전을 시작하면 프리셋이 던전 전용으로 맞춰진다. 그다음 레벨을 세팅하고 던전을 비활성화하고 던전을 시작한다.
|
|
{
|
|
GameUIMgr.SPreservePreset(DataHandler.PlayData.usePreset, DataHandler.PlayData.usePetPreset, DataHandler.PlayAwaken.usePreset);
|
|
|
|
int dgtype = (int)dungeonKind;
|
|
|
|
int skillpreset = GameUIMgr.SGetSkillPreset();
|
|
dungeonSkillPreset[dgtype] = skillpreset;
|
|
if (skillpreset != DataHandler.PlayData.usePreset)
|
|
{
|
|
DataHandler.PlayData.usePreset = skillpreset;
|
|
SkillMgr.SResetPreset();
|
|
}
|
|
|
|
int petpreset = GameUIMgr.SGetPetPreset();
|
|
dungeonPetPreset[dgtype] = petpreset;
|
|
if (petpreset != DataHandler.PlayData.usePetPreset)
|
|
{
|
|
DataHandler.PlayData.usePetPreset = petpreset;
|
|
BattleMgr.SSetPet(petpreset);
|
|
DataHandler.CalcPetEquipExtra(petpreset);
|
|
PetMgr.SResetPreset();
|
|
}
|
|
|
|
int awakenpreset = GameUIMgr.SGetAwakenPreset();
|
|
dungeonAwakenPreset[dgtype] = awakenpreset;
|
|
if (awakenpreset != DataHandler.PlayAwaken.usePreset)
|
|
{
|
|
DataHandler.PlayAwaken.usePreset = awakenpreset;
|
|
EnhanceMgr.StartSetAwakenPreset();
|
|
EnhanceMgr.SResetAwakenPreset();
|
|
}
|
|
|
|
DataHandler.PlayDgPreset.Save();
|
|
BattleMgr.Instance.SetBattleTypeByDungeonKind(dungeonKind);
|
|
BattleMgr.Instance.ClearRewardItemObjects();
|
|
|
|
GameUIMgr.SCloseMenu();
|
|
GameUIMgr.SOnOffDungeonButton(false);
|
|
BattleMgr.Instance.DungeonStart(DungeonLevel);
|
|
if (!autoProgress || canvasUI.isActiveAndEnabled)
|
|
{
|
|
CloseDungeon();
|
|
EnhanceMgr.CloseEnhance();
|
|
GuardianMgr.SGuardianWindowOff();
|
|
}
|
|
|
|
MissionMgr.SCloseMission();
|
|
}
|
|
|
|
public void AutoProgressOnOff() //자동진행 토글
|
|
{
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
|
|
if (autoProgress)
|
|
{
|
|
autoProgressToggle.isOn = false;
|
|
autoProgress = false;
|
|
}
|
|
else
|
|
{
|
|
autoProgressToggle.isOn = true;
|
|
autoProgress = true;
|
|
}
|
|
}
|
|
|
|
public void SetActiveAutoToggle(bool active)//자동진행 버튼의 활성화 여부를 결정한다. 수호령과 각성 던전은 자동진행이 없다.
|
|
{
|
|
if(autoProgressToggle != null)
|
|
autoProgressToggle.gameObject.SetActive(active);
|
|
}
|
|
|
|
//펫은 10 스테이지 단위로 던전이 끊긴다. 그걸 페이징하는 부분.
|
|
#region PetStage
|
|
private void SetPetArea(int area)
|
|
{
|
|
if (area == iSelectArea)
|
|
{
|
|
escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
return;
|
|
}
|
|
|
|
iSelectArea = area;
|
|
escrDungeonSelect.SetType(iSelectArea);
|
|
btnPrevLevel.interactable = iSelectArea > 0;
|
|
btnNextLevel.interactable = iSelectArea < (DataHandler.GetDungeonTypeInfo(dungeonKind).diffs.Length / DataHandler.Const.dungeonPetStageMax) - 1;
|
|
dungeonPetLevel.text = FormatString.StringFormat(LocalizationText.GetText("dungeon_pet_level"), (iSelectArea + 1).ToString());
|
|
}
|
|
|
|
// 이전 지역.
|
|
public void BtnPrevArea()
|
|
{
|
|
if (iLoading > 0 || iSelectArea <= 0)
|
|
return;
|
|
iLoading++;
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
|
|
SetPetArea(iSelectArea - 1);
|
|
selectPetArea--;
|
|
dungeonPetLevel.text = FormatString.StringFormat(LocalizationText.GetText("dungeon_pet_level"), (iSelectArea + 1).ToString());
|
|
|
|
escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
iLoading--;
|
|
}
|
|
|
|
// 다음 지역.
|
|
public void BtnNextArea()
|
|
{
|
|
if (iLoading > 0 || iSelectArea >= (DataHandler.GetDungeonTypeInfo(dungeonKind).diffs.Length / DataHandler.Const.dungeonPetStageMax) - 1)
|
|
return;
|
|
iLoading++;
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
|
|
SetPetArea(iSelectArea + 1);
|
|
selectPetArea++;
|
|
dungeonPetLevel.text = FormatString.StringFormat(LocalizationText.GetText("dungeon_pet_level"), (iSelectArea + 1).ToString());
|
|
|
|
escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
iLoading--;
|
|
}
|
|
#endregion
|
|
|
|
//잠재능력이 해금될때 여기서 해금 통신을 한다.
|
|
#region LockOnOff
|
|
nIdLvInfo dataSlot = null;
|
|
|
|
public void AwakenSlotUnlock()
|
|
{
|
|
dataSlot = new nIdLvInfo();
|
|
|
|
dataSlot.awaken = DataHandler.GetServerAwakenSlots().awaken;
|
|
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.AwakenUp), typeof(nCharAwakenReturn), AAwakenUnlockSucc, AAwakenUnlockFail, DataHandler.GetServerAwakenSlots(), true);
|
|
}
|
|
|
|
//각성 슬롯 통신 실패
|
|
private void AAwakenUnlockFail(SvError error, object request)
|
|
{
|
|
DataHandler.GetServerAwakenSlots().awaken--;
|
|
}
|
|
|
|
// 각성 슬롯 통신 성공.
|
|
private void AAwakenUnlockSucc(object result, object request)
|
|
{
|
|
nCharAwakenReturn data = result as nCharAwakenReturn;
|
|
if (data == null)
|
|
{
|
|
AAwakenUnlockFail(new SvError(eErrorCode.NULL_OR_EMPTY), request);
|
|
return;
|
|
}
|
|
|
|
DataHandler.GetServerAwakenSlots().awaken = data.playAwaken.awaken;
|
|
|
|
EnhanceMgr.RecalculateRerollCost();
|
|
CoverCamera.Release();
|
|
}
|
|
|
|
#endregion
|
|
|
|
//던전 목록 아래쪽의 보상 세팅
|
|
public void SetRewardList()
|
|
{
|
|
for (int i = 0; i < rewardItem.Length; i++)
|
|
{
|
|
rewardItem[i].gameObject.SetActive(false);
|
|
}
|
|
|
|
nReward[] reward = DataHandler.GetDungeonTypeInfo(dungeonKind).diffs[Mathf.Min(DungeonLevel - 1, DataHandler.GetDungeonTypeInfo(dungeonKind).diffs.Length - 1)].rewards;
|
|
|
|
for (int i = 0; i < reward.Length; i++)
|
|
{
|
|
rewardItem[i].gameObject.SetActive(true);
|
|
|
|
rewardItem[i].SetGoods(reward[i].rewardType, reward[i].rewardId, reward[i].rewardCount);
|
|
|
|
if (reward[i].rewardCount <= 0)
|
|
{
|
|
rewardItem[i].gameObject.SetActive(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
int selectDungeonLv = 1;
|
|
int selectPetArea = 0;
|
|
public int GetSelectDgLv() => selectDungeonLv;
|
|
|
|
public void SetSelectDgLv(int level)
|
|
{
|
|
selectDungeonLv = level;
|
|
escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
public int GetSelectPetArea() => selectPetArea;
|
|
|
|
public void SetRewardList(IList<nGoods> rewards)
|
|
{
|
|
for (int i = 0; i < rewardItem.Length; i++)
|
|
{
|
|
if (i < rewards.Count)
|
|
{
|
|
var reward = rewards[i];
|
|
|
|
rewardItem[i].gameObject.SetActive(true);
|
|
rewardItem[i].SetGoods(reward.propertyType, reward.propertyId, rewards[i].propertyCount);
|
|
}
|
|
else
|
|
{
|
|
rewardItem[i].gameObject.SetActive(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
//특정 레벨의 보상 목록. 왼쪽 던전 레벨을 누르면 사용된다.
|
|
public void SetRewardList(int num)
|
|
{
|
|
selectDungeonLv = num;
|
|
|
|
for (int i = 0; i < rewardItem.Length; i++)
|
|
{
|
|
rewardItem[i].gameObject.SetActive(false);
|
|
}
|
|
|
|
nReward[] reward = DataHandler.GetDungeonTypeInfo(Instance.dungeonKind).diffs[num - 1].rewards;
|
|
|
|
for (int i = 0; i < reward.Length; i++)
|
|
{
|
|
rewardItem[i].gameObject.SetActive(true);
|
|
|
|
rewardItem[i].SetGoods(reward[i].rewardType, reward[i].rewardId, reward[i].rewardCount);
|
|
|
|
if (reward[i].rewardCount <= 0)
|
|
{
|
|
rewardItem[i].gameObject.SetActive(false);
|
|
}
|
|
}
|
|
|
|
escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
}
|
|
|
|
public static int GetDungeonBg()
|
|
{
|
|
return DataHandler.GetDungeonTypeInfo(Instance.dungeonKind).bgId;
|
|
}
|
|
|
|
public void OnOffBtnDungeonOut(bool onoff)
|
|
{
|
|
btnDungeonOut.interactable = onoff;
|
|
}
|
|
|
|
public static bool isForceOut { get; set; } = false;
|
|
|
|
public void DungeonOutWindow()//던전 진행 도중 나가기 버튼을 누르면 물어보는 창이 뜬다.
|
|
{
|
|
isForceOut = true;
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
GameUIMgr.SOpenPopup2Button(LocalizationText.GetText("msg_dungeonout"), DungeonForceOut);
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
}
|
|
|
|
//던전 진행 도중에 나갈 때 사용된다.
|
|
public void DungeonForceOut()
|
|
{
|
|
if (BattleMgr.Instance.doNotInterupt)
|
|
{
|
|
GameUIMgr.SOpenToast(LocalizationText.GetText("donot_interupt"));
|
|
return;
|
|
}
|
|
|
|
if (GetDungeonKind() == DungeonKind.GuardianDG)
|
|
GuardianMgr.setActiveRobot(false);
|
|
|
|
isForceOut = false;
|
|
|
|
GameUIMgr.SOpenMenu();
|
|
BattleMgr.Instance.OnGameModDone(GameMod.Result.Quit);
|
|
}
|
|
|
|
//던전 소탕을 할 때 사용되는 부분. 주로 소탕 횟수를 지정하는 버튼 기능(+ - Max Min)이 있다.
|
|
#region Skip
|
|
public void WindowTicketConsume()
|
|
{
|
|
if (SelectedTab < 0)
|
|
return;
|
|
if (iLoading > 0)
|
|
return;
|
|
iLoading++;
|
|
|
|
iSelectedCount = 1;
|
|
|
|
SoundMgr.PlaySfx(SoundName.BtnPress);
|
|
|
|
switch (SelectedTab)
|
|
{
|
|
case (int)DungeonKind.HuntEagle:
|
|
GameUIMgr.SOpenPopupItemUse(new nGoods(cGoods.TDgTicketGold + SelectedTab - 2, 1, DataHandler.GetDungeonTicketCount((DungeonKind)SelectedTab)),
|
|
TicketConsumeSub, TicketConsumeAdd, TicketConsumeMin, TicketConsumeMax, TicketConsume, null,
|
|
FormatString.StringFormat(LocalizationText.GetText("dungeon_skip_level"), DungeonLevel - 1), LocalizationText.GetText("all_use"), LocalizationText.GetText(Global.STR_CANCEL));
|
|
GameUIMgr.SSetPopupItemUseCount(iSelectedCount, iSelectedCount);
|
|
break;
|
|
default:
|
|
GameUIMgr.SOpenPopupItemUse(new nGoods(cGoods.TDgTicketGold + SelectedTab, 1, DataHandler.GetDungeonTicketCount((DungeonKind)SelectedTab)),
|
|
TicketConsumeSub, TicketConsumeAdd, TicketConsumeMin, TicketConsumeMax, TicketConsume, null,
|
|
FormatString.StringFormat(LocalizationText.GetText("dungeon_skip_level"), DungeonLevel - 1), LocalizationText.GetText("all_use"), LocalizationText.GetText(Global.STR_CANCEL));
|
|
GameUIMgr.SSetPopupItemUseCount(iSelectedCount, iSelectedCount);
|
|
break;
|
|
}
|
|
|
|
iLoading--;
|
|
}
|
|
|
|
int iSelectedCount = 0;
|
|
|
|
// 소모품 사용 수 감소.
|
|
private void TicketConsumeSub()
|
|
{
|
|
if (iLoading > 0)
|
|
return;
|
|
iLoading++;
|
|
|
|
if (iSelectedCount <= 1)
|
|
{
|
|
iLoading--;
|
|
return;
|
|
}
|
|
iSelectedCount--;
|
|
GameUIMgr.SSetPopupItemUseCount(iSelectedCount, iSelectedCount);
|
|
|
|
iLoading--;
|
|
}
|
|
|
|
// 소모품 사용 수 증가.
|
|
private void TicketConsumeAdd()
|
|
{
|
|
if (iLoading > 0)
|
|
return;
|
|
iLoading++;
|
|
|
|
int imaxcount = DataHandler.GetDungeonTicketCount((DungeonKind)SelectedTab);
|
|
if (iSelectedCount >= imaxcount)
|
|
{
|
|
iLoading--;
|
|
return;
|
|
}
|
|
iSelectedCount++;
|
|
GameUIMgr.SSetPopupItemUseCount(iSelectedCount, iSelectedCount);
|
|
|
|
iLoading--;
|
|
}
|
|
|
|
// 소모품 사용 수 최소.
|
|
private void TicketConsumeMin()
|
|
{
|
|
if (iLoading > 0)
|
|
return;
|
|
iLoading++;
|
|
|
|
if (iSelectedCount <= 1)
|
|
{
|
|
iLoading--;
|
|
return;
|
|
}
|
|
iSelectedCount = 1;
|
|
GameUIMgr.SSetPopupItemUseCount(iSelectedCount, iSelectedCount);
|
|
|
|
iLoading--;
|
|
}
|
|
|
|
// 소모품 사용 수 최대.
|
|
private void TicketConsumeMax()
|
|
{
|
|
if (iLoading > 0)
|
|
return;
|
|
iLoading++;
|
|
|
|
int imaxcount = DataHandler.GetDungeonTicketCount((DungeonKind)SelectedTab);
|
|
if (iSelectedCount >= imaxcount)
|
|
{
|
|
iLoading--;
|
|
return;
|
|
}
|
|
iSelectedCount = imaxcount;
|
|
GameUIMgr.SSetPopupItemUseCount(iSelectedCount, iSelectedCount);
|
|
|
|
iLoading--;
|
|
}
|
|
|
|
// 소모품 사용하기.
|
|
private void TicketConsume()
|
|
{
|
|
if (iLoading > 0)
|
|
return;
|
|
iLoading++;
|
|
|
|
ADungeonTrySv(Instance.DungeonLevel - 1, true, true, iSelectedCount, Instance.DungeonBonus);
|
|
}
|
|
#endregion
|
|
|
|
nDungeonTryInfo tryData = null;
|
|
|
|
#region Server
|
|
//던전이 성공했는지 실패했는지 혹은 소탕한건지를 저장해서 서버통신을 한다.
|
|
public void ADungeonTrySv(int lv, bool clear, bool isskip,int skipcnt,float ibonus)
|
|
{
|
|
CoverCamera.Hold();
|
|
int idgtype = (int)GetDungeonKind();
|
|
if (isskip == true)//소탕기능을 사용했다면 바로 서버와 통신한다.
|
|
{
|
|
tryData = new nDungeonTryInfo(lv, clear, isskip, skipcnt, dungeonSkillPreset[idgtype], dungeonPetPreset[idgtype], dungeonAwakenPreset[idgtype], ibonus);
|
|
}
|
|
else
|
|
{
|
|
switch (dungeonKind)//소탕기능을 사용하지 않았다면 종류별로 다르게 통신을 시도한다. 여기서는 통신에 사용할 데이터를 할당한다.
|
|
{
|
|
case DungeonKind.DeepCave:
|
|
case DungeonKind.Atlantis:
|
|
case DungeonKind.ProtectTheMerchant:
|
|
case DungeonKind.DevelopTheJungle:
|
|
case DungeonKind.HuntEagle:
|
|
tryData = new nDungeonTryInfo(lv, clear, isskip, skipcnt, dungeonSkillPreset[idgtype], dungeonPetPreset[idgtype], dungeonAwakenPreset[(int)DungeonMgr.GetDungeonKind()], ibonus);
|
|
break;
|
|
case DungeonKind.AwakenDG:
|
|
SetActiveAutoToggle(false);
|
|
tryData = new nDungeonTryInfo(lv, clear, dungeonSkillPreset[idgtype], dungeonPetPreset[idgtype], dungeonAwakenPreset[idgtype]);
|
|
break;
|
|
case DungeonKind.GuardianDG:
|
|
SetActiveAutoToggle(false);
|
|
tryData = new nDungeonTryInfo(lv, GuardianMgr.GetGuardianId(), clear, dungeonSkillPreset[idgtype], dungeonPetPreset[idgtype], dungeonAwakenPreset[idgtype]);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
switch (dungeonKind)//할당한 데이터를 통해 여기서 서버 통신을 시도한다.
|
|
{
|
|
case DungeonKind.DeepCave:
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.DungeonGold), typeof(nDungeonResultReturn), ADungeonTrySucc, ADungeonTryFail, tryData, true);
|
|
break;
|
|
case DungeonKind.Atlantis:
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.DungeonReinStone), typeof(nDungeonResultReturn), ADungeonTrySucc, ADungeonTryFail, tryData, true);
|
|
break;
|
|
case DungeonKind.ProtectTheMerchant:
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.DungeonPet), typeof(nDungeonResultReturn), ADungeonTrySucc, ADungeonTryFail, tryData, true);
|
|
break;
|
|
case DungeonKind.DevelopTheJungle:
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.DungeonAwakenStone), typeof(nDungeonResultReturn), ADungeonTrySucc, ADungeonTryFail, tryData, true);
|
|
break;
|
|
case DungeonKind.AwakenDG:
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.DungeonAwaken), typeof(nDungeonResultReturn), ADungeonTrySucc, ADungeonTryFail, tryData, true);
|
|
break;
|
|
case DungeonKind.GuardianDG:
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.DungeonGuardian), typeof(nDungeonResultReturn), AGuardianDungeonTrySucc, AGuardianDungeonTryFail, tryData, true);
|
|
break;
|
|
case DungeonKind.HuntEagle:
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.DungeonRelic), typeof(nDungeonResultReturn), ADungeonTrySucc, ADungeonTryFail, tryData, true);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
// 던전 성패 통신 성공.
|
|
private void ADungeonTrySucc(object result, object request)
|
|
{
|
|
nDungeonResultReturn data = result as nDungeonResultReturn;
|
|
if (data == null)
|
|
{
|
|
ADungeonTryFail(new SvError(eErrorCode.NULL_OR_EMPTY), request);
|
|
return;
|
|
}
|
|
|
|
GuardianMgr.setActiveRobot(false);
|
|
|
|
if (tryData.clear)
|
|
{
|
|
if (!tryData.isSkip)//소탕하지 않았을때
|
|
{
|
|
switch (dungeonKind)
|
|
{
|
|
case DungeonKind.DeepCave:
|
|
BattleMgr.GetClearDungeonReward(DataHandler.GetDungeonTypeInfo(DungeonKind.DeepCave).diffs[Instance.DungeonLevel - 1].rewards);
|
|
DataHandler.PlayDgGold = data.playDgGold;
|
|
SetRewardList();
|
|
DungeonLevel++;
|
|
Instance.escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
break;
|
|
case DungeonKind.Atlantis:
|
|
BattleMgr.GetClearDungeonReward(DataHandler.GetDungeonTypeInfo(DungeonKind.Atlantis).diffs[Instance.DungeonLevel - 1].rewards);
|
|
DataHandler.SetEnhanceStone(data.playCurrency.gearReinStone);
|
|
DataHandler.PlayDgReinStone = data.playDgReinStone;
|
|
SetRewardList();
|
|
DungeonLevel++;
|
|
Instance.escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
break;
|
|
case DungeonKind.ProtectTheMerchant:
|
|
BattleMgr.GetClearDungeonReward(DataHandler.GetDungeonTypeInfo(DungeonKind.ProtectTheMerchant).diffs[Instance.DungeonLevel - 1].rewards);
|
|
DataHandler.SetPudding(data.playCurrency.pudding);
|
|
DataHandler.PlayDgPet = data.playDgPet;
|
|
SetRewardList();
|
|
DungeonLevel++;
|
|
Instance.escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
break;
|
|
case DungeonKind.DevelopTheJungle:
|
|
BattleMgr.GetClearDungeonReward(DataHandler.GetDungeonTypeInfo(DungeonKind.DevelopTheJungle).diffs[Instance.DungeonLevel - 1].rewards);
|
|
DataHandler.SetAwakenStone(data.playCurrency.gearAwakenStone);
|
|
DataHandler.PlayDgAwakenStone = data.playDgAwakenStone;
|
|
SetRewardList();
|
|
DungeonLevel++;
|
|
Instance.escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
break;
|
|
case DungeonKind.AwakenDG:
|
|
BattleMgr.AwakenSuccessWindowEnable();
|
|
DataHandler.PlayAwaken = data.playAwaken;
|
|
DataHandler.PlayDgAwaken = data.playDgAwaken;
|
|
SetActiveAutoToggle(true);
|
|
if (Instance.DungeonLevel <= 6)
|
|
DataHandler.AwakenSlotUnlock(Instance.DungeonLevel);
|
|
EnhanceMgr.RecalculateRerollCost();
|
|
BuffMgr.Instance.ChangeAwakenDungeonStat(GetDungeonLevel());
|
|
EnhanceMgr.SCalcMyInfoStat();
|
|
break;
|
|
case DungeonKind.HuntEagle:
|
|
BattleMgr.GetClearDungeonReward(DataHandler.GetDungeonTypeInfo(DungeonKind.HuntEagle).diffs[Instance.DungeonLevel - 1].rewards);
|
|
DataHandler.SetGoods(data.playCurrency, false);
|
|
DataHandler.PlayDgRelic = data.playDgRelic;
|
|
SetRewardList();
|
|
DungeonLevel++;
|
|
Instance.escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (autoProgress && IsDungeonProgressOK(0) && dungeonKind != DungeonKind.AwakenDG)
|
|
{
|
|
DungeonStart();
|
|
}
|
|
else
|
|
{
|
|
BattleMgr.Instance.ChangeBattleTypeNormal();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int noreward = 0;
|
|
int norewardfront = 0;
|
|
for (int i = 0; i < DataHandler.GetDungeonTypeInfo(dungeonKind).diffs[Instance.DungeonLevel - 2].rewards.Length; i++)
|
|
{
|
|
if (DataHandler.GetDungeonTypeInfo(dungeonKind).diffs[Instance.DungeonLevel - 2].rewards[i].rewardCount == 0)
|
|
{
|
|
noreward++;
|
|
}
|
|
}
|
|
|
|
nGoods[] reward = new nGoods[DataHandler.GetDungeonTypeInfo(dungeonKind).diffs[Instance.DungeonLevel - 2].rewards.Length - noreward];
|
|
|
|
for (int i = 0; i < DataHandler.GetDungeonTypeInfo(dungeonKind).diffs[Instance.DungeonLevel - 2].rewards.Length; i++)
|
|
{
|
|
if (DataHandler.GetDungeonTypeInfo(dungeonKind).diffs[Instance.DungeonLevel - 2].rewards[i].rewardCount != 0)
|
|
{
|
|
nReward rewarditem = DataHandler.GetDungeonTypeInfo(dungeonKind).diffs[Instance.DungeonLevel - 2].rewards[i];
|
|
//rewarditem.rewardCount *= iSelectedCount;
|
|
reward[i - norewardfront] = new nGoods(rewarditem);
|
|
}
|
|
else
|
|
{
|
|
norewardfront++;
|
|
}
|
|
}
|
|
|
|
switch (dungeonKind)
|
|
{
|
|
case DungeonKind.DeepCave:
|
|
BattleMgr.GetClearDungeonSkipReward(DataHandler.GetDungeonTypeInfo(DungeonKind.DeepCave).diffs[Instance.DungeonLevel - 2].rewards, iSelectedCount, tryData.bonus);
|
|
DataHandler.PlayDgGold = data.playDgGold;
|
|
reward[0].propertyCount = reward[0].propertyCount * (int)((tryData.bonus + 1.0f) * dConst.RateMaxFloat) / dConst.RateMaxBi * iSelectedCount;
|
|
GameUIMgr.SOpenPopupGoods(reward);
|
|
Instance.escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
break;
|
|
case DungeonKind.Atlantis:
|
|
BattleMgr.GetClearDungeonSkipReward(DataHandler.GetDungeonTypeInfo(DungeonKind.Atlantis).diffs[Instance.DungeonLevel - 2].rewards, iSelectedCount);
|
|
DataHandler.SetEnhanceStone(data.playCurrency.gearReinStone);
|
|
DataHandler.PlayDgReinStone = data.playDgReinStone;
|
|
reward[0].propertyCount = reward[0].propertyCount * (int)((tryData.bonus + 1.0f) * dConst.RateMaxFloat) / dConst.RateMaxBi * iSelectedCount;
|
|
GameUIMgr.SOpenPopupGoods(reward);
|
|
Instance.escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
break;
|
|
case DungeonKind.ProtectTheMerchant:
|
|
BattleMgr.GetClearDungeonSkipReward(DataHandler.GetDungeonTypeInfo(DungeonKind.ProtectTheMerchant).diffs[Instance.DungeonLevel - 2].rewards, iSelectedCount);
|
|
DataHandler.SetPudding(data.playCurrency.pudding);
|
|
DataHandler.PlayDgPet = data.playDgPet;
|
|
reward[0].propertyCount = reward[0].propertyCount * (int)((tryData.bonus + 1.0f) * dConst.RateMaxFloat) / dConst.RateMaxBi * iSelectedCount;
|
|
GameUIMgr.SOpenPopupGoods(reward);
|
|
Instance.escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
break;
|
|
case DungeonKind.DevelopTheJungle:
|
|
BattleMgr.GetClearDungeonSkipReward(DataHandler.GetDungeonTypeInfo(DungeonKind.DevelopTheJungle).diffs[Instance.DungeonLevel - 2].rewards, iSelectedCount);
|
|
DataHandler.SetAwakenStone(data.playCurrency.gearAwakenStone);
|
|
DataHandler.PlayDgAwakenStone = data.playDgAwakenStone;
|
|
reward[0].propertyCount = reward[0].propertyCount * (int)((tryData.bonus + 1.0f) * dConst.RateMaxFloat) / dConst.RateMaxBi * iSelectedCount;
|
|
GameUIMgr.SOpenPopupGoods(reward);
|
|
Instance.escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
break;
|
|
case DungeonKind.HuntEagle:
|
|
BattleMgr.GetClearDungeonSkipReward(DataHandler.GetDungeonTypeInfo(DungeonKind.HuntEagle).diffs[Instance.DungeonLevel - 2].rewards, iSelectedCount, tryData.bonus);
|
|
DataHandler.PlayDgRelic = data.playDgRelic;
|
|
reward[0].propertyCount = reward[0].propertyCount * (int)((tryData.bonus + 1.0f) * dConst.RateMaxFloat) / dConst.RateMaxBi * iSelectedCount;
|
|
GameUIMgr.SOpenPopupGoods(reward);
|
|
Instance.escrDungeonSelect.scroller.RefreshActiveCellViews();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
autoProgress = false;
|
|
|
|
btnDungeonSkip.interactable = (DataHandler.GetDungeonTicketCount(dungeonKind) > 0 && DungeonLevel > 1);
|
|
|
|
BattleMgr.Instance.ChangeBattleTypeNormal();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (dungeonKind)
|
|
{
|
|
case DungeonKind.DeepCave:
|
|
DataHandler.PlayDgGold = data.playDgGold;
|
|
break;
|
|
case DungeonKind.Atlantis:
|
|
DataHandler.PlayDgReinStone = data.playDgReinStone;
|
|
break;
|
|
case DungeonKind.ProtectTheMerchant:
|
|
DataHandler.PlayDgPet = data.playDgPet;
|
|
break;
|
|
case DungeonKind.DevelopTheJungle:
|
|
DataHandler.PlayDgAwakenStone = data.playDgAwakenStone;
|
|
break;
|
|
case DungeonKind.AwakenDG:
|
|
DataHandler.PlayDgAwaken = data.playDgAwaken;
|
|
break;
|
|
case DungeonKind.GuardianDG:
|
|
DataHandler.PlayDgGuardian[1] = data.playDgGuardian;
|
|
break;
|
|
case DungeonKind.HuntEagle:
|
|
DataHandler.PlayDgRelic = data.playDgRelic;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
MissionMgr.SRefreshMission();
|
|
GameUIMgr.SSetGoods();
|
|
BattleMgr.Instance.ResetSkillCooltime();
|
|
tryData = null;
|
|
|
|
CoverCamera.Release();
|
|
iLoading--;
|
|
}
|
|
|
|
private void ADungeonTryFail(SvError error, object request)
|
|
{
|
|
BattleMgr.Instance.ChangeBattleTypeNormal();
|
|
CoverCamera.Release();
|
|
iLoading--;
|
|
}
|
|
|
|
public static bool IsDungeonProgressOK(int isNotSV)
|
|
{
|
|
if (Instance.DungeonLevel + isNotSV > DataHandler.GetDungeonTypeInfo(Instance.dungeonKind).diffs.Length)
|
|
{
|
|
return false;
|
|
}
|
|
if (DataHandler.GetDungeonTicketCount(Instance.dungeonKind) - isNotSV <= 0)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
#endregion
|
|
|
|
//구 수호령 던전 서버 통신. 역할은 서버와 동일.
|
|
#region Guardian
|
|
public void ADungeonGuardianTrySv(int lv, bool clear, bool isskip, int skipcnt, float ibonus)
|
|
{
|
|
CoverCamera.Hold();
|
|
int idgtype = (int)GetDungeonKind();
|
|
|
|
tryData = new nDungeonTryInfo(lv, clear, dungeonSkillPreset[idgtype], dungeonPetPreset[idgtype], dungeonAwakenPreset[idgtype]);
|
|
|
|
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.DungeonGuardian), typeof(nDungeonResultReturn), AGuardianDungeonTrySucc, AGuardianDungeonTryFail, tryData, true);
|
|
|
|
}
|
|
|
|
private void AGuardianDungeonTryFail(SvError error, object request)
|
|
{
|
|
BattleMgr.Instance.ChangeBattleTypeNormal();
|
|
CoverCamera.Release();
|
|
tryData = null;
|
|
|
|
iLoading--;
|
|
}
|
|
|
|
// 던전 성패 통신 성공.
|
|
private void AGuardianDungeonTrySucc(object result, object request)
|
|
{
|
|
nDungeonResultReturn data = result as nDungeonResultReturn;
|
|
if (data == null)
|
|
{
|
|
ADungeonTryFail(new SvError(eErrorCode.NULL_OR_EMPTY), request);
|
|
return;
|
|
}
|
|
|
|
if (tryData.clear)
|
|
{
|
|
switch (dungeonKind)
|
|
{
|
|
case DungeonKind.GuardianDG:
|
|
DataHandler.PlayDgGuardian[GuardianMgr.GetGuardianId()] = data.playDgGuardian;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
BattleMgr.Instance.ChangeBattleTypeNormal();
|
|
}
|
|
else
|
|
{
|
|
switch (dungeonKind)
|
|
{
|
|
case DungeonKind.DeepCave:
|
|
DataHandler.PlayDgGold = data.playDgGold;
|
|
break;
|
|
case DungeonKind.Atlantis:
|
|
DataHandler.PlayDgReinStone = data.playDgReinStone;
|
|
break;
|
|
case DungeonKind.ProtectTheMerchant:
|
|
DataHandler.PlayDgPet = data.playDgPet;
|
|
break;
|
|
case DungeonKind.DevelopTheJungle:
|
|
DataHandler.PlayDgAwakenStone = data.playDgAwakenStone;
|
|
break;
|
|
case DungeonKind.AwakenDG:
|
|
DataHandler.PlayDgAwaken = data.playDgAwaken;
|
|
break;
|
|
case DungeonKind.GuardianDG:
|
|
DataHandler.PlayDgGuardian[GuardianMgr.GetGuardianId()] = data.playDgGuardian;
|
|
break;
|
|
case DungeonKind.HuntEagle:
|
|
DataHandler.PlayDgRelic = data.playDgRelic;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
MissionMgr.SRefreshMission();
|
|
GameUIMgr.SSetGoods();
|
|
|
|
DataHandler.SetPlayGuardian(data.playGuardian.guardianType, data.playGuardian);
|
|
|
|
GuardianMgr.SCalcGuardian();
|
|
BattleMgr.SSetGuardian();
|
|
GuardianMgr.setActiveRobot(false);
|
|
tryData = null;
|
|
|
|
CoverCamera.Release();
|
|
iLoading--;
|
|
}
|
|
#endregion
|
|
}
|