OneShotOneKill/Assets/Script/UGUI/Ingame/SelectCardUI.cs

212 lines
6.9 KiB
C#
Raw Normal View History

2026-01-07 21:27:42 +00:00
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); // 마지막 몹이 죽었을 경우는?
}
}