using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using URandom = UnityEngine.Random; public class GameLogic : MonoBehaviour { [SerializeField] Camera mGameCam; [SerializeField] Vector3 mBattlePos; [SerializeField] Vector3 mBattleRot; [SerializeField] float mBattleFOV; [SerializeField] Transform mCtnStage; [SerializeField] Transform mTsfWinFx; [SerializeField] GameObject mPfbWinFx; [SerializeField] BlockManager mPlayerBlockMgr; [SerializeField] BlockManager mEnemyBlockMgr; [SerializeField] GroupManager mPlayerGroupMgr; [SerializeField] GroupManager mEnemyGroupMgr; [SerializeField] GameObject[] mGuideArrows; private PanelMain mUIMain; private PanelGame mUIGame; private bool mIsOver; private TimerUnit mOverTimer; private bool mIsWin; private void Start() { GameManager.Instance.CurrentPlayerBlockMgr = mPlayerBlockMgr; GameManager.Instance.CurrentEnemyBlockMgr = mEnemyBlockMgr; GameManager.Instance.CurrentGameCam = mGameCam; TKGSDKManager.Instance.LogEvent(Const.AdsEvent.LevelEnter, Const.AdsKey.Level, PlayerData.Instance.CurrentLevel.ToString()); int tStageID = ((PlayerData.Instance.CurrentLevel - 1) / 10)% 3 + 1; Instantiate(ResourceManager.Instance.LoadRes(Const.Path.GetStage(tStageID)), mCtnStage); UIManager.Instance.OpenUI(); mUIMain = UIManager.Instance.OpenUI(); mUIMain.DelFocus = OnMainFocus; mUIMain.DelStart = MoveBattleCam; mUIMain.DelHuman = mPlayerBlockMgr.CreateBaseHumanBlock; mUIMain.DelMonster = mPlayerBlockMgr.CreateBaseMonsterBlock; mPlayerGroupMgr.DelSoldierClear = Lose; mEnemyGroupMgr.DelSoldierClear = Win; mPlayerBlockMgr.CreateBlocksByData(PlayerData.Instance.ArmyStr); if (PlayerData.Instance.CurrentLevel <= GameConfig.Instance.LevelDataStrs.Count) { mEnemyBlockMgr.CreateBlocksByData(GameConfig.Instance.LevelDataStrs[PlayerData.Instance.CurrentLevelID]); } else { RandomEnemy(); } if (!PlayerData.Instance.CheckGuide(0)) { mPlayerBlockMgr.EnableInteraction(false); GuideManager.Instance.StartGuide(0, new Dictionary() { { 0, MoveBattleCam } }); } else if (!PlayerData.Instance.CheckGuide(1)) { mPlayerBlockMgr.EnableInteraction(false); GuideManager.Instance.StartGuide(1, new Dictionary() { { 0, () => { mPlayerBlockMgr.CreateBlock(11, BlockType.Human, 1); AudioManager.Instance.PlaySound(AudioClipType.BuyUnit); PlayerData.Instance.BuyHuman(); mUIMain.RefreshButtons(); mPlayerBlockMgr.EnableInteraction(true); mPlayerBlockMgr.SetForbidden(true, new List(){2, 12}); ShowGuideArrow(0); } }, { 1, () => { ShowGuideArrow(-1); mPlayerBlockMgr.EnableInteraction(false); mPlayerBlockMgr.SetForbidden(false); } }, { 2, MoveBattleCam }}); } else if (!PlayerData.Instance.CheckGuide(2)) { mPlayerBlockMgr.EnableInteraction(false); GuideManager.Instance.StartGuide(2, new Dictionary() { { 0, () => { mPlayerBlockMgr.CreateBlock(3, BlockType.Monster, 1); AudioManager.Instance.PlaySound(AudioClipType.BuyUnit); PlayerData.Instance.BuyMonster(); mUIMain.RefreshButtons(); mPlayerBlockMgr.EnableInteraction(true); mPlayerBlockMgr.SetForbidden(true, new List(){2, 3}); ShowGuideArrow(1); } }, { 1, () => { ShowGuideArrow(-1); mPlayerBlockMgr.SetForbidden(false);} } }); } mOverTimer = TimerManager.Instance.CreateTimerUnit(); } private void OnDestroy() { if (mOverTimer != null) { mOverTimer.Destroy(); } } private void OnMainFocus(bool pFocus) { mPlayerBlockMgr.EnableInteraction(pFocus); } private void RandomEnemy() { List tPosIndexes = new List() { 0, 1, 2, 3, 4 }; int tCount = URandom.Range(1, 5); for (int i = 0; i < tCount; i++) { int tPosIndex = tPosIndexes[URandom.Range(0, tPosIndexes.Count)]; tPosIndexes.Remove(tPosIndex); mEnemyBlockMgr.CreateBlock(tPosIndex, BlockType.Monster, URandom.Range(3, 8)); } tPosIndexes = new List() { 5, 6, 7, 8, 9 }; tCount = URandom.Range(1, 5); for (int i = 0; i < tCount; i++) { int tPosIndex = tPosIndexes[URandom.Range(0, tPosIndexes.Count)]; tPosIndexes.Remove(tPosIndex); mEnemyBlockMgr.CreateBlock(tPosIndex, (BlockType)URandom.Range(0, 2), URandom.Range(4, 7)); } tPosIndexes = new List() { 10, 11, 12, 13, 14 }; tCount = URandom.Range(1, 5); for (int i = 0; i < tCount; i++) { int tPosIndex = tPosIndexes[URandom.Range(0, tPosIndexes.Count)]; tPosIndexes.Remove(tPosIndex); mEnemyBlockMgr.CreateBlock(tPosIndex, BlockType.Human, URandom.Range(3, 8)); } } private void MoveBattleCam() { if (string.IsNullOrEmpty(PlayerData.Instance.ArmyStr)) { UIUtils.ShowTips(LanguageConfig.Instance.GetText("ArmyEmpty")); return; } mUIMain.Close(); VibrateManager.Instance.Vibrate(VibrateType.Medium); mPlayerBlockMgr.EnableInteraction(false); mPlayerBlockMgr.ShowFloor(false); Transform tCamTrans = mGameCam.transform; tCamTrans.DOMove(mBattlePos, 1).SetEase(Ease.OutCubic); tCamTrans.DORotate(mBattleRot, 1).SetEase(Ease.OutCubic); mGameCam.DOFieldOfView(mBattleFOV, 1).SetEase(Ease.OutCubic);//.onComplete = StartGame; GameStart(); } private void GameStart() { TKGSDKManager.Instance.NotifyGameStart(PlayerData.Instance.CurrentLevel); mUIGame = UIManager.Instance.OpenUI(); List tSoldiers = mPlayerBlockMgr.GetAllSoldier(); for (int i = 0; i < tSoldiers.Count; i++) { mPlayerGroupMgr.AddSoldier(tSoldiers[i], mEnemyGroupMgr); } mPlayerGroupMgr.ActiveAllSoldier(); tSoldiers = mEnemyBlockMgr.GetAllSoldier(); for (int i = 0; i < tSoldiers.Count; i++) { mEnemyGroupMgr.AddSoldier(tSoldiers[i], mPlayerGroupMgr); } mEnemyGroupMgr.ActiveAllSoldier(); } private void Win() { mIsWin = true;//win is overridable if (mIsOver) return; mIsOver = true; mUIGame.Close(); mOverTimer.StartTimer(GameOver, 0.5f); } private void Lose() { if (mIsOver) return; mIsOver = true; mIsWin = false; mUIGame.Close(); mOverTimer.StartTimer(GameOver, 0.5f); } private void GameOver() { TKGSDKManager.Instance.NotifyGameEnd(PlayerData.Instance.CurrentLevel, mIsWin); if (mIsWin) { Instantiate(mPfbWinFx, mTsfWinFx); mPlayerGroupMgr.Win(); AudioManager.Instance.PlaySound(AudioClipType.GameWin); } else { mEnemyGroupMgr.Win(); AudioManager.Instance.PlaySound(AudioClipType.GameLose); } mOverTimer.StartTimer(() => { AdsUtils.PlayInterstitial(mIsWin ? Const.AdsValue.GameSuccess : Const.AdsValue.GameFailure); PanelResult tUIResult = UIManager.Instance.OpenUI(); tUIResult.InitResult(mIsWin, mEnemyGroupMgr.TotalDamage); if (mIsWin) { PlayerData.Instance.CurrentLevel++; } }, 1.5f); } private void ShowGuideArrow(int pIndex) { for (int i = 0; i < mGuideArrows.Length; i++) { mGuideArrows[i].SetActive(i == pIndex); if (i == pIndex) { mGuideArrows[i].GetComponent().DOPlay(); } } } }