레벨업의 진행 과정을 다음과 같이 수정하였다.
public async Task<bool> LevelUpWithPiecesOnly()
{
if (CurrentUpgradeData.UpgradeLevel >= 10) return false;
if (CurrentUpgradeData.UpgradeLevel <= 0)
{
if (CurrentUpgradeData.CurrentPieces >= 10)
{
CurrentUpgradeData.CurrentPieces -= 10;
CurrentUpgradeData.UpgradeLevel += 1;
return true;
}
else
{
if(PopupManager.Instance != null)
{
PopupManager.instance.ShowPopup("조각이 부족합니다.");
}
return false;
}
}
else if (CurrentUpgradeData.UpgradeLevel >= 1)
{
int requiredPiece = GetRequiredPiece();
int requiredGold = GetRequiredGold();
// 골드, 조각 체크
string uid = FirebaseManager.Auth.CurrentUser.UserId;
var goldRef = FirebaseManager.DataReference.Child("UserData").Child(uid).Child("Gold");
DataSnapshot snapshot = await goldRef.GetValueAsync();
int currentGold = snapshot.Exists ? Convert.ToInt32(snapshot.Value) : 0;
if (CurrentUpgradeData.CurrentPieces >= requiredPiece && currentGold >= requiredGold)
{
CurrentUpgradeData.CurrentPieces -= requiredPiece;
CurrentUpgradeData.UpgradeLevel += 1;
await DBManager.Instance.SubtractGoldAsync(requiredGold);
OnLevelUp?.Invoke();
return true;
}
}
return false;
}
public async Task<bool> CanLevelUpWithMythStone()
{
if (CurrentUpgradeData.UpgradeLevel >= 10) return false;
int requiredPiece = GetRequiredPiece();
int requiredGold = GetRequiredGold();
string uid = FirebaseManager.Auth.CurrentUser.UserId;
var goldRef = FirebaseManager.DataReference.Child("UserData").Child(uid).Child("Gold");
var mythStoneRef = FirebaseManager.DataReference.Child("UserData").Child(uid).Child("MythStone");
DataSnapshot goldSnap = await goldRef.GetValueAsync();
DataSnapshot mythSnap = await mythStoneRef.GetValueAsync();
int currentGold = goldSnap.Exists ? Convert.ToInt32(goldSnap.Value) : 0;
int currentMythStone = mythSnap.Exists ? Convert.ToInt32(mythSnap.Value) : 0;
int ratio = MythStonePieceRatio(_grade);
int conversedMythstone = currentMythStone / ratio;
return (CurrentUpgradeData.CurrentPieces + conversedMythstone >= requiredPiece
&& currentGold >= requiredGold);
}
public async Task LevelUpWithMythStone()
{
int requiredPiece = GetRequiredPiece();
int requiredGold = GetRequiredGold();
int ratio = MythStonePieceRatio(_grade);
int neededFromMythStone = requiredPiece - CurrentUpgradeData.CurrentPieces;
if (neededFromMythStone > 0)
await DBManager.Instance.SubtractMythStoneAsync(neededFromMythStone * ratio);
CurrentUpgradeData.CurrentPieces = 0;
CurrentUpgradeData.UpgradeLevel += 1;
await DBManager.Instance.SubtractGoldAsync(requiredGold);
OnLevelUp?.Invoke();
}
private int MythStonePieceRatio(Grade grade)
{
int pieceRatio = 0;
switch (grade)
{
case Grade.NORMAL: pieceRatio = 2; break;
case Grade.RARE: pieceRatio = 4; break;
case Grade.UNIQUE: pieceRatio = 6; break;
case Grade.LEGEND: pieceRatio = 9; break;
}
return pieceRatio;
}
private async void LevelUp()
{
if (_currentCharUnit.Status.Data.UpgradeData.CurrentUpgradeData.UpgradeLevel >= 10)
{
if (PopupManager.Instance != null)
{
PopupManager.instance.ShowPopup("이미 최대 레벨입니다.");
return;
}
}
bool success = await _currentCharUnit.Status.Data.UpgradeData.LevelUpWithPiecesOnly();
if (!success && _currentCharUnit.Status.Data.UpgradeData.CurrentUpgradeData.UpgradeLevel >= 1)
{
bool canUseMyth = await _currentCharUnit.Status.Data.UpgradeData.CanLevelUpWithMythStone();
if (!canUseMyth)
{
if (PopupManager.Instance != null)
{
PopupManager.instance.ShowPopup("조각이 부족합니다.");
return;
}
}
if (PopupManager.Instance != null)
{
PopupManager.instance.ShowConfirmationPopup(
"조각이 부족합니다. 신화석을 사용해서 레벨업 하시겠습니까?",
async () =>
{
await _currentCharUnit.Status.Data.UpgradeData.LevelUpWithMythStone();
await DBManager.Instance.charDB.SaveCharacterUpgradeData(_currentCharUnit.Status.Data);
OnCharacterStatusChanged?.Invoke();
},
() =>
{
PopupManager.instance.ShowPopup("레벨업이 취소되었습니다.");
}
);
}
}
else
{
await DBManager.Instance.charDB.SaveCharacterUpgradeData(_currentCharUnit.Status.Data);
OnCharacterStatusChanged?.Invoke();
}
}