Shegotwet/Assets/Scripts/Game/Game_Mini.cs

422 lines
16 KiB
C#

using GUPS.AntiCheat.Protected;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;
public enum eAnim { None, Idle, RunLeft, RunRight, Hit }
public class Game_Mini : MonoBehaviour
{
public Game_Mini_Result m_Game_Mini_Result;
public TextMeshProUGUI[] texts_money; // 0 하트, 1 챗코인, 2 가챠 코인, 3 폭탄, 4 우산, 5 딜도
public Image i_girl, i_girlsd_idle, i_girlsd_run1, i_girlsd_run2, i_girlsd_hit;
public MiniGameItemCard[] items;
public Slider slider_hp;
public Transform tf_obtacleParent;
public GameObject go_Obtacle, go_Shield;
public GameObject[] gos_hiteffect;
public GameObject[] go_anim; // 0 idle, 1 run, 2 hit
public RectTransform tf_pc, tf_objend;
public Joystick m_Joystick;
eAnim CurAnim;
#if UNITY_EDITOR
[Header("Test")]
public bool NoDamage;
#endif
// 1 평소, 2 맞았을 때
AsyncOperationHandle<Sprite> m_Handle1, m_Handle2, m_HandleSD, m_HandleSDWalk, m_HandleSDHit;
ProtectedInt32 m_HP;
bool bStartGame;
float PcPosLimit, PlayTime;
Dictionary<eMiniGameObtacleType, ProtectedInt32> dic_Money = new Dictionary<eMiniGameObtacleType, ProtectedInt32>();
Dictionary<eMiniGameObtacleType, TextMeshProUGUI> dic_MoneyText = new Dictionary<eMiniGameObtacleType, TextMeshProUGUI>();
Dictionary<eMiniGameObtacleType, int> dic_weight = new Dictionary<eMiniGameObtacleType, int>();
List<MiniGameObtacle> list_MiniGameObtacle = new List<MiniGameObtacle>();
private void Awake()
{
// 부모 RectTransform 크기 가져오기
RectTransform parentRt = tf_pc.parent as RectTransform;
// 부모의 절반 너비에서 캐릭터 크기/여백 빼서 제한
float halfWidth = parentRt.rect.width * 0.5f;
PcPosLimit = halfWidth - (tf_pc.rect.width * 0.5f) + 125f; // 70px 여백
}
void Init()
{
ADInfo.Ins.Set_Banner(false);
if (dic_weight.Count == 0)
{
dic_weight.Add(eMiniGameObtacleType.White, table_GlobalValue.Ins.Get_Int("MiniGameWeight_White"));
dic_weight.Add(eMiniGameObtacleType.Red, table_GlobalValue.Ins.Get_Int("MiniGameWeight_Red"));
dic_weight.Add(eMiniGameObtacleType.HpHeal, table_GlobalValue.Ins.Get_Int("MiniGameWeight_HpHeal"));
dic_weight.Add(eMiniGameObtacleType.AlbumOpen, table_GlobalValue.Ins.Get_Int("MiniGameWeight_AlbumOpen"));
dic_weight.Add(eMiniGameObtacleType.ChatCoin, table_GlobalValue.Ins.Get_Int("MiniGameWeight_ChatCoin"));
dic_weight.Add(eMiniGameObtacleType.GachaCoin, table_GlobalValue.Ins.Get_Int("MiniGameWeight_GachaCoin"));
dic_weight.Add(eMiniGameObtacleType.ItemBomb, table_GlobalValue.Ins.Get_Int("MiniGameWeight_ItemBomb"));
dic_weight.Add(eMiniGameObtacleType.ItemUmbrella, table_GlobalValue.Ins.Get_Int("MiniGameWeight_ItemUmbrella"));
dic_weight.Add(eMiniGameObtacleType.ItemDildo, table_GlobalValue.Ins.Get_Int("MiniGameWeight_ItemDildo"));
}
if (dic_Money.Count == 0)
{
for (eMiniGameObtacleType i = eMiniGameObtacleType.AlbumOpen; i <= eMiniGameObtacleType.ItemDildo; i++)
dic_Money.Add(i, 0);
}
if (dic_MoneyText.Count == 0)
{
dic_MoneyText.Add(eMiniGameObtacleType.AlbumOpen, texts_money[0]);
dic_MoneyText.Add(eMiniGameObtacleType.ChatCoin, texts_money[1]);
dic_MoneyText.Add(eMiniGameObtacleType.GachaCoin, texts_money[2]);
dic_MoneyText.Add(eMiniGameObtacleType.ItemBomb, texts_money[3]);
dic_MoneyText.Add(eMiniGameObtacleType.ItemUmbrella, texts_money[4]);
dic_MoneyText.Add(eMiniGameObtacleType.ItemDildo, texts_money[5]);
}
for (int i = 0; i < dic_Money.Keys.ToList().Count; i++)
{
var key = dic_Money.Keys.ToList()[i];
switch (key)
{
default:
dic_Money[key] = 0;
break;
//case eMiniGameObtacleType.ItemBomb:
// dic_Money[key] = SaveMgr.Ins.Get_Money(eMoney.ItemBomb);
// break;
//case eMiniGameObtacleType.ItemUmbrella:
// dic_Money[key] = SaveMgr.Ins.Get_Money(eMoney.ItemUmbrella);
// break;
//case eMiniGameObtacleType.ItemDildo:
// dic_Money[key] = SaveMgr.Ins.Get_Money(eMoney.ItemDildo);
// break;
}
dic_Money[key].Obfuscate();
dic_MoneyText[key].text = dic_Money[key].ToString();
}
m_Game_Mini_Result.gameObject.SetActive(false);
go_Shield.SetActive(false);
list_MiniGameObtacle.ForEach(f => f.gameObject.SetActive(false));
tf_pc.anchoredPosition = new Vector2(0f, tf_pc.anchoredPosition.y);
DSUtil.InActivateGameObjects(gos_hiteffect);
for (int i = 0; i < items.Length; i++)
items[i].Set();
PlayTime = 0f;
}
public void Set()
{
gameObject.SetActive(true);
SoundInfo.Ins.Play_BGM((eBGM)Random.Range(1, 4));
Init();
i_girl.enabled = false;
AddrResourceMgr.Ins.LoadObject<Sprite>($"Girl_Game/{SaveMgr.Ins.Get_SelectGirlID()}-1.png", handle =>
{
m_Handle1 = handle;
i_girl.enabled = true;
i_girl.sprite = handle.Result;
});
AddrResourceMgr.Ins.LoadObject<Sprite>($"Girl_Game/{SaveMgr.Ins.Get_SelectGirlID()}-2.png", handle =>
{
m_Handle2 = handle;
});
CurAnim = eAnim.Idle;
DSUtil.InActivateGameObjects(go_anim, 0);
i_girlsd_idle.enabled = false;
AddrResourceMgr.Ins.LoadObject<Sprite>($"Girl_Game/{SaveMgr.Ins.Get_SelectGirlID()}sd.png", handle =>
{
m_HandleSD = handle;
i_girlsd_idle.enabled = true;
i_girlsd_idle.sprite = handle.Result;
});
AddrResourceMgr.Ins.LoadObject<Sprite>($"Girl_Game/{SaveMgr.Ins.Get_SelectGirlID()}-walk.png", handle =>
{
m_HandleSDWalk = handle;
i_girlsd_run1.sprite = i_girlsd_run2.sprite = handle.Result;
});
AddrResourceMgr.Ins.LoadObject<Sprite>($"Girl_Game/{SaveMgr.Ins.Get_SelectGirlID()}-hit.png", handle =>
{
m_HandleSDHit = handle;
i_girlsd_hit.sprite = handle.Result;
});
slider_hp.value = 1f;
m_HP = table_GlobalValue.Ins.Get_Int("MiniGameHP");
m_HP.Obfuscate();
StartCoroutine(Co_Update());
}
IEnumerator Co_Update()
{
bStartGame = false;
yield return new WaitForSeconds(3f);
bStartGame = true;
float gap = table_GlobalValue.Ins.Get_Float("MiniGame_Obtacle_Create_Gap"); // 이 시간이 지나면 방해물 생성
float gap_minus_time = table_GlobalValue.Ins.Get_Float("MiniGame_Obtacle_Gap_Time"); // 이 시간이 지나면 방해물 생성 시간 감소
float gap_minus = table_GlobalValue.Ins.Get_Float("MiniGame_Obtacle_Gap_Reduce"); // 방해물 생성 시간 감소값
float gap_minus_limittime = table_GlobalValue.Ins.Get_Float("MiniGame_Obtacle_Gap_LimitTime"); // gap 최소값
Create_Obtacle();
float t_gap = 0f, t_gap_minus_time = 0f;
while (true)
{
if (m_HP <= 0) break;
yield return null;
t_gap += Time.deltaTime;
if (t_gap >= gap)
{
t_gap = 0f;
Create_Obtacle();
}
t_gap_minus_time += Time.deltaTime;
if (t_gap_minus_time >= gap_minus_time)
{
t_gap_minus_time = 0f;
gap -= gap_minus;
if (gap < gap_minus_limittime)
gap = gap_minus_limittime;
}
}
}
void Create_Obtacle()
{
var obtacle = list_MiniGameObtacle.Find(f => !f.gameObject.activeInHierarchy);
if (obtacle == null)
{
obtacle = DSUtil.Get_Clone<MiniGameObtacle>(go_Obtacle, tf_obtacleParent);
list_MiniGameObtacle.Add(obtacle);
}
obtacle.Set(dic_weight, tf_objend, PcPosLimit);
}
private void Update()
{
if (bStartGame)
{
if (m_HP <= 0) return;
PlayTime += Time.deltaTime;
var PcSpeed = table_GlobalValue.Ins.Get_Float("MiniGamePCSpeed");
if (m_Joystick.Direction.x < 0f)
{
if (CurAnim != eAnim.Hit && CurAnim != eAnim.RunLeft)
{
CurAnim = eAnim.RunLeft;
DSUtil.InActivateGameObjects(go_anim, 1);
go_anim[1].transform.localScale = Vector3.one;
}
tf_pc.anchoredPosition = new Vector2(tf_pc.anchoredPosition.x - Time.deltaTime * PcSpeed, tf_pc.anchoredPosition.y);
if (tf_pc.anchoredPosition.x < -PcPosLimit)
tf_pc.anchoredPosition = new Vector2(-PcPosLimit, tf_pc.anchoredPosition.y);
}
else if (m_Joystick.Direction.x > 0f)
{
if (CurAnim != eAnim.Hit && CurAnim != eAnim.RunRight)
{
CurAnim = eAnim.RunRight;
DSUtil.InActivateGameObjects(go_anim, 1);
go_anim[1].transform.localScale = new Vector3(-1f, 1f, 1f);
}
tf_pc.anchoredPosition = new Vector2(tf_pc.anchoredPosition.x + Time.deltaTime * PcSpeed, tf_pc.anchoredPosition.y);
if (tf_pc.anchoredPosition.x > PcPosLimit)
tf_pc.anchoredPosition = new Vector2(PcPosLimit, tf_pc.anchoredPosition.y);
}
else if (CurAnim != eAnim.Hit && CurAnim != eAnim.Idle)
{
CurAnim = eAnim.Idle;
DSUtil.InActivateGameObjects(go_anim, 0);
}
}
}
Coroutine cohit;
public void Hit(eMiniGameObtacleType type, int val)
{
if (cohit != null) StopCoroutine(cohit);
if (m_HP <= 0)
{
cohit = null;
return;
}
cohit = StartCoroutine(Co_Hit(type, val));
}
IEnumerator Co_Hit(eMiniGameObtacleType type, int val)
{
switch (type)
{
case eMiniGameObtacleType.White:
case eMiniGameObtacleType.Red:
#if UNITY_EDITOR
if (NoDamage) yield break;
#endif
if (go_Shield.activeInHierarchy) yield break;
m_HP -= val;
m_HP.Obfuscate();
slider_hp.value = m_HP / table_GlobalValue.Ins.Get_Float("MiniGameHP");
if (m_HP <= 0) GameOver();
i_girl.sprite = m_Handle2.Result;
if (slider_hp.value > 0.3f) SoundInfo.Ins.Play_OneShot((eSound)Random.Range(19, 25));
else SoundInfo.Ins.Play_OneShot((eSound)Random.Range(25, 29));
CurAnim = eAnim.Hit;
DSUtil.InActivateGameObjects(go_anim, 2);
break;
case eMiniGameObtacleType.HpHeal:
m_HP += val;
if (m_HP > table_GlobalValue.Ins.Get_Float("MiniGameHP"))
m_HP = table_GlobalValue.Ins.Get_Int("MiniGameHP");
m_HP.Obfuscate();
slider_hp.value = m_HP / table_GlobalValue.Ins.Get_Float("MiniGameHP");
break;
default:
Add_Item(type, val);
break;
}
yield return new WaitForSeconds(0.5f);
i_girl.sprite = m_Handle1.Result;
CurAnim = eAnim.None;
}
void GameOver()
{
m_Game_Mini_Result.Set(PlayTime);
}
public void Save_GameResult()
{
SaveMgr.Ins.Add_Money(eMoney.AlbumOpen, dic_Money[eMiniGameObtacleType.AlbumOpen]);
SaveMgr.Ins.Add_Money(eMoney.Chat, dic_Money[eMiniGameObtacleType.ChatCoin]);
SaveMgr.Ins.Add_Money(eMoney.Gacha, dic_Money[eMiniGameObtacleType.GachaCoin]);
//SaveMgr.Ins.Set_Money(eMoney.ItemBomb, dic_Money[eMiniGameObtacleType.ItemBomb]);
//SaveMgr.Ins.Set_Money(eMoney.ItemUmbrella, dic_Money[eMiniGameObtacleType.ItemUmbrella]);
//SaveMgr.Ins.Set_Money(eMoney.ItemDildo, dic_Money[eMiniGameObtacleType.ItemDildo]);
SaveMgr.Ins.Save();
}
public Dictionary<eMiniGameObtacleType, ProtectedInt32> Get_ResultMoney() { return dic_Money; }
public void Use_Item(eMiniGameObtacleType item)
{
if (item == eMiniGameObtacleType.ItemUmbrella && go_Shield.activeInHierarchy)
return;
--dic_Money[item];
dic_Money[item].Obfuscate();
dic_MoneyText[item].text = dic_Money[item].ToString();
switch (item)
{ // 아이템 적용
case eMiniGameObtacleType.ItemBomb:
list_MiniGameObtacle.ForEach(f => f.Off_OnlyObtacle());
SoundInfo.Ins.Play_OneShot(eSound.s009_MiniGameUseBomb);
break;
case eMiniGameObtacleType.ItemUmbrella:
StartCoroutine(Co_Shiled());
SoundInfo.Ins.Play_OneShot(eSound.s010_MiniGameUseUmbrella);
break;
case eMiniGameObtacleType.ItemDildo:
list_MiniGameObtacle.ForEach(f => f.Change_Item(dic_weight));
SoundInfo.Ins.Play_OneShot(eSound.s011_MiniGameUseDildo);
break;
}
}
public void Add_Item(eMiniGameObtacleType type, int val)
{
if (!dic_Money.ContainsKey(type))
dic_Money.Add(type, 0);
dic_Money[type] += val;
switch (type)
{
case eMiniGameObtacleType.AlbumOpen:
SoundInfo.Ins.Play_OneShot(eSound.s006_MiniGameGetHeart);
break;
case eMiniGameObtacleType.ChatCoin:
SoundInfo.Ins.Play_OneShot(eSound.s007_MiniGameGetChatCoint);
break;
case eMiniGameObtacleType.GachaCoin:
SoundInfo.Ins.Play_OneShot(eSound.s008_MiniGameGetGachaCoin);
break;
case eMiniGameObtacleType.ItemBomb:
case eMiniGameObtacleType.ItemUmbrella:
case eMiniGameObtacleType.ItemDildo:
if (dic_Money[type] > 5) dic_Money[type] = 5;
break;
}
dic_Money[type].Obfuscate();
if (dic_MoneyText.ContainsKey(type))
dic_MoneyText[type].text = dic_Money[type].ToString();
}
IEnumerator Co_Shiled()
{
go_Shield.SetActive(true);
yield return new WaitForSeconds(table_GlobalValue.Ins.Get_Float("ShieldTime"));
go_Shield.SetActive(false);
}
public void Show_HitEffect(Vector3 pos)
{
for (int i = 0; i < gos_hiteffect.Length; i++)
{
if (!gos_hiteffect[i].activeInHierarchy)
{
StartCoroutine(Co_HitEffect(gos_hiteffect[i], pos));
break;
}
}
}
IEnumerator Co_HitEffect(GameObject effect, Vector3 pos)
{
effect.SetActive(true);
effect.GetComponent<RectTransform>().position = pos;
yield return new WaitForSeconds(1.5f);
effect.SetActive(false);
}
public void OnClick_Exit()
{
ADInfo.Ins.Set_Banner(true);
gameObject.SetActive(false);
m_Game_Mini_Result.gameObject.SetActive(false);
AddrResourceMgr.Ins.Relese(m_Handle1);
AddrResourceMgr.Ins.Relese(m_Handle2);
AddrResourceMgr.Ins.Relese(m_HandleSD);
AddrResourceMgr.Ins.Relese(m_HandleSDWalk);
AddrResourceMgr.Ins.Relese(m_HandleSDHit);
LobbyUI.Ins.Go_Home();
}
}