using CodeStage.AntiCheat.ObscuredTypes; using System.Collections; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; public class SelectCardUI : MonoBehaviourSingletonTemplate { 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 list_reservation = new List(); 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 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 selected = new List(); // 후보가 부족하면 전부 사용 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().Play("SkillSelectDeck"); } else { showDeck = false; GetComponent().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; } } /// /// 레벨업으로 인한 카드 획득인 지 여부, 예약이 없다면 카드 선택으로 인한 카드 획득 여부이므로 false /// 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); // 마지막 몹이 죽었을 경우는? } }