212 lines
6.9 KiB
C#
212 lines
6.9 KiB
C#
using CodeStage.AntiCheat.ObscuredTypes;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
|
|
public class SelectCardUI : MonoBehaviourSingletonTemplate<SelectCardUI>
|
|
{
|
|
public BattleCard[] battleCards;
|
|
public DeckUI_Skills m_DeckUI_Skills;
|
|
public GameObject[] gos_btn; // 0 광고, 1 횟수
|
|
public TextMeshProUGUI[] texts; // 0 남은 횟수
|
|
|
|
bool showDeck = false, m_Reselect;
|
|
CardSkillData G1_LevelUpSkillReroll;
|
|
List<ObscuredBool> list_reservation = new List<ObscuredBool>();
|
|
|
|
private void Update()
|
|
{
|
|
if (list_reservation.Count > 0 && !go_child.activeSelf)
|
|
StartCoroutine(Co_Set());
|
|
}
|
|
|
|
public void Set(bool islvup)
|
|
{
|
|
if (IsActive() || MyValue.m_MyStageData.m_EnterType == eStageEnterType.Tool_Mob) return;
|
|
Add_Reservation(islvup);
|
|
m_DeckUI_Skills.Set(InGameInfo.Ins.Get_ListGainCard());
|
|
}
|
|
public void Add_Reservation(bool islvup)
|
|
{
|
|
list_reservation.Add(islvup);
|
|
list_reservation[list_reservation.Count - 1].RandomizeCryptoKey();
|
|
}
|
|
|
|
IEnumerator Co_Set()
|
|
{
|
|
InGameInfo.Ins.Set_Battle(false);
|
|
|
|
var pc = InGameInfo.Ins.m_PCActor;
|
|
var G1_CastReaperOnLevelUp = pc.Get_CardSkillData_orNull(eCardType.G1_CastReaperOnLevelUp);
|
|
if (G1_CastReaperOnLevelUp != null)
|
|
{
|
|
var target = InGameInfo.Ins.Get_RandomEnemy_orNull(eRole.PC);
|
|
if (target != null)
|
|
{
|
|
pc.Shoot_AddProjectiles(G1_CastReaperOnLevelUp, target);
|
|
yield return new WaitForSeconds(4f);
|
|
}
|
|
}
|
|
|
|
On();
|
|
Set_UI();
|
|
Set_Cards();
|
|
}
|
|
|
|
int GetRandomGradeByWeight()
|
|
{
|
|
int[] weights =
|
|
{
|
|
table_GlobalValue.Ins.Get_Int("CardGrade_Weight_1"),
|
|
table_GlobalValue.Ins.Get_Int("CardGrade_Weight_2"),
|
|
table_GlobalValue.Ins.Get_Int("CardGrade_Weight_3"),
|
|
table_GlobalValue.Ins.Get_Int("CardGrade_Weight_4"),
|
|
table_GlobalValue.Ins.Get_Int("CardGrade_Weight_5"),
|
|
};
|
|
|
|
var pcstat = InGameInfo.Ins.m_PCActor.Get_ActorStatInfo();
|
|
weights[1] += (int)pcstat.Get_TotalStat(eStat.SkillDropRateAdvanced);
|
|
weights[2] += (int)pcstat.Get_TotalStat(eStat.SkillDropRateRare);
|
|
weights[3] += (int)pcstat.Get_TotalStat(eStat.SkillDropRateHero);
|
|
weights[4] += (int)pcstat.Get_TotalStat(eStat.SkillDropRateLegendary);
|
|
|
|
int total = weights.Sum();
|
|
int rand = Random.Range(0, total);
|
|
|
|
int acc = 0;
|
|
for (int i = 0; i < weights.Length; i++)
|
|
{
|
|
acc += weights[i];
|
|
if (rand < acc)
|
|
return i + 1;
|
|
}
|
|
|
|
return 1; // fallback
|
|
}
|
|
|
|
void Set_Init()
|
|
{
|
|
Set_UI();
|
|
Set_Cards();
|
|
}
|
|
|
|
void Set_UI()
|
|
{
|
|
var remainCount = 0;
|
|
G1_LevelUpSkillReroll = InGameInfo.Ins.m_PCActor.Get_CardSkillData_orNull(eCardType.G1_LevelUpSkillReroll);
|
|
if (G1_LevelUpSkillReroll != null)
|
|
remainCount = G1_LevelUpSkillReroll.m_Data.Get_IntValue1() - G1_LevelUpSkillReroll.UseCount_Acc;
|
|
DSUtil.InActivateGameObjects(gos_btn, remainCount > 0 ? 1 : 0);
|
|
texts[0].text = remainCount.ToString();
|
|
}
|
|
|
|
public void Set_Cards(bool reselect = false)
|
|
{
|
|
m_Reselect = reselect;
|
|
|
|
List<CardListTableData> lst = table_cardlist.Ins.Get_DataList((eGrade)GetRandomGradeByWeight());
|
|
lst = table_cardlist.Ins.Get_DataList(1101, 1112); // 테스트
|
|
//lst = table_cardlist.Ins.Get_DataList(1079, 1092, 1093, 1080, 1081, 1082); // 테스트
|
|
|
|
var G1_NextLevelGainHeroOrLegendSkill = InGameInfo.Ins.m_PCActor.Get_CardSkillData_orNull(eCardType.G1_NextLevelGainHeroOrLegendSkill);
|
|
if (G1_NextLevelGainHeroOrLegendSkill != null)
|
|
{
|
|
G1_NextLevelGainHeroOrLegendSkill.Add_UseCountACC(1, () =>
|
|
{
|
|
lst = table_cardlist.Ins.Get_DataList((eGrade)Random.Range(4, 6));
|
|
}, int.MinValue);
|
|
}
|
|
|
|
// list_obtaincard에 없는 카드만 후보로 필터링
|
|
var available = lst.FindAll(card => !InGameInfo.Ins.Get_ListGainCard().Contains(card));
|
|
|
|
List<CardListTableData> selected = new List<CardListTableData>();
|
|
|
|
// 후보가 부족하면 전부 사용
|
|
if (available.Count < battleCards.Length)
|
|
available = lst; // fallback (모두 가능하게)
|
|
|
|
while (selected.Count < battleCards.Length)
|
|
{
|
|
var item = available[Random.Range(0, available.Count)];
|
|
if (!selected.Contains(item))
|
|
selected.Add(item);
|
|
}
|
|
|
|
for (int i = 0; i < selected.Count; i++)
|
|
battleCards[i].Set(selected[i]);
|
|
}
|
|
|
|
public void OnClick_Deck()
|
|
{
|
|
if (!showDeck)
|
|
{
|
|
showDeck = true;
|
|
GetComponent<Animation>().Play("SkillSelectDeck");
|
|
}
|
|
else
|
|
{
|
|
showDeck = false;
|
|
GetComponent<Animation>().Play("SkillSelectDeck_Init");
|
|
}
|
|
}
|
|
|
|
public void OnClick_ReRoll(int index)
|
|
{
|
|
switch (index)
|
|
{
|
|
case 0: // 광고
|
|
ADInfo.Ins.Show_AD(Set_Init);
|
|
break;
|
|
case 1: // 카운트
|
|
if (G1_LevelUpSkillReroll.UseCount_Acc < G1_LevelUpSkillReroll.m_Data.Get_IntValue1())
|
|
{
|
|
++G1_LevelUpSkillReroll.UseCount_Acc;
|
|
Set_Init();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 레벨업으로 인한 카드 획득인 지 여부, 예약이 없다면 카드 선택으로 인한 카드 획득 여부이므로 false
|
|
/// </summary>
|
|
public bool isLvUp() { return list_reservation.Count > 0 ? list_reservation[0] : false; }
|
|
|
|
public void Off_or_NextCheck()
|
|
{
|
|
m_DeckUI_Skills.Set(InGameInfo.Ins.Get_ListGainCard());
|
|
bool lastReservaionisLvUp = isLvUp();
|
|
if (list_reservation.Count > 0) list_reservation.RemoveAt(0);
|
|
|
|
if (m_Reselect)
|
|
{
|
|
m_Reselect = false;
|
|
return;
|
|
}
|
|
|
|
Off();
|
|
Set_UI();
|
|
|
|
var G1_NextLevelChooseTwoSkillCards = InGameInfo.Ins.m_PCActor.Get_CardSkillData_orNull(eCardType.G1_NextLevelChooseTwoSkillCards);
|
|
if (G1_NextLevelChooseTwoSkillCards != null)
|
|
{
|
|
bool runcard = false;
|
|
G1_NextLevelChooseTwoSkillCards.Add_UseCountACC(1, () =>
|
|
{ // 다음 레벨업에 선택이므로 테이블의 s_Value1에 2라고 세팅되어 있어야 함
|
|
runcard = true;
|
|
On();
|
|
DSUtil.InActivateGameObjects(gos_btn);
|
|
}, int.MinValue);
|
|
|
|
if (runcard) return;
|
|
}
|
|
|
|
if (lastReservaionisLvUp && (InGameInfo.Ins.PCLv - 1 > InGameInfo.Ins.m_lvupcardcount)) // 한 번 더 선택
|
|
Add_Reservation(true);
|
|
else
|
|
InGameInfo.Ins.Set_Battle(true); // 마지막 몹이 죽었을 경우는?
|
|
}
|
|
} |